mirror of
https://github.com/zen-browser/desktop.git
synced 2025-12-24 15:18:54 +00:00
Compare commits
286 Commits
1.8.1b
...
zen-settin
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d7c131b5ca | ||
|
|
04f14c0d2f | ||
|
|
1ceb5d6248 | ||
|
|
5e32c09d9f | ||
|
|
b0f7a06749 | ||
|
|
9533671285 | ||
|
|
072bc0269c | ||
|
|
dcb3e79f64 | ||
|
|
d58101592b | ||
|
|
630152b91e | ||
|
|
b8ae7401a4 | ||
|
|
0d96889018 | ||
|
|
9cd2cf5cc3 | ||
|
|
658e7eac1c | ||
|
|
7c387db3e8 | ||
|
|
401085f231 | ||
|
|
fe9eb8884e | ||
|
|
bab0df47f0 | ||
|
|
b34fa5fb07 | ||
|
|
d88e3ec982 | ||
|
|
36cf513431 | ||
|
|
2530740066 | ||
|
|
0af85f8c03 | ||
|
|
31e67a84ec | ||
|
|
364ad230fd | ||
|
|
a69876325a | ||
|
|
ac85bdfd3e | ||
|
|
b6477b17d8 | ||
|
|
9406515f91 | ||
|
|
ce2e68ee32 | ||
|
|
8b04d2d202 | ||
|
|
963fb3ca3c | ||
|
|
f40f9c4803 | ||
|
|
ee275bf950 | ||
|
|
9e4f1f4c5b | ||
|
|
d234e6a701 | ||
|
|
48281e0158 | ||
|
|
e8592a6690 | ||
|
|
e780eee207 | ||
|
|
de14e8e935 | ||
|
|
8ea7b497ff | ||
|
|
d1098af7f0 | ||
|
|
daa34e5ed4 | ||
|
|
89243d03cd | ||
|
|
597dfb173d | ||
|
|
e1228844c7 | ||
|
|
481976a353 | ||
|
|
b1ef5770d7 | ||
|
|
f6f561841c | ||
|
|
0da5653fef | ||
|
|
8afb8ee204 | ||
|
|
2e1354cdb9 | ||
|
|
7640e05619 | ||
|
|
cb42d46131 | ||
|
|
f055b61e8e | ||
|
|
23f99999de | ||
|
|
39c956829a | ||
|
|
e281a18ec7 | ||
|
|
4476c802d5 | ||
|
|
c728bae55a | ||
|
|
20ff1dc446 | ||
|
|
3c40758c6a | ||
|
|
b0a432ce78 | ||
|
|
1891d36677 | ||
|
|
2bf5c98b5f | ||
|
|
d7cf35126b | ||
|
|
d765c7c655 | ||
|
|
0dc05978ce | ||
|
|
001427822c | ||
|
|
4c74517e9e | ||
|
|
e315ff24e1 | ||
|
|
fff8b3f532 | ||
|
|
8ee527a3d0 | ||
|
|
f14f87b54e | ||
|
|
505e192b66 | ||
|
|
5ed1ca6aa1 | ||
|
|
7b5a778bd8 | ||
|
|
39d090297e | ||
|
|
e36ed36a6e | ||
|
|
b5f32f1001 | ||
|
|
777b215c15 | ||
|
|
7bd5c1b41c | ||
|
|
fa70e8bd37 | ||
|
|
ec2badc74b | ||
|
|
500e62cbce | ||
|
|
4fa3f6736b | ||
|
|
1d03c01420 | ||
|
|
759061ffdb | ||
|
|
76180a43a8 | ||
|
|
5867ae2f93 | ||
|
|
e6552c8dda | ||
|
|
110d4e10bb | ||
|
|
6d458d3b16 | ||
|
|
40ce0b714e | ||
|
|
8a5b0928c5 | ||
|
|
7e55497e20 | ||
|
|
2d333a23a4 | ||
|
|
0a32810f36 | ||
|
|
c6cbf7941c | ||
|
|
33d8103335 | ||
|
|
3df1973ac9 | ||
|
|
d51391bb9b | ||
|
|
94714e4f39 | ||
|
|
12266179d6 | ||
|
|
a9f2bf2d54 | ||
|
|
3972a181e6 | ||
|
|
986661b6e8 | ||
|
|
99faa45d94 | ||
|
|
daad62d939 | ||
|
|
f775a12de9 | ||
|
|
ebc33723b0 | ||
|
|
2c8d2babdc | ||
|
|
7771b5af2d | ||
|
|
1729b553a4 | ||
|
|
4f10a12869 | ||
|
|
a0b372e7d9 | ||
|
|
daded49ce8 | ||
|
|
d5d101d3f8 | ||
|
|
e83b698df4 | ||
|
|
712cba1398 | ||
|
|
b954efe624 | ||
|
|
163d2c8d8f | ||
|
|
cf807ea93e | ||
|
|
0a9942d01f | ||
|
|
6d164511b4 | ||
|
|
441ea2000b | ||
|
|
64281776f4 | ||
|
|
a93fdf5a17 | ||
|
|
050ed71c00 | ||
|
|
7b029cc7bc | ||
|
|
07afc4810a | ||
|
|
ff339c3fb0 | ||
|
|
2e21bcc542 | ||
|
|
9a27b66661 | ||
|
|
ee91ea86ff | ||
|
|
5484aea042 | ||
|
|
4c7955b099 | ||
|
|
00654c168f | ||
|
|
8e789732f9 | ||
|
|
b69e8aebab | ||
|
|
d8265d4513 | ||
|
|
1b0c3a5d9a | ||
|
|
124d5e0cdb | ||
|
|
3b86f317d1 | ||
|
|
39fdda8958 | ||
|
|
0575373167 | ||
|
|
9466f6ee86 | ||
|
|
ad491edee3 | ||
|
|
4557d87ed9 | ||
|
|
ea245cd213 | ||
|
|
f9f126a842 | ||
|
|
65433172f3 | ||
|
|
3325dc0d9f | ||
|
|
00533fb956 | ||
|
|
0d499b3c25 | ||
|
|
eda9b1f20b | ||
|
|
b9eb13f033 | ||
|
|
391cb84117 | ||
|
|
8ed5b50c3d | ||
|
|
b93faff771 | ||
|
|
671a76bf86 | ||
|
|
d698c51ce0 | ||
|
|
ddb0a65957 | ||
|
|
10b6551ea3 | ||
|
|
713ceab89f | ||
|
|
ba864200ee | ||
|
|
98084457ff | ||
|
|
ba1411b9cd | ||
|
|
ff4fe92c9f | ||
|
|
8d3b9098c0 | ||
|
|
43da147d44 | ||
|
|
148c9661c2 | ||
|
|
f0e2a68abf | ||
|
|
d16a263480 | ||
|
|
d50f6001d8 | ||
|
|
bb5b0895a8 | ||
|
|
162e6abcc1 | ||
|
|
ce2e492632 | ||
|
|
03f6e61935 | ||
|
|
996f042961 | ||
|
|
55275b23aa | ||
|
|
188a6ea801 | ||
|
|
ab127daa35 | ||
|
|
c61112bc6d | ||
|
|
9b07fd528b | ||
|
|
1ba809825d | ||
|
|
09119f9d18 | ||
|
|
c78cafe605 | ||
|
|
1c49cffc66 | ||
|
|
452c19a7ea | ||
|
|
cc8a5cf367 | ||
|
|
5bbd881f01 | ||
|
|
1c2ddea3d4 | ||
|
|
096a28002f | ||
|
|
23a60e79c1 | ||
|
|
473698c744 | ||
|
|
b955be65f4 | ||
|
|
98668d5380 | ||
|
|
e057e952b6 | ||
|
|
e04cb679f9 | ||
|
|
fd1f2fa0c4 | ||
|
|
f1f80f3d57 | ||
|
|
7440f12117 | ||
|
|
2f8847b8fe | ||
|
|
8aaccf06b2 | ||
|
|
b83ec80e7c | ||
|
|
7ca57da6fe | ||
|
|
0cb7b0af95 | ||
|
|
7646c43f45 | ||
|
|
7cb1ae6d3c | ||
|
|
9454ab9d6c | ||
|
|
780b514cc0 | ||
|
|
7b124f1dc2 | ||
|
|
a500407dc3 | ||
|
|
d415bde66c | ||
|
|
314bdf61ef | ||
|
|
43c98b7ddd | ||
|
|
e065ccb7b7 | ||
|
|
eea9e060c8 | ||
|
|
3377885587 | ||
|
|
39f4f4f0ea | ||
|
|
85c54eda7d | ||
|
|
fc6d9ba67a | ||
|
|
ff25a5b432 | ||
|
|
fd8a56762d | ||
|
|
7e4c3c0df0 | ||
|
|
fae2187394 | ||
|
|
86390bde02 | ||
|
|
595aa9b062 | ||
|
|
3eed6de797 | ||
|
|
8655aa8c37 | ||
|
|
47c64661ec | ||
|
|
aa4646692e | ||
|
|
67ee00c3f8 | ||
|
|
52e18e5125 | ||
|
|
30a7bd49a9 | ||
|
|
654d35bc89 | ||
|
|
1ae11fef58 | ||
|
|
6023462bbd | ||
|
|
163cc6b6bd | ||
|
|
891e9bacaa | ||
|
|
c8796d9a54 | ||
|
|
0c918caed2 | ||
|
|
46f6d28fca | ||
|
|
7d4641c5ec | ||
|
|
fc1ec9123d | ||
|
|
220415f698 | ||
|
|
82389925bc | ||
|
|
7714ef83aa | ||
|
|
09ce9f3107 | ||
|
|
a409016f7a | ||
|
|
7585514868 | ||
|
|
99ab59f3a3 | ||
|
|
7d20a9ed84 | ||
|
|
3878dcd27f | ||
|
|
9fb2e9d30d | ||
|
|
d6a1889e9f | ||
|
|
34b0c8e774 | ||
|
|
f11ae35b07 | ||
|
|
18d62429bf | ||
|
|
65d56afc02 | ||
|
|
71dde4d0dd | ||
|
|
576632fbbf | ||
|
|
f7995f6da7 | ||
|
|
6115bbabc8 | ||
|
|
dc1c166ac2 | ||
|
|
279849debe | ||
|
|
07c5474cf2 | ||
|
|
bd5fc861df | ||
|
|
6988060269 | ||
|
|
cf6ed8c382 | ||
|
|
d536f3e93c | ||
|
|
cc2262dbaf | ||
|
|
f3fa0eb849 | ||
|
|
7c9bca1325 | ||
|
|
493f299cce | ||
|
|
5d7248d4c7 | ||
|
|
d9e8fb3469 | ||
|
|
a5051e116a | ||
|
|
3358d0e3d7 | ||
|
|
ca183c7de6 | ||
|
|
b39961e43e | ||
|
|
19bb1a1ce1 | ||
|
|
320fd57d8a | ||
|
|
2898dc497a | ||
|
|
9c11e19db8 |
25
.github/workflows/build.yml
vendored
25
.github/workflows/build.yml
vendored
@@ -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/*
|
||||
@@ -693,6 +701,7 @@ jobs:
|
||||
rm -rf zen-browser
|
||||
rm -rf archive.tar
|
||||
rm -rf zen.linux-x86_64.tar.xz
|
||||
rm -rf zen.linux-aarch64.tar.xz
|
||||
|
||||
- name: Upload Flatpak manifest
|
||||
uses: actions/upload-artifact@v4
|
||||
|
||||
20
.github/workflows/linux-release-build.yml
vendored
20
.github/workflows/linux-release-build.yml
vendored
@@ -30,6 +30,7 @@ jobs:
|
||||
SCCACHE_GHA_ENABLED: 'true'
|
||||
CARGO_TERM_COLOR: always
|
||||
RUSTC_WRAPPER: 'sccache'
|
||||
CARGO_INCREMENTAL: 0
|
||||
name: Build Linux - ${{ matrix.arch }}
|
||||
|
||||
steps:
|
||||
@@ -38,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:
|
||||
@@ -50,7 +55,16 @@ jobs:
|
||||
node-version-file: '.nvmrc'
|
||||
|
||||
- name: Run sccache-cache
|
||||
uses: mozilla-actions/sccache-action@v0.0.7
|
||||
uses: mozilla-actions/sccache-action@main
|
||||
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: |
|
||||
@@ -147,7 +161,3 @@ jobs:
|
||||
retention-days: 5
|
||||
name: linux_update_manifest_${{ matrix.arch }}
|
||||
path: ./dist/update
|
||||
|
||||
- name: Run sccache stat for check
|
||||
shell: bash
|
||||
run: ${SCCACHE_PATH} --show-stats
|
||||
|
||||
16
.github/workflows/macos-release-build.yml
vendored
16
.github/workflows/macos-release-build.yml
vendored
@@ -29,6 +29,7 @@ jobs:
|
||||
SCCACHE_GHA_ENABLED: 'true'
|
||||
CARGO_TERM_COLOR: always
|
||||
RUSTC_WRAPPER: 'sccache'
|
||||
CARGO_INCREMENTAL: 0
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
@@ -42,7 +43,16 @@ jobs:
|
||||
node-version-file: '.nvmrc'
|
||||
|
||||
- name: Run sccache-cache
|
||||
uses: mozilla-actions/sccache-action@v0.0.7
|
||||
uses: mozilla-actions/sccache-action@main
|
||||
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
|
||||
@@ -163,7 +173,3 @@ jobs:
|
||||
retention-days: 1
|
||||
name: platform.ini
|
||||
path: ./platform.ini
|
||||
|
||||
- name: Run sccache stat for check
|
||||
shell: bash
|
||||
run: ${SCCACHE_PATH} --show-stats
|
||||
|
||||
@@ -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: |
|
||||
|
||||
113
.github/workflows/src/generate_release_notes.sh
vendored
Normal file
113
.github/workflows/src/generate_release_notes.sh
vendored
Normal 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"
|
||||
22
.github/workflows/windows-release-build.yml
vendored
22
.github/workflows/windows-release-build.yml
vendored
@@ -32,6 +32,7 @@ jobs:
|
||||
SCCACHE_GHA_ENABLED: 'true'
|
||||
CARGO_TERM_COLOR: always
|
||||
RUSTC_WRAPPER: 'sccache'
|
||||
CARGO_INCREMENTAL: 0
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -44,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:
|
||||
@@ -56,7 +61,16 @@ jobs:
|
||||
node-version-file: '.nvmrc'
|
||||
|
||||
- name: Run sccache-cache
|
||||
uses: mozilla-actions/sccache-action@v0.0.7
|
||||
uses: mozilla-actions/sccache-action@main
|
||||
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: |
|
||||
@@ -163,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
|
||||
@@ -312,7 +326,3 @@ jobs:
|
||||
retention-days: 5
|
||||
name: windows_update_manifest_${{ matrix.arch == 'aarch64' && 'arm64' || matrix.arch }}
|
||||
path: ./dist/update
|
||||
|
||||
- name: Run sccache stat for check
|
||||
shell: bash
|
||||
run: ${SCCACHE_PATH} --show-stats
|
||||
|
||||
@@ -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" "$@"
|
||||
|
||||
29
README.md
29
README.md
@@ -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!
|
||||
|
||||
@@ -40,11 +40,11 @@ Zen is an open-source project, and we welcome contributions from the community!
|
||||
|
||||
### Issue metrics
|
||||
|
||||
We keep track of how many issues are closed at the end of the month in [docs/issue-metrics](./docs/issue-metrics). This is to keep track of how many issues are being closed, because who doesn't like to see progress? 📈
|
||||
We keep track of how many issues are closed at the end of the month in [docs/issue-metrics](./docs/issue-metrics). We use this to keep track of our issues and see our progress! 📈
|
||||
|
||||
### Versioning
|
||||
|
||||
Zen uses [Semantic Versioning](https://semver.org/) for versioning. 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
|
||||
@@ -67,7 +67,7 @@ Zen is built with performance in mind, and we have optimized the browser to be a
|
||||
|
||||
Zen is available for Linux, macOS, and Windows. You can download the latest version from the official website at [zen-browser.app](https://zen-browser.app/download), or from the [GitHub Releases](https://github.com/zen-browser/desktop/releases) page.
|
||||
|
||||
If you dont see your OS listed below, that's because we already have it in our [downloads page](https://zen-browser.app/download)! Make sure to check it out!
|
||||
If you don't see your OS listed below, that's because we already have it in our [downloads page](https://zen-browser.app/download)! Make sure to check it out!
|
||||
|
||||
#### Windows
|
||||
|
||||
@@ -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`.
|
||||
@@ -117,7 +122,7 @@ Some components used by @zen-browser as an attempt to make firefox forks a bette
|
||||
|
||||
#### `Run Locally`
|
||||
|
||||
In order to download and run zen locally, please follow [these instructions](https://docs.zen-browser.app/building).
|
||||
In order to download and run Zen locally, please follow [these instructions](https://docs.zen-browser.app/building).
|
||||
|
||||
#### `Special Thanks`
|
||||
|
||||
@@ -133,10 +138,10 @@ Zen couldn't be in its current state without the help of these amazing projects!
|
||||
|
||||
### 🖥️ Comparison with other browsers
|
||||
|
||||
Thanks everyone for making zen stand out among these giants!
|
||||
Thanks everyone for making Zen stand out among these giants!
|
||||
|
||||
[](https://star-history.com/#zen-browser/desktop&chromium/chromium&brave/brave-browser&Date)
|
||||
|
||||
## 📄 License
|
||||
|
||||
Zen browser is under the [MPL LICENSE](./LICENSE). All the code is open-source and free to use! Attributions are 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.
|
||||
|
||||
@@ -34,7 +34,7 @@ fi
|
||||
if test "$ZEN_RELEASE"; then
|
||||
|
||||
ac_add_options --enable-clang-plugin
|
||||
ac_add_options --enable-bootstrap
|
||||
ac_add_options --enable-bootstrap=-sccache
|
||||
|
||||
ac_add_options --enable-release
|
||||
ac_add_options --disable-debug
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
817
docs/issue-metrics/2025_2025-02-01..2025-02-28.md
Normal file
817
docs/issue-metrics/2025_2025-02-01..2025-02-28.md
Normal 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 can’t 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 | 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” can’t 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`
|
||||
@@ -1 +1 @@
|
||||
8d18d852fbaeaa05c6ec3ebd9b35312f2c58021f
|
||||
6ad0ab3c43a6208d8bcd997b40e802fccd48ba0a
|
||||
2
l10n
2
l10n
Submodule l10n updated: 92e05a383d...c5a36ae64f
2256
package-lock.json
generated
2256
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -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
1916
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
10
scripts/update-surfer.sh
Normal file
10
scripts/update-surfer.sh
Normal 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
|
||||
@@ -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
13
src/Cargo-lock.patch
Normal 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
14
src/Cargo-toml.patch
Normal 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" }
|
||||
@@ -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);
|
||||
|
||||
@@ -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 }
|
||||
);
|
||||
}
|
||||
})();
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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,9 +223,9 @@ var gZenUIManager = {
|
||||
},
|
||||
|
||||
urlbarTrim(aURL) {
|
||||
if (gZenVerticalTabsManager._hasSetSingleToolbar) {
|
||||
if (gZenVerticalTabsManager._hasSetSingleToolbar && this.urlbarShowDomainOnly) {
|
||||
let url = BrowserUIUtils.removeSingleTrailingSlashFromURL(aURL);
|
||||
return url.startsWith('http://') || url.startsWith('https://') ? url.split('/')[2] : url;
|
||||
return url.startsWith('https://') ? url.split('/')[2] : url;
|
||||
}
|
||||
return BrowserUIUtils.trimURL(aURL);
|
||||
},
|
||||
@@ -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'));
|
||||
|
||||
@@ -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&utm_medium=firefox-desktop&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&utm_medium=firefox-desktop&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>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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)
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -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>
|
||||
|
||||
100
src/browser/base/content/zen-images/note-indicator.svg
Normal file
100
src/browser/base/content/zen-images/note-indicator.svg
Normal 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 |
51
src/browser/base/content/zen-media-player.inc.xhtml
Normal file
51
src/browser/base/content/zen-media-player.inc.xhtml
Normal 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>
|
||||
@@ -1,3 +1,4 @@
|
||||
#include zen-media-player.inc.xhtml
|
||||
<toolbar brighttext="true"
|
||||
id="zen-sidebar-bottom-buttons"
|
||||
fullscreentoolbar="true"
|
||||
|
||||
@@ -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>
|
||||
|
||||
49
src/browser/base/content/zen-styles/windows/zen-settings.css
Normal file
49
src/browser/base/content/zen-styles/windows/zen-settings.css
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,23 +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);
|
||||
/* 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;
|
||||
@@ -112,6 +132,7 @@
|
||||
|
||||
& #urlbar[open][zen-floating-urlbar='true'] {
|
||||
transition: left 0.05s ease;
|
||||
visibility: visible;
|
||||
|
||||
#navigator-toolbox:has(&) {
|
||||
opacity: 1;
|
||||
@@ -133,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%,
|
||||
@@ -248,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;
|
||||
}
|
||||
}
|
||||
@@ -311,6 +333,10 @@
|
||||
position: relative !important;
|
||||
}
|
||||
|
||||
& #urlbar {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
@media (-moz-bool-pref: 'zen.view.compact.color-toolbar') {
|
||||
background-attachment: fixed;
|
||||
background: var(--zen-main-browser-background-toolbar);
|
||||
@@ -344,6 +370,15 @@
|
||||
opacity: var(--zen-grainy-background-opacity, 0);
|
||||
mix-blend-mode: overlay;
|
||||
}
|
||||
|
||||
& #urlbar {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
& #urlbar[breakout-extend='true']:not([zen-floating-urlbar='true']) {
|
||||
top: 2px !important;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
178
src/browser/base/content/zen-styles/zen-folders.css
Normal file
178
src/browser/base/content/zen-styles/zen-folders.css
Normal 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;
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
284
src/browser/base/content/zen-styles/zen-media-controls.css
Normal file
284
src/browser/base/content/zen-styles/zen-media-controls.css
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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%;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
@@ -847,8 +855,8 @@
|
||||
position: relative;
|
||||
height: calc(100% - var(--tab-block-margin) * 2);
|
||||
margin-left: calc(-1 * var(--tab-inline-padding) + var(--tab-block-margin));
|
||||
margin-right: 4px;
|
||||
padding: 0 calc(var(--toolbarbutton-inner-padding)) 0 calc(var(--toolbarbutton-inner-padding) / 4 + var(--tab-inline-padding) - 2px);
|
||||
margin-right: 8px;
|
||||
padding: 0 calc(var(--toolbarbutton-inner-padding) - 2px) 0 calc(var(--toolbarbutton-inner-padding) / 4 + var(--tab-inline-padding) - 2px);
|
||||
border-radius: 0;
|
||||
border-top-left-radius: var(--border-radius-medium);
|
||||
width: unset;
|
||||
@@ -863,6 +871,7 @@
|
||||
pointer-events: none;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
&::after {
|
||||
@@ -870,12 +879,12 @@
|
||||
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: calc(var(--tab-inline-padding) / 2 - 1px);
|
||||
right: 0;
|
||||
top: 50%;
|
||||
border-radius: 2px;
|
||||
transform: rotate(10deg) translateY(-50%);
|
||||
transform: rotate(15deg) translateY(-50%);
|
||||
}
|
||||
|
||||
&:hover::after {
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
10
src/browser/base/moz-build.patch
Normal file
10
src/browser/base/moz-build.patch
Normal 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"]
|
||||
@@ -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;
|
||||
@@ -153,14 +171,20 @@ var gZenCompactModeManager = {
|
||||
animateCompactMode() {
|
||||
this._animating = true;
|
||||
const isCompactMode = this.preference;
|
||||
const canHideSidebar = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar');
|
||||
const canHideSidebar =
|
||||
Services.prefs.getBoolPref('zen.view.compact.hide-tabbar') || gZenVerticalTabsManager._hasSetSingleToolbar;
|
||||
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');
|
||||
@@ -189,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) {
|
||||
@@ -305,9 +334,6 @@ var gZenCompactModeManager = {
|
||||
{
|
||||
element: gZenVerticalTabsManager.actualWindowButtons,
|
||||
},
|
||||
{
|
||||
element: gZenVerticalTabsManager.actualWindowButtons,
|
||||
},
|
||||
];
|
||||
},
|
||||
|
||||
@@ -319,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 {
|
||||
@@ -343,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;
|
||||
@@ -365,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;
|
||||
@@ -375,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) => {
|
||||
@@ -424,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
102
src/browser/base/zen-components/ZenFolders.mjs
Normal file
102
src/browser/base/zen-components/ZenFolders.mjs
Normal 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();
|
||||
}
|
||||
@@ -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://*/*'],
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
480
src/browser/base/zen-components/ZenMediaController.mjs
Normal file
480
src/browser/base/zen-components/ZenMediaController.mjs
Normal 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();
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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');
|
||||
},
|
||||
|
||||
@@ -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
|
||||
@@ -267,11 +268,20 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
|
||||
// remove tab from list
|
||||
tabs.splice(tabs.indexOf(tab), 1);
|
||||
if (tab.pinned) {
|
||||
pinnedSection.insertBefore(tab, pinnedSection.lastChild);
|
||||
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 });
|
||||
}
|
||||
}
|
||||
@@ -1999,7 +2036,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
|
||||
const contaienr = document.querySelector(
|
||||
`#vertical-pinned-tabs-container .zen-workspace-tabs-section[zen-workspace-id="${workspaceId}"]`
|
||||
);
|
||||
contaienr.insertBefore(tab, contaienr.firstChild);
|
||||
contaienr.insertBefore(tab, contaienr.lastChild);
|
||||
changed = true;
|
||||
}
|
||||
if (changed) {
|
||||
@@ -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,10 +2346,26 @@ 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;
|
||||
}
|
||||
|
||||
getDefaultContainer() {
|
||||
if (!this.workspaceEnabled) {
|
||||
return 0;
|
||||
}
|
||||
const workspaces = this._workspaceCache;
|
||||
if (!workspaces) {
|
||||
return 0;
|
||||
}
|
||||
const activeWorkspace = this.activeWorkspace;
|
||||
const workspace = workspaces.workspaces.find((workspace) => workspace.uuid === activeWorkspace);
|
||||
return workspace.containerTabId;
|
||||
}
|
||||
})();
|
||||
|
||||
@@ -7,6 +7,7 @@ var ZenWorkspacesStorage = {
|
||||
Weave: 'resource://services-sync/main.sys.mjs',
|
||||
});
|
||||
|
||||
if (!window.ZenWorkspaces) return;
|
||||
await this._ensureTable();
|
||||
await ZenWorkspaceBookmarksStorage.init();
|
||||
},
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
11
src/browser/base/zen-components/moz.build
Normal file
11
src/browser/base/zen-components/moz.build
Normal 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",
|
||||
]
|
||||
45
src/browser/base/zen-components/windows/zen-settings.xhtml
Normal file
45
src/browser/base/zen-components/windows/zen-settings.xhtml
Normal 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>
|
||||
12
src/browser/components/BrowserContentHandler-sys-mjs.patch
Normal file
12
src/browser/components/BrowserContentHandler-sys-mjs.patch
Normal 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",
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
@@ -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"
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
12
src/browser/components/extensions/parent/ext-tabs-js.patch
Normal file
12
src/browser/components/extensions/parent/ext-tabs-js.patch
Normal 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) {
|
||||
@@ -1,5 +1,5 @@
|
||||
diff --git a/browser/components/places/PlacesUIUtils.sys.mjs b/browser/components/places/PlacesUIUtils.sys.mjs
|
||||
index 0f79ba5dd42116d626445b86f6b24731d2fa8aad..76d692db1731e84b28d9035b03e34c176c12bd23 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 0f79ba5dd42116d626445b86f6b24731d2fa8aad..76d692db1731e84b28d9035b03e34c17
|
||||
+ 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,3 +157,20 @@ index 0f79ba5dd42116d626445b86f6b24731d2fa8aad..76d692db1731e84b28d9035b03e34c17
|
||||
/**
|
||||
* Append transactions to update tags by given information.
|
||||
*
|
||||
@@ -902,8 +1011,15 @@ export var PlacesUIUtils = {
|
||||
aNode,
|
||||
aWhere,
|
||||
aWindow,
|
||||
- { aPrivate = false, userContextId = 0 } = {}
|
||||
+ { aPrivate = false, userContextId = undefined } = {}
|
||||
) {
|
||||
+ if (typeof userContextId == "undefined") {
|
||||
+ try {
|
||||
+ let browserWindow = getBrowserWindow(aWindow);
|
||||
+ userContextId = browserWindow.ZenWorkspaces.getDefaultContainer();
|
||||
+ } catch {}
|
||||
+ }
|
||||
+
|
||||
if (
|
||||
aNode &&
|
||||
lazy.PlacesUtils.nodeIsURI(aNode) &&
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
13
src/browser/components/search/SearchOneOffs-sys-mjs.patch
Normal file
13
src/browser/components/search/SearchOneOffs-sys-mjs.patch
Normal 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
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js
|
||||
index d41c486c02a6f09dcff5741a59ad8b617294c481..1c150fd8863335ee356601f7872c1fdc2086dcab 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..1c150fd8863335ee356601f7872c1fdc
|
||||
<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..1c150fd8863335ee356601f7872c1fdc
|
||||
}
|
||||
|
||||
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..1c150fd8863335ee356601f7872c1fdc
|
||||
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,11 +80,11 @@ index d41c486c02a6f09dcff5741a59ad8b617294c481..1c150fd8863335ee356601f7872c1fdc
|
||||
}
|
||||
|
||||
on_dblclick(event) {
|
||||
@@ -576,6 +590,8 @@
|
||||
@@ -568,6 +582,8 @@
|
||||
animate: true,
|
||||
triggeringEvent: event,
|
||||
});
|
||||
+ } else if (this.hasAttribute('zen-essential')) {
|
||||
+ } else if (this.hasAttribute('zen-essential') && !event.target.classList.contains("tab-icon-overlay")) {
|
||||
+ gZenPinnedTabManager._onTabResetPinButton(event, this, 'reset');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
|
||||
index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..dd8fba935e26aa0f00b687f23b64935dfcf339fa 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;
|
||||
}
|
||||
|
||||
@@ -19,19 +19,6 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..dd8fba935e26aa0f00b687f23b64935d
|
||||
+ return i;
|
||||
+ }
|
||||
+
|
||||
+ get _numVisiblePinTabsWithoutGlance() {
|
||||
+ let i = 0;
|
||||
+ for (let tab of this.tabs) {
|
||||
+ if (!tab.pinned) {
|
||||
+ break;
|
||||
+ }
|
||||
+ if (!tab.hidden && !tab.hasAttribute("zen-glance-tab")) {
|
||||
+ i++;
|
||||
+ }
|
||||
+ }
|
||||
+ return i;
|
||||
+ }
|
||||
+
|
||||
+ get _numZenEssentials() {
|
||||
+ let i = 0;
|
||||
+ for (let tab of this.tabs) {
|
||||
@@ -42,6 +29,19 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..dd8fba935e26aa0f00b687f23b64935d
|
||||
+ }
|
||||
+ return i;
|
||||
+ }
|
||||
+
|
||||
+ get _numZenVisibleEssentials() {
|
||||
+ let i = 0;
|
||||
+ for (let tab of this.tabs) {
|
||||
+ if (!tab.hasAttribute("zen-essential") && !tab.hasAttribute("zen-glance-tab")) {
|
||||
+ break;
|
||||
+ }
|
||||
+ if (!tab.hidden) {
|
||||
+ i += !tab.hasAttribute("zen-glance-tab");
|
||||
+ }
|
||||
+ }
|
||||
+ return i;
|
||||
+ }
|
||||
+
|
||||
get pinnedTabCount() {
|
||||
- for (var i = 0; i < this.tabs.length; i++) {
|
||||
@@ -55,25 +55,50 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..dd8fba935e26aa0f00b687f23b64935d
|
||||
}
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
if (
|
||||
aIconURL &&
|
||||
!aLoadingPrincipal &&
|
||||
@@ -1065,6 +1106,9 @@
|
||||
@@ -1028,6 +1074,9 @@
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -92,7 +117,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..dd8fba935e26aa0f00b687f23b64935d
|
||||
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
// 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..dd8fba935e26aa0f00b687f23b64935d
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1888,7 +1936,7 @@
|
||||
@@ -1851,7 +1904,7 @@
|
||||
newIndex = this.selectedTab._tPos + 1;
|
||||
}
|
||||
|
||||
@@ -128,17 +153,25 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..dd8fba935e26aa0f00b687f23b64935d
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
} 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..dd8fba935e26aa0f00b687f23b64935d
|
||||
+ }
|
||||
+ 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..dd8fba935e26aa0f00b687f23b64935d
|
||||
// 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..dd8fba935e26aa0f00b687f23b64935d
|
||||
+ 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..dd8fba935e26aa0f00b687f23b64935d
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
+ 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..dd8fba935e26aa0f00b687f23b64935d
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
+ 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..dd8fba935e26aa0f00b687f23b64935d
|
||||
this.removeTabs(selectedTabs);
|
||||
}
|
||||
|
||||
@@ -4427,6 +4530,7 @@
|
||||
@@ -4391,6 +4520,7 @@
|
||||
skipSessionStore,
|
||||
} = {}
|
||||
) {
|
||||
@@ -300,7 +420,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..dd8fba935e26aa0f00b687f23b64935d
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
// 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..dd8fba935e26aa0f00b687f23b64935d
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
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..dd8fba935e26aa0f00b687f23b64935d
|
||||
}
|
||||
|
||||
// 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..dd8fba935e26aa0f00b687f23b64935d
|
||||
}
|
||||
|
||||
// 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,28 +528,56 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..dd8fba935e26aa0f00b687f23b64935d
|
||||
aTab.selected ||
|
||||
aTab.closing ||
|
||||
// Tabs that are sharing the screen, microphone or camera cannot be hidden.
|
||||
@@ -5706,9 +5818,9 @@
|
||||
@@ -5675,7 +5813,7 @@
|
||||
|
||||
// Don't allow mixing pinned and unpinned tabs.
|
||||
if (aTab.pinned) {
|
||||
- aIndex = Math.min(aIndex, this.pinnedTabCount - 1);
|
||||
+ aIndex = aTab.hasAttribute('zen-essential') ? Math.min(aIndex, this._numZenEssentials) : Math.min(aIndex, this._numVisiblePinTabs - 1);
|
||||
+ aIndex = aTab.hasAttribute('zen-essential') ? Math.min(aIndex, this._numZenEssentials - 1) : Math.min(aIndex, this.pinnedTabCount - 1);
|
||||
} else {
|
||||
- aIndex = Math.max(aIndex, this.pinnedTabCount);
|
||||
+ aIndex = Math.max(aIndex, this._numVisiblePinTabsWithoutGlance + this._numZenEssentials);
|
||||
aIndex = Math.max(aIndex, this.pinnedTabCount);
|
||||
}
|
||||
if (aTab._tPos == aIndex) {
|
||||
return;
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -438,15 +586,24 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..dd8fba935e26aa0f00b687f23b64935d
|
||||
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;
|
||||
@@ -455,7 +612,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..dd8fba935e26aa0f00b687f23b64935d
|
||||
// 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] ||
|
||||
@@ -464,7 +621,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..dd8fba935e26aa0f00b687f23b64935d
|
||||
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 {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
|
||||
index 8aeb244ffca9f48661805f5b7d860b5896055562..2b988219f279f7b6e1178518e436a7f2b437ce20 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..2b988219f279f7b6e1178518e436a7f2
|
||||
}
|
||||
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..2b988219f279f7b6e1178518e436a7f2
|
||||
event.composedTarget.localName == "toolbarbutton"
|
||||
) {
|
||||
return;
|
||||
@@ -411,6 +411,7 @@
|
||||
@@ -388,6 +388,7 @@
|
||||
// Reset the "ignored click" flag
|
||||
target._ignoredCloseButtonClicks = false;
|
||||
}
|
||||
@@ -28,29 +28,34 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..2b988219f279f7b6e1178518e436a7f2
|
||||
}
|
||||
|
||||
/* 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
|
||||
- let pinnedTabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount);
|
||||
+ let pinnedTabs = this.visibleTabs.slice(0, gBrowser._numVisiblePinTabs);
|
||||
+ let pinnedTabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(0, gBrowser._numZenVisibleEssentials);
|
||||
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..2b988219f279f7b6e1178518e436a7f2
|
||||
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..2b988219f279f7b6e1178518e436a7f2
|
||||
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..2b988219f279f7b6e1178518e436a7f2
|
||||
) {
|
||||
delete draggedTab._dragData;
|
||||
return;
|
||||
@@ -1478,7 +1491,7 @@
|
||||
@@ -1517,7 +1545,7 @@
|
||||
}
|
||||
|
||||
get newTabButton() {
|
||||
@@ -110,7 +145,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..2b988219f279f7b6e1178518e436a7f2
|
||||
}
|
||||
|
||||
get verticalMode() {
|
||||
@@ -1498,7 +1511,7 @@
|
||||
@@ -1537,28 +1565,40 @@
|
||||
if (this.#allTabs) {
|
||||
return this.#allTabs;
|
||||
}
|
||||
@@ -119,8 +154,14 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..2b988219f279f7b6e1178518e436a7f2
|
||||
// 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..2b988219f279f7b6e1178518e436a7f2
|
||||
+ 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..2b988219f279f7b6e1178518e436a7f2
|
||||
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..2b988219f279f7b6e1178518e436a7f2
|
||||
}
|
||||
return this.#visibleTabs;
|
||||
}
|
||||
@@ -1574,10 +1602,8 @@
|
||||
@@ -1613,10 +1653,8 @@
|
||||
return this.#focusableItems;
|
||||
}
|
||||
|
||||
@@ -173,7 +216,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..2b988219f279f7b6e1178518e436a7f2
|
||||
|
||||
let focusableItems = [];
|
||||
for (let child of children) {
|
||||
@@ -1593,6 +1619,7 @@
|
||||
@@ -1632,6 +1670,7 @@
|
||||
}
|
||||
|
||||
this.#focusableItems = [
|
||||
@@ -181,7 +224,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..2b988219f279f7b6e1178518e436a7f2
|
||||
...verticalPinnedTabsContainer.children,
|
||||
...focusableItems,
|
||||
];
|
||||
@@ -1603,6 +1630,7 @@
|
||||
@@ -1642,6 +1681,7 @@
|
||||
_invalidateCachedTabs() {
|
||||
this.#allTabs = null;
|
||||
this._invalidateCachedVisibleTabs();
|
||||
@@ -189,7 +232,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..2b988219f279f7b6e1178518e436a7f2
|
||||
}
|
||||
|
||||
_invalidateCachedVisibleTabs() {
|
||||
@@ -1617,8 +1645,8 @@
|
||||
@@ -1656,8 +1696,8 @@
|
||||
#isContainerVerticalPinnedExpanded(tab) {
|
||||
return (
|
||||
this.verticalMode &&
|
||||
@@ -200,7 +243,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..2b988219f279f7b6e1178518e436a7f2
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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..2b988219f279f7b6e1178518e436a7f2
|
||||
}
|
||||
|
||||
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..2b988219f279f7b6e1178518e436a7f2
|
||||
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..2b988219f279f7b6e1178518e436a7f2
|
||||
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..2b988219f279f7b6e1178518e436a7f2
|
||||
selectedTab._notselectedsinceload = false;
|
||||
}
|
||||
|
||||
@@ -1843,7 +1873,7 @@
|
||||
@@ -1882,7 +1924,7 @@
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -249,7 +292,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..2b988219f279f7b6e1178518e436a7f2
|
||||
if (!tabs.length) {
|
||||
return;
|
||||
}
|
||||
@@ -1879,7 +1909,7 @@
|
||||
@@ -1918,7 +1960,7 @@
|
||||
if (isEndTab && !this._hasTabTempMaxWidth) {
|
||||
return;
|
||||
}
|
||||
@@ -258,7 +301,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..2b988219f279f7b6e1178518e436a7f2
|
||||
// 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..2b988219f279f7b6e1178518e436a7f2
|
||||
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..2b988219f279f7b6e1178518e436a7f2
|
||||
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..2b988219f279f7b6e1178518e436a7f2
|
||||
|
||||
if (!verticalTabsContainer.children.length) {
|
||||
return;
|
||||
@@ -1992,8 +2019,8 @@
|
||||
@@ -2031,8 +2070,8 @@
|
||||
}
|
||||
|
||||
_positionPinnedTabs() {
|
||||
@@ -312,37 +355,81 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..2b988219f279f7b6e1178518e436a7f2
|
||||
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;
|
||||
}
|
||||
|
||||
- let tabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount);
|
||||
+ let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(0, gBrowser._numVisiblePinTabs);
|
||||
+ let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(0, gBrowser._numZenVisibleEssentials);
|
||||
|
||||
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..2b988219f279f7b6e1178518e436a7f2
|
||||
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..2b988219f279f7b6e1178518e436a7f2
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2754,7 +2783,7 @@
|
||||
@@ -2793,7 +2843,7 @@
|
||||
}
|
||||
|
||||
_notifyBackgroundTab(aTab) {
|
||||
@@ -375,73 +479,3 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..2b988219f279f7b6e1178518e436a7f2
|
||||
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")) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
12
src/browser/installer/windows/msix/AppxManifest-xml-in.patch
Normal file
12
src/browser/installer/windows/msix/AppxManifest-xml-in.patch
Normal 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>
|
||||
46
src/browser/installer/windows/nsis/shared-nsh.patch
Normal file
46
src/browser/installer/windows/nsis/shared-nsh.patch
Normal 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" ""
|
||||
12
src/browser/installer/windows/nsis/uninstaller-nsi.patch
Normal file
12
src/browser/installer/windows/nsis/uninstaller-nsi.patch
Normal 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"
|
||||
|
||||
13
src/browser/modules/URILoadingHelper-sys-mjs.patch
Normal file
13
src/browser/modules/URILoadingHelper-sys-mjs.patch
Normal 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 (
|
||||
@@ -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 @@
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 @@
|
||||
}
|
||||
|
||||
|
||||
13
src/browser/themes/shared/urlbarView-css.patch
Normal file
13
src/browser/themes/shared/urlbarView-css.patch
Normal 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;
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user