Compare commits

..

269 Commits

Author SHA1 Message Date
mr. m
d7c131b5ca style: adjust padding and border radius in settings window CSS; add test content in XHTML 2025-03-20 12:33:17 +01:00
mr. M
04f14c0d2f feat: implement settings window with styling and layout adjustments 2025-03-20 00:16:38 +01:00
mr. M
1ceb5d6248 feat: add settings window for Zen UI 2025-03-19 22:58:38 +01:00
mr. M
5e32c09d9f Lint before release 2025-03-18 00:21:28 +01:00
mr. M
b0f7a06749 chore: update subproject commit reference in localization 2025-03-18 00:20:23 +01:00
mr. M
9533671285 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-18 00:10:43 +01:00
mr. M
072bc0269c refactor: remove unused workspace icon strip preference and related styles 2025-03-18 00:10:38 +01:00
mr. m
dcb3e79f64 fix: refine mouse event handling for macOS window buttons to improve hover state accuracy 2025-03-17 21:02:25 +01:00
mr. m
d58101592b fix: change mouse event from 'mouseenter' to 'mouseover' for better hover state handling 2025-03-17 20:51:47 +01:00
mr. M
630152b91e feat: enhance panel UI positioning and improve hover state handling 2025-03-17 20:41:24 +01:00
mr. M
b8ae7401a4 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-17 20:22:25 +01:00
mr. M
0d96889018 fix: update media controller logic and improve CSS styles for better layout 2025-03-17 20:22:20 +01:00
mr. m
9cd2cf5cc3 Merge pull request #6518 from Slowlife01/webpanel
Fix media control not working for web panels
2025-03-17 14:40:24 +01:00
Slowlife01
658e7eac1c Null check just in case.. 2025-03-17 20:21:51 +07:00
Slowlife01
7c387db3e8 Fix media control not working for web panels 2025-03-17 20:14:53 +07:00
mr. M
401085f231 feat: add back-and-forth animation for media title and artist overflow labels 2025-03-16 23:29:09 +01:00
mr. M
fe9eb8884e fix: adjust margin and remove unnecessary padding in vertical tabs styles 2025-03-16 22:17:00 +01:00
mr. M
bab0df47f0 refactor media control styles and remove unused animations 2025-03-16 22:05:38 +01:00
mr. m
b34fa5fb07 Merge pull request #6499 from Slowlife01/pip
New features for media control
2025-03-16 16:09:06 +01:00
Slowlife01
d88e3ec982 add a timeout just in case the control is still hiding.. 2025-03-16 22:05:03 +07:00
Slowlife01
36cf513431 adjust timeout 2025-03-16 21:25:04 +07:00
Slowlife01
2530740066 remove unneeded params 2025-03-16 21:13:01 +07:00
Slowlife01
0af85f8c03 New features for media control 2025-03-16 21:04:08 +07:00
mr. m
31e67a84ec Merge pull request #6486 from pewpewnor/fix-documentation-bash-command
Fix bash install command in documentation on how to install for Linux using tarball
2025-03-16 11:11:45 +01:00
pewpewnor
364ad230fd Fix bash install command in documentation on how to install for Linux using tarball
Signed-off-by: pewpewnor <125549982+pewpewnor@users.noreply.github.com>
2025-03-16 13:50:58 +07:00
mr. M
a69876325a fix(styles): add default icon for broken tab images in vertical tabs 2025-03-16 01:06:55 +01:00
mr. M
ac85bdfd3e fix(styles): adjust right positioning for split view in tab browser (closes https://github.com/zen-browser/desktop/issues/6451) 2025-03-16 00:51:18 +01:00
mr. M
b6477b17d8 fix(build): disable LTO temporarily and enable PGO based on release settings
refactor(ui): remove unnecessary DOMContentLoaded listener from toolbar registration
fix(ui): trigger window resize event on closing watermark to recalculate layout
refactor(ui): improve animation structure for tab content in vertical tabs manager
2025-03-15 19:36:13 +01:00
mr. M
9406515f91 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-15 18:59:33 +01:00
mr. M
ce2e68ee32 fix(ui): update URL bar layout and adjust media controls padding 2025-03-15 18:59:28 +01:00
mr. m
8b04d2d202 Merge pull request #4790 from zen-browser/macos-security-key-fix
Fixed macos signing process for browser entitlements
2025-03-15 16:45:20 +01:00
mr. M
963fb3ca3c fix(xhtml): correct data-l10n-id for zen-glance sidebar close button 2025-03-15 15:39:36 +01:00
mr. m
f40f9c4803 Merge branch 'dev' into macos-security-key-fix 2025-03-15 14:15:19 +01:00
mr. M
ee275bf950 fix(css): correct transition timing syntax in media controls styles 2025-03-15 13:40:32 +01:00
mr. M
9e4f1f4c5b Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-15 13:40:14 +01:00
mr. M
d234e6a701 refactor media controls layout and styles; improve visibility and responsiveness 2025-03-15 13:40:09 +01:00
mr. m
48281e0158 Merge pull request #6472 from Slowlife01/p
Fixes for media control
2025-03-15 10:37:19 +01:00
Slowlife01
e8592a6690 Switch to listening to DOMAudioPlayback events 2025-03-15 16:27:51 +07:00
mr. M
e780eee207 refactor media controls animations and styles; add marquee effect for media title 2025-03-15 10:24:44 +01:00
Slowlife01
de14e8e935 Check if controller is active before activating 2025-03-15 16:11:35 +07:00
Slowlife01
8ea7b497ff Fix media control progress bar jumping to 50% 2025-03-15 14:47:10 +07:00
mr. M
d1098af7f0 update installation instructions in README and refine CSS margins for compact mode 2025-03-14 23:21:41 +01:00
mr. M
daa34e5ed4 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-14 23:06:21 +01:00
mr. M
89243d03cd refactor media controls event handling and improve styling 2025-03-14 23:06:18 +01:00
mr. m
597dfb173d Merge pull request #6465 from Nanome203/update-linux-installation-guide
make installation guide on other linux distros less confusing
2025-03-14 20:55:17 +01:00
mr. M
e1228844c7 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-14 20:54:23 +01:00
mr. M
481976a353 refactor media controls styling and improve workspace tab switching logic 2025-03-14 20:54:19 +01:00
mr. m
b1ef5770d7 Merge pull request #6464 from UnownPlain/fix-checksum
Fix files paths in release notes generation
2025-03-14 20:40:45 +01:00
Pham Minh Triet
f6f561841c make installation guide on other linux distros less confusing
Signed-off-by: Pham Minh Triet <92496972+Nanome203@users.noreply.github.com>
2025-03-15 02:37:06 +07:00
UnownPlain
0da5653fef Fix files paths in release notes generation 2025-03-14 19:08:11 +00:00
mr. M
8afb8ee204 update @zen-browser/surfer dependency to version 1.10.5 and refine media controls styling 2025-03-14 18:29:22 +01:00
mr. M
2e1354cdb9 bump display version to 1.10b for Zen and 1.10t for Zen Twilight 2025-03-14 13:21:08 +01:00
mr. M
7640e05619 update @zen-browser/surfer dependency to version 1.10.4 and adjust media controls styling 2025-03-14 13:19:52 +01:00
mr. M
cb42d46131 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-14 13:08:48 +01:00
mr. M
f055b61e8e add note indicator SVG and integrate into media controls styling 2025-03-14 13:08:45 +01:00
mr. m
23f99999de Merge pull request #6449 from Slowlife01/margin
add negative margin to focus button when hidden
2025-03-14 13:06:13 +01:00
Slowlife01
39c956829a Check if control is already hidden 2025-03-14 19:00:04 +07:00
Slowlife01
e281a18ec7 add negative margin to focus button when hidden 2025-03-14 18:46:31 +07:00
mr. m
4476c802d5 enhance media controls: improve animations and adjust layout properties 2025-03-14 12:23:24 +01:00
mr. m
c728bae55a Merge pull request #6417 from zen-browser/media-control
Media control
2025-03-13 15:00:21 +01:00
mr. m
20ff1dc446 Merge branch 'dev' into media-control 2025-03-13 15:00:09 +01:00
mr. m
3c40758c6a Merge pull request #6321 from Slowlife01/media-control
Feat: basic media control
2025-03-13 14:59:05 +01:00
mr. m
b0a432ce78 Merge branch 'media-control' into media-control 2025-03-13 14:57:02 +01:00
mr. M
1891d36677 refactor media controls styling; update icon sizes and improve layout 2025-03-13 14:56:43 +01:00
Slowlife01
2bf5c98b5f call updateTabsToolbar 2025-03-13 20:34:32 +07:00
Slowlife01
d7cf35126b Hide on current playing tab 2025-03-13 20:33:09 +07:00
mr. M
d765c7c655 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-13 13:19:03 +01:00
mr. M
0dc05978ce Add preference for using Google favicons and refactor related logic 2025-03-13 13:15:28 +01:00
mr. m
001427822c Merge pull request #6390 from UnownPlain/gh-release-notes
Generate release notes for Github releases
2025-03-13 11:28:32 +01:00
Slowlife01
4c74517e9e update position state on audible state change 2025-03-13 09:21:45 +07:00
UnownPlain
e315ff24e1 Generate release notes for Github releases 2025-03-13 01:37:02 +00:00
mr. m
fff8b3f532 Merge branch 'media-control' into media-control 2025-03-13 01:12:57 +01:00
mr. M
8ee527a3d0 Enhance tab closing behavior with permitUnload check and update test for consistency 2025-03-13 01:11:45 +01:00
mr. M
f14f87b54e Update @zen-browser/surfer to version 1.10.2, remove outdated test, and add new test for browser workspaces 2025-03-13 00:42:17 +01:00
mr. M
505e192b66 Update @zen-browser/surfer to version 1.10.0 and reorganize test files 2025-03-12 23:53:13 +01:00
mr. M
5ed1ca6aa1 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-12 23:16:30 +01:00
mr. M
7b5a778bd8 Add initial test for basic workspace change and refactor empty tab initialization 2025-03-12 23:16:27 +01:00
mr. m
39d090297e refactor media controls layout and styling; enhance service title display 2025-03-12 15:41:23 +01:00
Slowlife01
e36ed36a6e update mute icon on tab mute 2025-03-12 19:33:29 +07:00
Slowlife01
b5f32f1001 move check below clear interval just in case... 2025-03-12 11:22:28 +07:00
Slowlife01
777b215c15 support hours in time formatting & hide progress bar if media is tooo long 2025-03-12 11:16:45 +07:00
Slowlife01
7bd5c1b41c Merge branch 'media-control' of https://github.com/Slowlife01/desktop into media-control 2025-03-12 08:50:21 +07:00
Slowlife01
fa70e8bd37 revert toolbox patch 2025-03-12 08:49:59 +07:00
Slowlife
ec2badc74b Merge branch 'dev' into media-control
Signed-off-by: Slowlife <slowlife1165@gmail.com>
2025-03-12 08:46:28 +07:00
Slowlife01
500e62cbce address reviews 2025-03-12 08:45:23 +07:00
mr. m
4fa3f6736b Fixed tabs opening on the essentials container 2025-03-12 08:45:21 +07:00
mr. m
1d03c01420 Fix hover attribute clearing logic in ZenCompactMode 2025-03-12 08:45:21 +07:00
mr. m
759061ffdb Fix inconsistent quote style in sizemodechange event listener 2025-03-12 08:45:20 +07:00
dillontkh
76180a43a8 Fix toolbar not hiding after minimizing 2025-03-12 08:45:20 +07:00
Slowlife01
5867ae2f93 format 2025-03-12 08:45:20 +07:00
Slowlife01
e6552c8dda Feat: basic media control
Fixed dragging undefined tabs
2025-03-12 08:45:19 +07:00
mr. m
110d4e10bb Add option to hide tracking protection icon in URL bar 2025-03-11 23:29:21 +01:00
mr. m
6d458d3b16 Remove unnecessary console log for focused state in ZenGlanceManager 2025-03-11 21:43:06 +01:00
mr. m
40ce0b714e Refactor tab handling logic to improve neighbor tab selection in standalone mode 2025-03-11 21:41:27 +01:00
mr. m
8a5b0928c5 Update candidate version to 136.0.1 in surfer.json 2025-03-11 19:12:43 +01:00
mr. m
7e55497e20 Fixed tabs opening on the essentials container 2025-03-11 19:07:47 +01:00
mr. m
2d333a23a4 Fix hover attribute clearing logic in ZenCompactMode 2025-03-11 08:00:59 +01:00
mr. m
0a32810f36 Fix inconsistent quote style in sizemodechange event listener 2025-03-11 07:57:12 +01:00
mr. m
c6cbf7941c Merge pull request #6324 from dillontkh/fix-#6320
Fix toolbar not hiding after minimizing
2025-03-11 07:37:12 +01:00
dillontkh
33d8103335 Fix toolbar not hiding after minimizing 2025-03-11 14:32:32 +08:00
mr. M
3df1973ac9 Refactor tab drop handling and add workspace dropdown toggle functionality in bookmark editing 2025-03-10 21:31:13 +01:00
mr. M
d51391bb9b Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-10 21:15:25 +01:00
mr. M
94714e4f39 Add README generation for release builds and update session store attributes 2025-03-10 21:15:22 +01:00
mr. m
12266179d6 Changed apple team ID for entitlements 2025-03-10 20:34:01 +01:00
mr. M
a9f2bf2d54 Enable tab drop feature in split view and update event listener accordingly 2025-03-10 17:01:15 +01:00
mr. M
3972a181e6 Refactor CSS transitions and fix console log statements for clarity 2025-03-10 16:43:05 +01:00
mr. m
986661b6e8 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-10 16:34:53 +01:00
mr. m
99faa45d94 Fixed context menu allowing at split essential tabs 2025-03-10 16:34:49 +01:00
mr. M
daad62d939 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-10 16:30:30 +01:00
mr. M
f775a12de9 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-10 16:30:27 +01:00
mr. m
ebc33723b0 Fixed dragging undefined tabs 2025-03-10 13:28:01 +01:00
mr. m
2c8d2babdc Fixed removing workspaces deleting the empty tab as well 2025-03-10 01:12:10 +01:00
mr. m
7771b5af2d Fixed split view drop cursor and timing issues 2025-03-10 00:23:51 +01:00
mr. m
1729b553a4 Fixed changing icons on an extensial tab 2025-03-09 23:34:53 +01:00
mr. m
4f10a12869 Removed profiles enabled in config 2025-03-09 23:31:02 +01:00
mr. M
a0b372e7d9 Enhance Zen Glance functionality with confirmation on close and improved styling 2025-03-09 15:34:19 +01:00
mr. m
daded49ce8 Merge pull request #6256 from noaione/split-view-drag-fix
Fix wrong variable being used for splitting tab view
2025-03-09 14:16:17 +01:00
mr. M
d5d101d3f8 Update display version for Zen and Zen Twilight to 1.9.1 2025-03-09 12:15:48 +01:00
noaione
e83b698df4 Fix wrong variable being used for splitting tab view 2025-03-09 17:58:20 +07:00
mr. m
712cba1398 Merge pull request #6244 from noaione/ai-dont-want-this
Disable AI chat stuff by default
2025-03-09 09:05:37 +01:00
noaione
b954efe624 Disable AI chat stuff by default 2025-03-09 14:03:53 +07:00
mr. M
163d2c8d8f Add workspace selector to bookmark edit panel and ensure ZenWorkspaces is defined 2025-03-08 23:59:38 +01:00
mr. M
cf807ea93e Format export statement for consistency in AppRun script 2025-03-08 19:45:39 +01:00
mr. m
0a9942d01f Merge pull request #6156 from Samueru-sama/patch-3
remove unnecesary declation of several variables
2025-03-08 19:44:16 +01:00
mr. M
6d164511b4 Add error handling to tab animation and refine empty tab selection logic 2025-03-08 19:43:12 +01:00
mr. m
441ea2000b Merge pull request #6185 from noaione/privatebrowsing-newtab-fix
Pass new tab URL to Zen `selectEmptyTab`
2025-03-08 19:01:10 +01:00
mr. m
64281776f4 Merge pull request #6204 from zen-browser/right-split-drop
Enhance ZenViewSplitter to support dynamic side detection for split v…
2025-03-08 18:58:09 +01:00
mr. M
a93fdf5a17 Refactor URL bar height handling and improve drag-and-drop tab functionality in ZenViewSplitter 2025-03-08 18:51:46 +01:00
mr. m
050ed71c00 Merge branch 'dev' into right-split-drop 2025-03-08 18:20:43 +01:00
noaione
7b029cc7bc Pass new tab URL to Zen selectEmptyTab
This will ensure private browsing mode to not open the standard new tab.
2025-03-08 19:59:58 +07:00
mr. M
07afc4810a Adjust URL bar height and update layout handling for compact mode 2025-03-08 11:51:50 +01:00
mr. M
ff339c3fb0 Update @zen-browser/surfer dependency to version 1.9.20 2025-03-08 02:01:04 +01:00
mr. M
2e21bcc542 Enhance sidebar and vertical tab styles with workspace-specific adjustments 2025-03-07 23:28:04 +01:00
Samuel
9a27b66661 remove unnecesary declation of several variables
Signed-off-by: Samuel <36420837+Samueru-sama@users.noreply.github.com>
2025-03-07 14:03:52 -04:00
mr. M
ee91ea86ff Enhance ZenViewSplitter to support dynamic side detection for split view animations 2025-03-07 18:53:45 +01:00
mr. M
5484aea042 Enhance tab movement functionality with error handling and style reset for dragged tabs 2025-03-07 17:39:05 +01:00
mr. M
4c7955b099 Add actions cache variable exposure to build workflows 2025-03-07 17:04:27 +01:00
mr. M
00654c168f Fix promise handling in ZenViewSplitter to prevent memory leaks 2025-03-07 16:26:30 +01:00
mr. M
8e789732f9 Refactor CSS for vertical tabs and URL bar to improve layout and responsiveness 2025-03-07 16:25:36 +01:00
mr. M
b69e8aebab Refactor transition properties for improved readability in zen-glance.css 2025-03-07 15:30:13 +01:00
mr. M
d8265d4513 Remove zombie lock file in Windows release build workflow 2025-03-07 15:29:59 +01:00
mr. M
1b0c3a5d9a Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-07 15:29:30 +01:00
mr. M
124d5e0cdb Enhance button hover effects with scaling transitions for improved interactivity 2025-03-07 15:29:26 +01:00
mr. m
3b86f317d1 Fixed animating split views in 2025-03-07 14:07:49 +01:00
mr. m
39fdda8958 Added support to unsplit tabs when dragging them to the sidebar 2025-03-07 13:59:23 +01:00
mr. m
0575373167 Fixed dragging split views tabs outisde of the container 2025-03-07 13:37:28 +01:00
mr. m
9466f6ee86 Fixed dragging multiple tabs with split view groups 2025-03-07 13:33:18 +01:00
mr. m
ad491edee3 Make sure to show split views group as selected when multiselecting 2025-03-07 13:27:51 +01:00
mr. m
4557d87ed9 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-07 13:26:21 +01:00
mr. m
ea245cd213 Common fixes before releasing 2025-03-07 13:26:11 +01:00
mr. M
f9f126a842 Update tab selected text color to use !important for better visibility 2025-03-07 12:12:32 +01:00
mr. m
65433172f3 Added a corner radius to tab icons 2025-03-07 11:59:00 +01:00
mr. m
3325dc0d9f Fixed session restore identifying the empty tab as a normal one 2025-03-07 11:54:57 +01:00
mr. m
00533fb956 Merge pull request #6130 from Samueru-sama/patch-2
fix crash on sleep by switching appimage runtime
2025-03-07 11:02:05 +01:00
Samuel
0d499b3c25 fix crash on sleep by switching appimage runtime
This also has the benefit of faster launch times

Signed-off-by: Samuel <36420837+Samueru-sama@users.noreply.github.com>
2025-03-06 22:33:54 -04:00
mr. m
eda9b1f20b The split view dragging should always show the cursor pointer 2025-03-06 22:40:00 +01:00
mr. M
b9eb13f033 Fix sidebar width calculations and improve compact mode styling; ensure accurate width properties are set and remove unnecessary transformations. 2025-03-06 20:39:34 +01:00
mr. M
391cb84117 Fix tab position calculation to ensure new tabs are inserted correctly after the current tab 2025-03-06 16:10:25 +01:00
mr. M
8ed5b50c3d Fix tab label handling and improve pinned tab state management; ensure static labels are correctly set and cached. 2025-03-06 16:06:15 +01:00
mr. M
b93faff771 Fix CSS width calculation for expanded sidebar and correct typo in opacity removal; ensure proper tab icon updates on pinning. 2025-03-06 15:25:06 +01:00
mr. M
671a76bf86 Refactor workspace settings and improve tab management; remove individual pinned tabs preference, update bootstrap command, and enhance tab removal logic for non-existent workspaces. 2025-03-06 14:58:35 +01:00
mr. M
d698c51ce0 Fix tab container assignment to retain existing vertical pinned tabs 2025-03-06 13:36:43 +01:00
mr. M
ddb0a65957 Refactor Zen components: update CSS variable for toolbar button fill, improve tab unloading logic, and enhance tab icon URLs 2025-03-06 12:55:34 +01:00
mr. M
10b6551ea3 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-06 12:50:45 +01:00
mr. M
713ceab89f Enhance styling and functionality in Zen components; adjust URL bar border radius, update tab unloading logic, and refine element separation settings 2025-03-06 12:50:42 +01:00
mr. m
ba864200ee Merge pull request #6116 from dillontkh/fix-#4874
Fix compact mode top toolbar hiding prematurely
2025-03-06 12:38:26 +01:00
dillontkh
98084457ff Fix compact mode top toolbar hiding prematurely 2025-03-06 19:22:13 +08:00
mr. m
ba1411b9cd Merge pull request #6104 from imcvampire/patch-1
Update README.md: fix small typo on version format
2025-03-06 07:33:53 +01:00
Quoc-Anh Nguyen
ff4fe92c9f Update README.md: fix small typo on version format
Signed-off-by: Quoc-Anh Nguyen <9426721+imcvampire@users.noreply.github.com>
2025-03-06 03:10:51 +02:00
mr. M
8d3b9098c0 Adjust URL bar container height for breakout state and remove redundant width/height calculations in URL bar styles 2025-03-05 21:32:47 +01:00
mr. M
43da147d44 Fix event coordinate check in ZenViewSplitter; use screenX and screenY instead of clickX and clientY 2025-03-05 20:17:49 +01:00
mr. M
148c9661c2 Refactor tab movement logic in ZenViewSplitter; ensure empty tab is last and adjust fake browser removal behavior 2025-03-05 20:08:35 +01:00
mr. M
f0e2a68abf Refactor tab handling logic in ZenViewSplitter; ensure empty tab is last and remove fake browser when moving tabs 2025-03-05 20:06:53 +01:00
mr. m
d16a263480 Merge pull request #6086 from Samueru-sama/patch-1
fix appimage not being able to set itself as default web browser
2025-03-05 20:04:02 +01:00
mr. m
d50f6001d8 Merge pull request #6082 from Slowlife01/dragover
Feat: add drag event support for compact mode
2025-03-05 20:03:56 +01:00
mr. m
bb5b0895a8 Merge pull request #6072 from Slowlife01/externalurl
Fix: External link not opening in default container
2025-03-05 20:03:43 +01:00
mr. M
162e6abcc1 Enhance tab icon handling and improve event detection in ZenViewSplitter; update version numbers in surfer.json 2025-03-05 20:02:10 +01:00
Samuel
ce2e492632 fix appimage not being able to set itself as default web browser
Signed-off-by: Samuel <36420837+Samueru-sama@users.noreply.github.com>
2025-03-05 11:33:28 -04:00
Slowlife01
03f6e61935 Feat: add drag event support for compact mode 2025-03-05 21:34:16 +07:00
mr. m
996f042961 Increased border radius for compact mode 2025-03-05 15:08:10 +01:00
mr. m
55275b23aa Small adjustments to compact mode and the URL bar background 2025-03-05 13:05:39 +01:00
mr. m
188a6ea801 Small fixes to the URL bar 2025-03-05 12:51:44 +01:00
mr. m
ab127daa35 Small fixes to the welcome page 2025-03-05 12:34:42 +01:00
mr. m
c61112bc6d Fixed common issues with split views not being properly registered 2025-03-05 12:14:03 +01:00
Slowlife01
9b07fd528b Fix: External link not opening in default container 2025-03-05 15:25:28 +07:00
mr. m
1ba809825d Fixed fully opening glance appearing on random places if container specific essentials are on
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-03-04 21:00:17 +01:00
mr. m
09119f9d18 Merge pull request #6021 from Nosferatu31/martial-arts-emoji
Feature: add martial arts uniform emoji
2025-03-04 20:51:19 +01:00
mr. M
c78cafe605 Refactor CSS styles for zen components and update tab icon handling in ZenPinnedTabManager 2025-03-04 20:46:57 +01:00
mr. M
1c49cffc66 Update vertical-tabs.css to set a fixed minimum width for tab columns 2025-03-04 20:26:46 +01:00
mr. M
452c19a7ea Refactor ZenViewSplitter to improve drag-and-drop functionality and enhance split view behavior 2025-03-04 20:23:21 +01:00
mr. M
cc8a5cf367 Update Firefox version to 136.0 in README and surfer.json; modify ToolbarContextMenu context menu items 2025-03-04 19:20:12 +01:00
mr. m
5bbd881f01 Fixed common issues with split views and glance 2025-03-04 15:21:00 +01:00
Gabriel Fernandes
1c2ddea3d4 fix: remove extra words from martial arts uniform emoji 2025-03-04 10:05:56 +00:00
mr. M
096a28002f Refactor compact mode styles and improve tab positioning for better layout consistency 2025-03-04 00:22:40 +01:00
mr. M
23a60e79c1 Update split view tab styles for collapsed mode 2025-03-03 23:52:09 +01:00
mr. M
473698c744 Refactor split view styles and update theme variables for improved UI consistency 2025-03-03 23:36:34 +01:00
Gabriel Fernandes
b955be65f4 Feature: add martial arts uniform emoji 2025-03-03 12:24:39 +00:00
mr. m
98668d5380 Did more common fixes with the new split views implementation 2025-03-03 10:56:10 +01:00
mr. m
e057e952b6 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-03 08:47:14 +01:00
mr. m
e04cb679f9 Fixed registring the empty tab as last selected on split views 2025-03-03 08:47:10 +01:00
mr. m
fd1f2fa0c4 Merge pull request #5999 from noaione/jxl-frame-counts
Report JXL frame counts properly
2025-03-03 07:54:27 +01:00
mr. m
f1f80f3d57 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-03 01:18:07 +01:00
mr. m
7440f12117 Made so split view can be rearranged without ctrl button event 2025-03-03 01:18:03 +01:00
mr. M
2f8847b8fe Add initial padding for animation in compact mode styles 2025-03-03 01:17:47 +01:00
mr. M
8aaccf06b2 Enhance tab selection handling and improve drag-and-drop functionality in ZenViewSplitter 2025-03-03 00:11:31 +01:00
noaione
b83ec80e7c Ensure we check if we have animation or not first 2025-03-03 03:48:18 +07:00
mr. M
7ca57da6fe Refactor tab addition logic and streamline tab filtering in Zen components 2025-03-02 21:36:53 +01:00
mr. M
0cb7b0af95 Refactor tab management and drag-and-drop functionality; improve animation durations and conditions for splitting tabs. 2025-03-02 21:36:31 +01:00
mr. m
7646c43f45 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-02 18:21:23 +01:00
mr. m
7cb1ae6d3c Fixed compact mode sidebar animating on an empty state and not animating properly 2025-03-02 18:21:18 +01:00
noaione
9454ab9d6c Report JXL frame counts properly
Ref:
- https://phabricator.services.mozilla.com/D212831
- https://github.com/zen-browser/desktop/pull/5634#issuecomment-2692802618
2025-03-03 00:03:29 +07:00
mr. M
780b514cc0 Refine animation for browser wrapper opacity and adjust easing for smoother transitions 2025-03-02 17:11:18 +01:00
mr. M
7b124f1dc2 Add preference to hide one-off search buttons and adjust CSS positioning 2025-03-02 17:03:58 +01:00
mr. m
a500407dc3 Merge pull request #5988 from Slowlife01/hideemptytab
Hide empty tab from add-ons
2025-03-02 16:47:56 +01:00
mr. M
d415bde66c Implement drag-and-drop functionality for split view and refine CSS styles for better layout and visibility 2025-03-02 16:45:57 +01:00
Slowlife
314bdf61ef Merge branch 'zen-browser:dev' into hideemptytab 2025-03-02 21:35:56 +07:00
Slowlife01
43c98b7ddd hide empty tab from add-ons 2025-03-02 21:30:52 +07:00
mr. m
e065ccb7b7 Merge pull request #5467 from mokazemi/fix/panel-pin-icon
keep the "pinned" attribute of the side web panel and the button in sync
2025-03-02 15:07:42 +01:00
mr. M
eea9e060c8 Add patches for Cargo.lock and Cargo.toml to include mime_guess and update dependencies 2025-03-02 14:02:52 +01:00
mr. M
3377885587 Remove unused Cargo.lock and Cargo.toml patches; update PlacesUIUtils.sys.mjs for improved bookmark workspace handling 2025-03-02 12:56:59 +01:00
mr. m
39f4f4f0ea Merge pull request #5634 from noaione/complete-jxl-support
Implement a more complete JXL features
2025-03-02 12:53:44 +01:00
mr. m
85c54eda7d Merge pull request #5976 from Slowlife01/dev
Fix: bookmark items not opening
2025-03-02 12:51:55 +01:00
Slowlife01
fc6d9ba67a Fix: bookmark items not opening 2025-03-02 18:10:02 +07:00
mr. m
ff25a5b432 Fixed reordering tabs not being correctly saved 2025-03-02 11:30:10 +01:00
mr. M
fd8a56762d Refactor pinned tab management and improve initialization logic 2025-03-02 10:41:14 +01:00
mr. M
7e4c3c0df0 Enable JavaScript and properties minification in build configuration 2025-03-02 10:27:58 +01:00
mr. M
fae2187394 Enhance split view tab management and styling adjustments 2025-03-01 23:01:29 +01:00
mr. M
86390bde02 Enhance split view functionality and styling improvements 2025-03-01 19:19:22 +01:00
mr. M
595aa9b062 Improved stylings for split view goups 2025-03-01 14:23:41 +01:00
mr. m
3eed6de797 Formatted the project 2025-03-01 13:26:39 +01:00
mr. m
8655aa8c37 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-03-01 13:18:34 +01:00
mr. m
47c64661ec Fixed split view groups being unpinned / pinned 2025-03-01 13:18:30 +01:00
mr-cheff
aa4646692e Update monthly issue metrics 2025-03-01 02:36:53 +00:00
mr. m
67ee00c3f8 Merge pull request #5914 from zwamdurkel/dev
Allow having full url without https in sidebar
2025-03-01 00:06:36 +01:00
mr. m
52e18e5125 Formatted the project 2025-02-28 22:58:06 +01:00
mr. m
30a7bd49a9 Fixed creating essentials being in the wrong order and fixed watermark not waiting enough time 2025-02-28 22:57:41 +01:00
Aloys Riswick
654d35bc89 Allow having full url without https in sidebar 2025-02-28 22:57:38 +01:00
mr. m
1ae11fef58 Worked a bit more on split view groups 2025-02-28 21:20:11 +01:00
mr. m
6023462bbd Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-02-28 20:10:38 +01:00
mr. m
163cc6b6bd Merge pull request #5898 from fkobi/patch-1
README: specify license version
2025-02-28 16:02:58 +01:00
fkobi
891e9bacaa README: specify license version
Signed-off-by: fkobi <fkobi@pm.me>
2025-02-28 14:41:02 +00:00
mr. m
c8796d9a54 Fixed mute button being missaligned 2025-02-28 10:48:42 +01:00
mr. m
0c918caed2 Small fixed for new split view groups 2025-02-28 08:37:08 +01:00
noaione
46f6d28fca Remove pdf.mjs patch 2025-02-28 07:15:06 +07:00
mr. m
7d4641c5ec Fixed changing tabs while having glance open 2025-02-28 00:30:02 +01:00
mr. m
fc1ec9123d Fixed preference when listening for vibrancy changes on macos 2025-02-27 23:26:48 +01:00
mr. m
220415f698 Fixed vibrancy not updating on macos when changing the pref 2025-02-27 22:26:45 +01:00
mr. m
82389925bc Fixed vibrancy manager for macos preference, not being at startup anymore 2025-02-27 21:31:47 +01:00
mr. m
7714ef83aa Bumped rust version to 1.81 for windows builds 2025-02-27 21:30:46 +01:00
mr. m
09ce9f3107 Transparency types on macos now update when the preference change 2025-02-27 21:29:00 +01:00
mr. m
a409016f7a Added different transparency modes for macos and stopped initializing workspaces on closed windows 2025-02-27 19:06:50 +01:00
mr. m
7585514868 Started to add support for dragging folders and split view groups 2025-02-27 13:31:51 +01:00
mr. m
99ab59f3a3 Added better rendering for gradients 2025-02-27 12:50:27 +01:00
mr. m
7d20a9ed84 Formatted folders 2025-02-27 12:05:58 +01:00
mr. M
3878dcd27f Enhance tab grouping logic to correctly handle pinned tabs and improve insertion behavior 2025-02-27 00:30:50 +01:00
mr. M
9fb2e9d30d Update split view logic to check for 'zen-essential' attribute instead of pinned tabs 2025-02-27 00:30:12 +01:00
mr. M
d6a1889e9f Refactor tab movement logic to ensure selected tabs move together during drag-and-drop operations 2025-02-27 00:20:13 +01:00
noaione
34b0c8e774 Recognizes .jxl as a proper image type
Based on:
90702891fe/f/0002-Bug-1539075-Register-.jxl-extension-in-Firefox.-r-tn.patch
2025-02-27 06:01:37 +07:00
noaione
f11ae35b07 Implement a more complete JXL features
Based on this following phabricator patch/commits:
- https://phabricator.services.mozilla.com/D119700
- https://phabricator.services.mozilla.com/D122158
- https://phabricator.services.mozilla.com/D122159

Which add the following:
- Proper color profiles support for JPEG XL
- Animated JPEG XL
- Progressive decoding

Co-authored-by: wwwwwwww <wvvwvvvvwvvw@gmail.com>
2025-02-27 06:01:34 +07:00
mr. M
18d62429bf Started working on folders implementation and better split view integration 2025-02-26 23:51:38 +01:00
mr. M
65d56afc02 Center glance tab opening position in the browser 2025-02-26 22:06:36 +01:00
mr. M
71dde4d0dd Fixed opening bookmarks on empty tab pages (closes https://github.com/zen-browser/desktop/issues/5818) 2025-02-26 21:59:34 +01:00
mr. M
576632fbbf Adjustments while updating to firefox 136.0 2025-02-26 21:00:21 +01:00
mr. M
f7995f6da7 Update to firefox 136.0 2025-02-26 20:14:31 +01:00
mr. m
6115bbabc8 Applied common fixes 2025-02-26 13:27:58 +01:00
Mohammad Kazemi
19bb1a1ce1 add pinned="true" attribute to web panel pin icon, also keep the pinned state of the panel and the button in sync 2025-02-17 15:58:54 +03:30
mr. m
320fd57d8a Merge branch 'dev' into macos-security-key-fix 2025-02-12 22:51:36 +01:00
mr. m
2898dc497a Merge branch 'dev' into macos-security-key-fix 2025-02-08 10:09:19 +01:00
mr. M
9c11e19db8 Update macOS signing process to use production environment and improve profile handling 2025-01-31 18:40:50 +01:00
250 changed files with 5947 additions and 4919 deletions

View File

@@ -384,6 +384,8 @@ jobs:
- name: Execute AppImage build
run: |
set -eux
export ARCH=${{ matrix.arch }}
UPINFO="gh-releases-zsync|$GITHUB_REPOSITORY_OWNER|desktop|latest|zen-$ARCH.AppImage.zsync"
rm AppDir/.DirIcon || true
cp configs/branding/${{ inputs.update_branch }}/logo128.png AppDir/usr/share/icons/hicolor/128x128/apps/zen.png
cp configs/branding/${{ inputs.update_branch }}/logo128.png AppDir/zen.png && ln -s zen.png AppDir/.DirIcon
@@ -396,18 +398,23 @@ jobs:
APPDIR=AppDir
tar -xvf *.tar.* && rm -rf *.tar.*
mv zen/* $APPDIR/
wget https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
wget "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
wget "https://github.com/VHSgunzo/uruntime/releases/latest/download/uruntime-appimage-squashfs-lite-$ARCH"
chmod +x *.AppImage
chmod +x ./uruntime-appimage-squashfs-lite-"$ARCH"
chmod +x ./AppDir/AppRun
# keep the uruntime mountpoint (massively speeds up launch time)
sed -i 's|URUNTIME_MOUNT=[0-9]|URUNTIME_MOUNT=0|' ./uruntime-appimage-squashfs-lite-"$ARCH"
echo "AppDir: $APPDIR"
ls -al
find .
ls -al "$APPDIR"
ARCH=${{ matrix.arch }} ./appimagetool-x86_64.AppImage --comp zstd --mksquashfs-opt -Xcompression-level --mksquashfs-opt 10 \
-u "gh-releases-zsync|$GITHUB_REPOSITORY_OWNER|desktop|latest|zen-${{ matrix.arch }}.AppImage.zsync" \
"$APPDIR" zen-${{ matrix.arch }}.AppImage
./appimagetool-x86_64.AppImage -u "$UPINFO" "$APPDIR" zen-"$ARCH".AppImage --runtime-file ./uruntime-appimage-squashfs-lite-"$ARCH"
mkdir dist
mv zen*AppImage* dist/.
unset ARCH
- name: Upload artifact
uses: actions/upload-artifact@v4
@@ -464,10 +471,6 @@ jobs:
submodules: recursive
token: ${{ secrets.DEPLOY_KEY }}
- name: Git pull
run: |
git pull
- name: Download artifact
uses: actions/download-artifact@v4
@@ -513,11 +516,15 @@ jobs:
commit_user_email: zen-browser-auto@users.noreply.github.com
repository: ./updates-server
- name: Generate Release Notes
run: bash .github/workflows/src/generate_release_notes.sh
# If we are on Twilight, we want to just update the Twilight tag's release
- name: Update Twilight tag
if: ${{ inputs.update_branch == 'twilight' }}
uses: softprops/action-gh-release@v2
with:
body_path: release_notes.md
files: |
./zen.source.tar.zst/*
./zen.linux-x86_64.tar.xz/*
@@ -556,6 +563,7 @@ jobs:
fail_on_unmatched_files: false
generate_release_notes: false
name: 'Release build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }})'
body_path: release_notes.md
files: |
./zen.source.tar.zst/*
./zen.linux-x86_64.tar.xz/*

View File

@@ -39,6 +39,10 @@ jobs:
with:
tool-cache: false
# Bug: https://github.com/actions/checkout/issues/1153
- name: Remove zombie lock file
run: rm -f /home/ubuntu/actions-runner/_work/desktop/desktop/.git/modules/l10n/index.lock
- name: Checkout repository
uses: actions/checkout@v4
with:
@@ -55,6 +59,13 @@ jobs:
with:
disable_annotations: true
- name: Expose actions cache variables
uses: actions/github-script@v6
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env['ACTIONS_CACHE_URL'])
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env['ACTIONS_RUNTIME_TOKEN'])
- name: Setup Git
run: |
git config --global user.email "mauro-balades@users.noreply.github.com"

View File

@@ -47,6 +47,13 @@ jobs:
with:
disable_annotations: true
- name: Expose actions cache variables
uses: actions/github-script@v6
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env['ACTIONS_CACHE_URL'])
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env['ACTIONS_RUNTIME_TOKEN'])
- name: Setup Python
uses: actions/setup-python@v5
# note: This will use the version defined in '.python-version' by default

View File

@@ -182,7 +182,7 @@ jobs:
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
./mach macos-sign -v -r -c "release" -e "production" -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: |

View File

@@ -0,0 +1,113 @@
#!/usr/bin/env bash
RELEASE_NOTES_URL="https://raw.githubusercontent.com/zen-browser/www/refs/heads/main/src/release-notes/stable.json"
if [ "$RELEASE_BRANCH" = "release" ]; then
RELEASE_TYPE="Stable"
echo "Fetching release notes from GitHub..."
RELEASE_NOTES_JSON=$(curl -s "$RELEASE_NOTES_URL")
if [ -z "$RELEASE_NOTES_JSON" ]; then
echo "Error: Failed to fetch release notes from GitHub"
exit 1
fi
LATEST_RELEASE=$(echo "$RELEASE_NOTES_JSON" | jq -r 'last')
EXTRA_NOTES=$(echo "$LATEST_RELEASE" | jq -r '.extra // ""')
else
RELEASE_TYPE="Twilight"
fi
cat << EOF > "release_notes.md"
# Zen ${RELEASE_TYPE} Release
EOF
if [ "$RELEASE_BRANCH" = "release" ]; then
echo "${EXTRA_NOTES}" >> "release_notes.md"
if echo "$LATEST_RELEASE" | jq -e 'has("features")' > /dev/null; then
cat << EOF >> "release_notes.md"
## New Features
$(echo "$LATEST_RELEASE" | jq -r '.features[] | "- " + .')
EOF
fi
if echo "$LATEST_RELEASE" | jq -e 'has("fixes")' > /dev/null; then
cat << EOF >> "release_notes.md"
## Fixes
EOF
echo "$LATEST_RELEASE" | jq -r '.fixes[] | if type=="object" then "- " + .description + " ([#" + (.issue|tostring) + "](" + "https://github.com/zen-browser/desktop/issues/" + (.issue|tostring) + "))" else "- " + . end' >> "release_notes.md"
fi
if echo "$LATEST_RELEASE" | jq -e 'has("breakingChanges")' > /dev/null; then
cat << EOF >> "release_notes.md"
## Breaking Changes
EOF
echo "$LATEST_RELEASE" | jq -r '.breakingChanges[] | if type=="string" then "- " + . else "- " + .description + " [Learn more](" + .link + ")" end' >> "release_notes.md"
fi
if echo "$LATEST_RELEASE" | jq -e 'has("themeChanges")' > /dev/null; then
cat << EOF >> "release_notes.md"
## Theme Changes
$(echo "$LATEST_RELEASE" | jq -r '.themeChanges[] | "- " + .')
EOF
fi
fi
cat << EOF >> "release_notes.md"
<details>
<summary>File Checksums (SHA-256)</summary>
\`\`\`
EOF
generate_checksum() {
local pattern=$1
echo "Generating checksum for $pattern"
sha256sum $pattern 2> /dev/null | awk '{sub(".*/", "", $2); print $1 " " $2}' >> "release_notes.md"
if [ ${PIPESTATUS[0]} -ne 0 ]; then
echo "Warning: No files found matching $pattern, skipping checksum."
fi
}
files=(
"./zen.source.tar.zst/*"
"./zen.linux-x86_64.tar.xz/*"
"./zen.linux-aarch64.tar.xz/*"
"./zen-x86_64.AppImage/*"
"./zen-x86_64.AppImage.zsync/*"
"./zen-aarch64.AppImage/*"
"./zen-aarch64.AppImage.zsync/*"
"./.github/workflows/object/windows-x64-signed-x86_64/zen.win-x86_64.zip"
"./zen.win-x86_64.zip/*"
"./.github/workflows/object/windows-x64-signed-arm64/zen.win-arm64.zip"
"./zen.win-arm64.zip/*"
"./linux.mar/*"
"./linux-aarch64.mar/*"
"./.github/workflows/object/windows-x64-signed-x86_64/windows.mar"
"./windows.mar/*"
"./.github/workflows/object/windows-x64-signed-arm64/windows-arm64.mar"
"./windows-arm64.mar/*"
"./macos.mar/*"
"./.github/workflows/object/windows-x64-signed-x86_64/zen.installer.exe"
"./zen.installer.exe/*"
"./.github/workflows/object/windows-x64-signed-arm64/zen.installer-arm64.exe"
"./zen.installer-arm64.exe/*"
"./zen.macos-universal.dmg/*"
)
for file in "${files[@]}"; do
generate_checksum "$file"
done
cat << EOF >> "release_notes.md"
\`\`\`
</details>
EOF
echo "Release notes generated: release_notes.md"

View File

@@ -45,6 +45,10 @@ jobs:
with:
tool-cache: false
# Bug: https://github.com/actions/checkout/issues/1153
- name: Remove zombie lock file
run: rm -f /home/ubuntu/actions-runner/_work/desktop/desktop/.git/modules/l10n/index.lock
- name: Checkout repository
uses: actions/checkout@v4
with:
@@ -61,6 +65,13 @@ jobs:
with:
disable_annotations: true
- name: Expose actions cache variables
uses: actions/github-script@v6
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env['ACTIONS_CACHE_URL'])
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env['ACTIONS_RUNTIME_TOKEN'])
- name: Setup Git
run: |
git config --global user.email "mauro-balades@users.noreply.github.com"
@@ -166,7 +177,7 @@ jobs:
if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }}
run: |
cd engine/
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain 1.80
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain 1.81
source $HOME/.cargo/env
if test "${{ matrix.arch }}" = "aarch64"; then
rustup target add aarch64-pc-windows-msvc

View File

@@ -1,14 +1,6 @@
#!/bin/sh
SELF=$(readlink -f "$0")
HERE=${SELF%/*}
export PATH="${HERE}:${HERE}/usr/bin/:${HERE}/usr/sbin/:${HERE}/usr/games/:${HERE}/bin/:${HERE}/sbin/${PATH:+:$PATH}"
export LD_LIBRARY_PATH="${HERE}/usr/lib/:${HERE}/usr/lib/i386-linux-gnu/:${HERE}/usr/lib/x86_64-linux-gnu/:${HERE}/usr/lib32/:${HERE}/usr/lib64/:${HERE}/lib/:${HERE}/lib/i386-linux-gnu/:${HERE}/lib/x86_64-linux-gnu/:${HERE}/lib32/:${HERE}/lib64/${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export PYTHONPATH="${HERE}/usr/share/pyshared/${PYTHONPATH:+:$PYTHONPATH}"
export MOZ_LEGACY_PROFILES=1 # Prevent per installation profiles
DEFAULT_XDG_DATA_DIRS='./share/:/usr/share/gnome:/usr/local/share/:/usr/share/'
export XDG_DATA_DIRS="${HERE}/usr/share/:${XDG_DATA_DIRS:-$DEFAULT_XDG_DATA_DIRS}"
export PERLLIB="${HERE}/usr/share/perl5/:${HERE}/usr/lib/perl5/${PERLLIB:+:$PERLLIB}"
export GSETTINGS_SCHEMA_DIR="${HERE}/usr/share/glib-2.0/schemas/${GSETTINGS_SCHEMA_DIR:+:$GSETTINGS_SCHEMA_DIR}"
export QT_PLUGIN_PATH="${HERE}/usr/lib/qt4/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt4/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt4/plugins/:${HERE}/usr/lib32/qt4/plugins/:${HERE}/usr/lib64/qt4/plugins/:${HERE}/usr/lib/qt5/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt5/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt5/plugins/:${HERE}/usr/lib32/qt5/plugins/:${HERE}/usr/lib64/qt5/plugins/${QT_PLUGIN_PATH:+:$QT_PLUGIN_PATH}"
EXEC=$(grep -e '^Exec=.*' "${HERE}"/*.desktop | head -n 1 | cut -d "=" -f 2 | cut -d " " -f 1)
exec "${EXEC}" "$@"
CURRENTDIR="$(dirname "$(readlink -f "$0")")"
export PATH="${CURRENTDIR}:${PATH}"
export MOZ_LEGACY_PROFILES=1 # Prevent per installation profiles
export MOZ_APP_LAUNCHER="${APPIMAGE}" # Allows setting as default browser
exec "${CURRENTDIR}/zen" "$@"

View File

@@ -28,9 +28,9 @@
## 🖥️ Compatibility
Zen is currently built using Firefox version `135.0.1`! 🚀
Zen is currently built using Firefox version `136.0.1`! 🚀
- [`Zen Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 135.0.1`!
- [`Zen Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 136.0`!
- 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!
@@ -44,7 +44,7 @@ We keep track of how many issues are closed at the end of the month in [docs/iss
### Versioning
Zen uses [Semantic Versioning](https://semver.org/), meaning versions are displayed as `a.bc.d` where:
Zen uses [Semantic Versioning](https://semver.org/), meaning versions are displayed as `a.b.cd` where:
- `a` is the major version
- `b` is the minor version
@@ -96,17 +96,22 @@ brew install --cask zen-browser
yay -S zen-browser-bin
```
##### Other Linux distributions (AppImage with automated system integration)
##### Other Linux distributions (Tarball or AppImage)
- `native` tarball install:
`bash <(curl -s https://updates.zen-browser.app/install.sh)`
- `Tarball` install:
- `zsync` is required for the Update feature of the script below
```sh
bash <(curl -s https://updates.zen-browser.app/install.sh)
```
- `AppImage` install:
```sh
bash <(curl https://updates.zen-browser.app/appimage.sh)
```
> AppImage install requires `zsync` for the Update feature
- Again, if you don't see your OS listed above, that's because we already have it in our [downloads page](https://zen-browser.app/download)! 🔄
To upgrade the browser to a newer version, use the embedded update functionality in `About Zen`.
@@ -139,4 +144,4 @@ Thanks everyone for making Zen stand out among these giants!
## 📄 License
Zen browser is under the [MPL LICENSE](./LICENSE). All the code is open-source and free to use! Attribution is appreciated but not required.
Zen browser is under the [MPL 2.0 LICENSE](./LICENSE). All the code is open-source and free to use! Attribution is appreciated but not required.

View File

@@ -7,7 +7,7 @@ export MOZ_MACBUNDLE_ID=${appId}
export MOZ_MACBUNDLE_NAME="Zen Browser.app"
# override LTO settings
# TODO: Dont
# TODO: Dont use LTO for now, it's causing a lot of issues
export MOZ_LTO=cross,thin
ac_add_options --enable-lto=cross,thin

View File

@@ -0,0 +1,817 @@
# Issue Metrics
| Metric | Average | Median | 90th percentile |
| --- | --- | --- | ---: |
| Time to first response | 1 day, 0:35:15 | 3:19:46 | 2 days, 19:34:34 |
| Time to close | 2 days, 6:58:59 | 7:28:52 | 8 days, 5:28:28 |
| Metric | Count |
| --- | ---: |
| Number of items that remain open | 513 |
| Number of items closed | 286 |
| Total number of items created | 799 |
| Title | URL | Time to first response | Time to close |
| --- | --- | --- | --- |
| Ctrl+T doesn't open a new tab | https://github.com/zen-browser/desktop/issues/5918 | 1:34:03 | None |
| Browser Wiping All Saved Tabs | https://github.com/zen-browser/desktop/issues/5917 | None | None |
| Zen Browser freaks out when entering `´` `˙` `˛` | https://github.com/zen-browser/desktop/issues/5915 | 0:47:22 | 0:47:22 |
| Ctrl +H opens History Sidebar but not working properly | https://github.com/zen-browser/desktop/issues/5912 | 3:27:54 | None |
| When opening the new tab bar and pressing CTRL to autofill ".com" it just duplicates current tab | https://github.com/zen-browser/desktop/issues/5910 | None | None |
| I am trying to open a new tab and this is happening | https://github.com/zen-browser/desktop/issues/5908 | 4:40:40 | 4:40:40 |
| Extension buttons don't load | https://github.com/zen-browser/desktop/issues/5906 | None | None |
| Closing tabs can result in app freeze | https://github.com/zen-browser/desktop/issues/5905 | None | None |
| First tab is sent to end of tabs list after reopening browser | https://github.com/zen-browser/desktop/issues/5904 | None | None |
| Unable to reorder tabs in private browsing | https://github.com/zen-browser/desktop/issues/5902 | None | None |
| split view resize trigger not work when AI Chatbot panel is open next to the split view | https://github.com/zen-browser/desktop/issues/5900 | None | None |
| Couldn't load homepage | https://github.com/zen-browser/desktop/issues/5899 | None | 5:31:41 |
| URL bar being cutoff | https://github.com/zen-browser/desktop/issues/5896 | 1:12:20 | None |
| TrimURL and TrimHttps effects should be independent | https://github.com/zen-browser/desktop/issues/5895 | None | None |
| Mouse back button switches to previous workspace | https://github.com/zen-browser/desktop/issues/5894 | 1:59:57 | None |
| Mystery new tab after launching the browser | https://github.com/zen-browser/desktop/issues/5893 | None | None |
| Invisible Tab when opening Zen | https://github.com/zen-browser/desktop/issues/5892 | 1:36:17 | 11:34:31 |
| Popups related to extension installation render beyond the window's borders | https://github.com/zen-browser/desktop/issues/5891 | None | None |
| Tabs wiped on opening new window | https://github.com/zen-browser/desktop/issues/5890 | None | None |
| [Twilight] Split view group issues | https://github.com/zen-browser/desktop/issues/5889 | None | None |
| Mods | https://github.com/zen-browser/desktop/issues/5888 | None | None |
| Unable to access url when site is on http | https://github.com/zen-browser/desktop/issues/5887 | None | None |
| Renamed pinned tab changes title upon loading, when unloading title changes back to previously set name | https://github.com/zen-browser/desktop/issues/5886 | None | None |
| Have had to delete the .zen folder after update | https://github.com/zen-browser/desktop/issues/5885 | None | None |
| After each Zen restart, the top page moves to the bottom of the sidebar | https://github.com/zen-browser/desktop/issues/5883 | 6:31:36 | None |
| "Switch to Tab" option (in URL bar) does not work | https://github.com/zen-browser/desktop/issues/5881 | None | None |
| Searchbar isnt center and a bit hidden on widescreen | https://github.com/zen-browser/desktop/issues/5880 | None | None |
| Workspace Not Working on Restarting Browser | https://github.com/zen-browser/desktop/issues/5878 | None | 0:13:31 |
| Bookmarks don't open anymore after latest update | https://github.com/zen-browser/desktop/issues/5877 | 0:15:28 | None |
| URL bar ignores spacings | https://github.com/zen-browser/desktop/issues/5873 | None | None |
| Search bar visual bug when exiting youtube fullscreen player | https://github.com/zen-browser/desktop/issues/5872 | 0:06:09 | 0:19:32 |
| Right click menu disappears when releasing mouseclick | https://github.com/zen-browser/desktop/issues/5871 | None | None |
| Tabs move to bottom on start up | https://github.com/zen-browser/desktop/issues/5869 | 0:17:08 | None |
| Consistent font sizes in sidebar UI | https://github.com/zen-browser/desktop/issues/5868 | None | None |
| [BUG] When Closing all Tabs instead of opening a New Home Tab just no Tabs are Open | https://github.com/zen-browser/desktop/issues/5867 | None | None |
| Startup Page Not Displaying Properly in Zen Browser (Latest Build, Windows 11 | https://github.com/zen-browser/desktop/issues/5866 | 0:52:35 | 21:19:37 |
| 'Set Default Container' still shown when containers disabled | https://github.com/zen-browser/desktop/issues/5865 | None | None |
| Itch.io incorrectly rendering screenshots and embeds | https://github.com/zen-browser/desktop/issues/5864 | None | None |
| Wallpaper dissappear from the homepage | https://github.com/zen-browser/desktop/issues/5863 | None | None |
| Crash when using GPU rendering | https://github.com/zen-browser/desktop/issues/5862 | None | None |
| Sidebar extend on hover being wonky | https://github.com/zen-browser/desktop/issues/5861 | 7:15:46 | None |
| Addons section right of the url bar keeps dissapearing | https://github.com/zen-browser/desktop/issues/5858 | 0:22:45 | None |
| Potential credential-stealing behavior detected in zen.exe (T1555.003)" | https://github.com/zen-browser/desktop/issues/5857 | None | None |
| New tabs not opening when switching between containers/profiles. | https://github.com/zen-browser/desktop/issues/5856 | None | None |
| Closing all tabs opens a normal tab in private window | https://github.com/zen-browser/desktop/issues/5855 | None | None |
| Functional Anomalies in Bookmark Management Page | https://github.com/zen-browser/desktop/issues/5854 | None | None |
| Reordering tabs to top or bottom is still funky | https://github.com/zen-browser/desktop/issues/5851 | None | None |
| Passkeys not displaying (macos) | https://github.com/zen-browser/desktop/issues/5850 | 7:12:16 | None |
| Can't Switch Profile | https://github.com/zen-browser/desktop/issues/5849 | 0:28:47 | None |
| . | https://github.com/zen-browser/desktop/issues/5848 | None | 0:09:55 |
| When I click on the Zen Url bar, the URL bar comes out of the Zen screen zen 1.8.2b | https://github.com/zen-browser/desktop/issues/5847 | 2:52:35 | None |
| URL Search | https://github.com/zen-browser/desktop/issues/5846 | 2:58:34 | None |
| Sidebar Popup Glitches | https://github.com/zen-browser/desktop/issues/5845 | 2:04:30 | None |
| [Regression 1.8b+] Multiple tab issues regarding extensions | https://github.com/zen-browser/desktop/issues/5844 | 2:05:36 | None |
| Boomarks without any function | https://github.com/zen-browser/desktop/issues/5841 | None | None |
| Zen using 99% GPU | https://github.com/zen-browser/desktop/issues/5840 | None | None |
| Sites pinned to other containers will not open in (some) other containers from new tab menu | https://github.com/zen-browser/desktop/issues/5838 | None | None |
| Zen Browser bugged after PC got force power off during sleep mode | https://github.com/zen-browser/desktop/issues/5837 | 10:42:47 | None |
| Sidebar not appearing in Compact Mode | https://github.com/zen-browser/desktop/issues/5836 | None | None |
| Something new about your translation | https://github.com/zen-browser/desktop/issues/5835 | 0:12:15 | 0:12:15 |
| In a new tab, the search bar appears on the left side of the screen and across the screen. | https://github.com/zen-browser/desktop/issues/5834 | 0:18:45 | 1 day, 6:00:02 |
| If i try to login in the outlook in the browser the browser freezes | https://github.com/zen-browser/desktop/issues/5833 | None | None |
| Plugins not working properly | https://github.com/zen-browser/desktop/issues/5832 | None | None |
| The Tree Style Tab extension does not refresh the tab list when switching workspaces | https://github.com/zen-browser/desktop/issues/5831 | None | None |
| Tab don't show when opened through bookmark | https://github.com/zen-browser/desktop/issues/5830 | 1:23:17 | None |
| macOS window share icon does not cover buttons sometimes | https://github.com/zen-browser/desktop/issues/5829 | 1 day, 8:01:43 | None |
| Tabs do not move as they should | https://github.com/zen-browser/desktop/issues/5828 | 1 day, 9:24:57 | None |
| zen.view.compact.show-sidebar-and-toolbar-on-hover | https://github.com/zen-browser/desktop/issues/5827 | None | None |
| Zen forgets some pinned tabs and loads a blank tab instead on launch | https://github.com/zen-browser/desktop/issues/5826 | 3:14:43 | None |
| sidebar glitches when holding pointer to left | https://github.com/zen-browser/desktop/issues/5825 | None | 0:00:58 |
| mica not available | https://github.com/zen-browser/desktop/issues/5824 | 0:51:20 | None |
| Middle clicking some links opens them as glance instead of in a new tab | https://github.com/zen-browser/desktop/issues/5823 | None | None |
| WebPanel cant turn off floating mode | https://github.com/zen-browser/desktop/issues/5821 | None | 0:02:54 |
| Tabs show icon only in horizontal line, goes off-screen | https://github.com/zen-browser/desktop/issues/5820 | 1:28:43 | 0:41:00 |
| New blank page thing is buggy with bookmarks | https://github.com/zen-browser/desktop/issues/5818 | None | 2:46:46 |
| Upon zen browser update 2/23/25 18.b ALL workspaces lost, each workspace I now create has same bookmarks | https://github.com/zen-browser/desktop/issues/5817 | 9:16:52 | None |
| When clicking a link in the Pinned Tab Glance tab that is set to open in a different container, pinned tab is then blurry | https://github.com/zen-browser/desktop/issues/5816 | None | None |
| New URL bar when opening new tab not working correctly on 32:9 monitor | https://github.com/zen-browser/desktop/issues/5813 | 2 days, 5:30:15 | None |
| New tabs are not getting preserved in the same Workspace | https://github.com/zen-browser/desktop/issues/5812 | None | None |
| Window resize management | https://github.com/zen-browser/desktop/issues/5811 | None | None |
| Changing workspace name or icon resets workspaces set in bookmarks | https://github.com/zen-browser/desktop/issues/5810 | None | None |
| v1.8.2b not displaying home screen | https://github.com/zen-browser/desktop/issues/5809 | 2:28:44 | None |
| Zen 1.7.x and 1.8.x regression | https://github.com/zen-browser/desktop/issues/5808 | 7:44:24 | None |
| Whatsapp Contacts | https://github.com/zen-browser/desktop/issues/5807 | None | None |
| weired tabs bug | https://github.com/zen-browser/desktop/issues/5806 | None | None |
| Zen Profiles replaced with setting button in 1.8.2b | https://github.com/zen-browser/desktop/issues/5805 | 0:14:38 | 11:40:50 |
| Not updating on browser restart | https://github.com/zen-browser/desktop/issues/5804 | None | None |
| Default container not set when opening a website from outside of Zen (Linux) | https://github.com/zen-browser/desktop/issues/5803 | None | None |
| Cannot open sites from history panel | https://github.com/zen-browser/desktop/issues/5802 | 0:27:54 | None |
| Download / library shortcut | https://github.com/zen-browser/desktop/issues/5801 | None | 0:06:56 |
| Sidebar button is gone | https://github.com/zen-browser/desktop/issues/5800 | 1:35:18 | None |
| Opening a link from another tab doesn't use containers correctly | https://github.com/zen-browser/desktop/issues/5799 | None | None |
| Tab groups not working | https://github.com/zen-browser/desktop/issues/5798 | 11:37:32 | None |
| Cannot drag pinned tabs | https://github.com/zen-browser/desktop/issues/5797 | 3:39:24 | None |
| Cannot open bookmark from panel opened using Ctrl+B | https://github.com/zen-browser/desktop/issues/5796 | None | None |
| Returning from picture in picture to essential tab does not return to original workspace | https://github.com/zen-browser/desktop/issues/5795 | None | None |
| Closing glance tab does not return to parent tab | https://github.com/zen-browser/desktop/issues/5794 | None | None |
| I can't put the acrylic background on | https://github.com/zen-browser/desktop/issues/5793 | 0:43:58 | None |
| Passbolt Password Manager doesn't work properly | https://github.com/zen-browser/desktop/issues/5792 | None | None |
| No Profiles switcher - after upgrade | https://github.com/zen-browser/desktop/issues/5790 | 0:30:26 | None |
| Performance issues | https://github.com/zen-browser/desktop/issues/5789 | None | None |
| Cannot drag tabs in private mode | https://github.com/zen-browser/desktop/issues/5788 | 0:41:47 | None |
| Can not using open.spotify.com | https://github.com/zen-browser/desktop/issues/5785 | 2:35:46 | 5:36:49 |
| "Back to the tab" button in "picture in picture" mode doesn't work | https://github.com/zen-browser/desktop/issues/5784 | None | None |
| Floating URL bar appears in the unintended place | https://github.com/zen-browser/desktop/issues/5783 | 0:23:20 | 0:26:43 |
| Pinned tabs are not visible | https://github.com/zen-browser/desktop/issues/5782 | 0:16:04 | None |
| Poor handling of light colored favicons in light mode (icons) | https://github.com/zen-browser/desktop/issues/5781 | 0:44:44 | None |
| Profile icon disappeared | https://github.com/zen-browser/desktop/issues/5780 | 0:06:14 | 0:07:25 |
| Homepage, new windows and new tabs with blank screen | https://github.com/zen-browser/desktop/issues/5779 | 1:06:32 | None |
| Updater deleted zen.exe | https://github.com/zen-browser/desktop/issues/5778 | None | None |
| 1.8b new Color Picker seems to clear custom colors after switching workspaces | https://github.com/zen-browser/desktop/issues/5777 | 2 days, 4:20:36 | None |
| Essentials Tabs Vanish from UI | https://github.com/zen-browser/desktop/issues/5776 | 1:21:51 | None |
| Deleting workspaces make temporary unavailable creating new workspaces and appear these workspaces' tabs when opening Zen again | https://github.com/zen-browser/desktop/issues/5773 | 4:54:49 | None |
| Unable to apply themeing in Private mode | https://github.com/zen-browser/desktop/issues/5772 | None | None |
| CTRL+T displays search bar out of window | https://github.com/zen-browser/desktop/issues/5770 | 0:14:04 | 3:42:49 |
| "Hidden" tab when opening from a bookmark | https://github.com/zen-browser/desktop/issues/5769 | 2 days, 2:11:30 | None |
| No pinned extensions after restart browser and more tools button stuck | https://github.com/zen-browser/desktop/issues/5768 | None | None |
| Pinned tabs missing | https://github.com/zen-browser/desktop/issues/5767 | 0:52:30 | None |
| Browser flickers when using mission control | https://github.com/zen-browser/desktop/issues/5766 | None | None |
| Disabling "Shortcuts" from Address Bar Settings breaks "Always" Floating url bar. It reverts to "Floating only when typing". | https://github.com/zen-browser/desktop/issues/5765 | None | None |
| New tab intermittently opening sidebar in compact mode | https://github.com/zen-browser/desktop/issues/5763 | None | None |
| Cannot see cursor or highlight when typing in new tab (or Ctrl+T) | https://github.com/zen-browser/desktop/issues/5762 | 0:23:44 | None |
| Can't drag tabs from below to first | https://github.com/zen-browser/desktop/issues/5761 | 0:06:55 | None |
| AppImage fails to run | https://github.com/zen-browser/desktop/issues/5760 | 3:48:52 | None |
| Visual glitch exiting fullscreen in compact mode | https://github.com/zen-browser/desktop/issues/5759 | 2:07:30 | None |
| Container pinned and essential error | https://github.com/zen-browser/desktop/issues/5757 | None | None |
| Error when dragging tabs | https://github.com/zen-browser/desktop/issues/5756 | 3:39:59 | 11:14:10 |
| URL bar does not hide completely in compact mode | https://github.com/zen-browser/desktop/issues/5755 | 7:02:14 | 7:02:14 |
| Dragging pinned tabs to reoder them puts them in a random place | https://github.com/zen-browser/desktop/issues/5754 | 3:09:24 | None |
| Zen occasionally modifying webpage background styles | https://github.com/zen-browser/desktop/issues/5753 | None | 0:16:11 |
| Scrolling Freeze on touchpad when dragging and dropping (i3wm) | https://github.com/zen-browser/desktop/issues/5752 | None | None |
| In light mode, every popup is black with black text. | https://github.com/zen-browser/desktop/issues/5751 | 11:21:24 | None |
| Workspace tabs disappear | https://github.com/zen-browser/desktop/issues/5750 | None | 0:15:37 |
| Dark Theme Styles option in Look and Feel missing | https://github.com/zen-browser/desktop/issues/5749 | 0:15:47 | 0:15:47 |
| Tabs not apearing on the sidebar when opening a new window. | https://github.com/zen-browser/desktop/issues/5748 | None | None |
| Tabs can't be reordered by dragging upwards in the sidebar | https://github.com/zen-browser/desktop/issues/5747 | None | 0:03:03 |
| Floating Urlbar issue misposition | https://github.com/zen-browser/desktop/issues/5745 | 0:49:27 | 3:14:37 |
| Huge tabs on compact SideBar | https://github.com/zen-browser/desktop/issues/5744 | None | None |
| Tab disappearing in Sidebar in the new version | https://github.com/zen-browser/desktop/issues/5742 | 23:32:10 | None |
| Zen Update to 1.8b created a new profile | https://github.com/zen-browser/desktop/issues/5741 | 0:13:22 | None |
| Web panel does not obey default zoom | https://github.com/zen-browser/desktop/issues/5739 | None | None |
| theme colors are confusing or bugged | https://github.com/zen-browser/desktop/issues/5738 | 3:31:55 | 12:10:14 |
| Closing a pinned tab causes zen to not open tabs and many other features stop working | https://github.com/zen-browser/desktop/issues/5737 | 5:14:48 | 15:50:20 |
| Homarr tiles no longer open in a new tab when pinned/added to Essentials; instead, they open in Glance mode | https://github.com/zen-browser/desktop/issues/5736 | None | None |
| Opening settings opens the wrong tab | https://github.com/zen-browser/desktop/issues/5735 | None | 0:35:12 |
| Webpage scrolling leads to 100% GPU + freezes compared to Firefox | https://github.com/zen-browser/desktop/issues/5734 | None | None |
| Essential tabs prevent first few tabs from moving up | https://github.com/zen-browser/desktop/issues/5733 | None | None |
| Mac OS Browser thinks there's one more tab open than there actually is | https://github.com/zen-browser/desktop/issues/5732 | 17:00:45 | None |
| Adjusting to system-wide dark mode does not work properly on macOS | https://github.com/zen-browser/desktop/issues/5729 | None | None |
| Twitch "follow" button and "grab points" button doesn't work | https://github.com/zen-browser/desktop/issues/5728 | None | None |
| Gradient tool "forgets" custom colors | https://github.com/zen-browser/desktop/issues/5727 | None | 16:09:01 |
| Color Picker - no visualization for custom colors | https://github.com/zen-browser/desktop/issues/5726 | 4:12:49 | 0:23:49 |
| newtab urlbar bugged and unusable (not fully displayed) | https://github.com/zen-browser/desktop/issues/5725 | 2:10:54 | 4:01:15 |
| Can't resize vertical tab bar on right-side mode (single toolbar) | https://github.com/zen-browser/desktop/issues/5723 | 0:10:54 | None |
| Media autoplay built-in feature not working properly | https://github.com/zen-browser/desktop/issues/5722 | 4:12:27 | None |
| GPU fan | https://github.com/zen-browser/desktop/issues/5721 | 0:08:31 | None |
| Reordering tabs not working after update | https://github.com/zen-browser/desktop/issues/5719 | 1:41:05 | None |
| Toolbar item in sidebar | https://github.com/zen-browser/desktop/issues/5718 | None | None |
| bad urlbar size | https://github.com/zen-browser/desktop/issues/5717 | None | None |
| Sudden errors when watching videos on sites like YouTube | https://github.com/zen-browser/desktop/issues/5716 | 12:37:11 | None |
| Right-click context menu Fully white &#124; Not visible / usable | https://github.com/zen-browser/desktop/issues/5715 | 2 days, 8:31:10 | None |
| new tab drop down bugged | https://github.com/zen-browser/desktop/issues/5714 | 10:30:38 | 10:30:38 |
| About Zen browser's own translate | https://github.com/zen-browser/desktop/issues/5713 | None | 2:58:06 |
| Passkey functionality not working on Mac OS Ventura | https://github.com/zen-browser/desktop/issues/5712 | 2:20:57 | 1 day, 9:44:34 |
| Bitwarden extension window sizing | https://github.com/zen-browser/desktop/issues/5710 | None | None |
| No websites rendering | https://github.com/zen-browser/desktop/issues/5709 | None | None |
| Cant pin new tabs in workspaces | https://github.com/zen-browser/desktop/issues/5707 | None | None |
| Pinned tabs disappeared and profiles bugged | https://github.com/zen-browser/desktop/issues/5706 | 1:11:12 | 18:49:21 |
| Dragging a tab to the pinned tabs section pins it as essential. | https://github.com/zen-browser/desktop/issues/5705 | None | 2 days, 7:13:44 |
| Opening a tab from glance IN essential create an essential tab | https://github.com/zen-browser/desktop/issues/5704 | 1 day, 0:59:17 | None |
| Tab order is upside down | https://github.com/zen-browser/desktop/issues/5703 | 0:55:57 | 1:48:20 |
| Clicking on a link opens it using incorrect workspace | https://github.com/zen-browser/desktop/issues/5702 | 3:50:08 | None |
| URL Overflow Issue | https://github.com/zen-browser/desktop/issues/5701 | None | None |
| Toolbar hiding incompatible with top-aligned taskbar | https://github.com/zen-browser/desktop/issues/5700 | None | None |
| Website pathnames not being shown on single toolbar | https://github.com/zen-browser/desktop/issues/5698 | 3:20:52 | 21:46:49 |
| Barely readable light font color on light background in system theme on PopOS Light | https://github.com/zen-browser/desktop/issues/5697 | 4:17:37 | None |
| Mods on zen browser no longer work properly | https://github.com/zen-browser/desktop/issues/5695 | 0:13:38 | 2:19:25 |
| Tabs change their positions and wrong active tab from previous session is selected when launching the browser. | https://github.com/zen-browser/desktop/issues/5694 | 3:36:41 | None |
| Topmost pinned tab on every workspace moves to bottom after relaunch | https://github.com/zen-browser/desktop/issues/5693 | 2:43:57 | 1 day, 10:36:48 |
| Removes route when on localhost | https://github.com/zen-browser/desktop/issues/5691 | None | None |
| Glance messes up the tab order | https://github.com/zen-browser/desktop/issues/5690 | None | None |
| Closing tabs and moving the search bar off the screen on the left side | https://github.com/zen-browser/desktop/issues/5689 | 5:14:33 | None |
| Having multiple default tabs loads them in the wrong order. Putting an extension url such as nightTab will clear the entire default tabs text once leaving the settings page. | https://github.com/zen-browser/desktop/issues/5687 | None | None |
| Compact Sidebar animation constantly retriggers (improper offset) | https://github.com/zen-browser/desktop/issues/5685 | 13:15:05 | None |
| Zen trying to open pages from previous session even though option disabled | https://github.com/zen-browser/desktop/issues/5684 | None | None |
| "Side panel" icon opens bookmarks panel instead of custom website set earlier | https://github.com/zen-browser/desktop/issues/5683 | None | None |
| lost memory on another workspace, basically when i runned my browser the workspace that i was all sites was still there, but when a went to the other workspace did not existed any sites | https://github.com/zen-browser/desktop/issues/5682 | 7:15:10 | None |
| Zen Browser Sidebar Continuously Appears on Hover When Switching Windows | https://github.com/zen-browser/desktop/issues/5679 | None | None |
| Excalidraw is extremely laggy when trying to draw on the canvas | https://github.com/zen-browser/desktop/issues/5677 | None | None |
| Opening local html file doesn't allow referencing other files | https://github.com/zen-browser/desktop/issues/5676 | None | None |
| Private browsing now has a delay when opening | https://github.com/zen-browser/desktop/issues/5675 | 5:10:38 | None |
| Zen doesn't minimise when clicking on the icon in the taskbar. | https://github.com/zen-browser/desktop/issues/5674 | None | 19:33:50 |
| open tab from bookmarks | https://github.com/zen-browser/desktop/issues/5673 | 0:36:45 | None |
| version 1.8 killed all pinned tabs (12 pieces) ■ SOLVED, just update the mods :) | https://github.com/zen-browser/desktop/issues/5672 | 0:07:25 | 15:32:21 |
| Zen's URL bar breaks when signing in with Mozilla Sync | https://github.com/zen-browser/desktop/issues/5671 | None | None |
| Top toolbar still expands even when Zen uses only left toolbar and system title bar | https://github.com/zen-browser/desktop/issues/5669 | 3:37:27 | None |
| Error in TabsBase selectedIndex | https://github.com/zen-browser/desktop/issues/5668 | None | None |
| Custom shortcut broke the Esc key in the browser. | https://github.com/zen-browser/desktop/issues/5667 | None | None |
| Add hex code field in 'change theme colors' seems to be gone | https://github.com/zen-browser/desktop/issues/5666 | 0:08:05 | 2:09:20 |
| [macOS 1.8b] Pinned Tabs removed after updating to the latest version | https://github.com/zen-browser/desktop/issues/5663 | 1:22:44 | None |
| Workspaces except the first one lost all open tabs after 1.8b update | https://github.com/zen-browser/desktop/issues/5662 | 0:20:36 | None |
| When i create a new profile using the new profile wizard, the new profile is set as the default one, and if i close the browser and reopen it, the button to switch to the other profile is not visible in the side bar. | https://github.com/zen-browser/desktop/issues/5661 | 13:53:19 | None |
| Beta and Twilight both appear set as default browser | https://github.com/zen-browser/desktop/issues/5660 | None | None |
| Zen browser does not start on the current windows desktop | https://github.com/zen-browser/desktop/issues/5659 | None | None |
| no switch profiles button after update | https://github.com/zen-browser/desktop/issues/5658 | 1:32:27 | 5:02:01 |
| `vertical-pinned-tabs-container-separator` is inside `zen-workspace-tabs-section` grid container | https://github.com/zen-browser/desktop/issues/5657 | 7:01:28 | 7:01:28 |
| Certificate Manager does not responds to interactions | https://github.com/zen-browser/desktop/issues/5656 | 0:22:52 | None |
| Open in New Container Tab when Switch to Workspace with Container Tab is on causes the tab to disappear | https://github.com/zen-browser/desktop/issues/5655 | 6:02:01 | None |
| UI Bugs in Zen 1.8b Off-Position Elements & Blank Screen in New Tab Window | https://github.com/zen-browser/desktop/issues/5654 | 1 day, 3:23:11 | None |
| Sideberry bug in new v1.8b | https://github.com/zen-browser/desktop/issues/5653 | 1:57:36 | None |
| After 1.8b, the search popup spawns in right bottom | https://github.com/zen-browser/desktop/issues/5652 | 3:15:59 | 3:54:17 |
| I can see that the new update has arrived, but my browser does not show it ? | https://github.com/zen-browser/desktop/issues/5651 | 4:26:41 | 1 day, 2:17:46 |
| Video player are broken after update to 1.8b | https://github.com/zen-browser/desktop/issues/5650 | None | 1 day, 0:23:43 |
| Essential tabs have the transparency filter applied | https://github.com/zen-browser/desktop/issues/5649 | None | None |
| Horizontal Scrolling with mouse wheel is not working | https://github.com/zen-browser/desktop/issues/5647 | None | None |
| 1.8b - Tab Groups dissapear after restart | https://github.com/zen-browser/desktop/issues/5646 | 3:01:15 | None |
| Home menu broken after update | https://github.com/zen-browser/desktop/issues/5645 | 15:28:28 | None |
| Added support renaming pinned tabs (But there is no options to rename the pinned tabs) | https://github.com/zen-browser/desktop/issues/5644 | 1:48:18 | 3:05:52 |
| Missing Vietnamese in 'translation to' language | https://github.com/zen-browser/desktop/issues/5643 | None | 0:25:10 |
| When zen brower turns on "Use smooth scrolling" option to browse forums, YouTube, Pinterest and other types of websites, there will be a problem of delayed scrolling or the mouse does not follow the hand. | https://github.com/zen-browser/desktop/issues/5641 | None | None |
| Error when typing in Korean in the address window | https://github.com/zen-browser/desktop/issues/5640 | 0:06:16 | 0:09:19 |
| [1.8t-1.8b] Clicking Settings button doesn't switch tabs properly | https://github.com/zen-browser/desktop/issues/5639 | None | 1 day, 3:24:31 |
| Sidebar doesn't hide after dismissal of urlbar | https://github.com/zen-browser/desktop/issues/5638 | None | 0:10:36 |
| Fixed tabs on different tabs fail to sync with each other | https://github.com/zen-browser/desktop/issues/5636 | None | None |
| tanstack router dev-tool crashing during HMR with "path is undefined" (only in Zen Browser) | https://github.com/zen-browser/desktop/issues/5635 | None | 0:20:53 |
| Transparent New Tab Modal when clicking Ctrl+T while playing a video | https://github.com/zen-browser/desktop/issues/5633 | 6:18:17 | None |
| You must login to this network pop up | https://github.com/zen-browser/desktop/issues/5631 | 1 day, 18:49:46 | None |
| Pinned Tabs Keep Unloading (1.7.6b Linux flatpak fresh install) | https://github.com/zen-browser/desktop/issues/5628 | None | None |
| Unable to type directly after opening a new Zen window. | https://github.com/zen-browser/desktop/issues/5627 | None | None |
| Mouse does not become pointer on hover | https://github.com/zen-browser/desktop/issues/5626 | 17:55:25 | None |
| Application Error: Memory Could Not Be Written in zen.exe | https://github.com/zen-browser/desktop/issues/5622 | None | None |
| "Canva" Lags and Cursor not appearing | https://github.com/zen-browser/desktop/issues/5621 | None | None |
| Highlighted text in URL Bar is light colored in light mode | https://github.com/zen-browser/desktop/issues/5619 | None | None |
| Glanced tabs that are expanded align wrongly in the viewport on mac | https://github.com/zen-browser/desktop/issues/5617 | None | None |
| Scrolling not as smooth as on other browsers | https://github.com/zen-browser/desktop/issues/5615 | None | 3:30:28 |
| [Twilight] Window controls not showing on hover | https://github.com/zen-browser/desktop/issues/5611 | None | None |
| Floating URL bar appears way off the expected position | https://github.com/zen-browser/desktop/issues/5609 | 1 day, 13:01:37 | None |
| Change theme color wipes out previous hex codes | https://github.com/zen-browser/desktop/issues/5608 | 3 days, 23:48:20 | None |
| Preferences constantly resetting. | https://github.com/zen-browser/desktop/issues/5607 | None | None |
| Search box off center | https://github.com/zen-browser/desktop/issues/5604 | 0:07:53 | 0:18:26 |
| Zen is being blocked consistently by BattlEye anti-cheat software | https://github.com/zen-browser/desktop/issues/5603 | None | 0:03:33 |
| Window is out of View Bug | https://github.com/zen-browser/desktop/issues/5600 | None | 0:06:59 |
| In Zen Browser, there is no clear indication when a webpage is loading | https://github.com/zen-browser/desktop/issues/5599 | 1:44:23 | 2 days, 5:12:39 |
| [Twilight] Tab groups not working 😅 | https://github.com/zen-browser/desktop/issues/5597 | 2:57:17 | 2:57:17 |
| New tab shows all essentials | https://github.com/zen-browser/desktop/issues/5596 | 3:18:41 | None |
| Customize toolbar | https://github.com/zen-browser/desktop/issues/5595 | 1 day, 11:08:32 | None |
| Firefox sync not getting "Ask to save passwords" toggle in Zen | https://github.com/zen-browser/desktop/issues/5594 | 3:50:43 | None |
| Session restore only restoring one window | https://github.com/zen-browser/desktop/issues/5593 | 1 day, 3:20:59 | None |
| Youtube sound delay | https://github.com/zen-browser/desktop/issues/5592 | 3 days, 20:07:44 | None |
| [Twilight] Floating urlbar typing area/prompt moving up and down making it hard to see. | https://github.com/zen-browser/desktop/issues/5590 | 8:06:32 | 8:06:32 |
| Sound not working on new tabs sometimes | https://github.com/zen-browser/desktop/issues/5589 | None | None |
| Laggy when scrolling | https://github.com/zen-browser/desktop/issues/5588 | None | None |
| Twilight not on Firefox 135.0.1 | https://github.com/zen-browser/desktop/issues/5587 | 0:49:14 | 0:49:14 |
| Latest Twilight Broken | https://github.com/zen-browser/desktop/issues/5586 | 0:53:59 | 0:53:59 |
| Moving tabs between two windows of Zen Browser moves the tab | https://github.com/zen-browser/desktop/issues/5585 | None | None |
| Render Issue | https://github.com/zen-browser/desktop/issues/5584 | 13:54:43 | 13:54:43 |
| Toggle button only seen as black dot. | https://github.com/zen-browser/desktop/issues/5583 | 2 days, 7:30:27 | None |
| Addons - General popup are shifted to the right, and in full screen they are not visible | https://github.com/zen-browser/desktop/issues/5582 | 5:39:40 | None |
| Youtube crashed on playlist. | https://github.com/zen-browser/desktop/issues/5580 | None | None |
| Input focus issue with Chinese IME in new tab page | https://github.com/zen-browser/desktop/issues/5578 | 2:11:15 | 4 days, 20:59:45 |
| Closing an essential tab removes it from essentials | https://github.com/zen-browser/desktop/issues/5575 | 18:01:45 | None |
| Bookmark and New Tab Issue | https://github.com/zen-browser/desktop/issues/5574 | None | None |
| Cant scroll tab list on touch screen. | https://github.com/zen-browser/desktop/issues/5573 | None | None |
| Cannot Select/Copy/Edit in URL Bar | https://github.com/zen-browser/desktop/issues/5570 | 1 day, 0:52:42 | None |
| youtube mouse pointer lag | https://github.com/zen-browser/desktop/issues/5568 | None | None |
| Adaptive tab bar color is not changing Zen's theme when the active window focus is on Zen but theme is changed when the focus is switched to other application. | https://github.com/zen-browser/desktop/issues/5567 | None | None |
| Dragging a tab to the edge of the sidebar detaches the tab from cursor | https://github.com/zen-browser/desktop/issues/5566 | None | None |
| General typing shortcuts with Control key are breaking | https://github.com/zen-browser/desktop/issues/5565 | None | 18:11:47 |
| Context menu renders cropped | https://github.com/zen-browser/desktop/issues/5564 | None | None |
| WebPanels - New added website doesn't appear immediately | https://github.com/zen-browser/desktop/issues/5563 | None | None |
| Links from External Apps Open as Blank Tabs in Zen Browser | https://github.com/zen-browser/desktop/issues/5562 | 2:11:24 | None |
| [Twilight 1.8] Sidebar is misalligned upon initlialization | https://github.com/zen-browser/desktop/issues/5560 | 1 day, 5:46:13 | 1 day, 5:46:13 |
| [Twilight 1.8] New Windows native Icons are poorly designed and uneccesary | https://github.com/zen-browser/desktop/issues/5559 | None | 22:24:06 |
| [Twilight 1.8] The new windows native icons are a eye sore to look at and I much prefer the original icons in 1.7.6 b | https://github.com/zen-browser/desktop/issues/5558 | None | 0:00:53 |
| {Twilight} Broken Workspace Swipe Gestures | https://github.com/zen-browser/desktop/issues/5557 | None | None |
| 1.7.6b Restore Previous Session does not work | https://github.com/zen-browser/desktop/issues/5556 | 12:28:14 | None |
| Separating a tab to a new window will convert the essential tab to pinned tab in the new window | https://github.com/zen-browser/desktop/issues/5555 | 1 day, 16:31:35 | None |
| Problems when typing in the URL bar in the IME | https://github.com/zen-browser/desktop/issues/5554 | 1 day, 9:24:59 | 1 day, 9:24:59 |
| Keyboard shortcut binding: Recieve keys as accent characters | https://github.com/zen-browser/desktop/issues/5553 | 4 days, 3:24:51 | None |
| Ctrl+Shift+Tab not work as switch to previous tab cuz "Show all tabs" is using it | https://github.com/zen-browser/desktop/issues/5552 | 0:29:24 | 5:42:48 |
| Tabs sent to Zen through Firefox sync "send to device" feature is added to essentials tab | https://github.com/zen-browser/desktop/issues/5551 | None | None |
| Signing in with Google is Not working. | https://github.com/zen-browser/desktop/issues/5550 | 9:57:05 | None |
| The active tab is above the URL bar overlay | https://github.com/zen-browser/desktop/issues/5545 | None | 5 days, 12:56:26 |
| Inspect Mode issue | https://github.com/zen-browser/desktop/issues/5542 | None | None |
| Essential Tabs | https://github.com/zen-browser/desktop/issues/5540 | 12:40:20 | None |
| Fullscreen mode for videos and the Full Screen JS API on MacOS are not totally fullscreen | https://github.com/zen-browser/desktop/issues/5539 | None | None |
| New tab floating search bar breaks when typing special dead-key characters | https://github.com/zen-browser/desktop/issues/5536 | None | None |
| Can't select multiple tabs/ can't use split tabs. | https://github.com/zen-browser/desktop/issues/5533 | None | None |
| All open tabs are blank and unresponsive | https://github.com/zen-browser/desktop/issues/5531 | 3:42:46 | None |
| Pinned Tabs loose link | https://github.com/zen-browser/desktop/issues/5529 | None | None |
| Keyboard shortcut rebinding: warning label how to save the shortcut is yellow-on-white | https://github.com/zen-browser/desktop/issues/5528 | None | None |
| Blurred fonts on ultrawide monitor full screen | https://github.com/zen-browser/desktop/issues/5527 | 5:31:30 | None |
| Need to restart browser for workspace changes to take effect. | https://github.com/zen-browser/desktop/issues/5526 | None | None |
| Icons Search is not working | https://github.com/zen-browser/desktop/issues/5525 | None | 6 days, 10:45:58 |
| Can't close the notification when I navigate to a new tab | https://github.com/zen-browser/desktop/issues/5523 | None | None |
| [Twilight 1.8t]macos 'traffic light' doesnt work | https://github.com/zen-browser/desktop/issues/5522 | 7 days, 13:30:51 | None |
| Glance Icons appear above Zen web panel | https://github.com/zen-browser/desktop/issues/5521 | None | 1 day, 8:12:42 |
| CloudFlare captcha error | https://github.com/zen-browser/desktop/issues/5520 | 1:35:43 | 1:50:28 |
| Can't Connect on twitch | https://github.com/zen-browser/desktop/issues/5519 | None | None |
| Pinned links disappear | https://github.com/zen-browser/desktop/issues/5518 | None | None |
| Fullscreen webpage from gmail preview loads part of webpage (see images) | https://github.com/zen-browser/desktop/issues/5515 | None | None |
| google suit apps load impoperly | https://github.com/zen-browser/desktop/issues/5514 | None | None |
| Unexpected blurred fonts when opening a web while using fractional scaling | https://github.com/zen-browser/desktop/issues/5513 | None | None |
| Glance's buttons are rendered above the sidebar | https://github.com/zen-browser/desktop/issues/5511 | 9 days, 5:17:09 | None |
| Broken profiles (switching, workspaces) | https://github.com/zen-browser/desktop/issues/5509 | 9:40:26 | None |
| System Crashing when opening pdf | https://github.com/zen-browser/desktop/issues/5507 | None | None |
| Essentials keep getting rearranged | https://github.com/zen-browser/desktop/issues/5505 | None | None |
| Active essential follow you to next workspace | https://github.com/zen-browser/desktop/issues/5504 | 8:47:21 | None |
| Chart Labels Render Incorrectly | https://github.com/zen-browser/desktop/issues/5501 | None | 7 days, 3:34:14 |
| **Performance Issue: High CPU Usage with Zen UI Mods** | https://github.com/zen-browser/desktop/issues/5500 | 1 day, 6:39:29 | None |
| Plugin icons are misalligned after the fresh install on MacOS | https://github.com/zen-browser/desktop/issues/5498 | None | None |
| (Manual) Glance no longer works on local webpages | https://github.com/zen-browser/desktop/issues/5497 | None | None |
| [Twilight 1.8] URL bar on side bar dissapears when clicking new tab | https://github.com/zen-browser/desktop/issues/5496 | None | 0:13:58 |
| [Twilight 1.8] Windows acrylic theme doesn't work | https://github.com/zen-browser/desktop/issues/5495 | None | 5:19:16 |
| New Tab Opens a Pop-Up Instead of a Blank Page Bug or Design Flaw? | https://github.com/zen-browser/desktop/issues/5494 | 6:52:09 | None |
| [Twilight 1.8] Floating URL bar doesn't stay stationary when in compact mode and twitches | https://github.com/zen-browser/desktop/issues/5493 | None | 3 days, 1:02:26 |
| Twilight build [1.8t] - pinned tabs doesn't save renamed name after closing | https://github.com/zen-browser/desktop/issues/5492 | 8:04:46 | None |
| Dragging link from tab to same workspace in different window causes container indicator to show up | https://github.com/zen-browser/desktop/issues/5489 | None | None |
| [Twilight 1.8t] Strange looking tab bar at startup | https://github.com/zen-browser/desktop/issues/5488 | None | 9:53:15 |
| Click and Drag one hand trackpad | https://github.com/zen-browser/desktop/issues/5487 | None | 2 days, 11:12:48 |
| [Twilight 1.8t] URL Search Bar is Misalligned in Compact Mode | https://github.com/zen-browser/desktop/issues/5486 | None | 4:56:35 |
| flatpak crashes Clear Linux OS | https://github.com/zen-browser/desktop/issues/5484 | None | None |
| Compact mode don´t working | https://github.com/zen-browser/desktop/issues/5483 | 1:04:09 | 1:04:09 |
| tab preview | https://github.com/zen-browser/desktop/issues/5482 | 2:43:58 | 2:43:58 |
| Pinned tabs do not load on startup | https://github.com/zen-browser/desktop/issues/5481 | None | None |
| Twilight should have a different bundle id, since is seperate .app | https://github.com/zen-browser/desktop/issues/5479 | None | None |
| Moving bookmarks on the bookmarkbar doesn't work properly | https://github.com/zen-browser/desktop/issues/5478 | None | None |
| Alt-Tab Behavior: Mouse Focus Interference | https://github.com/zen-browser/desktop/issues/5476 | None | None |
| Glancing a link in split view causes tab to glitch | https://github.com/zen-browser/desktop/issues/5475 | 2 days, 19:02:25 | None |
| Letterboxing adds +1 to width when not in compact mode and sidebar is resized (e.g., 1400 → 1401) | https://github.com/zen-browser/desktop/issues/5473 | None | None |
| Mac Text Replacements don't work | https://github.com/zen-browser/desktop/issues/5472 | 2 days, 23:30:41 | None |
| Built-in Screenshot feature buttons unreacheable in Split View | https://github.com/zen-browser/desktop/issues/5471 | None | None |
| SSO SAML Microsoft azure | https://github.com/zen-browser/desktop/issues/5470 | None | None |
| Toggle compact mode button can't be added anymore after latest release | https://github.com/zen-browser/desktop/issues/5469 | 7 days, 19:41:40 | 8 days, 3:56:17 |
| Zen browser does not honor the browser.quitShortcut.disabled setting | https://github.com/zen-browser/desktop/issues/5468 | None | None |
| Mac OS toolbar customization - missing icons and broken toolbar view | https://github.com/zen-browser/desktop/issues/5466 | None | None |
| New tab and the awesomebar appears over the current tab/content instead of a blank page | https://github.com/zen-browser/desktop/issues/5465 | 0:10:43 | 1:24:31 |
| Problem with Screensharing tabs on Zen (Meet, Jitsi, and alike) | https://github.com/zen-browser/desktop/issues/5464 | 3:00:19 | None |
| Browser can't connect to internet after waking from sleep. | https://github.com/zen-browser/desktop/issues/5463 | 5 days, 4:42:51 | None |
| [Twilight 1.7.7t] General UI inconsistencies and unpolished aspects | https://github.com/zen-browser/desktop/issues/5462 | 3:30:32 | 16:40:49 |
| UI Disappears and Cursor Jumps When Typing Traditional Chinese in a New Tab | https://github.com/zen-browser/desktop/issues/5461 | 2:23:41 | None |
| New tabs directly in Essentials without being pinned has essential. | https://github.com/zen-browser/desktop/issues/5458 | 1 day, 11:05:36 | None |
| [Twilight 1.7.7t] UI issue with window buttons | https://github.com/zen-browser/desktop/issues/5456 | 0:06:27 | 6:50:55 |
| Unable to use on-device passkeys on macOS | https://github.com/zen-browser/desktop/issues/5450 | 0:56:40 | 0:56:40 |
| When syncing to mozzila account I'm told to "Open Zen Browser on your mobile device" | https://github.com/zen-browser/desktop/issues/5448 | None | None |
| Too high memory uses | https://github.com/zen-browser/desktop/issues/5447 | None | None |
| Can't load any Reddit pages | https://github.com/zen-browser/desktop/issues/5446 | None | None |
| Error searching with an accented character | https://github.com/zen-browser/desktop/issues/5444 | 22:14:23 | None |
| Search Box Misalignment and Glitching When Opening Sidebar | https://github.com/zen-browser/desktop/issues/5442 | 0:42:19 | None |
| Workspace button doesn't appear? | https://github.com/zen-browser/desktop/issues/5441 | 23:55:47 | None |
| Developer Tools Not Loading and Unresponsive | https://github.com/zen-browser/desktop/issues/5439 | None | None |
| Unable to Update Zen Browser Twilight | https://github.com/zen-browser/desktop/issues/5438 | 0:54:12 | 22:15:33 |
| [Twilight] Container specific essentials: Essential tab keeps the focus when switching workspace | https://github.com/zen-browser/desktop/issues/5437 | None | None |
| The Ctrl + T is useless | https://github.com/zen-browser/desktop/issues/5436 | 2:17:15 | None |
| Random, open link in new tab behaviour | https://github.com/zen-browser/desktop/issues/5434 | None | None |
| Top side is getting cut off randomly | https://github.com/zen-browser/desktop/issues/5433 | None | None |
| Netflix Wont Persist Login | https://github.com/zen-browser/desktop/issues/5431 | 1 day, 8:19:32 | None |
| Welcome page after initial setup has absolute positioning for buttons | https://github.com/zen-browser/desktop/issues/5429 | None | None |
| Option to Lock Sidebar and Prevent Automatic Expansion on Mouse Hover Near Edge | https://github.com/zen-browser/desktop/issues/5428 | None | None |
| Add Option to Restore Previous Session (Windows and Tabs) | https://github.com/zen-browser/desktop/issues/5427 | None | 0:01:13 |
| Add Option to Restore Previous Session (Windows and Tabs) | https://github.com/zen-browser/desktop/issues/5426 | 1 day, 11:46:52 | None |
| Missing Shortcut to Switch to Last Active Tab | https://github.com/zen-browser/desktop/issues/5424 | 1 day, 5:28:34 | 9 days, 13:30:06 |
| Allow Drag-and-Drop to Open Tabs in a New Window | https://github.com/zen-browser/desktop/issues/5423 | 23:56:49 | None |
| Add Notification for New Tabs When Sidebar is Collapsed | https://github.com/zen-browser/desktop/issues/5422 | None | None |
| Option to Lock Sidebar and Prevent Automatic Expansion on Mouse Hover Near Edge | https://github.com/zen-browser/desktop/issues/5421 | None | 15:51:11 |
| Toggle Sidebar's Width button dissapears upon shrinking the sidebar's width | https://github.com/zen-browser/desktop/issues/5416 | None | 9 days, 20:01:47 |
| The url bar gets a little busted when the tab bar is open or close | https://github.com/zen-browser/desktop/issues/5415 | None | None |
| No hamburger (three dots) on Mac | https://github.com/zen-browser/desktop/issues/5413 | 1 day, 11:31:15 | 1 day, 11:31:15 |
| First tab in workspace with default container not logged in properly | https://github.com/zen-browser/desktop/issues/5412 | None | None |
| Address bar out of bounds | https://github.com/zen-browser/desktop/issues/5411 | None | None |
| New Tab Button Unresponsive When Signed-In to Firefox Account | https://github.com/zen-browser/desktop/issues/5410 | None | None |
| Text corrupting | https://github.com/zen-browser/desktop/issues/5409 | 2 days, 19:23:23 | 4 days, 15:42:45 |
| My Zen Browser is keep forcing to use dark mode on some website that doesn't have a default background been set | https://github.com/zen-browser/desktop/issues/5408 | 12:02:25 | 12:02:25 |
| Twitter/X does not automatically change light/dark theme, whereas Firefox does | https://github.com/zen-browser/desktop/issues/5401 | None | None |
| I have lags while I'm watching youtube video | https://github.com/zen-browser/desktop/issues/5399 | 0:04:37 | None |
| Zooming with Cmd + Scroll Wheel Not Working on Mac | https://github.com/zen-browser/desktop/issues/5398 | None | None |
| Firefox logos/website in certain about: pages | https://github.com/zen-browser/desktop/issues/5397 | None | None |
| Zen URL bar glitchy animation in compact mode | https://github.com/zen-browser/desktop/issues/5396 | None | None |
| Ctrl + V doesn't work when creating new tab | https://github.com/zen-browser/desktop/issues/5395 | 6:42:48 | None |
| Text and other elements in some webpages is significatly smaller on a display with scaling applied | https://github.com/zen-browser/desktop/issues/5394 | None | None |
| bookmark bar persists when opening folder | https://github.com/zen-browser/desktop/issues/5393 | 2 days, 15:06:01 | 12 days, 0:17:13 |
| pip not adjustable with trackpad | https://github.com/zen-browser/desktop/issues/5392 | None | 5 days, 8:39:48 |
| media player "unknown app" | https://github.com/zen-browser/desktop/issues/5391 | None | None |
| sidebar glitch when creating new tab | https://github.com/zen-browser/desktop/issues/5390 | None | 9 days, 22:30:29 |
| Themes Inconsistent | https://github.com/zen-browser/desktop/issues/5389 | 17:46:52 | None |
| Compact mode does not show popup/redirect warnings | https://github.com/zen-browser/desktop/issues/5388 | None | None |
| where did all the themes go? | https://github.com/zen-browser/desktop/issues/5387 | 0:58:22 | 1:35:56 |
| Memory Leak in Side Panels - Websites Remain Active in Background After Closing Panels | https://github.com/zen-browser/desktop/issues/5385 | 1:57:07 | 1:57:07 |
| Workspace container not applied on new window | https://github.com/zen-browser/desktop/issues/5384 | None | None |
| Bookmarks don't open in new tab when using new tab | https://github.com/zen-browser/desktop/issues/5383 | 4 days, 15:48:15 | None |
| Sidebar showing up way too early | https://github.com/zen-browser/desktop/issues/5382 | 1 day, 8:30:00 | None |
| Zen gradient is messed up | https://github.com/zen-browser/desktop/issues/5380 | None | None |
| Site keyboard shortcuts not active on tab selection | https://github.com/zen-browser/desktop/issues/5379 | None | None |
| It is Recognising Same Hotkeys as Different and not reporting conflict between them | https://github.com/zen-browser/desktop/issues/5378 | None | None |
| [BUG] Enlarges extensions at the top switching layout modes | https://github.com/zen-browser/desktop/issues/5377 | 13:34:48 | 22:53:55 |
| [Twilight 1.7.7t] New Issue with super pins when making pinned tabs look like essentials | https://github.com/zen-browser/desktop/issues/5376 | 2 days, 21:50:51 | 3 days, 9:44:53 |
| Youtube site | https://github.com/zen-browser/desktop/issues/5374 | 4:08:18 | 4 days, 20:50:21 |
| [Twilight 1.7.7t] Windows acrylic theme sometimes doesn't work at all | https://github.com/zen-browser/desktop/issues/5371 | None | 3 days, 13:25:45 |
| Broken install.sh | https://github.com/zen-browser/desktop/issues/5370 | None | 10:34:12 |
| tab switcher is jumping 2-3 tabs ahead instead of the next tab | https://github.com/zen-browser/desktop/issues/5369 | None | None |
| Cannot resize sidebar as resize double arrows are not showing post update to 1.7.6b | https://github.com/zen-browser/desktop/issues/5368 | 3 days, 15:31:01 | None |
| [Twilight 1.7.7t] Windows acrylic theme either isn't working or is barely visible. | https://github.com/zen-browser/desktop/issues/5366 | None | 0:44:20 |
| [Twilight 1.7.7t] Private window tabs are misalligned and unusable upon initialization | https://github.com/zen-browser/desktop/issues/5364 | None | 13:45:27 |
| PDF view pinch zoom glitch | https://github.com/zen-browser/desktop/issues/5363 | None | None |
| Pinned tab URL not loaded - Loads last visited URL within the pinned URL instead | https://github.com/zen-browser/desktop/issues/5362 | 2 days, 19:35:48 | None |
| [macOS 1.7.6b] Pinned container tabs are not preserved in new browser windows | https://github.com/zen-browser/desktop/issues/5361 | None | 12 days, 0:35:06 |
| Differentiate Zen browsers in Cmd/Alt + Tab when running two different profiles at once | https://github.com/zen-browser/desktop/issues/5359 | None | None |
| Browser is completely blank | https://github.com/zen-browser/desktop/issues/5357 | None | None |
| Duplicating tabs of meeting apps | https://github.com/zen-browser/desktop/issues/5356 | None | None |
| Inconsistent multi line search suggestions in single toolbar layout | https://github.com/zen-browser/desktop/issues/5354 | None | None |
| Web Panel can get stuck behind toolbar | https://github.com/zen-browser/desktop/issues/5352 | None | None |
| There is no response to clicking the New Tab | https://github.com/zen-browser/desktop/issues/5351 | 17:20:04 | 18:15:27 |
| Compact mode error | https://github.com/zen-browser/desktop/issues/5349 | None | 2 days, 6:47:43 |
| Accent marks bug new tab search and override the current page instead | https://github.com/zen-browser/desktop/issues/5348 | None | 11 days, 3:10:32 |
| Tabs scroll to top on closing any from the bottom | https://github.com/zen-browser/desktop/issues/5346 | 1 day, 3:00:44 | 3 days, 22:33:59 |
| same issue | https://github.com/zen-browser/desktop/issues/5345 | None | 0:03:26 |
| DataTables Error | https://github.com/zen-browser/desktop/issues/5344 | None | None |
| The Ctrl+T to open an a new tab has a glitch for youtube. | https://github.com/zen-browser/desktop/issues/5343 | 1:20:06 | 4:50:55 |
| Closing "main" window while private window is opened leads to missing opened tabs in "main" window after the next start | https://github.com/zen-browser/desktop/issues/5340 | 11 days, 22:25:04 | None |
| Cannot remap ESC key | https://github.com/zen-browser/desktop/issues/5338 | None | 0:06:53 |
| 1.7.7t - new tab opens in essentials | https://github.com/zen-browser/desktop/issues/5337 | 7:44:10 | 1 day, 9:51:30 |
| Screen keeps flashing | https://github.com/zen-browser/desktop/issues/5333 | 1 day, 2:04:33 | None |
| Pinned tabs gone | https://github.com/zen-browser/desktop/issues/5332 | None | None |
| Maximizing a previewed link lead to a display error going in the corner | https://github.com/zen-browser/desktop/issues/5331 | None | None |
| [Linux 1.7.6] Compact mode sidebar can't collapse after adding a tab to essentials | https://github.com/zen-browser/desktop/issues/5330 | None | 11 days, 8:45:01 |
| [Twilight 1.7.7t] Severe misalignment when moving pinned or essential tabs | https://github.com/zen-browser/desktop/issues/5329 | None | 16:32:31 |
| customizing toolbar causes url bar and overflow to become bugged | https://github.com/zen-browser/desktop/issues/5328 | None | 11 days, 23:01:42 |
| new tab | https://github.com/zen-browser/desktop/issues/5327 | 0:21:15 | 16:16:00 |
| [Twilight 1.7.7t] Container-specific essentials non-functional on Windows | https://github.com/zen-browser/desktop/issues/5326 | None | None |
| Glitch Occurs When Hovering Over URL Bar in Sidebar Compact Mode | https://github.com/zen-browser/desktop/issues/5325 | None | None |
| [Twilight] New workspace switching animation slow, glitches and stutters | https://github.com/zen-browser/desktop/issues/5324 | None | None |
| [Twilight 1.7.7t] New tabs stack horizontially rather than vertically | https://github.com/zen-browser/desktop/issues/5323 | 0:07:26 | 1 day, 20:22:04 |
| Pinned tabs disappeared | https://github.com/zen-browser/desktop/issues/5321 | 16:32:44 | 4 days, 20:03:10 |
| Tabs scroll to bottom and then top when collapisng or uncollapsing the sidebar | https://github.com/zen-browser/desktop/issues/5320 | None | None |
| [Twilight] Only default workspace works, other workspaces wiped | https://github.com/zen-browser/desktop/issues/5319 | None | None |
| [MacOS] window managing buttons disapering when minimizing sidebar | https://github.com/zen-browser/desktop/issues/5317 | None | None |
| [Twilight] Tabs have no scrollbox anymore | https://github.com/zen-browser/desktop/issues/5316 | None | 9 days, 13:49:41 |
| [Windows 10] Videos do not play at Udemy.com | https://github.com/zen-browser/desktop/issues/5315 | 2:23:52 | None |
| New tab not opening | https://github.com/zen-browser/desktop/issues/5312 | 1:57:26 | 2:02:22 |
| Dead keys don't work with the revamped new tab, redirect to the current URL | https://github.com/zen-browser/desktop/issues/5311 | None | 11 days, 22:07:10 |
| Sidebar messed up and cant scroll to the bottom icons | https://github.com/zen-browser/desktop/issues/5310 | 0:14:08 | 0:22:26 |
| Keyboard Shortcut Queuing | https://github.com/zen-browser/desktop/issues/5307 | None | None |
| New Tab's Search Bar Doesn't Reset the Input Field When Losing Focus | https://github.com/zen-browser/desktop/issues/5306 | None | None |
| New tab on bottom | https://github.com/zen-browser/desktop/issues/5305 | None | None |
| Broken display of workspaces in latest twilight release | https://github.com/zen-browser/desktop/issues/5304 | None | 1 day, 3:57:44 |
| Zen Browser can not automatically update its self. | https://github.com/zen-browser/desktop/issues/5301 | 11 days, 2:58:17 | None |
| Zen Twilight 1.7.7t update ruined the Sidebar | https://github.com/zen-browser/desktop/issues/5299 | 0:26:33 | 6:58:05 |
| Clicking New Tab button does not open a new tab | https://github.com/zen-browser/desktop/issues/5297 | 0:12:35 | 0:57:11 |
| Viewing images in messenger are zoomed in than normal as opposed to other browsers | https://github.com/zen-browser/desktop/issues/5295 | None | None |
| Floating URL Bar Flickers/Twitches When Typing Japanese Characters | https://github.com/zen-browser/desktop/issues/5294 | 0:35:21 | 0:35:33 |
| Maximizing Floating Window sucks | https://github.com/zen-browser/desktop/issues/5291 | None | 13 days, 3:18:19 |
| Zen is just too slow in my new laptop | https://github.com/zen-browser/desktop/issues/5290 | None | None |
| Screen sharing fails on Mac OS | https://github.com/zen-browser/desktop/issues/5289 | None | None |
| The new tab opens below the next tab | https://github.com/zen-browser/desktop/issues/5288 | None | None |
| Search bar misalignment | https://github.com/zen-browser/desktop/issues/5287 | None | 13 days, 21:12:37 |
| Can't disable "Ask to save passwords" when 1Password extension is activated. | https://github.com/zen-browser/desktop/issues/5286 | 5:38:34 | 6:36:37 |
| Close split screen, toggle splitscreen grid and sometimes horizontal splitscreen doesn't work at all! | https://github.com/zen-browser/desktop/issues/5285 | None | None |
| Video Pop-up and theme misalignment | https://github.com/zen-browser/desktop/issues/5284 | None | None |
| Sidebar width is too wide and cannot adjust it when display workspaces as an icon strip | https://github.com/zen-browser/desktop/issues/5282 | None | None |
| Keybinds won't work properly on zen | https://github.com/zen-browser/desktop/issues/5281 | 4:30:10 | None |
| Container tabs from expanded glance do not show indicators in workspaces assigned to different containers | https://github.com/zen-browser/desktop/issues/5280 | None | None |
| Twilight build - 1.7.7t (2025-02-11 at 12:46:32) - auto-switching url from one workspace to another causes Zen to break | https://github.com/zen-browser/desktop/issues/5277 | None | None |
| Pinned Tabs Do Not Retain Original URL | https://github.com/zen-browser/desktop/issues/5276 | 2:40:04 | 15 days, 5:50:00 |
| CTRL+T shortcut and clicking on the '+ New Tab' opens floating URL bar | https://github.com/zen-browser/desktop/issues/5272 | 1:36:59 | 3:32:50 |
| Tab Groups Persist Across Workspaces Instead of Being Workspace-Specific | https://github.com/zen-browser/desktop/issues/5271 | 4:31:55 | 4:31:55 |
| Visiting some sites renders the browser material as the site's background. | https://github.com/zen-browser/desktop/issues/5268 | 5:06:25 | None |
| Sound icon in tab missing when side menu is folded | https://github.com/zen-browser/desktop/issues/5267 | 1:43:09 | 11:29:21 |
| Zen Ignores beforeunload Event-Handler When Closing Tabs and Windows | https://github.com/zen-browser/desktop/issues/5266 | None | None |
| New Tabs open in pinned tabs | https://github.com/zen-browser/desktop/issues/5264 | 7:33:27 | 23:46:33 |
| When changing OS theme various popups and menus become unreadable | https://github.com/zen-browser/desktop/issues/5263 | None | None |
| Glance Feature Causes Crash on Pages with "Confirm on Close" Behavior | https://github.com/zen-browser/desktop/issues/5262 | None | None |
| Darkreader ignores websites in Zen sidebar | https://github.com/zen-browser/desktop/issues/5260 | 3 days, 12:09:25 | None |
| Scrolling to switch workspaces not working | https://github.com/zen-browser/desktop/issues/5258 | 1 day, 11:01:17 | None |
| How can I show tab titles in the sidebar? | https://github.com/zen-browser/desktop/issues/5256 | 0:06:16 | 2:58:54 |
| Using the Chinese input method will reset the new tab behavior to open in the original tab | https://github.com/zen-browser/desktop/issues/5251 | 1:43:38 | 14:53:28 |
| Cant change profile on Mac/Only one instance of Zen allowed | https://github.com/zen-browser/desktop/issues/5250 | None | None |
| Broken Adress Bar appearance when Toolbar is very full | https://github.com/zen-browser/desktop/issues/5249 | None | None |
| New Tab not showing at all unless I enter something in the adress bar | https://github.com/zen-browser/desktop/issues/5248 | 0:32:55 | 0:42:38 |
| [BUG] Canvas is distorted on Web Apps | https://github.com/zen-browser/desktop/issues/5247 | 1:22:37 | 1:23:05 |
| Inconsistent thickness of the new UI icons | https://github.com/zen-browser/desktop/issues/5246 | None | None |
| Broken web panel | https://github.com/zen-browser/desktop/issues/5245 | None | None |
| Pinned tab unload button sometimes shows up as close button and closes tabs when clicked | https://github.com/zen-browser/desktop/issues/5244 | 1:31:44 | 12 days, 21:44:46 |
| Udemy encrypted videos are not playing | https://github.com/zen-browser/desktop/issues/5243 | 0:09:56 | 0:09:56 |
| Inconsistent/Incorrect behavior when using ctrl+enter from new tab addressbar | https://github.com/zen-browser/desktop/issues/5241 | 3 days, 0:12:37 | None |
| Glitchy sidebar on URL bar focus in compact mode | https://github.com/zen-browser/desktop/issues/5240 | 0:12:47 | None |
| Bookmarking doesn't work properly | https://github.com/zen-browser/desktop/issues/5239 | None | None |
| (Fails to build desktop) branch '135.0' does not have any commits | https://github.com/zen-browser/desktop/issues/5237 | None | None |
| Takes ~3 mins to open a link from terminal | https://github.com/zen-browser/desktop/issues/5236 | 1 day, 10:16:38 | None |
| 'Fullscreening'/Opening Glance from Essential Tab will make it Essential as well | https://github.com/zen-browser/desktop/issues/5234 | 4:42:06 | None |
| Ctrl+T Opens Search Panel Instead of New Tab | https://github.com/zen-browser/desktop/issues/5231 | 0:04:43 | 1:02:01 |
| New Tab Menu Not Displayed During Fullscreen Video Playback | https://github.com/zen-browser/desktop/issues/5229 | 6:47:20 | 6:47:20 |
| single click with middle key mouse sometimes deletes two tabs not just single tab | https://github.com/zen-browser/desktop/issues/5228 | 1 day, 8:31:15 | None |
| Sidebar not closing after pinning a tab | https://github.com/zen-browser/desktop/issues/5227 | 6:44:27 | 17 days, 16:08:54 |
| Bug in zen.urlbar.replace-newtab (wierd behavior in fullscreen) | https://github.com/zen-browser/desktop/issues/5225 | 10:17:06 | 10:17:06 |
| Auto switching workspace shows only one essential | https://github.com/zen-browser/desktop/issues/5222 | 1 day, 13:28:45 | None |
| Excalidraw rendering issue on zen browser | https://github.com/zen-browser/desktop/issues/5221 | 11:59:41 | 19:45:55 |
| Tab does not open | https://github.com/zen-browser/desktop/issues/5220 | 5:15:49 | None |
| Lost profile after update | https://github.com/zen-browser/desktop/issues/5218 | 1 day, 3:34:25 | None |
| Gamepad controls for browser games stopped working after last few updates. | https://github.com/zen-browser/desktop/issues/5217 | None | None |
| New Tabs Not Responding After An Update | https://github.com/zen-browser/desktop/issues/5216 | None | None |
| icon is in not visible in the toolbar | https://github.com/zen-browser/desktop/issues/5215 | 4 days, 19:21:15 | None |
| Issue: New Tab Not Opening When Searching in Korean | https://github.com/zen-browser/desktop/issues/5213 | 0:14:43 | 6 days, 13:05:20 |
| Right-Click Context Menu: Keyboard Shortcuts Require Enter to Activate | https://github.com/zen-browser/desktop/issues/5212 | None | None |
| Support daily.dev extension in zen browser. firefox doesn't. | https://github.com/zen-browser/desktop/issues/5211 | 0:05:56 | 0:05:56 |
| Error at the bottom right when opening a tab | https://github.com/zen-browser/desktop/issues/5210 | 0:28:59 | 0:28:59 |
| Pen Tablet Scrolling Not Working in Sidebar | https://github.com/zen-browser/desktop/issues/5209 | None | None |
| Essentials icons are off center | https://github.com/zen-browser/desktop/issues/5207 | 19:44:34 | 22:48:36 |
| the sidebar and url bar theme is not conistent with selected theme on windows | https://github.com/zen-browser/desktop/issues/5205 | 1:34:52 | 1:34:52 |
| New tab search bar loses focus on Japanese input, gives focus back to address bar, and replaces old tab instead of opening a new one | https://github.com/zen-browser/desktop/issues/5204 | 1:22:26 | 2:02:49 |
| Removing all start page shortcuts breaks Cmd+t (New Tab) | https://github.com/zen-browser/desktop/issues/5202 | 3:13:34 | None |
| Language being weird with Zen browser | https://github.com/zen-browser/desktop/issues/5201 | None | 3:53:43 |
| CMD+Enter inconsistently opens URLs in new tab on macOS | https://github.com/zen-browser/desktop/issues/5200 | 11:54:11 | None |
| I can't surf the internet using a VPN proxy | https://github.com/zen-browser/desktop/issues/5199 | 3:17:49 | None |
| New "feature" is counterintuative | https://github.com/zen-browser/desktop/issues/5198 | 3:02:57 | 4:58:52 |
| sidebar and toolbar issues | https://github.com/zen-browser/desktop/issues/5195 | 3 days, 18:29:17 | None |
| Incoherent behavior for vertical tabs ? | https://github.com/zen-browser/desktop/issues/5194 | None | None |
| Can't change or rebind keyboard shortcuts zen browser macos | https://github.com/zen-browser/desktop/issues/5193 | None | 0:16:17 |
| How to launch a specific profile from terminal? | https://github.com/zen-browser/desktop/issues/5192 | None | None |
| The New Tab Page is not transparent | https://github.com/zen-browser/desktop/issues/5191 | 7:55:33 | 7:55:33 |
| Cannot manually unload Essentials | https://github.com/zen-browser/desktop/issues/5190 | 4 days, 14:51:46 | None |
| Why doesn't a “new tab” open when I click on the “new tab” button? | https://github.com/zen-browser/desktop/issues/5188 | 0:16:26 | 9:15:23 |
| Bookmark Library display incorrectly | https://github.com/zen-browser/desktop/issues/5187 | None | None |
| Extension pin randomly disappeared | https://github.com/zen-browser/desktop/issues/5186 | 8 days, 23:07:53 | None |
| Zen freezes up when trying to open download history window | https://github.com/zen-browser/desktop/issues/5185 | 2:20:31 | 4:43:12 |
| New tab replacement doesn't work in fullscreen pages | https://github.com/zen-browser/desktop/issues/5182 | 21:49:46 | 12:44:32 |
| The title bar and the sidebar do not lose focus after using the URL bar, including when the sidebar is in compact mode. | https://github.com/zen-browser/desktop/issues/5181 | None | None |
| pixelated appearance of text over multiple websites like google docs and exchalidraw | https://github.com/zen-browser/desktop/issues/5179 | 1:48:59 | None |
| Long loading time when using integrated graphics | https://github.com/zen-browser/desktop/issues/5178 | 5:20:54 | None |
| Search in Zen Mods search bar will reapply on new page after being backspaced | https://github.com/zen-browser/desktop/issues/5177 | 5:35:34 | None |
| Opening a new tab in a pinned tab without a URL (e.g. a tabliss new tab) instead overwrites the pinned tab | https://github.com/zen-browser/desktop/issues/5175 | None | None |
| Opening new tab with middle click exposes contents of clipboard. | https://github.com/zen-browser/desktop/issues/5174 | 0:02:24 | 15:38:51 |
| ctrl + numberkey error | https://github.com/zen-browser/desktop/issues/5173 | None | None |
| Closing and reopening pinned tab internally pins a new tab instead | https://github.com/zen-browser/desktop/issues/5172 | None | None |
| Sibebar splitter on the wrong side. | https://github.com/zen-browser/desktop/issues/5170 | 17 days, 2:13:29 | None |
| Zen crashes when trying to share a zen window on google meeet | https://github.com/zen-browser/desktop/issues/5169 | None | None |
| 1Password unlock requires password, unable to log in with touch id | https://github.com/zen-browser/desktop/issues/5168 | 0:03:44 | 0:03:44 |
| Cmd + Number tab cycling inconsistent | https://github.com/zen-browser/desktop/issues/5167 | 0:01:49 | None |
| Ctrl+W won't close window when its the last tab (expected?) | https://github.com/zen-browser/desktop/issues/5166 | 0:26:12 | 5:59:33 |
| Weird url bar behavior | https://github.com/zen-browser/desktop/issues/5165 | 3:43:40 | 22:04:01 |
| Tab Group UI Bug | https://github.com/zen-browser/desktop/issues/5162 | 0:35:13 | 0:35:13 |
| The restore tab button beside the pinned tabs is gone and only the unload button shows. | https://github.com/zen-browser/desktop/issues/5161 | None | 2:16:35 |
| Change tab(s) to workspace button has no effect on essential tab | https://github.com/zen-browser/desktop/issues/5160 | 2:51:27 | 8:22:14 |
| Horizontal overflow on the new-onboarding page | https://github.com/zen-browser/desktop/issues/5157 | 12 days, 8:03:52 | 12 days, 8:03:52 |
| [Macos] Unable to close floating urlbar | https://github.com/zen-browser/desktop/issues/5155 | None | None |
| 'zen.theme.essentials-favicon-bg = true' looks inconsistent | https://github.com/zen-browser/desktop/issues/5154 | 7:56:26 | None |
| Cannot scroll | https://github.com/zen-browser/desktop/issues/5153 | None | 2 days, 15:13:47 |
| Middle-clicking the empty tab bar area opens a new tab with the previous tab container | https://github.com/zen-browser/desktop/issues/5151 | None | None |
| New "New Tab" behaviour makes no sense with "Only Show on New Tab" Bookmark Toolbar option | https://github.com/zen-browser/desktop/issues/5150 | 12 days, 11:53:00 | None |
| Can't open a new tab | https://github.com/zen-browser/desktop/issues/5149 | 0:04:37 | 0:05:55 |
| IA Chat dont appear / no icon | https://github.com/zen-browser/desktop/issues/5148 | 10:50:36 | None |
| When clicking the URL bar in compact mode, it starts closing for a brief period before resetting, (1.7.6 b) | https://github.com/zen-browser/desktop/issues/5147 | None | 5 days, 9:26:08 |
| URL Bar off center when bar is hidden in compact mode | https://github.com/zen-browser/desktop/issues/5145 | None | None |
| New tab inconsistent behavior when using 'new tab' button. | https://github.com/zen-browser/desktop/issues/5144 | None | None |
| Unpinned tabs appear as pinned | https://github.com/zen-browser/desktop/issues/5143 | 0:31:22 | 0:48:26 |
| after last update, new tabs open on the top/first and closing tabs jump to the top/first as well | https://github.com/zen-browser/desktop/issues/5140 | 0:03:44 | 0:03:44 |
| Trying to open a new tab opens in same tab if you press alt+enter | https://github.com/zen-browser/desktop/issues/5139 | None | None |
| Cannot open new tab after the latest update | https://github.com/zen-browser/desktop/issues/5138 | 0:12:08 | 0:15:32 |
| Glitchy text on some websites | https://github.com/zen-browser/desktop/issues/5137 | 17:42:54 | 2 days, 12:36:55 |
| [Unload] Unloading a playing YT Music tab breaks it | https://github.com/zen-browser/desktop/issues/5136 | None | None |
| The native installation script for linux still uses .bz2 instead of .xz | https://github.com/zen-browser/desktop/issues/5134 | 20:18:41 | None |
| [Linux] Tab tear-off not working while "Tabs on the right" is checked | https://github.com/zen-browser/desktop/issues/5132 | 1:24:50 | None |
| Middle Click on Empty Space Immediately Searches in Default Search Engine the Clipboard Text | https://github.com/zen-browser/desktop/issues/5129 | 1:40:56 | None |
| Button to expand sidebar doesn't show | https://github.com/zen-browser/desktop/issues/5128 | 7:02:36 | None |
| Profile Changin Button Doesn't Exist | https://github.com/zen-browser/desktop/issues/5127 | None | None |
| Zen Freezes on Second Overflow Menu Click | https://github.com/zen-browser/desktop/issues/5126 | 0:47:34 | None |
| new tab url bar is invible after youtube fullscreen invisible | https://github.com/zen-browser/desktop/issues/5125 | None | 1 day, 0:17:22 |
| Pinned and Essential tabs disappearing upon re-opening Zen Browser | https://github.com/zen-browser/desktop/issues/5124 | 2 days, 16:28:39 | None |
| SearchBar Offset Wrong | https://github.com/zen-browser/desktop/issues/5121 | 4 days, 4:34:42 | None |
| Twilight build - 1.7.7t (2025-02-08 at 09:10:14) - MacOS (The application “Zen Twilight.app” cant be opened.) | https://github.com/zen-browser/desktop/issues/5120 | 0:31:32 | 6:40:22 |
| Punycode instead of special characters shown in urlbar by default | https://github.com/zen-browser/desktop/issues/5119 | None | None |
| Show History UI broken on collapsed sidebar | https://github.com/zen-browser/desktop/issues/5118 | 0:27:55 | 0:27:55 |
| Website Display Displacement with Glance in New Tab | https://github.com/zen-browser/desktop/issues/5117 | 18:35:15 | 9 days, 6:00:38 |
| [Win11] Compact sidebar stutters on open | https://github.com/zen-browser/desktop/issues/5116 | 0:04:00 | None |
| Delay when opening sidebar in compact mode | https://github.com/zen-browser/desktop/issues/5115 | None | None |
| Reset pinned tab button is not working | https://github.com/zen-browser/desktop/issues/5114 | 11:27:50 | 17 days, 21:34:41 |
| In 1.7.6b middle clicking to make new tab isn't working correctly | https://github.com/zen-browser/desktop/issues/5113 | 1:34:51 | 1:34:51 |
| can't open new tabs | https://github.com/zen-browser/desktop/issues/5109 | 0:03:13 | 1:55:09 |
| tab groups are messed up after 1.7.5b | https://github.com/zen-browser/desktop/issues/5108 | 1:59:44 | 1:59:44 |
| (Linux) The app icon is too big | https://github.com/zen-browser/desktop/issues/5106 | 1:59:48 | None |
| Edit url opens lateral bar when pressing esc | https://github.com/zen-browser/desktop/issues/5105 | None | None |
| Cant create a new tab when full screen video is playing | https://github.com/zen-browser/desktop/issues/5104 | 1:34:16 | 1:36:53 |
| Opening a new tab from button or keyboard shortcut doesn't work | https://github.com/zen-browser/desktop/issues/5102 | None | 0:04:35 |
| Digitalocean console is unusable on Zen | https://github.com/zen-browser/desktop/issues/5100 | 5:28:55 | None |
| Websites don't detect system dark theme | https://github.com/zen-browser/desktop/issues/5099 | None | None |
| extension pin in wrong place | https://github.com/zen-browser/desktop/issues/5098 | 5:41:59 | None |
| I can't open new tab by clicking on + or hotkey Ctrl + T | https://github.com/zen-browser/desktop/issues/5097 | 0:01:58 | 0:21:17 |
| Sroll button to create new tab doesnt work with new update Version 1.7.5b | https://github.com/zen-browser/desktop/issues/5096 | 0:23:06 | 1:33:40 |
| I can't disable the 'New url bar' | https://github.com/zen-browser/desktop/issues/5095 | 0:12:40 | 1:38:32 |
| Keyboard shortcut unresponsive (ctrl+alt+s) | https://github.com/zen-browser/desktop/issues/5094 | 0:43:33 | None |
| "Open link in New Tab" does not follow the "Move the new tab button to the top" Setting | https://github.com/zen-browser/desktop/issues/5091 | 13:26:32 | None |
| cant open new tabs after latest update | https://github.com/zen-browser/desktop/issues/5090 | 0:19:49 | 4:34:11 |
| Zen compact mode top toolbar sometimes does not automatically hide | https://github.com/zen-browser/desktop/issues/5089 | None | None |
| Glance | https://github.com/zen-browser/desktop/issues/5088 | 0:15:53 | 0:24:45 |
| Cannot create new tabs | https://github.com/zen-browser/desktop/issues/5084 | 0:11:21 | 1:25:27 |
| Floating Adressbar looses text highlight from default Adressbar | https://github.com/zen-browser/desktop/issues/5083 | 2:34:58 | None |
| Tabs dont appear correctly when using the new (new tab) behaviour. | https://github.com/zen-browser/desktop/issues/5082 | 0:35:41 | 2 days, 2:00:33 |
| Failed to create a new tab using the crtl+t shortcut | https://github.com/zen-browser/desktop/issues/5081 | 0:35:19 | 0:58:53 |
| unloaded pinned tabs appearing in tab switcher | https://github.com/zen-browser/desktop/issues/5080 | 7 days, 16:43:06 | 8 days, 17:22:09 |
| TradingView Chart Not Loading on Bitget Exchange (Spot and Futures) | https://github.com/zen-browser/desktop/issues/5078 | None | None |
| Sidebar is on the right side with no way of changing it | https://github.com/zen-browser/desktop/issues/5077 | 1 day, 9:18:55 | None |
| Fix logo | https://github.com/zen-browser/desktop/issues/5076 | 5:03:41 | 5:03:41 |
| Some pinned tabs have tiny width and show up in the wrong section. | https://github.com/zen-browser/desktop/issues/5075 | None | 16 days, 3:53:30 |
| New tab does not open default start page or extension start page anymore | https://github.com/zen-browser/desktop/issues/5074 | 0:14:20 | 9:25:19 |
| CRITICAL cannot switch workspaces, sidebar goes blank with no tabs | https://github.com/zen-browser/desktop/issues/5073 | 0:59:17 | 13:10:28 |
| Issues with pinned tab, essential, and unpinned tab zones | https://github.com/zen-browser/desktop/issues/5072 | None | 16 days, 4:03:47 |
| New Tab Open floating URL bar doesnt open an actual tab until the new url is confirmed | https://github.com/zen-browser/desktop/issues/5071 | 0:00:36 | 0:05:38 |
| Entering full screen mode would scrolling tabs to the top. | https://github.com/zen-browser/desktop/issues/5069 | None | 4:36:26 |
| New Tab Button (and middle click on tab bar) does not work after opening customize toolbar | https://github.com/zen-browser/desktop/issues/5067 | 0:19:59 | 14:20:45 |
| Expand Sidebar and Side Panel icons are practically identical. | https://github.com/zen-browser/desktop/issues/5066 | 4:54:42 | None |
| Zen displays incorrect background color on some websites, making text unreadable | https://github.com/zen-browser/desktop/issues/5064 | 5:28:34 | None |
| Default keyboard shortcut for close window conflicts with "toggle DOM" | https://github.com/zen-browser/desktop/issues/5063 | None | None |
| Tab bar still scolls to the Top... | https://github.com/zen-browser/desktop/issues/5062 | 0:12:11 | 0:47:47 |
| When current tab is pinned, created new tabs will be added to pinned too | https://github.com/zen-browser/desktop/issues/5061 | 0:31:44 | 1 day, 11:35:52 |
| Opening a new tab does not focus/scroll the tab list on the new tab | https://github.com/zen-browser/desktop/issues/5059 | 1:02:26 | 1:02:26 |
| Maximizing or un-maximizing a window will scroll tab list to the top | https://github.com/zen-browser/desktop/issues/5058 | 13:02:07 | 1 day, 0:10:24 |
| Middle click on empty space doesnt create a new tab | https://github.com/zen-browser/desktop/issues/5057 | 0:09:08 | 0:47:57 |
| UI problems with 1.7.5b | https://github.com/zen-browser/desktop/issues/5056 | 7 days, 2:58:45 | None |
| Can't open a new tab after the update, the new tab button and Ctrl+T only opens the URL bar. | https://github.com/zen-browser/desktop/issues/5055 | 0:07:04 | 1:23:34 |
| "Look and feel" section of keyboard shortcuts missing in Settings | https://github.com/zen-browser/desktop/issues/5054 | None | None |
| F11 default shortcut not suitable for MacOS | https://github.com/zen-browser/desktop/issues/5052 | None | None |
| Duplicate keyboard shortcut items in Settings | https://github.com/zen-browser/desktop/issues/5051 | None | None |
| In compacy mode, on applying a blur intensity from about:config the backdrop doesn't looks correct | https://github.com/zen-browser/desktop/issues/5050 | 2:30:51 | None |
| Icons in context menus don't use --panel-color anymore while text still does | https://github.com/zen-browser/desktop/issues/5049 | None | None |
| Not respecting `prefers-reduced-motion` | https://github.com/zen-browser/desktop/issues/5048 | None | None |
| Middle mouse button problem | https://github.com/zen-browser/desktop/issues/5046 | 0:02:32 | 1:47:05 |
| New tab no longer works | https://github.com/zen-browser/desktop/issues/5045 | 0:23:49 | 1:32:24 |
| New tab opens after browser restart when no unpinned tabs exist, even if zen.urlbar.replace-newtab is true | https://github.com/zen-browser/desktop/issues/5044 | 2:25:05 | 2:25:05 |
| Enabling HDR Causes Visual Artifact on Right Edge of UI Elements | https://github.com/zen-browser/desktop/issues/5042 | 0:24:00 | None |
| Pinned tabs break on browser restart | https://github.com/zen-browser/desktop/issues/5041 | 0:08:52 | 16:50:35 |
| New URL bar thing is so bad IMO + at least give an option to enable or not beforehand! | https://github.com/zen-browser/desktop/issues/5040 | 0:02:06 | 2:45:03 |
| Caret/cursor displays on text of all webpages | https://github.com/zen-browser/desktop/issues/5039 | 0:23:14 | 2:45:29 |
| Browser Navigation Controls Alignment Issue | https://github.com/zen-browser/desktop/issues/5038 | None | None |
| problem with the app's window | https://github.com/zen-browser/desktop/issues/5037 | None | None |
| New url bar not appearing immediatly if shortcuts are turned off | https://github.com/zen-browser/desktop/issues/5036 | 1:19:57 | 5 days, 5:14:08 |
| History broken in sidebar using collapsed toolbar | https://github.com/zen-browser/desktop/issues/5035 | 1:30:43 | None |
| Missing setting to enable tab previews | https://github.com/zen-browser/desktop/issues/5034 | 0:08:00 | 1 day, 13:46:06 |
| Displaced website Zen Glance in new tab | https://github.com/zen-browser/desktop/issues/5033 | 0:14:26 | None |
| Middle click to open new tab is broken | https://github.com/zen-browser/desktop/issues/5032 | 0:55:24 | 4:01:55 |
| Compact mode malfunction | https://github.com/zen-browser/desktop/issues/5031 | 0:01:18 | 1:14:43 |
| Open new tab not working | https://github.com/zen-browser/desktop/issues/5030 | 0:08:48 | 0:08:48 |
| In compact mode, window control button overlaps the search box. | https://github.com/zen-browser/desktop/issues/5029 | None | None |
| Wiered text Rendering in signoz app (self Hosted) | https://github.com/zen-browser/desktop/issues/5028 | None | None |
| Add application Pop-UP covers extensions | https://github.com/zen-browser/desktop/issues/5025 | None | None |
| Passkey in mac | https://github.com/zen-browser/desktop/issues/5024 | 4:35:05 | 5:06:21 |
| Extension menu blank. | https://github.com/zen-browser/desktop/issues/5023 | 1:16:26 | None |
| Essentials tabs are automatically unloaded on browser restart | https://github.com/zen-browser/desktop/issues/5022 | 20 days, 22:33:51 | None |
| Unexpected behaviour with unloaded tabs. | https://github.com/zen-browser/desktop/issues/5021 | None | None |
| Switching to an essential Tab in another workspace makes it appear in current workspace instead | https://github.com/zen-browser/desktop/issues/5020 | 7:45:35 | None |
| Pinned tabs not staying on top | https://github.com/zen-browser/desktop/issues/5015 | 1 day, 18:26:06 | 1 day, 19:42:53 |
| SEC_ERROR_BAD_SIGNATURE only in Zen | https://github.com/zen-browser/desktop/issues/5013 | 14 days, 16:09:47 | None |
| crash upon clicking on a certain anchor tag | https://github.com/zen-browser/desktop/issues/5012 | 1 day, 15:57:50 | None |
| When Essential Tab is Open, Switch Workspaces loses focus Using Separate workspace essential tabs | https://github.com/zen-browser/desktop/issues/5011 | 6:55:45 | 23:07:36 |
| Windows corrupting config on slow PCs | https://github.com/zen-browser/desktop/issues/5010 | None | None |
| Addons icons out of place after signing in | https://github.com/zen-browser/desktop/issues/5008 | None | None |
| Window is sometimes offset on hyprland | https://github.com/zen-browser/desktop/issues/5007 | None | None |
| Browser performance is subpar | https://github.com/zen-browser/desktop/issues/5006 | None | None |
| Tab opening in wrong container if coming from Glance | https://github.com/zen-browser/desktop/issues/5004 | None | None |
| Sidebar compact mode glitch when moving mouse | https://github.com/zen-browser/desktop/issues/5003 | None | 3 days, 22:36:55 |
| Icons not loaded when I open the browser again | https://github.com/zen-browser/desktop/issues/5001 | None | None |
| Hidden Toolbars overlap in the corner when both are visible | https://github.com/zen-browser/desktop/issues/5000 | None | None |
| Glance triggering | https://github.com/zen-browser/desktop/issues/4999 | 7:34:51 | 13 days, 22:44:21 |
| 1.7.5b release missing? | https://github.com/zen-browser/desktop/issues/4996 | 2:17:49 | 1 day, 5:25:04 |
| Multiwindow breaks essentials section | https://github.com/zen-browser/desktop/issues/4995 | None | None |
| Using system theme, the sidebar foreground colour remains white, unreadable | https://github.com/zen-browser/desktop/issues/4994 | 1 day, 5:16:31 | None |
| Can't watch content on Netflix | https://github.com/zen-browser/desktop/issues/4992 | 0:02:08 | 0:02:08 |
| Group Tabs | https://github.com/zen-browser/desktop/issues/4990 | 1:41:08 | 1:41:08 |
| Click and drag tabs opens them | https://github.com/zen-browser/desktop/issues/4989 | 5:43:49 | 20 days, 23:20:40 |
| Add Delay to any popup menus | https://github.com/zen-browser/desktop/issues/4988 | None | 18 days, 21:27:36 |
| Mobile user agent on sidebar is not enough for websites like Twitter (X) | https://github.com/zen-browser/desktop/issues/4984 | None | None |
| Cannot manage containers with multi account containers extension | https://github.com/zen-browser/desktop/issues/4983 | None | None |
| stuck on strange buggy splash window, persists through reinstalls | https://github.com/zen-browser/desktop/issues/4982 | None | None |
| How to disable expand sidebar on hover in compact mode. | https://github.com/zen-browser/desktop/issues/4980 | 2:42:56 | None |
| Menu Bar Items Displayed in Reverse Order | https://github.com/zen-browser/desktop/issues/4978 | None | None |
| Microsoft Outlook 365 New Draft Page Reload Loop | https://github.com/zen-browser/desktop/issues/4977 | 5 days, 13:20:41 | None |
| `gfx.blacklist.dmabuf ` being set to `4` causes screencasting not to work on some DEs/WMs | https://github.com/zen-browser/desktop/issues/4974 | None | None |
| Private windows don't close when last tab is closed | https://github.com/zen-browser/desktop/issues/4973 | 15:38:02 | 6 days, 13:30:01 |
| New tabs on the top of the sidebar | https://github.com/zen-browser/desktop/issues/4972 | 0:05:24 | 0:05:24 |
| Floating sidebar is not kept open when cursor at the left-most position | https://github.com/zen-browser/desktop/issues/4971 | 7:39:18 | None |
| Transparent background on url bar | https://github.com/zen-browser/desktop/issues/4970 | 10:05:02 | 8 days, 7:00:40 |
| Minor Bug with Copy url tooltip | https://github.com/zen-browser/desktop/issues/4967 | 14:22:23 | None |
| The animation when switching tabs with glance is bugged | https://github.com/zen-browser/desktop/issues/4966 | None | None |
| DOH: Zen loose connectivity when network changes | https://github.com/zen-browser/desktop/issues/4965 | None | None |
| Can't open a new tab | https://github.com/zen-browser/desktop/issues/4963 | None | 0:04:31 |
| Closing all non-pinned/essential tabs opens the last pinned tab instead of the most recently used one sometimes loading unloaded tabs. | https://github.com/zen-browser/desktop/issues/4962 | 3 days, 4:34:11 | 6 days, 20:31:22 |
| macOS dmg background bug | https://github.com/zen-browser/desktop/issues/4961 | None | None |
| Issues related to Firefox's Sidebar (Had to click twice to move sidebar positions, wrong margin/padding amount, and shortcut visual issues) | https://github.com/zen-browser/desktop/issues/4960 | None | None |
| Sessions and Accounts are Deleted Upon Closing Zen Browser | https://github.com/zen-browser/desktop/issues/4956 | None | 2:32:39 |
| Pinned tabs are not restored to their pinned URL on close | https://github.com/zen-browser/desktop/issues/4955 | 4:44:29 | 4 days, 14:56:19 |
| Glance does not open automaticallly on pinned tabs | https://github.com/zen-browser/desktop/issues/4954 | 6:25:27 | 6:25:27 |
| Unable to set key combination CMD+`. Also unrecognized when used with Ctrl. | https://github.com/zen-browser/desktop/issues/4953 | 9:59:20 | None |
| No way to minimize PiP | https://github.com/zen-browser/desktop/issues/4952 | 23:22:55 | None |
| Google Classroom loading bar appearing | https://github.com/zen-browser/desktop/issues/4949 | None | 22 days, 5:57:45 |
| inconsistent browser color elements | https://github.com/zen-browser/desktop/issues/4948 | None | None |
| Video call tab follows between workspaces | https://github.com/zen-browser/desktop/issues/4945 | None | None |
| Settings boxes use the Firefox background color | https://github.com/zen-browser/desktop/issues/4943 | None | None |
| Creating new workspace icon issue. | https://github.com/zen-browser/desktop/issues/4942 | None | 0:21:58 |
| Delay in Switching Between Workspaces | https://github.com/zen-browser/desktop/issues/4939 | None | None |
| workspace button position | https://github.com/zen-browser/desktop/issues/4938 | None | None |
| Middle Click (open in new tab) opens in container while right click->in new tab does not. | https://github.com/zen-browser/desktop/issues/4937 | None | None |
| "A copy of Zen is already open. Only one copy of Zen can be open at a time." on MacOS Sequoia 15.3, Zen Browser 1.7.4b | https://github.com/zen-browser/desktop/issues/4936 | None | 5:04:40 |
| weird tab bar scrolling behavior when closing other tabs | https://github.com/zen-browser/desktop/issues/4935 | 2:02:03 | 3 days, 10:11:56 |
| Twilight not updating | https://github.com/zen-browser/desktop/issues/4933 | 1:22:14 | 1:22:14 |
| Print Menu/Screen does not Adjust to Split Tabs | https://github.com/zen-browser/desktop/issues/4932 | None | None |
| Priinting preview loads indefinitely | https://github.com/zen-browser/desktop/issues/4931 | None | 0:01:48 |
| Browser Tabs are leaking through | https://github.com/zen-browser/desktop/issues/4930 | 3 days, 2:53:03 | None |
| YouTube video freezes when I alt tab into CS2 (or any game) | https://github.com/zen-browser/desktop/issues/4929 | None | None |
| Mods do not apply to window decorations | https://github.com/zen-browser/desktop/issues/4927 | None | None |
| Workspace tabs are not visible after jupyter opens | https://github.com/zen-browser/desktop/issues/4925 | None | None |
| Zen is completely broken for me. | https://github.com/zen-browser/desktop/issues/4922 | 1:47:44 | None |
| Cannot edit existing custom search engines or add icons for them | https://github.com/zen-browser/desktop/issues/4921 | 1:50:19 | None |
| Extension support | https://github.com/zen-browser/desktop/issues/4920 | 2:28:52 | 2:28:52 |
| Cannot enable bookmarks toolbar in Single Toolbar Mode on macOS | https://github.com/zen-browser/desktop/issues/4919 | None | None |
| Can't customize the cell with my workspaces | https://github.com/zen-browser/desktop/issues/4918 | 3:50:48 | 3:50:48 |
| Menu Bar is missing in linux | https://github.com/zen-browser/desktop/issues/4916 | None | 6:17:43 |
| Muted tabs icon not showing | https://github.com/zen-browser/desktop/issues/4915 | 3 days, 20:24:40 | 3 days, 20:30:56 |
| Making PiP smaller hides things like the video slider to disappear | https://github.com/zen-browser/desktop/issues/4914 | 0:48:19 | 7:07:17 |
| Change workspace, browser broke and only shows zen logo | https://github.com/zen-browser/desktop/issues/4913 | 0:59:41 | None |
| Mouse over floating sidebar prevents hide | https://github.com/zen-browser/desktop/issues/4911 | None | None |
| Crash when opening some sites (for example, fastapi docs) | https://github.com/zen-browser/desktop/issues/4910 | None | None |
| New window opens wrong (non-default) workspace | https://github.com/zen-browser/desktop/issues/4908 | None | None |
| Help and Feedback links in About window lead to Mozilla Firefox | https://github.com/zen-browser/desktop/issues/4907 | None | None |
| Double klicking on sidebar does not open new tab | https://github.com/zen-browser/desktop/issues/4905 | 1:56:14 | 12:29:01 |
| PDF Fonts | https://github.com/zen-browser/desktop/issues/4904 | None | 12:43:22 |
| I can't customize which toolbars hide in compact mode | https://github.com/zen-browser/desktop/issues/4903 | 1:21:22 | 13:59:27 |
| When changing the behavior of the opening tab at the top, when opening several bookmarks, they open in reverse. | https://github.com/zen-browser/desktop/issues/4902 | 4 days, 2:21:01 | None |
| flatpak 2 versions of zen preventing config from being synced | https://github.com/zen-browser/desktop/issues/4901 | None | None |
| Closing tab will scroll to the top if you use Ctrl + W [Twilight] | https://github.com/zen-browser/desktop/issues/4900 | 2:54:44 | 2 days, 11:04:13 |
| Closing the single opened tab opens the last pinned tab | https://github.com/zen-browser/desktop/issues/4899 | 8 days, 16:27:00 | 8 days, 16:27:00 |
| SSL error "SEC_ERROR_UNKNOWN_ISSUER" | https://github.com/zen-browser/desktop/issues/4898 | 16:53:00 | None |
| Broken Behavior of Pinned/Essential Tabs when Multiple Windows | https://github.com/zen-browser/desktop/issues/4895 | 11:30:03 | None |
| Can't see the logo of zen in task switcher in fedora 40 | https://github.com/zen-browser/desktop/issues/4894 | None | None |
| Extension icons floating over pages | https://github.com/zen-browser/desktop/issues/4893 | 1 day, 12:19:24 | None |
| Essential tabs not remaining focused with container-specific essentials | https://github.com/zen-browser/desktop/issues/4892 | None | 3 days, 0:03:40 |
| Zen is freezing randomly? | https://github.com/zen-browser/desktop/issues/4891 | 15:59:08 | None |
| Notion related extensions don't recognize login | https://github.com/zen-browser/desktop/issues/4890 | 3:09:23 | 15:40:45 |
| Tabs not closing and randomly appearing and disappearing | https://github.com/zen-browser/desktop/issues/4889 | None | 3 days, 4:11:43 |
| Tab switcher falsely considers mouse position on open | https://github.com/zen-browser/desktop/issues/4888 | 4:53:18 | 9:01:48 |
| Tab scroll bar is cannot be dragged | https://github.com/zen-browser/desktop/issues/4886 | None | None |
| Themes don't work when opening zen browser | https://github.com/zen-browser/desktop/issues/4884 | 0:18:13 | 0:29:18 |
| Essential Tabs Cannot Be Closed & Require Re-Adding | https://github.com/zen-browser/desktop/issues/4883 | 1:39:20 | 7 days, 23:42:34 |
| Critical Bug System Freeze When Uploading Files | https://github.com/zen-browser/desktop/issues/4882 | 9 days, 17:53:15 | None |
| Adding a new Gmail account causes the browser to stop responding | https://github.com/zen-browser/desktop/issues/4880 | None | None |
| Installing or Uninstalling a Zen Mod causes all Zen Mods to break !! | https://github.com/zen-browser/desktop/issues/4879 | 3:16:47 | None |
| Presence of Widevine plugin implies support, causing confusion | https://github.com/zen-browser/desktop/issues/4875 | 1:27:46 | 1:27:45 |
| Compact mode top toolbar with always show bookmarks enabled hides the toolbar when moving mouse across different bookmarks | https://github.com/zen-browser/desktop/issues/4874 | None | None |
| Globe favicon misaligned, and other alignment issues with pinned/unpinned tabs | https://github.com/zen-browser/desktop/issues/4873 | None | 5 days, 1:25:52 |
| Ctrl-Shift-C bound to 2 commands | https://github.com/zen-browser/desktop/issues/4872 | 7:55:15 | None |
| Setting a default container for the tab does not switch the workspace | https://github.com/zen-browser/desktop/issues/4870 | 3 days, 22:51:37 | 4 days, 15:04:11 |
| Issue with new tab button | https://github.com/zen-browser/desktop/issues/4869 | 1:48:12 | 3 days, 12:58:02 |
| Tab with glance open cannot be correctly rearranged in pinned tabs or essential tabs and leads to major issues | https://github.com/zen-browser/desktop/issues/4868 | 8 days, 18:37:48 | 19 days, 21:47:16 |
| Keyboard shortcut for duplicating the current tab | https://github.com/zen-browser/desktop/issues/4867 | 0:47:32 | 7 days, 20:56:12 |
| Double Clicking to open new tab is incostistance | https://github.com/zen-browser/desktop/issues/4865 | 1 day, 9:22:37 | None |
| zen.theme.border-radius dosen't work | https://github.com/zen-browser/desktop/issues/4864 | 6 days, 1:59:16 | None |
| Hitting ESC in the floating URL bar, does not return focus back to the page, but focuses the URL bar in the sidebar | https://github.com/zen-browser/desktop/issues/4861 | 5 days, 10:25:26 | None |
| German dictonary added but not available | https://github.com/zen-browser/desktop/issues/4860 | None | None |
| Sidebar automatically pops up when PopClip is called up by the macOS | https://github.com/zen-browser/desktop/issues/4859 | None | None |
| Search shortcut for using the GitHub search engine doesn't show up in the address bar | https://github.com/zen-browser/desktop/issues/4858 | 0:05:11 | 21:55:59 |
| Confirm before closing multiple tabs setting not working | https://github.com/zen-browser/desktop/issues/4857 | 21:43:21 | None |
| Automatically open all the bookmarks when startup | https://github.com/zen-browser/desktop/issues/4856 | 7 days, 8:56:58 | 7 days, 8:56:58 |
| Toolbar sizing in compact mode | https://github.com/zen-browser/desktop/issues/4855 | 0:15:21 | None |
| Font not rendering correctly on macos | https://github.com/zen-browser/desktop/issues/4854 | None | None |
| Glance UI just looks rough... [Twilight] | https://github.com/zen-browser/desktop/issues/4853 | 5:14:03 | 12:37:01 |
| Flickering when closing Glance | https://github.com/zen-browser/desktop/issues/4850 | None | None |
| tab settings change when zen browser updates | https://github.com/zen-browser/desktop/issues/4849 | 1:04:05 | 16:30:14 |
| Hardware Acceleration Causing System Crashing | https://github.com/zen-browser/desktop/issues/4848 | None | None |
| Toggle Floating Toolbar shortcut does not work after entering fullscreen mode on MacOS | https://github.com/zen-browser/desktop/issues/4847 | None | None |
| MacOS chugging after latest update | https://github.com/zen-browser/desktop/issues/4846 | None | None |
| Bitwarden extension dialogue disappears | https://github.com/zen-browser/desktop/issues/4845 | None | None |
| `+ New Tab` Moved to the Top of the List | https://github.com/zen-browser/desktop/issues/4844 | 2:29:29 | 7:50:27 |
| userChrome.css does not load | https://github.com/zen-browser/desktop/issues/4843 | None | 0:17:38 |
| Re: Moving the sidebar to the right brings back the Top Bar | https://github.com/zen-browser/desktop/issues/4841 | None | None |
| Closing a tab causes the tab bar to scroll to the top automatically. | https://github.com/zen-browser/desktop/issues/4840 | 2:18:32 | 6 days, 23:53:13 |
| Pinned extension icons move inside a web page sometimes | https://github.com/zen-browser/desktop/issues/4839 | None | None |
| Unable to Import Bookmarks from Brave Browser (Installed via Flathub) | https://github.com/zen-browser/desktop/issues/4838 | None | None |
| Extension icon on top of settings icon when you split the windows | https://github.com/zen-browser/desktop/issues/4836 | None | None |
| Crunchyroll video not loading | https://github.com/zen-browser/desktop/issues/4835 | 5:44:42 | 5:52:00 |
| The whole screen goes black and inaccessible after adding a profile | https://github.com/zen-browser/desktop/issues/4832 | None | None |
| theme colors interfere | https://github.com/zen-browser/desktop/issues/4831 | None | None |
| Moving `Bookmark toolbar items` to sidebar && Closing and reopening `Customize toolbar…` expands bookmarks in `Customize toolbar…` | https://github.com/zen-browser/desktop/issues/4830 | None | None |
| Automatic Glance animates opening incorrectly | https://github.com/zen-browser/desktop/issues/4829 | None | None |
| Essentials are scrolling isntead of displaying all | https://github.com/zen-browser/desktop/issues/4828 | None | 6 days, 18:47:18 |
| Updating from 1.7.2b to 1.7.4b made side web panels unusable | https://github.com/zen-browser/desktop/issues/4827 | None | None |
| Zen Browser Skipping Redirects | https://github.com/zen-browser/desktop/issues/4826 | None | None |
| Add addon window postitioning problem | https://github.com/zen-browser/desktop/issues/4825 | None | None |
| Sidebar not fully collapsing in compact mode | https://github.com/zen-browser/desktop/issues/4824 | 0:13:32 | 0:43:34 |
| Scrolling feel is not smooth | https://github.com/zen-browser/desktop/issues/4823 | 16 days, 23:04:06 | 17 days, 0:15:30 |
| Closing a tab scrolls to the top of the sidebar | https://github.com/zen-browser/desktop/issues/4822 | None | 0:03:28 |
| Unexpected vertical tab bar visibility occurs when switching, creating new tabs or using the URL prompt shortcut | https://github.com/zen-browser/desktop/issues/4820 | 1:46:31 | None |
| 1Password Classic (v4-v6) Extension doesn't work | https://github.com/zen-browser/desktop/issues/4819 | 3 days, 5:27:45 | 3:00:31 |
| Workspace Pins Dispear'ed due to new windows. ?? | https://github.com/zen-browser/desktop/issues/4817 | None | None |
| Restore previous session is broken | https://github.com/zen-browser/desktop/issues/4815 | 1 day, 2:31:07 | None |
| Keyboard navigation is tricky on the initial Welcome screens | https://github.com/zen-browser/desktop/issues/4813 | 21:38:17 | None |
| Setting a website to a container does not switch to that workspace | https://github.com/zen-browser/desktop/issues/4812 | None | None |
| JWPlayer doesn't play some audio tracks | https://github.com/zen-browser/desktop/issues/4809 | None | None |
| Google Drive Text Corruption | https://github.com/zen-browser/desktop/issues/4808 | 0:02:00 | 3 days, 1:28:57 |
| Context menu is clipping through window border | https://github.com/zen-browser/desktop/issues/4807 | None | None |
| Problem with PDF encoding - Cyrillic alphabet | https://github.com/zen-browser/desktop/issues/4806 | 0:53:07 | None |
| Closing tab scrolls to the top of the tabs' list | https://github.com/zen-browser/desktop/issues/4804 | 13:04:51 | 15:41:20 |
| Can't drag items to other tabs in compact mode | https://github.com/zen-browser/desktop/issues/4803 | 6:51:21 | 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-02-01..2025-02-28`

View File

@@ -1 +1 @@
8d18d852fbaeaa05c6ec3ebd9b35312f2c58021f
6ad0ab3c43a6208d8bcd997b40e802fccd48ba0a

2
l10n

Submodule l10n updated: 92e05a383d...c5a36ae64f

2256
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -13,7 +13,7 @@
"export": "surfer export",
"init": "npm run download && npm run bootstrap && npm run import",
"download": "surfer download",
"bootstrap": "surfer bootstrap && surfer bootstrap",
"bootstrap": "surfer bootstrap",
"package": "surfer package",
"update-ff": "python3 scripts/update_ff.py",
"update-ff:raw": "surfer update",
@@ -41,7 +41,7 @@
},
"homepage": "https://github.com/zen-browser/core#readme",
"dependencies": {
"@zen-browser/surfer": "^1.9.19"
"@zen-browser/surfer": "^1.10.5"
},
"devDependencies": {
"husky": "^9.1.7",

1916
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

10
scripts/update-surfer.sh Normal file
View File

@@ -0,0 +1,10 @@
#!/bin/bash
# make sure we are on root
if [ ! -f "package.json" ]; then
echo "Please run this script from the root of the project"
exit 1
fi
npm update @zen-browser/surfer
npm i @zen-browser/surfer@latest

View File

@@ -60,7 +60,7 @@ def update_readme(last_version, new_version, is_rc=False):
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")
os.system(f"git clone {L10N_REPO} l10n-temp --depth 1")
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")

13
src/Cargo-lock.patch Normal file
View File

@@ -0,0 +1,13 @@
diff --git a/Cargo.lock b/Cargo.lock
index da2fbe8c40fa40a86c350f8adb33e26915fecc7b..e5a571fc41cd4fa8d2cdffdc15f9ad083e6d36fb 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3912,8 +3912,6 @@ dependencies = [
[[package]]
name = "mime_guess"
version = "2.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
dependencies = [
"mime",
"unicase",

14
src/Cargo-toml.patch Normal file
View File

@@ -0,0 +1,14 @@
diff --git a/Cargo.toml b/Cargo.toml
index 19a470608b7de28a946353d4c09a56b4dd3fd69a..37e9687c86b5725ee5d5071b632b5927ffb6bd27 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -201,6 +201,9 @@ rure = { path = "third_party/rust/rure" }
# Patch `plist` to work with `indexmap` 2.*
plist = { path = "third_party/rust/plist" }
+# Patch mime_guess to add missing mime types
+mime_guess = { path = "third_party/rust/mime_guess" }
+
# To-be-published changes.
unicode-bidi = { git = "https://github.com/servo/unicode-bidi", rev = "ca612daf1c08c53abe07327cb3e6ef6e0a760f0c" }
nss-gk-api = { git = "https://github.com/beurdouche/nss-gk-api", rev = "e48a946811ffd64abc78de3ee284957d8d1c0d63" }

View File

@@ -81,7 +81,7 @@ pref('zen.tabs.vertical', true);
pref('zen.tabs.vertical.right-side', false);
pref('zen.tabs.rename-tabs', true);
pref('zen.theme.accent-color', "#ffb787");
pref('zen.theme.content-element-separation', 6); // In pixels
pref('zen.theme.content-element-separation', 8); // In pixels
pref('zen.theme.gradient', true);
pref('zen.theme.gradient.show-custom-colors', false);
pref('zen.theme.essentials-favicon-bg', true);
@@ -118,8 +118,11 @@ pref('zen.view.compact.animate-sidebar', true);
pref('zen.view.compact.show-sidebar-and-toolbar-on-hover', true);
pref('zen.urlbar.replace-newtab', true);
pref('zen.urlbar.show-protections-icon', false);
pref('zen.urlbar.behavior', 'floating-on-type'); // default, floating-on-type, float
pref('zen.urlbar.wait-to-clear', 45000); // in ms (default 45s)
pref('zen.urlbar.show-domain-only-in-sidebar', true);
pref('zen.urlbar.hide-one-offs', true);
#ifdef XP_MACOSX
// Disable for macos in the meantime until @HarryHeres finds a solution for hight DPI screens
@@ -183,8 +186,10 @@ pref('zen.sidebar.data', "{\"data\":\n {\"p1\":{\n \"url\":\"https://www.wikip
pref('zen.sidebar.enabled', true);
pref('zen.sidebar.close-on-blur', true);
pref('zen.sidebar.max-webpanels', 8);
pref('zen.sidebar.use-google-favicons', true);
// Zen Split View
pref('zen.splitView.enable-tab-drop', true);
pref('zen.splitView.min-resize-width', 7);
pref('zen.splitView.change-on-hover', false);
pref('zen.splitView.rearrange-hover-size', 24);
@@ -196,8 +201,6 @@ pref('zen.startup.smooth-scroll-in-tabs', true);
pref('zen.workspaces.disabled_for_testing', false);
pref('zen.workspaces.hide-deactivated-workspaces', false);
pref('zen.workspaces.hide-default-container-indicator', true);
pref('zen.workspaces.individual-pinned-tabs', true);
pref('zen.workspaces.show-icon-strip', true);
pref('zen.workspaces.force-container-workspace', false);
pref('zen.workspaces.open-new-tab-if-last-unpinned-tab-is-closed', false);
pref('zen.workspaces.show-workspace-indicator', true);
@@ -370,6 +373,14 @@ pref('browser.download.autohideButton', false);
// Enable transparent background for macos
#ifdef XP_MACOSX
pref('widget.macos.titlebar-blend-mode.behind-window', true);
// 1. hudWindow
// 2. fullScreenUI
// 3. popover
// 4. menu
// 5. toolTip
// 6. headerView
// 7. underlay
pref('zen.widget.macos.window-material', 3);
#endif
// Urlbar and autocomplete
@@ -428,6 +439,13 @@ pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features", false
pref("browser.preferences.moreFromMozilla", false, locked);
pref("browser.aboutwelcome.enabled", false);
// AI/ML stuff
pref("browser.ml.chat.enabled", false);
pref("browser.ml.chat.shortcuts", false);
pref("browser.ml.chat.shortcuts.custom", false);
pref("browser.ml.chat.sidebar", false);
pref("browser.ml.enable", false);
// ---- Experimental settings to try make zen faster
pref("gfx.canvas.accelerated.cache-items", 32768);
pref("gfx.canvas.accelerated.cache-size", 256);

View File

@@ -125,12 +125,5 @@ export var ZenCustomizableUI = new (class {
registerToolbarNodes(window) {
window.CustomizableUI.registerToolbarNode(window.document.getElementById('zen-sidebar-top-buttons'));
window.CustomizableUI.registerToolbarNode(window.document.getElementById('zen-sidebar-bottom-buttons'));
window.addEventListener(
'DOMContentLoaded',
() => {
this._dispatchResizeEvent(window);
},
{ once: true }
);
}
})();

View File

@@ -41,11 +41,14 @@
} catch (e) {
console.error('ZenThemeModifier: Error initializing browser layout', e);
}
this.closeWatermark();
ZenWorkspaces.promiseInitialized.then(() => {
this.closeWatermark();
});
},
openWatermark() {
if (!Services.prefs.getBoolPref('zen.watermark.enabled', false)) {
document.documentElement.removeAttribute('zen-before-loaded');
return;
}
for (let elem of document.querySelectorAll('#browser > *, #urlbar')) {
@@ -55,6 +58,7 @@
closeWatermark() {
document.documentElement.removeAttribute('zen-before-loaded');
window.dispatchEvent(new window.Event('resize')); // To recalculate the layout
if (Services.prefs.getBoolPref('zen.watermark.enabled', false)) {
gZenUIManager.motion
.animate(

View File

@@ -9,6 +9,7 @@ var gZenUIManager = {
XPCOMUtils.defineLazyPreferenceGetter(this, 'sidebarHeightThrottle', 'zen.view.sidebar-height-throttle', 500);
XPCOMUtils.defineLazyPreferenceGetter(this, 'contentElementSeparation', 'zen.theme.content-element-separation', 0);
XPCOMUtils.defineLazyPreferenceGetter(this, 'urlbarWaitToClear', 'zen.urlbar.wait-to-clear', 0);
XPCOMUtils.defineLazyPreferenceGetter(this, 'urlbarShowDomainOnly', 'zen.urlbar.show-domain-only-in-sidebar', true);
gURLBar._zenTrimURL = this.urlbarTrim.bind(this);
@@ -36,6 +37,8 @@ var gZenUIManager = {
window.addEventListener('TabClose', this.onTabClose.bind(this));
this.tabsWrapper.addEventListener('scroll', this.saveScrollbarState.bind(this));
gZenMediaController.init();
},
updateTabsToolbar() {
@@ -61,6 +64,8 @@ var gZenUIManager = {
}
tabs.style.removeProperty('flex');
tabs.style.maxHeight = height + 'px';
gZenVerticalTabsManager.actualWindowButtons.removeAttribute('zen-has-hover');
gURLBar.updateLayoutBreakout();
},
get tabsWrapper() {
@@ -218,7 +223,7 @@ var gZenUIManager = {
},
urlbarTrim(aURL) {
if (gZenVerticalTabsManager._hasSetSingleToolbar) {
if (gZenVerticalTabsManager._hasSetSingleToolbar && this.urlbarShowDomainOnly) {
let url = BrowserUIUtils.removeSingleTrailingSlashFromURL(aURL);
return url.startsWith('https://') ? url.split('/')[2] : url;
}
@@ -256,6 +261,18 @@ var gZenUIManager = {
this._toastContainer.setAttribute('hidden', 'true');
}
},
get panelUIPosition() {
return gZenVerticalTabsManager._hasSetSingleToolbar ? 'bottomleft topleft' : 'bottomright topright';
},
openSettingsWindow() {
window.openDialog(
'chrome://browser/content/zen-components/windows/zen-settings.xhtml',
'_blank',
'centerscreen,chrome,dialog=no,resizable=no,titlebar'
);
},
};
var gZenVerticalTabsManager = {
@@ -345,33 +362,44 @@ var gZenVerticalTabsManager = {
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');
});
try {
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.12,
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)'],
},
{
duration: 0.12,
easing: 'ease-out',
}
)
.then(() => {
aTab.querySelector('.tab-stack').style.removeProperty('filter');
});
} catch (e) {
console.error(e);
}
},
get actualWindowButtons() {
@@ -483,9 +511,11 @@ var gZenVerticalTabsManager = {
if (isSidebarExpanded) {
this.navigatorToolbox.setAttribute('zen-sidebar-expanded', 'true');
document.documentElement.setAttribute('zen-sidebar-expanded', 'true');
gBrowser.tabContainer.setAttribute('expanded', 'true');
} else {
this.navigatorToolbox.removeAttribute('zen-sidebar-expanded');
document.documentElement.removeAttribute('zen-sidebar-expanded');
gBrowser.tabContainer.removeAttribute('expanded');
}
const appContentNavbarContaienr = document.getElementById('zen-appcontent-navbar-container');
@@ -616,6 +646,12 @@ var gZenVerticalTabsManager = {
}
gZenCompactModeManager.updateCompactModeContext(isSingleToolbar);
document.getElementById('urlbar').removeAttribute('--urlbar-height');
if (!isSingleToolbar) {
document.getElementById('urlbar').style.setProperty('--urlbar-height', '32px');
} else {
gURLBar.updateLayoutBreakout();
}
// Always move the splitter next to the sidebar
this.navigatorToolbox.after(document.getElementById('zen-sidebar-splitter'));

View File

@@ -1,8 +1,8 @@
diff --git a/browser/base/content/aboutDialog.xhtml b/browser/base/content/aboutDialog.xhtml
index 1e5c0f1c59175ec4a39938974c4a7a5c6355439f..ac9fe4b792c12a1aecba1fbbc941da9be6a53ce4 100644
index 53e4616a99b7826453d5b6dea027184d90bc73f7..90c9fe5683411cf3087bebd3d0941decf6d23e89 100644
--- a/browser/base/content/aboutDialog.xhtml
+++ b/browser/base/content/aboutDialog.xhtml
@@ -36,6 +36,7 @@
@@ -34,6 +34,7 @@
<html:link rel="localization" href="branding/brand.ftl"/>
<html:link rel="localization" href="browser/aboutDialog.ftl"/>
@@ -10,7 +10,7 @@ index 1e5c0f1c59175ec4a39938974c4a7a5c6355439f..ac9fe4b792c12a1aecba1fbbc941da9b
</linkset>
<html:div id="aboutDialogContainer">
@@ -130,13 +131,15 @@
@@ -124,21 +125,23 @@
</description>
</vbox>
<description class="text-blurb" id="communityDesc" data-l10n-id="community-2">
@@ -27,11 +27,12 @@ index 1e5c0f1c59175ec4a39938974c4a7a5c6355439f..ac9fe4b792c12a1aecba1fbbc941da9b
</vbox>
</vbox>
</hbox>
@@ -144,7 +147,7 @@
<vbox id="bottomBox">
<hbox pack="center">
<label is="text-link" class="bottom-link" useoriginprincipal="true" href="about:license" data-l10n-id="bottomLinks-license"/>
<label is="text-link" class="bottom-link" useoriginprincipal="true" href="about:rights" data-l10n-id="bottomLinks-rights"/>
- <label is="text-link" class="bottom-link" href="https://www.mozilla.org/privacy/?utm_source=firefox-browser&#38;utm_medium=firefox-desktop&#38;utm_campaign=about-dialog" data-l10n-id="bottomLinks-privacy"/>
- <label is="text-link" class="bottom-link" href="https://www.mozilla.org/about/legal/terms/firefox/" data-l10n-id="bottomLinks-rights"/>
- <label is="text-link" class="bottom-link" href="https://www.mozilla.org/privacy/firefox/?utm_source=firefox-browser&#38;utm_medium=firefox-desktop&#38;utm_campaign=about-dialog" data-l10n-id="bottomLinks-privacy"/>
+ <label is="text-link" class="bottom-link" href="about:rights" data-l10n-id="bottomLinks-rights"/>
+ <label is="text-link" class="bottom-link" href="https://www.zen-browser.app/privacy-policy/" data-l10n-id="bottomLinks-privacy"/>
</hbox>
<description id="trademark" data-l10n-id="trademarkInfo"></description>

View File

@@ -1,8 +1,8 @@
diff --git a/browser/base/content/browser-box.inc.xhtml b/browser/base/content/browser-box.inc.xhtml
index 7f71abe7d80e4c09dd088517ec9ef106c7cb8654..7e764f08346a048fd352d7f7c06ea434f9b19903 100644
index 7d7e8697f02f90d4f336c9ab0a73a89848e0c21c..2fd19f3b43db4bdd99e65fecd1481f80d4541a7a 100644
--- a/browser/base/content/browser-box.inc.xhtml
+++ b/browser/base/content/browser-box.inc.xhtml
@@ -22,7 +22,14 @@
@@ -23,7 +23,14 @@
<browser id="sidebar" autoscroll="false" disablehistory="true" disablefullscreen="true" tooltip="aHTMLTooltip"/>
</vbox>
<splitter id="sidebar-splitter" class="chromeclass-extrachrome sidebar-splitter" resizebefore="sibling" resizeafter="none" hidden="true"/>

View File

@@ -1,8 +1,8 @@
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
index 891c067d6ad718061c410c04743bed25744504b5..135c8515bbcb534c3f900e7ba1ee4d3b9fe17436 100644
index 68849f5093cd8ab99ab0747d972799eaf3ad7e22..3b4e6a179ab7b71859f832709778c326a39cffda 100644
--- a/browser/base/content/browser.xhtml
+++ b/browser/base/content/browser.xhtml
@@ -25,6 +25,7 @@
@@ -26,6 +26,7 @@
sizemode="normal"
retargetdocumentfocus="urlbar-input"
scrolling="false"
@@ -10,7 +10,7 @@ index 891c067d6ad718061c410c04743bed25744504b5..135c8515bbcb534c3f900e7ba1ee4d3b
persist="screenX screenY width height sizemode"
data-l10n-sync="true">
<head>
@@ -99,6 +100,8 @@
@@ -100,6 +101,8 @@
<title data-l10n-id="browser-main-window-default-title"></title>
@@ -19,15 +19,15 @@ index 891c067d6ad718061c410c04743bed25744504b5..135c8515bbcb534c3f900e7ba1ee4d3b
# 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
# that they can be shared with macWindow.inc.xhtml.
@@ -143,6 +146,7 @@
window.addEventListener("DOMContentLoaded",
gBrowserInit.onDOMContentLoaded.bind(gBrowserInit), { once: true });
@@ -169,6 +172,7 @@
});
});
</script>
+#include zen-assets.inc.xhtml
</head>
<html:body xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
# All sets except for popupsets (commands, keys, and stringbundles)
@@ -164,9 +168,13 @@
@@ -190,9 +194,13 @@
</vbox>
</html:template>

View File

@@ -1,8 +1,8 @@
diff --git a/browser/base/content/main-popupset.inc.xhtml b/browser/base/content/main-popupset.inc.xhtml
index e5f3424eaeeec0ba552537f167dd99e912216d94..4bdfcdb23fe9c44ad3d4de273c64f4cc31cb4034 100644
index 959c523b21c642f29353b9de37b3ce6b5505b01b..4cd26ea85ad4905bade71dcd470b8678079787bd 100644
--- a/browser/base/content/main-popupset.inc.xhtml
+++ b/browser/base/content/main-popupset.inc.xhtml
@@ -181,6 +181,10 @@
@@ -206,6 +206,10 @@
hidden="true"
tabspecific="true"
aria-labelledby="editBookmarkPanelTitle">
@@ -13,7 +13,7 @@ index e5f3424eaeeec0ba552537f167dd99e912216d94..4bdfcdb23fe9c44ad3d4de273c64f4cc
<box class="panel-header">
<html:h1>
<html:span id="editBookmarkPanelTitle"/>
@@ -206,6 +210,7 @@
@@ -231,6 +235,7 @@
class="footer-button"/>
</html:moz-button-group>
</vbox>
@@ -21,7 +21,21 @@ index e5f3424eaeeec0ba552537f167dd99e912216d94..4bdfcdb23fe9c44ad3d4de273c64f4cc
</panel>
</html:template>
@@ -535,6 +540,8 @@
@@ -426,11 +431,13 @@
observes="cmd_CustomizeToolbars"
class="viewCustomizeToolbar"
data-lazy-l10n-id="toolbar-context-menu-view-customize-toolbar-2"/>
+#if 0
<menuseparator id="sidebarRevampSeparator"/>
<menuitem id="toolbar-context-toggle-vertical-tabs"
data-lazy-l10n-id="toolbar-context-turn-on-vertical-tabs"/>
<menuitem id="toolbar-context-customize-sidebar"
data-lazy-l10n-id="toolbar-context-customize-sidebar"/>
+#endif
<menuseparator contexttype="fullscreen"/>
<menuitem id="toolbar-context-full-screen-autohide"
class="fullscreen-context-autohide"
@@ -565,6 +572,8 @@
#include popup-notifications.inc.xhtml

View File

@@ -17,6 +17,7 @@
<link rel="stylesheet" type="text/css" href="chrome://browser/content/zen-styles/zen-urlbar.css" />
<link rel="stylesheet" type="text/css" href="chrome://browser/content/zen-styles/zen-workspaces.css" />
<link rel="stylesheet" type="text/css" href="chrome://browser/content/zen-styles/zen-decks.css" />
<link rel="stylesheet" type="text/css" href="chrome://browser/content/zen-styles/zen-folders.css" />
<link rel="stylesheet" type="text/css" href="chrome://browser/content/zen-styles/zen-glance.css" />
<link rel="stylesheet" type="text/css" href="chrome://browser/content/zen-styles/zen-sidebar-panels.css" />
<link rel="stylesheet" type="text/css" href="chrome://browser/content/zen-styles/zen-popup.css" />
@@ -25,9 +26,11 @@
<link rel="stylesheet" type="text/css" href="chrome://browser/skin/zen-icons/icons.css" />
<link rel="stylesheet" type="text/css" href="chrome://browser/content/zen-styles/zen-branding.css" />
<link rel="stylesheet" type="text/css" href="chrome://browser/content/zen-styles/zen-welcome.css" />
<link rel="stylesheet" type="text/css" href="chrome://browser/content/zen-styles/zen-media-controls.css" />
</linkset>
# Scripts used all over the browser
<script src="chrome://browser/content/zen-components/ZenFolders.mjs" />
<script src="chrome://browser/content/zen-components/ZenThemesCommon.mjs" />
<script src="chrome://browser/content/zen-components/ZenThemesImporter.mjs" />
<script src="chrome://browser/content/zen-components/ZenCompactMode.mjs" />
@@ -40,6 +43,7 @@
<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/ZenGlanceManager.mjs" />
<script src="chrome://browser/content/zen-components/ZenMediaController.mjs" />
# Unimportant scripts
<script src="chrome://browser/content/zen-components/ZenRices.mjs" />

View File

@@ -20,10 +20,12 @@
content/browser/zen-components/ZenCommonUtils.mjs (zen-components/ZenCommonUtils.mjs)
content/browser/zen-components/ZenGradientGenerator.mjs (zen-components/ZenGradientGenerator.mjs)
content/browser/zen-components/ZenGlanceManager.mjs (zen-components/ZenGlanceManager.mjs)
content/browser/zen-components/ZenFolders.mjs (zen-components/ZenFolders.mjs)
content/browser/zen-components/ZenActorsManager.mjs (zen-components/ZenActorsManager.mjs)
content/browser/zen-components/ZenRices.mjs (zen-components/ZenRices.mjs)
content/browser/zen-components/ZenEmojies.mjs (zen-components/ZenEmojies.mjs)
content/browser/zen-components/ZenWelcome.mjs (zen-components/ZenWelcome.mjs)
content/browser/zen-components/ZenMediaController.mjs (zen-components/ZenMediaController.mjs)
content/browser/zen-styles/zen-theme.css (content/zen-styles/zen-theme.css)
content/browser/zen-styles/zen-buttons.css (content/zen-styles/zen-buttons.css)
@@ -37,6 +39,7 @@
content/browser/zen-styles/zen-sidebar.css (content/zen-styles/zen-sidebar.css)
content/browser/zen-styles/zen-toolbar.css (content/zen-styles/zen-toolbar.css)
content/browser/zen-styles/zen-decks.css (content/zen-styles/zen-decks.css)
content/browser/zen-styles/zen-folders.css (content/zen-styles/zen-folders.css)
content/browser/zen-styles/zen-glance.css (content/zen-styles/zen-glance.css)
content/browser/zen-styles/zen-browser-container.css (content/zen-styles/zen-browser-container.css)
content/browser/zen-styles/zen-workspaces.css (content/zen-styles/zen-workspaces.css)
@@ -47,6 +50,9 @@
content/browser/zen-styles/zen-rices.css (content/zen-styles/zen-rices.css)
content/browser/zen-styles/zen-branding.css (content/zen-styles/zen-branding.css)
content/browser/zen-styles/zen-welcome.css (content/zen-styles/zen-welcome.css)
content/browser/zen-styles/zen-media-controls.css (content/zen-styles/zen-media-controls.css)
content/browser/zen-styles/windows/zen-settings.css (content/zen-styles/windows/zen-settings.css)
content/browser/zen-styles/zen-panels/bookmarks.css (content/zen-styles/zen-panels/bookmarks.css)
content/browser/zen-styles/zen-panels/extensions.css (content/zen-styles/zen-panels/extensions.css)
@@ -62,6 +68,7 @@
content/browser/zen-images/layouts/multiple-toolbar.png (content/zen-images/layouts/multiple-toolbar.png)
content/browser/zen-images/layouts/single-toolbar.png (content/zen-images/layouts/single-toolbar.png)
content/browser/zen-images/grain-bg.png (content/zen-images/grain-bg.png)
content/browser/zen-images/note-indicator.svg (content/zen-images/note-indicator.svg)
# Actors
content/browser/zen-components/actors/ZenThemeMarketplaceParent.sys.mjs (zen-components/actors/ZenThemeMarketplaceParent.sys.mjs)
@@ -76,3 +83,6 @@
# JS Vendor
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)
# Windows
content/browser/zen-components/windows/zen-settings.xhtml (zen-components/windows/zen-settings.xhtml)

View File

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

View File

@@ -0,0 +1,100 @@
<svg viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg">
<rect width="100%" height="100%" fill="none"/>
<style type="text/css"><![CDATA[
.note {
fill: currentColor;
transform-box: fill-box;
transform-origin: center;
}
@keyframes flyUpLeft {
from {
opacity: 1;
transform: translate(0px, 0px) scale(0.5) rotate(0deg);
}
to {
opacity: 0;
transform: translate(-9px, -35px) scale(5) rotate(0deg);
}
}
@keyframes flyUpRight {
from {
opacity: 1;
transform: translate(0px, 0px) scale(0.5) rotate(0deg);
}
to {
opacity: 0;
transform: translate(9px, -35px) scale(5) rotate(0deg);
}
}
@keyframes flyUpCenter {
from {
opacity: 1;
transform: translate(0px, 0px) scale(0.5) rotate(0deg);
}
to {
opacity: 0;
transform: translate(0px, -35px) scale(5) rotate(0deg);
}
}
}*/
]]></style>
<g class="note-group">
<g class="note" style="animation: flyUpLeft 3s ease-in-out infinite; animation-delay: 0s;">
<path transform="translate(15,40) scale(0.0078)" d="M448.231,166.755C352.139,64.989,240.998,2.38,240.998,2.38
c-3.297-2.625-7.813-3.125-11.609-1.281c-3.813,1.844-6.219,5.688-6.219,9.906v329
c-20.078-8.281-44.688-11.656-71.344-8.344C84.717,340.005,30.514,386.849,30.67,436.255
c0.188,49.453,54.703,82.813,121.75,74.469c67.078-8.328,121.297-55.188,121.125-104.641V164.817
c15.828,3.313,34.391,10.531,54.391,25.219c67.703,49.625,100.905,81.484,58.218,166.859
C475.403,321.974,514.2,236.599,448.231,166.755z"/>
</g>
<g class="note" style="animation: flyUpRight 3s ease-in-out infinite; animation-delay: 0.5s;">
<path transform="translate(15,40) scale(0.0078)" d="M133.703,45.86v86.43v240.66c-16.8-6.173-36.654-8.012-57.11-4.054
c-49.141,9.454-82.977,48.227-75.577,86.559c7.389,38.353,53.195,61.757,102.326,52.292
c43.602-8.4,75.093-39.892,76.449-73.727h0.28V129.246L465.644,93.83v237.595
c-16.811-6.162-36.644-7.98-57.1-4.033c-49.152,9.443-82.966,48.217-75.6,86.559
c7.389,38.342,53.185,61.746,102.327,52.271c43.612-8.389,75.115-39.892,76.449-73.706
H512V90.785V2.152L133.703,45.86z"/>
</g>
<g class="note" style="animation: flyUpCenter 3s ease-in-out infinite; animation-delay: 1s;">
<path transform="translate(15,40) scale(0.0078)" d="M448.231,166.755C352.139,64.989,240.998,2.38,240.998,2.38
c-3.297-2.625-7.813-3.125-11.609-1.281c-3.813,1.844-6.219,5.688-6.219,9.906v329
c-20.078-8.281-44.688-11.656-71.344-8.344C84.717,340.005,30.514,386.849,30.67,436.255
c0.188,49.453,54.703,82.813,121.75,74.469c67.078-8.328,121.297-55.188,121.125-104.641V164.817
c15.828,3.313,34.391,10.531,54.391,25.219c67.703,49.625,100.905,81.484,58.218,166.859
C475.403,321.974,514.2,236.599,448.231,166.755z"/>
</g>
<g class="note" style="animation: flyUpLeft 3s ease-in-out infinite; animation-delay: 1.5s;">
<path transform="translate(15,40) scale(0.0078)" d="M133.703,45.86v86.43v240.66c-16.8-6.173-36.654-8.012-57.11-4.054
c-49.141,9.454-82.977,48.227-75.577,86.559c7.389,38.353,53.195,61.757,102.326,52.292
c43.602-8.4,75.093-39.892,76.449-73.727h0.28V129.246L465.644,93.83v237.595
c-16.811-6.162-36.644-7.98-57.1-4.033c-49.152,9.443-82.966,48.217-75.6,86.559
c7.389,38.342,53.185,61.746,102.327,52.271c43.612-8.389,75.115-39.892,76.449-73.706
H512V90.785V2.152L133.703,45.86z"/>
</g>
<g class="note" style="animation: flyUpRight 3s ease-in-out infinite; animation-delay: 2s;">
<path transform="translate(15,40) scale(0.0078)" d="M448.231,166.755C352.139,64.989,240.998,2.38,240.998,2.38
c-3.297-2.625-7.813-3.125-11.609-1.281c-3.813,1.844-6.219,5.688-6.219,9.906v329
c-20.078-8.281-44.688-11.656-71.344-8.344C84.717,340.005,30.514,386.849,30.67,436.255
c0.188,49.453,54.703,82.813,121.75,74.469c67.078-8.328,121.297-55.188,121.125-104.641V164.817
c15.828,3.313,34.391,10.531,54.391,25.219c67.703,49.625,100.905,81.484,58.218,166.859
C475.403,321.974,514.2,236.599,448.231,166.755z"/>
</g>
<g class="note" style="animation: flyUpCenter 3s ease-in-out infinite; animation-delay: 2.5s;">
<path transform="translate(15,40) scale(0.0078)" d="M133.703,45.86v86.43v240.66c-16.8-6.173-36.654-8.012-57.11-4.054
c-49.141,9.454-82.977,48.227-75.577,86.559c7.389,38.353,53.195,61.757,102.326,52.292
c43.602-8.4,75.093-39.892,76.449-73.727h0.28V129.246L465.644,93.83v237.595
c-16.811-6.162-36.644-7.98-57.1-4.033c-49.152,9.443-82.966,48.217-75.6,86.559
c7.389,38.342,53.185,61.746,102.327,52.271c43.612-8.389,75.115-39.892,76.449-73.706
H512V90.785V2.152L133.703,45.86z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@@ -0,0 +1,51 @@
<toolbar id="zen-media-controls-toolbar"
class="browser-toolbar customization-target zen-sidebar-toolbar"
context="toolbar-context-menu"
mode="icons"
hidden="true">
<toolbaritem>
<vbox id="zen-media-main-vbox">
<vbox>
<hbox id="zen-media-info-container" class="show-on-hover">
<vbox id="zen-media-info-vbox">
<label id="zen-media-title" fadein="true"/>
<label id="zen-media-artist" fadein="true"/>
</vbox>
<hbox id="zen-media-buttons-hbox">
<toolbarbutton id="zen-media-pip-button"
class="toolbarbutton-1"
oncommand="gZenMediaController.onMediaPip();" />
<toolbarbutton id="zen-media-close-button"
class="toolbarbutton-1"
oncommand="gZenMediaController.onControllerClose();" />
</hbox>
</hbox>
<hbox id="zen-media-progress-hbox" class="show-on-hover">
<label id="zen-media-current-time">0:00</label>
<html:input type="range" id="zen-media-progress-bar"
value="0" min="0" max="100" step="0.1"
oninput="gZenMediaController.onMediaSeekDrag(event);"
onchange="gZenMediaController.onMediaSeekComplete(event);"/>
<label id="zen-media-duration">0:00</label>
</hbox>
</vbox>
<hbox id="zen-media-controls-hbox">
<toolbarbutton id="zen-media-focus-button"
class="toolbarbutton-1"
oncommand="gZenMediaController.onMediaFocus();" />
<toolbarbutton id="zen-media-previoustrack-button"
class="toolbarbutton-1"
oncommand="gZenMediaController.onMediaPlayPrev();" />
<toolbarbutton id="zen-media-playpause-button"
class="toolbarbutton-1"
oncommand="gZenMediaController.onMediaToggle();" />
<toolbarbutton id="zen-media-nexttrack-button"
class="toolbarbutton-1"
oncommand="gZenMediaController.onMediaPlayNext();" />
<toolbarbutton id="zen-media-mute-button"
class="toolbarbutton-1"
oncommand="gZenMediaController.onMediaMute();" />
</hbox>
</vbox>
</toolbaritem>
</toolbar>

View File

@@ -1,3 +1,4 @@
#include zen-media-player.inc.xhtml
<toolbar brighttext="true"
id="zen-sidebar-bottom-buttons"
fullscreentoolbar="true"

View File

@@ -10,7 +10,7 @@
</hbox>
<hbox>
<toolbarbutton id="zen-sidebar-web-panel-home" class="toolbarbutton-1 chromeclass-toolbar-additional" oncommand="gZenBrowserManagerSidebar.home();"/>
<toolbarbutton id="zen-sidebar-web-panel-pinned" class="toolbarbutton-1 chromeclass-toolbar-additional" oncommand="gZenBrowserManagerSidebar.togglePinned(this);"/>
<toolbarbutton id="zen-sidebar-web-panel-pinned" class="toolbarbutton-1 chromeclass-toolbar-additional" pinned="true" oncommand="gZenBrowserManagerSidebar.togglePinned(this);"/>
<toolbarbutton id="zen-sidebar-web-panel-close" class="toolbarbutton-1 chromeclass-toolbar-additional" oncommand="gZenBrowserManagerSidebar.close();"/>
</hbox>
</toolbar>

View File

@@ -0,0 +1,49 @@
@namespace html 'http://www.w3.org/1999/xhtml';
@namespace xul 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul';
* {
margin: 0;
box-sizing: border-box;
}
:root {
font: message-box;
}
body {
width: 100%;
}
#main-content {
background: var(--zen-themed-toolbar-bg-transparent);
@supports (-moz-osx-font-smoothing: auto) {
appearance: -moz-window-titlebar;
}
user-select: none;
touch-action: none;
pointer-events: auto;
width: 100%;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
gap: 2rem;
padding: 1rem;
}
.section {
width: 100%;
position: relative;
gap: 0.6rem;
.section-content {
width: 100%;
background: var(--zen-toolbar-element-bg);
border-radius: 6px;
padding: 1em;
font-size: 1.1em;
}
}

View File

@@ -85,18 +85,6 @@
}
}
@keyframes zen-deck-fadeIn {
0% {
transform: scale(0.9);
opacity: 0;
}
100% {
transform: scale(1);
opacity: 1;
}
}
@keyframes better-sidebar-pinned-hide {
0% {
opacity: 1;
@@ -302,3 +290,23 @@
transform: scale(1);
}
}
@keyframes zen-back-and-forth-text {
0%,
10% {
transform: translateX(0);
left: 0;
}
45%,
65% {
transform: translateX(calc(-100% - 5px));
left: 100%;
}
90%,
100% {
transform: translateX(0);
left: 0;
}
}

View File

@@ -16,10 +16,12 @@
#zen-tabbox-wrapper {
/* Remove extra 1px of margine we have to add to the tabbox */
margin-left: 0 !important;
margin-right: 0 !important;
}
#zen-appcontent-wrapper {
margin-left: var(--zen-element-separation) !important;
margin-right: var(--zen-element-separation) !important;
& #tabbrowser-tabbox {
margin-left: 0 !important;
@@ -38,6 +40,9 @@
--zen-toolbox-max-width: 64px !important;
--zen-compact-float: var(--zen-element-separation);
/* Initial padding for when we are animating */
padding: 0 0 0 var(--zen-toolbox-padding) !important;
&:not([animate='true']) {
position: absolute;
z-index: 10;
@@ -51,7 +56,12 @@
opacity: 0;
:root[zen-single-toolbar='true'] & {
top: var(--zen-element-separation);
top: calc(var(--zen-element-separation) / 2);
height: calc(100% - var(--zen-element-separation));
}
& #zen-sidebar-top-buttons {
margin: 0 0 calc(var(--zen-toolbox-padding) / 2) 0;
}
}
@@ -61,7 +71,7 @@
}
&:not([zen-right-side='true']) #navigator-toolbox {
left: calc(-1 * var(--zen-sidebar-width) + 1px);
left: calc(-1 * var(--actual-zen-sidebar-width) + 1px);
}
/* When we have multiple toolbars and the top-toolbar is NOT being hidden,
@@ -78,24 +88,33 @@
--zen-compact-float: calc(var(--zen-element-separation) + 1px);
&:not([animate='true']) {
right: calc(-1 * var(--zen-sidebar-width) + 1px);
right: calc(-1 * var(--actual-zen-sidebar-width) + 1px);
}
}
& .browserSidebarContainer {
margin-left: 0 !important;
margin-right: var(--zen-element-separation) !important;
margin-right: 0 !important;
}
}
#navigator-toolbox:not([animate='true']) #titlebar {
box-shadow: var(--zen-big-shadow);
border-radius: var(--zen-native-inner-radius);
border-radius: calc(var(--zen-native-inner-radius) + var(--zen-element-separation) / 4);
padding: var(--zen-toolbox-padding) !important;
position: relative;
background: var(--zen-dialog-background);
border: 1px solid var(--zen-colors-border-contrast);
width: calc(100% - var(--zen-toolbox-padding));
/* times 4 because we have the inner padding and the outter padding to consider */
:root[zen-sidebar-expanded='true'] & {
&[has-animated-padding='true'] {
width: calc(var(--zen-sidebar-width) + var(--zen-toolbox-padding));
}
&:not([has-animated-padding='true']) {
width: calc(var(--zen-sidebar-width) - var(--zen-toolbox-padding));
}
}
:root[zen-single-toolbar='true'] {
padding-top: 0 !important;
@@ -113,6 +132,7 @@
& #urlbar[open][zen-floating-urlbar='true'] {
transition: left 0.05s ease;
visibility: visible;
#navigator-toolbox:has(&) {
opacity: 1;
@@ -134,17 +154,18 @@
}
}
#navigator-toolbox[zen-has-hover],
#navigator-toolbox[zen-has-hover]:not(:has(#urlbar[zen-floating-urlbar='true']:hover)),
#navigator-toolbox[zen-user-show],
#navigator-toolbox[zen-has-empty-tab],
#navigator-toolbox[flash-popup],
#navigator-toolbox[has-popup-menu],
#navigator-toolbox[movingtab],
#navigator-toolbox:has(.tabbrowser-tab:active),
&[zen-renaming-tab='true'] #navigator-toolbox,
#navigator-toolbox:has(
*:is([panelopen='true'], [open='true'], #urlbar:not([zen-floating-urlbar='true']):focus-within):not(tab):not(.zen-compact-mode-ignore)
*:is([panelopen='true'], [open='true'], #urlbar:focus-within):not(#urlbar[zen-floating-urlbar='true']):not(tab):not(.zen-compact-mode-ignore)
) {
&:not([animate='true']):not(:has(#urlbar[zen-floating-urlbar='true']:hover)) {
&:not([animate='true']) {
--zen-compact-mode-func: linear(
0 0%,
0.002748 1%,
@@ -249,14 +270,14 @@
1.003423 100%
);
transition:
left 0.3s var(--zen-compact-mode-func),
right 0.3s var(--zen-compact-mode-func);
left 0.25s var(--zen-compact-mode-func),
right 0.25s var(--zen-compact-mode-func);
opacity: 1;
&:not([supress-primary-adjustment='true']) {
left: -1px;
left: calc(var(--zen-element-separation) / -2);
:root[zen-right-side='true'] & {
right: -1px;
right: calc(var(--zen-element-separation) / -2);
left: auto;
}
}

View File

@@ -17,7 +17,7 @@
margin: 0;
}
#zen-splitview-dropzone {
border-radius: var(--zen-webview-border-radius, var(--zen-border-radius));
border-radius: var(--zen-native-inner-radius);
transition: inset ease-out 0.08s;
display: none;
background-color: color-mix(in srgb, var(--zen-colors-secondary) 30%, transparent 70%);
@@ -29,17 +29,13 @@
#tabbrowser-tabpanels[zen-split-view='true'] > [zen-split='true'],
#zen-splitview-dropzone {
flex: 1;
margin: var(--zen-split-column-gap) calc(var(--zen-split-row-gap) + 1px) !important;
margin: var(--zen-split-column-gap) var(--zen-split-row-gap) !important;
margin-bottom: 0 !important;
margin-left: 0 !important;
position: absolute !important;
overflow: hidden;
}
#tabbrowser-tabpanels[zen-split-view='true'] > [zen-split-anim='true'] {
animation: zen-deck-fadeIn 0.2s forwards ease-in-out;
}
#tabbrowser-tabpanels[zen-split-view='true']:not([zen-split-resizing]) > [zen-split-anim='true'] {
transition: inset 0.09s ease-out !important;
& browser {
@@ -48,12 +44,11 @@
}
#tabbrowser-tabpanels[zen-split-view='true'] .browserSidebarContainer.deck-selected {
outline: 2px solid var(--zen-primary-color) !important;
outline-offset: -1px;
outline: 1px solid var(--zen-primary-color) !important;
}
#tabbrowser-tabbox:has(#tabbrowser-tabpanels[zen-split-view='true']) {
--zen-split-row-gap: calc(var(--zen-element-separation) + 1px);
--zen-split-row-gap: var(--zen-element-separation);
--zen-split-column-gap: calc(var(--zen-element-separation) + 1px);
margin-right: calc(-1 * var(--zen-split-column-gap));
}
@@ -95,12 +90,6 @@
pointer-events: all;
}
.zen-split-view-splitter[orient='vertical'] {
width: var(--zen-split-row-gap);
margin-left: calc(var(--zen-split-row-gap) / -2);
cursor: ew-resize;
}
.zen-split-view-splitter[orient='horizontal'] {
height: var(--zen-split-column-gap);
cursor: ns-resize;
@@ -216,3 +205,109 @@
#zenSplitViewModifier:not([has-enabled-realloc])[toast] #zenSplitViewModifierEnabledToast {
display: revert;
}
.zen-view-splitter-header-container {
position: absolute;
top: calc(var(--zen-split-column-gap) / -2);
left: 50%;
opacity: 0;
transition: opacity 0.2s;
z-index: 100;
transform: translateX(-50%);
pointer-events: none;
}
.zen-view-splitter-header {
display: flex;
align-items: center;
position: fixed;
padding: 0.4rem 0.6rem;
border-radius: 8px;
background-color: light-dark(rgba(255, 255, 255, 1), rgba(0, 0, 0, 1));
box-shadow: 0 0 0 1px var(--button-primary-border-color);
gap: 0.8rem;
transform: translateX(-50%);
box-shadow: 0 0 5px 1px rgba(0, 0, 0, 0.1);
border-top-left-radius: 0;
border-top-right-radius: 0;
}
:root:not([inDOMFullscreen='true']) .browserSidebarContainer:hover .zen-view-splitter-header-container,
.zen-view-splitter-header-container:hover {
pointer-events: all;
opacity: 1;
transition-delay: 0.2s;
}
.zen-view-splitter-header-container toolbarbutton {
display: block;
-moz-context-properties: fill, fill-opacity;
border-radius: var(--tab-border-radius);
color: inherit;
fill: currentColor;
width: 16px;
height: 16px;
cursor: pointer;
appearance: none;
outline: none;
color: var(--button-primary-bgcolor);
border-top-left-radius: 0;
border-top-right-radius: 0;
& image {
width: 14px;
height: 14px;
}
&.zen-tab-rearrange-button {
cursor: move;
& image {
transform: rotate(90deg);
}
}
}
#zen-split-view-fake-browser {
position: absolute;
height: 100%;
background: rgba(255, 255, 255, 0.1);
border-radius: var(--zen-native-inner-radius);
box-shadow: var(--zen-big-shadow);
overflow: hidden;
&[side='right'] {
right: 0;
&[has-split-view='true'] {
right: var(--zen-element-separation);
}
}
&::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 3.5rem;
pointer-events: none;
height: 3.5rem;
background: var(--zen-split-view-fake-icon);
background-size: contain;
background-repeat: no-repeat;
background-position: center;
opacity: 0.8;
transition: opacity 0.2s;
transition-delay: 0.1s;
@starting-style {
opacity: 0;
}
}
&.fade-out::after {
opacity: 0;
transition-delay: 0s;
}
}

View File

@@ -0,0 +1,178 @@
tab-group[split-view-group] {
display: flex;
flex-wrap: nowrap;
border-radius: var(--border-radius-medium);
padding: 0 2px;
margin-inline: var(--tab-block-margin);
margin-block: var(--tab-block-margin);
min-height: var(--tab-min-height);
outline: var(--tab-outline);
outline-offset: var(--tab-outline-offset);
outline-color: var(--tab-selected-outline-color);
transition: scale 0.1s ease;
align-items: center;
--zen-split-view-active-tab-bg: color-mix(in srgb, var(--zen-toolbar-element-bg), transparent 40%);
:root:not([zen-sidebar-expanded='true']) & {
padding: 0 2px;
--tab-min-height: 30px;
--tab-collapsed-width: 38px;
margin: 0 auto;
--tab-min-width: 34px;
}
& > .tabbrowser-tab {
--tab-selected-bgcolor: var(--zen-split-view-active-tab-bg);
--tab-hover-background-color: transparent;
--tab-selected-shadow: none;
--border-radius-medium: var(--tab-border-radius);
--zen-active-tab-scale: 1;
:root[zen-sidebar-expanded='true'] & {
--tab-min-height: 28px;
}
container-type: inline-size;
container-name: browser-tab;
flex: 1 !important;
padding-inline: 2px !important;
overflow: clip;
&:not(:last-child)::after {
content: '';
width: 1px;
height: 16px;
background-color: light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.2));
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
}
:root:not([zen-sidebar-expanded='true']) &:not(:last-child)::after {
width: 16px;
height: 1px;
top: auto;
bottom: 0;
right: 50%;
transform: translateX(50%);
}
}
&:has(> tab:is([visuallyselected], [multiselected])) {
background-color: var(--tab-selected-bgcolor);
box-shadow: var(--tab-selected-shadow);
& > .tabbrowser-tab {
--tab-hover-background-color: var(--zen-split-view-active-tab-bg);
& .tab-background {
background-color: var(--zen-split-view-active-tab-bg) !important;
}
&::after {
display: none;
}
}
}
&:active {
scale: var(--zen-active-tab-scale);
}
&:hover {
background-color: var(--zen-toolbar-element-bg);
}
& .tab-close-button,
& .tab-reset-button {
margin-inline-end: -3px !important;
display: none !important;
}
@container browser-tab (min-width: 70px) {
:root[zen-sidebar-expanded='true'] &:hover > .tabbrowser-tab:not([pinned]) .tab-close-button {
display: block !important;
}
}
@media (prefers-reduced-motion: no-preference) {
#tabbrowser-tabs[movingtab] & {
transition: var(--tab-dragover-transition);
}
}
}
:root:not([zen-sidebar-expanded='true']) {
tab-group {
flex-direction: column;
}
}
tab-group[split-view-group] .tabbrowser-tab {
width: 100%;
max-width: unset;
}
tab-group[split-view-group] .tab-group-label-container {
display: none;
width: 100%;
}
tab-group[split-view-group] .tab-close-button {
display: block;
visibility: visible;
}
tab-group[split-view-group] .tab-group-line {
display: none;
background: transparent;
}
tab-group:not([split-view-group]) {
& .tab-group-label-container {
min-width: fit-content;
max-width: 100%;
height: fit-content !important;
display: flex;
justify-content: start;
margin-top: 10px;
margin-bottom: 10px;
}
& .tab-group-label {
text-align: start;
flex-grow: 1 !important;
min-width: fit-content;
max-width: 100%;
font-size: 14px !important;
display: block !important;
padding-right: 8px;
}
& .tab-group-line {
display: none !important;
}
&[collapsed] .tabbrowser-tab {
display: none !important;
}
&:not([collapsed]) .tabbrowser-tab {
margin-left: 10px;
}
&:not([collapsed]) .tabbrowser-tab::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 2px;
height: 100%;
background-color: var(--tab-group-color);
}
}
.tab-group-line {
display: none !important;
}

View File

@@ -29,24 +29,63 @@
width: 32px;
height: 32px;
background: light-dark(rgb(24, 24, 24), rgb(231, 231, 231));
transition: background 0.2s ease;
transition:
background 0.05s ease,
scale 0.05s ease;
border-radius: 999px;
appearance: none;
box-shadow: 0 0 12px 1px rgba(0, 0, 0, 0.07);
opacity: 0;
padding: 8px;
&:hover {
background: light-dark(rgb(41, 41, 41), rgb(204, 204, 204));
scale: 1.05;
}
&:hover:active {
scale: 0.95;
}
& label {
display: none;
&::before {
text-overflow: unset;
}
}
& image {
filter: invert(1);
}
}
& #zen-glance-sidebar-close {
width: fit-content;
& label {
display: block;
max-width: 0px;
margin: 0;
overflow: hidden;
transition:
max-width 0.2s ease,
margin-left 0.2s ease;
}
&[waitconfirmation] {
background: rgb(220, 53, 69);
color: white;
fill: white;
& label {
max-width: 4rem;
margin-left: 8px;
}
& image {
filter: none;
}
}
}
}
.browserSidebarContainer.zen-glance-overlay {

View File

@@ -89,6 +89,7 @@
border-radius: 50%;
cursor: pointer;
position: relative;
transition: transform 0.1s;
&::after {
content: '';
position: absolute;
@@ -99,6 +100,23 @@
outline: 2px solid var(--zen-toolbar-element-bg);
border-radius: 50%;
pointer-events: none;
transition: transform 0.1s;
}
&:hover {
transform: scale(1.05);
&::after {
transform: scale(1.05);
}
}
&:hover:active {
transform: scale(0.95);
&::after {
transform: scale(0.95);
}
}
}
}

View File

@@ -0,0 +1,284 @@
#zen-media-controls-toolbar {
--progress-height: 4px;
--button-spacing: 2px;
display: flex;
justify-content: space-between;
min-width: 0;
background: transparent;
container-type: inline-size;
.toolbarbutton-1 {
border-radius: 5px;
color: white;
}
#zen-media-buttons-hbox {
align-items: start;
margin-top: -4px;
--toolbarbutton-outer-padding: 2px;
}
&:not([can-pip]) {
#zen-media-info-vbox {
width: calc(100% - 26px);
flex-shrink: 0;
}
#zen-media-pip-button {
display: none;
}
}
#zen-media-prev-button,
#zen-media-play-pause-button,
#zen-media-next-button {
margin: 0;
}
image.toolbarbutton-icon {
padding: 5px;
width: 26px;
height: 26px;
}
#zen-media-progress-bar {
appearance: none;
width: 100%;
height: var(--progress-height);
margin: 0 8px;
border-radius: 2px;
background-color: rgba(255, 255, 255, 0.2);
cursor: pointer;
transition: height 0.15s ease-out;
&::-moz-range-track {
background: var(--zen-colors-border);
border-radius: 999px;
height: var(--progress-height);
}
&::-moz-range-progress {
background: var(--zen-primary-color);
border-radius: 999px;
height: var(--progress-height);
}
&::-moz-range-thumb {
background: var(--zen-primary-color);
border: none;
width: calc(var(--progress-height) * 2);
height: calc(var(--progress-height) * 2);
border-radius: 50%;
cursor: pointer;
transform: scale(0);
transition: transform 0.15s ease-out;
}
&:hover::-moz-range-thumb {
transform: scale(1);
}
}
&:hover {
.show-on-hover {
max-height: 50px;
padding: 5px;
margin-bottom: 0;
opacity: 1;
transform: translateY(0) !important;
pointer-events: auto;
}
}
& #zen-media-focus-button::after {
content: '';
position: absolute;
width: 110%;
height: 110%;
background-repeat: no-repeat;
opacity: 1;
background: url('chrome://browser/content/zen-images/note-indicator.svg') no-repeat;
top: -70%;
left: 50%;
transform: translateX(-50%);
z-index: 0;
pointer-events: none;
transition: opacity 0.8s ease;
opacity: 1;
}
&:is(:not(.playing:not([muted])), :hover) #zen-media-focus-button::after {
opacity: 0;
}
#zen-media-focus-button {
align-self: center;
transition:
opacity 0.2s ease,
transform 0.2s ease;
position: relative;
& image {
&:-moz-broken {
content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100'%3E%3C/svg%3E") !important;
background: color-mix(in srgb, var(--zen-primary-color) 70%, transparent 30%);
}
}
}
& > toolbaritem {
--zen-media-control-bg: light-dark(rgba(255, 255, 255, 0.87), rgba(0, 0, 0, 0.87));
flex-grow: 1;
padding: 0;
transition: padding 0.3s ease-out;
position: absolute;
left: 0;
bottom: 0;
padding: 4px 6px;
border-radius: var(--border-radius-medium);
box-shadow: 0 0 6px rgba(0, 0, 0, 0.3);
background-color: var(--zen-media-control-bg);
backdrop-filter: saturate(3) contrast(2) blur(10px);
width: 100%;
will-change: transform;
}
.show-on-hover {
max-height: 0;
opacity: 0;
transform: translateY(1rem);
padding: 0 6px;
pointer-events: none;
transition:
max-height 0.2s ease,
opacity 0.2s ease,
transform 0.2s ease,
padding 0.2s ease;
}
#zen-media-current-time,
#zen-media-duration {
margin: 0 0 0 1px;
font-size: x-small;
opacity: 0.7;
font-weight: 500;
}
}
#zen-media-controls-toolbar {
display: none;
animation: none;
transition: none;
&:not([hidden]) {
display: flex;
height: 2.5rem;
overflow: visible;
position: relative;
z-index: 2;
}
}
#zen-media-title,
#zen-media-artist {
align-self: start;
}
#zen-media-artist {
opacity: 0.7;
font-size: smaller;
&:empty {
display: none;
}
}
#zen-media-title {
height: 16px;
font-size: math;
}
#zen-media-main-vbox,
#zen-media-info-vbox,
#zen-media-progress-hbox {
width: 100%;
}
#zen-media-info-vbox {
#zen-media-controls-toolbar:not([media-position-hidden='true']) & {
transition-delay: 0.01s !important;
}
overflow-x: hidden;
overflow-x: visible;
white-space: nowrap;
/* Overflow inner box shadow from the left to simulate overflow */
mask-image: linear-gradient(to left, transparent, var(--zen-media-control-bg) 0.6em);
min-width: 1px;
&::before {
content: '';
position: absolute;
width: 0.6em;
background: linear-gradient(to right, var(--zen-media-control-bg) 0%, transparent 100%);
pointer-events: none;
top: 6px;
left: 0;
height: calc(100% - 6px);
z-index: 1;
}
& label {
min-height: 16px;
margin-left: 0;
font-weight: 500;
position: relative; /* For the animation */
&[overflow] {
animation: zen-back-and-forth-text 10s infinite ease-in-out;
}
}
}
#zen-media-main-vbox {
height: 100%;
justify-content: space-between;
}
#zen-media-progress-hbox {
flex-grow: 1;
height: 1.1rem;
align-items: center;
padding-top: 0px !important;
#zen-media-controls-toolbar[media-position-hidden='true'] & {
display: none;
}
}
#zen-media-controls-hbox {
align-items: flex-end;
justify-content: space-between;
max-width: 100%;
--toolbarbutton-outer-padding: 0;
}
#zen-media-info-container {
padding-right: 0 !important;
}
#zen-media-controls-toolbar[can-pip] {
#zen-media-info-vbox {
flex-shrink: 1;
}
#zen-media-pip-button {
display: flex;
}
}
:root:not([zen-sidebar-expanded='true']) {
#zen-media-controls-toolbar {
display: none;
}
}

View File

@@ -360,9 +360,9 @@ menuitem {
& .zen-toast {
padding: 0.9rem 0.8rem;
border-radius: 12px;
background-color: var(--button-primary-bgcolor);
background: linear-gradient(170deg, light-dark(rgb(187, 187, 187), rgb(240, 240, 240)) -40%, var(--zen-primary-color) 140%);
color: var(--button-primary-color);
box-shadow: var(--zen-big-shadow);
box-shadow: 0 0 16px 3px rgba(0, 0, 0, 0.1);
display: flex;
font-weight: 500;
gap: 5px;

View File

@@ -111,24 +111,25 @@
background: transparent;
border: none;
cursor: ew-resize;
z-index: 2;
&:is(.zen-split-view-splitter[orient='vertical']) {
/* Bit of a hacky solution, but it works */
width: calc(var(--zen-element-separation) - 3px);
margin-left: calc(-1 * var(--zen-element-separation) / 2 - 2px);
width: var(--zen-split-row-gap);
margin-left: calc(var(--zen-element-separation) * -1 - 1px);
height: unset;
cursor: ew-resize;
}
&::before {
height: 50px;
width: 4px;
background: var(--zen-colors-primary);
width: 2px;
background: var(--button-primary-bgcolor);
border-radius: 2px;
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
opacity: 0;
transition: opacity 0.1s ease-in-out;
pointer-events: none;
@@ -139,10 +140,6 @@
}
}
.zen-split-view-splitter[orient='vertical']::before {
transform: translate(-75%, -50%);
}
.zen-sidebar-web-panel-splitter[side='right'] {
left: 100%;
}

View File

@@ -19,12 +19,6 @@
text-overflow: ellipsis;
}
@media not (-moz-bool-pref: 'zen.watermark.enabled') {
#zen-watermark {
display: none;
}
}
#customization-footer #customization-toolbar-visibility-button {
display: none !important;
}

View File

@@ -94,9 +94,8 @@
padding: 6px !important;
}
& #urlbar-container,
& #urlbar {
--urlbar-container-height: 40px;
& #urlbar-container[breakout='true']:has([zen-floating-urlbar='true']) {
--urlbar-container-height: 36px !important;
--urlbar-height: 38px !important;
}
@@ -109,7 +108,7 @@
}
& #zen-sidebar-top-buttons {
margin: 4px 0;
margin: var(--zen-toolbox-padding) 0 calc(var(--zen-toolbox-padding) / 2) 0;
}
& #PanelUI-menu-button {
@@ -154,8 +153,6 @@
min-width: var(--zen-toolbox-min-width);
margin-top: 0 !important; /* Fix full screen mode */
padding-bottom: var(--zen-element-separation) !important;
border: none;
order: 0 !important;
@@ -258,14 +255,29 @@
}
& .tabbrowser-tab {
transition: scale 0.07s ease;
&,
& .tab-content > image {
transition: scale 0.07s ease;
}
&[zen-empty-tab] {
display: none;
}
&:active {
scale: 0.98;
#tabbrowser-tabs:not([movingtab]) &:active:not(:has(.tab-content > image:active)) {
scale: var(--zen-active-tab-scale);
}
#tabbrowser-tabs:not([movingtab]) & .tab-content > image:active {
scale: var(--zen-active-tab-scale);
}
& .tab-icon-image {
&:not([src]),
&:-moz-broken {
content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100'%3E%3C/svg%3E") !important;
background: color-mix(in srgb, var(--zen-primary-color) 30%, transparent 70%);
}
}
max-width: unset;
@@ -374,6 +386,12 @@
overflow-y: auto;
height: 100%;
scrollbar-width: thin;
/* Only do this hack if we have workspaces enabled */
:root[zen-workspace-id] & {
margin-left: calc(-1 * var(--zen-toolbox-padding));
width: calc(100% + var(--zen-toolbox-padding) * 2);
}
}
#zen-browser-tabs-container {
@@ -391,7 +409,7 @@
max-height: unset !important;
& .tabbrowser-tab:not(:hover) .tab-background:not([selected]):not([multiselected]) {
background: transparent !important;
background: transparent;
}
& .tabbrowser-tab .tab-content {
@@ -440,7 +458,7 @@
padding-right: 0;
:root[zen-single-toolbar='true'] & {
& #urlbar:not([breakout-extend='true']) .urlbar-input-container {
& #urlbar:not([breakout-extend='true']):not([pageproxystate='invalid']) .urlbar-input-container {
padding-left: 8px;
padding-right: 4px;
}
@@ -451,10 +469,6 @@
margin-top: 0;
}
& #zen-workspaces-button[as-button='true'] {
width: calc(100% - 10px) !important;
}
& .zen-current-workspace-indicator-icon[no-icon='true'] {
display: none;
}
@@ -600,7 +614,7 @@
&:is(:hover, [visuallyselected]) .tab-close-button {
display: block;
--tab-inline-padding: 0; /* Avoid weird padding */
margin-inline-end: 0 !important;
margin-inline-end: 0;
}
.tab-throbber,
@@ -751,14 +765,6 @@
}
& #zen-workspaces-button {
flex-direction: column;
&:not([as-button='true']) {
& toolbarbutton {
&[active='true']::after {
bottom: 50% !important;
transform: translateY(50%) !important;
}
}
}
}
}
@@ -775,6 +781,8 @@
transition: opacity 0.2s ease-in-out;
background: var(--zen-colors-border);
appearance: none;
position: relative !important;
order: 0;
}
/* Mark: Move sidebar to the right */
@@ -863,6 +871,7 @@
pointer-events: none;
width: 16px;
height: 16px;
border-radius: 4px;
}
&::after {
@@ -870,7 +879,7 @@
display: block;
width: 2.5px;
height: 16px;
background: light-dark(rgba(88, 79, 79, 0.02), rgba(255, 255, 255, 0.3));
background: light-dark(rgba(66, 61, 61, 0.3), rgba(255, 255, 255, 0.3));
position: absolute;
right: 0;
top: 50%;
@@ -886,7 +895,6 @@
.reset-icon,
.tab-reset-pin-button {
appearance: none;
}
@media not (forced-colors) {
@@ -1049,7 +1057,7 @@
overflow: hidden;
transition: max-height 0.3s ease-out;
opacity: 1;
grid-template-columns: repeat(auto-fit, minmax(var(--tab-pinned-min-width-expanded), auto));
grid-template-columns: repeat(auto-fit, minmax(48px, auto));
overflow: hidden;
scrollbar-width: thin;
display: grid;
@@ -1101,7 +1109,7 @@
&::after {
content: "";
inset: -50%;
filter: blur(15px);
filter: blur(15px) brightness(1.2);
position: absolute;
background-size: 100% 100%;
background-clip: padding-box;
@@ -1167,7 +1175,7 @@
}
& .titlebar-buttonbox-container {
margin-left: calc(-1 * var(--zen-toolbox-max-width)) !important;
margin-left: calc(-1 * var(--zen-toolbox-max-width) + var(--zen-toolbox-padding) / 2) !important;
}
& #zen-appcontent-wrapper {
@@ -1260,5 +1268,9 @@
.zen-workspace-tabs-section {
position: absolute;
transform: translateX(-100%);
min-width: 100%;
min-width: calc(100% - var(--zen-toolbox-padding) * 2);
&:not(.zen-current-workspace-indicator) {
margin: 0 var(--zen-toolbox-padding);
}
}

View File

@@ -79,7 +79,7 @@
--focus-outline-color: var(--button-bgcolor) !important;
--toolbarbutton-icon-fill-attention: var(--zen-primary-color) !important;
--toolbarbutton-icon-fill: light-dark(rgb(57, 57, 58), rgb(251, 251, 254)) !important;
--toolbarbutton-icon-fill: light-dark(rgba(57, 57, 58, 0.6), rgba(251, 251, 254, 0.6)) !important;
--button-primary-bgcolor: var(--in-content-primary-button-background) !important;
--button-primary-hover-bgcolor: var(--in-content-primary-button-background-hover) !important;
@@ -104,7 +104,7 @@
--zen-button-border-radius: 5px;
--zen-button-padding: 0.6rem 1.2rem;
--zen-toolbar-element-bg: light-dark(rgba(89, 89, 89, 0.1), rgba(255, 255, 255, 0.125));
--zen-toolbar-element-bg: light-dark(rgba(89, 89, 89, 0.1), rgba(255, 255, 255, 0.1));
/* Toolbar */
--zen-toolbar-height: 38px;
@@ -155,8 +155,8 @@
--input-bgcolor: var(--zen-colors-tertiary) !important;
--input-border-color: var(--zen-input-border-color) !important;
--zen-themed-toolbar-bg: light-dark(var(--zen-branding-bg), #161616);
--zen-themed-toolbar-bg-transparent: light-dark(var(--zen-branding-bg), #161616);
--zen-themed-toolbar-bg: light-dark(rgb(240, 240, 244), #171717);
--zen-themed-toolbar-bg-transparent: light-dark(var(--zen-branding-bg), #171717);
--zen-workspace-indicator-height: 45px;
@@ -164,7 +164,7 @@
background: transparent;
--zen-themed-toolbar-bg-transparent: transparent;
@media (-moz-bool-pref: 'zen.widget.windows.acrylic') {
--zen-themed-toolbar-bg-transparent: color-mix(in srgb, var(--zen-themed-toolbar-bg) 80%, transparent 20%);
--zen-themed-toolbar-bg-transparent: color-mix(in srgb, var(--zen-themed-toolbar-bg) 75%, transparent 25%);
}
}
@@ -172,6 +172,7 @@
--arrowpanel-background: var(--zen-dialog-background) !important;
--zen-big-shadow: 0 0 9.73px 0px light-dark(rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.25));
--zen-active-tab-scale: 0.98;
/* Nativity */
--zen-native-content-radius: var(--zen-border-radius);

View File

@@ -16,6 +16,10 @@
--urlbarView-highlight-background: var(--toolbarbutton-hover-background);
border-radius: var(--toolbarbutton-border-radius);
padding: 1px;
:root:not([zen-single-toolbar='true']) &[zen-floating-urlbar='true'] {
--urlbar-container-padding: 2px !important;
}
}
.urlbar-input::placeholder {
@@ -44,6 +48,16 @@
outline-color: none !important;
}
#urlbar:not([breakout-extend='true']) {
& #urlbar-background {
transition: background-color 0.15s ease;
}
&:hover #urlbar-background {
background-color: light-dark(rgba(255, 255, 255, 0.85), rgba(255, 255, 255, 0.2)) !important;
}
}
#identity-box.chromeUI:not([pageproxystate='invalid']) {
& #identity-icon-box {
background: light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1)) !important;
@@ -70,7 +84,7 @@
position: relative;
}
#urlbar:not([breakout-extend='true']) #identity-box:is(:not(.chromeUI), [pageproxystate='invalid']) {
#urlbar:not([breakout-extend='true']) #identity-box {
margin-inline-end: 0 !important;
}
@@ -80,6 +94,12 @@
justify-content: center !important;
align-items: center !important;
margin: 0;
:root[zen-single-toolbar='true'] & {
padding: 6px !important;
width: unset !important;
height: unset !important;
}
}
#tracking-protection-icon-container {
@@ -88,8 +108,6 @@
.urlbar-page-action,
#tracking-protection-icon-container {
width: calc(var(--urlbar-min-height) - 6 * var(--urlbar-container-padding)) !important;
height: calc(var(--urlbar-min-height) - 6 * var(--urlbar-container-padding)) !important;
margin-top: auto !important;
margin-bottom: auto !important;
}
@@ -119,23 +137,26 @@
box-shadow: 0px 0px 90px -10px rgba(0, 0, 0, 0.6) !important;
border: 1px solid hsla(0, 0%, 100%, 0.1) !important;
backdrop-filter: none !important;
border-radius: 0.8rem !important;
}
#urlbar-go-button {
margin: auto 0;
display: none;
}
:root[zen-single-toolbar='true'] {
--urlbar-icon-border-radius: 10px !important;
.urlbar-page-action:not([open]):not(#identity-permission-box),
#tracking-protection-icon-container {
display: none;
}
#identity-icon-box:not([open]) {
margin-inline-start: calc(-8px - 2 * var(--urlbar-icon-padding)) !important;
#identity-box:not([pageproxystate='invalid']) #identity-icon-box:not([open]) {
margin-inline-start: calc(-8px - 2 * var(--urlbar-icon-padding));
transform: translateX(100%);
opacity: 0;
transition: all 0.1s ease;
opacity: 0;
}
#identity-permission-box > *:not(#permissions-granted-icon) {
@@ -151,9 +172,9 @@
#identity-permission-box
),
#urlbar:hover #identity-icon-box {
opacity: 1;
opacity: 1 !important;
margin-inline-start: 0 !important;
transform: none;
transform: none !important;
display: flex;
#urlbar:not(:hover) & {
transition: 0;
@@ -165,7 +186,7 @@
}
#urlbar:not([open]) {
#identity-box {
#identity-box:not([pageproxystate='invalid']) {
order: 9;
}
}
@@ -301,7 +322,7 @@ button.popup-notification-dropmarker {
#urlbar .urlbar-page-action,
#urlbar #tracking-protection-icon-container,
#urlbar:not([breakout-extend='true']) #identity-box:is(:not(.chromeUI), [pageproxystate='invalid']) #identity-icon-box {
border-radius: 8px !important;
border-radius: var(--urlbar-icon-border-radius) !important;
}
/* Extensions or similar */
@@ -315,7 +336,7 @@ button.popup-notification-dropmarker {
background: transparent;
&[notificationside='top'] {
position: absolute;
position: fixed;
bottom: calc(var(--zen-element-separation) * 1.5);
right: calc(var(--zen-element-separation) * 1.5);
width: fit-content;
@@ -433,9 +454,8 @@ button.popup-notification-dropmarker {
font-size: 1.5em !important;
width: min(90%, 60rem) !important;
}
top: 50vh !important;
top: 25vh !important;
transform: translateX(-50%);
margin-top: -20%;
left: 50% !important;
#urlbar-container:has(&) {
@@ -444,6 +464,12 @@ button.popup-notification-dropmarker {
}
}
@media not (-moz-bool-pref: 'zen.urlbar.show-protections-icon') {
#tracking-protection-icon-container {
display: none !important;
}
}
/* Code ~~stolen~~ taken inspiration from https://github.com/greeeen-dev/zen-arc-cmd-bar
*
* MIT License

View File

@@ -24,10 +24,6 @@
list-style-image: url(chrome://browser/skin/zen-icons/forward.svg);
position: absolute;
bottom: 10%;
.button-icon {
filter: invert(1);
}
}
#zen-welcome-title {
@@ -58,6 +54,7 @@
width: 60%;
height: 60%;
box-shadow: var(--zen-big-shadow);
overflow: hidden;
/* Small screens */
@media (max-width: 1400px) {
@@ -89,13 +86,18 @@
width: 100%;
height: 100%;
opacity: 0;
color: var(--zen-primary-color);
fill: var(--zen-primary-color);
color: currentColor;
fill: currentColor;
-moz-context-properties: fill, fill-opacity;
background-image: url(chrome://browser/skin/zen-icons/essential-add.svg);
background-size: 15%;
background-repeat: no-repeat;
background-position: center;
}
&[animate-heart] {
overflow: hidden;
}
}
#zen-welcome-page-sidebar-buttons {
@@ -129,6 +131,7 @@
#zen-welcome-page-content {
background: light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1));
width: 60%;
max-width: 80rem;
height: 100%;
position: relative;
overflow: hidden;
@@ -205,7 +208,7 @@
#zen-welcome-initial-essentials-browser-sidebar-essentials {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 0.8rem;
gap: 0.4rem 1.2rem;
visibility: visible;
& * {
@@ -245,15 +248,10 @@
&[visuallyselected] {
transform: scale(1.04);
& .tab-background {
--zen-essential-bg-margin: 3px;
box-shadow: var(--zen-big-shadow);
}
}
& .tab-background::after {
filter: blur(30px) !important;
filter: blur(30px) brightness(1.2);
}
}
}

View File

@@ -9,6 +9,7 @@
justify-content: center;
align-items: center;
display: flex;
font-size: x-small;
position: relative;
@@ -16,98 +17,73 @@
display: none !important;
}
&:not([as-button='true']) {
--toolbarbutton-hover-background: transparent !important;
border-radius: var(--zen-button-border-radius) !important;
background: transparent;
padding: 2px;
appearance: unset !important;
height: fit-content;
gap: 3px;
--toolbarbutton-hover-background: transparent !important;
border-radius: var(--zen-button-border-radius) !important;
background: transparent;
padding: 2px;
appearance: unset !important;
height: fit-content;
gap: 3px;
& toolbarbutton {
margin: auto;
width: 25px;
display: flex;
justify-content: center;
padding: 0 !important;
align-items: center;
position: relative;
@media (-moz-bool-pref: 'zen.workspaces.hide-deactivated-workspaces') {
&:not([active='true']):not(:hover) {
&::after {
content: '';
position: absolute;
width: 4px;
border-radius: 99px;
height: 4px;
background: color-mix(
in srgb,
var(--zen-primary-color) 10%,
light-dark(rgba(0, 0, 0, 0.4), rgba(255, 255, 255, 0.4)) 90%
);
left: 50%;
top: 50%;
filter: saturate(140%) brightness(110%) !important;
transform: translate(-50%, -50%);
}
& .zen-workspace-icon {
display: none;
}
}
}
@media not (-moz-bool-pref: 'zen.workspaces.hide-deactivated-workspaces') {
& {
filter: grayscale(1);
opacity: 0.5;
transition:
filter 0.2s,
opacity 0.2s;
}
&[active='true'],
&:hover {
filter: grayscale(0);
opacity: 1;
}
&:hover {
background-color: var(--zen-toolbar-element-bg);
}
}
}
}
&[as-button='true'] {
border-radius: var(--tab-border-radius);
&:hover {
background: var(--toolbarbutton-hover-background);
}
}
&[as-button='true'] {
& toolbarbutton {
margin: auto;
padding: var(--toolbarbutton-inner-padding) !important;
width: calc(2 * var(--toolbarbutton-inner-padding) + 16px) !important;
height: calc(2 * var(--toolbarbutton-inner-padding) + 16px) !important;
border-radius: var(--tab-border-radius) !important;
width: 25px;
display: flex;
justify-content: center;
padding: 0 !important;
align-items: center;
position: relative;
:root:not([zen-sidebar-expanded='true']) #navigator-toolbox & {
& .zen-workspace-sidebar-name {
display: none;
}
@media (-moz-bool-pref: 'zen.workspaces.hide-deactivated-workspaces') {
&:not([active='true']):not(:hover) {
&::after {
content: '';
position: absolute;
width: 4px;
border-radius: 99px;
height: 4px;
background: color-mix(
in srgb,
var(--zen-primary-color) 10%,
light-dark(rgba(0, 0, 0, 0.4), rgba(255, 255, 255, 0.4)) 90%
);
left: 50%;
top: 50%;
filter: saturate(140%) brightness(110%) !important;
transform: translate(-50%, -50%);
}
& .zen-workspace-sidebar-icon {
margin-inline-end: 0 !important;
& .zen-workspace-icon {
display: none;
}
}
}
&:hover {
background: var(--toolbarbutton-hover-background) !important;
& .zen-workspace-icon[no-icon='true'] {
width: 6px;
height: 6px;
background: light-dark(rgba(0, 0, 0, 0.4), rgba(255, 255, 255, 0.4));
border-radius: 50%;
}
@media not (-moz-bool-pref: 'zen.workspaces.hide-deactivated-workspaces') {
& {
filter: grayscale(1);
opacity: 0.5;
transition:
filter 0.2s,
opacity 0.2s;
}
&[active='true'],
&:hover {
filter: grayscale(0);
opacity: 1;
}
&:hover {
background-color: var(--zen-toolbar-element-bg);
}
}
}
}
@@ -132,13 +108,6 @@
/** Keep these selectors in sync with the ones in vertical-tabs.css */
#navigator-toolbox {
& #zen-workspaces-button[as-button='true'] {
width: calc(100% - var(--toolbarbutton-outer-padding));
margin: 2px;
min-width: calc(2 * var(--toolbarbutton-inner-padding) + 16px);
height: calc(2 * var(--toolbarbutton-inner-padding) + 16px);
}
& #zen-workspaces-button .zen-workspace-sidebar-name {
display: block;
}
@@ -451,6 +420,7 @@
/* Mark workspaces indicator */
#zen-current-workspace-indicator-container {
position: relative;
margin-bottom: var(--zen-workspace-indicator-height);
}
@@ -464,6 +434,7 @@
align-items: center;
flex-direction: row !important;
max-width: 100%;
width: 100%;
&::before {
border-radius: var(--border-radius-medium);
@@ -488,6 +459,7 @@
& .zen-current-workspace-indicator-icon {
font-size: 12px;
line-height: 1;
}
.zen-current-workspace-indicator-name {
@@ -497,6 +469,7 @@
overflow: hidden;
text-overflow: ellipsis;
pointer-events: none;
font-size: small;
}
}

View File

@@ -0,0 +1,10 @@
diff --git a/browser/base/moz.build b/browser/base/moz.build
index 636e0841786735a63ddea00e819c0b6f0b8a5d4d..6685d857180944d68bf4f049919f81361084c481 100644
--- a/browser/base/moz.build
+++ b/browser/base/moz.build
@@ -87,3 +87,5 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] in ("windows", "gtk"):
DEFINES["MENUBAR_CAN_AUTOHIDE"] = 1
JAR_MANIFESTS += ["jar.mn"]
+
+DIRS += ["zen-components"]

View File

@@ -37,6 +37,17 @@ var gZenCompactModeManager = {
this.addMouseActions();
this.addContextMenu();
// Clear hover states when window state changes (minimize, maximize, etc.)
window.addEventListener('sizemodechange', () => this._clearAllHoverStates());
if (AppConstants.platform == 'macosx') {
window.addEventListener('mouseover', (event) => {
const buttons = gZenVerticalTabsManager.actualWindowButtons;
if (event.target.closest('.titlebar-buttonbox-container') === buttons) return;
buttons.removeAttribute('zen-has-hover');
});
}
},
get preference() {
@@ -69,7 +80,7 @@ var gZenCompactModeManager = {
},
get sidebarIsOnRight() {
if (this._sidebarIsOnRight) {
if (typeof this._sidebarIsOnRight !== 'undefined') {
return this._sidebarIsOnRight;
}
this._sidebarIsOnRight = Services.prefs.getBoolPref('zen.tabs.vertical.right-side');
@@ -141,10 +152,17 @@ var gZenCompactModeManager = {
this.animateCompactMode();
},
getAndApplySidebarWidth() {
// NOTE: Dont actually use event, it's just so we make sure
// the caller is from the ResizeObserver
getAndApplySidebarWidth(event = undefined) {
let sidebarWidth = this.sidebar.getBoundingClientRect().width;
if (sidebarWidth > 1) {
gZenUIManager.restoreScrollbarState();
// Second variable to get the genuine width of the sidebar
this.sidebar.style.setProperty('--actual-zen-sidebar-width', `${sidebarWidth}px`);
if (event && this.preference) {
return;
}
this.sidebar.style.setProperty('--zen-sidebar-width', `${sidebarWidth}px`);
}
return sidebarWidth;
@@ -158,10 +176,15 @@ var gZenCompactModeManager = {
const canAnimate =
lazyCompactMode.COMPACT_MODE_CAN_ANIMATE_SIDEBAR &&
!this.sidebar.hasAttribute('zen-user-show') &&
!this.sidebar.hasAttribute('zen-has-empty-tab') &&
!this.sidebar.hasAttribute('zen-has-hover');
// Do this so we can get the correct width ONCE compact mode styled have been applied
const titlebar = this.sidebar.querySelector('#titlebar');
if (canAnimate) {
this.sidebar.setAttribute('animate', 'true');
titlebar.setAttribute('has-animated-padding', 'true');
} else {
titlebar.removeAttribute('has-animated-padding');
}
this.sidebar.style.removeProperty('margin-right');
this.sidebar.style.removeProperty('margin-left');
@@ -190,14 +213,19 @@ var gZenCompactModeManager = {
}
)
.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(() => {
this._animating = false;
this.sidebar.style.removeProperty('transition');
window.requestAnimationFrame(() => {
this.sidebar.style.transition = 'none';
this.sidebar.removeAttribute('animate');
this.sidebar.style.visibility = 'hidden';
this.sidebar.style.removeProperty('margin-right');
this.sidebar.style.removeProperty('margin-left');
this.sidebar.style.removeProperty('transform');
setTimeout(() => {
this._animating = false;
this.sidebar.style.removeProperty('visibility');
this.sidebar.style.removeProperty('transition');
this.sidebar.style.removeProperty('opacity');
}, 300);
});
});
} else if (canHideSidebar && !isCompactMode) {
@@ -306,9 +334,6 @@ var gZenCompactModeManager = {
{
element: gZenVerticalTabsManager.actualWindowButtons,
},
{
element: gZenVerticalTabsManager.actualWindowButtons,
},
];
},
@@ -320,9 +345,9 @@ var gZenCompactModeManager = {
},
flashElement(element, duration, id, attrName = 'flash-popup') {
if (element.matches(':hover')) {
return;
}
//if (element.matches(':hover')) {
// return;
//}
if (this._flashTimeouts[id]) {
clearTimeout(this._flashTimeouts[id]);
} else {
@@ -344,14 +369,15 @@ var gZenCompactModeManager = {
addMouseActions() {
for (let i = 0; i < this.hoverableElements.length; i++) {
let target = this.hoverableElements[i].element;
target.addEventListener('mouseenter', (event) => {
if (!event.target.matches(':hover')) return;
const onEnter = (event) => {
if (event.type === 'mouseenter' && !event.target.matches(':hover')) return;
// Dont register the hover if the urlbar is floating and we are hovering over it
if (event.target.querySelector('#urlbar[zen-floating-urlbar]')) return;
this.clearFlashTimeout('has-hover' + target.id);
window.requestAnimationFrame(() => target.setAttribute('zen-has-hover', 'true'));
});
};
target.addEventListener('mouseleave', (event) => {
// If on Mac, ignore mouseleave in the area of window buttons
const onLeave = (event) => {
if (AppConstants.platform == 'macosx') {
const buttonRect = gZenVerticalTabsManager.actualWindowButtons.getBoundingClientRect();
const MAC_WINDOW_BUTTONS_X_BORDER = buttonRect.width + buttonRect.x;
@@ -366,6 +392,12 @@ var gZenCompactModeManager = {
}
}
// When moving the cursor between the url bar and bookmarks, or in-between bookmarks in the bookmark bar, the
// mouseLeave event is triggered without a relatedTarget.
if (event.relatedTarget == null) {
return;
}
// If it's a child element but not the target, ignore the event
if (target.contains(event.explicitOriginalTarget) && event.explicitOriginalTarget !== target) {
return;
@@ -376,7 +408,13 @@ var gZenCompactModeManager = {
} else {
this._removeHoverFrames[target.id] = window.requestAnimationFrame(() => target.removeAttribute('zen-has-hover'));
}
});
};
target.addEventListener('mouseenter', onEnter);
target.addEventListener('dragover', onEnter);
target.addEventListener('mouseleave', onLeave);
target.addEventListener('dragleave', onLeave);
}
document.documentElement.addEventListener('mouseleave', (event) => {
@@ -425,4 +463,15 @@ var gZenCompactModeManager = {
let toolbar = document.getElementById('zen-appcontent-navbar-container');
toolbar.toggleAttribute('zen-user-show');
},
_clearAllHoverStates() {
// Clear hover attributes from all hoverable elements
for (let entry of this.hoverableElements) {
const target = entry.element;
if (target && !target.matches(':hover') && target.hasAttribute('zen-has-hover')) {
target.removeAttribute('zen-has-hover');
this.clearFlashTimeout('has-hover' + target.id);
}
}
},
};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,102 @@
{
class ZenFolders {
constructor() {
this.#initEventListeners();
}
#initEventListeners() {
document.addEventListener('TabGrouped', this.#onTabGrouped.bind(this));
document.addEventListener('TabUngrouped', this.#onTabUngrouped.bind(this));
document.addEventListener('TabGroupRemoved', this.#onTabGroupRemoved.bind(this));
document.addEventListener('TabGroupCreate', this.#onTabGroupCreate.bind(this));
}
#onTabGrouped(event) {
const tab = event.target;
const group = tab.group;
group.pinned = tab.pinned;
if (group.hasAttribute('split-view-group') && group.hasAttribute('zen-pinned-changed')) {
// zen-pinned-changed remove it and set it to had-zen-pinned-changed to keep
// track of the original pinned state
group.removeAttribute('zen-pinned-changed');
group.setAttribute('had-zen-pinned-changed', true);
}
}
#onTabUngrouped(event) {
const tab = event.target;
const group = event.detail;
if (group.hasAttribute('split-view-group') && tab.hasAttribute('had-zen-pinned-changed')) {
tab.setAttribute('zen-pinned-changed', true);
tab.removeAttribute('had-zen-pinned-changed');
}
}
#onTabGroupCreate(event) {
const group = event.target;
const tabs = group.tabs;
if (!group.pinned) {
return;
}
for (const tab of tabs) {
if (tab.hasAttribute('zen-pinned-changed')) {
tab.removeAttribute('zen-pinned-changed');
tab.setAttribute('had-zen-pinned-changed', true);
}
}
}
#onTabGroupRemoved(event) {}
expandGroupTabs(group) {
for (const tab of group.tabs.reverse()) {
gBrowser.ungroupTab(tab);
}
}
handleTabPin(tab) {
const group = tab.group;
if (!group) {
return false;
}
if (group.hasAttribute('split-view-group') && !this._piningFolder) {
this._piningFolder = true;
for (const otherTab of group.tabs) {
if (tab === otherTab) {
continue;
}
gBrowser.pinTab(otherTab);
}
this._piningFolder = false;
gBrowser.verticalPinnedTabsContainer.insertBefore(group, gBrowser.verticalPinnedTabsContainer.lastChild);
gBrowser.tabContainer._invalidateCachedTabs();
return true;
}
return this._piningFolder;
}
handleTabUnpin(tab) {
const group = tab.group;
if (!group) {
return false;
}
if (group.hasAttribute('split-view-group') && !this._piningFolder) {
this._piningFolder = true;
for (const otherTab of group.tabs) {
if (tab === otherTab) {
continue;
}
gBrowser.unpinTab(otherTab);
}
this._piningFolder = false;
ZenWorkspaces.activeWorkspaceStrip.prepend(group);
gBrowser.tabContainer._invalidateCachedTabs();
return true;
}
return this._piningFolder;
}
}
window.gZenFolders = new ZenFolders();
}

View File

@@ -6,8 +6,9 @@
#glances = new Map();
#currentGlanceID = null;
#confirmationTimeout = null;
init() {
window.addEventListener('keydown', this.onKeyDown.bind(this));
window.addEventListener('TabClose', this.onTabClose.bind(this));
window.addEventListener('TabSelect', this.onLocationChange.bind(this));
@@ -37,14 +38,6 @@
return this.#glances.get(this.#currentGlanceID)?.parentTab;
}
onKeyDown(event) {
if (event.key === 'Escape' && this.#currentGlanceID) {
event.preventDefault();
event.stopPropagation();
this.closeGlance({ onTabClose: true });
}
}
onOverlayClick(event) {
if (event.target === this.overlay && event.originalTarget !== this.contentWrapper) {
this.closeGlance({ onTabClose: true });
@@ -67,7 +60,7 @@
}
getTabPosition(tab) {
return Math.max(gBrowser._numVisiblePinTabs, tab._tPos);
return Math.max(gBrowser.pinnedTabCount, tab._tPos);
}
createBrowserElement(url, currentTab, existingTab = null) {
@@ -76,7 +69,7 @@
skipBackgroundNotify: true,
insertTab: true,
skipLoad: false,
index: this.getTabPosition(currentTab),
index: this.getTabPosition(currentTab) + 1,
};
currentTab._selected = true;
const newUUID = gZenUIManager.generateUuidv4();
@@ -213,11 +206,26 @@
});
}
closeGlance({ noAnimation = false, onTabClose = false, setNewID = null, isDifferent = false } = {}) {
closeGlance({ noAnimation = false, onTabClose = false, setNewID = null, isDifferent = false, hasFocused = false } = {}) {
if (this._animating || !this.#currentBrowser || this.animatingOpen || this._duringOpening) {
return;
}
let { permitUnload } = this.#currentBrowser.permitUnload();
if (!permitUnload) {
return;
}
if (onTabClose && hasFocused && !this.#confirmationTimeout) {
const cancelButton = document.getElementById('zen-glance-sidebar-close');
cancelButton.setAttribute('waitconfirmation', true);
this.#confirmationTimeout = setTimeout(() => {
cancelButton.removeAttribute('waitconfirmation');
this.#confirmationTimeout = null;
}, 3000);
return;
}
this.browserWrapper.removeAttribute('has-finished-animation');
if (noAnimation) {
this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').removeAttribute('style');
@@ -264,14 +272,15 @@
.then(() => {
this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').removeAttribute('style');
});
this.browserWrapper.style.opacity = 1;
gZenUIManager.motion
.animate(
this.browserWrapper,
{
...originalPosition,
opacity: 0.3,
opacity: 0,
},
{ type: 'spring', bounce: 0, duration: 0.4, easing: 'ease' }
{ type: 'spring', bounce: 0, duration: 0.5, easing: 'ease-in' }
)
.then(() => {
this.browserWrapper.removeAttribute('animate');
@@ -296,7 +305,6 @@
}
// reset everything
const prevOverlay = this.overlay;
this.browserWrapper = null;
this.overlay = null;
this.contentWrapper = null;
@@ -308,7 +316,7 @@
gBrowser.selectedTab = this.#currentParentTab;
}
this._ignoreClose = true;
gBrowser.removeTab(this.lastCurrentTab, { animate: true });
gBrowser.removeTab(this.lastCurrentTab, { animate: true, skipPermitUnload: true });
gBrowser.tabContainer._invalidateCachedTabs();
this.#currentParentTab.removeAttribute('glance-id');
@@ -394,9 +402,18 @@
}
}
// note: must be async to avoid timing issues
clearConfirmationTimeout() {
if (this.#confirmationTimeout) {
clearTimeout(this.#confirmationTimeout);
this.#confirmationTimeout = null;
}
document.getElementById('zen-glance-sidebar-close')?.removeAttribute('waitconfirmation');
}
// note: must be sync to avoid timing issues
onLocationChange(event) {
const tab = event.target;
this.clearConfirmationTimeout();
if (this.animatingFullOpen || this.closingGlance) {
return;
}
@@ -464,7 +481,6 @@
owner &&
owner.pinned &&
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)
@@ -478,7 +494,12 @@
}
try {
if (this.shouldOpenTabInGlance(tab, uri)) {
this.openGlance({ url: undefined, x: 0, y: 0, width: 0, height: 0 }, tab, tab.owner);
const browserRect = gBrowser.tabbox.getBoundingClientRect();
this.openGlance(
{ url: undefined, x: browserRect.width / 2, y: browserRect.height / 2, width: 0, height: 0 },
tab,
tab.owner
);
}
} catch (e) {
console.error(e);
@@ -578,8 +599,12 @@
esModuleURI: 'chrome://browser/content/zen-components/actors/ZenGlanceChild.sys.mjs',
events: {
DOMContentLoaded: {},
keydown: {
capture: true,
},
},
},
allFrames: true,
matches: ['https://*/*'],
});
}

View File

@@ -863,7 +863,7 @@
getToolbarModifiedBase() {
return this.isDarkMode
? 'color-mix(in srgb, var(--zen-themed-toolbar-bg) 80%, #fff 20%)'
: 'color-mix(in srgb, var(--zen-themed-toolbar-bg) 95%, #000 5%)';
: 'color-mix(in srgb, var(--zen-themed-toolbar-bg) 95%, #000 6%)';
}
getSingleRGBColor(color, forToolbar = false) {
@@ -882,8 +882,14 @@
return forToolbar ? 'var(--zen-themed-toolbar-bg)' : 'var(--zen-themed-toolbar-bg-transparent)';
} else if (themedColors.length === 1) {
return this.getSingleRGBColor(themedColors[0], forToolbar);
} else if (themedColors.length !== 3) {
return `linear-gradient(${this.currentRotation}deg, ${themedColors.map((color) => this.getSingleRGBColor(color, forToolbar)).join(', ')})`;
} else {
let color1 = this.getSingleRGBColor(themedColors[2], forToolbar);
let color2 = this.getSingleRGBColor(themedColors[0], forToolbar);
let color3 = this.getSingleRGBColor(themedColors[1], forToolbar);
return `linear-gradient(${this.currentRotation}deg, ${color1}, ${color2}, ${color3})`;
}
return `linear-gradient(${this.currentRotation}deg, ${themedColors.map((color) => this.getSingleRGBColor(color, forToolbar)).join(', ')})`;
}
static getTheme(colors = [], opacity = 0.5, rotation = -45, texture = 0) {

View File

@@ -0,0 +1,480 @@
class ZenMediaController {
_currentMediaController = null;
_currentBrowser = null;
_mediaUpdateInterval = null;
mediaTitle = null;
mediaArtist = null;
mediaControlBar = null;
mediaProgressBar = null;
mediaCurrentTime = null;
mediaDuration = null;
mediaFocusButton = null;
mediaProgressBarContainer = null;
supportedKeys = ['playpause', 'previoustrack', 'nexttrack'];
pipEligibilityMap = new Map();
mediaControllersMap = new Map();
_tabTimeout = null;
_controllerSwitchTimeout = null;
init() {
this.mediaTitle = document.querySelector('#zen-media-title');
this.mediaArtist = document.querySelector('#zen-media-artist');
this.mediaControlBar = document.querySelector('#zen-media-controls-toolbar');
this.mediaProgressBar = document.querySelector('#zen-media-progress-bar');
this.mediaCurrentTime = document.querySelector('#zen-media-current-time');
this.mediaDuration = document.querySelector('#zen-media-duration');
this.mediaFocusButton = document.querySelector('#zen-media-focus-button');
this.mediaProgressBarContainer = document.querySelector('#zen-media-progress-hbox');
this.onPositionstateChange = this._onPositionstateChange.bind(this);
this.onPlaybackstateChange = this._onPlaybackstateChange.bind(this);
this.onSupportedKeysChange = this._onSupportedKeysChange.bind(this);
this.onMetadataChange = this._onMetadataChange.bind(this);
this.onDeactivated = this._onDeactivated.bind(this);
this.onPipModeChange = this._onPictureInPictureModeChange.bind(this);
window.addEventListener('TabSelect', (event) => {
const linkedBrowser = event.target.linkedBrowser;
this.switchController();
if (this._currentBrowser) {
if (linkedBrowser.browserId === this._currentBrowser.browserId) {
if (this._tabTimeout) {
clearTimeout(this._tabTimeout);
this._tabTimeout = null;
}
this.hideMediaControls();
} else {
this._tabTimeout = setTimeout(() => {
if (!this.mediaControlBar.hasAttribute('pip')) this.showMediaControls();
else this._tabTimeout = null;
}, 500);
}
}
});
window.addEventListener('TabClose', (event) => {
const linkedBrowser = event.target.linkedBrowser;
if (!linkedBrowser?.browsingContext?.mediaController) return;
this.deinitMediaController(
linkedBrowser.browsingContext.mediaController,
true,
linkedBrowser.browserId === this._currentBrowser?.browserId,
true
);
});
window.addEventListener('DOMAudioPlaybackStarted', (event) => {
setTimeout(() => {
if (
this._currentMediaController?.isPlaying &&
this.mediaControlBar.hasAttribute('hidden') &&
!this.mediaControlBar.hasAttribute('pip')
) {
const { selectedBrowser } = gBrowser;
if (selectedBrowser.browserId !== this._currentBrowser.browserId) {
this.showMediaControls();
}
}
}, 1000);
this.activateMediaControls(event.target.browsingContext.mediaController, event.target);
});
window.addEventListener('DOMAudioPlaybackStopped', () => this.updateMuteState());
}
async deinitMediaController(mediaController, shouldForget = true, shouldOverride = true, shouldHide = true) {
if (!mediaController) return;
const retrievedMediaController = this.mediaControllersMap.get(mediaController.id);
if (shouldForget) {
mediaController.removeEventListener('pictureinpicturemodechange', this.onPipModeChange);
mediaController.removeEventListener('positionstatechange', this.onPositionstateChange);
mediaController.removeEventListener('playbackstatechange', this.onPlaybackstateChange);
mediaController.removeEventListener('supportedkeyschange', this.onSupportedKeysChange);
mediaController.removeEventListener('metadatachange', this.onMetadataChange);
mediaController.removeEventListener('deactivated', this.onDeactivated);
this.mediaControllersMap.delete(mediaController.id);
this.pipEligibilityMap.delete(retrievedMediaController?.browser?.browserId);
}
if (shouldOverride) {
this._currentMediaController = null;
this._currentBrowser = null;
if (this._mediaUpdateInterval) {
clearInterval(this._mediaUpdateInterval);
this._mediaUpdateInterval = null;
}
if (shouldHide) await this.hideMediaControls();
this.mediaControlBar.removeAttribute('muted');
this.mediaControlBar.classList.remove('playing');
}
}
hideMediaControls() {
if (this.mediaControlBar.hasAttribute('hidden')) return;
return gZenUIManager.motion
.animate(
this.mediaControlBar,
{
opacity: [1, 0],
y: [0, 10],
},
{
duration: 0.1,
}
)
.then(() => {
this.mediaControlBar.setAttribute('hidden', 'true');
gZenUIManager.updateTabsToolbar();
});
}
showMediaControls() {
if (this._currentMediaController.isBeingUsedInPIPModeOrFullscreen) return this.hideMediaControls();
if (!this.mediaControlBar.hasAttribute('hidden')) return;
this.updatePipButton();
const mediaInfoElements = [this.mediaTitle, this.mediaArtist];
for (const element of mediaInfoElements) {
element.removeAttribute('overflow'); // So we can properly recalculate the overflow
}
this.mediaControlBar.removeAttribute('hidden');
window.requestAnimationFrame(() => {
this.mediaControlBar.style.height =
this.mediaControlBar.querySelector('toolbaritem').getBoundingClientRect().height + 'px';
this.mediaControlBar.style.opacity = 0;
gZenUIManager.updateTabsToolbar();
gZenUIManager.motion.animate(
this.mediaControlBar,
{
opacity: [0, 1],
y: [10, 0],
},
{}
);
this.addLabelOverflows(mediaInfoElements);
});
}
addLabelOverflows(elements) {
for (const element of elements) {
const parent = element.parentElement;
if (element.scrollWidth > parent.clientWidth) {
element.setAttribute('overflow', '');
} else {
element.removeAttribute('overflow');
}
}
}
setupMediaController(mediaController, browser) {
this._currentMediaController = mediaController;
this._currentBrowser = browser;
this.updatePipButton();
const positionState = mediaController.getPositionState();
this.mediaControllersMap.set(mediaController.id, {
controller: mediaController,
browser,
position: positionState.position,
duration: positionState.duration,
lastUpdated: Date.now(),
});
}
setupMediaControlUI(metadata, positionState) {
this.updatePipButton();
if (!this.mediaControlBar.classList.contains('playing') && this._currentMediaController.isPlaying) {
this.mediaControlBar.classList.add('playing');
}
const iconURL = this._currentBrowser.mIconURL || `page-icon:${this._currentBrowser.currentURI.spec}`;
this.mediaFocusButton.style.listStyleImage = `url(${iconURL})`;
this.mediaTitle.textContent = metadata.title || '';
this.mediaArtist.textContent = metadata.artist || '';
gZenUIManager.updateTabsToolbar();
this._currentPosition = positionState.position;
this._currentDuration = positionState.duration;
this.updateMediaPosition();
for (const key of this.supportedKeys) {
const button = this.mediaControlBar.querySelector(`#zen-media-${key}-button`);
button.disabled = !this._currentMediaController.supportedKeys.includes(key);
}
}
activateMediaControls(mediaController, browser) {
this.updateMuteState();
this.switchController();
if (!mediaController.isActive || this._currentBrowser?.browserId === browser.browserId) return;
const metadata = mediaController.getMetadata();
const positionState = mediaController.getPositionState();
this.mediaControllersMap.set(mediaController.id, {
controller: mediaController,
browser,
position: positionState.position,
duration: positionState.duration,
lastUpdated: Date.now(),
});
if (!this._currentBrowser) {
this.setupMediaController(mediaController, browser);
this.setupMediaControlUI(metadata, positionState);
}
mediaController.addEventListener('pictureinpicturemodechange', this.onPipModeChange);
mediaController.addEventListener('positionstatechange', this.onPositionstateChange);
mediaController.addEventListener('playbackstatechange', this.onPlaybackstateChange);
mediaController.addEventListener('supportedkeyschange', this.onSupportedKeysChange);
mediaController.addEventListener('metadatachange', this.onMetadataChange);
mediaController.addEventListener('deactivated', this.onDeactivated);
}
updatePipEligibility(browser, isEligible) {
this.pipEligibilityMap.set(browser.browserId, isEligible);
}
_onDeactivated(event) {
this.deinitMediaController(event.target, true, event.target.id === this._currentMediaController.id, true);
this.switchController();
}
_onPlaybackstateChange() {
if (this._currentMediaController?.isPlaying) {
this.mediaControlBar.classList.add('playing');
} else {
this.switchController();
this.mediaControlBar.classList.remove('playing');
}
}
_onSupportedKeysChange(event) {
if (event.target.id !== this._currentMediaController?.id) return;
for (const key of this.supportedKeys) {
const button = this.mediaControlBar.querySelector(`#zen-media-${key}-button`);
button.disabled = !event.target.supportedKeys.includes(key);
}
}
_onPositionstateChange(event) {
if (event.target.id !== this._currentMediaController?.id) {
const mediaController = this.mediaControllersMap.get(event.target.id);
this.mediaControllersMap.set(event.target.id, {
...mediaController,
position: event.position,
duration: event.duration,
lastUpdated: Date.now(),
});
}
this._currentPosition = event.position;
this._currentDuration = event.duration;
this.updateMediaPosition();
}
switchController(force = false) {
let timeout = 3000;
if (this._controllerSwitchTimeout) {
clearTimeout(this._controllerSwitchTimeout);
this._controllerSwitchTimeout = null;
}
if (this.mediaControllersMap.size === 1) timeout = 0;
this._controllerSwitchTimeout = setTimeout(() => {
if (!this._currentMediaController?.isPlaying || force) {
const nextController = Array.from(this.mediaControllersMap.values())
.filter(
(ctrl) =>
ctrl.controller.isPlaying &&
gBrowser.selectedBrowser.browserId !== ctrl.browser.browserId &&
ctrl.controller.id !== this._currentMediaController?.id
)
.sort((a, b) => b.lastUpdated - a.lastUpdated)
.shift();
if (nextController) {
this.deinitMediaController(this._currentMediaController, false, true).then(() => {
this.setupMediaController(nextController.controller, nextController.browser);
const elapsedTime = Math.floor((Date.now() - nextController.lastUpdated) / 1000);
this.setupMediaControlUI(nextController.controller.getMetadata(), {
position: nextController.position + (nextController.controller.isPlaying ? elapsedTime : 0),
duration: nextController.duration,
});
this.showMediaControls();
});
}
}
this._controllerSwitchTimeout = null;
}, timeout);
}
updateMediaPosition() {
if (this._mediaUpdateInterval) {
clearInterval(this._mediaUpdateInterval);
this._mediaUpdateInterval = null;
}
if (this._currentDuration >= 900_000) return this.mediaControlBar.setAttribute('media-position-hidden', 'true');
else this.mediaControlBar.removeAttribute('media-position-hidden');
if (!this._currentDuration) return;
this.mediaCurrentTime.textContent = this.formatSecondsToTime(this._currentPosition);
this.mediaDuration.textContent = this.formatSecondsToTime(this._currentDuration);
this.mediaProgressBar.value = (this._currentPosition / this._currentDuration) * 100;
this._mediaUpdateInterval = setInterval(() => {
if (this._currentMediaController?.isPlaying) {
this._currentPosition += 1;
if (this._currentPosition > this._currentDuration) {
this._currentPosition = this._currentDuration;
}
this.mediaCurrentTime.textContent = this.formatSecondsToTime(this._currentPosition);
this.mediaProgressBar.value = (this._currentPosition / this._currentDuration) * 100;
} else {
clearInterval(this._mediaUpdateInterval);
this._mediaUpdateInterval = null;
}
}, 1000);
}
formatSecondsToTime(seconds) {
if (!seconds || isNaN(seconds)) return '0:00';
const totalSeconds = Math.max(0, Math.ceil(seconds));
const hours = Math.floor(totalSeconds / 3600);
const minutes = Math.floor((totalSeconds % 3600) / 60).toString();
const secs = (totalSeconds % 60).toString();
if (hours > 0) {
return `${hours}:${minutes.padStart(2, '0')}:${secs.padStart(2, '0')}`;
}
return `${minutes}:${secs.padStart(2, '0')}`;
}
_onMetadataChange(event) {
if (event.target.id !== this._currentMediaController?.id) return;
this.updatePipButton();
const metadata = event.target.getMetadata();
this.mediaTitle.textContent = metadata.title || '';
this.mediaArtist.textContent = metadata.artist || '';
}
_onPictureInPictureModeChange(event) {
if (event.target.id !== this._currentMediaController?.id) return;
if (event.target.isBeingUsedInPIPModeOrFullscreen) {
this.hideMediaControls();
this.mediaControlBar.setAttribute('pip', '');
} else {
const { selectedBrowser } = gBrowser;
if (selectedBrowser.browserId !== this._currentBrowser.browserId) {
this.showMediaControls();
}
this.mediaControlBar.removeAttribute('pip');
}
}
onMediaPlayPrev() {
if (this._currentMediaController?.supportedKeys.includes('previoustrack')) {
this._currentMediaController.prevTrack();
}
}
onMediaPlayNext() {
if (this._currentMediaController?.supportedKeys.includes('nexttrack')) {
this._currentMediaController.nextTrack();
}
}
onMediaSeekDrag(event) {
this._currentMediaController?.pause();
const newTime = (event.target.value / 100) * this._currentDuration;
this.mediaCurrentTime.textContent = this.formatSecondsToTime(newTime);
}
onMediaSeekComplete(event) {
const newPosition = (event.target.value / 100) * this._currentDuration;
if (this._currentMediaController?.supportedKeys.includes('seekto')) {
this._currentMediaController.seekTo(newPosition);
this._currentMediaController.play();
}
}
onMediaFocus() {
this._currentMediaController?.focus();
}
onMediaMute() {
if (!this.mediaControlBar.hasAttribute('muted')) {
this._currentBrowser.mute();
this.mediaControlBar.setAttribute('muted', '');
} else {
this._currentBrowser.unmute();
this.mediaControlBar.removeAttribute('muted');
}
}
onMediaToggle() {
if (this.mediaControlBar.classList.contains('playing')) {
this._currentMediaController?.pause();
} else {
this._currentMediaController?.play();
}
}
onControllerClose() {
this._currentMediaController?.pause();
this.switchController(true);
this.deinitMediaController(this._currentMediaController);
}
onMediaPip() {
this._currentBrowser.browsingContext.currentWindowGlobal
.getActor('PictureInPictureLauncher')
.sendAsyncMessage('PictureInPicture:KeyToggle');
}
updateMuteState() {
if (!this._currentBrowser) return;
if (this._currentBrowser._audioMuted) {
this.mediaControlBar.setAttribute('muted', '');
} else {
this.mediaControlBar.removeAttribute('muted');
}
}
updatePipButton() {
const isPipEligible = this.pipEligibilityMap.get(this._currentBrowser.browserId);
if (isPipEligible) this.mediaControlBar.setAttribute('can-pip', '');
else this.mediaControlBar.removeAttribute('can-pip');
}
}
window.gZenMediaController = new ZenMediaController();

View File

@@ -94,7 +94,7 @@
//const pin = this._pinsCache.find((pin) => pin.uuid === tab.getAttribute('zen-pin-id'));
//if (pin) {
// pin.iconUrl = iconUrl;
// ZenPinnedTabsStorage.savePin(pin);
// this.savePin(pin);
//}
}
@@ -211,8 +211,9 @@
continue;
}
if (pin.title && pin.editedTitle) {
gBrowser._setTabLabel(tab, pin.title);
if (pin.title && (pin.editedTitle || tab.hasAttribute('zen-has-static-label'))) {
tab.removeAttribute('zen-has-static-label'); // So we can set it again
gBrowser._setTabLabel(tab, pin.title, { beforeTabOpen: true });
tab.setAttribute('zen-has-static-label', 'true');
}
}
@@ -288,6 +289,8 @@
if (container) {
container.insertBefore(newTab, container.lastChild);
}
} else {
document.getElementById('zen-essentials-container').appendChild(newTab);
}
gBrowser.tabContainer._invalidateCachedTabs();
newTab.initialize();
@@ -337,13 +340,13 @@
tab.position = tab._tPos;
for (let otherTab of gBrowser.tabs) {
if (otherTab.pinned && otherTab._tPos > tab.position) {
if (otherTab.pinned && otherTab.getAttribute('zen-pin-id') !== tab.getAttribute('zen-pin-id')) {
const actualPin = this._pinsCache.find((pin) => pin.uuid === otherTab.getAttribute('zen-pin-id'));
if (!actualPin) {
continue;
}
actualPin.position = otherTab._tPos;
await ZenPinnedTabsStorage.savePin(actualPin, false);
await this.savePin(actualPin, false);
}
}
@@ -353,7 +356,15 @@
return;
}
actualPin.position = tab.position;
await ZenPinnedTabsStorage.savePin(actualPin);
actualPin.isEssential = tab.hasAttribute('zen-essential');
// There was a bug where the title and hasStaticLabel attribute were not being set
// This is a workaround to fix that
if (tab.hasAttribute('zen-has-static-label')) {
actualPin.editedTitle = true;
actualPin.title = tab.label;
}
await this.savePin(actualPin);
}
_onTabClick(e) {
@@ -396,7 +407,7 @@
pin.workspaceUuid = tab.getAttribute('zen-workspace-id');
pin.userContextId = userContextId ? parseInt(userContextId, 10) : 0;
await ZenPinnedTabsStorage.savePin(pin);
await this.savePin(pin);
this.resetPinChangedUrl(tab);
await this._refreshPinnedTabs();
gZenUIManager.showToast('zen-pinned-tab-replaced');
@@ -419,7 +430,7 @@
entry = JSON.parse(tab.getAttribute('zen-pinned-entry'));
}
await ZenPinnedTabsStorage.savePin({
await this.savePin({
uuid,
title: entry?.title || tab.label || browser.contentTitle,
url: entry?.url || browser.currentURI.spec,
@@ -455,6 +466,7 @@
if (!isClosing) {
tab.removeAttribute('zen-pin-id');
tab.removeAttribute('zen-essential'); // Just in case
if (!tab.hasAttribute('zen-workspace-id') && ZenWorkspaces.workspaceEnabled) {
const workspace = await ZenWorkspaces.getActiveWorkspace();
@@ -472,6 +484,15 @@
}
}
async savePin(pin, notifyObservers = true) {
await ZenPinnedTabsStorage.savePin(pin, notifyObservers);
// Update the cache
const existingPin = this._pinsCache.find((p) => p.uuid === pin.uuid);
if (existingPin) {
Object.assign(existingPin, pin);
}
}
_onCloseTabShortcut(event, selectedTab = gBrowser.selectedTab, behavior = lazy.zenPinnedTabCloseShortcutBehavior) {
if (!selectedTab?.pinned) {
return;
@@ -588,7 +609,14 @@
}
addToEssentials(tab) {
const tabs = tab ? [tab] : TabContextMenu.contextTab.multiselected ? gBrowser.selectedTabs : [TabContextMenu.contextTab];
const tabs = tab
? // if it's already an array, dont make it [tab]
tab?.length
? tab
: [tab]
: TabContextMenu.contextTab.multiselected
? gBrowser.selectedTabs
: [TabContextMenu.contextTab];
for (let i = 0; i < tabs.length; i++) {
const tab = tabs[i];
if (tab.hasAttribute('zen-essential')) {
@@ -602,15 +630,15 @@
const pin = this._pinsCache.find((pin) => pin.uuid === tab.getAttribute('zen-pin-id'));
if (pin) {
pin.isEssential = true;
ZenPinnedTabsStorage.savePin(pin);
this.savePin(pin);
}
document.getElementById('zen-essentials-container').appendChild(tab);
gBrowser.tabContainer._invalidateCachedTabs();
} else {
gBrowser.pinTab(tab);
}
this.onTabIconChanged(tab);
this._onTabMove(tab);
this.onTabIconChanged(tab);
}
gZenUIManager.updateTabsToolbar();
}
@@ -620,8 +648,8 @@
for (let i = 0; i < tabs.length; i++) {
const tab = tabs[i];
tab.removeAttribute('zen-essential');
if (ZenWorkspaces.workspaceEnabled && ZenWorkspaces.getActiveWorkspaceFromCache.uuid) {
tab.setAttribute('zen-workspace-id', ZenWorkspaces.getActiveWorkspaceFromCache.uuid);
if (ZenWorkspaces.workspaceEnabled && ZenWorkspaces.getActiveWorkspaceFromCache().uuid) {
tab.setAttribute('zen-workspace-id', ZenWorkspaces.getActiveWorkspaceFromCache().uuid);
}
if (unpin) {
gBrowser.unpinTab(tab);
@@ -689,72 +717,77 @@
}
moveToAnotherTabContainerIfNecessary(event, movingTabs) {
const pinnedTabsTarget =
event.target.closest('#vertical-pinned-tabs-container') || event.target.closest('.zen-current-workspace-indicator');
const essentialTabsTarget = event.target.closest('#zen-essentials-container');
const tabsTarget = event.target.closest('#tabbrowser-arrowscrollbox');
try {
const pinnedTabsTarget =
event.target.closest('#vertical-pinned-tabs-container') || event.target.closest('.zen-current-workspace-indicator');
const essentialTabsTarget = event.target.closest('#zen-essentials-container');
const tabsTarget = event.target.closest('#tabbrowser-arrowscrollbox');
let isVertical = this.expandedSidebarMode;
let moved = false;
for (const draggedTab of movingTabs) {
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, false);
moved = true;
}
}
// Check for essentials container
else if (essentialTabsTarget) {
if (!draggedTab.hasAttribute('zen-essential')) {
this.addToEssentials(draggedTab);
moved = true;
isVertical = false;
}
}
// Check for normal tabs container
else if (tabsTarget || event.target.id === 'zen-tabs-wrapper') {
if (draggedTab.pinned && !draggedTab.hasAttribute('zen-essential')) {
gBrowser.unpinTab(draggedTab);
moved = true;
isRegularTabs = true;
} else if (draggedTab.hasAttribute('zen-essential')) {
this.removeEssentials(draggedTab);
moved = true;
isRegularTabs = true;
}
}
// If the tab was moved, adjust its position relative to the target tab
if (moved) {
const targetTab = event.target.closest('.tabbrowser-tab');
if (targetTab) {
const rect = targetTab.getBoundingClientRect();
let newIndex = targetTab._tPos;
if (isVertical) {
const middleY = targetTab.screenY + rect.height / 2;
if (!isRegularTabs && event.screenY > middleY) {
newIndex++;
} else if (isRegularTabs && event.screenY < middleY) {
newIndex--;
}
} else {
const middleX = targetTab.screenX + rect.width / 2;
if (event.screenX > middleX) {
newIndex++;
}
let isVertical = this.expandedSidebarMode;
let moved = false;
for (const draggedTab of movingTabs) {
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, false);
moved = true;
}
}
// Check for essentials container
else if (essentialTabsTarget) {
if (!draggedTab.hasAttribute('zen-essential') && !draggedTab?.group?.hasAttribute('split-view-group')) {
this.addToEssentials(draggedTab);
moved = true;
isVertical = false;
}
}
// Check for normal tabs container
else if (tabsTarget || event.target.id === 'zen-tabs-wrapper') {
if (draggedTab.pinned && !draggedTab.hasAttribute('zen-essential')) {
gBrowser.unpinTab(draggedTab);
moved = true;
isRegularTabs = true;
} else if (draggedTab.hasAttribute('zen-essential')) {
this.removeEssentials(draggedTab);
moved = true;
isRegularTabs = true;
}
}
// If the tab was moved, adjust its position relative to the target tab
if (moved) {
const targetTab = event.target.closest('.tabbrowser-tab');
if (targetTab) {
const rect = targetTab.getBoundingClientRect();
let newIndex = targetTab._tPos;
if (isVertical) {
const middleY = targetTab.screenY + rect.height / 2;
if (!isRegularTabs && event.screenY > middleY) {
newIndex++;
} else if (isRegularTabs && event.screenY < middleY) {
newIndex--;
}
} else {
const middleX = targetTab.screenX + rect.width / 2;
if (event.screenX > middleX) {
newIndex++;
}
}
gBrowser.moveTabTo(draggedTab, newIndex);
}
gBrowser.moveTabTo(draggedTab, newIndex);
}
}
}
return moved;
return moved;
} catch (ex) {
console.error('Error moving tabs:', ex);
return false;
}
}
async onLocationChange(browser) {
@@ -779,6 +812,7 @@
return;
}
tab.removeAttribute('zen-pinned-changed');
tab.removeAttribute('had-zen-pinned-changed');
tab.style.removeProperty('--zen-original-tab-icon');
}
@@ -786,7 +820,11 @@
if (tab.hasAttribute('zen-pinned-changed')) {
return;
}
tab.setAttribute('zen-pinned-changed', 'true');
if (tab.group?.hasAttribute('split-view-group')) {
tab.setAttribute('had-zen-pinned-changed', 'true');
} else {
tab.setAttribute('zen-pinned-changed', 'true');
}
tab.style.setProperty('--zen-original-tab-icon', `url(${pin.iconUrl})`);
}
@@ -820,6 +858,15 @@
// update the label for the same pin across all windows
for (const browser of browsers) {
const tabs = browser.gBrowser.tabs;
// Fix pinned cache for the browser
const browserCache = browser.gZenPinnedTabManager?._pinsCache;
if (browserCache) {
const pin = browserCache.find((pin) => pin.uuid === uuid);
if (pin) {
pin.title = newTitle;
pin.editedTitle = isEdited;
}
}
for (let i = 0; i < tabs.length; i++) {
const tabToEdit = tabs[i];
if (tabToEdit.getAttribute('zen-pin-id') === uuid && tabToEdit !== tab) {
@@ -840,7 +887,8 @@
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');
let targetTab = event.target.closest('.tabbrowser-tab');
targetTab = targetTab?.group || targetTab;
if (event.target.closest('.zen-current-workspace-indicator')) {
this.removeTabContainersDragoverClass();
ZenWorkspaces.activeWorkspaceIndicator.setAttribute('open', true);

View File

@@ -176,7 +176,7 @@
<checkbox data-l10n-id="zen-rice-share-include-workspace-themes" id="zen-rice-share-include-workspace-themes" />
</vbox>
<html:moz-button-group class="panel-footer">
<button onclick="gZenThemePicker.riceManager.cancel()" class="footer-button" data-l10n-id="zen-rice-share-cancel" />
<button onclick="gZenThemePicker.riceManager.cancel()" class="footer-button" data-l10n-id="zen-general-cancel" />
<button onclick="gZenThemePicker.riceManager.submit()" class="footer-button" data-l10n-id="zen-rice-share-save" default="true" slot="primary" id="zen-rice-share-save" disabled="true" />
</html:moz-button-group>
</vbox>

View File

@@ -27,12 +27,12 @@ class ZenBrowserManagerSidebar extends ZenDOMOperatedFeature {
this.onlySafeWidthAndHeight();
this.initProgressListener();
this.update();
this.close(); // avoid caching
this.tabBox.prepend(this.sidebarWrapper);
this.listenForPrefChanges();
this.insertIntoContextMenu();
this.addPositioningListeners();
this.syncPinnedState();
}
onlySafeWidthAndHeight() {
@@ -98,6 +98,17 @@ class ZenBrowserManagerSidebar extends ZenDOMOperatedFeature {
window.addEventListener('resize', this.onWindowResize.bind(this));
}
syncPinnedState() {
const sidebar = document.getElementById('zen-sidebar-web-panel');
const pinButton = document.getElementById('zen-sidebar-web-panel-pinned');
if (sidebar.hasAttribute('pinned')) {
pinButton.setAttribute('pinned', 'true');
} else {
pinButton.removeAttribute('pinned');
}
}
handleSplitterMouseDown(mouseDownEvent) {
if (this._isDragging) return;
this._isDragging = true;
@@ -170,8 +181,8 @@ class ZenBrowserManagerSidebar extends ZenDOMOperatedFeature {
const leftMouseOffset = startLeft - mouseDownEvent.screenX;
const moveListener = (mouseMoveEvent) => {
window.requestAnimationFrame(() => {
let top = mouseMoveEvent.screenY + topMouseOffset;
let left = mouseMoveEvent.screenX + leftMouseOffset;
let top = mouseMoveEvent.clientY + topMouseOffset;
let left = mouseMoveEvent.clientX + leftMouseOffset;
const wrapperBounds = this.sidebarWrapper.getBoundingClientRect();
top = Math.max(0, Math.min(top, wrapperBounds.height - sideBarHeight));
@@ -545,16 +556,18 @@ class ZenBrowserManagerSidebar extends ZenDOMOperatedFeature {
_getWebPanelIcon(url, element) {
let { preferredURI } = Services.uriFixup.getFixupURIInfo(url);
element.setAttribute('image', `page-icon:${preferredURI.spec}`);
fetch(`https://s2.googleusercontent.com/s2/favicons?domain_url=${preferredURI.spec}`).then(async (response) => {
if (response.ok) {
let blob = await response.blob();
let reader = new FileReader();
reader.onload = function () {
element.setAttribute('image', reader.result);
};
reader.readAsDataURL(blob);
}
});
if (Services.prefs.getBoolPref('zen.sidebar.use-google-favicons')) {
fetch(`https://s2.googleusercontent.com/s2/favicons?domain_url=${preferredURI.spec}`).then(async (response) => {
if (response.ok) {
let blob = await response.blob();
let reader = new FileReader();
reader.onload = function () {
element.setAttribute('image', reader.result);
};
reader.readAsDataURL(blob);
}
});
}
}
_getBrowserById(id) {

View File

@@ -264,7 +264,7 @@
(tab.pinned && !ignoreTimestamp) ||
tab.selected ||
(tab.multiselected && !ignoreTimestamp) ||
tab.hasAttribute('busy') ||
(tab.hasAttribute('busy') && !ignoreTimestamp) ||
tab.hasAttribute('pending') ||
!tab.linkedPanel ||
tab.splitView ||
@@ -274,7 +274,8 @@
(tab.pictureinpicture && !ignoreTimestamp) ||
(tab.soundPlaying && !ignoreTimestamp) ||
(tab.zenIgnoreUnload && !ignoreTimestamp) ||
excludedUrls.some((url) => url.test(tab.linkedBrowser?.currentURI.spec))
(excludedUrls.some((url) => url.test(tab.linkedBrowser?.currentURI.spec)) &&
tab.linkedBrowser?.currentURI.spec !== 'about:blank')
) {
return false;
}

View File

@@ -49,9 +49,13 @@ class SplitNode extends SplitLeafNode {
return this._children;
}
addChild(child) {
addChild(child, prepend = true) {
child.parent = this;
this._children.push(child);
if (prepend) {
this._children.unshift(child);
} else {
this._children.push(child);
}
}
}
@@ -69,6 +73,10 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
_edgeHoverSize;
minResizeWidth;
_lastOpenedTab = null;
MAX_TABS = 4;
init() {
XPCOMUtils.defineLazyPreferenceGetter(this, 'canChangeTabOnHover', 'zen.splitView.change-on-hover', false);
XPCOMUtils.defineLazyPreferenceGetter(this, 'minResizeWidth', 'zen.splitView.min-resize-width', 7);
@@ -79,9 +87,17 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
ChromeUtils.defineLazyGetter(this, 'dropZone', () => document.getElementById('zen-splitview-dropzone'));
window.addEventListener('TabClose', this.handleTabClose.bind(this));
window.addEventListener('TabSelect', this.onTabSelect.bind(this));
this.initializeContextMenu();
this.insertPageActionButton();
this.insertIntoContextMenu();
// Add drag over listener to the browser view
if (Services.prefs.getBoolPref('zen.splitView.enable-tab-drop')) {
const tabBox = document.getElementById('tabbrowser-tabbox');
tabBox.addEventListener('dragover', this.onBrowserDragOverToSplit.bind(this));
this.onBrowserDragEndToSplit = this.onBrowserDragEndToSplit.bind(this);
}
}
insertIntoContextMenu() {
@@ -100,6 +116,9 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
*/
handleTabClose(event) {
const tab = event.target;
if (tab === this._lastOpenedTab) {
this._lastOpenedTab = null;
}
const groupIndex = this._data.findIndex((group) => group.tabs.includes(tab));
if (groupIndex < 0) {
return;
@@ -107,6 +126,18 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
this.removeTabFromGroup(tab, groupIndex, event.forUnsplit);
}
/**
* @param {Event} event - The event that triggered the tab select.
* @description Handles the tab select event.
* @returns {void}
*/
onTabSelect(event) {
const previousTab = event.detail.previousTab;
if (previousTab && !previousTab.hasAttribute('zen-empty-tab')) {
this._lastOpenedTab = previousTab;
}
}
/**
* Removes a tab from a group.
*
@@ -120,8 +151,18 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
group.tabs.splice(tabIndex, 1);
this.resetTabState(tab, forUnsplit);
if (tab.group && tab.group.hasAttribute('split-view-group')) {
gBrowser.ungroupTab(tab);
}
if (group.tabs.length < 2) {
// We need to remove all remaining tabs from the group when unsplitting
let remainingTabs = [...group.tabs]; // Copy array since we'll modify it
for (let remainingTab of remainingTabs) {
if (remainingTab.group && remainingTab.group.hasAttribute('split-view-group')) {
gBrowser.ungroupTab(remainingTab);
}
this.resetTabState(remainingTab, forUnsplit);
}
this.removeGroup(groupIndex);
} else {
const node = this.getSplitNodeFromTab(tab);
@@ -130,6 +171,191 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
}
}
onBrowserDragOverToSplit(event) {
var dt = event.dataTransfer;
var draggedTab;
if (dt.mozTypesAt(0)[0] == TAB_DROP_TYPE) {
// tab copy or move
draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
// not our drop then
if (!draggedTab || gBrowser.selectedTab.hasAttribute('zen-empty-tab')) {
return;
}
draggedTab.container._finishMoveTogetherSelectedTabs(draggedTab);
}
if (
!draggedTab ||
this._canDrop ||
this._hasAnimated ||
this.fakeBrowser ||
!this._lastOpenedTab ||
(this._lastOpenedTab &&
(this._lastOpenedTab.getAttribute('zen-workspace-id') !== draggedTab.getAttribute('zen-workspace-id') ||
this._lastOpenedTab.hasAttribute('zen-essential')))
) {
return;
}
if (draggedTab.splitView) {
return;
}
const currentView = this._data[this._lastOpenedTab.splitViewValue];
if (currentView?.tabs.length >= this.MAX_TABS) {
return;
}
const panelsRect = gBrowser.tabbox.getBoundingClientRect();
const panelsWidth = panelsRect.width;
if (
event.clientX > panelsRect.left + panelsWidth - 10 ||
event.clientX < panelsRect.left + 10 ||
event.clientY < panelsRect.top + 10 ||
event.clientY > panelsRect.bottom - 10
) {
return;
}
// first quarter or last quarter of the screen, but not the middle
if (!(event.clientX < panelsRect.left + panelsWidth / 4 || event.clientX > panelsRect.left + (panelsWidth / 4) * 3)) {
return;
}
dt.mozCursor = 'default';
const oldTab = this._lastOpenedTab;
this._canDrop = true;
{
this._draggingTab = draggedTab;
gBrowser.selectedTab = oldTab;
this._hasAnimated = true;
for (const tab of gBrowser.tabs) {
tab.style.removeProperty('transform');
}
const panelsWidth = gBrowser.tabbox.getBoundingClientRect().width;
const halfWidth = panelsWidth / 2;
const side = event.clientX > halfWidth ? 'right' : 'left';
this.fakeBrowser = document.createXULElement('vbox');
this.fakeBrowser.addEventListener('dragleave', this.onBrowserDragEndToSplit);
window.addEventListener('dragend', this.onBrowserDragEndToSplit, { once: true });
const padding = Services.prefs.getIntPref('zen.theme.content-element-separation', 0);
this.fakeBrowser.setAttribute('flex', '1');
this.fakeBrowser.id = 'zen-split-view-fake-browser';
if (oldTab.splitView) {
this.fakeBrowser.setAttribute('has-split-view', 'true');
}
gBrowser.tabbox.appendChild(this.fakeBrowser);
this.fakeBrowser.style.setProperty('--zen-split-view-fake-icon', `url(${draggedTab.getAttribute('image')})`);
draggedTab._visuallySelected = true;
this.fakeBrowser.setAttribute('side', side);
this._finishAllAnimatingPromise = Promise.all([
gZenUIManager.motion.animate(
gBrowser.tabbox,
side === 'left'
? {
paddingLeft: [0, `${halfWidth}px`],
paddingRight: 0,
}
: {
paddingRight: [0, `${halfWidth}px`],
paddingLeft: 0,
},
{
duration: 0.08,
easing: 'ease-out',
}
),
gZenUIManager.motion.animate(
this.fakeBrowser,
{
width: [0, `${halfWidth - padding}px`],
...(side === 'left'
? {
marginLeft: [0, `${-halfWidth}px`],
}
: {}),
},
{
duration: 0.08,
easing: 'ease-out',
}
),
]);
if (this._finishAllAnimatingPromise) {
this._finishAllAnimatingPromise.then(() => {
this._canDrop = true;
draggedTab._visuallySelected = true;
});
}
}
}
onBrowserDragEndToSplit(event) {
if (!this._canDrop) {
return;
}
const panelsRect = gBrowser.tabbox.getBoundingClientRect();
const fakeBrowserRect = this.fakeBrowser && this.fakeBrowser.getBoundingClientRect();
if (
(event.target.closest('#tabbrowser-tabbox') && event.target != this.fakeBrowser) ||
(fakeBrowserRect &&
event.clientX > fakeBrowserRect.left &&
event.clientX < fakeBrowserRect.left + fakeBrowserRect.width &&
event.clientY > fakeBrowserRect.top &&
event.clientY < fakeBrowserRect.top + fakeBrowserRect.height) ||
(event.screenX === 0 && event.screenY === 0) // It's equivalent to 0 if the event has been dropped
) {
return;
}
if (!this._hasAnimated || !this.fakeBrowser) {
return;
}
const panelsWidth = panelsRect.width;
const halfWidth = panelsWidth / 2;
const padding = Services.prefs.getIntPref('zen.theme.content-element-separation', 0);
if (!this.fakeBrowser) {
return;
}
this.fakeBrowser.classList.add('fade-out');
const side = this.fakeBrowser.getAttribute('side');
if (this._draggingTab) this._draggingTab.setAttribute('zen-has-splitted', 'true');
this._lastOpenedTab = gBrowser.selectedTab;
this._draggingTab = null;
try {
Promise.all([
gZenUIManager.motion.animate(
gBrowser.tabbox,
side === 'left'
? {
paddingLeft: [`${halfWidth}px`, 0],
}
: {
paddingRight: [`${halfWidth}px`, 0],
},
{
duration: 0.1,
easing: 'ease-out',
}
),
gZenUIManager.motion.animate(
this.fakeBrowser,
{
width: [`${halfWidth - padding * 2}px`, 0],
...(side === 'left'
? {
marginLeft: [`${-halfWidth}px`, 0],
}
: {}),
},
{
duration: 0.1,
easing: 'ease-out',
}
),
]).then(() => {
this._canDrop = false;
this._maybeRemoveFakeBrowser();
});
} catch (e) {
this._canDrop = false;
this._maybeRemoveFakeBrowser();
}
}
/**
* Remove a SplitNode from its tree and the view
* @param {SplitNode} toRemove
@@ -208,7 +434,7 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
wrapper.setAttribute('hidden', !value);
}
enableTabRearrangeView() {
enableTabRearrangeView(tabDrag = false) {
if (this.rearrangeViewEnabled) return;
this.rearrangeViewEnabled = true;
this.rearrangeViewView = this.currentView;
@@ -223,13 +449,19 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
b.style.pointerEvents = 'none';
b.style.opacity = '.85';
});
this.tabBrowserPanel.addEventListener('dragstart', this.onBrowserDragStart);
if (!tabDrag) {
this.tabBrowserPanel.addEventListener('dragstart', this.onBrowserDragStart);
this.tabBrowserPanel.addEventListener('dragend', this.onBrowserDragEnd);
}
this.tabBrowserPanel.addEventListener('dragover', this.onBrowserDragOver);
this.tabBrowserPanel.addEventListener('drop', this.onBrowserDrop);
this.tabBrowserPanel.addEventListener('dragend', this.onBrowserDragEnd);
this.tabBrowserPanel.addEventListener('click', this.disableTabRearrangeView);
window.addEventListener('keydown', this.disableTabRearrangeView);
this.afterRearangeAction();
if (!tabDrag) {
this.afterRearangeAction();
}
}
disableTabRearrangeView = (event = null) => {
@@ -257,21 +489,57 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
});
this.rearrangeViewEnabled = false;
this.rearrangeViewView = null;
this.afterRearangeRemove();
if (!event?.type === 'dragend') {
// Don't show toast if exiting from drag
this.afterRearangeRemove();
}
};
onBrowserDragStart = (event) => {
if (!this.splitViewActive) return;
let browser = event.target.querySelector('browser');
if (!browser) {
return;
}
browser.style.opacity = '.2';
const browserContainer = browser.closest('.browserSidebarContainer');
event.dataTransfer.setData('text/plain', browserContainer.id);
this._draggingTab = gBrowser.getTabForBrowser(browser);
let dt = event.dataTransfer;
let browser;
let isSplitHeaderDrag = false;
const container = event.target.closest('.browserSidebarContainer[zen-split]');
if (container && event.target.closest('.zen-tab-rearrange-button')) {
// Split tab header drag case
const containerRect = container.getBoundingClientRect();
const clickX = event.clientX - containerRect.left;
// Only allow drag if click is NOT in right 20px (close button area)
if (clickX > containerRect.width - 22) {
return;
}
browser = container.querySelector('browser');
isSplitHeaderDrag = true;
} else {
// Regular browser drag case
browser = event.target.querySelector('browser');
}
if (!browser) return;
const tab = gBrowser.getTabForBrowser(browser);
if (!tab) return;
// Store the necessary state for drag end
this._dragState = {
tab,
browser,
isSplitHeaderDrag,
};
if (isSplitHeaderDrag) {
this.enableTabRearrangeView(true);
}
browser.style.opacity = '.2';
event.dataTransfer.setData('text/plain', browser.closest('.browserSidebarContainer').id);
this._draggingTab = tab;
// Canvas setup for drag image
let scale = window.devicePixelRatio;
let canvas = this._dndCanvas;
if (!canvas) {
@@ -294,8 +562,8 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
// On Windows and Mac we can update the drag image during a drag
// using updateDragImage. On Linux, we can use a panel.
if (platform === 'win' || platform === 'macosx') {
captureListener = function () {
dt.updateDragImage(canvas, dragImageOffset, dragImageOffset);
captureListener = () => {
event.dataTransfer.updateDragImage(canvas, dragImageOffset, dragImageOffset);
};
} else {
// Create a panel to use it in setDragImage
@@ -326,7 +594,7 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
PageThumbs.captureToCanvas(browser, canvas).catch((e) => console.error(e));
dragImageOffset = dragImageOffset * scale;
}
dt.setDragImage(toDrag, dragImageOffset, dragImageOffset);
event.dataTransfer.setDragImage(toDrag, dragImageOffset, dragImageOffset);
return true;
};
@@ -364,10 +632,28 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
};
onBrowserDragEnd = (event) => {
this.dropZone.removeAttribute('enabled');
const draggingBrowser = this._draggingTab.linkedBrowser;
draggingBrowser.style.opacity = '.85';
this.dropZone?.removeAttribute('enabled');
// If we don't have drag state, just clean up what we can
if (!this._dragState) {
this._draggingTab = null;
return;
}
const { tab, browser, isSplitHeaderDrag } = this._dragState;
if (browser) {
browser.style.opacity = isSplitHeaderDrag ? '1' : '.85';
}
// Handle split view specific cleanup
if (isSplitHeaderDrag) {
this.disableTabRearrangeView(event);
}
// Clear state
this._draggingTab = null;
this._dragState = null;
};
_oppositeSide(side) {
@@ -476,10 +762,13 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
*/
resetTabState(tab, forUnsplit) {
tab.splitView = false;
delete tab.splitViewValue;
tab.removeAttribute('split-view');
tab.linkedBrowser.zenModeActive = false;
const container = tab.linkedBrowser.closest('.browserSidebarContainer');
this._removeHeader(container);
this.resetContainerStyle(container);
container.removeEventListener('click', this.handleTabEvent);
container.removeEventListener('mousedown', this.handleTabEvent);
container.removeEventListener('mouseover', this.handleTabEvent);
if (!forUnsplit) {
tab.linkedBrowser.docShellIsActive = false;
@@ -492,6 +781,8 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
* @param {number} groupIndex - The index of the group to remove.
*/
removeGroup(groupIndex) {
const group = this._data[groupIndex];
gZenFolders.expandGroupTabs(group);
if (this.currentView === groupIndex) {
this.deactivateCurrentSplitView();
}
@@ -598,11 +889,11 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
* @returns {boolean} True if the tabs can be split, false otherwise.
*/
contextCanSplitTabs() {
if (window.gBrowser.selectedTabs.length < 2) {
if (window.gBrowser.selectedTabs.length < 2 || window.gBrowser.selectedTabs.length > this.MAX_TABS) {
return false;
}
for (const tab of window.gBrowser.selectedTabs) {
if (tab.splitView) {
if (tab.splitView || tab.hasAttribute('zen-empty-tab') || tab.hasAttribute('zen-essential')) {
return false;
}
}
@@ -622,6 +913,27 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
this.updateSplitView(tab);
tab.linkedBrowser.docShellIsActive = true;
}
this._maybeRemoveFakeBrowser();
}
/**
* @param {Tab} tab
*/
_moveTabsToContainer(tabs, relativeTab) {
const relativeTabIsPinned = relativeTab.pinned;
const relativeTabIsEssential = relativeTab.hasAttribute('zen-essential');
if (relativeTabIsEssential) {
gZenPinnedTabManager.addToEssentials(tabs);
} else {
for (const tab of tabs) {
if (relativeTabIsPinned) {
gBrowser.pinTab(tab);
} else {
gBrowser.unpinTab(tab);
}
}
}
}
/**
@@ -630,11 +942,13 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
* @param {Tab[]} tabs - The tabs to split.
* @param {string} gridType - The type of grid layout.
*/
splitTabs(tabs, gridType) {
tabs = tabs.filter((tab) => !tab.hasAttribute('zen-empty-tab'));
if (tabs.length < 2) {
splitTabs(tabs, gridType, initialIndex = 0) {
// TODO: Add support for splitting essential tabs
tabs = tabs.filter((t) => !t.hidden && !t.hasAttribute('zen-empty-tab') && !t.hasAttribute('zen-essential'));
if (tabs.length < 2 || tabs.length > this.MAX_TABS) {
return;
}
this._moveTabsToContainer(tabs, tabs[initialIndex]);
const existingSplitTab = tabs.find((tab) => tab.splitView);
if (existingSplitTab) {
@@ -648,9 +962,10 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
group.layoutTree = this.calculateLayoutTree([...new Set(group.tabs.concat(tabs))], gridType);
} else {
// Add any tabs that are not already in the group
for (const tab of tabs) {
if (!group.tabs.includes(tab)) {
group.tabs.push(tab);
for (let i = 0; i < tabs.length; i++) {
const tab = tabs[i];
if (!group.tabs.includes(tab) && tab.pinned === !!group.pinned) {
gBrowser.moveTabToGroup(tab, this._getSplitViewGroup(tabs));
this.addTabToSplit(tab, group.layoutTree);
}
}
@@ -667,13 +982,23 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
};
this._data.push(splitData);
window.gBrowser.selectedTab = tabs[0];
// Add tabs to the split view group
let splitGroup = this._getSplitViewGroup(tabs);
if (splitGroup) {
for (const tab of tabs) {
if (!tab.group || tab.group !== splitGroup) {
gBrowser.moveTabToGroup(tab, splitGroup);
}
}
}
this.activateSplitView(splitData);
}
addTabToSplit(tab, splitNode) {
addTabToSplit(tab, splitNode, prepend = true) {
const reduce = splitNode.children.length / (splitNode.children.length + 1);
splitNode.children.forEach((c) => (c.sizeInParent *= reduce));
splitNode.addChild(new SplitLeafNode(tab, (1 - reduce) * 100));
splitNode.addChild(new SplitLeafNode(tab, (1 - reduce) * 100), prepend);
}
/**
@@ -770,11 +1095,49 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
applyGridToTabs(tabs) {
tabs.forEach((tab, index) => {
tab.splitView = true;
const container = tab.linkedBrowser.closest('.browserSidebarContainer');
tab.splitViewValue = this.currentView;
tab.setAttribute('split-view', 'true');
const container = tab.linkedBrowser?.closest('.browserSidebarContainer');
if (!container?.querySelector('.zen-tab-rearrange-button')) {
// insert a header into the container
const header = this._createHeader(container);
container.insertBefore(header, container.firstChild);
}
this.styleContainer(container);
});
}
/**
* Creates a header for the tab.
* @param container
* @returns {*|!Element|HTMLElement|HTMLUnknownElement|HTMLDirectoryElement|HTMLFontElement|HTMLFrameElement|HTMLFrameSetElement|HTMLPreElement|HTMLMarqueeElement|HTMLParamElement}
* @private
*/
_createHeader(container) {
const headerContainer = document.createElement('div');
headerContainer.classList.add('zen-view-splitter-header-container');
const header = document.createElement('div');
header.classList.add('zen-view-splitter-header');
const removeButton = document.createXULElement('toolbarbutton');
removeButton.classList.add('zen-tab-unsplit-button');
removeButton.addEventListener('click', () => {
this.removeTabFromSplit(container);
});
const rearrangeButton = document.createXULElement('toolbarbutton');
rearrangeButton.classList.add('zen-tab-rearrange-button');
header.appendChild(rearrangeButton);
header.appendChild(removeButton);
headerContainer.appendChild(header);
return headerContainer;
}
_removeHeader(container) {
const header = container.querySelector('.zen-view-splitter-header-container');
if (header) {
header.remove();
}
}
/**
* Apply grid layout to tabBrowserPanel
*
@@ -883,7 +1246,7 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
*/
styleContainer(container) {
container.setAttribute('zen-split-anim', 'true');
container.addEventListener('click', this.handleTabEvent);
container.addEventListener('mousedown', this.handleTabEvent);
container.addEventListener('mouseover', this.handleTabEvent);
}
@@ -896,7 +1259,7 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
if (this.rearrangeViewEnabled || (event.type === 'mouseover' && !this.canChangeTabOnHover)) {
return;
}
const container = event.currentTarget;
const container = event.currentTarget.closest('.browserSidebarContainer');
const tab = window.gBrowser.tabs.find((t) => t.linkedBrowser.closest('.browserSidebarContainer') === container);
if (tab) {
window.gBrowser.selectedTab = tab;
@@ -907,7 +1270,7 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
this.tabBrowserPanel.setAttribute('zen-split-resizing', true);
const isVertical = event.target.getAttribute('orient') === 'vertical';
const dimension = isVertical ? 'width' : 'height';
const clientAxis = isVertical ? 'screenX' : 'screenY';
const clientAxis = isVertical ? 'clientX' : 'clientY';
const gridIdx = parseInt(event.target.getAttribute('gridIdx'));
const startPosition = event[clientAxis];
@@ -977,9 +1340,15 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
const browser = tab.linkedBrowser.closest('.browserSidebarContainer');
if (active) {
browser.setAttribute('zen-split', 'true');
browser.addEventListener('dragstart', this.onBrowserDragStart);
browser.addEventListener('dragend', this.onBrowserDragEnd);
} else {
browser.removeAttribute('zen-split');
browser.removeAttribute('style');
browser.removeEventListener('dragstart', this.onBrowserDragStart);
browser.removeEventListener('dragend', this.onBrowserDragEnd);
}
}
}
@@ -1117,7 +1486,7 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
return;
}
const tabs = gBrowser.visibleTabs;
if (tabs.length < 2) {
if (tabs.length < 2 || this.currentView >= 0) {
return;
}
let nextTabIndex = tabs.indexOf(gBrowser.selectedTab) + 1;
@@ -1136,6 +1505,223 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
: [gBrowser.selectedTab, tabs[nextTabIndex]];
this.splitTabs(selected_tabs, gridType);
}
/**
* @description removes the tab from the split
* @param container - The container element
*/
removeTabFromSplit = (container) => {
const browser = container.querySelector('browser');
if (browser) {
const tab = gBrowser.getTabForBrowser(browser);
if (tab) {
const groupIndex = this._data.findIndex((group) => group.tabs.includes(tab));
this.deactivateCurrentSplitView();
if (groupIndex >= 0) {
this.removeTabFromGroup(tab, groupIndex, true);
}
}
}
};
_maybeRemoveFakeBrowser(select = true) {
gBrowser.tabbox.removeAttribute('style');
if (this.fakeBrowser) {
delete this._hasAnimated;
this.fakeBrowser.remove();
this.fakeBrowser = null;
if (this._draggingTab) this._draggingTab._visuallySelected = false;
if (select) {
gBrowser.selectedTab = this._draggingTab;
this._draggingTab = null;
}
}
}
/**
* @description moves the tab to the split view if dragged on a browser
* @param event - The event
* @param draggedTab - The dragged tab
* @returns {boolean} true if the tab was moved to the split view
*/
moveTabToSplitView(event, draggedTab) {
const canDrop = this._canDrop;
this._canDrop = false;
if (!canDrop || !this.fakeBrowser) {
this._maybeRemoveFakeBrowser(false);
return false;
}
const dropSide = this.fakeBrowser?.getAttribute('side');
const containerRect = this.fakeBrowser.getBoundingClientRect();
const padding = Services.prefs.getIntPref('zen.theme.content-element-separation', 0);
const dropTarget = document.elementFromPoint(
dropSide === 'left' ? containerRect.left + containerRect.width + padding + 5 : containerRect.left - padding - 5,
event.clientY
);
const browser = dropTarget?.closest('browser');
if (!browser) {
this._maybeRemoveFakeBrowser(false);
return false;
}
gBrowser.selectedTab = this._draggingTab;
this._draggingTab = null;
const browserContainer = draggedTab.linkedBrowser?.closest('.browserSidebarContainer');
if (browserContainer) {
browserContainer.style.opacity = '0';
}
const droppedOnTab = gBrowser.getTabForBrowser(browser);
if (droppedOnTab && droppedOnTab !== draggedTab) {
// Calculate which side of the target browser the drop occurred
// const browserRect = browser.getBoundingClientRect();
// const hoverSide = this.calculateHoverSide(event.clientX, event.clientY, browserRect);
const hoverSide = dropSide;
if (droppedOnTab.splitView) {
// Add to existing split view
const groupIndex = this._data.findIndex((group) => group.tabs.includes(droppedOnTab));
const group = this._data[groupIndex];
if (!group.tabs.includes(draggedTab) && group.tabs.length < this.MAX_TABS) {
// First move the tab to the split view group
let splitGroup = droppedOnTab.group;
if (splitGroup && (!draggedTab.group || draggedTab.group !== splitGroup)) {
this._moveTabsToContainer([draggedTab], droppedOnTab);
gBrowser.moveTabToGroup(draggedTab, splitGroup);
}
const droppedOnSplitNode = this.getSplitNodeFromTab(droppedOnTab);
const parentNode = droppedOnSplitNode.parent;
// Then add the tab to the split view
group.tabs.push(draggedTab);
// If dropping on a side, create a new split in that direction
if (hoverSide !== 'center') {
const splitDirection = hoverSide === 'left' || hoverSide === 'right' ? 'row' : 'column';
if (parentNode.direction !== splitDirection) {
this.splitIntoNode(droppedOnSplitNode, new SplitLeafNode(draggedTab, 50), hoverSide, 0.5);
} else {
this.addTabToSplit(draggedTab, parentNode, /* prepend = */ hoverSide === 'left' || hoverSide === 'top');
}
} else {
this.addTabToSplit(draggedTab, group.layoutTree);
}
this.activateSplitView(group, true);
}
} else {
// Create new split view with layout based on drop position
let gridType = 'vsep';
//switch (hoverSide) {
// case 'left':
// case 'right':
// gridType = 'vsep';
// break;
// case 'top':
// case 'bottom':
// gridType = 'hsep';
// break;
// default:
// gridType = 'grid';
//}
// Put tabs always as if it was dropped from the left
this.splitTabs(dropSide == 'left' ? [draggedTab, droppedOnTab] : [droppedOnTab, draggedTab], gridType, 1);
}
}
if (this._finishAllAnimatingPromise) {
this._finishAllAnimatingPromise.then(() => {
this._maybeRemoveFakeBrowser(false);
});
}
if (browserContainer) {
gZenUIManager.motion
.animate(
browserContainer,
{
scale: [0.97, 1],
opacity: [0, 1],
},
{
type: 'spring',
bounce: 0.4,
duration: 0.2,
delay: 0.1,
}
)
.then(() => {
this._maybeRemoveFakeBrowser(false);
this._finishAllAnimatingPromise = null;
});
}
return true;
}
handleTabDrop(event, urls, replace, inBackground) {
if (replace || urls.length !== 1) {
return false;
}
const url = urls[0];
if (!url.startsWith('panel-')) {
return false;
}
const browserContainer = document.getElementById(url);
const browser = browserContainer?.querySelector('browser');
if (!browser) {
return false;
}
const tab = gBrowser.getTabForBrowser(browser);
if (!tab) {
return false;
}
if (tab.splitView) {
// Unsplit the tab and exit from the drag view
this.dropZone?.removeAttribute('enabled');
this.disableTabRearrangeView(event);
this.removeTabFromSplit(browserContainer);
return true;
}
return false;
}
/**
* Gets or creates a tab group for split view tabs
* @param {Array} tabs Initial tabs to add to the group if creating new
* @returns {TabGroup} The tab group for split view tabs
*/
_getSplitViewGroup(tabs) {
if (tabs.some((tab) => tab.hasAttribute('zen-essential'))) {
return null;
}
// Try to find an existing split view group
let splitGroup = gBrowser.tabGroups.find(
(group) => group.getAttribute('split-view-group') && group.tabs.some((tab) => tabs.includes(tab) && tab.splitView)
);
if (splitGroup) {
return splitGroup;
}
// We can't create an empty group, so only create if we have tabs
if (tabs?.length) {
// Create a new group with the initial tabs
const group = gBrowser.addTabGroup(tabs, {
label: '',
showCreateUI: false,
insertBefore: tabs[0],
forSplitView: true,
});
}
return null;
}
}
window.gZenViewSplitter = new ZenViewSplitter();

View File

@@ -226,6 +226,7 @@
const sidebar = document.getElementById('zen-welcome-page-sidebar');
sidebar.style.width = '100%';
sidebar.appendChild(heart);
sidebar.setAttribute('animate-heart', 'true');
await animate(
'#zen-welcome-heart',
{ opacity: [0, 1, 1, 1, 0], scale: [0.5, 1, 1.2, 1, 1.2] },
@@ -334,17 +335,17 @@
<html:div></html:div>
</hbox>
<html:div id="zen-welcome-initial-essentials-browser-sidebar-essentials">
<html:div class="tabbrowser-tab" fadein="" visuallyselected="" data-url="https://web.whatsapp.com" style="--zen-tab-icon: url('https://web.whatsapp.com/favicon.ico');">
<html:div class="tabbrowser-tab" fadein="" data-url="https://web.whatsapp.com" style="--zen-tab-icon: url('https://web.whatsapp.com/favicon.ico');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
</html:div>
<html:div class="tabbrowser-tab" fadein="" visuallyselected="" data-url="https://discord.com" style="--zen-tab-icon: url('http://www.google.com/s2/favicons?domain=discord.com');">
<html:div class="tabbrowser-tab" fadein="" visuallyselected="" data-url="https://discord.com" style="--zen-tab-icon: url('https://www.google.com/s2/favicons?domain=discord.com');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
</html:div>
<html:div class="tabbrowser-tab" fadein="" data-url="https://reddit.com" style="--zen-tab-icon: url('https://www.redditstatic.com/desktop2x/img/favicon/favicon-96x96.png');">
<html:div class="tabbrowser-tab" fadein="" data-url="https://trello.com" style="--zen-tab-icon: url('https://trello.com/favicon.ico');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
@@ -354,7 +355,7 @@
<html:div class="tab-background"></html:div>
</stack>
</html:div>
<html:div class="tabbrowser-tab" fadein="" visuallyselected="" data-url="https://google.com" style="--zen-tab-icon: url('https://www.google.com/s2/favicons?domain=google.com');">
<html:div class="tabbrowser-tab" fadein="" data-url="https://github.com" style="--zen-tab-icon: url('https://github.githubassets.com/favicons/favicon-dark.png');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
@@ -364,17 +365,17 @@
<html:div class="tab-background"></html:div>
</stack>
</html:div>
<html:div class="tabbrowser-tab" fadein="" data-url="https://notion.com" style="--zen-tab-icon: url('https://www.notion.so/front-static/favicon.ico');">
<html:div class="tabbrowser-tab" fadein="" visuallyselected="" data-url="https://notion.com" style="--zen-tab-icon: url('https://www.notion.so/front-static/favicon.ico');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
</html:div>
<html:div class="tabbrowser-tab" fadein="" data-url="https://instagram.com" style="--zen-tab-icon: url('https://www.instagram.com/static/images/ico/favicon-192.png/68d99ba29cc8.png');">
<html:div class="tabbrowser-tab" fadein="" visuallyselected="" data-url="https://calendar.google.com" style="--zen-tab-icon: url('https://calendar.google.com/googlecalendar/images/favicons_2020q4/calendar_6.ico');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
</html:div>
<html:div class="tabbrowser-tab" fadein="" visuallyselected="" data-url="https://element.io" style="--zen-tab-icon: url('http://www.google.com/s2/favicons?domain=element.io');">
<html:div class="tabbrowser-tab" fadein="" data-url="https://youtube.com" style="--zen-tab-icon: url('https://www.youtube.com/favicon.ico');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
@@ -453,9 +454,7 @@
async fadeOut() {
gZenThemePicker.panel.removeAttribute('noautohide');
gZenThemePicker.panel.removeAttribute('consumeoutsideclicks');
if (AppConstants.platform != 'macosx') {
await animate(gZenThemePicker.panel, { opacity: [1, 0] });
}
await animate(gZenThemePicker.panel, { opacity: [1, 0] });
gZenThemePicker.panel.hidePopup();
gZenThemePicker.panel.removeAttribute('style');
},

View File

@@ -32,6 +32,10 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
this._resolveSectionsInitialized = resolve;
});
promiseInitialized = new Promise((resolve) => {
this._resolveInitialized = resolve;
});
workspaceIndicatorXUL = `
<hbox class="zen-current-workspace-indicator-icon"></hbox>
<hbox class="zen-current-workspace-indicator-name"></hbox>
@@ -43,6 +47,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
async init() {
if (!this.shouldHaveWorkspaces) {
this._resolveInitialized();
document.getElementById('zen-current-workspace-indicator-container').setAttribute('hidden', 'true');
console.warn('ZenWorkspaces: !!! ZenWorkspaces is disabled in hidden windows !!!');
return; // We are in a hidden window, don't initialize ZenWorkspaces
@@ -52,13 +57,6 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
XPCOMUtils.defineLazyPreferenceGetter(this, 'activationMethod', 'zen.workspaces.scroll-modifier-key', 'ctrl');
XPCOMUtils.defineLazyPreferenceGetter(this, 'naturalScroll', 'zen.workspaces.natural-scroll', true);
XPCOMUtils.defineLazyPreferenceGetter(this, 'shouldWrapAroundNavigation', 'zen.workspaces.wrap-around-navigation', true);
XPCOMUtils.defineLazyPreferenceGetter(
this,
'shouldShowIconStrip',
'zen.workspaces.show-icon-strip',
true,
this._expandWorkspacesStrip.bind(this)
);
XPCOMUtils.defineLazyPreferenceGetter(
this,
'shouldForceContainerTabsToWorkspace',
@@ -106,12 +104,13 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
);
}
selectEmptyTab() {
selectEmptyTab(newTabTarget = null) {
if (this._emptyTab && gZenVerticalTabsManager._canReplaceNewTab) {
gBrowser.selectedTab = this._emptyTab;
return this._emptyTab;
}
let tab = gZenUIManager.openAndChangeToTab(Services.prefs.getStringPref('browser.startup.homepage'));
const newTabUrl = newTabTarget || Services.prefs.getStringPref('browser.startup.homepage');
let tab = gZenUIManager.openAndChangeToTab(newTabUrl);
if (window.uuid) {
tab.setAttribute('zen-workspace-id', this.activeWorkspace);
}
@@ -133,15 +132,16 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
async _createDefaultWorkspaceIfNeeded() {
const workspaces = await this._workspaces();
if (!workspaces.workspaces.length) {
await this.createAndSaveWorkspace('Default Workspace', true, '🏠', true);
await this.createAndSaveWorkspace('Default', true, null, true);
this._workspaceCache = null;
}
}
_initializeEmptyTab() {
gBrowser._forZenEmptyTab = true;
this._emptyTab = gBrowser.addTrustedTab('about:blank', { inBackground: true, userContextId: 0 });
this._emptyTab.setAttribute('zen-empty-tab', 'true');
if (Services.prefs.getBoolPref('zen.workspaces.disable_empty_state_for_testing', false)) {
return;
}
this._emptyTab = gBrowser.addTrustedTab('about:blank', { inBackground: true, userContextId: 0, _forZenEmptyTab: true });
}
registerPinnedResizeObserver() {
@@ -260,6 +260,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
_organizeTabsToWorkspaceSections(workspace, section, pinnedSection, tabs) {
const workspaceTabs = Array.from(tabs).filter((tab) => tab.getAttribute('zen-workspace-id') === workspace.uuid);
let firstNormalTab = null;
for (const tab of workspaceTabs) {
if (tab.hasAttribute('zen-essential')) {
continue; // Ignore essentials as they need to be in their own section
@@ -269,9 +270,18 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
if (tab.pinned) {
pinnedSection.insertBefore(tab, pinnedSection.nextSibling);
} else {
if (!firstNormalTab) {
firstNormalTab = tab;
}
section.insertBefore(tab, section.lastChild);
}
}
// Kind of a hacky fix, but for some reason the first normal tab in the list
// created by session restore is added the the last position of the tab list
// let's just prepend it to the section
if (firstNormalTab) {
section.insertBefore(firstNormalTab, section.firstChild);
}
}
initializeWorkspaceNavigation() {
@@ -512,9 +522,8 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
if (typeof this._workspaceEnabled === 'undefined') {
this._workspaceEnabled =
!Services.prefs.getBoolPref('zen.workspaces.disabled_for_testing', false) && this.shouldHaveWorkspaces;
return this._workspaceEnabled;
}
return this._workspaceEnabled;
return this._workspaceEnabled && !window.closed;
}
getActiveWorkspaceFromCache() {
@@ -590,11 +599,24 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
} catch (e) {
console.error('ZenWorkspaces: Error initializing theme picker', e);
}
this._selectStartPage();
await this._selectStartPage();
this._fixTabPositions();
this._resolveInitialized();
this._clearAnyZombieTabs(); // Dont call with await
}
}
_selectStartPage() {
async _selectStartPage() {
if (Services.prefs.getBoolPref('zen.workspaces.disable_empty_state_for_testing', false)) {
return;
}
if (this._initialTab) {
this.moveTabToWorkspace(this._initialTab, this.activeWorkspace);
gBrowser.selectedTab = this._initialTab;
gBrowser.moveTabTo(this._initialTab, 0, { forceStandaloneTab: true });
this._initialTab._possiblyEmpty = false;
this._initialTab = null;
}
const currentTab = gBrowser.selectedTab;
let showed = false;
if (currentTab.pinned) {
@@ -611,7 +633,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
if (
(currentTab.isEmpty &&
(currentTab.getAttribute('image') === gPageIcons[currentTabURL] || !currentTab.hasAttribute('image'))) ||
currentTab.hasAttribute('zen-empty-tab')
currentTab._possiblyEmpty
) {
this.selectEmptyTab();
this._removedByStartupPage = true;
@@ -624,6 +646,14 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
}
}
handleInitialTab(tab, isEmpty) {
if (isEmpty) {
tab._possiblyEmpty = true;
} else {
this._initialTab = tab;
}
}
initIndicatorContextMenu(indicator) {
const th = (event) => {
event.preventDefault();
@@ -638,6 +668,26 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
return !window.toolbar.visible || Services.prefs.getBoolPref('browser.tabs.closeWindowWithLastTab');
}
async _clearAnyZombieTabs() {
const tabs = this.allStoredTabs;
const workspaces = await this._workspaces();
for (let tab of tabs) {
const workspaceID = tab.getAttribute('zen-workspace-id');
if (
workspaceID &&
!tab.hasAttribute('zen-essential') &&
!workspaces.workspaces.find((workspace) => workspace.uuid === workspaceID)
) {
// Remove any tabs where their workspace doesn't exist anymore
gBrowser.removeTab(tab, {
animate: false,
skipSessionStore: true,
closeWindowWithLastTab: false,
});
}
}
}
handleTabBeforeClose(tab) {
if (!this.workspaceEnabled || this.__contextIsDelete || this._removedByStartupPage) {
return null;
@@ -985,21 +1035,15 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
}.bind(browser.ZenWorkspaces)
);
element.addEventListener(
'dragenter',
function (event) {
if (this.isReorderModeOn(browser) && this.draggedElement) {
element.classList.add('dragover');
}
}.bind(browser.ZenWorkspaces)
);
element.addEventListener('dragenter', function (event) {
if (this.isReorderModeOn(browser) && this.draggedElement) {
element.classList.add('dragover');
}
});
element.addEventListener(
'dragleave',
function (event) {
element.classList.remove('dragover');
}.bind(browser.ZenWorkspaces)
);
element.addEventListener('dragleave', function (event) {
element.classList.remove('dragover');
});
element.addEventListener(
'drop',
@@ -1272,82 +1316,55 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
button.setAttribute('showInPrivateBrowsing', 'false');
button.setAttribute('tooltiptext', 'Workspaces');
if (this.shouldShowIconStrip) {
let workspaces = await this._workspaces();
let workspaces = await this._workspaces();
for (let workspace of workspaces.workspaces) {
let workspaceButton = browser.document.createXULElement('toolbarbutton');
workspaceButton.className = 'subviewbutton';
workspaceButton.setAttribute('tooltiptext', workspace.name);
workspaceButton.setAttribute('zen-workspace-id', workspace.uuid);
for (let workspace of workspaces.workspaces) {
let workspaceButton = browser.document.createXULElement('toolbarbutton');
workspaceButton.className = 'subviewbutton';
workspaceButton.setAttribute('tooltiptext', workspace.name);
workspaceButton.setAttribute('zen-workspace-id', workspace.uuid);
if (this.isWorkspaceActive(workspace)) {
workspaceButton.setAttribute('active', 'true');
} else {
workspaceButton.removeAttribute('active');
}
if (workspace.default) {
workspaceButton.setAttribute('default', 'true');
} else {
workspaceButton.removeAttribute('default');
}
workspaceButton.addEventListener('click', async (event) => {
if (event.button !== 0) {
return;
}
await this.changeWorkspace(workspace);
});
let icon = browser.document.createXULElement('div');
icon.className = 'zen-workspace-icon';
icon.textContent = this.getWorkspaceIcon(workspace);
workspaceButton.appendChild(icon);
button.appendChild(workspaceButton);
}
if (workspaces.workspaces.length <= 1) {
button.setAttribute('dont-show', true);
if (this.isWorkspaceActive(workspace)) {
workspaceButton.setAttribute('active', 'true');
} else {
button.removeAttribute('dont-show');
workspaceButton.removeAttribute('active');
}
if (workspace.default) {
workspaceButton.setAttribute('default', 'true');
} else {
workspaceButton.removeAttribute('default');
}
this._workspaceButtonContextMenuListener = (event) => {
event.preventDefault();
event.stopPropagation();
this.openWorkspacesDialog(event);
};
button.addEventListener('contextmenu', this._workspaceButtonContextMenuListener.bind(browser.ZenWorkspaces));
} else {
let activeWorkspace = await this.getActiveWorkspace();
if (activeWorkspace) {
button.setAttribute('as-button', 'true');
button.classList.add('toolbarbutton-1', 'zen-sidebar-action-button');
this._workspacesButtonClickListener = browser.ZenWorkspaces.openWorkspacesDialog.bind(browser.ZenWorkspaces);
button.addEventListener('click', this._workspacesButtonClickListener);
const wrapper = browser.document.createXULElement('hbox');
wrapper.className = 'zen-workspace-sidebar-wrapper';
const icon = browser.document.createXULElement('div');
icon.className = 'zen-workspace-sidebar-icon';
icon.textContent = this.getWorkspaceIcon(activeWorkspace);
const name = browser.document.createXULElement('div');
name.className = 'zen-workspace-sidebar-name';
name.textContent = activeWorkspace.name;
if (!this.workspaceHasIcon(activeWorkspace)) {
icon.setAttribute('no-icon', 'true');
workspaceButton.addEventListener('click', async (event) => {
if (event.button !== 0) {
return;
}
await this.changeWorkspace(workspace);
});
wrapper.appendChild(icon);
wrapper.appendChild(name);
button.appendChild(wrapper);
let icon = browser.document.createXULElement('div');
icon.className = 'zen-workspace-icon';
if (this.workspaceHasIcon(workspace)) {
icon.textContent = this.getWorkspaceIcon(workspace);
} else {
icon.setAttribute('no-icon', 'true');
}
workspaceButton.appendChild(icon);
button.appendChild(workspaceButton);
}
if (workspaces.workspaces.length <= 1) {
button.setAttribute('dont-show', true);
} else {
button.removeAttribute('dont-show');
}
this._workspaceButtonContextMenuListener = (event) => {
event.preventDefault();
event.stopPropagation();
this.openWorkspacesDialog(event);
};
button.addEventListener('contextmenu', this._workspaceButtonContextMenuListener.bind(browser.ZenWorkspaces));
}
closeWorkspacesSubView() {
@@ -1374,15 +1391,16 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
}
_deleteAllTabsInWorkspace(workspaceID) {
for (let tab of gBrowser.tabs) {
if (tab.getAttribute('zen-workspace-id') === workspaceID) {
gBrowser.removeTab(tab, {
animate: true,
skipSessionStore: true,
closeWindowWithLastTab: false,
});
gBrowser.removeTabs(
Array.from(gBrowser.tabs).filter(
(tab) => tab.getAttribute('zen-workspace-id') === workspaceID && !tab.hasAttribute('zen-empty-tab')
),
{
animate: false,
skipSessionStore: true,
closeWindowWithLastTab: false,
}
}
);
}
moveTabToWorkspace(tab, workspaceID) {
@@ -1485,9 +1503,10 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
this._inChangingWorkspace = true;
try {
await this._performWorkspaceChange(window, ...args);
} finally {
this._inChangingWorkspace = false;
} catch (e) {
console.error('ZenWorkspaces: Error changing workspace', e);
}
this._inChangingWorkspace = false;
}
_cancelSwipeAnimation() {
@@ -1499,18 +1518,19 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
const previousWorkspace = await this.getActiveWorkspace();
alwaysChange = alwaysChange || onInit;
this.activeWorkspace = window.uuid;
if (previousWorkspace && previousWorkspace.uuid === window.uuid && !alwaysChange) {
this._cancelSwipeAnimation();
return;
}
this.activeWorkspace = window.uuid;
const containerId = window.containerTabId?.toString();
const workspaces = await this._workspaces();
// Refresh tab cache
gBrowser.verticalPinnedTabsContainer = this.pinnedTabsContainer;
gBrowser.tabContainer.verticalPinnedTabsContainer = this.pinnedTabsContainer;
gBrowser.verticalPinnedTabsContainer = this.pinnedTabsContainer || gBrowser.verticalPinnedTabsContainer;
gBrowser.tabContainer.verticalPinnedTabsContainer =
this.pinnedTabsContainer || gBrowser.tabContainer.verticalPinnedTabsContainer;
// Move empty tab to the new workspace
this._moveEmptyTabToWorkspace(window.uuid);
@@ -1538,9 +1558,25 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
}
_moveEmptyTabToWorkspace(workspaceUuid) {
this._makeSureEmptyTabIsLast();
}
_makeSureEmptyTabIsLast() {
const emptyTab = this._emptyTab;
if (emptyTab) {
this.moveTabToWorkspace(emptyTab, workspaceUuid);
const container = this.activeWorkspaceStrip;
if (container) {
container.insertBefore(emptyTab, container.lastChild);
}
}
this._fixTabPositions();
}
_fixTabPositions() {
// Fix tabs _tPos values relative to the actual order
const tabs = gBrowser.tabs;
for (let i = 0; i < tabs.length; i++) {
tabs[i]._tPos = i;
}
}
@@ -1606,7 +1642,6 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
const elementWorkspaceIndex = workspaces.workspaces.findIndex((w) => w.uuid === elementWorkspaceId);
const offset = -(newWorkspaceIndex - elementWorkspaceIndex) * 100;
const newTransform = `translateX(${offset}%)`;
const isCurrent = offset === 0;
if (shouldAnimate) {
element.removeAttribute('hidden');
animations.push(
@@ -1943,6 +1978,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
}
async onLocationChange(browser) {
gZenCompactModeManager.sidebar.toggleAttribute('zen-has-empty-tab', gBrowser.selectedTab.hasAttribute('zen-empty-tab'));
if (!this.workspaceEnabled || this._inChangingWorkspace || this._isClosingWindow) {
return;
}
@@ -1969,6 +2005,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
// Switch workspace if needed
if (workspaceID && workspaceID !== activeWorkspace.uuid && parent.ZenWorkspaces._hasInitializedTabsStrip) {
const workspaces = await parent.ZenWorkspaces._workspaces();
await parent.ZenWorkspaces.changeWorkspace({ uuid: workspaceID });
}
}
@@ -2207,7 +2244,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
const activeWorkspace = this.getActiveWorkspaceFromCache();
const activeWorkspaceUserContextId = activeWorkspace?.containerTabId;
if (typeof userContextId !== 'undefined' && userContextId !== activeWorkspaceUserContextId) {
if (fromExternal !== true && typeof userContextId !== 'undefined' && userContextId !== activeWorkspaceUserContextId) {
return [userContextId, false, undefined];
}
return [activeWorkspaceUserContextId, true, undefined];
@@ -2264,12 +2301,16 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
const containers = [essentialsContainer, ...pinnedContainers, ...normalContainers];
for (const container of containers) {
for (const tab of container.children) {
if (tab.tagName === 'tab' || tab.tagName == 'tab-group') {
if (tab.tagName === 'tab') {
tabs.push(tab);
const glance = tab.querySelector('.tabbrowser-tab[glance-id]');
if (glance) {
tabs.push(glance);
}
} else if (tab.tagName == 'tab-group') {
for (const groupTab of tab.tabs) {
tabs.push(groupTab);
}
}
}
}
@@ -2305,9 +2346,12 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
async switchIfNeeded(browser, i) {
const tab = gBrowser.getTabForBrowser(browser);
const workspaceId = tab.getAttribute('zen-workspace-id');
if (!tab.hasAttribute('zen-essential') && workspaceId !== this.activeWorkspace) {
await this.changeWorkspace({ uuid: workspaceId });
await this.switchTabIfNeeded(tab);
}
async switchTabIfNeeded(tab) {
if (!tab.hasAttribute('zen-essential') && tab.getAttribute('zen-workspace-id') !== this.activeWorkspace) {
await this.changeWorkspace({ uuid: tab.getAttribute('zen-workspace-id') });
}
gBrowser.selectedTab = tab;
}

View File

@@ -7,6 +7,7 @@ var ZenWorkspacesStorage = {
Weave: 'resource://services-sync/main.sys.mjs',
});
if (!window.ZenWorkspaces) return;
await this._ensureTable();
await ZenWorkspaceBookmarksStorage.init();
},

View File

@@ -12,6 +12,9 @@ export class ZenGlanceChild extends JSWindowActorChild {
case 'DOMContentLoaded':
await this.initiateGlance();
break;
case 'keydown':
this.onKeyDown(event);
break;
default:
}
}
@@ -120,4 +123,13 @@ export class ZenGlanceChild extends JSWindowActorChild {
this.openGlance(target);
}
}
onKeyDown(event) {
if (event.defaultPrevented || event.key !== 'Escape') {
return;
}
this.sendAsyncMessage('ZenGlance:CloseGlance', {
hasFocused: this.contentWindow.document.activeElement !== this.contentWindow.document.body,
});
}
}

View File

@@ -15,6 +15,16 @@ export class ZenGlanceParent extends JSWindowActorParent {
this.openGlance(this.browsingContext.topChromeWindow, message.data);
break;
}
case 'ZenGlance:CloseGlance': {
const params = {
onTabClose: true,
...message.data,
};
this.browsingContext.topChromeWindow.gZenGlanceManager.closeGlance(params);
break;
}
default:
console.warn(`[glance]: Unknown message: ${message.name}`);
}
}

View File

@@ -0,0 +1,11 @@
BROWSER_CHROME_MANIFESTS += [
"tests/browser.toml",
]
FINAL_TARGET_FILES.actors += [
"actors/ZenGlanceChild.sys.mjs",
"actors/ZenGlanceParent.sys.mjs",
"actors/ZenThemeMarketplaceChild.sys.mjs",
"actors/ZenThemeMarketplaceParent.sys.mjs",
]

View File

@@ -0,0 +1,45 @@
<?xml version="1.0"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<html xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:html="http://www.w3.org/1999/xhtml"
id="zenSettingsWindow"
style="min-width: 35em; max-width: 35em; min-height: 40em;">
<head>
<linkset>
<html:link
rel="stylesheet"
href="chrome://browser/content/zen-styles/zen-theme.css"
/>
<html:link
rel="stylesheet"
href="chrome://browser/content/zen-styles/windows/zen-settings.css"
/>
<html:link rel="localization" href="browser/preferences/preferences.ftl" />
<html:link rel="localization" href="browser/preferences/zen-preferences.ftl" />
</linkset>
<script src="chrome://browser/content/zenThemeModifier.js"></script>
</head>
<html:body xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<vbox id="main-content">
<vbox class="section">
<html:h2 data-l10n-id="pane-general-title"/>
<div class="section-content">
test
</div>
</vbox>
<vbox class="section">
<html:h2 data-l10n-id="pane-general-title"/>
<div class="section-content">
test
</div>
</vbox>
</vbox>
</html:body>
</html>

View File

@@ -0,0 +1,12 @@
diff --git a/browser/components/BrowserContentHandler.sys.mjs b/browser/components/BrowserContentHandler.sys.mjs
index 7aef091c0be1cb0ea0be52268949db17032f96d9..5e9105fa671d1b1979f204fc8d3be22771998ad7 100644
--- a/browser/components/BrowserContentHandler.sys.mjs
+++ b/browser/components/BrowserContentHandler.sys.mjs
@@ -1278,6 +1278,7 @@ function maybeRecordToHandleTelemetry(uri, isLaunch) {
".avif",
".htm",
".html",
+ ".jxl",
".pdf",
".shtml",
".xht",

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs
index e6b9b7dcfab179e7552c146eb1551b45ad042266..d9d838a7a51f67b52b69f419024cc3174ae5260b 100644
index 8eab0f9181c19c68a0a2daf0f819b3ae82ed92bc..092107b377ec4f7bc9ae86c817cded349732ffc6 100644
--- a/browser/components/customizableui/CustomizableUI.sys.mjs
+++ b/browser/components/customizableui/CustomizableUI.sys.mjs
@@ -13,6 +13,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
@@ -116,7 +116,7 @@ index e6b9b7dcfab179e7552c146eb1551b45ad042266..d9d838a7a51f67b52b69f419024cc317
win.setToolbarVisibility(
areaNode,
typeof defaultCollapsed == "string"
@@ -4658,6 +4656,7 @@ export var CustomizableUI = {
@@ -4857,6 +4855,7 @@ export var CustomizableUI = {
unregisterArea(aName, aDestroyPlacements) {
CustomizableUIInternal.unregisterArea(aName, aDestroyPlacements);
},
@@ -124,7 +124,7 @@ index e6b9b7dcfab179e7552c146eb1551b45ad042266..d9d838a7a51f67b52b69f419024cc317
/**
* Add a widget to an area.
* If the area to which you try to add is not known to CustomizableUI,
@@ -6483,11 +6482,11 @@ class OverflowableToolbar {
@@ -6840,11 +6839,11 @@ class OverflowableToolbar {
parseFloat(style.paddingLeft) -
parseFloat(style.paddingRight) -
toolbarChildrenWidth;
@@ -134,11 +134,11 @@ index e6b9b7dcfab179e7552c146eb1551b45ad042266..d9d838a7a51f67b52b69f419024cc317
this.#target == this.#toolbar
? toolbarChildrenWidth
- : sumChildrenInlineSize(this.#target);
+ : sumChildrenInlineSize(this.#target, win.gZenVerticalTabsManager._topButtonsSeparatorElement);
+ : sumChildrenInlineSize((win.gZenVerticalTabsManager._hasSetSingleToolbar && this.#target.id == 'nav-bar-customization-target') ? win.document.getElementById("zen-sidebar-top-buttons-customization-target") : this.#target, win.gZenVerticalTabsManager._topButtonsSeparatorElement);
});
lazy.log.debug(
@@ -6497,7 +6496,8 @@ class OverflowableToolbar {
@@ -6854,7 +6853,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);
@@ -148,7 +148,7 @@ index e6b9b7dcfab179e7552c146eb1551b45ad042266..d9d838a7a51f67b52b69f419024cc317
return { isOverflowing, targetContentWidth, totalAvailWidth };
}
@@ -6591,7 +6591,7 @@ class OverflowableToolbar {
@@ -6948,7 +6948,7 @@ class OverflowableToolbar {
}
}
if (!inserted) {
@@ -157,7 +157,7 @@ index e6b9b7dcfab179e7552c146eb1551b45ad042266..d9d838a7a51f67b52b69f419024cc317
}
child.removeAttribute("cui-anchorid");
child.removeAttribute("overflowedItem");
@@ -6753,6 +6753,9 @@ class OverflowableToolbar {
@@ -7110,6 +7110,9 @@ class OverflowableToolbar {
* @param {MouseEvent} aEvent the click event.
*/
#onClickDefaultListButton(aEvent) {

View File

@@ -0,0 +1,22 @@
diff --git a/browser/components/customizableui/ToolbarContextMenu.sys.mjs b/browser/components/customizableui/ToolbarContextMenu.sys.mjs
index 9879487f9ed9ddf825f5fb5c1467ddbd7fbe7a32..9e2565fafe0f5f9afa6065c9f4f522fec745db2a 100644
--- a/browser/components/customizableui/ToolbarContextMenu.sys.mjs
+++ b/browser/components/customizableui/ToolbarContextMenu.sys.mjs
@@ -237,17 +237,6 @@ export var ToolbarContextMenu = {
// autohide item's checked state to mirror the autohide pref.
showFullScreenViewContextMenuItems(popup);
- let toggleVerticalTabsItem = document.getElementById(
- "toolbar-context-toggle-vertical-tabs"
- );
- document.l10n.setAttributes(
- toggleVerticalTabsItem,
- gBrowser.tabContainer?.verticalMode
- ? "toolbar-context-turn-off-vertical-tabs"
- : "toolbar-context-turn-on-vertical-tabs"
- );
- document.getElementById("toolbar-context-customize-sidebar").hidden =
- !gBrowser.tabContainer?.verticalMode;
// View -> Toolbars menu doesn't have the moveToPanel or removeFromToolbar items.
if (!moveToPanel || !removeFromToolbar) {

View File

@@ -1,17 +1,13 @@
diff --git a/browser/components/customizableui/content/panelUI.inc.xhtml b/browser/components/customizableui/content/panelUI.inc.xhtml
index 956a6ae45d7adbec1513c5af528ebb687a4b7d0d..83b23e84cb6895497c1346f7c4aff15173e67b5c 100644
index c78f08bdd3fc4d01e10552ef65c2d5813dd053e8..154fb1de2ab9384937d02c14cb7c9c607b330da9 100644
--- a/browser/components/customizableui/content/panelUI.inc.xhtml
+++ b/browser/components/customizableui/content/panelUI.inc.xhtml
@@ -81,9 +81,10 @@
<html:span data-l10n-id="unified-extensions-header-title"/>
</html:h1>
</box>
-
+ <html:p id="unified-extensions-description" data-l10n-id="unified-extensions-description" class="panel-description"/>
+#if 0
<toolbarseparator />
-
+#endif
<vbox class="panel-subview-body" context="unified-extensions-context-menu">
<html:div id="unified-extensions-messages-container">
<!-- messages will be inserted here -->
@@ -132,7 +132,7 @@
<panel id="appMenu-notification-popup"
class="popup-notification-panel panel-no-padding"
type="arrow"
- position="after_start"
+ position="after_end"
flip="slide"
orient="vertical"
noautofocus="true"

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/customizableui/content/panelUI.js b/browser/components/customizableui/content/panelUI.js
index 1805bad6c58e060533f634ed9e511c05cad3ded1..f153761e406535270343fa1f430dea4f740cb2fc 100644
index 7583473ee73538b2fa54337bfd844f03f261be49..559b593a6874296bd5894c5985f8eeb680cd3886 100644
--- a/browser/components/customizableui/content/panelUI.js
+++ b/browser/components/customizableui/content/panelUI.js
@@ -496,8 +496,7 @@ const PanelUI = {
@@ -515,8 +515,7 @@ const PanelUI = {
tempPanel.setAttribute("animate", "false");
}
tempPanel.setAttribute("context", "");
@@ -12,13 +12,12 @@ index 1805bad6c58e060533f634ed9e511c05cad3ded1..f153761e406535270343fa1f430dea4f
.appendChild(tempPanel);
let multiView = document.createXULElement("panelmultiview");
@@ -544,8 +543,8 @@ const PanelUI = {
}
@@ -960,7 +959,7 @@ const PanelUI = {
el.removeAttribute("data-lazy-l10n-id");
});
if (viewShown) {
- CustomizableUI.addPanelCloseListeners(tempPanel);
tempPanel.addEventListener("popuphidden", panelRemover);
+ CustomizableUI.addPanelCloseListeners(tempPanel);
} else {
panelRemover();
}
- this.notificationPanel.openPopup(anchor, "bottomright topright");
+ this.notificationPanel.openPopup(anchor, gZenUIManager.panelUIPosition);
},
_clearNotificationPanel() {

View File

@@ -0,0 +1,15 @@
diff --git a/browser/components/extensions/parent/ext-browser.js b/browser/components/extensions/parent/ext-browser.js
index 179816fa96ccf26604d52f71232296398dd9bdbd..c35814bae4eab774892af1f6df7465601d4f87ac 100644
--- a/browser/components/extensions/parent/ext-browser.js
+++ b/browser/components/extensions/parent/ext-browser.js
@@ -1218,6 +1218,10 @@ class TabManager extends TabManagerBase {
}
canAccessTab(nativeTab) {
+ if (nativeTab.hasAttribute("zen-empty-tab")) {
+ return false
+ }
+
// Check private browsing access at browser window level.
if (!this.extension.canAccessWindow(nativeTab.ownerGlobal)) {
return false;

View File

@@ -0,0 +1,12 @@
diff --git a/browser/components/extensions/parent/ext-tabs.js b/browser/components/extensions/parent/ext-tabs.js
index b47f0510e32d788dfe7c3109474c4512c9900d4a..49697125a2998bbd50d87c54e2c5974baaf9a7e2 100644
--- a/browser/components/extensions/parent/ext-tabs.js
+++ b/browser/components/extensions/parent/ext-tabs.js
@@ -468,6 +468,7 @@ this.tabs = class extends ExtensionAPIPersistent {
}
let tab = tabManager.getWrapper(event.originalTarget);
+ if (!tab) return;
let changeInfo = {};
for (let prop of needed) {

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/places/PlacesUIUtils.sys.mjs b/browser/components/places/PlacesUIUtils.sys.mjs
index fbdd6a34b12d4d957f7a2d9d95df0bfd65ba3f61..4d27f7fc108ca76e071707a737209bf5ea4ea07e 100644
index fbdd6a34b12d4d957f7a2d9d95df0bfd65ba3f61..baaf34536f557c69fce3cc43e6f12658514db39f 100644
--- a/browser/components/places/PlacesUIUtils.sys.mjs
+++ b/browser/components/places/PlacesUIUtils.sys.mjs
@@ -58,6 +58,7 @@ class BookmarkState {
@@ -95,7 +95,7 @@ index fbdd6a34b12d4d957f7a2d9d95df0bfd65ba3f61..4d27f7fc108ca76e071707a737209bf5
+ const placeholders = workspacesToRemove.map(() => '?').join(',');
+ await db.execute(`
+ DELETE FROM zen_bookmarks_workspaces
+ WHERE bookmark_guid = :bookmark_guid
+ WHERE bookmark_guid = :bookmark_guid
+ AND workspace_uuid IN (${placeholders})
+ `, [bookmarkGuid, ...workspacesToRemove]);
+
@@ -157,12 +157,20 @@ index fbdd6a34b12d4d957f7a2d9d95df0bfd65ba3f61..4d27f7fc108ca76e071707a737209bf5
/**
* Append transactions to update tags by given information.
*
@@ -902,7 +1011,7 @@ export var PlacesUIUtils = {
@@ -902,8 +1011,15 @@ export var PlacesUIUtils = {
aNode,
aWhere,
aWindow,
- { aPrivate = false, userContextId = 0 } = {}
+ { aPrivate = false, userContextId = aWindow.ZenWorkspaces.getDefaultContainer() } = {}
+ { aPrivate = false, userContextId = undefined } = {}
) {
+ if (typeof userContextId == "undefined") {
+ try {
+ let browserWindow = getBrowserWindow(aWindow);
+ userContextId = browserWindow.ZenWorkspaces.getDefaultContainer();
+ } catch {}
+ }
+
if (
aNode &&
lazy.PlacesUtils.nodeIsURI(aNode) &&

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/places/content/editBookmark.js b/browser/components/places/content/editBookmark.js
index 9f17174fdd9cc1eaefb4330da1e10f40eeda2f31..e2c38872ee3a5c45d2e288e67d33f9ce24cab2b9 100644
index 9ab4e96cc4738d0ba549dca67b8559e0f9534f37..07b9087b0b17e33853d78c66ea1e5321a2bfef80 100644
--- a/browser/components/places/content/editBookmark.js
+++ b/browser/components/places/content/editBookmark.js
@@ -370,6 +370,10 @@ var gEditItemOverlay = {
@@ -386,6 +386,10 @@ var gEditItemOverlay = {
this._keywordField.readOnly = this.readOnly;
}
@@ -13,7 +13,7 @@ index 9f17174fdd9cc1eaefb4330da1e10f40eeda2f31..e2c38872ee3a5c45d2e288e67d33f9ce
// Collapse the tag selector if the item does not accept tags.
if (showOrCollapse("tagsRow", isBookmark || bulkTagging, "tags")) {
this._initTagsField();
@@ -682,6 +686,7 @@ var gEditItemOverlay = {
@@ -692,6 +696,7 @@ var gEditItemOverlay = {
if (this._paneInfo.isBookmark) {
options.tags = this._element("tagsField").value;
options.keyword = this._keyword;
@@ -21,7 +21,17 @@ index 9f17174fdd9cc1eaefb4330da1e10f40eeda2f31..e2c38872ee3a5c45d2e288e67d33f9ce
}
if (this._paneInfo.bulkTagging) {
@@ -1232,6 +1237,148 @@ var gEditItemOverlay = {
@@ -1193,6 +1198,9 @@ var gEditItemOverlay = {
case "editBMPanel_tagsSelectorExpander":
this.toggleTagsSelector().catch(console.error);
break;
+ case "editBMPanel_workspacesSelectorExpander":
+ this.onWorkspaceDropdownToggle();
+ break;
}
break;
}
@@ -1279,6 +1287,148 @@ var gEditItemOverlay = {
get bookmarkState() {
return this._bookmarkState;
},
@@ -170,7 +180,7 @@ index 9f17174fdd9cc1eaefb4330da1e10f40eeda2f31..e2c38872ee3a5c45d2e288e67d33f9ce
};
ChromeUtils.defineLazyGetter(gEditItemOverlay, "_folderTree", () => {
@@ -1267,6 +1414,9 @@ for (let elt of [
@@ -1317,6 +1467,9 @@ for (let elt of [
"locationField",
"keywordField",
"tagsField",

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/places/content/editBookmarkPanel.inc.xhtml b/browser/components/places/content/editBookmarkPanel.inc.xhtml
index 40366677b60123c66bf0739d1b2374b423d3061c..3e722dce6b21ab62535369f20afe5f0acd43838f 100644
index 40366677b60123c66bf0739d1b2374b423d3061c..a2774e99726407d95011126ea2a272f08eaf0961 100644
--- a/browser/components/places/content/editBookmarkPanel.inc.xhtml
+++ b/browser/components/places/content/editBookmarkPanel.inc.xhtml
@@ -12,14 +12,15 @@
@@ -20,11 +20,10 @@ index 40366677b60123c66bf0739d1b2374b423d3061c..3e722dce6b21ab62535369f20afe5f0a
<label data-l10n-id="bookmark-overlay-location-2"
class="editBMPanel_folderRow hideable"
control="editBMPanel_folderMenuList"/>
@@ -47,7 +48,26 @@
@@ -47,7 +48,25 @@
class="expander-down panel-button"
data-l10n-id="bookmark-overlay-folders-expander2"/>
</hbox>
-
+ </hbox>
+ <hbox flex="1" class="zenEditBMPanel_fieldContainer">
+ <label data-l10n-id="zen-bookmark-edit-panel-workspace-selector"
@@ -37,12 +36,11 @@ index 40366677b60123c66bf0739d1b2374b423d3061c..3e722dce6b21ab62535369f20afe5f0a
+ class="workspace-trigger">-</div>
+ <button id="editBMPanel_workspacesSelectorExpander"
+ class="expander-down panel-button"
+ data-l10n-id="bookmark-overlay-tags-expander2"
+ oncommand="gEditItemOverlay.onWorkspaceDropdownToggle();"/>
+
+ data-l10n-id="bookmark-overlay-tags-expander2"/>
+
+ </div>
+ </hbox>
+
+ <ul id="editBMPanel_workspaceList" class="workspace-list hideable" hidden="true">
+ </ul>
<vbox id="editBMPanel_folderTreeRow"

View File

@@ -944,16 +944,6 @@ Preferences.addAll([
type: 'bool',
default: true,
},
{
id: 'zen.workspaces.individual-pinned-tabs',
type: 'bool',
default: true,
},
{
id: 'zen.workspaces.show-icon-strip',
type: 'bool',
default: true,
},
{
id: 'zen.tab-unloader.enabled',
type: 'bool',

View File

@@ -20,12 +20,6 @@
<checkbox id="zenWorkspacesHideDefaultContainer"
data-l10n-id="zen-settings-workspaces-hide-default-container-indicator"
preference="zen.workspaces.hide-default-container-indicator"/>
<checkbox id="zenWorkspacesAllowPinnedTabsForDifferentWorkspaces"
data-l10n-id="zen-settings-workspaces-allow-pinned-tabs-for-different-workspaces"
preference="zen.workspaces.individual-pinned-tabs"/>
<checkbox id="zenWorkspacesDisplayAsIconStrip"
data-l10n-id="zen-settings-workspaces-display-as-icon-strip"
preference="zen.workspaces.show-icon-strip"/>
<checkbox id="zenWorkspacesForceContainerTabsToWorkspace"
data-l10n-id="zen-settings-workspaces-force-container-tabs-to-workspace"
preference="zen.workspaces.force-container-workspace"/>

View File

@@ -0,0 +1,13 @@
diff --git a/browser/components/search/SearchOneOffs.sys.mjs b/browser/components/search/SearchOneOffs.sys.mjs
index 6dcd68f7ec4da72f9510ac3c8ff1cecffbd70e92..f712b95d03be46f7d81bad4113f533f0515a92b9 100644
--- a/browser/components/search/SearchOneOffs.sys.mjs
+++ b/browser/components/search/SearchOneOffs.sys.mjs
@@ -446,7 +446,7 @@ export class SearchOneOffs {
// For the search-bar, always show the one-off buttons where there is an
// option to add an engine.
let addEngineNeeded = isSearchBar && addEngines.length;
- let hideOneOffs = (await this.willHide()) && !addEngineNeeded;
+ let hideOneOffs = (await this.willHide()) && !addEngineNeeded || Services.prefs.getBoolPref("zen.urlbar.hide-one-offs");
// The _engineInfo cache is used by more consumers, thus it is not a good
// representation of whether this method already updated the one-off buttons

View File

@@ -1,16 +1,25 @@
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
index 908743177d9f95e2e6549c689e7a493ca8668701..181c4819b052e444e56e75f1cb40b4bc299569fb 100644
index f814772114948f87cbb3c3a7231c95ea1f68d776..ae35daa518ca25f4fc95ef983519c390bf088a68 100644
--- a/browser/components/sessionstore/SessionStore.sys.mjs
+++ b/browser/components/sessionstore/SessionStore.sys.mjs
@@ -3848,6 +3848,7 @@ var SessionStoreInternal = {
aWindow.gBrowser.selectedTab = newTab;
}
@@ -3171,7 +3171,7 @@ var SessionStoreInternal = {
if (!isPrivateWindow && tabState.isPrivate) {
return;
}
- if (aTab == aWindow.FirefoxViewHandler.tab) {
+ if (aTab == aWindow.FirefoxViewHandler.tab || aTab.hasAttribute("zen-empty-tab")) {
return;
}
+ if (aTab.hasAttribute("zenDefaultUserContextId")) newTab.setAttribute("zenDefaultUserContextId", true);
// Restore the state into the new tab.
this.restoreTab(newTab, tabState, {
restoreImmediately: aRestoreImmediately,
@@ -5315,14 +5316,14 @@ var SessionStoreInternal = {
@@ -3876,6 +3876,7 @@ var SessionStoreInternal = {
Math.min(tabState.index, tabState.entries.length)
);
tabState.pinned = false;
+ tabState.zenEssential = undefined;
if (inBackground === false) {
aWindow.gBrowser.selectedTab = newTab;
@@ -5355,14 +5356,14 @@ var SessionStoreInternal = {
}
let tabbrowser = aWindow.gBrowser;
@@ -27,7 +36,16 @@ index 908743177d9f95e2e6549c689e7a493ca8668701..181c4819b052e444e56e75f1cb40b4bc
continue;
}
let tabData = lazy.TabState.collect(tab, TAB_CUSTOM_VALUES.get(tab));
@@ -6042,6 +6043,15 @@ var SessionStoreInternal = {
@@ -5381,7 +5382,7 @@ var SessionStoreInternal = {
// We don't store the Firefox View tab in Session Store, so if it was the last selected "tab" when
// a window is closed, point to the first item in the tab strip instead (it will never be the Firefox View tab,
// since it's only inserted into the tab strip after it's selected).
- if (aWindow.FirefoxViewHandler.tab?.selected) {
+ if (aWindow.FirefoxViewHandler.tab?.selected || tabbrowser.selectedTab.hasAttribute("zen-empty-tab")) {
selectedIndex = 1;
winData.title = tabbrowser.tabs[0].label;
}
@@ -6086,8 +6087,23 @@ var SessionStoreInternal = {
// Most of tabData has been restored, now continue with restoring
// attributes that may trigger external events.
@@ -35,11 +53,20 @@ index 908743177d9f95e2e6549c689e7a493ca8668701..181c4819b052e444e56e75f1cb40b4bc
+ tab.setAttribute("zen-essential", "true");
+ }
+ if (tabData.zenIsEmpty) {
+ tab.setAttribute("zen-empty-tab", "true");
+ tab.setAttribute("zen-empty-tab", "true");
+ }
+ if (tabData.zenHasStaticLabel) {
+ tab.setAttribute("zen-has-static-label", "true");
+ }
+ if (tabData.zenPinnedId) {
+ tab.setAttribute("zen-pin-id", tabData.zenPinnedId);
+ }
+ if (tabData.zenDefaultUserContextId) {
+ tab.setAttribute("zenDefaultUserContextId", true);
+ }
if (tabData.pinned) {
- if (tabData.pinned) {
+ if (tabData.pinned || tabData.zenEssential) {
tabbrowser.pinTab(tab);
} else {
tabbrowser.unpinTab(tab);

View File

@@ -1,18 +1,25 @@
diff --git a/browser/components/sessionstore/TabState.sys.mjs b/browser/components/sessionstore/TabState.sys.mjs
index 8f7ed557e6aa61e7e16ed4a8d785ad5fe651b3d8..05dbb00375523819163bcd225074117ef02b8b37 100644
index 8f7ed557e6aa61e7e16ed4a8d785ad5fe651b3d8..aff63696d198055886960072a6130318e099ae42 100644
--- a/browser/components/sessionstore/TabState.sys.mjs
+++ b/browser/components/sessionstore/TabState.sys.mjs
@@ -84,6 +84,14 @@ class _TabState {
@@ -80,10 +80,20 @@ class _TabState {
tabData.muteReason = tab.muteReason;
}
- if (tab.group) {
+ if (tab.group && !tab.group.hasAttribute("split-view-group")) {
tabData.groupId = tab.group.id;
}
+ tabData.zenWorkspace = tab.getAttribute("zen-workspace-id");
+ tabData.zenPinnedId = tab.getAttribute("zen-pin-id");
+ tabData.zenEssential = tab.getAttribute("zen-essential");
+ tabData.pinned = tabData.pinned || tabData.zenEssential;
+ tabData.zenDefaultUserContextId = tab.getAttribute("zenDefaultUserContextId");
+ tabData.zenPinnedEntry = tab.getAttribute("zen-pinned-entry");
+ tabData.zenPinnedIcon = tab.getAttribute("zen-pinned-icon");
+ tabData.zenIsEmpty = tab.hasAttribute("zen-empty-tab");
+ tabData.zenHasStaticLabel = tab.hasAttribute("zen-has-static-label");
+
tabData.searchMode = tab.ownerGlobal.gURLBar.getSearchMode(browser, true);

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js
index d41c486c02a6f09dcff5741a59ad8b617294c481..8e902dcb3792c75238ac13a8bf9199b34451aa51 100644
index 777eabb7524f2b021a03b3f54d69faee49b7381d..192d2fa058f7d9f043532c0ae6e4c08129d16b8e 100644
--- a/browser/components/tabbrowser/content/tab.js
+++ b/browser/components/tabbrowser/content/tab.js
@@ -16,6 +16,7 @@
@@ -10,9 +10,9 @@ index d41c486c02a6f09dcff5741a59ad8b617294c481..8e902dcb3792c75238ac13a8bf9199b3
<stack class="tab-icon-stack">
<hbox class="tab-throbber"/>
<hbox class="tab-icon-pending"/>
@@ -35,8 +36,10 @@
@@ -32,8 +33,10 @@
<hbox class="tab-secondary-label">
<label class="tab-icon-sound-label tab-icon-sound-pip-label" data-l10n-id="browser-tab-audio-pip" role="presentation"/>
<label class="tab-icon-sound-label tab-icon-sound-tooltip-label" role="presentation"/>
</hbox>
+ <label class="tab-reset-pin-label" data-l10n-id="tab-reset-pin-label" role="presentation"/>
</vbox>
@@ -48,16 +48,16 @@ index d41c486c02a6f09dcff5741a59ad8b617294c481..8e902dcb3792c75238ac13a8bf9199b3
}
get lastAccessed() {
@@ -451,6 +454,8 @@
@@ -438,6 +441,8 @@
this.style.MozUserFocus = "ignore";
} else if (
event.target.classList.contains("tab-close-button") ||
+ event.target.classList.contains("tab-reset-button") ||
+ event.target.classList.contains("tab-reset-pin-button") ||
event.target.classList.contains("tab-icon-overlay")
event.target.classList.contains("tab-icon-overlay") ||
event.target.classList.contains("tab-audio-button")
) {
eventMaySelectTab = false;
@@ -544,6 +549,7 @@
@@ -536,6 +541,7 @@
if (this.multiselected) {
gBrowser.removeMultiSelectedTabs();
} else {
@@ -65,7 +65,7 @@ index d41c486c02a6f09dcff5741a59ad8b617294c481..8e902dcb3792c75238ac13a8bf9199b3
gBrowser.removeTab(this, {
animate: true,
triggeringEvent: event,
@@ -553,6 +559,14 @@
@@ -545,6 +551,14 @@
// (see tabbrowser-tabs 'click' handler).
gBrowser.tabContainer._blockDblClick = true;
}
@@ -80,7 +80,7 @@ index d41c486c02a6f09dcff5741a59ad8b617294c481..8e902dcb3792c75238ac13a8bf9199b3
}
on_dblclick(event) {
@@ -576,6 +590,8 @@
@@ -568,6 +582,8 @@
animate: true,
triggeringEvent: event,
});

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d86368263 100644
index 628aa6596627c85efe361fc1ece8fd58f7ee653e..06a4aae50ebe8a42d08d4689d8e80a63af1fa8a3 100644
--- a/browser/components/tabbrowser/content/tabbrowser.js
+++ b/browser/components/tabbrowser/content/tabbrowser.js
@@ -406,11 +406,50 @@
@@ -412,11 +412,50 @@
return this.tabContainer.visibleTabs;
}
@@ -55,25 +55,50 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
}
return i;
}
@@ -807,7 +846,7 @@
@@ -546,6 +585,7 @@
this.tabpanels.appendChild(panel);
let tab = this.tabs[0];
+ ZenWorkspaces.handleInitialTab(tab, (!remoteType || remoteType === E10SUtils.PRIVILEGEDABOUT_REMOTE_TYPE) && !Services.prefs.getBoolPref('zen.workspaces.disable_empty_state_for_testing', false));
tab.linkedPanel = uniqueId;
this._selectedTab = tab;
this._selectedBrowser = browser;
@@ -811,12 +851,13 @@
}
this.showTab(aTab);
if (this.tabContainer.verticalMode) {
- this.ungroupTab(aTab);
- if (this.tabContainer.verticalMode) {
+ const handled = gZenFolders.handleTabPin(aTab);
+ if (!handled) this.ungroupTab(aTab);
+ if (this.tabContainer.verticalMode && !handled) {
this._handleTabMove(aTab, () =>
- this.verticalPinnedTabsContainer.appendChild(aTab)
+ aTab.hasAttribute("zen-essential") ? document.getElementById("zen-essentials-container").appendChild(aTab) : this.verticalPinnedTabsContainer.insertBefore(aTab, this.verticalPinnedTabsContainer.lastChild)
);
} else {
- } else {
+ } else if (!handled) {
this.moveTabTo(aTab, this.pinnedTabCount, { forceStandaloneTab: true });
@@ -828,7 +867,7 @@
}
aTab.setAttribute("pinned", "true");
@@ -830,12 +871,15 @@
}
if (this.tabContainer.verticalMode) {
+ const handled = gZenFolders.handleTabUnpin(aTab);
this._handleTabMove(aTab, () => {
// we remove this attribute first, so that allTabs represents
// the moving of a tab from the vertical pinned tabs container
// and back into arrowscrollbox.
aTab.removeAttribute("pinned");
- this.tabContainer.arrowScrollbox.prepend(aTab);
+ ZenWorkspaces.activeWorkspaceStrip.prepend(aTab);
+ if (!handled) {
+ ZenWorkspaces.activeWorkspaceStrip.prepend(aTab);
+ }
});
} else {
this.moveTabTo(aTab, this.pinnedTabCount - 1, {
@@ -1055,6 +1094,8 @@
@@ -1018,6 +1062,8 @@
let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"];
@@ -82,7 +107,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
if (
aIconURL &&
!aLoadingPrincipal &&
@@ -1065,6 +1106,9 @@
@@ -1028,6 +1074,9 @@
);
return;
}
@@ -92,7 +117,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
let browser = this.getBrowserForTab(aTab);
browser.mIconURL = aIconURL;
@@ -1310,6 +1354,7 @@
@@ -1273,6 +1322,7 @@
if (!this._previewMode) {
newTab.recordTimeFromUnloadToReload();
newTab.updateLastAccessed();
@@ -100,7 +125,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
oldTab.updateLastAccessed();
// if this is the foreground window, update the last-seen timestamps.
if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) {
@@ -1462,6 +1507,9 @@
@@ -1425,6 +1475,9 @@
}
let activeEl = document.activeElement;
@@ -110,7 +135,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
// If focus is on the old tab, move it to the new tab.
if (activeEl == oldTab) {
newTab.focus();
@@ -1785,7 +1833,7 @@
@@ -1748,7 +1801,7 @@
}
_setTabLabel(aTab, aLabel, { beforeTabOpen, isContentTitle, isURL } = {}) {
@@ -119,7 +144,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
return false;
}
@@ -1888,7 +1936,7 @@
@@ -1851,7 +1904,7 @@
newIndex = this.selectedTab._tPos + 1;
}
@@ -128,17 +153,25 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
let browser;
if (targetTab) {
browser = this.getBrowserForTab(targetTab);
@@ -2222,7 +2270,8 @@
@@ -2108,6 +2161,7 @@
uriIsAboutBlank,
userContextId,
skipLoad,
+ _forZenEmptyTab,
} = {}) {
let b = document.createXULElement("browser");
// Use the JSM global to create the permanentKey, so that if the
@@ -2181,8 +2235,7 @@
// we use a different attribute name for this?
b.setAttribute("name", name);
}
-
- if (this._allowTransparentBrowser) {
+ if (this._allowTransparentBrowser || this._forZenEmptyTab) {
+ delete this._forZenEmptyTab;
+ if (this._allowTransparentBrowser || _forZenEmptyTab) {
b.setAttribute("transparent", "true");
}
@@ -2387,7 +2436,7 @@
@@ -2347,7 +2400,7 @@
let panel = this.getPanel(browser);
let uniqueId = this._generateUniquePanelID();
@@ -147,7 +180,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
aTab.linkedPanel = uniqueId;
// Inject the <browser> into the DOM if necessary.
@@ -2446,8 +2495,8 @@
@@ -2406,8 +2459,8 @@
// If we transitioned from one browser to two browsers, we need to set
// hasSiblings=false on both the existing browser and the new browser.
if (this.tabs.length == 2) {
@@ -158,20 +191,28 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
} else {
aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1;
}
@@ -2679,6 +2728,12 @@
@@ -2629,6 +2682,7 @@
schemelessInput,
hasValidUserGestureActivation = false,
textDirectiveUserActivation = false,
+ _forZenEmptyTab,
} = {}
) {
// all callers of addTab that pass a params object need to pass
@@ -2639,6 +2693,12 @@
);
}
+ let hasZenDefaultUserContextId = false;
+ let zenForcedWorkspaceId = undefined;
+ if (typeof ZenWorkspaces !== "undefined") {
+ if (typeof ZenWorkspaces !== "undefined" && !_forZenEmptyTab) {
+ [userContextId, hasZenDefaultUserContextId, zenForcedWorkspaceId] = ZenWorkspaces.getContextIdIfNeeded(userContextId, fromExternal, allowInheritPrincipal);
+ }
+
if (!UserInteraction.running("browser.tabs.opening", window)) {
UserInteraction.start("browser.tabs.opening", "initting", window);
}
@@ -2742,6 +2797,12 @@
@@ -2702,6 +2762,15 @@
noInitialLabel,
skipBackgroundNotify,
});
@@ -180,11 +221,22 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
+ }
+ if (zenForcedWorkspaceId !== undefined) {
+ t.setAttribute("zen-workspace-id", zenForcedWorkspaceId);
+ }
+ if (_forZenEmptyTab) {
+ t.setAttribute("zen-empty-tab", "true");
+ }
if (insertTab) {
// insert the tab into the tab container in the correct position
this._insertTabAtIndex(t, {
@@ -2885,6 +2946,9 @@
@@ -2726,6 +2795,7 @@
initialBrowsingContextGroupId,
openWindowInfo,
skipLoad,
+ _forZenEmptyTab,
}));
if (focusUrlBar) {
@@ -2845,6 +2915,9 @@
}
}
@@ -194,7 +246,45 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
// Additionally send pinned tab events
if (pinned) {
this._notifyPinnedStatus(t);
@@ -3403,6 +3467,24 @@
@@ -2904,6 +2977,7 @@
label = "",
insertBefore = null,
showCreateUI = false,
+ forSplitView = false,
} = {}
) {
if (!tabs?.length) {
@@ -2918,7 +2992,12 @@
id = `${Date.now()}-${Math.round(Math.random() * 100)}`;
}
let group = this._createTabGroup(id, color, false, label);
- this.tabContainer.insertBefore(
+ if (forSplitView) {
+ group.setAttribute('split-view-group', true);
+ }
+ group.essential = tabs.some(tab => tab.hasAttribute("essential"));
+ group.pinned = group.essential || tabs.some(tab => tab.pinned);
+ (group.essential ? document.getElementById("zen-essentials-container") : (group.pinned ? this.verticalPinnedTabsContainer : this.tabContainer)).insertBefore(
group,
insertBefore?.group ?? insertBefore
);
@@ -3126,6 +3205,7 @@
initialBrowsingContextGroupId,
openWindowInfo,
skipLoad,
+ _forZenEmptyTab
}
) {
// If we don't have a preferred remote type, and we have a remote
@@ -3189,6 +3269,7 @@
openWindowInfo,
name,
skipLoad,
+ _forZenEmptyTab
});
}
@@ -3367,6 +3448,27 @@
) {
tabWasReused = true;
tab = this.selectedTab;
@@ -204,6 +294,9 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
+ if (tabData.zenIsEmpty) {
+ tab.setAttribute("zen-empty-tab", "true");
+ }
+ if (tabData.zenHasStaticLabel) {
+ tab.setAttribute("zen-has-static-label", "true");
+ }
+ if (tabData.zenPinnedId) {
+ tab.setAttribute("zen-pin-id", tabData.zenPinnedId);
+ }
@@ -219,7 +312,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
if (!tabData.pinned) {
this.unpinTab(tab);
} else {
@@ -3416,6 +3498,7 @@
@@ -3380,6 +3482,7 @@
restoreTabsLazily && !select && !tabData.pinned;
let url = "about:blank";
@@ -227,7 +320,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
if (tabData.entries?.length) {
let activeIndex = (tabData.index || tabData.entries.length) - 1;
// Ensure the index is in bounds.
@@ -3451,7 +3534,24 @@
@@ -3415,7 +3518,27 @@
skipLoad: true,
preferredRemoteType,
});
@@ -241,6 +334,9 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
+ if (tabData.zenIsEmpty) {
+ tab.setAttribute("zen-empty-tab", "true");
+ }
+ if (tabData.zenHasStaticLabel) {
+ tab.setAttribute("zen-has-static-label", "true");
+ }
+ if (tabData.zenEssential) {
+ tab.setAttribute("zen-essential", "true");
+ }
@@ -253,7 +349,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
if (select) {
tabToSelect = tab;
}
@@ -3464,8 +3564,8 @@
@@ -3428,8 +3551,8 @@
// inserted in the DOM. If the tab is not yet in the DOM,
// just insert it in the right place from the start.
if (!tab.parentNode) {
@@ -264,7 +360,17 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
tab.toggleAttribute("pinned", true);
this.tabContainer._invalidateCachedTabs();
// Then ensure all the tab open/pinning information is sent.
@@ -3729,7 +3829,7 @@
@@ -3504,6 +3627,9 @@
this.selectedTab = tabToSelect;
this.removeTab(leftoverTab);
}
+ else {
+ this.selectedTab._possiblyEmpty = this.selectedTab.isEmpty; // Not needed, but just in case.
+ }
if (tabs.length > 1 || !tabs[0].selected) {
this._updateTabsAfterInsert();
@@ -3693,7 +3819,7 @@
// Ensure we have an index if one was not provided.
if (typeof index != "number") {
// Move the new tab after another tab if needed, to the end otherwise.
@@ -273,7 +379,17 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
if (
!bulkOrderedOpen &&
((openerTab &&
@@ -3780,7 +3880,7 @@
@@ -3736,18 +3862,18 @@
// Ensure index is within bounds.
if (tab.pinned) {
- index = Math.max(index, 0);
- index = Math.min(index, this.pinnedTabCount);
+ index = Math.max(index, tab.hasAttribute("zen-essential") ? 0 : this._numZenEssentials);
+ index = Math.min(index, tab.hasAttribute("zen-essential") ? this._numZenEssentials : this.pinnedTabCount);
} else {
index = Math.max(index, this.pinnedTabCount);
index = Math.min(index, this.tabs.length);
}
/** @type {MozTabbrowserTab|undefined} */
@@ -281,8 +397,12 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
+ let tabAfter = this.tabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).at(index);
this.tabContainer._invalidateCachedTabs();
if (tabGroup) {
@@ -4095,6 +4195,9 @@
- if (tabGroup) {
+ if (tabGroup && !tabGroup.hasAttribute("split-view-group")) {
if (tabAfter && tabAfter.group == tabGroup) {
// Place at the front of, or between tabs in, the same tab group
this.tabContainer.insertBefore(tab, tabAfter);
@@ -4059,6 +4185,9 @@
return;
}
@@ -292,7 +412,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
this.removeTabs(selectedTabs);
}
@@ -4427,6 +4530,7 @@
@@ -4391,6 +4520,7 @@
skipSessionStore,
} = {}
) {
@@ -300,7 +420,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
if (UserInteraction.running("browser.tabs.opening", window)) {
UserInteraction.finish("browser.tabs.opening", window);
}
@@ -4443,6 +4547,12 @@
@@ -4407,6 +4537,12 @@
TelemetryStopwatch.start("FX_TAB_CLOSE_TIME_NO_ANIM_MS", aTab);
}
@@ -313,7 +433,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
// Handle requests for synchronously removing an already
// asynchronously closing tab.
if (!animate && aTab.closing) {
@@ -4457,7 +4567,9 @@
@@ -4421,7 +4557,9 @@
// frame created for it (for example, by updating the visually selected
// state).
let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width;
@@ -324,7 +444,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
if (
!this._beginRemoveTab(aTab, {
closeWindowFastpath: true,
@@ -4471,7 +4583,6 @@
@@ -4435,7 +4573,6 @@
TelemetryStopwatch.cancel("FX_TAB_CLOSE_TIME_NO_ANIM_MS", aTab);
return;
}
@@ -332,7 +452,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
let lockTabSizing =
!this.tabContainer.verticalMode &&
!aTab.pinned &&
@@ -4610,14 +4721,14 @@
@@ -4574,14 +4711,14 @@
!!this.tabsInCollapsedTabGroups.length;
if (
aTab.visible &&
@@ -349,7 +469,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
if (closeWindow) {
// We've already called beforeunload on all the relevant tabs if we get here,
@@ -4641,6 +4752,7 @@
@@ -4605,6 +4742,7 @@
newTab = true;
}
@@ -357,18 +477,18 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
aTab._endRemoveArgs = [closeWindow, newTab];
// swapBrowsersAndCloseOther will take care of closing the window without animation.
@@ -4681,9 +4793,7 @@
@@ -4645,9 +4783,7 @@
aTab._mouseleave();
if (newTab) {
- this.addTrustedTab(BROWSER_NEW_TAB_URL, {
- skipAnimation: true,
- });
+ ZenWorkspaces.selectEmptyTab();
+ ZenWorkspaces.selectEmptyTab(BROWSER_NEW_TAB_URL);
} else {
TabBarVisibility.update();
}
@@ -4812,6 +4922,8 @@
@@ -4776,6 +4912,8 @@
this.tabs[i]._tPos = i;
}
@@ -377,7 +497,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
if (!this._windowIsClosing) {
if (wasPinned) {
this.tabContainer._positionPinnedTabs();
@@ -5025,7 +5137,7 @@
@@ -4994,7 +5132,7 @@
!excludeTabs.has(aTab.owner) &&
Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose")
) {
@@ -386,7 +506,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
}
// Try to find a remaining tab that comes after the given tab
@@ -5047,7 +5159,7 @@
@@ -5016,7 +5154,7 @@
}
if (tab) {
@@ -395,7 +515,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
}
// If no qualifying visible tab was found, see if there is a tab in
@@ -5465,10 +5577,10 @@
@@ -5434,10 +5572,10 @@
SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
}
@@ -408,7 +528,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
aTab.selected ||
aTab.closing ||
// Tabs that are sharing the screen, microphone or camera cannot be hidden.
@@ -5706,7 +5818,7 @@
@@ -5675,7 +5813,7 @@
// Don't allow mixing pinned and unpinned tabs.
if (aTab.pinned) {
@@ -417,16 +537,47 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
} else {
aIndex = Math.max(aIndex, this.pinnedTabCount);
}
@@ -5717,7 +5829,7 @@
this._lastRelatedTabMap = new WeakMap();
@@ -5685,10 +5823,17 @@
this._handleTabMove(aTab, () => {
- let neighbor = this.tabs[aIndex];
+ let neighbor = this.tabs.filter(tab => !tab.hasAttribute("zen-glance-tab") && !tab.hasAttribute("zen-empty-tab"))[aIndex];
if (forceStandaloneTab && neighbor.group) {
let neighbor = this.tabs[aIndex];
- if (forceStandaloneTab && neighbor.group) {
+ const _tPos = aTab._tPos;
+ if ((forceStandaloneTab && neighbor.group) || neighbor.group?.hasAttribute("split-view-group")) {
neighbor = neighbor.group;
}
@@ -5802,7 +5914,7 @@
- if (neighbor && aIndex >= aTab._tPos) {
+ if (aTab.group?.hasAttribute("split-view-group")) {
+ aTab = aTab.group;
+ }
+ if (aTab.group?.hasAttribute("split-view-group") && neighbor == aTab.group) {
+ return;
+ }
+ if (neighbor && aIndex >= _tPos) {
neighbor.after(aTab);
} else {
this.tabContainer.insertBefore(aTab, neighbor);
@@ -5697,7 +5842,7 @@
}
moveTabToGroup(aTab, aGroup) {
- if (aTab.pinned) {
+ if (aTab.pinned != !!aGroup.pinned) {
return;
}
if (aTab.group && aTab.group.id === aGroup.id) {
@@ -5721,6 +5866,10 @@
moveActionCallback();
+ ZenWorkspaces._makeSureEmptyTabIsLast();
+ gZenViewSplitter._maybeRemoveFakeBrowser(false);
+ gZenViewSplitter._canDrop = false;
+
// Clear tabs cache after moving nodes because the order of tabs may have
// changed.
this.tabContainer._invalidateCachedTabs();
@@ -5771,7 +5920,7 @@
createLazyBrowser,
};
@@ -435,15 +586,24 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
if (aIndex < numPinned || (aTab.pinned && aIndex == numPinned)) {
params.pinned = true;
}
@@ -7443,6 +7555,7 @@
@@ -6513,7 +6662,7 @@
// preventDefault(). It will still raise the window if appropriate.
break;
}
- this.selectedTab = tab;
+ ZenWorkspaces.switchTabIfNeeded(tab);
window.focus();
aEvent.preventDefault();
break;
@@ -7415,6 +7564,7 @@
aWebProgress.isTopLevel
) {
this.mTab.setAttribute("busy", "true");
+ if (!this.mTab.selected) this.mTab.setAttribute("unread", "true");
gBrowser._tabAttrModified(this.mTab, ["busy"]);
this.mTab._notselectedsinceload = !this.mTab.selected;
gBrowser.syncThrobberAnimations(this.mTab);
@@ -8411,7 +8524,7 @@ var TabContextMenu = {
}
@@ -8381,7 +8531,7 @@ var TabContextMenu = {
);
contextUnpinSelectedTabs.hidden =
!this.contextTab.pinned || !multiselectionContext;
@@ -452,7 +612,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
// Move Tab items
let contextMoveTabOptions = document.getElementById(
"context_moveTabOptions"
@@ -8444,7 +8557,7 @@ var TabContextMenu = {
@@ -8414,7 +8564,7 @@ var TabContextMenu = {
let contextMoveTabToStart = document.getElementById("context_moveToStart");
let isFirstTab =
tabsToMove[0] == visibleTabs[0] ||
@@ -461,7 +621,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d
contextMoveTabToStart.disabled = isFirstTab && allSelectedTabsAdjacent;
document.getElementById("context_openTabInWindow").disabled =
@@ -8677,6 +8790,7 @@ var TabContextMenu = {
@@ -8647,6 +8797,7 @@ var TabContextMenu = {
if (this.contextTab.multiselected) {
gBrowser.removeMultiSelectedTabs();
} else {

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af295c7369 100644
index fa96568d366fd3608f9bd583fa793150bd815c8b..1c940a3b162919256ca73fa867c5c261a3395e25 100644
--- a/browser/components/tabbrowser/content/tabs.js
+++ b/browser/components/tabbrowser/content/tabs.js
@@ -94,7 +94,7 @@
@@ -11,7 +11,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
}
return true;
};
@@ -362,7 +362,7 @@
@@ -339,7 +339,7 @@
// and we're not hitting the scroll buttons.
if (
event.button != 0 ||
@@ -20,7 +20,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
event.composedTarget.localName == "toolbarbutton"
) {
return;
@@ -411,6 +411,7 @@
@@ -388,6 +388,7 @@
// Reset the "ignored click" flag
target._ignoredCloseButtonClicks = false;
}
@@ -28,7 +28,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
}
/* Protects from close-tab-button errant doubleclick:
@@ -659,7 +660,7 @@
@@ -683,7 +684,7 @@
if (this.#isContainerVerticalPinnedExpanded(tab)) {
// In expanded vertical mode, the max number of pinned tabs per row is dynamic
// Set this before adjusting dragged tab's position
@@ -37,20 +37,25 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
let tabsPerRow = 0;
let position = 0;
for (let pinnedTab of pinnedTabs) {
@@ -859,6 +860,9 @@
@@ -883,6 +884,10 @@
}
let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
+ if (draggedTab && effects === "move") {
+ gZenPinnedTabManager.applyDragoverClass(event, draggedTab);
+ gZenViewSplitter.onBrowserDragEndToSplit(event);
+ }
if (
(effects == "move" || effects == "copy") &&
this == draggedTab.container &&
@@ -972,6 +976,14 @@
@@ -996,6 +1001,18 @@
this._tabDropIndicator.hidden = true;
event.stopPropagation();
+ if (draggedTab?.hasAttribute("zen-has-splitted")) {
+ draggedTab.removeAttribute("zen-has-splitted");
+ draggedTab._visuallySelected = false;
+ }
+ if (draggedTab && dropEffect == "move") {
+ let moved = gZenPinnedTabManager.moveToAnotherTabContainerIfNecessary(event, movingTabs);
+
@@ -62,18 +67,23 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
if (draggedTab && dropEffect == "copy") {
// copy the dropped tab (wherever it's from)
let newIndex = this._getDropIndex(event);
@@ -1010,8 +1022,8 @@
@@ -1034,10 +1051,11 @@
}
} else {
let pinned = draggedTab.pinned;
- let numPinned = gBrowser.pinnedTabCount;
- let tabs = this.visibleTabs.slice(
- pinned ? 0 : numPinned,
- pinned ? numPinned : undefined
+ let numPinned = gBrowser._numVisiblePinTabs;
+ let essential = draggedTab.hasAttribute("zen-essential");
+ let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(
pinned ? 0 : numPinned,
pinned ? numPinned : undefined
+ pinned ? (essential ? 0 : gBrowser._numZenVisibleEssentials) : numPinned,
+ pinned ? (essential ? gBrowser._numZenVisibleEssentials : numPinned) : undefined
);
@@ -1090,7 +1102,7 @@
let size = this.verticalMode ? "height" : "width";
let screenAxis = this.verticalMode ? "screenY" : "screenX";
@@ -1114,7 +1132,7 @@
let postTransitionCleanup = () => {
tab.removeAttribute("tabdrop-samewindow");
@@ -82,16 +92,41 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
if (dropIndex !== false) {
gBrowser.moveTabTo(tab, dropIndex);
if (!directionForward) {
@@ -1100,7 +1112,7 @@
gBrowser.syncThrobberAnimations(tab);
@@ -1122,7 +1140,7 @@
}
}
};
- if (gReduceMotion) {
+ if (gReduceMotion || true) {
+ if (true || gReduceMotion) {
postTransitionCleanup();
} else {
let onTransitionEnd = transitionendEvent => {
@@ -1263,7 +1275,8 @@
@@ -1249,7 +1267,7 @@
return;
}
}
-
+ if (gZenViewSplitter.handleTabDrop(event, urls, replace, inBackground)) return;
gBrowser.loadTabs(urls, {
inBackground,
replace,
@@ -1279,13 +1297,23 @@
return;
}
- this._finishMoveTogetherSelectedTabs(draggedTab);
this._finishAnimateTabMove();
+ if (!dt.mozUserCancelled && dt.dropEffect == "none" && !this._isCustomizing) {
+ const moved = gZenViewSplitter.moveTabToSplitView(event, draggedTab);
+ if (moved) {
+ delete draggedTab._dragData;
+ return;
+ }
+ }
+
+ this._finishMoveTogetherSelectedTabs(draggedTab);
+
if (
dt.mozUserCancelled ||
dt.dropEffect != "none" ||
@@ -101,7 +136,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
) {
delete draggedTab._dragData;
return;
@@ -1478,7 +1491,7 @@
@@ -1517,7 +1545,7 @@
}
get newTabButton() {
@@ -110,7 +145,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
}
get verticalMode() {
@@ -1498,7 +1511,7 @@
@@ -1537,28 +1565,40 @@
if (this.#allTabs) {
return this.#allTabs;
}
@@ -119,8 +154,14 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
// remove arrowScrollbox periphery element
children.pop();
@@ -1512,14 +1525,29 @@
}
// explode tab groups
// Iterate backwards over the array to preserve indices while we modify
// things in place
- for (let i = children.length - 1; i >= 0; i--) {
- if (children[i].tagName == "tab-group") {
- children.splice(i, 1, ...children[i].tabs);
- }
- }
this.#allTabs = [
- ...this.verticalPinnedTabsContainer.children,
@@ -134,12 +175,14 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
+ if (glanceTab) {
+ // insert right after the parent tab. note: it must be inserted before
+ // the last pinned tab so it can be inserted in the correct order
+ this.#allTabs.splice(Math.min(i + 1, lastPinnedTabIdx), 0, glanceTab);
+ this.#allTabs.splice(Math.max(i + 1, lastPinnedTabIdx), 0, glanceTab);
+ i++;
+ } else if (this.#allTabs[i].classList.contains("vertical-pinned-tabs-container-separator")) {
+ // remove the separator from the list
+ this.#allTabs.splice(i, 1);
+ i--;
+ } else if (this.#allTabs[i].tagName == "tab-group") {
+ this.#allTabs.splice(i, 1, ...this.#allTabs[i].tabs);
+ }
+ }
return this.#allTabs;
@@ -151,7 +194,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
return children.filter(node => node.tagName == "tab-group");
}
@@ -1540,7 +1568,7 @@
@@ -1579,7 +1619,7 @@
*/
get visibleTabs() {
if (!this.#visibleTabs) {
@@ -160,7 +203,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
}
return this.#visibleTabs;
}
@@ -1574,10 +1602,8 @@
@@ -1613,10 +1653,8 @@
return this.#focusableItems;
}
@@ -173,7 +216,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
let focusableItems = [];
for (let child of children) {
@@ -1593,6 +1619,7 @@
@@ -1632,6 +1670,7 @@
}
this.#focusableItems = [
@@ -181,7 +224,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
...verticalPinnedTabsContainer.children,
...focusableItems,
];
@@ -1603,6 +1630,7 @@
@@ -1642,6 +1681,7 @@
_invalidateCachedTabs() {
this.#allTabs = null;
this._invalidateCachedVisibleTabs();
@@ -189,7 +232,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
}
_invalidateCachedVisibleTabs() {
@@ -1617,8 +1645,8 @@
@@ -1656,8 +1696,8 @@
#isContainerVerticalPinnedExpanded(tab) {
return (
this.verticalMode &&
@@ -200,7 +243,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
);
}
@@ -1633,7 +1661,7 @@
@@ -1672,7 +1712,7 @@
if (node == null) {
// We have a container for non-tab elements at the end of the scrollbox.
@@ -209,7 +252,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
}
node.before(tab);
@@ -1733,7 +1761,7 @@
@@ -1772,7 +1812,7 @@
// There are separate "new tab" buttons for horizontal tabs toolbar, vertical tabs and
// for when the tab strip is overflowed (which is shared by vertical and horizontal tabs);
// Attach the long click popup to all of them.
@@ -218,7 +261,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
const newTab2 = this.newTabButton;
const newTabVertical = document.getElementById(
"vertical-tabs-newtab-button"
@@ -1816,7 +1844,7 @@
@@ -1855,7 +1895,7 @@
let rect = ele => {
return window.windowUtils.getBoundsWithoutFlushing(ele);
};
@@ -227,7 +270,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
if (tab && rect(tab).width <= this._tabClipWidth) {
this.setAttribute("closebuttons", "activetab");
} else {
@@ -1828,10 +1856,12 @@
@@ -1867,10 +1907,12 @@
_handleTabSelect(aInstant) {
let selectedTab = this.selectedItem;
@@ -240,7 +283,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
selectedTab._notselectedsinceload = false;
}
@@ -1843,7 +1873,7 @@
@@ -1882,7 +1924,7 @@
return;
}
@@ -249,7 +292,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
if (!tabs.length) {
return;
}
@@ -1879,7 +1909,7 @@
@@ -1918,7 +1960,7 @@
if (isEndTab && !this._hasTabTempMaxWidth) {
return;
}
@@ -258,7 +301,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
// Force tabs to stay the same width, unless we're closing the last tab,
// which case we need to let them expand just enough so that the overall
// tabbar width is the same.
@@ -1894,7 +1924,7 @@
@@ -1933,7 +1975,7 @@
let tabsToReset = [];
for (let i = numPinned; i < tabs.length; i++) {
let tab = tabs[i];
@@ -267,7 +310,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
if (!isEndTab) {
// keep tabs the same width
tab.style.transition = "none";
@@ -1960,16 +1990,15 @@
@@ -1999,16 +2041,15 @@
// Move pinned tabs to another container when the tabstrip is toggled to vertical
// and when session restore code calls _positionPinnedTabs; update styling whenever
// the number of pinned tabs changes.
@@ -286,11 +329,11 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
for (let i = 0; i < numPinned; i++) {
tabs[i].style.marginInlineStart = "";
- verticalTabsContainer.appendChild(tabs[i]);
+ tabs[i].hasAttribute("zen-essential") ? document.getElementById("zen-essentials-container").appendChild(tabs[i]) : verticalTabsContainer.insertBefore(tabs[i], verticalTabsContainer.lastChild);
+ tabs[i].hasAttribute("zen-essential") ? document.getElementById("zen-essentials-container").appendChild(tabs[i].group?.hasAttribute("split-view-group") ? tabs[i].group : tabs[i]) : verticalTabsContainer.insertBefore(tabs[i].group?.hasAttribute("split-view-group") ? tabs[i].group : tabs[i], verticalTabsContainer.lastChild);
}
}
@@ -1977,9 +2006,7 @@
@@ -2016,9 +2057,7 @@
}
_resetVerticalPinnedTabs() {
@@ -301,7 +344,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
if (!verticalTabsContainer.children.length) {
return;
@@ -1992,8 +2019,8 @@
@@ -2031,8 +2070,8 @@
}
_positionPinnedTabs() {
@@ -312,15 +355,16 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
let absPositionHorizontalTabs =
this.overflowing && tabs.length > numPinned && numPinned > 0;
@@ -2003,6 +2030,7 @@
@@ -2041,7 +2080,7 @@
if (this.verticalMode) {
this._updateVerticalPinnedTabs();
} else if (absPositionHorizontalTabs) {
+ return;
- } else if (absPositionHorizontalTabs) {
+ } else if (absPositionHorizontalTabs && false) {
let layoutData = this._pinnedTabsLayoutCache;
let uiDensity = document.documentElement.getAttribute("uidensity");
if (!layoutData || layoutData.uiDensity != uiDensity) {
@@ -2074,7 +2102,7 @@
@@ -2113,7 +2152,7 @@
return;
}
@@ -329,20 +373,63 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
let directionX = screenX > dragData.animLastScreenX;
let directionY = screenY > dragData.animLastScreenY;
@@ -2257,9 +2285,9 @@
@@ -2121,7 +2160,7 @@
dragData.animLastScreenX = screenX;
let { width: tabWidth, height: tabHeight } =
- draggedTab.getBoundingClientRect();
+ (draggedTab.group?.hasAttribute("split-view-group") ? draggedTab.group : draggedTab).getBoundingClientRect();
let shiftSizeX = tabWidth * movingTabs.length;
let shiftSizeY = tabHeight;
dragData.tabWidth = tabWidth;
@@ -2296,10 +2335,11 @@
}
let pinned = draggedTab.pinned;
- let numPinned = gBrowser.pinnedTabCount;
- let tabs = this.visibleTabs.slice(
- pinned ? 0 : numPinned,
- pinned ? numPinned : undefined
+ let numPinned = gBrowser._numVisiblePinTabs;
+ let essential = draggedTab.hasAttribute("zen-essential");
+ let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(
+ pinned ? gBrowser._numZenEssentials : numPinned,
pinned ? numPinned : undefined
+ pinned ? (essential ? 0 : gBrowser._numZenVisibleEssentials) : numPinned,
+ pinned ? (essential ? gBrowser._numZenVisibleEssentials : numPinned) : undefined
);
@@ -2502,8 +2530,9 @@
if (this.#rtlMode) {
@@ -2348,7 +2388,11 @@
translate = Math.min(Math.max(translate, firstBound), lastBound);
for (let tab of movingTabs) {
- tab.style.transform = `${translateAxis}(${translate}px)`;
+ if (tab.group?.hasAttribute("split-view-group")) {
+ tab.group.style.transform = `${translateAxis}(${translate}px)`;
+ } else {
+ tab.style.transform = `${translateAxis}(${translate}px)`;
+ }
}
dragData.translatePos = translate;
@@ -2484,12 +2528,16 @@
// Shift background tabs to leave a gap where the dragged tab
// would currently be dropped.
for (let tab of tabs) {
- if (tab == draggedTab) {
+ if (tab == draggedTab || (tab.group?.hasAttribute("split-view-group") && tab.group == draggedTab.group)) {
continue;
}
let shift = getTabShift(tab, newIndex);
let transform = shift ? `${translateAxis}(${shift}px)` : "";
+ if (tab.group?.hasAttribute("split-view-group")) {
+ tab.group.style.transform = transform;
+ } else {
tab.style.transform = transform;
+ }
if (tab.group?.tabs[0] == tab) {
tab.group.style.setProperty(
"--tabgroup-dragover-transform",
@@ -2541,8 +2589,9 @@
);
}
@@ -354,7 +441,24 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
return;
}
@@ -2668,9 +2697,9 @@
@@ -2553,6 +2602,7 @@
tab.style.transform = "";
if (tab.group) {
tab.group.style.removeProperty("--tabgroup-dragover-transform");
+ tab.group.style.transform = "";
}
tab.removeAttribute("dragover-createGroup");
}
@@ -2604,7 +2654,7 @@
movingTab._moveTogetherSelectedTabsData.newIndex = movingTabNewIndex;
movingTab._moveTogetherSelectedTabsData.animate = false;
};
- if (gReduceMotion) {
+ if (true || gReduceMotion) {
postTransitionCleanup();
} else {
let onTransitionEnd = transitionendEvent => {
@@ -2707,9 +2757,9 @@
function newIndex(aTab, index) {
// Don't allow mixing pinned and unpinned tabs.
if (aTab.pinned) {
@@ -366,7 +470,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
}
}
@@ -2754,7 +2783,7 @@
@@ -2793,7 +2843,7 @@
}
_notifyBackgroundTab(aTab) {
@@ -375,73 +479,3 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af
return;
}
@@ -2772,12 +2801,14 @@
selectedTab = {
left: selectedTab.left,
right: selectedTab.right,
+ top: selectedTab.top,
+ bottom: selectedTab.bottom,
};
}
return [
this._lastTabToScrollIntoView,
this.arrowScrollbox.scrollClientRect,
- { left: lastTabRect.left, right: lastTabRect.right },
+ lastTabRect,
selectedTab,
];
})
@@ -2794,8 +2825,11 @@
delete this._lastTabToScrollIntoView;
// Is the new tab already completely visible?
if (
- scrollRect.left <= tabRect.left &&
- tabRect.right <= scrollRect.right
+ this.verticalMode
+ ? scrollRect.top <= tabRect.top &&
+ tabRect.bottom <= scrollRect.bottom
+ : scrollRect.left <= tabRect.left &&
+ tabRect.right <= scrollRect.right
) {
return;
}
@@ -2803,21 +2837,29 @@
if (this.arrowScrollbox.smoothScroll) {
// Can we make both the new tab and the selected tab completely visible?
if (
- !selectedRect ||
- Math.max(
- tabRect.right - selectedRect.left,
- selectedRect.right - tabRect.left
- ) <= scrollRect.width
+ !selectedRect || (this.verticalMode
+ ? Math.max(
+ tabRect.bottom - selectedRect.top,
+ selectedRect.bottom - tabRect.top
+ ) <= scrollRect.height
+ : Math.max(
+ tabRect.right - selectedRect.left,
+ selectedRect.right - tabRect.left
+ ) <= scrollRect.width)
) {
this.arrowScrollbox.ensureElementIsVisible(tabToScrollIntoView);
return;
}
- this.arrowScrollbox.scrollByPixels(
- this.#rtlMode
- ? selectedRect.right - scrollRect.right
- : selectedRect.left - scrollRect.left
- );
+ let scrollPixels;
+ if (this.verticalMode) {
+ scrollPixels = tabRect.top - selectedRect.top;
+ } else if (this.#rtlMode) {
+ scrollPixels = selectedRect.right - scrollRect.right;
+ } else {
+ scrollPixels = selectedRect.left - scrollRect.left;
+ }
+ this.arrowScrollbox.scrollByPixels(scrollPixels);
}
if (!this._animateElement.hasAttribute("highlight")) {

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/urlbar/UrlbarInput.sys.mjs b/browser/components/urlbar/UrlbarInput.sys.mjs
index 50968dc04b527438acf30151f0c2e92f8b45097c..7f3579d39e53a36135fbabb786a6e07f4e0945b0 100644
index 02c328f0d0724b0cf95c820fe49a43e94a97b3c2..79b9161544633d319d7e550dd95334b62e85eed4 100644
--- a/browser/components/urlbar/UrlbarInput.sys.mjs
+++ b/browser/components/urlbar/UrlbarInput.sys.mjs
@@ -67,6 +67,13 @@ XPCOMUtils.defineLazyPreferenceGetter(
@@ -16,7 +16,7 @@ index 50968dc04b527438acf30151f0c2e92f8b45097c..7f3579d39e53a36135fbabb786a6e07f
const DEFAULT_FORM_HISTORY_NAME = "searchbar-history";
const SEARCH_BUTTON_CLASS = "urlbar-search-button";
@@ -348,7 +355,11 @@ export class UrlbarInput {
@@ -349,7 +356,11 @@ export class UrlbarInput {
// See _on_select(). HTMLInputElement.select() dispatches a "select"
// event but does not set the primary selection.
this._suppressPrimaryAdjustment = true;
@@ -28,7 +28,7 @@ index 50968dc04b527438acf30151f0c2e92f8b45097c..7f3579d39e53a36135fbabb786a6e07f
this._suppressPrimaryAdjustment = false;
}
@@ -424,6 +435,10 @@ export class UrlbarInput {
@@ -425,6 +436,10 @@ export class UrlbarInput {
hideSearchTerms = false,
isSameDocument = false
) {
@@ -39,7 +39,7 @@ index 50968dc04b527438acf30151f0c2e92f8b45097c..7f3579d39e53a36135fbabb786a6e07f
// We only need to update the searchModeUI on tab switch conditionally
// as we only persist searchMode with ScotchBonnet enabled.
if (
@@ -697,8 +712,11 @@ export class UrlbarInput {
@@ -698,8 +713,11 @@ export class UrlbarInput {
return;
}
}
@@ -52,10 +52,21 @@ index 50968dc04b527438acf30151f0c2e92f8b45097c..7f3579d39e53a36135fbabb786a6e07f
}
/**
@@ -1087,7 +1105,11 @@ export class UrlbarInput {
@@ -943,6 +961,10 @@ export class UrlbarInput {
// Nullify search mode before setURI so it won't try to restore it.
this.searchMode = null;
this.setURI(null, true, false, true);
+ if (this.hasAttribute("zen-floating-urlbar")) {
+ this.window.gBrowser.selectedBrowser.focus();
+ return;
+ }
if (this.value && this.focused) {
this.select();
}
@@ -1098,7 +1120,11 @@ export class UrlbarInput {
}
if (!result.payload.providesSearchMode) {
if (!this.#providesSearchMode(result)) {
- this.view.close({ elementPicked: true });
+ if (this._zenHandleUrlbarClose) {
+ this._zenHandleUrlbarClose(true);
@@ -65,7 +76,7 @@ index 50968dc04b527438acf30151f0c2e92f8b45097c..7f3579d39e53a36135fbabb786a6e07f
}
this.controller.recordSelectedResult(event, result);
@@ -2144,6 +2166,11 @@ export class UrlbarInput {
@@ -2157,6 +2183,11 @@ export class UrlbarInput {
this.setAttribute("breakout-extend", "true");
@@ -77,7 +88,7 @@ index 50968dc04b527438acf30151f0c2e92f8b45097c..7f3579d39e53a36135fbabb786a6e07f
// Enable the animation only after the first extend call to ensure it
// doesn't run when opening a new window.
if (!this.hasAttribute("breakout-extend-animate")) {
@@ -2163,6 +2190,11 @@ export class UrlbarInput {
@@ -2176,6 +2207,11 @@ export class UrlbarInput {
return;
}
@@ -89,7 +100,7 @@ index 50968dc04b527438acf30151f0c2e92f8b45097c..7f3579d39e53a36135fbabb786a6e07f
this.removeAttribute("breakout-extend");
this.#updateTextboxPosition();
}
@@ -2946,7 +2978,7 @@ export class UrlbarInput {
@@ -2998,7 +3034,7 @@ export class UrlbarInput {
*/
_trimValue(val) {
let trimmedValue = lazy.UrlbarPrefs.get("trimURLs")
@@ -98,7 +109,7 @@ index 50968dc04b527438acf30151f0c2e92f8b45097c..7f3579d39e53a36135fbabb786a6e07f
: val;
// Only trim value if the directionality doesn't change to RTL and we're not
// showing a strikeout https protocol.
@@ -3305,7 +3337,7 @@ export class UrlbarInput {
@@ -3365,7 +3401,7 @@ export class UrlbarInput {
} else {
where = lazy.BrowserUtils.whereToOpenLink(event, false, false);
}
@@ -107,7 +118,7 @@ index 50968dc04b527438acf30151f0c2e92f8b45097c..7f3579d39e53a36135fbabb786a6e07f
if (where == "current") {
where = "tab";
} else if (where == "tab") {
@@ -3320,6 +3352,9 @@ export class UrlbarInput {
@@ -3380,6 +3416,9 @@ export class UrlbarInput {
) {
where = "current";
}
@@ -117,7 +128,7 @@ index 50968dc04b527438acf30151f0c2e92f8b45097c..7f3579d39e53a36135fbabb786a6e07f
return where;
}
@@ -3859,6 +3894,11 @@ export class UrlbarInput {
@@ -3921,6 +3960,11 @@ export class UrlbarInput {
}
_on_click(event) {
@@ -129,7 +140,7 @@ index 50968dc04b527438acf30151f0c2e92f8b45097c..7f3579d39e53a36135fbabb786a6e07f
if (
event.target == this.inputField ||
event.target == this._inputContainer ||
@@ -3930,7 +3970,7 @@ export class UrlbarInput {
@@ -3992,7 +4036,7 @@ export class UrlbarInput {
}
}
@@ -138,7 +149,7 @@ index 50968dc04b527438acf30151f0c2e92f8b45097c..7f3579d39e53a36135fbabb786a6e07f
this.view.autoOpen({ event });
} else {
if (this._untrimOnFocusAfterKeydown) {
@@ -3970,9 +4010,12 @@ export class UrlbarInput {
@@ -4032,9 +4076,12 @@ export class UrlbarInput {
}
_on_mousedown(event) {
@@ -152,7 +163,7 @@ index 50968dc04b527438acf30151f0c2e92f8b45097c..7f3579d39e53a36135fbabb786a6e07f
if (
event.target != this.inputField &&
@@ -3982,8 +4025,8 @@ export class UrlbarInput {
@@ -4044,8 +4091,8 @@ export class UrlbarInput {
break;
}

View File

@@ -0,0 +1,12 @@
diff --git a/browser/installer/windows/msix/AppxManifest.xml.in b/browser/installer/windows/msix/AppxManifest.xml.in
index b81a73518a183b7b1d178793886c66f44651058d..89690a4177229b70013bcf35ec1d805fff7e1b26 100644
--- a/browser/installer/windows/msix/AppxManifest.xml.in
+++ b/browser/installer/windows/msix/AppxManifest.xml.in
@@ -61,6 +61,7 @@
<uap:FileType>.avif</uap:FileType>
<uap:FileType>.htm</uap:FileType>
<uap:FileType>.html</uap:FileType>
+ <uap:FileType>.jxl</uap:FileType>
<uap:FileType>.pdf</uap:FileType>
<uap:FileType>.shtml</uap:FileType>
<uap:FileType>.xht</uap:FileType>

View File

@@ -0,0 +1,46 @@
diff --git a/browser/installer/windows/nsis/shared.nsh b/browser/installer/windows/nsis/shared.nsh
index b7f8e1453089ab5f1945e1a65f038e17b5273571..5297f5ed70fe3446e55be37df486fb4ad791a446 100644
--- a/browser/installer/windows/nsis/shared.nsh
+++ b/browser/installer/windows/nsis/shared.nsh
@@ -513,6 +513,7 @@ ${RemoveDefaultBrowserAgentShortcut}
${AddAssociationIfNoneExist} ".svg" "FirefoxHTML$5"
${AddAssociationIfNoneExist} ".webp" "FirefoxHTML$5"
${AddAssociationIfNoneExist} ".avif" "FirefoxHTML$5"
+ ${AddAssociationIfNoneExist} ".jxl" "FirefoxHTML$5"
${AddAssociationIfNoneExist} ".pdf" "FirefoxPDF$5"
@@ -609,6 +610,7 @@ ${RemoveDefaultBrowserAgentShortcut}
WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".svg" "FirefoxHTML$2"
WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".webp" "FirefoxHTML$2"
WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".avif" "FirefoxHTML$2"
+ WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".jxl" "FirefoxHTML$2"
WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".pdf" "FirefoxPDF$2"
@@ -681,6 +683,7 @@ ${RemoveDefaultBrowserAgentShortcut}
${WriteApplicationsSupportedType} ${RegKey} ".webm"
${WriteApplicationsSupportedType} ${RegKey} ".webp"
${WriteApplicationsSupportedType} ${RegKey} ".avif"
+ ${WriteApplicationsSupportedType} ${RegKey} ".jxl"
${WriteApplicationsSupportedType} ${RegKey} ".xht"
${WriteApplicationsSupportedType} ${RegKey} ".xhtml"
${WriteApplicationsSupportedType} ${RegKey} ".xml"
@@ -1728,6 +1731,8 @@ Function SetAsDefaultAppUserHKCU
Pop $0
AppAssocReg::SetAppAsDefault "$R9" ".avif" "file"
Pop $0
+ AppAssocReg::SetAppAsDefault "$R9" ".jxl" "file"
+ Pop $0
AppAssocReg::SetAppAsDefault "$R9" ".xht" "file"
Pop $0
AppAssocReg::SetAppAsDefault "$R9" ".xhtml" "file"
@@ -1857,7 +1862,7 @@ FunctionEnd
; uninstalled.
; Do all of that twice, once for the local machine and once for the current user
-
+
; Remove protocol handlers
ClearErrors
ReadRegStr $0 HKLM "Software\Classes\${_PROTOCOL}\DefaultIcon" ""

View File

@@ -0,0 +1,12 @@
diff --git a/browser/installer/windows/nsis/uninstaller.nsi b/browser/installer/windows/nsis/uninstaller.nsi
index 559c8b46ee06bc42c91da49b5d9e397fe8ff6126..62094a5d98712a41a607ba01ca2adfa1e4f51ccd 100644
--- a/browser/installer/windows/nsis/uninstaller.nsi
+++ b/browser/installer/windows/nsis/uninstaller.nsi
@@ -507,6 +507,7 @@ Section "Uninstall"
${un.RegCleanFileHandler} ".svg" "FirefoxHTML-$AppUserModelID"
${un.RegCleanFileHandler} ".webp" "FirefoxHTML-$AppUserModelID"
${un.RegCleanFileHandler} ".avif" "FirefoxHTML-$AppUserModelID"
+ ${un.RegCleanFileHandler} ".jxl" "FirefoxHTML-$AppUserModelID"
${un.RegCleanFileHandler} ".pdf" "FirefoxPDF-$AppUserModelID"

View File

@@ -0,0 +1,13 @@
diff --git a/browser/modules/URILoadingHelper.sys.mjs b/browser/modules/URILoadingHelper.sys.mjs
index 313e895980c502d79f64f5a6ab838f6a96c83835..8a1a853567aeae2c368005d3757815799457212a 100644
--- a/browser/modules/URILoadingHelper.sys.mjs
+++ b/browser/modules/URILoadingHelper.sys.mjs
@@ -512,7 +512,7 @@ export const URILoadingHelper = {
// page. If a load request bounces off for the currently selected tab,
// we'll open a new tab instead.
let tab = w.gBrowser.getTabForBrowser(targetBrowser);
- if (tab == w.FirefoxViewHandler.tab) {
+ if (tab == w.FirefoxViewHandler.tab || tab.hasAttribute("zen-empty-tab")) {
where = "tab";
targetBrowser = null;
} else if (

View File

@@ -1,5 +1,5 @@
diff --git a/browser/themes/linux/browser.css b/browser/themes/linux/browser.css
index a9276a678f16a67e2a003474203c37cb5c9300ad..20cb1b022f7a94ad553f5e6df48014ee646f93ed 100644
index dc95772553ef7130c27c1122178ff99028b601f2..81f7dbb40c35168376ca84eebfa9fba8d314cb90 100644
--- a/browser/themes/linux/browser.css
+++ b/browser/themes/linux/browser.css
@@ -42,21 +42,25 @@

View File

@@ -1,17 +1,17 @@
diff --git a/browser/themes/shared/tabbrowser/tabs.css b/browser/themes/shared/tabbrowser/tabs.css
index 96f930638c04c7ddcc8dc1a7fe4dce8b12a325e6..9e11e715ade485c33ba4c8f719b41002f3008dde 100644
index 01815c2114a627e5cac183c702bd82f1bd4f58f8..f47bd9c8490cd8fc4bb686ad0012ce70ab4bac8f 100644
--- a/browser/themes/shared/tabbrowser/tabs.css
+++ b/browser/themes/shared/tabbrowser/tabs.css
@@ -33,7 +33,7 @@
--tab-icon-overlay-fill: light-dark(white, black);
--tab-icon-overlay-stroke: light-dark(black, white);
@@ -31,7 +31,7 @@
--tab-block-margin: 4px;
--tab-icon-end-margin: 5.5px;
--tab-label-line-height: 1.7;
- --tab-loading-fill: #0A84FF;
+ --tab-loading-fill: var(--zen-primary-color);
--tab-hover-background-color: color-mix(in srgb, currentColor 11%, transparent);
--tab-selected-textcolor: var(--toolbar-color);
--tab-selected-bgcolor: var(--toolbar-bgcolor);
@@ -207,8 +207,7 @@
@@ -209,8 +209,7 @@
}
#tabbrowser-tabs[positionpinnedtabs] > #tabbrowser-arrowscrollbox > &[pinned] {
@@ -21,7 +21,7 @@ index 96f930638c04c7ddcc8dc1a7fe4dce8b12a325e6..9e11e715ade485c33ba4c8f719b41002
}
#tabbrowser-tabs[movingtab] &:is([selected], [multiselected]) {
@@ -238,7 +237,6 @@
@@ -249,7 +248,6 @@
}
:root:not([uidensity=compact]) &[pinned] {
@@ -29,7 +29,7 @@ index 96f930638c04c7ddcc8dc1a7fe4dce8b12a325e6..9e11e715ade485c33ba4c8f719b41002
}
&:is([selected], [multiselected]) {
@@ -252,6 +250,7 @@
@@ -263,6 +261,7 @@
border-radius: inherit;
position: relative;
overflow: hidden;
@@ -37,15 +37,60 @@ index 96f930638c04c7ddcc8dc1a7fe4dce8b12a325e6..9e11e715ade485c33ba4c8f719b41002
&::before {
position: absolute;
@@ -511,7 +510,6 @@
background-repeat: no-repeat;
border-radius: 10px;
-moz-context-properties: fill;
- fill: var(--tab-icon-overlay-fill);
}
@@ -437,6 +436,7 @@
.tab-icon-image {
-moz-context-properties: fill, stroke;
fill: currentColor;
+ border-radius: 4px;
/* Apply crisp rendering for favicons at exactly 2dppx resolution */
@media (resolution: 2dppx) {
@@ -502,7 +502,7 @@
z-index: 1; /* Overlay tab title */
#tabbrowser-tabs[orient=vertical] & {
- top: 7px;
+ top: -7px;
}
@@ -569,14 +567,14 @@
&[crashed] {
@@ -510,7 +510,7 @@
}
#tabbrowser-tabs[orient="vertical"]:not([expanded]) &:not([crashed]),
- &[pinned]:not([crashed]) {
+ &:not([crashed]) {
&[soundplaying] {
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-playing-small.svg");
}
@@ -540,7 +540,7 @@
background-image: linear-gradient(var(--audio-overlay-extra-background)),
linear-gradient(var(--toolbox-bgcolor));
-moz-context-properties: fill;
- fill: var(--tab-selected-textcolor);
+ fill: var(--tab-selected-textcolor) !important;
color-scheme: var(--tab-selected-color-scheme);
border-radius: var(--border-radius-circle);
@@ -572,7 +572,7 @@
}
#tabbrowser-tabs[orient="vertical"]:not([expanded]) &:is([soundplaying], [muted], [activemedia-blocked]),
- &[pinned]:is([soundplaying], [muted], [activemedia-blocked]),
+ &:is([soundplaying], [muted], [activemedia-blocked]),
&[crashed] {
display: revert;
}
@@ -586,7 +586,7 @@
--button-min-height-small: 24px;
--button-border-radius: var(--border-radius-small);
- #tabbrowser-tabs:is([orient="vertical"][expanded], [orient="horizontal"]) &:not([pinned]):not([crashed]) {
+ #tabbrowser-tabs:is([orient="horizontal"]) &:not([pinned]):not([crashed]) {
&:is([soundplaying], [muted], [activemedia-blocked]) {
display: block;
}
@@ -617,14 +617,14 @@
}
&[textoverflow] {
@@ -64,7 +109,7 @@ index 96f930638c04c7ddcc8dc1a7fe4dce8b12a325e6..9e11e715ade485c33ba4c8f719b41002
direction: rtl;
mask-image: linear-gradient(to right, transparent, black var(--tab-label-mask-size));
}
@@ -1135,7 +1133,7 @@
@@ -1170,7 +1170,7 @@
}
}
@@ -73,7 +118,7 @@ index 96f930638c04c7ddcc8dc1a7fe4dce8b12a325e6..9e11e715ade485c33ba4c8f719b41002
#vertical-tabs-newtab-button {
appearance: none;
min-height: var(--tab-min-height);
@@ -1146,7 +1144,7 @@
@@ -1181,7 +1181,7 @@
margin-inline: var(--tab-inner-inline-margin);
#tabbrowser-tabs[orient="vertical"]:not([expanded]) & > .toolbarbutton-text {
@@ -82,7 +127,7 @@ index 96f930638c04c7ddcc8dc1a7fe4dce8b12a325e6..9e11e715ade485c33ba4c8f719b41002
}
&:hover {
@@ -1170,7 +1168,7 @@
@@ -1205,7 +1205,7 @@
* flex container. #tabs-newtab-button is a child of the arrowscrollbox where
* we don't want a gap (between tabs), so we have to add some margin.
*/
@@ -91,7 +136,7 @@ index 96f930638c04c7ddcc8dc1a7fe4dce8b12a325e6..9e11e715ade485c33ba4c8f719b41002
margin-block: var(--tab-block-margin);
}
@@ -1194,7 +1192,6 @@
@@ -1229,7 +1229,6 @@
}
#vertical-pinned-tabs-container {
@@ -99,7 +144,7 @@ index 96f930638c04c7ddcc8dc1a7fe4dce8b12a325e6..9e11e715ade485c33ba4c8f719b41002
display: none;
grid-template-columns: repeat(auto-fit, minmax(var(--tab-pinned-min-width-expanded), auto));
overflow-y: auto;
@@ -1347,7 +1344,7 @@
@@ -1439,7 +1438,7 @@
toolbarbutton:not(#firefox-view-button),
toolbarpaletteitem:not(#wrapper-firefox-view-button)
) ~ #tabbrowser-tabs {
@@ -108,7 +153,7 @@ index 96f930638c04c7ddcc8dc1a7fe4dce8b12a325e6..9e11e715ade485c33ba4c8f719b41002
padding-inline-start: calc(var(--tab-overflow-pinned-tabs-width) + 2px);
margin-inline-start: 2px;
}
@@ -1381,7 +1378,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
@@ -1473,7 +1472,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
list-style-image: url(chrome://global/skin/icons/plus.svg);
}

View File

@@ -1,7 +1,16 @@
diff --git a/browser/themes/shared/urlbar-searchbar.css b/browser/themes/shared/urlbar-searchbar.css
index 45aa61f93d354da432eceb1c276466609a6910d0..6585158b855af19689e86ef6a833f63736ec225c 100644
index 574f83af7fa49ddcdff6711ca8b1d3bed1a35e0c..c2e8cb8b37438176db07a47e1e975ae1aea42252 100644
--- a/browser/themes/shared/urlbar-searchbar.css
+++ b/browser/themes/shared/urlbar-searchbar.css
@@ -5,7 +5,7 @@
@namespace html url("http://www.w3.org/1999/xhtml");
:root {
- --urlbar-container-padding: 1px;
+ --urlbar-container-padding: 4px;
--urlbar-margin-inline: 5px;
--urlbar-padding-block: 4px;
}
@@ -291,7 +291,9 @@
}

View File

@@ -0,0 +1,13 @@
diff --git a/browser/themes/shared/urlbarView.css b/browser/themes/shared/urlbarView.css
index 1c654e053ca8a014d7c2a9fc076cf15afba9c903..f2f63809d0a36db2774755db2b782f41a9bbe82b 100644
--- a/browser/themes/shared/urlbarView.css
+++ b/browser/themes/shared/urlbarView.css
@@ -20,7 +20,7 @@
--urlbarView-small-font-size: 0.85em;
- --urlbarView-results-padding: 4px;
+ --urlbarView-results-padding: 8px;
--urlbarView-row-gutter: 2px;
--urlbarView-item-inline-padding: var(--urlbar-icon-padding);
--urlbarView-item-block-padding: 6px;

View File

@@ -4,7 +4,8 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
.subviewbutton {
.subviewbutton,
#zen-welcome-start-button {
-moz-context-properties: fill, fill-opacity !important;
fill: currentColor !important;
}
@@ -23,6 +24,10 @@
list-style-image: url('move-tab.svg') !important;
}
.zen-tab-unsplit-button {
list-style-image: url('unpin.svg') !important;
}
#forward-button,
#zen-sidebar-web-panel-forward {
list-style-image: url('forward.svg') !important;
@@ -381,7 +386,8 @@
list-style-image: url('arrow-down.svg') !important;
}
.zen-workspace-actions-reorder-icon {
.zen-workspace-actions-reorder-icon,
.zen-tab-rearrange-button {
list-style-image: url('drag-indicator.svg') !important;
}
@@ -1138,3 +1144,49 @@ menupopup > menuitem:is([type='checkbox']) .menu-iconic-left {
padding-inline-start: 6px;
}
}
#toolbar-context-toggle-vertical-tabs,
#toolbar-context-customize-sidebar,
#sidebarRevampSeparator {
display: none !important;
}
#zen-media-playpause-button {
list-style-image: url('media-play.svg') !important;
}
#zen-media-controls-toolbar.playing #zen-media-playpause-button {
list-style-image: url('media-pause.svg') !important;
}
#zen-media-nexttrack-button {
list-style-image: url('media-next.svg') !important;
}
#zen-media-previoustrack-button {
list-style-image: url('media-previous.svg') !important;
}
#zen-media-controls-toolbar[muted] #zen-media-mute-button {
list-style-image: url('media-mute.svg') !important;
}
#zen-media-mute-button {
list-style-image: url('media-unmute.svg') !important;
}
#zen-media-close-button {
list-style-image: url('close.svg') !important;
}
#zen-media-focus-button:hover {
list-style-image: url('screen.svg') !important;
}
#zen-media-close-button {
list-style-image: url('close.svg') !important;
}
#zen-media-pip-button {
list-style-image: url('chrome://global/skin/media/picture-in-picture-open.svg') !important;
}

View File

@@ -66,9 +66,11 @@
skin/classic/browser/zen-icons/manage.svg (../shared/zen-icons/lin/manage.svg)
skin/classic/browser/zen-icons/media-loop.svg (../shared/zen-icons/lin/media-loop.svg)
skin/classic/browser/zen-icons/media-mute.svg (../shared/zen-icons/lin/media-mute.svg)
skin/classic/browser/zen-icons/media-next.svg (../shared/zen-icons/lin/media-next.svg)
skin/classic/browser/zen-icons/media-pause.svg (../shared/zen-icons/lin/media-pause.svg)
skin/classic/browser/zen-icons/media-pip.svg (../shared/zen-icons/lin/media-pip.svg)
skin/classic/browser/zen-icons/media-play.svg (../shared/zen-icons/lin/media-play.svg)
skin/classic/browser/zen-icons/media-previous.svg (../shared/zen-icons/lin/media-previous.svg)
skin/classic/browser/zen-icons/media-speed.svg (../shared/zen-icons/lin/media-speed.svg)
skin/classic/browser/zen-icons/media-unmute.svg (../shared/zen-icons/lin/media-unmute.svg)
skin/classic/browser/zen-icons/menu-bar.svg (../shared/zen-icons/lin/menu-bar.svg)
@@ -198,9 +200,11 @@
skin/classic/browser/zen-icons/manage.svg (../shared/zen-icons/lin/manage.svg)
skin/classic/browser/zen-icons/media-loop.svg (../shared/zen-icons/lin/media-loop.svg)
skin/classic/browser/zen-icons/media-mute.svg (../shared/zen-icons/lin/media-mute.svg)
skin/classic/browser/zen-icons/media-next.svg (../shared/zen-icons/lin/media-next.svg)
skin/classic/browser/zen-icons/media-pause.svg (../shared/zen-icons/lin/media-pause.svg)
skin/classic/browser/zen-icons/media-pip.svg (../shared/zen-icons/lin/media-pip.svg)
skin/classic/browser/zen-icons/media-play.svg (../shared/zen-icons/lin/media-play.svg)
skin/classic/browser/zen-icons/media-previous.svg (../shared/zen-icons/lin/media-previous.svg)
skin/classic/browser/zen-icons/media-speed.svg (../shared/zen-icons/lin/media-speed.svg)
skin/classic/browser/zen-icons/media-unmute.svg (../shared/zen-icons/lin/media-unmute.svg)
skin/classic/browser/zen-icons/menu-bar.svg (../shared/zen-icons/lin/menu-bar.svg)
@@ -330,9 +334,11 @@
skin/classic/browser/zen-icons/manage.svg (../shared/zen-icons/lin/manage.svg)
skin/classic/browser/zen-icons/media-loop.svg (../shared/zen-icons/lin/media-loop.svg)
skin/classic/browser/zen-icons/media-mute.svg (../shared/zen-icons/lin/media-mute.svg)
skin/classic/browser/zen-icons/media-next.svg (../shared/zen-icons/lin/media-next.svg)
skin/classic/browser/zen-icons/media-pause.svg (../shared/zen-icons/lin/media-pause.svg)
skin/classic/browser/zen-icons/media-pip.svg (../shared/zen-icons/lin/media-pip.svg)
skin/classic/browser/zen-icons/media-play.svg (../shared/zen-icons/lin/media-play.svg)
skin/classic/browser/zen-icons/media-previous.svg (../shared/zen-icons/lin/media-previous.svg)
skin/classic/browser/zen-icons/media-speed.svg (../shared/zen-icons/lin/media-speed.svg)
skin/classic/browser/zen-icons/media-unmute.svg (../shared/zen-icons/lin/media-unmute.svg)
skin/classic/browser/zen-icons/menu-bar.svg (../shared/zen-icons/lin/menu-bar.svg)

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