diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..88c52a4ae --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +node_modules +.git +.DS_Store +*.log +engine diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b2bb32048..eed0f725e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,10 +16,10 @@ on: update_branch: description: 'Update branch with new version' required: true - default: 'alpha' + default: 'beta' type: 'choice' options: - - 'alpha' + - 'beta' - 'twilight' workflow_call: inputs: @@ -36,7 +36,7 @@ on: update_branch: description: 'Update branch with new version' required: true - default: 'alpha' + default: 'beta' type: 'string' jobs: @@ -72,7 +72,7 @@ jobs: git status git branch --show-current branch="${{ inputs.update_branch }}" - if [[ $branch == "alpha" ]]; then + if [[ $branch == "beta" ]]; then branch="stable" elif [[ $branch == "twilight" ]]; then branch="dev" @@ -104,7 +104,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version-file: '.nvmrc' - name: Setup pnpm run: npm install -g pnpm @@ -124,7 +124,7 @@ jobs: npm i -g @zen-browser/surfer - name: Bump version - if: ${{ inputs.update_version && inputs.update_branch == 'alpha' }} + if: ${{ inputs.update_version && inputs.update_branch == 'beta' }} run: | pnpm surfer ci --brand ${{ inputs.update_branch }} --bump prerelease @@ -159,7 +159,7 @@ jobs: runs-on: ubuntu-latest needs: [build-data] steps: - - name: Checkout repository + - name: Checkout repository uses: actions/checkout@v4 with: submodules: recursive @@ -168,7 +168,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version-file: '.nvmrc' - name: Setup pnpm run: npm install -g pnpm @@ -220,7 +220,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version-file: '.nvmrc' - name: Setup Git run: | @@ -258,6 +258,7 @@ jobs: - name: Upload artifact uses: actions/upload-artifact@v4 with: + retention-days: 5 name: zen.source.tar.zst path: ./zen.source.tar.zst @@ -321,13 +322,13 @@ jobs: release-branch: ${{ inputs.update_branch }} appimage: - name: AppImage build - Linux ${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'aarch64' }} + name: AppImage build - Linux ${{ matrix.arch }} permissions: contents: write runs-on: ubuntu-latest strategy: matrix: - arch: [x86_64, x86_64-v3, aarch64] + arch: [x86_64, aarch64] needs: [linux] steps: - name: Checkout repository @@ -339,7 +340,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version-file: '.nvmrc' - name: Install dependencies run: | @@ -350,7 +351,7 @@ jobs: - name: Download Linux build uses: actions/download-artifact@v4 with: - name: zen.linux-${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'aarch64' }}.tar.bz2 + name: zen.linux-${{ matrix.arch }}.tar.bz2 - name: Execute AppImage build run: | @@ -361,7 +362,7 @@ jobs: if [ "${{ inputs.update_branch }}" = "twilight" ]; then sed -i -e 's/Name=Zen Browser/Name=Zen Twilight/g' AppDir/zen.desktop - sed -i -e 's/StartupWMClass=zen-alpha/StartupWMClass=zen-twilight/g' AppDir/zen.desktop + sed -i -e 's/StartupWMClass=zen-beta/StartupWMClass=zen-twilight/g' AppDir/zen.desktop fi APPDIR=AppDir @@ -374,23 +375,25 @@ jobs: ls -al find . ls -al "$APPDIR" - ARCH=${{ matrix.arch == 'aarch64' && 'aarch64' || 'x86_64' }} ./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 == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'aarch64' }}.AppImage.zsync" \ - "$APPDIR" zen-${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'aarch64' }}.AppImage + 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 mkdir dist mv zen*AppImage* dist/. - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: zen-${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'aarch64' }}.AppImage - path: ./dist/zen-${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'aarch64' }}.AppImage + retention-days: 5 + name: zen-${{ matrix.arch }}.AppImage + path: ./dist/zen-${{ matrix.arch }}.AppImage - name: Upload artifact (ZSync) uses: actions/upload-artifact@v4 with: - name: zen-${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'aarch64' }}.AppImage.zsync - path: ./dist/zen-${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'aarch64' }}.AppImage.zsync + retention-days: 5 + name: zen-${{ matrix.arch }}.AppImage.zsync + path: ./dist/zen-${{ matrix.arch }}.AppImage.zsync release: if: ${{ inputs.create_release || inputs.update_branch == 'twilight' }} @@ -399,7 +402,7 @@ jobs: needs: [build-data, linux, windows-step-3, check-release, mac, appimage, source] runs-on: ubuntu-latest environment: - name: ${{ inputs.update_branch == 'alpha' && 'Deploy-Release' || 'Deploy-Twilight' }} + name: ${{ inputs.update_branch == 'beta' && 'Deploy-Release' || 'Deploy-Twilight' }} steps: - name: Checkout repository @@ -435,17 +438,14 @@ jobs: run: | cd updates-server mkdir -p updates - cp -a ../linux_update_manifest_generic/. updates/ - cp -a ../linux_update_manifest_specific/. updates/ + cp -a ../linux_update_manifest_x86_64/. updates/ cp -a ../linux_update_manifest_aarch64/. updates/ - if [[ $RELEASE_BRANCH == 'alpha' ]]; then - cp -a ../.github/workflows/object/windows-x64-signed-generic/update_manifest/. updates/ - cp -a ../.github/workflows/object/windows-x64-signed-specific/update_manifest/. updates/ + if [[ $RELEASE_BRANCH == 'beta' ]]; then + cp -a ../.github/workflows/object/windows-x64-signed-x86_64/update_manifest/. updates/ cp -a ../.github/workflows/object/windows-x64-signed-arm64/update_manifest/. updates/ else - cp -a ../windows_update_manifest_generic/. updates/ - cp -a ../windows_update_manifest_specific/. updates/ + cp -a ../windows_update_manifest_x86_64/. updates/ cp -a ../windows_update_manifest_arm64/. updates/ fi @@ -467,28 +467,21 @@ jobs: with: files: | zen.source.tar.zst - zen.linux-generic.tar.bz2 - zen.linux-specific.tar.bz2 + zen.linux-x86_64.tar.bz2 zen.linux-aarch64.tar.bz2 - zen-generic.AppImage - zen-generic.AppImage.zsync - zen-specific.AppImage - zen-specific.AppImage.zsync + zen-x86_64.AppImage + zen-x86_64.AppImage.zsync zen-aarch64.AppImage zen-aarch64.AppImage.zsync - zen.win-generic.zip - zen.win-specific.zip + zen.win-x86_64.zip zen.win-arm64.zip linux.mar - linux-generic.mar linux-aarch64.mar - windows-generic.mar windows.mar windows-arm64.mar macos-x86_64.mar macos-aarch64.mar zen.installer.exe - zen.installer-generic.exe zen.installer-arm64.exe zen.macos-x86_64.dmg zen.macos-aarch64.dmg @@ -502,42 +495,35 @@ jobs: - name: Release uses: marvinpinto/action-automatic-releases@master - if: ${{ inputs.update_branch == 'alpha' }} + if: ${{ inputs.update_branch == 'beta' }} with: repo_token: '${{ secrets.DEPLOY_KEY }}' automatic_release_tag: ${{ needs.build-data.outputs.version }} prerelease: false - title: 'Alpha build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }})' + title: 'Beta build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }})' files: | zen.source.tar.zst - zen.linux-generic.tar.bz2 - zen.linux-specific.tar.bz2 + zen.linux-x86_64.tar.bz2 zen.linux-aarch64.tar.bz2 - zen-generic.AppImage - zen-generic.AppImage.zsync - zen-specific.AppImage - zen-specific.AppImage.zsync + zen-x86_64.AppImage + zen-x86_64.AppImage.zsync zen-aarch64.AppImage zen-aarch64.AppImage.zsync - .github/workflows/object/windows-x64-signed-generic/zen.win-generic.zip - .github/workflows/object/windows-x64-signed-specific/zen.win-specific.zip + .github/workflows/object/windows-x64-signed-x86_64/zen.win-x86_64.zip .github/workflows/object/windows-x64-signed-arm64/zen.win-arm64.zip linux.mar - linux-generic.mar linux-aarch64.mar - .github/workflows/object/windows-x64-signed-generic/windows-generic.mar - .github/workflows/object/windows-x64-signed-specific/windows.mar + .github/workflows/object/windows-x64-signed-x86_64/windows.mar .github/workflows/object/windows-x64-signed-arm64/windows-arm64.mar macos-x86_64.mar macos-aarch64.mar - .github/workflows/object/windows-x64-signed-specific/zen.installer.exe - .github/workflows/object/windows-x64-signed-generic/zen.installer-generic.exe + .github/workflows/object/windows-x64-signed-x86_64/zen.installer.exe .github/workflows/object/windows-x64-signed-arm64/zen.installer-arm64.exe zen.macos-x86_64.dmg zen.macos-aarch64.dmg prepare-flatpak: - if: ${{ inputs.create_release && inputs.update_branch == 'alpha' }} + if: ${{ inputs.create_release && inputs.update_branch == 'beta' }} permissions: write-all name: Prepare Flatpak needs: [release, linux, build-data] @@ -592,11 +578,11 @@ jobs: commit_user_email: zen-browser-auto@users.noreply.github.com repository: ./flatpak - - name: Wait 4 minutes for the Flatpak repo to update - run: sleep 240 + - name: Wait 2 minutes for the Flatpak repo to update + run: sleep 120 release-flatpak: - if: ${{ inputs.create_release && inputs.update_branch == 'alpha' }} + if: ${{ inputs.create_release && inputs.update_branch == 'beta' }} permissions: write-all name: Release Flatpak needs: [prepare-flatpak, build-data] @@ -609,10 +595,10 @@ jobs: repository: flathub/io.github.zen_browser.zen token: ${{ secrets.DEPLOY_KEY }} - - name: Download Linux generic build + - name: Download Linux x86_64 build uses: actions/download-artifact@v4 with: - name: zen.linux-generic.tar.bz2 + name: zen.linux-x86_64.tar.bz2 - name: Update repository uses: actions/checkout@v4 @@ -634,7 +620,7 @@ jobs: python3 ./zen-browser/scripts/prepare-flatpak-release.py \ --flatpak-archive archive.tar \ --version ${{ needs.build-data.outputs.version }} \ - --linux-archive zen.linux-generic.tar.bz2 \ + --linux-archive zen.linux-x86_64.tar.bz2 \ --output io.github.zen_browser.zen.yml \ --template-root ./zen-browser/flatpak @@ -647,11 +633,12 @@ jobs: run: | rm -rf zen-browser rm -rf archive.tar - rm -rf zen.linux-generic.tar.bz2 + rm -rf zen.linux-x86_64.tar.bz2 - name: Upload Flatpak manifest uses: actions/upload-artifact@v4 with: + retention-days: 5 name: io.github.zen_browser.zen.yml path: ./io.github.zen_browser.zen.yml @@ -672,53 +659,3 @@ jobs: base: master git-token: ${{ secrets.DEPLOY_KEY }} delete-branch: true - - release-homebrew-alpha: - if: ${{ inputs.create_release && inputs.update_branch == 'alpha' }} - permissions: write-all - name: Homebrew release for alpha build - needs: [release, mac, build-data] - runs-on: macos-latest - - steps: - - name: Setup Homebrew - uses: Homebrew/actions/setup-homebrew@master - with: - cask: true - test-bot: false - - - name: Setup Git - uses: Homebrew/actions/git-user-config@master - with: - username: zen-browser-auto - - - name: Bump cask - uses: Homebrew/actions/bump-packages@master - with: - token: ${{ secrets.DEPLOY_KEY }} - casks: zen-browser - - release-homebrew-twilight: - if: ${{ inputs.create_release && inputs.update_branch == 'twilight' }} - permissions: write-all - name: Homebrew release for twilight build - needs: [release, mac, build-data] - runs-on: macos-latest - - steps: - - name: Set up Homebrew - uses: Homebrew/actions/setup-homebrew@master - with: - cask: true - test-bot: false - - - name: Setup git - uses: Homebrew/actions/git-user-config@master - with: - username: zen-browser-auto - - - name: Bump cask - uses: Homebrew/actions/bump-packages@master - with: - token: ${{ secrets.DEPLOY_KEY }} - casks: zen-browser@twilight diff --git a/.github/workflows/issue-metrics.yml b/.github/workflows/issue-metrics.yml new file mode 100644 index 000000000..83672ca7f --- /dev/null +++ b/.github/workflows/issue-metrics.yml @@ -0,0 +1,65 @@ +name: Monthly issue metrics +on: + workflow_dispatch: + schedule: + - cron: '3 2 1 * *' + +jobs: + build: + name: issue metrics + runs-on: ubuntu-latest + + steps: + + - name: Checkout code + uses: actions/checkout@v2 + with: + token: ${{ secrets.DEPLOY_KEY }} + + - name: Get dates for last month + shell: bash + run: | + # Get the current date + current_date=$(date +'%Y-%m-%d') + + # Calculate the previous month + previous_date=$(date -d "$current_date -1 month" +'%Y-%m-%d') + + # Extract the year and month from the previous date + previous_year=$(date -d "$previous_date" +'%Y') + previous_month=$(date -d "$previous_date" +'%m') + + # Calculate the first day of the previous month + first_day=$(date -d "$previous_year-$previous_month-01" +'%Y-%m-%d') + + # Calculate the last day of the previous month + last_day=$(date -d "$first_day +1 month -1 day" +'%Y-%m-%d') + + echo "$first_day..$last_day" + echo "last_month=$first_day..$last_day" >> "$GITHUB_ENV" + echo "last_month_year=$previous_year" >> "$GITHUB_ENV" + + - name: Run issue-metrics tool + uses: github/issue-metrics@v2 + env: + GH_TOKEN: ${{ secrets.DEPLOY_KEY }} + HIDE_AUTHOR: true + HIDE_TIME_TO_ANSWER: true + SEARCH_QUERY: 'repo:zen-browser/desktop is:issue created:${{ env.last_month }} -reason:"not planned"' + + - name: Move metrics to docs folder + run: | + mkdir -p docs/issue-metrics + rm -f docs/issue-metrics/${{ env.last_month_year }}_${{ env.last_month }}.md + mv issue_metrics.md docs/issue-metrics/${{ env.last_month_year }}_${{ env.last_month }}.md + + - name: Remove metrisc JSON + run: | + rm -f issue_metrics.json + + - name: Commit changes + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: 'Update monthly issue metrics' + commit_user_name: Zen Browser Robot + commit_user_email: zen-browser-auto@users.noreply.github.com diff --git a/.github/workflows/linux-release-build.yml b/.github/workflows/linux-release-build.yml index 75ee474b7..5b6a5467d 100644 --- a/.github/workflows/linux-release-build.yml +++ b/.github/workflows/linux-release-build.yml @@ -20,8 +20,8 @@ jobs: strategy: fail-fast: false matrix: - arch: [x86_64, x86_64-v3, aarch64] - name: Build Linux - ${{ matrix.arch == 'x86_64' && 'Generic' || matrix.arch == 'x86_64-v3' && 'Specific' || matrix.arch == 'aarch64' && 'aarch64' }} + arch: [x86_64, aarch64] + name: Build Linux - ${{ matrix.arch }} steps: - name: Free Disk Space (Ubuntu) @@ -38,7 +38,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version-file: '.nvmrc' - name: Setup Git run: | @@ -147,23 +147,26 @@ jobs: - name: Rename artifacts run: | - mv dist/zen-*.tar.bz2 "zen.linux-${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'aarch64' }}.tar.bz2" - mv dist/output.mar linux${{ matrix.arch == 'x86_64' && '-generic' || matrix.arch == 'aarch64' && '-aarch64' || '' }}.mar + mv dist/zen-*.tar.bz2 "zen.linux-${{ matrix.arch }}.tar.bz2" + mv dist/output.mar linux${{ matrix.arch == 'aarch64' && '-aarch64' || '' }}.mar - name: Upload build artifact (binary) uses: actions/upload-artifact@v4 with: - name: zen.linux-${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'aarch64' }}.tar.bz2 - path: ./zen.linux-${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'aarch64' }}.tar.bz2 + retention-days: 5 + name: zen.linux-${{ matrix.arch }}.tar.bz2 + path: ./zen.linux-${{ matrix.arch }}.tar.bz2 - name: Upload build artifact (.mar) uses: actions/upload-artifact@v4 with: - name: linux${{ matrix.arch == 'x86_64' && '-generic' || matrix.arch == 'aarch64' && '-aarch64' || '' }}.mar - path: ./linux${{ matrix.arch == 'x86_64' && '-generic' || matrix.arch == 'aarch64' && '-aarch64' || '' }}.mar + retention-days: 5 + name: linux${{ matrix.arch == 'aarch64' && '-aarch64' || '' }}.mar + path: ./linux${{ matrix.arch == 'aarch64' && '-aarch64' || '' }}.mar - name: Upload build artifact (update manifests) uses: actions/upload-artifact@v4 with: - name: linux_update_manifest_${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'aarch64' }} + retention-days: 5 + name: linux_update_manifest_${{ matrix.arch }} path: ./dist/update diff --git a/.github/workflows/macos-release-build.yml b/.github/workflows/macos-release-build.yml index 538ffce07..b4503d765 100644 --- a/.github/workflows/macos-release-build.yml +++ b/.github/workflows/macos-release-build.yml @@ -16,7 +16,7 @@ jobs: mac-build: name: Build macOS - ${{ matrix.arch }} runs-on: macos-14 - + strategy: fail-fast: false matrix: @@ -32,12 +32,11 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version-file: '.nvmrc' - name: Setup Python uses: actions/setup-python@v5 - with: - python-version: '3.11' + # note: This will use the version defined in '.python-version' by default - name: Setup Git run: | @@ -55,17 +54,17 @@ jobs: export PATH="$(python3 -m site --user-base)/bin":$PATH python3 -m pip install --user mercurial - rm '/usr/local/bin/2to3-3.11' '/usr/local/bin/2to3-3.12' '/usr/local/bin/2to3' - rm '/usr/local/bin/idle3.11' '/usr/local/bin/idle3.12' '/usr/local/bin/idle3' - rm '/usr/local/bin/pydoc3.11' '/usr/local/bin/pydoc3.12' '/usr/local/bin/pydoc3' - rm '/usr/local/bin/python3.11' '/usr/local/bin/python3.12' '/usr/local/bin/python3' + rm '/usr/local/bin/2to3-3.11' '/usr/local/bin/2to3-3.12' '/usr/local/bin/2to3' + rm '/usr/local/bin/idle3.11' '/usr/local/bin/idle3.12' '/usr/local/bin/idle3' + rm '/usr/local/bin/pydoc3.11' '/usr/local/bin/pydoc3.12' '/usr/local/bin/pydoc3' + rm '/usr/local/bin/python3.11' '/usr/local/bin/python3.12' '/usr/local/bin/python3' rm '/usr/local/bin/python3.11-config' '/usr/local/bin/python3.12-config' '/usr/local/bin/python3-config' brew install watchman curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain 1.79 source $HOME/.cargo/env - + if test "${{ matrix.arch }}" = "aarch64"; then rustup target add aarch64-apple-darwin else @@ -160,20 +159,37 @@ jobs: --wait xcrun stapler staple "zen.macos-${{ matrix.arch }}.dmg" + - name: Sign .dmg again if failed + if: failure() + run: | + set -ex + hdiutil convert ./dist/*.dmg -format UDZO -imagekey zlib-level=9 -o zen.macos-${{ matrix.arch }}.dmg + xattr -cr zen.macos-${{ matrix.arch }}.dmg + codesign -s "${{ secrets.macOS_AppleDeveloperId }}" zen.macos-${{ matrix.arch }}.dmg + xcrun notarytool submit "zen.macos-${{ matrix.arch }}.dmg" \ + --apple-id "${{ secrets.macOS_AppleAccountId }}" \ + --team-id "${{ secrets.macOS_AppleDeveloperIdTeamId }}" \ + --password "${{ secrets.macOS_AppleDeveloperIdPassword }}" \ + --wait + xcrun stapler staple "zen.macos-${{ matrix.arch }}.dmg" + - name: Upload build artifact uses: actions/upload-artifact@v4 with: + retention-days: 5 name: zen.macos-${{ matrix.arch }}.dmg path: ./zen.macos-${{ matrix.arch }}.dmg - name: Upload build artifact (.mar) uses: actions/upload-artifact@v4 with: + retention-days: 5 name: macos-${{ matrix.arch }}.mar path: ./macos-${{ matrix.arch }}.mar - name: Upload build artifact (update manifests) uses: actions/upload-artifact@v4 with: + retention-days: 5 name: macos_update_manifest_${{ matrix.arch }} path: ./dist/update diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index e48b3acff..1b339c370 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -17,7 +17,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version-file: '.nvmrc' - name: Setup pnpm run: npm install -g pnpm diff --git a/.github/workflows/twilight-release-schedule.yml b/.github/workflows/twilight-release-schedule.yml index 417f70a67..6e79320d2 100644 --- a/.github/workflows/twilight-release-schedule.yml +++ b/.github/workflows/twilight-release-schedule.yml @@ -27,6 +27,6 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version-file: '.nvmrc' # TODO: diff --git a/.github/workflows/windows-profile-build.yml b/.github/workflows/windows-profile-build.yml index aa1487c73..04daf1cad 100644 --- a/.github/workflows/windows-profile-build.yml +++ b/.github/workflows/windows-profile-build.yml @@ -19,13 +19,11 @@ on: jobs: windows-profile-build: name: | - Windows Profile Build - ${{ matrix.arch == 'x86_64' && 'generic' || - matrix.arch == 'x86_64-v3' && 'specific' || - matrix.arch == 'aarch64' && 'arm64' }} + Windows Profile Build - ${{ matrix.arch }} strategy: fail-fast: false matrix: - arch: [x86_64, x86_64-v3, aarch64] + arch: [x86_64, aarch64] runs-on: windows-latest @@ -36,12 +34,12 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version-file: '.nvmrc' - name: Setup Git run: | - git config --global user.email "mauro-balades@users.noreply.github.com" - git config --global user.name "mauro-balades" + git config --global user.email "mr-cheff@users.noreply.github.com" + git config --global user.name "mr-cheff" - name: Setup pnpm run: npm install -g pnpm @@ -53,9 +51,7 @@ jobs: uses: actions/download-artifact@v4 with: path: C:\artifact - name: ${{ matrix.arch == 'x86_64' && 'generic' || - matrix.arch == 'x86_64-v3' && 'specific' || - matrix.arch == 'aarch64' && 'generic' }}-zen-windows-profile-data-and-jarlog.zip + name: ${{ matrix.arch == 'aarch64' && 'arm64' || matrix.arch }}-zen-windows-profile-data-and-jarlog.zip - name: Unpack artifact run: | @@ -70,16 +66,19 @@ jobs: C:\MozillaBuildSetup-Latest.exe /S | out-null - name: Download Firefox and dependencies + if: ${{ matrix.arch == 'x86_64' }} run: | git config --global core.safecrlf false pnpm surfer download - name: Import patches + if: ${{ matrix.arch == 'x86_64' }} env: SURFER_NO_BRANDING_PATCH: true run: pnpm surfer import - name: Generate + if: ${{ matrix.arch == 'x86_64' }} run: | ls $Env:USE_MINTTY = "0" @@ -99,6 +98,7 @@ jobs: timeout-minutes: 15 - name: Move profile data + if: ${{ matrix.arch == 'x86_64' }} run: | dir dir engine @@ -106,11 +106,11 @@ jobs: mv engine/en-US.log en-US.log - name: Upload artifacts + if: ${{ matrix.arch == 'x86_64' }} uses: actions/upload-artifact@v4 with: + retention-days: 1 path: | merged.profdata en-US.log - name: windows-profdata-${{ matrix.arch == 'x86_64' && 'generic' || - matrix.arch == 'x86_64-v3' && 'specific' || - matrix.arch == 'aarch64' && 'arm64' }} + name: windows-profdata-${{ matrix.arch == 'aarch64' && 'arm64' || matrix.arch }} diff --git a/.github/workflows/windows-release-build.yml b/.github/workflows/windows-release-build.yml index 07e36beb5..ae081e8e5 100644 --- a/.github/workflows/windows-release-build.yml +++ b/.github/workflows/windows-release-build.yml @@ -21,13 +21,13 @@ on: jobs: windows-build: - name: Build Windows - ${{ matrix.arch == 'x86_64' && 'Generic' || matrix.arch == 'x86_64-v3' && 'Specific' || matrix.arch == 'aarch64' && 'ARM64' }} + name: Build Windows - ${{ matrix.arch }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: - arch: [x86_64, x86_64-v3, aarch64] + arch: [x86_64, aarch64] steps: - name: Free Disk Space (Ubuntu) @@ -44,7 +44,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version-file: '.nvmrc' - name: Setup pnpm run: npm install -g pnpm @@ -138,13 +138,13 @@ jobs: - name: Download artifact (if use profdata) uses: actions/download-artifact@v4 - if: ${{ !inputs.generate-gpo }} + if: ${{ !inputs.generate-gpo && matrix.arch == 'x86_64' }} with: path: ~/artifact - name: windows-profdata-${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'arm64' }} + name: windows-profdata-${{ matrix.arch == 'aarch64' && 'arm64' || matrix.arch }} - name: Show artifact info - if: ${{ !inputs.generate-gpo }} + if: ${{ !inputs.generate-gpo && matrix.arch == 'x86_64' }} run: | ls ~/artifact ls ~/artifact/en-US.log @@ -153,6 +153,7 @@ jobs: chmod +x ~/artifact/merged.profdata - name: Build + if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }} env: SURFER_COMPAT: ${{ matrix.arch }} run: | @@ -166,6 +167,7 @@ jobs: sh .github/workflows/src/release-build.sh - name: Package + if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }} env: SURFER_COMPAT: ${{ matrix.arch }} run: | @@ -182,7 +184,7 @@ jobs: timeout-minutes: 15 - name: Move package for PGO upload - if: ${{ inputs.generate-gpo }} + if: ${{ inputs.generate-gpo && matrix.arch == 'x86_64' }} run: | set -x mv ./zen.win64.zip ./zen.win64-pgo-stage-1.zip @@ -190,15 +192,16 @@ jobs: - name: Rename artifacts if: ${{ !inputs.generate-gpo }} run: | - mv ./zen.win64.zip zen.win-${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'arm64' }}.zip - mv ./dist/output.mar windows${{ matrix.arch == 'x86_64' && '-generic' || matrix.arch == 'aarch64' && '-arm64' || '' }}.mar - mv ./dist/zen.installer.exe ./zen.installer${{ matrix.arch == 'x86_64' && '-generic' || matrix.arch == 'aarch64' && '-arm64' || '' }}.exe + mv ./zen.win64.zip zen.win-${{ matrix.arch == 'aarch64' && 'arm64' || matrix.arch }}.zip + mv ./dist/output.mar windows${{ matrix.arch == 'aarch64' && '-arm64' || '' }}.mar + mv ./dist/zen.installer.exe ./zen.installer${{ matrix.arch == 'aarch64' && '-arm64' || '' }}.exe - name: Upload artifact (PGO) uses: actions/upload-artifact@v4 - if: ${{ inputs.generate-gpo }} + if: ${{ inputs.generate-gpo && matrix.arch == 'x86_64' }} with: - name: ${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'arm64' }}-${{ inputs.profile-data-path-archive }} + retention-days: 5 + name: ${{ matrix.arch == 'aarch64' && 'arm64' || matrix.arch }}-${{ inputs.profile-data-path-archive }} path: ./zen.win64-pgo-stage-1.zip - name: Remove unnecessary files from obj @@ -217,33 +220,38 @@ jobs: if: ${{ !inputs.generate-gpo }} uses: actions/upload-artifact@v4 with: - name: windows-x64-obj-${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'arm64' }} + retention-days: 5 + name: windows-x64-obj-${{ matrix.arch == 'aarch64' && 'arm64' || matrix.arch }} path: engine/obj-${{ matrix.arch == 'aarch64' && 'aarch64' || 'x86_64' }}-pc-windows-msvc/ - name: Upload artifact (if Twilight branch, binary) if: ${{ inputs.release-branch == 'twilight' && !inputs.generate-gpo }} uses: actions/upload-artifact@v4 with: - name: zen.win-${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'arm64' }}.zip - path: ./zen.win-${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'arm64' }}.zip + retention-days: 5 + name: zen.win-${{ matrix.arch == 'aarch64' && 'arm64' || matrix.arch }}.zip + path: ./zen.win-${{ matrix.arch == 'aarch64' && 'arm64' || matrix.arch }}.zip - name: Upload artifact (if Twilight branch, installer) if: ${{ inputs.release-branch == 'twilight' && !inputs.generate-gpo }} uses: actions/upload-artifact@v4 with: - name: zen.installer${{ matrix.arch == 'x86_64' && '-generic' || matrix.arch == 'aarch64' && '-arm64' || '' }}.exe - path: ./zen.installer${{ matrix.arch == 'x86_64' && '-generic' || matrix.arch == 'aarch64' && '-arm64' || '' }}.exe + retention-days: 5 + name: zen.installer${{ matrix.arch == 'aarch64' && '-arm64' || '' }}.exe + path: ./zen.installer${{ matrix.arch == 'aarch64' && '-arm64' || '' }}.exe - name: Upload artifact (if Twilight branch, .mar) if: ${{ inputs.release-branch == 'twilight' && !inputs.generate-gpo }} uses: actions/upload-artifact@v4 with: - name: windows${{ matrix.arch == 'x86_64' && '-generic' || matrix.arch == 'aarch64' && '-arm64' || '' }}.mar - path: ./windows${{ matrix.arch == 'x86_64' && '-generic' || matrix.arch == 'aarch64' && '-arm64' || '' }}.mar + retention-days: 5 + name: windows${{ matrix.arch == 'aarch64' && '-arm64' || '' }}.mar + path: ./windows${{ matrix.arch == 'aarch64' && '-arm64' || '' }}.mar - name: Upload artifact (if Twilight branch, update manifests) if: ${{ inputs.release-branch == 'twilight' && !inputs.generate-gpo }} uses: actions/upload-artifact@v4 with: - name: windows_update_manifest_${{ matrix.arch == 'x86_64' && 'generic' || matrix.arch == 'x86_64-v3' && 'specific' || matrix.arch == 'aarch64' && 'arm64' }} + retention-days: 5 + name: windows_update_manifest_${{ matrix.arch == 'aarch64' && 'arm64' || matrix.arch }} path: ./dist/update diff --git a/AppDir/zen.desktop b/AppDir/zen.desktop index ca03a9237..4a79413a9 100644 --- a/AppDir/zen.desktop +++ b/AppDir/zen.desktop @@ -5,7 +5,7 @@ Exec=zen %u Icon=zen Type=Application MimeType=text/html;text/xml;application/xhtml+xml;x-scheme-handler/http;x-scheme-handler/https;application/x-xpinstall;application/pdf;application/json; -StartupWMClass=zen-alpha +StartupWMClass=zen-beta Categories=Network;WebBrowser; StartupNotify=true Terminal=false diff --git a/CODEOWNERS b/CODEOWNERS index a875bfe30..74d965bca 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1 @@ -* @mauro-balades \ No newline at end of file +* @mr-cheff diff --git a/README.md b/README.md index bd476964b..d081a3eb7 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ - + ### `Zen Browser` [](https://github.com/zen-browser/desktop/releases) [](https://crowdin.com/project/zen-browser) +[](https://github.com/zen-browser/desktop/actions/workflows/build.yml) ✨ Experience tranquillity while browsing the web without people tracking you! Zen is a privacy-focused browser that blocks trackers, ads, and other unwanted content while offering the best browsing experience! @@ -28,7 +29,7 @@ ## 🖥️ Compatibility -Zen is currently built using firefox version `133.0`! 🚀 +Zen is currently built using firefox version `133.0.3`! 🚀 - 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! @@ -37,6 +38,26 @@ Zen is currently built using firefox version `133.0`! 🚀 Zen is an open-source project, and we welcome contributions from the community! Please take a look at the [contribution guidelines](./docs/contribute.md) before getting started! +### 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? 📈 + +### Versioning + +Zen uses [Semantic Versioning](https://semver.org/) for versioning. Meaning, versions are displayed as `a.b.c-d.e` where: + +- `a` is the major version +- `b` is the minor version +- `c` is the patch version +- `d` is the branch prefix +- `e` is the build number + +### Branches + +Zen is divided into 2 main branches. We use `dev` for development and `stable` for stable releases. The `dev` branch is where all the new features are added and where `twilight` builds are generated. The `stable` branch is where the stable releases are generated. + +We divide into 2 branches in case there's any really important security update (for example) that needs to be released before the next stable release. This allows us to do patches without releasing unstable versions to the public. + ## ⚡ Performance Zen is built with performance in mind, and we have optimized the browser to be as fast as possible! Checkout the latest [performance benchmarks](https://docs.zen-browser.app/benchmarks)! @@ -54,11 +75,7 @@ If you dont see your OS listed below, that's because we already have it in our [ ##### Winget ```ps -# Generic version winget install --id Zen-Team.Zen-Browser - -# Optimized version -winget install --id Zen-Team.Zen-Browser.Optimized ``` #### macOS @@ -77,17 +94,13 @@ brew install --cask zen-browser ##### Arch-based distributions ```sh -# For generic version yay -S zen-browser-bin - -# For optimized version -yay -S zen-browser-avx2-bin ``` ##### Other Linux distributions (AppImage with automated system integration) - `native` tarball install: -```sudo bash <(curl -s https://updates.zen-browser.app/install.sh)``` +```bash <(curl -s https://updates.zen-browser.app/install.sh)``` - `zsync` is required for the Update feature of the script below diff --git a/build/winsign/sign.ps1 b/build/winsign/sign.ps1 index c322bc279..004a6cf03 100644 --- a/build/winsign/sign.ps1 +++ b/build/winsign/sign.ps1 @@ -21,17 +21,15 @@ mkdir windsign-temp -ErrorAction SilentlyContinue gh run download $GithubRunId --name windows-x64-obj-arm64 -D windsign-temp\windows-x64-obj-arm64 echo "Downloaded arm64 artifacts" -gh run download $GithubRunId --name windows-x64-obj-specific -D windsign-temp\windows-x64-obj-specific -echo "Downloaded specific artifacts" -gh run download $GithubRunId --name windows-x64-obj-generic -D windsign-temp\windows-x64-obj-generic -echo "Downloaded generic artifacts" +gh run download $GithubRunId --name windows-x64-obj-x86_64 -D windsign-temp\windows-x64-obj-x86_64 +echo "Downloaded x86_64 artifacts" #Wait-Job -Name "DownloadGitObjectsRepo" mkdir engine\obj-x86_64-pc-windows-msvc\ -ErrorAction SilentlyContinue -pnpm surfer ci --brand alpha +pnpm surfer ci --brand beta function SignAndPackage($name) { echo "Executing on $name" @@ -48,34 +46,30 @@ function SignAndPackage($name) { echo "Packaging $name" $env:SURFER_SIGNING_MODE="sign" $env:MAR="$PWD\\build\\winsign\\mar.exe" - if ($name -eq "generic") { - $env:SURFER_COMPAT="x86_64" + if ($name -eq "arm64") { + $env:SURFER_COMPAT="aarch64" } else { - if ($name -eq "arm64") { - $env:SURFER_COMPAT="aarch64" - } else { - $env:SURFER_COMPAT="x86_64-v3" - } + $env:SURFER_COMPAT="x86_64" } echo "Compat Mode? $env:SURFER_COMPAT" pnpm surfer package --verbose # In the release script, we do the following: - # tar -xvf .github/workflows/object/windows-x64-signed-generic.tar.gz -C windows-x64-signed-generic + # tar -xvf .github/workflows/object/windows-x64-signed-x86_64.tar.gz -C windows-x64-signed-x86_64 # We need to create a tar with the same structure and no top-level directory # Inside, we need: # - update_manifest/* - # - windows.mar or windows-generic.mar - # - zen.installer.exe or zen.installer-generic.exe - # - zen.win-generic.zip or zen.win-specific.zip + # - windows.mar + # - zen.installer.exe + # - zen.win-x86_64.zip echo "Creating tar for $name" rm .\windsign-temp\windows-x64-signed-$name -Recurse -ErrorAction SilentlyContinue mkdir windsign-temp\windows-x64-signed-$name - - # Move the MAR, add the `-generic` suffix if needed + + # Move the MAR, add the `-arm64` suffix if needed echo "Moving MAR for $name" - if ($name -eq "generic" -or $name -eq "arm64") { + if ($name -eq "arm64") { mv .\dist\output.mar windsign-temp\windows-x64-signed-$name\windows-$name.mar } else { mv .\dist\output.mar windsign-temp\windows-x64-signed-$name\windows.mar @@ -83,7 +77,7 @@ function SignAndPackage($name) { # Move the installer echo "Moving installer for $name" - if ($name -eq "generic" -or $name -eq "arm64") { + if ($name -eq "arm64") { mv .\dist\zen.installer.exe windsign-temp\windows-x64-signed-$name\zen.installer-$name.exe } else { mv .\dist\zen.installer.exe windsign-temp\windows-x64-signed-$name\zen.installer.exe @@ -118,8 +112,7 @@ function SignAndPackage($name) { } SignAndPackage arm64 -SignAndPackage specific -SignAndPackage generic +SignAndPackage x86_64 echo "All artifacts signed and packaged, ready for release!" echo "Commiting the changes to the repository" @@ -132,12 +125,11 @@ cd ..\.. # Cleaning up echo "All done!" -echo "All the artifacts (Generic and Specific) are signed and packaged, get a rest now!" +echo "All the artifacts (x86_64 and arm46) are signed and packaged, get a rest now!" Read-Host "Press Enter to continue" -echo "Cleaning up" -rmdir windsign-temp\windows-x64-obj-specific -Recurse -ErrorAction SilentlyContinue -rmdir windsign-temp\windows-x64-obj-generic -Recurse -ErrorAction SilentlyContinue +echo "Cleaning up" +rmdir windsign-temp\windows-x64-obj-x86_64 -Recurse -ErrorAction SilentlyContinue rmdir windsign-temp\windows-x64-obj-arm64 -Recurse -ErrorAction SilentlyContinue echo "Opening visual studio code" diff --git a/configs/branding/alpha/PrivateBrowsing_150.png b/configs/branding/alpha/PrivateBrowsing_150.png deleted file mode 100644 index 747428bed..000000000 Binary files a/configs/branding/alpha/PrivateBrowsing_150.png and /dev/null differ diff --git a/configs/branding/alpha/PrivateBrowsing_70.png b/configs/branding/alpha/PrivateBrowsing_70.png deleted file mode 100644 index 3ee63fbba..000000000 Binary files a/configs/branding/alpha/PrivateBrowsing_70.png and /dev/null differ diff --git a/configs/branding/alpha/VisualElements_150.png b/configs/branding/alpha/VisualElements_150.png deleted file mode 100644 index 85dc56dd4..000000000 Binary files a/configs/branding/alpha/VisualElements_150.png and /dev/null differ diff --git a/configs/branding/alpha/VisualElements_70.png b/configs/branding/alpha/VisualElements_70.png deleted file mode 100644 index e68cbe2e1..000000000 Binary files a/configs/branding/alpha/VisualElements_70.png and /dev/null differ diff --git a/configs/branding/alpha/content/about-logo-private.png b/configs/branding/alpha/content/about-logo-private.png deleted file mode 100644 index 39eec8c20..000000000 Binary files a/configs/branding/alpha/content/about-logo-private.png and /dev/null differ diff --git a/configs/branding/alpha/content/about-logo-private.svg b/configs/branding/alpha/content/about-logo-private.svg deleted file mode 100644 index 92c394e5d..000000000 --- a/configs/branding/alpha/content/about-logo-private.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/configs/branding/alpha/content/about-logo-private@2x.png b/configs/branding/alpha/content/about-logo-private@2x.png deleted file mode 100644 index 1c8bd0db6..000000000 Binary files a/configs/branding/alpha/content/about-logo-private@2x.png and /dev/null differ diff --git a/configs/branding/alpha/content/about-logo.png b/configs/branding/alpha/content/about-logo.png deleted file mode 100644 index de3092a61..000000000 Binary files a/configs/branding/alpha/content/about-logo.png and /dev/null differ diff --git a/configs/branding/alpha/content/about-logo.svg b/configs/branding/alpha/content/about-logo.svg deleted file mode 100644 index 6ad4ec9fa..000000000 --- a/configs/branding/alpha/content/about-logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/configs/branding/alpha/content/about-logo@2x.png b/configs/branding/alpha/content/about-logo@2x.png deleted file mode 100644 index 91c0adeea..000000000 Binary files a/configs/branding/alpha/content/about-logo@2x.png and /dev/null differ diff --git a/configs/branding/alpha/document.ico b/configs/branding/alpha/document.ico deleted file mode 100644 index 156f70f5d..000000000 Binary files a/configs/branding/alpha/document.ico and /dev/null differ diff --git a/configs/branding/alpha/firefox.ico b/configs/branding/alpha/firefox.ico deleted file mode 100644 index 055ed7426..000000000 Binary files a/configs/branding/alpha/firefox.ico and /dev/null differ diff --git a/configs/branding/alpha/firefox64.ico b/configs/branding/alpha/firefox64.ico deleted file mode 100644 index 711aec9c3..000000000 Binary files a/configs/branding/alpha/firefox64.ico and /dev/null differ diff --git a/configs/branding/alpha/logo-mac.png b/configs/branding/alpha/logo-mac.png deleted file mode 100644 index e82bb5f72..000000000 Binary files a/configs/branding/alpha/logo-mac.png and /dev/null differ diff --git a/configs/branding/alpha/logo.png b/configs/branding/alpha/logo.png deleted file mode 100644 index 6c170bbc4..000000000 Binary files a/configs/branding/alpha/logo.png and /dev/null differ diff --git a/configs/branding/alpha/logo128.png b/configs/branding/alpha/logo128.png deleted file mode 100644 index f9cdafaa7..000000000 Binary files a/configs/branding/alpha/logo128.png and /dev/null differ diff --git a/configs/branding/alpha/logo16.png b/configs/branding/alpha/logo16.png deleted file mode 100644 index 4fbe0483e..000000000 Binary files a/configs/branding/alpha/logo16.png and /dev/null differ diff --git a/configs/branding/alpha/logo22.png b/configs/branding/alpha/logo22.png deleted file mode 100644 index e3d6050ad..000000000 Binary files a/configs/branding/alpha/logo22.png and /dev/null differ diff --git a/configs/branding/alpha/logo24.png b/configs/branding/alpha/logo24.png deleted file mode 100644 index 17d25f8cf..000000000 Binary files a/configs/branding/alpha/logo24.png and /dev/null differ diff --git a/configs/branding/alpha/logo256.png b/configs/branding/alpha/logo256.png deleted file mode 100644 index 84996daaf..000000000 Binary files a/configs/branding/alpha/logo256.png and /dev/null differ diff --git a/configs/branding/alpha/logo32.png b/configs/branding/alpha/logo32.png deleted file mode 100644 index dd93d4840..000000000 Binary files a/configs/branding/alpha/logo32.png and /dev/null differ diff --git a/configs/branding/alpha/logo48.png b/configs/branding/alpha/logo48.png deleted file mode 100644 index 4b8c013a7..000000000 Binary files a/configs/branding/alpha/logo48.png and /dev/null differ diff --git a/configs/branding/alpha/logo512.png b/configs/branding/alpha/logo512.png deleted file mode 100644 index 6c170bbc4..000000000 Binary files a/configs/branding/alpha/logo512.png and /dev/null differ diff --git a/configs/branding/alpha/logo64.png b/configs/branding/alpha/logo64.png deleted file mode 100644 index 457c591f6..000000000 Binary files a/configs/branding/alpha/logo64.png and /dev/null differ diff --git a/configs/branding/alpha/pbmode.ico b/configs/branding/alpha/pbmode.ico deleted file mode 100644 index 73389e155..000000000 Binary files a/configs/branding/alpha/pbmode.ico and /dev/null differ diff --git a/configs/branding/alpha/MacOSInstaller.svg b/configs/branding/beta/MacOSInstaller.svg similarity index 100% rename from configs/branding/alpha/MacOSInstaller.svg rename to configs/branding/beta/MacOSInstaller.svg diff --git a/configs/branding/beta/PrivateBrowsing_150.png b/configs/branding/beta/PrivateBrowsing_150.png new file mode 100644 index 000000000..ce5b50fc6 Binary files /dev/null and b/configs/branding/beta/PrivateBrowsing_150.png differ diff --git a/configs/branding/beta/PrivateBrowsing_70.png b/configs/branding/beta/PrivateBrowsing_70.png new file mode 100644 index 000000000..5125950f9 Binary files /dev/null and b/configs/branding/beta/PrivateBrowsing_70.png differ diff --git a/configs/branding/beta/VisualElements_150.png b/configs/branding/beta/VisualElements_150.png new file mode 100644 index 000000000..3dc13c557 Binary files /dev/null and b/configs/branding/beta/VisualElements_150.png differ diff --git a/configs/branding/beta/VisualElements_70.png b/configs/branding/beta/VisualElements_70.png new file mode 100644 index 000000000..3dc13c557 Binary files /dev/null and b/configs/branding/beta/VisualElements_70.png differ diff --git a/configs/branding/beta/content/about-logo-private.png b/configs/branding/beta/content/about-logo-private.png new file mode 100644 index 000000000..59f8d1b45 Binary files /dev/null and b/configs/branding/beta/content/about-logo-private.png differ diff --git a/configs/branding/beta/content/about-logo-private.svg b/configs/branding/beta/content/about-logo-private.svg new file mode 100644 index 000000000..7cef51c6b --- /dev/null +++ b/configs/branding/beta/content/about-logo-private.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/configs/branding/beta/content/about-logo-private@2x.png b/configs/branding/beta/content/about-logo-private@2x.png new file mode 100644 index 000000000..689247228 Binary files /dev/null and b/configs/branding/beta/content/about-logo-private@2x.png differ diff --git a/configs/branding/beta/content/about-logo.png b/configs/branding/beta/content/about-logo.png new file mode 100644 index 000000000..e7527594f Binary files /dev/null and b/configs/branding/beta/content/about-logo.png differ diff --git a/configs/branding/beta/content/about-logo.svg b/configs/branding/beta/content/about-logo.svg new file mode 100644 index 000000000..01a5288e3 --- /dev/null +++ b/configs/branding/beta/content/about-logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/configs/branding/beta/content/about-logo@2x.png b/configs/branding/beta/content/about-logo@2x.png new file mode 100644 index 000000000..41087208d Binary files /dev/null and b/configs/branding/beta/content/about-logo@2x.png differ diff --git a/configs/branding/alpha/content/about-wordmark.svg b/configs/branding/beta/content/about-wordmark.svg similarity index 100% rename from configs/branding/alpha/content/about-wordmark.svg rename to configs/branding/beta/content/about-wordmark.svg diff --git a/configs/branding/alpha/content/firefox-wordmark.svg b/configs/branding/beta/content/firefox-wordmark.svg similarity index 100% rename from configs/branding/alpha/content/firefox-wordmark.svg rename to configs/branding/beta/content/firefox-wordmark.svg diff --git a/configs/branding/beta/document.ico b/configs/branding/beta/document.ico new file mode 100644 index 000000000..5bed474f8 Binary files /dev/null and b/configs/branding/beta/document.ico differ diff --git a/configs/branding/alpha/document_pdf.ico b/configs/branding/beta/document_pdf.ico similarity index 73% rename from configs/branding/alpha/document_pdf.ico rename to configs/branding/beta/document_pdf.ico index 7327f98dd..51fa85ffc 100644 Binary files a/configs/branding/alpha/document_pdf.ico and b/configs/branding/beta/document_pdf.ico differ diff --git a/configs/branding/beta/firefox.ico b/configs/branding/beta/firefox.ico new file mode 100644 index 000000000..b9d975396 Binary files /dev/null and b/configs/branding/beta/firefox.ico differ diff --git a/configs/branding/beta/firefox64.ico b/configs/branding/beta/firefox64.ico new file mode 100644 index 000000000..a40242b3e Binary files /dev/null and b/configs/branding/beta/firefox64.ico differ diff --git a/configs/branding/beta/logo-mac.png b/configs/branding/beta/logo-mac.png new file mode 100644 index 000000000..5b991b2b8 Binary files /dev/null and b/configs/branding/beta/logo-mac.png differ diff --git a/configs/branding/beta/logo.png b/configs/branding/beta/logo.png new file mode 100644 index 000000000..f17f5f272 Binary files /dev/null and b/configs/branding/beta/logo.png differ diff --git a/configs/branding/beta/logo1024.png b/configs/branding/beta/logo1024.png new file mode 100644 index 000000000..f17f5f272 Binary files /dev/null and b/configs/branding/beta/logo1024.png differ diff --git a/configs/branding/beta/logo128.png b/configs/branding/beta/logo128.png new file mode 100644 index 000000000..e7cf174e6 Binary files /dev/null and b/configs/branding/beta/logo128.png differ diff --git a/configs/branding/beta/logo16.png b/configs/branding/beta/logo16.png new file mode 100644 index 000000000..7b25bbfc0 Binary files /dev/null and b/configs/branding/beta/logo16.png differ diff --git a/configs/branding/beta/logo22.png b/configs/branding/beta/logo22.png new file mode 100644 index 000000000..5b1bd089b Binary files /dev/null and b/configs/branding/beta/logo22.png differ diff --git a/configs/branding/beta/logo24.png b/configs/branding/beta/logo24.png new file mode 100644 index 000000000..340cc56a3 Binary files /dev/null and b/configs/branding/beta/logo24.png differ diff --git a/configs/branding/beta/logo256.png b/configs/branding/beta/logo256.png new file mode 100644 index 000000000..edc1bd59d Binary files /dev/null and b/configs/branding/beta/logo256.png differ diff --git a/configs/branding/beta/logo32.png b/configs/branding/beta/logo32.png new file mode 100644 index 000000000..e893eed8d Binary files /dev/null and b/configs/branding/beta/logo32.png differ diff --git a/configs/branding/beta/logo48.png b/configs/branding/beta/logo48.png new file mode 100644 index 000000000..37b789901 Binary files /dev/null and b/configs/branding/beta/logo48.png differ diff --git a/configs/branding/beta/logo512.png b/configs/branding/beta/logo512.png new file mode 100644 index 000000000..2dffc8c13 Binary files /dev/null and b/configs/branding/beta/logo512.png differ diff --git a/configs/branding/beta/logo64.png b/configs/branding/beta/logo64.png new file mode 100644 index 000000000..3b224da98 Binary files /dev/null and b/configs/branding/beta/logo64.png differ diff --git a/configs/branding/beta/pbmode.ico b/configs/branding/beta/pbmode.ico new file mode 100644 index 000000000..2b890e456 Binary files /dev/null and b/configs/branding/beta/pbmode.ico differ diff --git a/configs/branding/twilight/PrivateBrowsing_150.png b/configs/branding/twilight/PrivateBrowsing_150.png index 747428bed..ce5b50fc6 100644 Binary files a/configs/branding/twilight/PrivateBrowsing_150.png and b/configs/branding/twilight/PrivateBrowsing_150.png differ diff --git a/configs/branding/twilight/PrivateBrowsing_70.png b/configs/branding/twilight/PrivateBrowsing_70.png index 3ee63fbba..5125950f9 100644 Binary files a/configs/branding/twilight/PrivateBrowsing_70.png and b/configs/branding/twilight/PrivateBrowsing_70.png differ diff --git a/configs/branding/twilight/VisualElements_150.png b/configs/branding/twilight/VisualElements_150.png index c8ba82a13..15f9f35b4 100644 Binary files a/configs/branding/twilight/VisualElements_150.png and b/configs/branding/twilight/VisualElements_150.png differ diff --git a/configs/branding/twilight/VisualElements_70.png b/configs/branding/twilight/VisualElements_70.png index ca693564f..30792e554 100644 Binary files a/configs/branding/twilight/VisualElements_70.png and b/configs/branding/twilight/VisualElements_70.png differ diff --git a/configs/branding/twilight/content/about-logo-private.png b/configs/branding/twilight/content/about-logo-private.png index 39eec8c20..59f8d1b45 100644 Binary files a/configs/branding/twilight/content/about-logo-private.png and b/configs/branding/twilight/content/about-logo-private.png differ diff --git a/configs/branding/twilight/content/about-logo-private.svg b/configs/branding/twilight/content/about-logo-private.svg index 92c394e5d..7cef51c6b 100644 --- a/configs/branding/twilight/content/about-logo-private.svg +++ b/configs/branding/twilight/content/about-logo-private.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/configs/branding/twilight/content/about-logo-private@2x.png b/configs/branding/twilight/content/about-logo-private@2x.png index 1c8bd0db6..689247228 100644 Binary files a/configs/branding/twilight/content/about-logo-private@2x.png and b/configs/branding/twilight/content/about-logo-private@2x.png differ diff --git a/configs/branding/twilight/content/about-logo.png b/configs/branding/twilight/content/about-logo.png index 36a51559b..e7527594f 100644 Binary files a/configs/branding/twilight/content/about-logo.png and b/configs/branding/twilight/content/about-logo.png differ diff --git a/configs/branding/twilight/content/about-logo.svg b/configs/branding/twilight/content/about-logo.svg index 1226b561c..01a5288e3 100644 --- a/configs/branding/twilight/content/about-logo.svg +++ b/configs/branding/twilight/content/about-logo.svg @@ -1 +1,12 @@ - \ No newline at end of file + + + + + + + + + + + + diff --git a/configs/branding/twilight/content/about-logo@2x.png b/configs/branding/twilight/content/about-logo@2x.png index 775bc736b..41087208d 100644 Binary files a/configs/branding/twilight/content/about-logo@2x.png and b/configs/branding/twilight/content/about-logo@2x.png differ diff --git a/configs/branding/twilight/document.ico b/configs/branding/twilight/document.ico index 156f70f5d..5bed474f8 100644 Binary files a/configs/branding/twilight/document.ico and b/configs/branding/twilight/document.ico differ diff --git a/configs/branding/twilight/document_pdf.ico b/configs/branding/twilight/document_pdf.ico index 7327f98dd..51fa85ffc 100644 Binary files a/configs/branding/twilight/document_pdf.ico and b/configs/branding/twilight/document_pdf.ico differ diff --git a/configs/branding/twilight/firefox.ico b/configs/branding/twilight/firefox.ico index f89a04525..01ab50e88 100644 Binary files a/configs/branding/twilight/firefox.ico and b/configs/branding/twilight/firefox.ico differ diff --git a/configs/branding/twilight/firefox64.ico b/configs/branding/twilight/firefox64.ico index 270748f5f..c308fe2d4 100644 Binary files a/configs/branding/twilight/firefox64.ico and b/configs/branding/twilight/firefox64.ico differ diff --git a/configs/branding/twilight/logo-mac.png b/configs/branding/twilight/logo-mac.png index df53a75c4..906709a8c 100644 Binary files a/configs/branding/twilight/logo-mac.png and b/configs/branding/twilight/logo-mac.png differ diff --git a/configs/branding/twilight/logo.png b/configs/branding/twilight/logo.png index df801d06f..06efd3666 100644 Binary files a/configs/branding/twilight/logo.png and b/configs/branding/twilight/logo.png differ diff --git a/configs/branding/twilight/logo1024.png b/configs/branding/twilight/logo1024.png new file mode 100644 index 000000000..06efd3666 Binary files /dev/null and b/configs/branding/twilight/logo1024.png differ diff --git a/configs/branding/twilight/logo128.png b/configs/branding/twilight/logo128.png index f0ee1daea..fcf2b5d10 100644 Binary files a/configs/branding/twilight/logo128.png and b/configs/branding/twilight/logo128.png differ diff --git a/configs/branding/twilight/logo16.png b/configs/branding/twilight/logo16.png index f4179cce0..0c6ae870a 100644 Binary files a/configs/branding/twilight/logo16.png and b/configs/branding/twilight/logo16.png differ diff --git a/configs/branding/twilight/logo22.png b/configs/branding/twilight/logo22.png index 675c0147c..f1225495e 100644 Binary files a/configs/branding/twilight/logo22.png and b/configs/branding/twilight/logo22.png differ diff --git a/configs/branding/twilight/logo24.png b/configs/branding/twilight/logo24.png index 95d2f4a94..ffada3336 100644 Binary files a/configs/branding/twilight/logo24.png and b/configs/branding/twilight/logo24.png differ diff --git a/configs/branding/twilight/logo256.png b/configs/branding/twilight/logo256.png index 85966450f..c3fec48a0 100644 Binary files a/configs/branding/twilight/logo256.png and b/configs/branding/twilight/logo256.png differ diff --git a/configs/branding/twilight/logo32.png b/configs/branding/twilight/logo32.png index a9922a581..76beb88b3 100644 Binary files a/configs/branding/twilight/logo32.png and b/configs/branding/twilight/logo32.png differ diff --git a/configs/branding/twilight/logo48.png b/configs/branding/twilight/logo48.png index 65f949b57..298b797e5 100644 Binary files a/configs/branding/twilight/logo48.png and b/configs/branding/twilight/logo48.png differ diff --git a/configs/branding/twilight/logo512.png b/configs/branding/twilight/logo512.png index df801d06f..63eba7429 100644 Binary files a/configs/branding/twilight/logo512.png and b/configs/branding/twilight/logo512.png differ diff --git a/configs/branding/twilight/logo64.png b/configs/branding/twilight/logo64.png index 22a35b205..5373b0619 100644 Binary files a/configs/branding/twilight/logo64.png and b/configs/branding/twilight/logo64.png differ diff --git a/configs/branding/twilight/pbmode.ico b/configs/branding/twilight/pbmode.ico index 73389e155..2b890e456 100644 Binary files a/configs/branding/twilight/pbmode.ico and b/configs/branding/twilight/pbmode.ico differ diff --git a/configs/common/mozconfig b/configs/common/mozconfig index 3343426ab..cbe57213b 100644 --- a/configs/common/mozconfig +++ b/configs/common/mozconfig @@ -24,22 +24,22 @@ export MOZ_SOURCE_CHANGESET=${changeset} export MOZ_INCLUDE_SOURCE_INFO=1 ac_add_options --enable-application=browser -#ac_add_options --enable-clang-plugin if test "$ZEN_RELEASE"; then + ac_add_options --enable-clang-plugin ac_add_options --enable-bootstrap - + ac_add_options --enable-release ac_add_options --disable-debug ac_add_options --disable-debug-symbols ac_add_options --disable-debug-js-modules ac_add_options --disable-tests - + ac_add_options --disable-vtune ac_add_options --enable-rust-simd ac_add_options --enable-wasm-simd - + mk_add_options MOZ_PARALLEL_COMPILE=1 ac_add_options --enable-proxy-bypass-protection diff --git a/configs/linux/mozconfig b/configs/linux/mozconfig index 4be21e2eb..90382e702 100644 --- a/configs/linux/mozconfig +++ b/configs/linux/mozconfig @@ -33,23 +33,6 @@ elif test "$SURFER_COMPAT" = "aarch64"; then export CXXFLAGS="$CXXFLAGS -O3" export LDFLAGS="$LDFLAGS -Wl,-O3" export RUSTFLAGS="$RUSTFLAGS -C codegen-units=1 -Clink-args=--icf=safe" -elif test "$ZEN_RELEASE"; then - ac_add_options --target=x86_64-pc-linux - ac_add_options --enable-eme=widevine - - # Enable Profile Guided Optimization - export MOZ_PGO=1 - ac_add_options MOZ_PGO=1 - - # Optimization flags for general release - ac_add_options --enable-wasm-avx - ac_add_options --enable-optimize="-O3 -march=x86-64-v3 -msse3 -mssse3 -msse4.1 -msse4.2 -mavx -maes -mpopcnt -mpclmul" - - export CFLAGS="$CFLAGS -O3 -ffp-contract=fast -march=x86-64-v3 -msse3 -mssse3 -msse4.1 -msse4.2 -mavx -mavx2 -mfma -maes -mpopcnt -mpclmul" - export CPPFLAGS="$CPPFLAGS -O3 -ffp-contract=fast -march=x86-64-v3 -msse3 -mssse3 -msse4.1 -msse4.2 -mavx -mavx2 -mfma -maes -mpopcnt -mpclmul" - export CXXFLAGS="$CXXFLAGS -O3 -flto=thin -ffp-contract=fast -march=x86-64-v3 -msse3 -mssse3 -msse4.1 -msse4.2 -mavx -mavx2 -mfma -maes -mpopcnt -mpclmul" - export LDFLAGS="$LDFLAGS -Wl,-O3 -Wl,-mllvm,-fp-contract=fast -march=x86-64-v3" - export RUSTFLAGS="$RUSTFLAGS -C target-cpu=x86-64-v3 -C target-feature=+sse4.1 -C target-feature=+avx2 -C codegen-units=1 -Clink-args=--icf=safe" fi export VERBOSE=1 diff --git a/configs/windows/mozconfig b/configs/windows/mozconfig index 4f50ed13e..117a3a1dc 100644 --- a/configs/windows/mozconfig +++ b/configs/windows/mozconfig @@ -25,7 +25,12 @@ fi ac_add_options --disable-maintenance-service ac_add_options --disable-bits-download +ac_add_options --disable-clang-plugin + if test "$SURFER_COMPAT" = "x86_64"; then + # FIXME: For some reason, the clang plugin is not working on generic x86_64 builds + ac_add_options --disable-clang-plugin + ac_add_options --target=x86_64-pc-windows-msvc ac_add_options --enable-eme=widevine @@ -47,18 +52,6 @@ elif test "$SURFER_COMPAT" = "aarch64"; then export CXXFLAGS="-O2 -march=armv8.2-a+simd -mtune=cortex-a55" export LDFLAGS="-Wl,-O2 -march=armv8.2-a+simd -mtune=cortex-a55" export RUSTFLAGS="-C target-feature=+v8.2a -C codegen-units=1 -Ctarget-cpu=cortex-a55" -else - ac_add_options --target=x86_64-pc-windows-msvc - ac_add_options --enable-eme=widevine - - ac_add_options --enable-optimize="-O2 -msse3 -mssse3 -msse4.1 -msse4.2 -mavx -mavx2 -mfma -maes -ftree-vectorize -Xclang -w" - ac_add_options --enable-wasm-avx - - export CFLAGS="-O2 -msse3 -mssse3 -msse4.1 -msse4.2 -mavx -mavx2 -mfma -maes -march=x86-64-v3" - export CPPFLAGS="-O2 -msse3 -mssse3 -msse4.1 -msse4.2 -mavx -mavx2 -mfma -maes -march=x86-64-v3" - export CXXFLAGS="-O2 -flto=thin -msse3 -mssse3 -msse4.1 -msse4.2 -mavx -mavx2 -mfma -maes -march=x86-64-v3" - export LDFLAGS="-Wl,-O3 -march=x86-64-v3" - export RUSTFLAGS="-Clink-args=--icf=safe -C target-feature=+avx2 -C codegen-units=1 -Ctarget-cpu=x86-64-v3" fi #export POLLY="-mllvm -polly -mllvm -polly-2nd-level-tiling -mllvm -polly-loopfusion-greedy -mllvm -polly-pattern-matching-based-opts -mllvm -polly-position=before-vectorizer -mllvm -polly-vectorizer=stripmine" @@ -69,10 +62,10 @@ if test "$ZEN_CROSS_COMPILING"; then export CXXFLAGS="$CXXFLAGS -fprofile-generate -mllvm -enable-name-compression=false -mllvm -pgo-temporal-instrumentation -fprofile-update=atomic" mk_add_options "export MOZ_AUTOMATION_PACKAGE_GENERATED_SOURCES=0" ac_add_options --enable-profile-generate=cross - else + elif test "$SURFER_COMPAT" = "x86_64"; then + # Dont use PGO on aarch64 builds ac_add_options --enable-profile-use=cross ac_add_options --with-pgo-profile-path=$(echo ~)/artifact/merged.profdata ac_add_options --with-pgo-jarlog=$(echo ~)/artifact/en-US.log fi - fi diff --git a/docs/assets/zen-dark.svg b/docs/assets/zen-dark.svg new file mode 100644 index 000000000..556c05729 --- /dev/null +++ b/docs/assets/zen-dark.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/zen-light.svg b/docs/assets/zen-light.svg new file mode 100644 index 000000000..0c489b99c --- /dev/null +++ b/docs/assets/zen-light.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/issue-metrics/2024_2024-11-01..2024-11-30.md b/docs/issue-metrics/2024_2024-11-01..2024-11-30.md new file mode 100644 index 000000000..16134ad7f --- /dev/null +++ b/docs/issue-metrics/2024_2024-11-01..2024-11-30.md @@ -0,0 +1,437 @@ +# Issue Metrics + +| Metric | Average | Median | 90th percentile | +| --- | --- | --- | ---: | +| Time to first response | 5 days, 12:21:32 | 12:10:22 | 21 days, 5:18:16 | +| Time to close | 12 days, 22:31:45 | 4 days, 4:45:32 | 38 days, 23:23:55 | + +| Metric | Count | +| --- | ---: | +| Number of items that remain open | 211 | +| Number of items closed | 208 | +| Total number of items created | 419 | + +| Title | URL | Time to first response | Time to close | +| --- | --- | --- | --- | +| Empty window on start-up | https://github.com/zen-browser/desktop/issues/3319 | 4:32:22 | None | +| Devtools don't open on expanded glance tabs | https://github.com/zen-browser/desktop/issues/3316 | 10 days, 8:42:46 | None | +| Inability to unload multiple tabs | https://github.com/zen-browser/desktop/issues/3314 | None | None | +| video playing windows go blank for split second | https://github.com/zen-browser/desktop/issues/3313 | None | None | +| Light mode makes some buttons look disabled | https://github.com/zen-browser/desktop/issues/3312 | 0:40:59 | 20 days, 19:57:32 | +| Tabs unloading with the feature disabled | https://github.com/zen-browser/desktop/issues/3311 | None | None | +| Default browser settings changes to firefox when i close the Zen | https://github.com/zen-browser/desktop/issues/3310 | None | None | +| zen.source.tar.gz is incorrectly named, should be .tar.zst instead | https://github.com/zen-browser/desktop/issues/3308 | None | None | +| Tab temporarely is compacted to the width of my sidebar before loading in when switching from a split-view | https://github.com/zen-browser/desktop/issues/3307 | None | None | +| Pre-assigned url to a container, and associate a container to a workspace, but that chain is broken | https://github.com/zen-browser/desktop/issues/3306 | None | 9 days, 21:18:59 | +| Hiding tab bar not working anymore and getting nulls next to the previous page button | https://github.com/zen-browser/desktop/issues/3305 | None | None | +| Tabs On Right Buggy when enabled in compact mode | https://github.com/zen-browser/desktop/issues/3304 | None | None | +| Accent colors nigh invisible in light mode | https://github.com/zen-browser/desktop/issues/3303 | None | None | +| PLEASE HELP: Zen Remotly unusable and Twilight lost gradient | https://github.com/zen-browser/desktop/issues/3302 | 5:03:09 | 16 days, 7:38:38 | +| workplace sites behind worplace VPN get Blocked | https://github.com/zen-browser/desktop/issues/3301 | None | None | +| Browser defaults to light mode even when the system prefers light mode | https://github.com/zen-browser/desktop/issues/3300 | 21 days, 3:19:32 | None | +| Memory Leaks in 1.0.1-a.22 making the broswer fill up all my RAM hanging my PC which only fixes by hard restart | https://github.com/zen-browser/desktop/issues/3299 | 3 days, 21:32:38 | None | +| Custom keyboard shortcuts lost | https://github.com/zen-browser/desktop/issues/3298 | None | None | +| Content of Office 365 Word becomes unfocused when zoomed in while in Split Mode | https://github.com/zen-browser/desktop/issues/3297 | None | None | +| Color bug on dark mode | https://github.com/zen-browser/desktop/issues/3296 | 11 days, 22:50:45 | None | +| Incorrect websites display after toggle letterboxing parameter | https://github.com/zen-browser/desktop/issues/3295 | 16 days, 6:36:16 | None | +| Tab completely loses interactivity (mouse & keyboard) and is only returned on page refresh | https://github.com/zen-browser/desktop/issues/3291 | None | None | +| Linux ARM64 builds missing from latest release | https://github.com/zen-browser/desktop/issues/3290 | 17:56:01 | None | +| Sidebar issue | https://github.com/zen-browser/desktop/issues/3288 | 2:52:05 | 22 days, 20:19:16 | +| Latest Linux builds 1.0.1-a.21+ doesn't respect Light mode. | https://github.com/zen-browser/desktop/issues/3285 | None | 0:51:58 | +| Search Autocomplete Overlapping with Page Content in Zen Browser | https://github.com/zen-browser/desktop/issues/3282 | None | None | +| Popup window not completely displaying in Zen, but fully displays in Fire Fox | https://github.com/zen-browser/desktop/issues/3281 | 2:52:03 | None | +| [Bug] On latest twilight(2024-11-28) colapsed sidebar makes icon overlap on the URL bar | https://github.com/zen-browser/desktop/issues/3280 | None | 4 days, 0:11:05 | +| system crash on arch linux + radeon vga | https://github.com/zen-browser/desktop/issues/3278 | None | None | +| cant type in any website that has a type here to search at the top | https://github.com/zen-browser/desktop/issues/3276 | None | None | +| I cant collapse my sidebar | https://github.com/zen-browser/desktop/issues/3275 | 0:08:42 | 2:43:33 | +| Release `1.0.1-a.22` running Firefox 132 | https://github.com/zen-browser/desktop/issues/3274 | 0:25:02 | None | +| release `1.0.1-a.22` for `mac intel`: download page return 404, due to wrong href in zen downloads page | https://github.com/zen-browser/desktop/issues/3272 | 12 days, 4:50:54 | None | +| Floating History broken after update ? | https://github.com/zen-browser/desktop/issues/3270 | None | 0:05:50 | +| Full screen bug | https://github.com/zen-browser/desktop/issues/3269 | 20 days, 15:03:49 | 23 days, 18:45:24 | +| Font Rendering on Google Sheets | https://github.com/zen-browser/desktop/issues/3268 | 12 days, 14:12:01 | 19 days, 0:20:28 | +| Compact mode is not compact | https://github.com/zen-browser/desktop/issues/3264 | 23 days, 9:54:59 | 23 days, 9:54:59 | +| Cannot move browser window with flexible spaces on left side of search bar | https://github.com/zen-browser/desktop/issues/3263 | None | 4 days, 17:29:57 | +| First page after running the app | https://github.com/zen-browser/desktop/issues/3262 | None | None | +| [Bug] Viewport renders over the URL menu? | https://github.com/zen-browser/desktop/issues/3261 | 0:59:55 | None | +| XDG Base Directory Specification Path in Linux | https://github.com/zen-browser/desktop/issues/3260 | 14 days, 15:59:29 | None | +| The window control buttons have moved to the right (macOS) | https://github.com/zen-browser/desktop/issues/3258 | None | None | +| New update broke Everything | https://github.com/zen-browser/desktop/issues/3257 | 0:18:25 | 4:39:41 | +| Please back collapsable side bar !!!!! | https://github.com/zen-browser/desktop/issues/3256 | 0:12:30 | 7:02:35 | +| the left side of the screen is blank | https://github.com/zen-browser/desktop/issues/3254 | None | None | +| Essential Tab Changing Workspaces when Opened | https://github.com/zen-browser/desktop/issues/3252 | None | None | +| Sidebar Problem | https://github.com/zen-browser/desktop/issues/3250 | 0:03:30 | 23 days, 12:56:20 | +| null on the left side of the window control on Mac | https://github.com/zen-browser/desktop/issues/3249 | 0:02:08 | None | +| Switched labels on settings | https://github.com/zen-browser/desktop/issues/3248 | 0:06:57 | 0:06:57 | +| Massive performance tank | https://github.com/zen-browser/desktop/issues/3246 | 1:29:20 | 1:29:20 | +| Cannot move windows by clicking on empty space | https://github.com/zen-browser/desktop/issues/3245 | 1:44:27 | 1:44:27 | +| Appearance on macOS Looks Strange | https://github.com/zen-browser/desktop/issues/3244 | 0:28:34 | 23 days, 15:40:51 | +| Search bar being cutoff | https://github.com/zen-browser/desktop/issues/3243 | 1:03:06 | None | +| Google Docs letters gibberish | https://github.com/zen-browser/desktop/issues/3241 | 4:10:57 | 23 days, 14:35:43 | +| URL bar still appears in Compact Mode after all elements have been hidden | https://github.com/zen-browser/desktop/issues/3240 | 0:34:25 | 8 days, 8:10:56 | +| Clearkey plugin crashed!! | https://github.com/zen-browser/desktop/issues/3239 | None | None | +| PDF viewer renders text incorrectly | https://github.com/zen-browser/desktop/issues/3238 | 12 days, 12:34:48 | 19 days, 11:38:32 | +| what is "null"? | https://github.com/zen-browser/desktop/issues/3237 | 2:13:43 | 6:20:47 | +| Sidebar width is removed | https://github.com/zen-browser/desktop/issues/3236 | 2:41:50 | 23 days, 19:38:09 | +| Audio problem in videos and music after update | https://github.com/zen-browser/desktop/issues/3235 | None | 0:47:20 | +| There are multiple virtual desktops, and some bugs may occur when creating windows. | https://github.com/zen-browser/desktop/issues/3234 | None | None | +| Sync and save data - Sign In NOT WORKING - Bad Request | https://github.com/zen-browser/desktop/issues/3233 | 12 days, 8:18:24 | None | +| Feedback on UI Glitches and Text Display Issues | https://github.com/zen-browser/desktop/issues/3232 | None | None | +| Clicking on pinned tab does not let sidebar collapse until defocus | https://github.com/zen-browser/desktop/issues/3231 | None | 8 days, 11:49:33 | +| Overflow indicators in the tab bar have become aggressive | https://github.com/zen-browser/desktop/issues/3230 | None | None | +| URL bar always visible bug | https://github.com/zen-browser/desktop/issues/3229 | None | 8 days, 12:36:45 | +| Sidebar buttons are bugged | https://github.com/zen-browser/desktop/issues/3227 | 0:07:17 | None | +| Major performance impact due to rounded corners implementation (laggy scrolling) | https://github.com/zen-browser/desktop/issues/3221 | 8:49:14 | None | +| Container name mis-aligned in the address bar | https://github.com/zen-browser/desktop/issues/3219 | None | 13 days, 0:06:59 | +| 'null' showing up on the top address bar | https://github.com/zen-browser/desktop/issues/3218 | 8:55:52 | 13 days, 0:08:59 | +| recent update (i suppose) deleted some data | https://github.com/zen-browser/desktop/issues/3216 | None | None | +| When 'Take Screenshot' dialog is open 'Save Full Page' option is out of screen | https://github.com/zen-browser/desktop/issues/3214 | 5:12:23 | None | +| Bug #2479 (unable to open tabs after sleep) reoccurred on latest version (a19/22) | https://github.com/zen-browser/desktop/issues/3210 | None | None | +| Potential Memory leak in Zen Browser | https://github.com/zen-browser/desktop/issues/3209 | 24 days, 2:58:56 | None | +| Sidebar Music Playback Resets Upon Reopening Sidebar After Recent Update | https://github.com/zen-browser/desktop/issues/3208 | None | None | +| [Twilight] Top Margin Missing in Browser | https://github.com/zen-browser/desktop/issues/3207 | 7:08:57 | 7 days, 11:49:39 | +| Twitch error 4000 and unable to play certain Youtube videos | https://github.com/zen-browser/desktop/issues/3205 | 5 days, 1:17:17 | None | +| Zen missing "Refresh Firefox" equivalent option in about:support | https://github.com/zen-browser/desktop/issues/3203 | None | None | +| New tab from new windows or forced new tabs do not match the selected extension new tab. | https://github.com/zen-browser/desktop/issues/3201 | None | None | +| [Twilight] Pinned Extensions are missing in the single the new zen.view.use-single-toolbar | https://github.com/zen-browser/desktop/issues/3200 | 6 days, 15:05:03 | None | +| Open Zen on Start Up Pop-Up Misaligned | https://github.com/zen-browser/desktop/issues/3199 | None | None | +| Zen Setting lost on update - expand tabs | https://github.com/zen-browser/desktop/issues/3198 | 2 days, 12:53:11 | 26 days, 9:26:10 | +| mute button is ugly | https://github.com/zen-browser/desktop/issues/3197 | 0:07:40 | None | +| Print tab rendered incorrectly. | https://github.com/zen-browser/desktop/issues/3195 | None | None | +| No Pre-release for macOS Intel Chips (Twlight) | https://github.com/zen-browser/desktop/issues/3192 | None | 6 days, 23:21:56 | +| Extension tab asks if I want to close all tabs on close | https://github.com/zen-browser/desktop/issues/3189 | None | None | +| Recent activity disappears | https://github.com/zen-browser/desktop/issues/3187 | None | None | +| split second black screen while playing youtube video | https://github.com/zen-browser/desktop/issues/3185 | None | 2 days, 14:59:14 | +| Can't see full photo on X (Twitter) | https://github.com/zen-browser/desktop/issues/3184 | 1 day, 20:30:29 | None | +| No more movement on the screen | https://github.com/zen-browser/desktop/issues/3181 | None | None | +| Pinned unloaded tabs showing only on hover when tabs aren't expanded in sidebar | https://github.com/zen-browser/desktop/issues/3180 | None | 27 days, 4:07:47 | +| Search Item Causes Overflow In Compact Toolbar | https://github.com/zen-browser/desktop/issues/3178 | None | None | +| Google Meet Zoom and Whatsapp Bugs | https://github.com/zen-browser/desktop/issues/3175 | None | None | +| "Change Theme Colors" menu is cut off | https://github.com/zen-browser/desktop/issues/3174 | 2 days, 14:56:50 | None | +| Scrolling tabs with mouse wheel on Compact mode | https://github.com/zen-browser/desktop/issues/3172 | 18 days, 12:44:08 | 27 days, 21:37:29 | +| Unable to see the list of open tabs with max pinned tabs in small window sizes | https://github.com/zen-browser/desktop/issues/3171 | 2:36:00 | None | +| Closing window with multiple instances of the browser doesn't close on macOS | https://github.com/zen-browser/desktop/issues/3165 | 27 days, 19:16:24 | None | +| While watching a video on YouTube, a pink thing suddenly appears and disappears. | https://github.com/zen-browser/desktop/issues/3164 | 2 days, 20:44:54 | None | +| App crashes when logging in to google from youtube | https://github.com/zen-browser/desktop/issues/3163 | 19 days, 3:49:34 | None | +| Hand Gesture Swipe on Sidebar Switches Multiple Spaces Instead of One | https://github.com/zen-browser/desktop/issues/3162 | 3 days, 17:50:35 | 3 days, 17:50:35 | +| Unresponsive for couple of seconds | https://github.com/zen-browser/desktop/issues/3161 | 3 days, 15:33:30 | None | +| Disabling Workspaces from Settings causes a gap to occur above tabs | https://github.com/zen-browser/desktop/issues/3160 | 1 day, 13:27:49 | None | +| weird color bug after logging in with mozilla account | https://github.com/zen-browser/desktop/issues/3159 | None | None | +| Compact mode hides sidebar on all windows instead of just the current one | https://github.com/zen-browser/desktop/issues/3156 | None | None | +| Browser window doesn't close after completing a pop up | https://github.com/zen-browser/desktop/issues/3155 | 7:22:57 | None | +| Workspace scrolling not working properly | https://github.com/zen-browser/desktop/issues/3153 | None | None | +| Answering a Google Fi call crashes the tab | https://github.com/zen-browser/desktop/issues/3151 | 30 days, 4:30:34 | None | +| Unable to use roughly 1/2 of the screen in Zen Twilight | https://github.com/zen-browser/desktop/issues/3148 | None | 8 days, 2:23:54 | +| Side Panels Theme Color Bleeding into Web Pages Without Specified Background Color (Transparent) in it's CSS. | https://github.com/zen-browser/desktop/issues/3147 | 2 days, 1:17:05 | 3 days, 23:05:43 | +| Expand Sidebar Missing On Zen Twilight | https://github.com/zen-browser/desktop/issues/3146 | None | 1 day, 5:14:44 | +| Refine auto-open Picture-in-Picture (PiP) Behavior to Exclude Background Video Elements | https://github.com/zen-browser/desktop/issues/3145 | None | None | +| Browser freezes after changing some keyboard shortcuts | https://github.com/zen-browser/desktop/issues/3142 | None | 1 day, 6:12:57 | +| expand on hover: Tab bar (sometimes) stays expanded on top of the rest without contracting again | https://github.com/zen-browser/desktop/issues/3141 | 30 days, 13:42:55 | None | +| Crashes everytime during google login | https://github.com/zen-browser/desktop/issues/3140 | None | None | +| Sync suggests getting the Zen mobile app | https://github.com/zen-browser/desktop/issues/3137 | None | None | +| Periodic flashing | https://github.com/zen-browser/desktop/issues/3136 | None | None | +| Extreme zoom | https://github.com/zen-browser/desktop/issues/3134 | None | None | +| Items with `backdrop-filter` overflow roundings | https://github.com/zen-browser/desktop/issues/3133 | 26 days, 5:16:12 | None | +| Tab crashing when loading a wav file from NotebookLM | https://github.com/zen-browser/desktop/issues/3129 | None | 11 days, 20:53:22 | +| Workspace menu moved to left | https://github.com/zen-browser/desktop/issues/3128 | None | None | +| Essential tabs reverting to about:blank | https://github.com/zen-browser/desktop/issues/3125 | None | 10:32:00 | +| Settings: Broken "Unsaved shortcut! Please safe it by clicking the "Escape" key after retyping it." warning | https://github.com/zen-browser/desktop/issues/3124 | 8 days, 23:32:39 | None | +| Does not open web pages of applications running on the web. | https://github.com/zen-browser/desktop/issues/3123 | None | 21 days, 14:42:28 | +| Initial window url not replaced | https://github.com/zen-browser/desktop/issues/3122 | None | None | +| Open in a new tab shortcut | https://github.com/zen-browser/desktop/issues/3119 | 9:08:40 | None | +| Pop-up windows add pinned tabs | https://github.com/zen-browser/desktop/issues/3116 | 13 days, 10:56:51 | None | +| Cookie notices appear briefly, despite uBo rule | https://github.com/zen-browser/desktop/issues/3114 | 30 days, 19:55:38 | None | +| if a tab is pinned then moved to essentials on startup its data is lost | https://github.com/zen-browser/desktop/issues/3112 | 1 day, 21:55:13 | None | +| About gfx.webrender.all | https://github.com/zen-browser/desktop/issues/3110 | 2:31:25 | 1 day, 0:05:30 | +| Problem with star-history in README.md | https://github.com/zen-browser/desktop/issues/3107 | 1 day, 12:28:26 | None | +| Login modal's callback directs to a random opened tab | https://github.com/zen-browser/desktop/issues/3106 | 20 days, 3:16:00 | None | +| Some tabs randomly stop working entirely | https://github.com/zen-browser/desktop/issues/3102 | 9:36:03 | None | +| Firefox Multi-Account Containers Extension not working in mac | https://github.com/zen-browser/desktop/issues/3101 | None | None | +| Appimaged Fails to Register Zen | https://github.com/zen-browser/desktop/issues/3100 | 1 day, 17:34:50 | None | +| Split tabs not saved correctly | https://github.com/zen-browser/desktop/issues/3098 | 31 days, 18:30:47 | 31 days, 18:30:47 | +| shield icon not aligned properly | https://github.com/zen-browser/desktop/issues/3097 | 21 days, 9:55:19 | None | +| When opening new window from taskbar tasks, the URL bar is visually focused but does not work | https://github.com/zen-browser/desktop/issues/3096 | None | None | +| when in compact mode, sidebar open when ever tab change or new tab | https://github.com/zen-browser/desktop/issues/3092 | None | 0:11:15 | +| Essential Tabs and session are not restored when exited (macOS) | https://github.com/zen-browser/desktop/issues/3090 | 33 days, 14:32:38 | None | +| All bookmark pages are open when startup | https://github.com/zen-browser/desktop/issues/3089 | None | 8 days, 8:54:11 | +| Pages have a transparent background instead of white | https://github.com/zen-browser/desktop/issues/3087 | 10:59:23 | 0:05:31 | +| 1.0.1-a19 Seems to Prevent Laptop from Going to Sleep (Intel MBP, Sequoia 15.1 and 15.2beta) | https://github.com/zen-browser/desktop/issues/3086 | None | 12:21:38 | +| Zen not showing in gnome on arch | https://github.com/zen-browser/desktop/issues/3085 | 1 day, 10:36:06 | None | +| Websites that dont specify `body` colour become unreadable due to default background colour | https://github.com/zen-browser/desktop/issues/3084 | None | 0:53:08 | +| Disabled right click menu on changing tab workspace | https://github.com/zen-browser/desktop/issues/3083 | 1:07:26 | 33 days, 15:08:53 | +| Can't Login to Pocket | https://github.com/zen-browser/desktop/issues/3081 | 9 days, 6:48:30 | None | +| Cannot bind shortcut to ctrl+1 | https://github.com/zen-browser/desktop/issues/3080 | 34 days, 6:46:30 | None | +| Zen crashes when trying to upload file to a website | https://github.com/zen-browser/desktop/issues/3079 | None | None | +| Keyboard shortcut Order | https://github.com/zen-browser/desktop/issues/3078 | None | None | +| SSL Certificate and Local Host | https://github.com/zen-browser/desktop/issues/3077 | None | None | +| Sidebar hover expansion interferes with notification | https://github.com/zen-browser/desktop/issues/3075 | None | None | +| Certificate issue on Discord's website when using Zen Browser | https://github.com/zen-browser/desktop/issues/3074 | None | 0:05:03 | +| Bookmark icon on the address bar become not clickable when keyboard shortcut Bookmark This Page deleted | https://github.com/zen-browser/desktop/issues/3073 | None | None | +| Zen Mods doesen't work | https://github.com/zen-browser/desktop/issues/3071 | None | None | +| Workspacetabs closing when opening another window from other workspace | https://github.com/zen-browser/desktop/issues/3070 | None | None | +| right click -open a new window cost lots time | https://github.com/zen-browser/desktop/issues/3069 | None | None | +| When logging in with google to reddit in the small opened window one of my pinned tabs opens | https://github.com/zen-browser/desktop/issues/3065 | None | 14 days, 3:56:19 | +| Switching between workspaces causes the focussed tab to be changed | https://github.com/zen-browser/desktop/issues/3063 | 3 days, 1:06:30 | None | +| Workspace selector icon is faded as if it's unloaded when sidebar is collapsed | https://github.com/zen-browser/desktop/issues/3062 | None | None | +| side panel padding is wack | https://github.com/zen-browser/desktop/issues/3061 | 1 day, 16:10:23 | 1 day, 16:10:23 | +| Unexpected New Window Behaviour With Tabliss/Bonjourr | https://github.com/zen-browser/desktop/issues/3060 | None | None | +| (MacOS) In compact mode, i can barely open zed's top bar | https://github.com/zen-browser/desktop/issues/3058 | None | 0:07:49 | +| Essential Tabs & Pinned workspace tabs behave fishy in multi-window scenarios | https://github.com/zen-browser/desktop/issues/3057 | 19:49:11 | None | +| "Pop up tabs" seem to open random tabs when they are no longer needed. | https://github.com/zen-browser/desktop/issues/3055 | 3:33:13 | 2 days, 1:29:43 | +| Tabs crashing in Twilight due to extensions such as Bitwarden. | https://github.com/zen-browser/desktop/issues/3054 | 1:07:25 | 9 days, 0:24:11 | +| Rounded viewport corners are not rounded on some websites | https://github.com/zen-browser/desktop/issues/3053 | 17 days, 19:58:04 | 34 days, 15:06:53 | +| unpinned sidebar's postion resets after every startup | https://github.com/zen-browser/desktop/issues/3052 | None | None | +| sometimes i get workspace switch animation while opening/closing tab | https://github.com/zen-browser/desktop/issues/3051 | 0:33:22 | None | +| [TWILIGHT] Bookmark Bar Forcing Tabs Max Size | https://github.com/zen-browser/desktop/issues/3050 | None | 29 days, 22:25:20 | +| Spell Checker Not Working for Languages Other Than English in Zen Browser | https://github.com/zen-browser/desktop/issues/3049 | 17:10:52 | 1 day, 20:34:08 | +| window background totally messed up aafter setting theme color [ websites which doesn't specify a background color and uses default css i guess ] | https://github.com/zen-browser/desktop/issues/3047 | 2:18:48 | 3:08:35 | +| Switching tabs to a different workspace is causing the sidebar to freeze | https://github.com/zen-browser/desktop/issues/3046 | 7 days, 23:34:11 | None | +| Unable to enable desktop notifications on side panel | https://github.com/zen-browser/desktop/issues/3045 | None | None | +| Missing Downloads Button and No Download Popup Notification | https://github.com/zen-browser/desktop/issues/3044 | 8:14:40 | 1 day, 22:07:00 | +| Cannot acquire geolocation | https://github.com/zen-browser/desktop/issues/3043 | None | None | +| the hover menu has inconsistent behavior with drop down menu | https://github.com/zen-browser/desktop/issues/3041 | None | None | +| Sidebar (for tabs) with different sizes for elements whille expanding | https://github.com/zen-browser/desktop/issues/3040 | 5 days, 15:38:10 | None | +| All Zen Mods disappeared | https://github.com/zen-browser/desktop/issues/3038 | None | 0:19:27 | +| Enabled new tab settings controls are invisible until you mouse over them | https://github.com/zen-browser/desktop/issues/3037 | 1 day, 5:50:58 | None | +| Full browser overflows | https://github.com/zen-browser/desktop/issues/3036 | 22 days, 11:05:26 | 33 days, 6:20:24 | +| Shortcuts interfere with website-specific shortcuts | https://github.com/zen-browser/desktop/issues/3031 | 1:00:45 | None | +| Tab Action keyboard shortcuts missing | https://github.com/zen-browser/desktop/issues/3030 | 10:57:58 | 22 days, 10:45:57 | +| There is an overlap with the bookmarks sidebar and the web content | https://github.com/zen-browser/desktop/issues/3029 | None | None | +| YouTube player stops loading videos after 59s | https://github.com/zen-browser/desktop/issues/3026 | 23 days, 17:33:10 | None | +| Transparent top bar and side panel only in prviate window | https://github.com/zen-browser/desktop/issues/3025 | None | None | +| Strange behaviour of Switch to tab when using pinned tabs and workspaces | https://github.com/zen-browser/desktop/issues/3024 | 10 days, 22:59:34 | None | +| ZEN deleted all my data | https://github.com/zen-browser/desktop/issues/3022 | 13:07:40 | None | +| Pop-up window missing close button | https://github.com/zen-browser/desktop/issues/3018 | 0:56:22 | None | +| Bookmark Toolbar Tweaks: title bar behaves abnormally in full screen mode with "Expand the bookmarks toolbar by hovering" enable | https://github.com/zen-browser/desktop/issues/3017 | None | 31 days, 2:14:55 | +| Glance window isn't focused | https://github.com/zen-browser/desktop/issues/3016 | None | None | +| Youtube video no audio | https://github.com/zen-browser/desktop/issues/3015 | None | None | +| Essentials tabs not working in new windows | https://github.com/zen-browser/desktop/issues/3012 | 7 days, 6:30:43 | None | +| Spotify web player skips songs. | https://github.com/zen-browser/desktop/issues/3011 | 22:49:15 | 37 days, 2:44:01 | +| [Twilight] Spamming Reload button on pinned tabs blanks it out. | https://github.com/zen-browser/desktop/issues/3009 | 2 days, 4:21:56 | 2 days, 7:19:21 | +| Cannot close or move pop-up login windows | https://github.com/zen-browser/desktop/issues/3008 | 3:27:47 | None | +| Metamask extension does not open | https://github.com/zen-browser/desktop/issues/3007 | None | 4 days, 21:58:00 | +| [Accessibility] Hard to tell when window is focused | https://github.com/zen-browser/desktop/issues/3004 | None | None | +| Weird Pinned Tabs Behaviour | https://github.com/zen-browser/desktop/issues/3003 | 8:54:42 | 5 days, 0:05:06 | +| When using compact mode for the sidebar, sometimes there is a blank space left behind instead of the sidebar. | https://github.com/zen-browser/desktop/issues/3002 | 4:39:41 | None | +| Gap between url bar and tabs when workspaces are disabled | https://github.com/zen-browser/desktop/issues/3001 | None | 0:02:07 | +| 'Secure connection failed' error with Instagram, Threads and Facebook | https://github.com/zen-browser/desktop/issues/2998 | None | None | +| Resetting URL on Pinned Tabs Clears Favicon | https://github.com/zen-browser/desktop/issues/2997 | 1 day, 14:37:17 | 1 day, 14:37:17 | +| Behaviour for Clicking "X" on Pinned Tab not Respecting Setting | https://github.com/zen-browser/desktop/issues/2994 | 1 day, 18:06:54 | 1 day, 18:06:54 | +| Swaping Spaces via swiping is buggy | https://github.com/zen-browser/desktop/issues/2992 | 1 day, 14:30:28 | None | +| Cant drag tabs to different workspaces | https://github.com/zen-browser/desktop/issues/2990 | 1 day, 23:32:22 | None | +| Pinned tabs completely confused. | https://github.com/zen-browser/desktop/issues/2989 | 0:03:14 | None | +| Essentials get restored as pinned tabs when restored | https://github.com/zen-browser/desktop/issues/2988 | None | 31 days, 7:01:17 | +| Zen hangs on startup | https://github.com/zen-browser/desktop/issues/2986 | 5 days, 10:01:11 | None | +| Major: Popup windows don't close and instead open pinned/essential tab | https://github.com/zen-browser/desktop/issues/2985 | 2:37:38 | 21 days, 1:07:50 | +| moving a tab to the workspace completely breaks the sidebar | https://github.com/zen-browser/desktop/issues/2980 | 4:56:38 | None | +| only the white space on the right allows to drag the window | https://github.com/zen-browser/desktop/issues/2977 | None | 32 days, 3:31:10 | +| Essentials not keeping favicon after restarting | https://github.com/zen-browser/desktop/issues/2976 | 2:56:11 | 2:56:11 | +| Can't open different tab while some tabs are in split view | https://github.com/zen-browser/desktop/issues/2973 | None | 17 days, 12:27:02 | +| Some hotkeys conflict so not working properly after open zen-browser for some time | https://github.com/zen-browser/desktop/issues/2972 | 3 days, 10:02:03 | 3 days, 10:02:02 | +| "Add to Essential" is not translated into turkish. | https://github.com/zen-browser/desktop/issues/2967 | 2 days, 12:24:51 | 2 days, 12:24:51 | +| Tab text misaligned | https://github.com/zen-browser/desktop/issues/2965 | None | 29 days, 2:15:41 | +| synced Multi-Account Containers will log you out on another device | https://github.com/zen-browser/desktop/issues/2964 | 12 days, 10:07:01 | None | +| When sending a tab to a diferent workspace it losses right clickability | https://github.com/zen-browser/desktop/issues/2963 | 1 day, 23:59:18 | 39 days, 5:44:41 | +| When I use multiple windows, the pinned tabs don't work in the container they are supposed to work in and the pinned tabs don't synchronize with the other windows. | https://github.com/zen-browser/desktop/issues/2959 | None | None | +| Black line at top of browser | https://github.com/zen-browser/desktop/issues/2956 | 10:16:39 | None | +| Tab Duplication Across Workspaces | https://github.com/zen-browser/desktop/issues/2953 | 1 day, 5:48:50 | 32 days, 4:22:23 | +| Switching Workspaces Creates New Tab Instead of Using Pinned Tab | https://github.com/zen-browser/desktop/issues/2951 | 7 days, 21:10:09 | None | +| Tab switches to the last tab when workspaces are changed | https://github.com/zen-browser/desktop/issues/2950 | 2:25:11 | 32 days, 6:22:29 | +| Pinning a tab upon browser startup closes the previously pinned tabs | https://github.com/zen-browser/desktop/issues/2949 | 0:03:01 | None | +| Zen gradient color is messing with some website's background color | https://github.com/zen-browser/desktop/issues/2948 | 0:20:01 | 0:58:04 | +| Cannot select essential tabs | https://github.com/zen-browser/desktop/issues/2943 | None | None | +| Grain texture isn't clipped at window corners | https://github.com/zen-browser/desktop/issues/2942 | 0:20:01 | None | +| Workspace emoji in list too small, cant read | https://github.com/zen-browser/desktop/issues/2938 | 1:56:40 | None | +| "Close Window" Shortcut is being ignored | https://github.com/zen-browser/desktop/issues/2936 | 11 days, 4:34:05 | None | +| Videos not respecting default Autoplay settings | https://github.com/zen-browser/desktop/issues/2935 | None | None | +| Expanding/collapsing tabs causes overflow/resize issues | https://github.com/zen-browser/desktop/issues/2931 | 4 days, 16:36:08 | None | +| DRM option in settings | https://github.com/zen-browser/desktop/issues/2929 | 4:34:15 | None | +| Search Engine choice at startup does not affect incognito mode | https://github.com/zen-browser/desktop/issues/2925 | 2:19:28 | None | +| Youtube playback dropping frames | https://github.com/zen-browser/desktop/issues/2914 | None | 0:52:34 | +| [FEATURE REQUEST] With the feature of assigning workspaces to a website and assigning containers to a website, when we want to open the website URL, the website will open in the workspaces we assign and in the container we assign. | https://github.com/zen-browser/desktop/issues/2913 | 0:18:13 | 1 day, 0:23:30 | +| [FEATURE REQUEST] I want to be able to assign containers when creating new workspaces. Is this possible? | https://github.com/zen-browser/desktop/issues/2912 | 0:26:49 | 1:03:33 | +| Pinned Tabs with only grid layout icons go away :c in the latest version | https://github.com/zen-browser/desktop/issues/2910 | 5:03:25 | None | +| Pinned tabs moving with you when changing workspaces | https://github.com/zen-browser/desktop/issues/2909 | 1:18:43 | None | +| When you expand the sidebar, the toolbar also moves to the right. | https://github.com/zen-browser/desktop/issues/2907 | 40 days, 8:25:52 | 40 days, 8:25:52 | +| Some symbols not working properly on Word files | https://github.com/zen-browser/desktop/issues/2906 | 1:49:38 | 1:49:38 | +| List all Tabs slow to render | https://github.com/zen-browser/desktop/issues/2905 | 2:06:49 | 2:06:49 | +| Pinned tabs showing as a list instead of a grid of icons | https://github.com/zen-browser/desktop/issues/2902 | 0:23:18 | 5 days, 15:24:26 | +| The security warning of Firefox is interpreted as a hover on the tab bar by the browser on Ubuntu | https://github.com/zen-browser/desktop/issues/2900 | None | None | +| Minor sidebar annoyance | https://github.com/zen-browser/desktop/issues/2898 | 1:31:41 | None | +| The "new tab button" (the one in the bottom) is in a different position depending on the type of window (normal and private) | https://github.com/zen-browser/desktop/issues/2897 | None | None | +| Weird gap between home button and tabs | https://github.com/zen-browser/desktop/issues/2895 | 3:27:15 | 21:10:39 | +| No Themeing Option When Workspaces is Disabled | https://github.com/zen-browser/desktop/issues/2894 | 18 days, 3:20:51 | None | +| Issue with Playing Crunchyroll Videos | https://github.com/zen-browser/desktop/issues/2892 | 2:47:27 | None | +| License issues with Arc_Palette | https://github.com/zen-browser/desktop/issues/2890 | 38 days, 6:28:36 | 38 days, 6:28:36 | +| Ability to disable max height for pinned tabs | https://github.com/zen-browser/desktop/issues/2887 | 2 days, 11:00:13 | None | +| Can't watch DRM content on Netflix | https://github.com/zen-browser/desktop/issues/2886 | 0:09:16 | 2:36:33 | +| blank at the top of the tab | https://github.com/zen-browser/desktop/issues/2885 | 5:34:05 | 5:39:58 | +| Bonjourr background image overlays rounded corners | https://github.com/zen-browser/desktop/issues/2884 | 4:26:18 | None | +| Keyboard shortcuts in series prematurely release modifier keys | https://github.com/zen-browser/desktop/issues/2882 | None | 31 days, 14:28:43 | +| Fade effect on the right of tabs do not apply to pinned tabs | https://github.com/zen-browser/desktop/issues/2881 | None | 31 days, 15:02:21 | +| Pinned tab opens in Pop-up after 'pop-up close' | https://github.com/zen-browser/desktop/issues/2877 | 1 day, 5:50:04 | None | +| Essentials do not transfer to newly opened windows | https://github.com/zen-browser/desktop/issues/2875 | 1:19:22 | None | +| When using a Side Web Panel, the back button on my mouse doesn't work as expected | https://github.com/zen-browser/desktop/issues/2874 | None | None | +| Theme reset ater moving through workspaces | https://github.com/zen-browser/desktop/issues/2873 | 7 days, 9:32:58 | None | +| Spacing between icons and tabs in the tab bar | https://github.com/zen-browser/desktop/issues/2869 | 0:16:02 | None | +| “Activate compact mode” has a spelling mistake in turkish | https://github.com/zen-browser/desktop/issues/2868 | None | None | +| Bug that the sidebar opens and closes when dragging the mouse left while the sidebar is hidden. | https://github.com/zen-browser/desktop/issues/2867 | 0:45:18 | 29 days, 13:15:52 | +| [FEATURE REQUEST] Suggestion to add new buttons and new features to the toolbar | https://github.com/zen-browser/desktop/issues/2865 | None | 14:26:29 | +| Pinned Tabs Ignored When Moving Between Workspaces, Regular Tabs Shown Instead | https://github.com/zen-browser/desktop/issues/2863 | 2:27:10 | None | +| When I do not enable workspace, the icon of workspace is still on the top of vertical tabs. | https://github.com/zen-browser/desktop/issues/2862 | 32 days, 13:24:38 | None | +| Issue where closing the last tab in Private Browsing does not close the window but switches to a Pinned Tab | https://github.com/zen-browser/desktop/issues/2861 | 3:35:44 | None | +| Url Select | https://github.com/zen-browser/desktop/issues/2858 | None | None | +| Compact Mode: The bookmarks toolbar is missing left padding | https://github.com/zen-browser/desktop/issues/2854 | None | None | +| Issue Clicking on Buttons during Onboarding (Windows) | https://github.com/zen-browser/desktop/issues/2849 | 23 days, 18:21:45 | 38 days, 23:11:49 | +| Sidebar Color Loss | https://github.com/zen-browser/desktop/issues/2843 | None | 0:04:15 | +| New window opens all the pinned tabs on both workspaces? | https://github.com/zen-browser/desktop/issues/2839 | 0:05:11 | None | +| (Request) Requesting for "+ new tab" button to be static and stable and doesnt go into hiding as scrolling or when multiple tabs are open. | https://github.com/zen-browser/desktop/issues/2835 | 1 day, 8:43:58 | None | +| Pinned tabs favicon disappears | https://github.com/zen-browser/desktop/issues/2832 | 13 days, 14:26:28 | 41 days, 17:08:27 | +| macOS: Closing a window's only/last tab does not close the window, like Firefox | https://github.com/zen-browser/desktop/issues/2831 | 1 day, 17:08:10 | None | +| Both the close and fullscreen button of glance misbehavior | https://github.com/zen-browser/desktop/issues/2827 | 20:28:54 | None | +| Web page is moving left and right on hover when using Expand on Hover | https://github.com/zen-browser/desktop/issues/2825 | None | 10:15:06 | +| video playback is completely broken | https://github.com/zen-browser/desktop/issues/2824 | 0:26:57 | 2 days, 0:24:51 | +| Zen Browser Support link broken/wrong | https://github.com/zen-browser/desktop/issues/2820 | None | 0:08:13 | +| Essentials URL not resetting on exit. | https://github.com/zen-browser/desktop/issues/2817 | 7:46:29 | 6 days, 0:03:05 | +| Pinned tabs and essentials appear in private mode | https://github.com/zen-browser/desktop/issues/2816 | 5:56:12 | 5 days, 2:01:29 | +| pinned tab bug | https://github.com/zen-browser/desktop/issues/2813 | 1 day, 6:33:29 | None | +| Freeze when click edit workspace | https://github.com/zen-browser/desktop/issues/2812 | None | 1 day, 0:53:49 | +| The confirmation window for closing does not appear and zen-browser cannot cancel the closing confirmation (freeze?) | https://github.com/zen-browser/desktop/issues/2811 | None | 1 day, 0:58:20 | +| Popup window bug | https://github.com/zen-browser/desktop/issues/2810 | 1 day, 15:14:48 | None | +| Workspace touchpad swap gesture wrong direction | https://github.com/zen-browser/desktop/issues/2808 | 20:08:53 | 39 days, 0:32:31 | +| Duplicate Workspace indicator on tab bar | https://github.com/zen-browser/desktop/issues/2805 | 1 day, 1:21:57 | None | +| ui is broken after update | https://github.com/zen-browser/desktop/issues/2804 | 7:26:24 | None | +| Workspace Indicator when sidebar is collapsed feels redundant | https://github.com/zen-browser/desktop/issues/2801 | 1 day, 3:37:39 | 17 days, 21:01:13 | +| Pinned & Essentials tabs unable to be unloaded at all. | https://github.com/zen-browser/desktop/issues/2800 | 1 day, 2:19:11 | None | +| Swipe up and down when sidebar is collapsed to change workspaces | https://github.com/zen-browser/desktop/issues/2797 | None | 17 days, 22:39:15 | +| Blank space above top tab | https://github.com/zen-browser/desktop/issues/2796 | 0:10:18 | None | +| unloaded pinned tabs do not show website icon | https://github.com/zen-browser/desktop/issues/2789 | 0:02:35 | 38 days, 15:15:12 | +| The linux version isn't updated? | https://github.com/zen-browser/desktop/issues/2781 | 18 days, 11:42:17 | None | +| New Updates - Bugs | https://github.com/zen-browser/desktop/issues/2780 | 1 day, 2:58:15 | None | +| Empty space between the first tab & the topbar | https://github.com/zen-browser/desktop/issues/2779 | 1:06:37 | None | +| Can't customize multiple buttons on customize toolbar | https://github.com/zen-browser/desktop/issues/2778 | 1 day, 2:51:22 | 4 days, 3:15:58 | +| Ram usage | https://github.com/zen-browser/desktop/issues/2777 | 0:17:22 | None | +| Automatic removal of extensions that I install | https://github.com/zen-browser/desktop/issues/2776 | None | 30 days, 20:37:59 | +| Can't open link with special scheme | https://github.com/zen-browser/desktop/issues/2774 | None | 1:08:09 | +| Fullscreen videos on double monitor | https://github.com/zen-browser/desktop/issues/2772 | None | None | +| Import all Tabs, Folders & Profiles from Arc Browser | https://github.com/zen-browser/desktop/issues/2768 | None | 0:05:20 | +| [Flatpak] Failed to create shader cache (Permission denied) | https://github.com/zen-browser/desktop/issues/2767 | 0:03:33 | 4 days, 6:13:02 | +| Pinned tabs disappear when using multiple browser windows | https://github.com/zen-browser/desktop/issues/2763 | 0:14:57 | 21:53:47 | +| PiP UI Aesthetic - Missing rounded corners | https://github.com/zen-browser/desktop/issues/2762 | 1:06:37 | 1:07:22 | +| Split view can't be resized vertically when bookmarks sidebar is open | https://github.com/zen-browser/desktop/issues/2761 | 1:25:45 | None | +| Password Manager Extension 'Dashlane' not working in zen anymore | https://github.com/zen-browser/desktop/issues/2759 | 3:42:04 | 4:30:15 | +| Zen browser keep getting crash when I use Gmail | https://github.com/zen-browser/desktop/issues/2756 | 5:03:29 | 35 days, 23:46:17 | +| Flatpak version still on .17 | https://github.com/zen-browser/desktop/issues/2755 | 0:13:50 | 2:38:25 | +| When I close glance view, it always switches to the next tab | https://github.com/zen-browser/desktop/issues/2754 | 0:02:54 | 0:26:16 | +| Zen Twilight: What's New hotlink in Settings not working | https://github.com/zen-browser/desktop/issues/2753 | 13:05:03 | 31 days, 19:21:08 | +| Sidebar text too small on macos | https://github.com/zen-browser/desktop/issues/2749 | None | 0:15:56 | +| Opening links in Zen AppImage causes 100% CPU usage | https://github.com/zen-browser/desktop/issues/2748 | 20:32:37 | None | +| Automatic Light/Dark theme does not switch automatically | https://github.com/zen-browser/desktop/issues/2747 | 4 days, 10:58:28 | 38 days, 23:52:10 | +| Prevent unloading tabs with forms | https://github.com/zen-browser/desktop/issues/2745 | None | None | +| If I choose to expand tabs by default, I can see a button on the bottom left that allows me to collapse/expand them. | https://github.com/zen-browser/desktop/issues/2744 | 0:21:54 | 31 days, 0:29:37 | +| arrow keys nor working | https://github.com/zen-browser/desktop/issues/2743 | 2 days, 10:58:58 | None | +| no workspace | https://github.com/zen-browser/desktop/issues/2742 | 4 days, 5:04:21 | None | +| Downloads going to App Data folder instead of set folder | https://github.com/zen-browser/desktop/issues/2736 | 13:04:35 | 13:04:35 | +| Keyboard shortcut binding issue on macOS | https://github.com/zen-browser/desktop/issues/2735 | 12:44:51 | None | +| Able to scroll the UI which brings space to the bottom of the screen and hides the addressbar | https://github.com/zen-browser/desktop/issues/2731 | 6:03:29 | 39 days, 7:25:44 | +| Settings don't sync properly | https://github.com/zen-browser/desktop/issues/2729 | 32 days, 12:22:43 | None | +| Choose your theme | https://github.com/zen-browser/desktop/issues/2727 | 5 days, 23:32:53 | None | +| "Zen Glance" Preview Window Blank After Opening and Closing New Glance Window | https://github.com/zen-browser/desktop/issues/2720 | 0:12:09 | 0:12:09 | +| Glances after closes, select next tab. | https://github.com/zen-browser/desktop/issues/2717 | 1:19:36 | 1:19:36 | +| Zen Browser won't open on MacOS Sequoï | https://github.com/zen-browser/desktop/issues/2715 | 2:43:53 | None | +| Glance in a pinned tab shifts icons unnaturally to the left | https://github.com/zen-browser/desktop/issues/2714 | 2:45:31 | 2:45:31 | +| [Twilight] Workspace strip not there in fresh install and on new profile | https://github.com/zen-browser/desktop/issues/2712 | 3 days, 10:34:17 | 3 days, 10:34:17 | +| [Twilight] texture slider is not working | https://github.com/zen-browser/desktop/issues/2711 | 0:39:53 | 1 day, 16:35:39 | +| MacOS compact mode ignores mouse on traffic buttons and collapses the bar | https://github.com/zen-browser/desktop/issues/2708 | None | None | +| the IDM extension occasionally fails | https://github.com/zen-browser/desktop/issues/2706 | 4:19:54 | 9 days, 9:39:36 | +| Bug in the Workspace theme color-picking UI | https://github.com/zen-browser/desktop/issues/2705 | 1:05:52 | 1:05:52 | +| Essentials not caching icons when Reset. | https://github.com/zen-browser/desktop/issues/2704 | 9 days, 21:03:04 | 9 days, 21:03:04 | +| Using "peak" with multiple tabs refocuses to the wrong tab | https://github.com/zen-browser/desktop/issues/2703 | 12:32:59 | 12:32:59 | +| Workspaces are not syncing properly. | https://github.com/zen-browser/desktop/issues/2702 | 6:50:52 | 1 day, 23:15:10 | +| Zen Twilight hijacks the "zen" PATH variable after installation | https://github.com/zen-browser/desktop/issues/2700 | None | None | +| When closing all tabs browser doesn't close | https://github.com/zen-browser/desktop/issues/2698 | 7:26:43 | None | +| Missing support for the Intel IPU6 WebCams (unlike Firefox) | https://github.com/zen-browser/desktop/issues/2693 | None | None | +| Unusable since I changed the app name on macOS | https://github.com/zen-browser/desktop/issues/2687 | None | 2:36:11 | +| Auto-PIP doesn't work when switching desktops [MAC-OS] | https://github.com/zen-browser/desktop/issues/2682 | None | None | +| Cannot share screen/window on MacOS | https://github.com/zen-browser/desktop/issues/2679 | 34 days, 18:07:19 | None | +| bug : Zen glance goes to next tab on closing glance instead of previous | https://github.com/zen-browser/desktop/issues/2677 | 13:33:57 | 22:58:39 | +| Add an animation for the downloading icon when the time left is not determined | https://github.com/zen-browser/desktop/issues/2673 | None | 1 day, 12:42:45 | +| Unloading Tabs | https://github.com/zen-browser/desktop/issues/2672 | 0:19:15 | 1 day, 13:17:19 | +| Text rendering is blurry and glitchy on second monitor | https://github.com/zen-browser/desktop/issues/2671 | 1 day, 13:20:19 | 39 days, 4:33:27 | +| [twilight] if a tab is pinned to essentials it can no longer be pinned regularly | https://github.com/zen-browser/desktop/issues/2667 | 2:56:51 | 2:59:18 | +| [Bug] Right Click Sidebar in Compact Mode. | https://github.com/zen-browser/desktop/issues/2663 | 34 days, 23:45:02 | 45 days, 22:02:03 | +| Glance jumps to the first unpinned tab | https://github.com/zen-browser/desktop/issues/2660 | 7:25:08 | 2 days, 2:54:22 | +| Drag and drop for sidebar widening and shrinking is offset seems like can't widen sidebar. | https://github.com/zen-browser/desktop/issues/2659 | None | 31 days, 7:36:24 | +| Tab Management Issue | https://github.com/zen-browser/desktop/issues/2658 | 13:56:19 | 2 days, 3:38:16 | +| Can't install Zen Mods | https://github.com/zen-browser/desktop/issues/2657 | None | 4:07:58 | +| New tab created on shifting workspaces | https://github.com/zen-browser/desktop/issues/2655 | 1:46:55 | 31 days, 9:25:13 | +| Cannot watch anything on netflix | https://github.com/zen-browser/desktop/issues/2653 | 5:26:42 | 1 day, 12:21:51 | +| Tab Accessibility Issue in Zen Browser | https://github.com/zen-browser/desktop/issues/2652 | 2 days, 2:51:42 | 10 days, 12:29:15 | +| Make Workspaces Keep Cookies Separate, Similar to Firefox Multi-Account Containers | https://github.com/zen-browser/desktop/issues/2650 | None | 0:35:25 | +| Left Active Window borders in Split View doesn't render correctly. | https://github.com/zen-browser/desktop/issues/2647 | 0:54:40 | 36 days, 4:28:13 | +| Can not build on Windows (Locales folder issue) | https://github.com/zen-browser/desktop/issues/2645 | 22:18:09 | None | +| Browser fails to reopen after restoring default shortcuts and restarting | https://github.com/zen-browser/desktop/issues/2643 | 35 days, 16:34:17 | 40 days, 11:53:43 | +| Picture-In-Picture window doesn't stay on top in KDE Plasma | https://github.com/zen-browser/desktop/issues/2641 | None | None | +| Zen-Components just went private. | https://github.com/zen-browser/desktop/issues/2640 | 0:54:45 | 1:16:23 | +| Twitch freezing in Zen | https://github.com/zen-browser/desktop/issues/2638 | 27 days, 23:41:20 | 40 days, 16:06:49 | +| last update (to 1.0.1-a.14) reset "How to expand tabs" setting | https://github.com/zen-browser/desktop/issues/2626 | 6:20:36 | 8:23:32 | +| Multiple new tab button | https://github.com/zen-browser/desktop/issues/2624 | 11:47:45 | 11:47:45 | +| FireFox PWA extension runtime is not recognized even after being installed | https://github.com/zen-browser/desktop/issues/2623 | 16 days, 12:09:42 | None | +| Typo in Settings > Shortcuts (about:preferences#zenCKS) for Bookmark Tabs | https://github.com/zen-browser/desktop/issues/2621 | 1:19:28 | None | +| Old alert after updating all mods | https://github.com/zen-browser/desktop/issues/2616 | None | 22:23:28 | +| Keyboard navigation | https://github.com/zen-browser/desktop/issues/2615 | 6 days, 16:37:16 | 47 days, 1:23:07 | +| Persist glance on tab switch | https://github.com/zen-browser/desktop/issues/2612 | None | 3 days, 20:17:58 | +| Blury Webpages on a 32:9 window | https://github.com/zen-browser/desktop/issues/2611 | None | 0:11:09 | +| Render flickering | https://github.com/zen-browser/desktop/issues/2610 | None | 38 days, 10:38:36 | +| Can't see downloads in Toolbar | https://github.com/zen-browser/desktop/issues/2603 | None | 11 days, 0:27:27 | +| Zen not remembering where the tabs opened in the previous sessions. | https://github.com/zen-browser/desktop/issues/2601 | 16:46:28 | None | +| [Twilight] Show bookmarks toolbar freezes & flickers | https://github.com/zen-browser/desktop/issues/2600 | None | 0:24:46 | +| Incorrect image for "Hide Tab Bar" and "Hide Top Bar" in Theme Settings | https://github.com/zen-browser/desktop/issues/2597 | 0:11:30 | 5:46:37 | +| Scroll Bar not working in vertical tabs | https://github.com/zen-browser/desktop/issues/2596 | 10 days, 6:06:10 | 42 days, 0:21:25 | +| Opening Find makes the whole web content jump | https://github.com/zen-browser/desktop/issues/2594 | 5:30:19 | None | +| Video Emebeds fail to play | https://github.com/zen-browser/desktop/issues/2593 | 14 days, 0:48:37 | None | +| Pinned tabs in a workspace create a blank space between the end of the tab scroll region and the workspace buttons in another workspace with fewer tabs | https://github.com/zen-browser/desktop/issues/2592 | 7 days, 15:54:43 | 49 days, 7:40:42 | +| Icons overlay each other in toolbar when resizing the window | https://github.com/zen-browser/desktop/issues/2590 | None | 1 day, 11:23:01 | +| Sidebar hover and right click makes the sidebar dissapear | https://github.com/zen-browser/desktop/issues/2587 | 13 days, 8:25:06 | None | +| At Glance - go backward / go forward | https://github.com/zen-browser/desktop/issues/2584 | 4 days, 17:08:25 | 4 days, 17:08:35 | +| Only Create New Tabs When a URL is Loaded | https://github.com/zen-browser/desktop/issues/2582 | 0:50:53 | 0:50:53 | +| REQUEST: I need the old switch to next tab in keyboard shortcuts | https://github.com/zen-browser/desktop/issues/2581 | 7 days, 23:34:33 | 7 days, 23:34:33 | +| Sidebar does not appear when hovered | https://github.com/zen-browser/desktop/issues/2579 | 7:20:14 | 20:32:59 | +| Glance in page opened from Glance | https://github.com/zen-browser/desktop/issues/2575 | None | 8 days, 21:14:19 | +| [bug] Layout issues with Compact Mode enabled & Tabs on Right | https://github.com/zen-browser/desktop/issues/2574 | 2 days, 19:56:38 | 49 days, 15:48:59 | +| Unable to add perplexity.ai as default search engine | https://github.com/zen-browser/desktop/issues/2572 | 4:10:04 | 14:00:57 | +| Tabs Do Not Expand On Hover After Toggling Compact Mode | https://github.com/zen-browser/desktop/issues/2569 | 6 days, 18:42:45 | None | +| Title bar does not lose focus after using URL bar in compact mode | https://github.com/zen-browser/desktop/issues/2568 | 16 days, 18:39:13 | 20 days, 11:52:21 | +| cannot create workspaces | https://github.com/zen-browser/desktop/issues/2567 | 1:26:45 | 9 days, 0:19:56 | +| Tabs dont react after not using for some time | https://github.com/zen-browser/desktop/issues/2566 | 9:38:14 | 30 days, 15:51:04 | +| hotkey "Toggle side bar" doesn't work | https://github.com/zen-browser/desktop/issues/2564 | 3:00:58 | 3:05:41 | +| Tab panel doesn't work after move some tab to another workspace | https://github.com/zen-browser/desktop/issues/2562 | 2 days, 19:16:36 | 50 days, 0:17:12 | +| Glance window breaks Zen if closed with CTRL + W shortcut on Windows | https://github.com/zen-browser/desktop/issues/2551 | 0:42:23 | 4 days, 3:18:01 | +| Blurry viewport on Linux | https://github.com/zen-browser/desktop/issues/2550 | None | 14 days, 3:19:43 | +| Glance is launching links in main window and Glance window | https://github.com/zen-browser/desktop/issues/2546 | 5 days, 22:40:22 | 6 days, 2:00:07 | +| There is no New Tab button on sidebar | https://github.com/zen-browser/desktop/issues/2543 | None | 0:13:58 | +| Websites appear blurry with non-standard aspect ratios (ultra-wide) | https://github.com/zen-browser/desktop/issues/2541 | 2 days, 2:54:09 | None | +| Duplicate New tab button added when closing an new tab | https://github.com/zen-browser/desktop/issues/2539 | None | 0:07:45 | +| Closing last tab doesn't close the broswer window | https://github.com/zen-browser/desktop/issues/2537 | 1:22:17 | 6 days, 1:24:16 | +| Glance when closed jumps to another tab and not to the original tab | https://github.com/zen-browser/desktop/issues/2535 | 0:31:34 | 6 days, 1:53:32 | +| Closing Glance mode tab takes to the next tab automatically | https://github.com/zen-browser/desktop/issues/2534 | None | 0:02:05 | +| No way to hide Bookmarks toolbar. | https://github.com/zen-browser/desktop/issues/2532 | 0:32:12 | 45 days, 15:03:06 | +| Deformed icons on bookmarks bar when in "Density mode" is set to "Touch" | https://github.com/zen-browser/desktop/issues/2531 | 13 days, 0:51:03 | 46 days, 7:10:55 | +| Empty tab bar is shown on opening | https://github.com/zen-browser/desktop/issues/2530 | 1:31:47 | None | +| when opening a link in split view it forms a new tab | https://github.com/zen-browser/desktop/issues/2529 | 31 days, 8:32:44 | 39 days, 4:52:47 | +| The fullscreen button and close button in glance both close the window. | https://github.com/zen-browser/desktop/issues/2528 | 2:17:17 | 45 days, 17:48:29 | +| Glance issues - a.17 | https://github.com/zen-browser/desktop/issues/2526 | 0:39:39 | 31 days, 8:30:40 | +| Pinned and Starred Tabs - pin tabs in just the current workspace or across all | https://github.com/zen-browser/desktop/issues/2525 | None | 0:48:10 | +| Cant move tab to existing new window | https://github.com/zen-browser/desktop/issues/2524 | 2:03:18 | 6 days, 12:34:47 | +| [BUG] glance-close focuses next-tab | https://github.com/zen-browser/desktop/issues/2520 | 2:25:28 | 2:25:28 | +| Clear instructions for Updating App Images | https://github.com/zen-browser/desktop/issues/2518 | 31 days, 13:24:28 | None | +| Can't move new tab toolbar | https://github.com/zen-browser/desktop/issues/2517 | 1:22:26 | 7:58:34 | +| Fading edge effect on the tab sidebar does not apply to entries below (and including) the selected tab | https://github.com/zen-browser/desktop/issues/2516 | 31 days, 13:56:06 | None | +| Background Color Issue in Zen Browser | https://github.com/zen-browser/desktop/issues/2514 | 4:55:19 | 0:12:23 | +| Empty pinned new tab opening a url opens in a new page | https://github.com/zen-browser/desktop/issues/2513 | 31 days, 14:11:12 | 31 days, 14:24:17 | +| Annoying border radius effect | https://github.com/zen-browser/desktop/issues/2512 | 2:00:01 | 50 days, 8:13:50 | +| Dragging a pinned tab unpins the tab | https://github.com/zen-browser/desktop/issues/2508 | 31 days, 14:50:43 | 44 days, 6:57:18 | +| Crash when dragging an `` element | https://github.com/zen-browser/desktop/issues/2504 | None | 0:04:33 | +| Ability to make the web panel wider | https://github.com/zen-browser/desktop/issues/2503 | 10:34:58 | 10:35:16 | + +_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:2024-11-01..2024-11-30 -reason:"not planned"` diff --git a/docs/requirements.md b/docs/requirements.md deleted file mode 100644 index 5ba4003fe..000000000 --- a/docs/requirements.md +++ /dev/null @@ -1,30 +0,0 @@ -# Supported CPUs for optimized builds (Windows and Linux) - -> If you CPU is not listed, you should use the "Generic" build. - -- AMD Family 15h (Excavator) -- AMD Family 17h (Zen) -- AMD Family 17h (Zen+) -- AMD Family 17h (Zen 2) -- AMD Family 19h (Zen 3) -- Intel 4th Gen Core (Haswell) -- Intel 5th Gen Core (Broadwell) -- Intel 6th Gen Core (Skylake) -- Intel 7th Gen Core (Kaby Lake) -- Intel 8/9th Gen Core (Coffee Lake) -- Intel 10th Gen Core (Comet Lake) -- Intel 12th Gen (Alder Lake) -- Intel 13th Gen (Raptor Lake) -- Intel 14th Gen (Raptor Lake Refresh) -- Intel 15th Gen (Lunar / Arrow Lake) -- AMD Family 19h (Zen 4 / Zen 4c) -- AMD Family 1Ah (Zen 5 / Zen 5c) -- Intel 6th Gen Core (Skylake X) -- Intel 8th Gen Core i3 (Cannon Lake) -- Intel Xeon / 10th Gen Core (Ice Lake) -- Intel Xeon (Cascade Lake) -- Intel Xeon (Cooper Lake) -- Intel 3rd Gen 10nm++ (Tiger Lake) -- Intel 4th Gen 10nm++ (Sapphire Rapids) -- Intel 5th Gen 10nm++ (Emerald Rapids) -- Intel 11th Gen (Rocket Lake) diff --git a/flatpak/io.github.zen_browser.zen.yml.template b/flatpak/io.github.zen_browser.zen.yml.template index 2fd158194..845498708 100644 --- a/flatpak/io.github.zen_browser.zen.yml.template +++ b/flatpak/io.github.zen_browser.zen.yml.template @@ -44,7 +44,7 @@ modules: sources: - type: archive - url: https://github.com/zen-browser/desktop/releases/download/{version}/zen.linux-generic.tar.bz2 + url: https://github.com/zen-browser/desktop/releases/download/{version}/zen.linux-x86_64.tar.bz2 sha256: {linux_sha256} strip-components: 0 diff --git a/l10n b/l10n index c408aa6ca..b1bf9efa9 160000 --- a/l10n +++ b/l10n @@ -1 +1 @@ -Subproject commit c408aa6cacf92175f9e7e1defedc98e05ec3d7ca +Subproject commit b1bf9efa93fac72629659cfdaa67e789205a6a3d diff --git a/package.json b/package.json index 14a77dbf4..3241185ec 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ }, "homepage": "https://github.com/zen-browser/core#readme", "dependencies": { - "@zen-browser/surfer": "^1.6.4" + "@zen-browser/surfer": "^1.7.0" }, "devDependencies": { "husky": "^9.1.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 46a49dd57..d7d3390c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@zen-browser/surfer': - specifier: ^1.6.4 - version: 1.6.4 + specifier: ^1.7.0 + version: 1.7.0 devDependencies: husky: specifier: ^9.1.5 @@ -119,8 +119,8 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@zen-browser/surfer@1.6.4': - resolution: {integrity: sha512-JmTHLHTbTLPgrakdU/m1KQgetPMQNGjYgGGVoi2AenvVDlJf3j+L2it0XehAqRFIQhXmbEuF1nSDV4Vla/vUUg==} + '@zen-browser/surfer@1.7.0': + resolution: {integrity: sha512-LKpMfcXvzf9VmXHydVF9sO4srtTdgjdrNYHHwDucNmnqIdamIYmP7KWAlZViohdBLdXPWODYY0IsZPAKNf3BCg==} hasBin: true ansi-escapes@7.0.0: @@ -1003,7 +1003,7 @@ snapshots: '@types/node@17.0.45': {} - '@zen-browser/surfer@1.6.4': + '@zen-browser/surfer@1.7.0': dependencies: '@resvg/resvg-js': 1.4.0 async-icns: 1.0.2 diff --git a/scripts/remove-failed-jobs.sh b/scripts/remove-failed-jobs.sh new file mode 100644 index 000000000..e1d5858d1 --- /dev/null +++ b/scripts/remove-failed-jobs.sh @@ -0,0 +1,20 @@ +gh_bulk_delete_workflow_runs() { + repo=$1 + + # Ensure the repo argument is provided + if [[ -z "$repo" ]]; then + echo "Usage: gh_bulk_delete_workflow_runs " + return 1 + fi + + runs=$(gh api repos/$repo/actions/runs --paginate | jq -r '.workflow_runs[] | select(.conclusion == "failure") | .id') + + while IFS= read -r run; do + echo "Deleting run https://github.com/$repo/actions/runs/$run" + gh api -X DELETE repos/$repo/actions/runs/$run --silent + done <<< "$runs" + + echo "All workflow runs for $repo have been deleted." +} + +gh_bulk_delete_workflow_runs $1 diff --git a/src/browser/app/profile/better-fox.js b/src/browser/app/profile/better-fox.js deleted file mode 100644 index ac1c1be37..000000000 --- a/src/browser/app/profile/better-fox.js +++ /dev/null @@ -1,204 +0,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/. -// -/* You may copy+paste this file and use it as it is. - * - * If you make changes to your about:config while the program is running, the - * changes will be overwritten by the user.js when the application restarts. - * - * To make lasting changes to preferences, you will have to edit the user.js. - */ - -/**************************************************************************** - * Betterfox * - * "Ad meliora" * - * version: 130 * - * url: https://github.com/yokoffing/Betterfox * -****************************************************************************/ - -/**************************************************************************** - * SECTION: FASTFOX * -****************************************************************************/ -/** GENERAL ***/ -//pref("content.notify.interval", 100000); // (.10s); alt=500000 (.50s) - -/** GFX ***/ -pref("gfx.canvas.accelerated.cache-items", 32768); -pref("gfx.canvas.accelerated.cache-size", 4096); -pref("gfx.content.skia-font-cache-size", 80); - -/** DISK CACHE ***/ -pref("browser.cache.jsbc_compression_level", 3); - -/** MEDIA CACHE ***/ -pref("media.memory_cache_max_size", 1048576); -pref("media.cache_readahead_limit", 9000); -pref("media.cache_resume_threshold", 3600); -pref("media.memory_caches_combined_limit_kb", 2560000); - -/** IMAGE CACHE ***/ -pref("image.mem.decode_bytes_at_a_time", 32768); - -/** NETWORK ***/ -pref("network.http.max-connections", 1800); -pref("network.http.max-persistent-connections-per-server", 10); -pref("network.http.max-urgent-start-excessive-connections-per-host", 5); -pref("network.http.pacing.requests.enabled", false); -pref("network.dnsCacheExpiration", 3600); -pref("network.http.max-persistent-connections-per-proxy", 48); // default=32 -pref("network.websocket.max-connections", 400); // default=200 -pref("network.ssl_tokens_cache_capacity", 32768); - -/** MIXED CONTENT + CROSS-SITE ***/ -pref("pdfjs.enableScripting", false); -pref("extensions.postDownloadThirdPartyPrompt", false); - -/** EXPERIMENTAL ***/ -pref("layout.css.grid-template-masonry-value.enabled", true); -pref("dom.enable_web_task_scheduling", true); -pref("dom.security.sanitizer.enabled", true); - -/**************************************************************************** - * SECTION: SECUREFOX * -****************************************************************************/ -/** TRACKING PROTECTION ***/ -pref("urlclassifier.trackingSkipURLs", "*.reddit.com, *.twitter.com, *.twimg.com, *.tiktok.com"); -pref("urlclassifier.features.socialtracking.skipURLs", "*.instagram.com, *.twitter.com, *.twimg.com"); -pref("network.cookie.sameSite.noneRequiresSecure", true); -pref("browser.helperApps.deleteTempFileOnExit", true); -pref("browser.uitour.enabled", false); - -/** SSL / TLS ***/ -pref("security.ssl.treat_unsafe_negotiation_as_broken", true); -pref("browser.xul.error_pages.expert_bad_cert", true); -pref("security.tls.enable_0rtt_data", false); - -/** DISK AVOIDANCE ***/ -pref("browser.privatebrowsing.forceMediaMemoryCache", true); - -/** SHUTDOWN & SANITIZING ***/ -pref("privacy.history.custom", true); - -/** SEARCH / URL BAR ***/ -pref("browser.urlbar.trimHttps", true); -pref("browser.search.separatePrivateDefault.ui.enabled", true); -pref("browser.urlbar.update2.engineAliasRefresh", true); -pref("browser.search.suggest.enabled", false); -pref("browser.urlbar.quicksuggest.enabled", false); -pref("browser.urlbar.suggest.quicksuggest.sponsored", false); -pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false); -pref("browser.urlbar.groupLabels.enabled", false); -pref("browser.formfill.enable", false); -pref("security.insecure_connection_text.enabled", true); -pref("security.insecure_connection_text.pbmode.enabled", true); -pref("network.IDN_show_punycode", true); - -/** CONTAINERS ***/ -pref("privacy.userContext.ui.enabled", true); - -/** SAFE BROWSING ***/ -pref("browser.safebrowsing.downloads.remote.enabled", false); - -/** TELEMETRY ***/ -pref("datareporting.policy.dataSubmissionEnabled", false, locked); -pref("datareporting.healthreport.uploadEnabled", false, locked); -pref("toolkit.telemetry.unified", false, locked); -pref("toolkit.telemetry.enabled", false, locked); -pref("toolkit.telemetry.server", "data:,", locked); -pref("toolkit.telemetry.archive.enabled", false, locked); -pref("toolkit.telemetry.newProfilePing.enabled", false, locked); -pref("toolkit.telemetry.shutdownPingSender.enabled", false, locked); -pref("toolkit.telemetry.updatePing.enabled", false, locked); -pref("toolkit.telemetry.bhrPing.enabled", false, locked); -pref("toolkit.telemetry.firstShutdownPing.enabled", false, locked); -pref("toolkit.telemetry.coverage.opt-out", true, locked); -pref("toolkit.coverage.opt-out", true, locked); -pref("toolkit.coverage.endpoint.base", "", locked); -pref("browser.newtabpage.activity-stream.feeds.telemetry", false, locked); -pref("browser.newtabpage.activity-stream.telemetry", false, locked); - -/** EXPERIMENTS ***/ -pref("app.shield.optoutstudies.enabled", false, locked); -pref("app.normandy.enabled", false, locked); -pref("app.normandy.api_url", "", locked); - -/** CRASH REPORTS ***/ -pref("breakpad.reportURL", ""); -pref("browser.tabs.crashReporting.sendReport", false); -pref("browser.crashReports.unsubmittedCheck.autoSubmit2", false); - -/** DETECTION ***/ -pref("dom.private-attribution.submission.enabled", false); - -/**************************************************************************** - * SECTION: PESKYFOX * -****************************************************************************/ -/** MOZILLA UI ***/ -pref("browser.privatebrowsing.vpnpromourl", "", locked); -pref("extensions.getAddons.showPane", false); -pref("extensions.htmlaboutaddons.recommendations.enabled", false); -pref("browser.discovery.enabled", false); -pref("browser.shell.checkDefaultBrowser", false); -pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons", false); -pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features", false); -pref("browser.preferences.moreFromMozilla", false); -pref("browser.aboutConfig.showWarning", false); -pref("browser.aboutwelcome.enabled", false); - -/** THEME ADJUSTMENTS ***/ -pref("toolkit.legacyUserProfileCustomizations.stylesheets", true); -pref("browser.compactmode.show", true); -pref("browser.display.focus_ring_on_anything", true); -pref("browser.display.focus_ring_style", 0); -pref("browser.display.focus_ring_width", 0); -pref("layout.css.prefers-color-scheme.content-override", 2); -pref("browser.privateWindowSeparation.enabled", false); // WINDOWS - -/** FULLSCREEN NOTICE ***/ -pref("full-screen-api.transition-duration.enter", "0 0"); -pref("full-screen-api.transition-duration.leave", "0 0"); -pref("full-screen-api.warning.delay", -1); -pref("full-screen-api.warning.timeout", 0); - -/** URL BAR ***/ -pref("browser.urlbar.suggest.calculator", true); -pref("browser.urlbar.unitConversion.enabled", true); -pref("browser.urlbar.trending.featureGate", false); - -/** NEW TAB PAGE ***/ -pref("browser.newtabpage.activity-stream.feeds.topsites", false); -pref("browser.newtabpage.activity-stream.feeds.section.topstories", false); - -/** POCKET ***/ -pref("extensions.pocket.enabled", false); - -/** DOWNLOADS ***/ -pref("browser.download.always_ask_before_handling_new_types", true); -pref("browser.download.manager.addToRecentDocs", false); - -/** PDF ***/ -pref("browser.download.open_pdf_attachments_inline", true); - -/** TAB BEHAVIOR ***/ -pref("browser.bookmarks.openInTabClosesMenu", false); -pref("browser.menu.showViewImageInfo", true); -pref("findbar.highlightAll", true); -pref("layout.word_select.eat_space_to_next_word", false); - -/**************************************************************************** - * START: MY OVERRIDES * -****************************************************************************/ -// visit https://github.com/yokoffing/Betterfox/wiki/Common-Overrides -// visit https://github.com/yokoffing/Betterfox/wiki/Optional-Hardening -// Enter your personal overrides below this line: - -/**************************************************************************** - * SECTION: SMOOTHFOX * -****************************************************************************/ -// visit https://github.com/yokoffing/Betterfox/blob/main/Smoothfox.js -// Enter your scrolling overrides below this line: - -/**************************************************************************** - * END: BETTERFOX * -****************************************************************************/ diff --git a/src/browser/app/profile/zen-browser.js b/src/browser/app/profile/zen-browser.js index 78b7c6d4a..56190ea80 100644 --- a/src/browser/app/profile/zen-browser.js +++ b/src/browser/app/profile/zen-browser.js @@ -26,6 +26,10 @@ pref("browser.startup.page", 3); pref('toolkit.legacyUserProfileCustomizations.stylesheets', true); pref('browser.compactmode.show', true); +#ifdef XP_WIN +pref("browser.privateWindowSeparation.enabled", false); +#endif + pref('browser.newtabpage.activity-stream.newtabWallpapers.enabled', true); pref('browser.newtabpage.activity-stream.newtabWallpapers.v2.enabled', true); pref('browser.translations.newSettingsUI.enable', true); @@ -42,6 +46,7 @@ pref('browser.urlbar.trending.featureGate', false); pref('browser.urlbar.weather.featureGate', true); pref('browser.urlbar.quickactions.enabled', true); pref('browser.urlbar.clipboard.featureGate', true); +pref('browser.urlbar.suggest.calculator', true); // new tab page pref('browser.newtabpage.activity-stream.feeds.topsites', false); @@ -55,24 +60,24 @@ pref('pdfjs.enableHighlightFloatingButton', true); pref("alerts.showFavicons", true); +// Toolbars pref("browser.tabs.loadBookmarksInTabs", false); pref('browser.toolbars.bookmarks.visibility', 'never'); +pref("browser.bookmarks.openInTabClosesMenu", false); +pref("browser.menu.showViewImageInfo", true); +pref("findbar.highlightAll", true); +pref("layout.word_select.eat_space_to_next_word", false); // Enable Do Not Track and GPC by default. pref("privacy.donottrackheader.enabled", false); pref("privacy.globalprivacycontrol.enabled", true); -// Disable more telemetry -pref("toolkit.telemetry.enabled", false); -pref("browser.ping-centre.telemetry", false); -pref("browser.attribution.enabled", false); -pref("toolkit.telemetry.pioneer-new-studies-available", false); pref("app.update.checkInstallTime.days", 6); // CUSTOM ZEN PREFS -pref('zen.welcomeScreen.enabled', true); -pref('zen.welcomeScreen.seen', false); +pref('zen.welcome-screen.enabled', true, sticky); +pref('zen.welcome-screen.seen', false); pref('zen.tabs.vertical', true); pref('zen.tabs.vertical.right-side', false); @@ -107,6 +112,16 @@ pref('zen.view.compact.toolbar-flash-popup.duration', 800); pref('zen.view.compact.toolbar-hide-after-hover.duration', 1000); pref('zen.view.compact.color-toolbar', true); pref('zen.view.compact.color-sidebar', true); +pref('zen.view.compact.animate-sidebar', true); + +pref('zen.urlbar.behavior', 'floating-on-type'); // default, floating-on-type, float + +#ifdef XP_MACOSX +// Disable for macos in the meantime until @HarryHeres finds a solution for hight DPI screens +pref('zen.view.experimental-rounded-view', false); +#else +pref('zen.view.experimental-rounded-view', true); +#endif pref('zen.glance.enabled', true); pref('zen.glance.hold-duration', 300); // in ms @@ -114,16 +129,16 @@ pref('zen.glance.hold-duration', 300); // in ms pref('zen.glance.activation-method', 'alt'); // ctrl, alt, shift, none, hold pref('zen.view.sidebar-height-throttle', 200); // in ms -pref('zen.view.sidebar-expanded.max-width', 400); +pref('zen.view.sidebar-expanded.max-width', 500); pref('zen.view.show-bottom-border', false); pref('zen.view.use-single-toolbar', true); pref('zen.view.sidebar-expanded', true); pref('zen.view.sidebar-collapsed.hide-mute-button', true); +pref('zen.view.experimental-force-window-controls-left', false); -#ifndef XP_MACOSX pref('zen.view.hide-window-controls', true); -#endif +pref('zen.view.experimental-no-window-controls', false); pref('zen.tabs.dim-pending', true); pref('zen.tabs.newtab-on-middle-click', true); @@ -166,6 +181,9 @@ pref('zen.workspaces.force-container-workspace', false); pref('zen.workspaces.open-new-tab-if-last-unpinned-tab-is-closed', true); pref('zen.workspaces.show-workspace-indicator', true); pref('zen.workspaces.swipe-actions', true); +pref('zen.workspaces.wrap-around-navigation', true); +pref('zen.workspaces.natural-scroll', false); +pref('zen.workspaces.scroll-modifier-key','ctrl'); // can be ctrl, alt, shift, or a meta key pref('zen.workspaces.icons', '["⌚","⌛","⏪","⏫","⏬","⏰","⏳","⚽","⚾","⛄","⛅","⛎","⛔","⛪","⛲","⛳","⛵","⛺","⛽","✅","✊","✋","✨","❌","❎","❓","⭐","⭕","🀄","🃏","🆎","🆑","🆒","🆓","🆔","🆕","🆖","🆗","🆘","🆙","🆚","🈁","🈚","🈯","🈲","🈳","🈴","🈵","🈶","🈸","🈹","🈺","🉐","🉑","🌀","🌁","🌂","🌃","🌄","🌅","🌆","🌇","🌈","🌉","🌊","🌋","🌌","🌍","🌎","🌏","🌐","🌑","🌒","🌓","🌔","🌕","🌖","🌗","🌘","🌙","🌚","🌛","🌜","🌝","🌞","🌟","🌠","🌭","🌮","🌯","🌰","🌱","🌲","🌳","🌴","🌵","🌷","🌸","🌹","🌺","🌻","🌼","🌽","🌾","🌿","🍀","🍁","🍂","🍃","🍄","🍅","🍆","🍇","🍈","🍉","🍊","🍋","🍌","🍍","🍎","🍏","🍐","🍑","🍒","🍓","🍔","🍕","🍖","🍗","🍘","🍙","🍚","🍛","🍜","🍝","🍞","🍟","🍠","🍡","🍢","🍣","🍤","🍥","🍦","🍧","🍨","🍩","🍪","🍫","🍬","🍭","🍮","🍯","🍰","🍱","🍲","🍳","🍴","🍵","🍶","🍷","🍸","🍹","🍺","🍻","🍼","🍾","🍿","🎀","🎁","🎂","🎃","🎄","🎅","🎆","🎇","🎈","🎉","🎊","🎋","🎌","🎍","🎎","🎏","🎐","🎑","🎒","🎓","🎠","🎡","🎢","🎣","🎤","🎥","🎦","🎧","🎨","🎩","🎪","🎫","🎬","🎭","🎮","🎯","🎰","🎱","🎲","🎳","🎴","🎵","🎶","🎷","🎸","🎹","🎺","🎻","🎼","🎽","🎾","🎿","🏀","🏁","🏂","🏃","🏄","🏅","🏆","🏇","🏈","🏉","🏊","🏏","🏐","🏑","🏒","🏓","🏠","🏡","🏢","🏣","🏤","🏥","🏦","🏧","🏨","🏩","🏪","🏫","🏬","🏭","🏮","🏯","🏰","🏴","🏸","🏹","🏺","🏻","🏼","🏽","🏾","🏿","🐀","🐁","🐂","🐃","🐄","🐅","🐆","🐇","🐈","🐉","🐊","🐋","🐌","🐍","🐎","🐏","🐐","🐑","🐒","🐓","🐔","🐕","🐖","🐗","🐘","🐙","🐚","🐛","🐜","🐝","🐞","🐟","🐠","🐡","🐢","🐣","🐤","🐥","🐦","🐧","🐨","🐩","🐪","🐫","🐬","🐭","🐮","🐯","🐰","🐱","🐲","🐳","🐴","🐵","🐶","🐷","🐸","🐹","🐺","🐻","🐼","🐽","🐾","👀","👂","👃","👄","👅","👆","👇","👈","👉","👊","👋","👌","👍","👎","👏","👐","👑","👒","👓","👔","👕","👖","👗","👘","👙","👚","👛","👜","👝","👞","👟","👠","👡","👢","👣","👤","👥","👦","👧","👨","👩","👪","👫","👬","👭","👮","👯","👰","👱","👲","👳","👴","👵","👶","👷","👸","👹","👺","👻","👼","👽","👾","👿","💀","💁","💂","💃","💄","💅","💆","💇","💈","💉","💊","💋","💌","💍","💎","💏","💐","💑","💒","💓","💔","💕","💖","💗","💘","💙","💚","💛","💜","💝","💞","💟","💠","💡","💢","💣","💤","💥","💦","💧","💨","💩","💪","💫","💬","💭","💮","💯","💰","💱","💲","💳","💴","💵","💶","💷","💸","💹","💺","💻","💼","💽","💾","💿","📀","📁","📂","📃","📄","📅","📆","📇","📈","📉","📊","📋","📌","📍","📎","📏","📐","📑","📒","📓","📔","📕","📖","📗","📘","📙","📚","📛","📜","📝","📞","📟","📠","📡","📢","📣","📤","📥","📦","📧","📨","📩","📪","📫","📬","📭","📮","📯","📰","📱","📲","📳","📴","📵","📶","📷","📸","📹","📺","📻","📼","📿","🔀","🔁","🔂","🔃","🔄","🔅","🔆","🔇","🔈","🔉","🔊","🔋","🔌","🔍","🔎","🔏","🔐","🔑","🔒","🔓","🔔","🔕","🔖","🔗","🔘","🔙","🔚","🔛","🔜","🔝","🔞","🔟","🔠","🔡","🔢","🔣","🔤","🔥","🔦","🔧","🔨","🔩","🔪","🔫","🔬","🔭","🔮","🔯","🔰","🔱","🔲","🔳","🔴","🔵","🔶","🔷","🔸","🔹","🔺","🔻","🔼","🔽","🕋","🕌","🕍","🕎","🕐","🕑","🕒","🕓","🕔","🕕","🕖","🕗","🕘","🕙","🕚","🕛","🕜","🕝","🕞","🕟","🕠","🕡","🕢","🕣","🕤","🕥","🕦","🕧","🖕","🖖","🗻","🗼","🗽","🗾","🗿","😀","😁","😂","😃","😄","😅","😆","😇","😈","😉","😊","😋","😌","😍","😎","😏","😐","😑","😒","😓","😔","😕","😖","😗","😘","😙","😚","😛","😜","😝","😞","😟","😠","😡","😢","😣","😤","😥","😦","😧","😨","😩","😪","😫","😬","😭","😮","😯","😰","😱","😲","😳","😴","😵","😶","😷","😸","😹","😺","😻","😼","😽","😾","😿","🙀","🙁","🙂","🙃","🙄","🙅","🙆","🙇","🙈","🙉","🙊","🙋","🙌","🙍","🙎","🙏","🚀","🚁","🚂","🚃","🚄","🚅","🚆","🚇","🚈","🚉","🚊","🚋","🚌","🚍","🚎","🚏","🚐","🚑","🚒","🚓","🚔","🚕","🚖","🚗","🚘","🚙","🚚","🚛","🚜","🚝","🚞","🚟","🚠","🚡","🚢","🚣","🚤","🚥","🚦","🚧","🚨","🚩","🚪","🚫","🚬","🚭","🚮","🚯","🚰","🚱","🚲","🚳","🚴","🚵","🚶","🚷","🚸","🚹","🚺","🚻","🚼","🚽","🚾","🚿","🛀","🛁","🛂","🛃","🛄","🛅","🛌","🛐","🛫","🛬","🤐","🤑","🤒","🤓","🤔","🤕","🤖","🤗","🤘","🦀","🦁","🦂","🦃","🦄","🧀","🇦🇨","🇦🇩","🇦🇪","🇦🇫","🇦🇬","🇦🇮","🇦🇱","🇦🇲","🇦🇴","🇦🇶","🇦🇷","🇦🇸","🇦🇹","🇦🇺","🇦🇼","🇦🇽","🇦🇿","🇧🇦","🇧🇧","🇧🇩","🇧🇪","🇧🇫","🇧🇬","🇧🇭","🇧🇮","🇧🇯","🇧🇱","🇧🇲","🇧🇳","🇧🇴","🇧🇶","🇧🇷","🇧🇸","🇧🇹","🇧🇻","🇧🇼","🇧🇾","🇧🇿","🇨🇦","🇨🇨","🇨🇩","🇨🇫","🇨🇬","🇨🇭","🇨🇮","🇨🇰","🇨🇱","🇨🇲","🇨🇳","🇨🇴","🇨🇵","🇨🇷","🇨🇺","🇨🇻","🇨🇼","🇨🇽","🇨🇾","🇨🇿","🇩🇪","🇩🇬","🇩🇯","🇩🇰","🇩🇲","🇩🇴","🇩🇿","🇪🇦","🇪🇨","🇪🇪","🇪🇬","🇪🇭","🇪🇷","🇪🇸","🇪🇹","🇪🇺","🇫🇮","🇫🇯","🇫🇰","🇫🇲","🇫🇴","🇫🇷","🇬🇦","🇬🇧","🇬🇩","🇬🇪","🇬🇫","🇬🇬","🇬🇭","🇬🇮","🇬🇱","🇬🇲","🇬🇳","🇬🇵","🇬🇶","🇬🇷","🇬🇸","🇬🇹","🇬🇺","🇬🇼","🇬🇾","🇭🇰","🇭🇲","🇭🇳","🇭🇷","🇭🇹","🇭🇺","🇮🇨","🇮🇩","🇮🇪","🇮🇱","🇮🇲","🇮🇳","🇮🇴","🇮🇶","🇮🇷","🇮🇸","🇮🇹","🇯🇪","🇯🇲","🇯🇴","🇯🇵","🇰🇪","🇰🇬","🇰🇭","🇰🇮","🇰🇲","🇰🇳","🇰🇵","🇰🇷","🇰🇼","🇰🇾","🇰🇿","🇱🇦","🇱🇧","🇱🇨","🇱🇮","🇱🇰","🇱🇷","🇱🇸","🇱🇹","🇱🇺","🇱🇻","🇱🇾","🇲🇦","🇲🇨","🇲🇩","🇲🇪","🇲🇫","🇲🇬","🇲🇭","🇲🇰","🇲🇱","🇲🇲","🇲🇳","🇲🇴","🇲🇵","🇲🇶","🇲🇷","🇲🇸","🇲🇹","🇲🇺","🇲🇻","🇲🇼","🇲🇽","🇲🇾","🇲🇿","🇳🇦","🇳🇨","🇳🇪","🇳🇫","🇳🇬","🇳🇮","🇳🇱","🇳🇴","🇳🇵","🇳🇷","🇳🇺","🇳🇿","🇴🇲","🇵🇦","🇵🇪","🇵🇫","🇵🇬","🇵🇭","🇵🇰","🇵🇱","🇵🇲","🇵🇳","🇵🇷","🇵🇸","🇵🇹","🇵🇼","🇵🇾","🇶🇦","🇷🇪","🇷🇴","🇷🇸","🇷🇺","🇷🇼","🇸🇦","🇸🇧","🇸🇨","🇸🇩","🇸🇪","🇸🇬","🇸🇭","🇸🇮","🇸🇯","🇸🇰","🇸🇱","🇸🇲","🇸🇳","🇸🇴","🇸🇷","🇸🇸","🇸🇹","🇸🇻","🇸🇽","🇸🇾","🇸🇿","🇹🇦","🇹🇨","🇹🇩","🇹🇫","🇹🇬","🇹🇭","🇹🇯","🇹🇰","🇹🇱","🇹🇲","🇹🇳","🇹🇴","🇹🇷","🇹🇹","🇹🇻","🇹🇼","🇹🇿","🇺🇦","🇺🇬","🇺🇲","🇺🇸","🇺🇾","🇺🇿","🇻🇦","🇻🇨","🇻🇪","🇻🇬","🇻🇮","🇻🇳","🇻🇺","🇼🇫","🇼🇸","🇽🇰","🇾🇪","🇾🇹","🇿🇦","🇿🇲","🇿🇼"]'); pref('services.sync.prefs.sync.zen.workspaces.icons', true); pref('services.sync.engine.workspaces', false); @@ -173,18 +191,46 @@ pref('zen.essentials.enabled', true); pref('zen.workspaces.container-specific-essentials-enabled', false); // Zen Watermark +#ifdef MOZILLA_OFFICIAL pref('zen.watermark.enabled', true, sticky); - -// Smooth scrolling -pref('apz.overscroll.enabled', true); // not DEFAULT on Linux -pref('general.smoothScroll', true); // DEFAULT +#else +pref('zen.watermark.enabled', false, sticky); +#endif // Privacy pref('dom.private-attribution.submission.enabled', false); pref('dom.security.https_only_mode', true); +// Enable EME pref('media.eme.enabled', true); +// Crash reports +pref("breakpad.reportURL", ""); +pref("browser.tabs.crashReporting.sendReport", false); +pref("browser.crashReports.unsubmittedCheck.autoSubmit2", false); + +// TLS / SSL +pref("security.ssl.treat_unsafe_negotiation_as_broken", true); +pref("browser.xul.error_pages.expert_bad_cert", true); +pref("security.tls.enable_0rtt_data", false); +pref("network.http.http3.enable_0rtt", false); + +// Media +pref("media.memory_cache_max_size", 1048576); +pref("media.cache_readahead_limit", 9000); +pref("media.cache_resume_threshold", 3600); +pref("media.memory_caches_combined_limit_kb", 2560000); + +// Image decoding +pref("image.mem.decode_bytes_at_a_time", 32768); + +// Network +pref("network.http.max-urgent-start-excessive-connections-per-host", 5); +pref("network.dnsCacheExpiration", 3600); +pref("network.http.max-persistent-connections-per-proxy", 48); // default=32 +pref("network.websocket.max-connections", 400); // default=200 +pref("network.ssl_tokens_cache_capacity", 32768); + // Enable importers for other browsers pref('browser.migrate.vivaldi.enabled', true); pref('browser.migrate.opera-gx.enabled', true); @@ -194,21 +240,64 @@ pref('browser.migrate.opera.enabled', true); // pref('network.trr.mode', 5); // security: They must enable this themselves, to avoid people downloading malware -//pref('xpinstall.signatures.required', false); +pref('xpinstall.signatures.required', false); // Experimental Zen Features // Strategy to use for bytecode cache (Thanks https://github.com/gunir) pref('dom.script_loader.bytecode_cache.strategy', 2); pref("dom.text_fragments.enabled", true); +pref("layout.css.grid-template-masonry-value.enabled", true); +pref("dom.security.sanitizer.enabled", true); + +// Pocket +pref("extensions.pocket.enabled", false); + +// MIXED CONTENT + CROSS-SITE +pref("pdfjs.enableScripting", false); +pref("extensions.postDownloadThirdPartyPrompt", false); + +// Downloads +pref("browser.download.always_ask_before_handling_new_types", true); +pref("browser.download.manager.addToRecentDocs", false); + +// Tracking protection +pref("urlclassifier.trackingSkipURLs", "*.reddit.com, *.x.com, *.twimg.com, *.tiktok.com"); +pref("urlclassifier.features.socialtracking.skipURLs", "*.instagram.com, *.x.com, *.twimg.com"); +pref("network.cookie.sameSite.noneRequiresSecure", true); +pref("browser.helperApps.deleteTempFileOnExit", true); +pref("browser.uitour.enabled", false); + +// Disable cache for private browsing +pref("browser.privatebrowsing.forceMediaMemoryCache", true); + // Enable private suggestions pref('browser.search.suggest.enabled', true); pref('browser.search.suggest.enabled.private', true); pref("extensions.enabledScopes", 5); // [HIDDEN PREF] -// Enable JXL support -pref('image.jxl.enabled', true); +// Media codecs +pref('image.jxl.enabled', true, locked); +pref("svg.context-properties.content.enabled", true); +pref("image.avif.enabled", true, locked); + +// Smooth scrolling +#ifndef XP_MACOSX +pref("apz.overscroll.enabled", true); +pref("general.smoothScroll", true); +pref("general.smoothScroll.msdPhysics.enabled", true); +pref("general.smoothScroll.currentVelocityWeighting", "0.15"); +pref("general.smoothScroll.stopDecelerationWeighting", "0.6"); +pref("mousewheel.min_line_scroll_amount", 10); +pref("general.smoothScroll.mouseWheel.durationMinMS", 80); +pref("general.smoothScroll.msdPhysics.continuousMotionMaxDeltaMS", 12); +pref("general.smoothScroll.msdPhysics.motionBeginSpringConstant", 600); +pref("general.smoothScroll.msdPhysics.regularSpringConstant", 650); +pref("general.smoothScroll.msdPhysics.slowdownMinDeltaMS", 25); +pref("general.smoothScroll.msdPhysics.slowdownSpringConstant", 250); +pref("mousewheel.default.delta_multiplier_y", 200); +#endif #if defined(XP_WIN) pref("dom.ipc.processPriorityManager.backgroundUsesEcoQoS", false); @@ -217,15 +306,9 @@ pref('image.jxl.enabled', true); pref('browser.sessionstore.restore_pinned_tabs_on_demand', true); pref('browser.newtabpage.activity-stream.system.showWeather', true); -pref("browser.toolbars.bookmarks.visibility", "never"); - -// Enable experimental settings page (Usef for Zen Labs) +// Enable experimental settings page (Used for Zen Labs) pref('browser.preferences.experimental', true); -#include better-fox.js - -// Betterfox overrides (Stay below the include directive) - // Jang's personal speedups (Thanks to Jang for these!) // Prefetching: @@ -263,7 +346,7 @@ pref("media.hardware-video-decoding.enabled", true); pref("layers.gpu-process.enabled", true); // VAAPI/FFMPEG is Linux only -#ifdef XP_UNIX +#ifdef UNIX_BUT_NOT_MAC pref('media.ffmpeg.vaapi.enabled', true); pref('media.ffmpeg.encoder.enabled', true); #endif @@ -281,3 +364,58 @@ pref('browser.download.autohideButton', false); #ifdef XP_MACOSX pref('widget.macos.titlebar-blend-mode.behind-window', true); #endif + +// Urlbar and autocomplete +pref("browser.urlbar.maxRichResults", 6); +pref("browser.urlbar.trimHttps", true); +pref("browser.search.separatePrivateDefault.ui.enabled", true); +pref("browser.urlbar.update2.engineAliasRefresh", true); +pref("browser.search.suggest.enabled", false); +pref("browser.urlbar.quicksuggest.enabled", false); +pref("browser.urlbar.suggest.quicksuggest.sponsored", false); +pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false); +pref("browser.urlbar.groupLabels.enabled", false); +pref("browser.formfill.enable", false); +pref("security.insecure_connection_text.enabled", true); +pref("security.insecure_connection_text.pbmode.enabled", true); +pref("network.IDN_show_punycode", true); + +// Telemetry +pref("datareporting.policy.dataSubmissionEnabled", false, locked); +pref("datareporting.healthreport.uploadEnabled", false, locked); +pref("toolkit.telemetry.unified", false, locked); +pref("toolkit.telemetry.enabled", false, locked); +pref("toolkit.telemetry.server", "data:,", locked); +pref("toolkit.telemetry.archive.enabled", false, locked); +pref("toolkit.telemetry.newProfilePing.enabled", false, locked); +pref("toolkit.telemetry.shutdownPingSender.enabled", false, locked); +pref("toolkit.telemetry.updatePing.enabled", false, locked); +pref("toolkit.telemetry.bhrPing.enabled", false, locked); +pref("toolkit.telemetry.firstShutdownPing.enabled", false, locked); +pref("toolkit.telemetry.coverage.opt-out", true, locked); +pref("toolkit.coverage.opt-out", true, locked); +pref("toolkit.coverage.endpoint.base", "", locked); +pref("browser.newtabpage.activity-stream.feeds.telemetry", false, locked); +pref("browser.newtabpage.activity-stream.telemetry", false, locked); +pref("browser.ping-centre.telemetry", false); +pref("browser.attribution.enabled", false); +pref("toolkit.telemetry.pioneer-new-studies-available", false); +pref("app.shield.optoutstudies.enabled", false, locked); +pref("app.normandy.enabled", false, locked); +pref("app.normandy.api_url", "", locked); + +// Fullscreen notice +pref("full-screen-api.transition-duration.enter", "0 0"); +pref("full-screen-api.transition-duration.leave", "0 0"); +pref("full-screen-api.warning.delay", -1); +pref("full-screen-api.warning.timeout", 0); + +// Common UI changes +pref("browser.privatebrowsing.vpnpromourl", "", locked); +pref("extensions.getAddons.showPane", false); +pref("extensions.htmlaboutaddons.recommendations.enabled", false); +pref("browser.discovery.enabled", false); +pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons", false); +pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features", false); +pref("browser.preferences.moreFromMozilla", false, locked); +pref("browser.aboutwelcome.enabled", false); diff --git a/src/browser/base/content/ZenCustomizableUI.sys.mjs b/src/browser/base/content/ZenCustomizableUI.sys.mjs index 39a66a713..8b5dbe93b 100644 --- a/src/browser/base/content/ZenCustomizableUI.sys.mjs +++ b/src/browser/base/content/ZenCustomizableUI.sys.mjs @@ -9,7 +9,7 @@ export var ZenCustomizableUI = new (class { 'zen-sidebar-top-buttons', { type: this.TYPE_TOOLBAR, - defaultPlacements: ['preferences-button', 'zen-sidepanel-button'], + defaultPlacements: ['zen-sidepanel-button'], defaultCollapsed: null, }, true diff --git a/src/browser/base/content/ZenStartup.mjs b/src/browser/base/content/ZenStartup.mjs index ef86aebfc..dba3fe7d9 100644 --- a/src/browser/base/content/ZenStartup.mjs +++ b/src/browser/base/content/ZenStartup.mjs @@ -2,7 +2,6 @@ const lazy = {}; var ZenStartup = { init() { - this.logHeader(); this.openWatermark(); window.SessionStore.promiseInitialized.then(() => { this._changeSidebarLocation(); @@ -27,9 +26,12 @@ } // Fix notification deck - document - .getElementById('zen-appcontent-navbar-container') - .appendChild(document.getElementById('tab-notification-deck-template')); + const deckTemplate = document.getElementById('tab-notification-deck-template'); + if (deckTemplate) { + document + .getElementById('zen-appcontent-navbar-container') + .appendChild(deckTemplate); + } // Disable smooth scroll gBrowser.tabContainer.arrowScrollbox.smoothScroll = false; @@ -104,21 +106,6 @@ gURLBar._initPasteAndGo(); gURLBar._initStripOnShare(); }, - - logHeader() { - console.info(` - - Welcome to Zen Browser! - - If you are seeing this message, it means that you have successfully opened Zen's developer console. - Here you can see all the logs and errors that Zen is generating. - - If you have any questions or need help, please contact us in any media in https://zen-browser.app/ - - Note: This developer console is not the same as the browser console, it has access to Zen's internal functions and variables, including your passwords and other sensitive information. Please do not paste any code here unless you know what you are doing. - - `); - }, }; ZenStartup.init(); diff --git a/src/browser/base/content/ZenUIManager.mjs b/src/browser/base/content/ZenUIManager.mjs index 32c8f406f..594d4778f 100644 --- a/src/browser/base/content/ZenUIManager.mjs +++ b/src/browser/base/content/ZenUIManager.mjs @@ -117,23 +117,33 @@ var gZenUIManager = { var gZenVerticalTabsManager = { init() { + this._multiWindowFeature = new ZenMultiWindowFeature(); + ChromeUtils.defineLazyGetter(this, 'isWindowsStyledButtons', () => { - return !(window.AppConstants.platform === 'macosx' || window.matchMedia('(-moz-gtk-csd-reversed-placement)').matches); + return !(window.AppConstants.platform === 'macosx' || window.matchMedia('(-moz-gtk-csd-reversed-placement)').matches + || Services.prefs.getBoolPref('zen.view.experimental-force-window-controls-left')); + }); + + ChromeUtils.defineLazyGetter(this, 'hidesTabsToolbar', () => { + return ( + document.documentElement.getAttribute('chromehidden').includes('toolbar') || + document.documentElement.getAttribute('chromehidden').includes('menubar') + ); }); var updateEvent = this._updateEvent.bind(this); - Services.prefs.addObserver('zen.tabs.vertical', updateEvent); - Services.prefs.addObserver('zen.tabs.vertical.right-side', updateEvent); - Services.prefs.addObserver('zen.view.sidebar-expanded.max-width', updateEvent); - Services.prefs.addObserver('zen.view.use-single-toolbar', updateEvent); - Services.prefs.addObserver('zen.view.sidebar-expanded', updateEvent); + this.initializePreferences(updateEvent); this._toolbarOriginalParent = document.getElementById('nav-bar').parentElement; gZenCompactModeManager.addEventListener(updateEvent); - this._updateEvent(); this.initRightSideOrderContextMenu(); + window.addEventListener('customizationstarting', this._preCustomize.bind(this)); + window.addEventListener('aftercustomization', this._postCustomize.bind(this)); + + window.addEventListener('DOMContentLoaded', updateEvent, { once: true }); + const tabs = document.getElementById('tabbrowser-tabs'); XPCOMUtils.defineLazyPreferenceGetter(this, 'canOpenTabOnMiddleClick', 'zen.tabs.newtab-on-middle-click', true); @@ -194,149 +204,245 @@ var gZenVerticalTabsManager = { get actualWindowButtons() { // we have multiple ".titlebar-buttonbox-container" in the DOM, because of the titlebar if (!this.__actualWindowButtons) { - this.__actualWindowButtons = document.querySelector('#nav-bar .titlebar-buttonbox-container'); + this.__actualWindowButtons = (!this.isWindowsStyledButtons) ? + document.querySelector('.titlebar-buttonbox-container') : // TODO: test if it works 100% of the time + document.querySelector('#nav-bar .titlebar-buttonbox-container'); } return this.__actualWindowButtons; }, - _updateEvent() { + async _preCustomize() { + await this._multiWindowFeature.foreachWindowAsActive(async (browser) => { + browser.gZenVerticalTabsManager._updateEvent({ forceMultipleToolbar: true, dontRebuildAreas: true }); + }); + this.rebuildAreas(); + this.navigatorToolbox.setAttribute('zen-sidebar-expanded', 'true'); + document.documentElement.setAttribute('zen-sidebar-expanded', 'true'); // force expanded sidebar + }, + + _postCustomize() { + // No need to use `await` here, because the customization is already done + this._multiWindowFeature.foreachWindowAsActive(async (browser) => { + browser.gZenVerticalTabsManager._updateEvent({ dontRebuildAreas: true }); + }); + }, + + initializePreferences(updateEvent) { + XPCOMUtils.defineLazyPreferenceGetter( + this, + "_prefsCompactMode", + "zen.view.compact", + false + // no need to update the event, it's handled by the compact mode manager + ); + + XPCOMUtils.defineLazyPreferenceGetter( + this, + "_prefsVerticalTabs", + "zen.tabs.vertical", + true, + updateEvent + ); + XPCOMUtils.defineLazyPreferenceGetter( + this, + "_prefsRightSide", + "zen.tabs.vertical.right-side", + false, + updateEvent + ); + XPCOMUtils.defineLazyPreferenceGetter( + this, + "_prefsUseSingleToolbar", + "zen.view.use-single-toolbar", + false, + updateEvent + ); + XPCOMUtils.defineLazyPreferenceGetter( + this, + "_prefsSidebarExpanded", + "zen.view.sidebar-expanded", + false, + updateEvent + ); + XPCOMUtils.defineLazyPreferenceGetter( + this, + "_prefsSidebarExpandedMaxWidth", + "zen.view.sidebar-expanded.max-width", + 300, + updateEvent + ); + }, + + _updateEvent({ forceMultipleToolbar = false, dontRebuildAreas = false } = {}) { if (this._isUpdating) { return; } this._isUpdating = true; - this._updateMaxWidth(); - const topButtons = document.getElementById('zen-sidebar-top-buttons'); - const isCompactMode = Services.prefs.getBoolPref('zen.view.compact'); - const isVerticalTabs = Services.prefs.getBoolPref('zen.tabs.vertical'); - const isSidebarExpanded = Services.prefs.getBoolPref('zen.view.sidebar-expanded') || !isVerticalTabs; - const isRightSide = Services.prefs.getBoolPref('zen.tabs.vertical.right-side') && isVerticalTabs; - const isSingleToolbar = (Services.prefs.getBoolPref('zen.view.use-single-toolbar') && (isVerticalTabs && isSidebarExpanded) )|| !isVerticalTabs; - const titlebar = document.getElementById('titlebar'); + try { + this._updateMaxWidth(); + const topButtons = document.getElementById('zen-sidebar-top-buttons'); + const isCompactMode = this._prefsCompactMode; + const isVerticalTabs = this._prefsVerticalTabs || forceMultipleToolbar; + const isSidebarExpanded = this._prefsSidebarExpanded || !isVerticalTabs; + const isRightSide = this._prefsRightSide && isVerticalTabs; + const isSingleToolbar = ((this._prefsUseSingleToolbar && (isVerticalTabs && isSidebarExpanded) )|| !isVerticalTabs) && !forceMultipleToolbar && !this.hidesTabsToolbar; + const titlebar = document.getElementById('titlebar'); - gBrowser.tabContainer.setAttribute('orient', isVerticalTabs ? 'vertical' : 'vertical'); - gBrowser.tabContainer.arrowScrollbox.setAttribute('orient', isVerticalTabs ? 'vertical' : 'horizontal'); + gBrowser.tabContainer.setAttribute('orient', isVerticalTabs ? 'vertical' : 'horizontal'); + gBrowser.tabContainer.arrowScrollbox.setAttribute('orient', isVerticalTabs ? 'vertical' : 'horizontal'); - const buttonsTarget = document.getElementById('zen-sidebar-top-buttons-customization-target'); - if (isRightSide) { - this.navigatorToolbox.setAttribute('zen-right-side', 'true'); - document.documentElement.setAttribute('zen-right-side', 'true'); - } else { - this.navigatorToolbox.removeAttribute('zen-right-side'); - document.documentElement.removeAttribute('zen-right-side'); - } - - if (isSidebarExpanded) { - this.navigatorToolbox.setAttribute('zen-sidebar-expanded', 'true'); - } else { - this.navigatorToolbox.removeAttribute('zen-sidebar-expanded'); - } - - const appContentNavbarContaienr = document.getElementById('zen-appcontent-navbar-container'); - if ((!isRightSide && this.isWindowsStyledButtons) || (isRightSide && !this.isWindowsStyledButtons) || isCompactMode) { - appContentNavbarContaienr.setAttribute('should-hide', 'true'); - } else { - appContentNavbarContaienr.removeAttribute('should-hide'); - } - - // Check if the sidebar is in hover mode - if ( - !this.navigatorToolbox.hasAttribute('zen-right-side') && - !isCompactMode - ) { - this.navigatorToolbox.prepend(topButtons); - // browser.prepend(this.navigatorToolbox); - } else { - // customizationTarget.prepend(topButtons); - // tabboxWrapper.prepend(this.navigatorToolbox); - } - - //if (!isVerticalTabs) { - // document.getElementById("urlbar-container").after(document.getElementById('navigator-toolbox')); - //} - - let windowButtons = this.actualWindowButtons; - let doNotChangeWindowButtons = !isCompactMode && isRightSide && this.isWindowsStyledButtons; - const navBar = document.getElementById('nav-bar'); - - if (isSingleToolbar) { - this._navbarParent = navBar.parentElement; - let elements = document.querySelectorAll('#nav-bar-customization-target > *:is(toolbarbutton, #stop-reload-button)'); - elements = Array.from(elements); - // Add separator if it doesn't exist - if (!buttonsTarget.contains(this._topButtonsSeparatorElement)) { - buttonsTarget.append(this._topButtonsSeparatorElement); - } - for (const button of elements) { - button.setAttribute('zen-single-toolbar', 'true'); - buttonsTarget.append(button); - } - buttonsTarget.prepend(document.getElementById('unified-extensions-button')); - buttonsTarget.prepend(document.getElementById('PanelUI-button')); - if (this.isWindowsStyledButtons && !doNotChangeWindowButtons) { - document.getElementById('zen-appcontent-navbar-container').append(windowButtons); - } - if (isCompactMode) { - titlebar.prepend(navBar); - titlebar.prepend(topButtons); + const buttonsTarget = document.getElementById('zen-sidebar-top-buttons-customization-target'); + if (isRightSide) { + this.navigatorToolbox.setAttribute('zen-right-side', 'true'); + document.documentElement.setAttribute('zen-right-side', 'true'); } else { - titlebar.before(topButtons); - titlebar.before(navBar); + this.navigatorToolbox.removeAttribute('zen-right-side'); + document.documentElement.removeAttribute('zen-right-side'); } - document.documentElement.setAttribute("zen-single-toolbar", true); - this._hasSetSingleToolbar = true; - } else if (this._hasSetSingleToolbar) { - this._hasSetSingleToolbar = false; - // Do the opposite - this._navbarParent.prepend(navBar); - const elements = document.querySelectorAll('#zen-sidebar-top-buttons-customization-target > *:is(toolbarbutton, #stop-reload-button)'); - for (const button of elements) { - if (button.hasAttribute('zen-single-toolbar')) { - button.removeAttribute('zen-single-toolbar'); + + if (isSidebarExpanded) { + this.navigatorToolbox.setAttribute('zen-sidebar-expanded', 'true'); + document.documentElement.setAttribute('zen-sidebar-expanded', 'true'); + } else { + this.navigatorToolbox.removeAttribute('zen-sidebar-expanded'); + document.documentElement.removeAttribute('zen-sidebar-expanded'); + } + + const appContentNavbarContaienr = document.getElementById('zen-appcontent-navbar-container'); + let shouldHide = false; + if (((!isRightSide && this.isWindowsStyledButtons) || (isRightSide && !this.isWindowsStyledButtons) + || ( + isCompactMode && isSingleToolbar && this.isWindowsStyledButtons + )) && isSingleToolbar) { + appContentNavbarContaienr.setAttribute('should-hide', 'true'); + shouldHide = true; + } else { + appContentNavbarContaienr.removeAttribute('should-hide'); + } + + // Check if the sidebar is in hover mode + if ( + !this.navigatorToolbox.hasAttribute('zen-right-side') && + !isCompactMode + ) { + this.navigatorToolbox.prepend(topButtons); + } + + let windowButtons = this.actualWindowButtons; + let doNotChangeWindowButtons = !isCompactMode && isRightSide && this.isWindowsStyledButtons; + const navBar = document.getElementById('nav-bar'); + + if (isSingleToolbar) { + this._navbarParent = navBar.parentElement; + let elements = document.querySelectorAll('#nav-bar-customization-target > :is([cui-areatype="toolbar"], .chromeclass-toolbar-additional):not(#urlbar-container)'); + elements = Array.from(elements).reverse(); + // Add separator if it doesn't exist + if (!buttonsTarget.contains(this._topButtonsSeparatorElement)) { + buttonsTarget.append(this._topButtonsSeparatorElement); + } + for (const button of elements) { + this._topButtonsSeparatorElement.after(button); + } + buttonsTarget.prepend(document.getElementById('unified-extensions-button')); + buttonsTarget.prepend(document.getElementById('PanelUI-button')); + if (this.isWindowsStyledButtons && !doNotChangeWindowButtons) { + appContentNavbarContaienr.append(windowButtons); + } + if (isCompactMode) { + titlebar.prepend(navBar); + titlebar.prepend(topButtons); + } else { + titlebar.before(topButtons); + titlebar.before(navBar); + } + document.documentElement.setAttribute("zen-single-toolbar", true); + this._hasSetSingleToolbar = true; + } else if (this._hasSetSingleToolbar) { + this._hasSetSingleToolbar = false; + // Do the opposite + this._navbarParent.prepend(navBar); + const elements = document.querySelectorAll('#zen-sidebar-top-buttons-customization-target > :is([cui-areatype="toolbar"], .chromeclass-toolbar-additional)'); + for (const button of elements) { document.getElementById('nav-bar-customization-target').append(button); } - } - document.documentElement.removeAttribute("zen-single-toolbar"); - navBar.appendChild(document.getElementById('PanelUI-button')); - this._toolbarOriginalParent.prepend(navBar); - CustomizableUI.zenInternalCU._rebuildRegisteredAreas(); - } - - if (isCompactMode) { - titlebar.prepend(topButtons); - } else { - titlebar.before(topButtons); - } - - if (doNotChangeWindowButtons) { - document.getElementById("zen-sidebar-top-buttons-customization-target").appendChild(windowButtons); - } else if (!isSingleToolbar && !isCompactMode) { - if (this.isWindowsStyledButtons) { - if (isRightSide) { - document.getElementById('zen-appcontent-navbar-container').append(windowButtons); - } else { - navBar.append(windowButtons); + this._topButtonsSeparatorElement.remove(); + document.documentElement.removeAttribute("zen-single-toolbar"); + navBar.appendChild(document.getElementById('PanelUI-button')); + this._toolbarOriginalParent.prepend(navBar); + if (!dontRebuildAreas) { + this.rebuildAreas(); } + } + + if (isCompactMode) { + titlebar.prepend(topButtons); } else { - if (isRightSide) { - document.getElementById('zen-appcontent-navbar-container').appendChild(windowButtons); + if (isSidebarExpanded) { + titlebar.before(topButtons); } else { + titlebar.prepend(topButtons); + } + } + + // Case: single toolbar, not compact mode, not right side and macos styled buttons + if (!doNotChangeWindowButtons && isSingleToolbar && !isCompactMode && !isRightSide && !this.isWindowsStyledButtons) { + topButtons.prepend(windowButtons); + } + // Case: single toolbar, compact mode, right side and windows styled buttons + if (isSingleToolbar && isCompactMode && isRightSide && this.isWindowsStyledButtons) { + topButtons.prepend(windowButtons); + } + + if (doNotChangeWindowButtons) { + if (isRightSide && !isSidebarExpanded) { + navBar.appendChild(windowButtons); + } else { + document.getElementById("zen-sidebar-top-buttons-customization-target").appendChild(windowButtons); + } + } else if (!isSingleToolbar && !isCompactMode) { + if (this.isWindowsStyledButtons) { + if (isRightSide) { + appContentNavbarContaienr.append(windowButtons); + } else { + navBar.append(windowButtons); + } + } else { // not windows styled buttons + if (isRightSide || !isSidebarExpanded) { + navBar.prepend(windowButtons); + } else { + topButtons.prepend(windowButtons); + } + } + } else if (!isSingleToolbar && isCompactMode) { + navBar.appendChild(windowButtons); + } else if (isSingleToolbar && isCompactMode) { + if (!isRightSide && !this.isWindowsStyledButtons) { topButtons.prepend(windowButtons); } } - } else if (!isSingleToolbar && isCompactMode) { - navBar.appendChild(windowButtons); - } - // Always move the splitter next to the sidebar - this.navigatorToolbox.after(document.getElementById('zen-sidebar-splitter')); + if (shouldHide) { + appContentNavbarContaienr.append(windowButtons); + } + + gZenCompactModeManager.updateCompactModeContext(isSingleToolbar); + + // Always move the splitter next to the sidebar + this.navigatorToolbox.after(document.getElementById('zen-sidebar-splitter')); + } catch (e) { + console.error(e); + } this._isUpdating = false; }, + rebuildAreas() { + CustomizableUI.zenInternalCU._rebuildRegisteredAreas(/* zenDontRebuildCollapsed */ true); + }, + _updateMaxWidth() { - const isCompactMode = Services.prefs.getBoolPref('zen.view.compact'); const maxWidth = Services.prefs.getIntPref('zen.view.sidebar-expanded.max-width'); const toolbox = document.getElementById('navigator-toolbox'); - if (!isCompactMode) { + if (!this._prefsCompactMode) { toolbox.style.maxWidth = `${maxWidth}px`; } else { toolbox.style.removeProperty('maxWidth'); diff --git a/src/browser/base/content/browser-addons-js.patch b/src/browser/base/content/browser-addons-js.patch new file mode 100644 index 000000000..8313c2f3e --- /dev/null +++ b/src/browser/base/content/browser-addons-js.patch @@ -0,0 +1,17 @@ +diff --git a/browser/base/content/browser-addons.js b/browser/base/content/browser-addons.js +index 992d07daaef1abc4554a43aa654888f66963c575..6db4dd3864375da4b83a3a6f1a656403f324093e 100644 +--- a/browser/base/content/browser-addons.js ++++ b/browser/base/content/browser-addons.js +@@ -2113,10 +2113,12 @@ var gUnifiedExtensions = { + ? CustomizableUI.AREA_NAVBAR + : CustomizableUI.AREA_ADDONS; + let newPosition = shouldPinToToolbar ? undefined : 0; ++ for (const window of CustomizableUI.windows) window.gZenVerticalTabsManager._preCustomize(); + + CustomizableUI.addWidgetToArea(widgetId, newArea, newPosition); + + this.updateAttention(); ++ for (const window of CustomizableUI.windows) window.gZenVerticalTabsManager._updateEvent(); + }, + + async moveWidget(menu, direction) { diff --git a/src/browser/base/content/zen-assets.inc.xhtml b/src/browser/base/content/zen-assets.inc.xhtml index f7f430d06..0712bbac4 100644 --- a/src/browser/base/content/zen-assets.inc.xhtml +++ b/src/browser/base/content/zen-assets.inc.xhtml @@ -37,8 +37,6 @@ - - diff --git a/src/browser/base/content/zen-assets.jar.inc.mn b/src/browser/base/content/zen-assets.jar.inc.mn index 2aa1b9bf5..7756c5659 100644 --- a/src/browser/base/content/zen-assets.jar.inc.mn +++ b/src/browser/base/content/zen-assets.jar.inc.mn @@ -43,7 +43,8 @@ content/browser/zen-styles/zen-popup.css (content/zen-styles/zen-popup.css) content/browser/zen-styles/zen-sidebar-panels.css (content/zen-styles/zen-sidebar-panels.css) content/browser/zen-styles/zen-gradient-generator.css (content/zen-styles/zen-gradient-generator.css) - + content/browser/zen-styles/zen-branding.css (content/zen-styles/zen-branding.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) content/browser/zen-styles/zen-panels/print.css (content/zen-styles/zen-panels/print.css) @@ -54,9 +55,16 @@ # Images content/browser/zen-images/gradient.png (content/zen-images/gradient.png) content/browser/zen-images/gradient-display.png (content/zen-images/gradient-display.png) + content/browser/zen-images/layouts/collapsed.png (content/zen-images/layouts/collapsed.png) + 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) # Actors content/browser/zen-components/actors/ZenThemeMarketplaceParent.sys.mjs (zen-components/actors/ZenThemeMarketplaceParent.sys.mjs) content/browser/zen-components/actors/ZenThemeMarketplaceChild.sys.mjs (zen-components/actors/ZenThemeMarketplaceChild.sys.mjs) content/browser/zen-components/actors/ZenGlanceChild.sys.mjs (zen-components/actors/ZenGlanceChild.sys.mjs) content/browser/zen-components/actors/ZenGlanceParent.sys.mjs (zen-components/actors/ZenGlanceParent.sys.mjs) + + # Fonts + content/browser/zen-fonts/JunicodeVF-Italic.woff2 (content/zen-fonts/JunicodeVF-Italic.woff2) + content/browser/zen-fonts/JunicodeVF-Roman.woff2 (content/zen-fonts/JunicodeVF-Roman.woff2) diff --git a/src/browser/base/content/zen-fonts/JunicodeVF-Italic.woff2 b/src/browser/base/content/zen-fonts/JunicodeVF-Italic.woff2 new file mode 100644 index 000000000..69ffb1722 Binary files /dev/null and b/src/browser/base/content/zen-fonts/JunicodeVF-Italic.woff2 differ diff --git a/src/browser/base/content/zen-fonts/JunicodeVF-Roman.woff2 b/src/browser/base/content/zen-fonts/JunicodeVF-Roman.woff2 new file mode 100644 index 000000000..7e09ffc63 Binary files /dev/null and b/src/browser/base/content/zen-fonts/JunicodeVF-Roman.woff2 differ diff --git a/src/browser/base/content/zen-images/layouts/collapsed.png b/src/browser/base/content/zen-images/layouts/collapsed.png new file mode 100644 index 000000000..a971725e3 Binary files /dev/null and b/src/browser/base/content/zen-images/layouts/collapsed.png differ diff --git a/src/browser/base/content/zen-images/layouts/multiple-toolbar.png b/src/browser/base/content/zen-images/layouts/multiple-toolbar.png new file mode 100644 index 000000000..3fc9de94a Binary files /dev/null and b/src/browser/base/content/zen-images/layouts/multiple-toolbar.png differ diff --git a/src/browser/base/content/zen-images/layouts/single-toolbar.png b/src/browser/base/content/zen-images/layouts/single-toolbar.png new file mode 100644 index 000000000..0c09f5c7f Binary files /dev/null and b/src/browser/base/content/zen-images/layouts/single-toolbar.png differ diff --git a/src/browser/base/content/zen-popupset.inc.xhtml b/src/browser/base/content/zen-popupset.inc.xhtml index e15076159..8c230dacc 100644 --- a/src/browser/base/content/zen-popupset.inc.xhtml +++ b/src/browser/base/content/zen-popupset.inc.xhtml @@ -145,10 +145,7 @@ - - - - + diff --git a/src/browser/base/content/zen-preloaded.inc.xhtml b/src/browser/base/content/zen-preloaded.inc.xhtml index 1d62896b4..5dc760dba 100644 --- a/src/browser/base/content/zen-preloaded.inc.xhtml +++ b/src/browser/base/content/zen-preloaded.inc.xhtml @@ -4,4 +4,6 @@ \ No newline at end of file + Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspacesSync.mjs", this); + Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspacesStorage.mjs", this); + diff --git a/src/browser/base/content/zen-styles/zen-animations.css b/src/browser/base/content/zen-styles/zen-animations.css index e4dffa8eb..43b836a33 100644 --- a/src/browser/base/content/zen-styles/zen-animations.css +++ b/src/browser/base/content/zen-styles/zen-animations.css @@ -25,6 +25,21 @@ } } +@keyframes zen-new-tab-appear-vertical { + 0% { + opacity: 0; + transform: translateY(-25px); + } + 60% { + opacity: 0.8 ; + transform: translateY(4px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + @keyframes zen-main-app-wrapper-animation { from { opacity: 1; @@ -298,7 +313,7 @@ top: 50%; left: 50%; opacity: 1; - transform: translate(-50%, -50%); + transform: translate(-50%, -50%); } } diff --git a/src/browser/base/content/zen-styles/zen-branding.css b/src/browser/base/content/zen-styles/zen-branding.css new file mode 100644 index 000000000..504287434 --- /dev/null +++ b/src/browser/base/content/zen-styles/zen-branding.css @@ -0,0 +1,24 @@ + +@font-face { + font-family: 'Zen-Junicode'; + src: url('chrome://browser/content/zen-fonts/JunicodeVF-Roman.woff2') format('woff2'); +} + +@font-face { + font-family: 'Zen-Junicode-Italic'; + src: url('chrome://browser/content/zen-fonts/JunicodeVF-Italic.woff2') format('woff2'); +} + +.zen-branding-title { + font-size: 6rem; + line-height: 0.9; + margin-bottom: 0.4rem; + font-family: 'Zen-Junicode', serif; + font-weight: 400; + font-style: normal; + font-feature-settings: 'swsh' 1; + + & .zen-branding-title-italic { + font-family: "Zen-Junicode-Italic", serif; + } +} diff --git a/src/browser/base/content/zen-styles/zen-browser-container.css b/src/browser/base/content/zen-styles/zen-browser-container.css index db20ccc83..7067a674d 100644 --- a/src/browser/base/content/zen-styles/zen-browser-container.css +++ b/src/browser/base/content/zen-styles/zen-browser-container.css @@ -12,7 +12,6 @@ margin: 1px; :root[zen-right-side='true'] & { - margin-right: 0; margin-left: var(--zen-element-separation); } @@ -20,4 +19,12 @@ border-radius: 0 !important; } } + + @media (-moz-bool-pref: 'zen.view.experimental-rounded-view') { + #tabbrowser-tabpanels { + mix-blend-mode: multiply; + -moz-osx-font-smoothing: grayscale; + isolation: isolate; + } + } } diff --git a/src/browser/base/content/zen-styles/zen-browser-ui.css b/src/browser/base/content/zen-styles/zen-browser-ui.css index 55349367c..a8212c087 100644 --- a/src/browser/base/content/zen-styles/zen-browser-ui.css +++ b/src/browser/base/content/zen-styles/zen-browser-ui.css @@ -9,6 +9,11 @@ --inactive-titlebar-opacity: 1; } +#nav-bar, +#navigator-toolbox { + position: inherit; +} + :root:is([inDOMFullscreen='true'], [chromehidden~='location'], [chromehidden~='toolbar']) { #navigator-toolbox, #zen-sidebar-splitter { @@ -48,6 +53,10 @@ } } +:root:not([zen-single-toolbar='true']) #zen-appcontent-wrapper { + z-index: 2; +} + #zen-main-app-wrapper { background: transparent; overflow: hidden; @@ -74,6 +83,7 @@ #zen-appcontent-wrapper { max-width: 100%; + min-width: 1px; overflow-x: hidden; z-index: 1; } @@ -81,13 +91,20 @@ :root:not([inDOMFullscreen='true']):not([chromehidden~='location']):not([chromehidden~='toolbar']) { & #zen-tabbox-wrapper { margin: var(--zen-element-separation); - margin-left: 0; margin-top: 0; } + &:not([zen-right-side='true']) #zen-tabbox-wrapper { + margin-left: 0; + } + &[zen-right-side='true'] #zen-tabbox-wrapper { margin-right: 0; } + + &:not([zen-no-padding='true']) #zen-tabbox-wrapper { + margin-left: 1px; + } } #tabbrowser-tabbox { diff --git a/src/browser/base/content/zen-styles/zen-buttons.css b/src/browser/base/content/zen-styles/zen-buttons.css index 09b0b168c..986dfcff5 100644 --- a/src/browser/base/content/zen-styles/zen-buttons.css +++ b/src/browser/base/content/zen-styles/zen-buttons.css @@ -18,7 +18,6 @@ xul|button { font-weight: 500 !important; border: 1px solid var(--zen-colors-border); - box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.05) !important; } button:not(#zen-workspaces-button):active { diff --git a/src/browser/base/content/zen-styles/zen-compact-mode.css b/src/browser/base/content/zen-styles/zen-compact-mode.css index c5e6a842b..7386a19a1 100644 --- a/src/browser/base/content/zen-styles/zen-compact-mode.css +++ b/src/browser/base/content/zen-styles/zen-compact-mode.css @@ -2,13 +2,30 @@ @media (-moz-bool-pref: 'zen.view.compact') { :root:not([customizing]):not([inDOMFullscreen='true']) { - @media (-moz-bool-pref: 'zen.view.compact.hide-tabbar') { + #zen-sidebar-top-buttons:has(#zen-sidebar-top-buttons-customization-target:empty) { + max-height: 0 !important; + min-height: 0 !important; + opacity: 0; + overflow: hidden; + pointer-events: none; + } + + @media (-moz-bool-pref: 'zen.view.compact.hide-tabbar') or (-moz-bool-pref: 'zen.view.use-single-toolbar') { #zen-sidebar-web-panel-wrapper:has(#zen-sidebar-web-panel[pinned='true']) { - margin-left: calc(var(--zen-sidebar-web-panel-spacing) * 2) !important; + margin-left: var(--zen-sidebar-web-panel-spacing) !important; + } + + #zen-tabbox-wrapper { + /* Remove extra 1px of margine we have to add to the tabbox */ + margin-left: 0 !important; } #zen-appcontent-wrapper { margin-left: var(--zen-element-separation) !important; + + & #tabbrowser-tabbox { + margin-left: 0 !important; + } } #zen-sidebar-top-buttons-customization-target { @@ -20,35 +37,52 @@ } #navigator-toolbox { - --zen-toolbox-max-width: 54px !important; - --zen-compact-float: calc(var(--zen-element-separation) - 1px); - position: absolute; - z-index: 10; - transition: transform 0.2s ease-in-out, opacity 0.2s ease-in-out; - right: calc(100% - var(--zen-element-separation)); - top: 0; - bottom: var(--zen-element-separation); - opacity: 0; - padding-left: var(--zen-compact-float) !important; - padding-bottom: 0 !important; - padding-top: 0 !important; + --zen-toolbox-max-width: 64px !important; + --zen-compact-float: var(--zen-element-separation); - :root[zen-single-toolbar='true'] & { - top: var(--zen-element-separation); + &:not([animate='true']) { + position: absolute; + z-index: 10; + transition: left 0.25s ease, right 0.25s ease, opacity 1.5s ease; + top: 0; + bottom: var(--zen-element-separation); + opacity: 0; + padding: 0 var(--zen-compact-float) !important; - & #nav-bar { - margin-left: calc(var(--zen-toolbox-padding) / 2) !important; + :root[zen-single-toolbar='true'] & { + top: var(--zen-element-separation); + + & #nav-bar { + margin-left: calc(var(--zen-toolbox-padding) / 2) !important; + } } } + + & #urlbar[open] { + top: 0 !important; + } + } + + &:not([zen-right-side='true']) #navigator-toolbox { + left: calc(-1 * var(--zen-sidebar-width) + var(--zen-element-separation)); + } + + /* When we have multiple toolbars and the top-toolbar is NOT being hidden, + * we need to adjust the top-padding of the toolbox to account for the + * extra toolbar height. */ + @media not (-moz-bool-pref: 'zen.view.compact.hide-toolbar') { + &:not([zen-single-toolbar='true']) #navigator-toolbox:not([animate='true']) { + margin-top: var(--zen-toolbar-height) !important; + } } &[zen-right-side='true'] { & #navigator-toolbox { --zen-compact-float: calc(var(--zen-element-separation) + 1px); - padding-left: unset !important; - padding-right: var(--zen-compact-float) !important; - left: calc(100% - var(--zen-element-separation)); - right: unset; + + &:not([animate='true']) { + right: calc(-1 * var(--zen-sidebar-width) + var(--zen-element-separation)); + } } & .browserSidebarContainer { @@ -57,7 +91,7 @@ } } - #titlebar { + #navigator-toolbox:not([animate='true']) #titlebar { box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.1); border-radius: calc(var(--zen-border-radius) - 2px); padding: var(--zen-toolbox-padding) !important; @@ -80,19 +114,21 @@ #navigator-toolbox:hover, #navigator-toolbox[zen-has-hover], - #navigator-toolbox:focus-within, #navigator-toolbox[zen-user-show], #navigator-toolbox[flash-popup], #navigator-toolbox[has-popup-menu], #navigator-toolbox[movingtab], - #mainPopupSet:has(> #appMenu-popup:hover) ~ toolbox, #navigator-toolbox:has(.tabbrowser-tab:active), - #navigator-toolbox:has(*[open='true']:not(tab):not(.zen-compact-mode-ignore)) { - opacity: 1; + #navigator-toolbox:has(*:is([open='true'], #nav-bar:focus-within):not(tab):not(.zen-compact-mode-ignore)) { + &:not([animate='true']) { + transition: left 0.25s ease, right 0.25s ease; + opacity: 1; - transform: translateX(calc(100% - var(--zen-element-separation))); - :root[zen-right-side='true'] & { - transform: translateX(calc(-100% + var(--zen-element-separation) + 1px)); + left: -1px; + :root[zen-right-side='true'] & { + right: -1px; + left: auto; + } } } } @@ -114,6 +150,10 @@ margin-top: var(--zen-element-separation) !important; } + & #zen-appcontent-wrapper { + z-index: 3 !important; + } + & #zen-sidebar-web-panel-wrapper:has(#zen-sidebar-web-panel[pinned='true']) { margin-top: calc(var(--zen-element-separation) * 2) !important; } @@ -123,21 +163,27 @@ position: absolute; top: calc((-1 * var(--zen-toolbar-height)) + var(--zen-element-separation) + 1px); left: 0; - z-index: 10; + z-index: 20; box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.3) !important; border-bottom-left-radius: var(--zen-border-radius); border-bottom-right-radius: var(--zen-border-radius); border-top-left-radius: env(-moz-gtk-csd-titlebar-radius); border-top-right-radius: env(-moz-gtk-csd-titlebar-radius); - transition: all 0.1s ease-in-out; + transition: all 0.15s ease; width: 100%; opacity: 0; background: var(--zen-dialog-background); - padding-left: var(--zen-toolbox-padding) !important; - :root[zen-window-buttons-reversed='true'] & { - padding-left: 0 !important; - padding-right: var(--zen-toolbox-padding) !important; + max-height: var(--zen-toolbar-height); + overflow: hidden; + + & > * { + position: relative !important; + } + + & #urlbar { + transform: translateY(-50%); + transition: transform 0.1s ease-in-out; } @media (-moz-bool-pref: 'zen.view.compact.color-toolbar') { @@ -159,6 +205,16 @@ border-top-width: 1px; top: -1px; + overflow: initial; + max-height: unset; + + & #urlbar { + transform: translateY(0); + + &[open]:not([zen-floating-urlbar='true']) { + top: 0 !important; + } + } } } } diff --git a/src/browser/base/content/zen-styles/zen-decks.css b/src/browser/base/content/zen-styles/zen-decks.css index d02a7b523..55cf99590 100644 --- a/src/browser/base/content/zen-styles/zen-decks.css +++ b/src/browser/base/content/zen-styles/zen-decks.css @@ -56,7 +56,7 @@ :root[zen-right-side='true'] & { margin-right: 0; - margin-left: calc(-1 * var(--zen-split-column-gap)); + margin-left: var(--zen-element-separation); } } diff --git a/src/browser/base/content/zen-styles/zen-gradient-generator.css b/src/browser/base/content/zen-styles/zen-gradient-generator.css index 7d8cbeaab..5c371a53c 100644 --- a/src/browser/base/content/zen-styles/zen-gradient-generator.css +++ b/src/browser/base/content/zen-styles/zen-gradient-generator.css @@ -5,6 +5,13 @@ min-width: var(--panel-width); } +#PanelUI-zen-gradient-generator .panel-viewcontainer, +#PanelUI-zen-gradient-generator .panel-viewstack { + display: flex; + flex-direction: column; + width: 100%; +} + #PanelUI-zen-gradient-degrees { position: relative; border-radius: 999px; diff --git a/src/browser/base/content/zen-styles/zen-popup.css b/src/browser/base/content/zen-styles/zen-popup.css index 3279dcb5f..5ba4326fc 100644 --- a/src/browser/base/content/zen-styles/zen-popup.css +++ b/src/browser/base/content/zen-styles/zen-popup.css @@ -290,3 +290,52 @@ menuitem { color: var(--button-hover-color); } } + +/*Bookmark workspace selector styles*/ +.workspace-dropdown { + position: relative; + width: 100%; + display: flex; +} + +.workspace-trigger { + width: 100%; + text-align: left; + padding: 8px 12px; + border: 1px solid var(--input-border-color); + border-radius: 4px; + background-color: var(--zen-colors-tertiary); + display: flex; + align-items: center; + justify-content: space-between; +} + +#editBMPanel_workspaceList { + flex-direction: column; + width: 100%; + max-height: 200px; + overflow-y: auto; + margin-top: 4px; + border: 1px solid var(--zen-colors-border); + border-radius: 4px; + background-color: var(--zen-colors-tertiary); + box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.1); + padding: 4px 0; +} + +#editBMPanel_workspaceList li { + list-style: none; + margin: 0; + padding: 0; +} + +#editBMPanel_workspaceList li > label { + display: flex; + align-items: center; + padding: 4px 12px; + cursor: pointer; +} + +#editBMPanel_workspaceList input[type="checkbox"] { + margin-right: 8px; +} diff --git a/src/browser/base/content/zen-styles/zen-sidebar-panels.css b/src/browser/base/content/zen-styles/zen-sidebar-panels.css index 5898f1906..897a4687e 100644 --- a/src/browser/base/content/zen-styles/zen-sidebar-panels.css +++ b/src/browser/base/content/zen-styles/zen-sidebar-panels.css @@ -100,7 +100,8 @@ height: unset !important; } -.zen-sidebar-web-panel-splitter { +.zen-sidebar-web-panel-splitter, +.zen-split-view-splitter[orient="vertical"] { position: absolute; top: 0; left: 0; @@ -130,6 +131,10 @@ } } +.zen-split-view-splitter[orient="vertical"]::before { + transform: translate(-75%, -50%); +} + .zen-sidebar-web-panel-splitter[side='right'] { left: 100%; } @@ -170,7 +175,7 @@ } #zen-sidebar-web-panel-wrapper { - margin: 0 calc(var(--zen-element-separation) / 2) var(--zen-element-separation) var(--zen-element-separation); + margin: 0 calc(var(--zen-element-separation) / 2) 0 var(--zen-element-separation); } #zen-sidebar-web-panel[pinned='true'] { @@ -276,11 +281,17 @@ animation: better-sidebar-pinned-hide 0.15s ease-in-out forwards !important; } -:root:not([zen-right-side='true']) { - #zen-sidebar-web-panel-wrapper:not(:has(#zen-sidebar-web-panel:is([hidden='true'], [pinned='true']))) { - margin-left: 0 !important; +#zen-sidebar-web-panel-wrapper:has(#zen-sidebar-web-panel:not([hidden='true'])) { + :root:not([zen-right-side='true']) & { margin-right: calc(var(--zen-element-separation) * 2 - 3px) !important; } + + @media (-moz-bool-pref: 'zen.view.compact') and (-moz-bool-pref: 'zen.view.compact.hide-tabbar') { + :root[zen-right-side='true'] & { + margin-left: 0 !important; + margin-right: calc(var(--zen-element-separation) * 2 - 3px) !important; + } + } } /** UNPINNED **/ diff --git a/src/browser/base/content/zen-styles/zen-single-components.css b/src/browser/base/content/zen-styles/zen-single-components.css index 1ef311d6c..0bc287b65 100644 --- a/src/browser/base/content/zen-styles/zen-single-components.css +++ b/src/browser/base/content/zen-styles/zen-single-components.css @@ -52,3 +52,11 @@ #customization-footer #customization-toolbar-visibility-button { display: none !important; } + +#alltabs-button { + display: none !important; +} + +.private-browsing-indicator-with-label { + display: none !important; +} diff --git a/src/browser/base/content/zen-styles/zen-tabs.css b/src/browser/base/content/zen-styles/zen-tabs.css index 3603023a4..ea738b686 100644 --- a/src/browser/base/content/zen-styles/zen-tabs.css +++ b/src/browser/base/content/zen-styles/zen-tabs.css @@ -4,6 +4,7 @@ #zen-tabbox-wrapper { position: relative; + z-index: 0; } @media (-moz-bool-pref: 'zen.workspaces.hide-default-container-indicator') { diff --git a/src/browser/base/content/zen-styles/zen-tabs/vertical-tabs-topbar.inc.css b/src/browser/base/content/zen-styles/zen-tabs/vertical-tabs-topbar.inc.css index a789dadbe..83b9f39d2 100644 --- a/src/browser/base/content/zen-styles/zen-tabs/vertical-tabs-topbar.inc.css +++ b/src/browser/base/content/zen-styles/zen-tabs/vertical-tabs-topbar.inc.css @@ -2,8 +2,13 @@ height: var(--zen-toolbar-height); @media (-moz-bool-pref: 'zen.view.hide-window-controls') { & { - transition: height 0.2s ease-out, opacity 0.2s ease-out; - transition-delay: 0.05s; + transition: height 0.15s ease, opacity 0.1s ease-out; + transition-delay: 0.2s; + + & > * { + transition: opacity 0.2s ease-out; + transition-delay: 0.2s; + } } &:not([zen-has-hover='true']):not([has-popup-menu]):not(:focus-within) { @@ -12,7 +17,17 @@ height: var(--zen-toolbar-height); overflow: hidden; opacity: 0; & > * { + opacity: 0; pointer-events: none; } } + + @media (-moz-bool-pref: 'zen.view.experimental-no-window-controls') { + &:has(#PersonalToolbar[collapsed='true']) { + max-height: 0 !important; + overflow: hidden; + opacity: 0 !important; + pointer-events: none !important; + } + } } diff --git a/src/browser/base/content/zen-styles/zen-tabs/vertical-tabs-topbuttons-fix.css b/src/browser/base/content/zen-styles/zen-tabs/vertical-tabs-topbuttons-fix.css new file mode 100644 index 000000000..87eabc66c --- /dev/null +++ b/src/browser/base/content/zen-styles/zen-tabs/vertical-tabs-topbuttons-fix.css @@ -0,0 +1,8 @@ + +& #zen-sidebar-top-buttons:has(#zen-sidebar-top-buttons-customization-target:empty) { + max-height: 0 !important; + min-height: 0 !important; + opacity: 0; + overflow: hidden; + pointer-events: none; +} diff --git a/src/browser/base/content/zen-styles/zen-tabs/vertical-tabs.css b/src/browser/base/content/zen-styles/zen-tabs/vertical-tabs.css index fdd3560a0..e5c1361fe 100644 --- a/src/browser/base/content/zen-styles/zen-tabs/vertical-tabs.css +++ b/src/browser/base/content/zen-styles/zen-tabs/vertical-tabs.css @@ -42,6 +42,12 @@ } } } + + #vertical-pinned-tabs-container, #tabbrowser-arrowscrollbox { + .tabbrowser-tab[fadein='true'][zen-initial-fadein='true'] { + animation: zen-new-tab-appear-vertical 0.2s cubic-bezier(0.4, 0.0, 0.2, 1); + } + } } :root[zen-window-buttons-reversed='true'] .titlebar-buttonbox-container { @@ -53,10 +59,6 @@ justify-content: center; } -#private-browsing-indicator-with-label { - display: none !important; -} - #browser { --zen-toolbox-padding: calc(var(--zen-element-separation) / 1.5); :root[zen-no-padding='true'] & { @@ -89,12 +91,12 @@ & #urlbar-container, & #urlbar { - --urlbar-container-height: 40px !important; + --urlbar-container-height: 40px; --urlbar-height: 38px !important; } & #nav-bar { - margin-bottom: 8px; + margin-bottom: 6px; } & #zen-sidebar-top-buttons { @@ -119,8 +121,8 @@ } #navigator-toolbox { - --border-radius-medium: 8px; - --tab-border-radius: var(--border-radius-medium); + --border-radius-medium: 10px; + --tab-border-radius: 10px; --zen-toolbox-min-width: 1px; --tab-hover-background-color: color-mix(in srgb, var(--toolbarbutton-hover-background) 50%, transparent 50%); @@ -134,8 +136,6 @@ order: 0 !important; display: flex; - - & toolbarspring { display: none; } } .titlebar-spacer[type='pre-tabs'], @@ -155,8 +155,8 @@ } /* We enable this trick IF we follow any of theses conditions: - * - We are on a Mac - * - We are on a Linux with reversed CSD + * - We are supposed to hide the window controls (e.g. left sidebar, windows like layouts) + * - This also involves linux's reverse GTK window controls, we'll need to handle that a bit differently * - If we are not in any of the above, we can still enable it if the user has bookmarks toolbar enabled */ &:has(#PersonalToolbar[collapsed='false']) { @@ -167,10 +167,11 @@ %include vertical-tabs-topbar.inc.css } - :root[zen-window-buttons-reversed='true'] & { - &:has(#PersonalToolbar[collapsed="true"]) { - display: none; - } + :root[inDOMFullscreen='true'] & { + max-height: 0 !important; + min-height: unset !important; + opacity: 0 !important; + pointer-events: none !important; } } } @@ -230,20 +231,19 @@ } & .tabbrowser-tab { - animation: none; - transition: none; + transition: scale 0.07s ease; &[fadein='true']:not([zen-essential='true']) { #tabbrowser-tabs[zen-workspace-animation='previous'] & { - animation: zen-slide-in-reverse 0.2s ease-in-out; + animation: zen-slide-in 0.2s ease; } #tabbrowser-tabs[zen-workspace-animation='next'] & { - animation: zen-slide-in 0.2s ease-in-out; + animation: zen-slide-in-reverse 0.2s ease; } + } - &[pinned] { - animation-delay: .03s !important; - } + &:not([zen-essential='true']):active { + scale: 0.98; } max-width: unset; @@ -361,7 +361,10 @@ padding: var(--zen-toolbox-padding); padding-left: 0; padding-top: 0; - z-index: 1; + + #PersonalToolbar:not([collapsed='true']) { + padding-left: 0 !important; + } & #titlebar { min-width: 150px; @@ -376,15 +379,13 @@ :root[zen-single-toolbar='true'] & { margin-left: var(--zen-toolbox-padding); - width: calc(100% - var(--zen-toolbox-padding)); - & .urlbar-input-container { + & #urlbar:not([breakout-extend='true']) .urlbar-input-container { padding-left: 4px; padding-right: 4px; } :root[zen-right-side='true'] & { margin-left: 0; - margin-right: var(--zen-toolbox-padding); } } } @@ -429,7 +430,7 @@ } & #zen-essentials-container { - --tab-min-height: 42px; + --tab-min-height: 44px; } /* Mark: Fix separator paddings */ @@ -500,7 +501,7 @@ & .tab-background { @media not (prefers-color-scheme: dark) { &:is([selected], [multiselected]) { - box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.15); + box-shadow: 0 .5px 1px rgba(0, 0, 0, 0.1); } } margin-inline: var(--tab-block-margin); @@ -525,12 +526,14 @@ } } -/* Mark: toolbox as collapsed */ -#navigator-toolbox:not([zen-sidebar-expanded='true']) { +:root:not([zen-sidebar-expanded='true']) { --tab-min-width: 36px !important; - /* Important: When changin this value, make sure expand on hover doesn't break! */ --zen-toolbox-padding: calc(var(--zen-element-separation) / 2 + 1px); --zen-toolbox-max-width: calc(var(--tab-min-width) + var(--zen-toolbox-padding) * 2); +} + +/* Mark: collapsed sidebar */ +#navigator-toolbox:not([zen-sidebar-expanded='true']) { max-width: var(--zen-toolbox-max-width) !important; min-width: var(--zen-toolbox-max-width) !important; & #zen-current-workspace-indicator-name, @@ -555,15 +558,26 @@ :root[customizing] & #zen-sidebar-icons-wrapper { min-width: unset !important; } + & #zen-sidebar-top-buttons { + justify-content: center; + max-height: unset !important; + height: fit-content !important; + margin-bottom: var(--zen-element-separation); + } + & #titlebar { + display: grid; + grid-template-rows: auto 1fr; + } + & #zen-sidebar-top-buttons-customization-target { + flex-direction: column; + padding-top: var(--zen-element-separation); + } & #zen-sidebar-icons-wrapper { display: flex; flex-direction: column; padding-top: var(--zen-element-separation); align-items: center; } - :root:has(&) #zen-sidebar-splitter { - display: none !important; - } & #tabbrowser-arrowscrollbox-periphery { & > toolbarbutton { margin: 0 auto !important; @@ -665,10 +679,15 @@ } } +:root:not([zen-sidebar-expanded='true']) #zen-sidebar-splitter { + display: none !important; +} + /* Mark: Separator styling */ #zen-sidebar-splitter { opacity: 0; - width: var(--zen-toolbox-padding); + max-width: var(--zen-toolbox-padding) !important; + min-width: var(--zen-toolbox-padding) !important; height: 100%; transition: opacity 0.2s ease-in-out; background: var(--zen-colors-border); @@ -783,19 +802,24 @@ order: -1; min-width: unset !important; - --toolbarbutton-inner-padding: calc(var(--zen-toolbar-button-inner-padding) - 2px) !important; + + :root[zen-sidebar-expanded='true'] & { + --toolbarbutton-inner-padding: calc(var(--zen-toolbar-button-inner-padding) - 2px) !important; + } & #zen-sidebar-top-buttons-customization-target { height: 100%; align-items: center; - padding-inline-start: var(--zen-toolbox-padding); - #nav-bar:has(&) & { + :root:not([zen-sidebar-expanded='true']):not([zen-right-side='true']) { + padding-inline-start: var(--zen-toolbox-padding); + } + + #nav-bar & { padding-inline-start: var(--toolbarbutton-outer-padding); } :root[zen-right-side='true'] & { - padding-inline-start: 0; padding-inline-end: var(--zen-toolbox-padding); } @@ -803,6 +827,10 @@ height: calc(2 * var(--toolbarbutton-inner-padding) + 16px); padding: 0 var(--toolbarbutton-outer-padding) !important; } + + & toolbarspring { + display: none; + } } & .zen-sidebar-action-button { @@ -882,12 +910,14 @@ width: 100% !important; border-radius: var(--border-radius-medium); - &:not([selected]) .tab-background { - background: light-dark(rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0.1)); + &[selected] .tab-background { box-shadow: 0 0 1px 1px light-dark(rgba(0, 0, 0, 0.07), rgba(0, 0, 0, 0.1)); } - backdrop-filter: blur(10px); + &:not([selected]) .tab-background { + background: var(--zen-toolbar-element-bg); + backdrop-filter: none !important; + } & .tab-content { display: flex; @@ -908,3 +938,56 @@ } } + +/* Very special occasions */ + +/* Mark: Right side windows controls with collapsed sidebar */ +@media not (-moz-bool-pref: 'zen.view.compact') { + :root[zen-right-side='true']:not([zen-sidebar-expanded='true']):not([zen-window-buttons-reversed='true']) { + & #navigator-toolbox { + margin-top: var(--zen-toolbar-height) !important; + } + + & .titlebar-buttonbox-container { + margin-right: calc(-1 * var(--zen-toolbox-max-width)) !important; + } + + & #zen-appcontent-wrapper { + overflow-x: visible; + } + + & #zen-sidebar-top-buttons-customization-target { + padding-top: 0; + } + + & #zen-appcontent-navbar-container { + padding-left: var(--zen-element-separation); + } + +%include vertical-tabs-topbuttons-fix.css + } + + :root:not([zen-right-side='true']):not([zen-sidebar-expanded='true'])[zen-window-buttons-reversed='true'] { + & #navigator-toolbox { + margin-top: var(--zen-toolbar-height) !important; + } + + & .titlebar-buttonbox-container { + margin-left: calc(-1 * var(--zen-toolbox-max-width)) !important; + } + + & #zen-appcontent-wrapper { + overflow-x: visible; + } + + & #zen-sidebar-top-buttons-customization-target { + padding-top: 0; + } + + & #zen-appcontent-navbar-container { + padding-right: var(--zen-element-separation); + } + +%include vertical-tabs-topbuttons-fix.css + } +} diff --git a/src/browser/base/content/zen-styles/zen-theme.css b/src/browser/base/content/zen-styles/zen-theme.css index 31a4e33eb..ac499e8d1 100644 --- a/src/browser/base/content/zen-styles/zen-theme.css +++ b/src/browser/base/content/zen-styles/zen-theme.css @@ -14,9 +14,13 @@ --zen-border-radius: 7px; --zen-primary-color: #ffb787; - --zen-branding-bg-dark: #202020; - --zen-branding-bg: light-dark(#F2F0E3, var(--zen-branding-bg-dark)); - --zen-branding-bg-reverse: light-dark(var(--zen-branding-bg-dark), #F2F0E3); + /* Branding */ + --zen-branding-dark: #202020; + --zen-branding-coral: #F76F53; + --zen-branding-paper: #ebebeb; + + --zen-branding-bg: light-dark(var(--zen-branding-paper), var(--zen-branding-dark)); + --zen-branding-bg-reverse: light-dark(var(--zen-branding-dark), var(--zen-branding-paper)); /** Zen colors are generated automatically from the primary color */ --zen-colors-primary: color-mix(in srgb, var(--zen-primary-color) 50%, black 50%); @@ -34,9 +38,10 @@ --zen-secondary-btn-color: var(--zen-colors-primary-foreground); - --in-content-primary-button-background: color-mix(in srgb, var(--zen-primary-color) 10%, var(--zen-branding-bg-reverse) 90%) !important; - --in-content-primary-button-background-hover: color-mix(in srgb, var(--zen-primary-color) 5%, var(--zen-branding-bg-reverse) 60%) !important; - --in-content-primary-button-background-active: color-mix(in srgb, var(--zen-primary-color) 7%, var(--zen-branding-bg-reverse) 50%) !important; + --in-content-primary-button-background: color-mix(in srgb, var(--zen-primary-color) 10%, var(--zen-branding-bg) 90%) !important; + --in-content-primary-button-background-hover: color-mix(in srgb, var(--zen-primary-color) 15%, var(--zen-branding-bg) 85%) !important; + --in-content-primary-button-background-active: color-mix(in srgb, var(--zen-primary-color) 20%, var(--zen-branding-bg) 80%) !important; + --button-text-color-primary: var(--zen-branding-bg-reverse) !important; --in-content-primary-button-text-color: var(--zen-colors-primary-foreground) !important; --in-content-primary-button-border-color: transparent !important; --in-content-primary-button-border-hover: transparent !important; @@ -44,12 +49,12 @@ --in-content-box-border-color: var(--zen-colors-border) !important; --in-content-accent-color: var(--zen-colors-primary) !important; + --in-content-accent-color-active: currentColor !important; /* This is like the secondary button */ --in-content-button-background: transparent !important; --in-content-button-text-color: var(--zen-secondary-btn-color) !important; - --in-content-button-background-hover: color-mix(in srgb, var(--zen-primary-color) 5%, var(--zen-branding-bg-reverse) 60%) !important; - --in-content-button-text-color-hover: var(--zen-branding-bg) !important; + --in-content-button-background-hover: color-mix(in srgb, var(--zen-primary-color) 5%, var(--zen-branding-bg) 60%) !important; --button-bgcolor: var(--in-content-button-background) !important; --button-hover-bgcolor: var(--in-content-button-background-hover) !important; --button-hover-color: var(--in-content-button-text-color-hover) !important; @@ -65,19 +70,26 @@ --button-background-color: var(--in-content-button-background) !important; --button-background-color-hover: var(--in-content-button-background-hover) !important; - --button-text-color-hover: var(--in-content-button-text-color-hover) !important; --button-background-color-active: var(--in-content-primary-button-background-active) !important; --color-accent-primary: var(--button-primary-bgcolor) !important; --color-accent-primary-hover: var(--button-primary-hover-bgcolor) !important; --color-accent-primary-active: var(--button-primary-active-bgcolor) !important; + --link-color: var(--zen-branding-bg-reverse) !important; + --link-color-hover: var(--zen-branding-bg-reverse) !important; + --in-content-page-background: var(--zen-colors-tertiary) !important; --zen-in-content-dialog-background: var(--zen-colors-tertiary); --zen-button-border-radius: 5px; --zen-button-padding: 0.6rem 1.2rem; + --zen-toolbar-element-bg: light-dark( + rgba(255, 255, 255, 0.4), + rgba(170, 170, 170, 0.2) + ); + /* Toolbar */ --zen-toolbar-height: 38px; --zen-toolbar-button-inner-padding: 6px; @@ -96,6 +108,8 @@ --zen-main-browser-background: light-dark(rgb(235, 235, 235), #1b1b1b); --zen-main-browser-background-toolbar: var(--zen-main-browser-background); + --browser-area-z-index-toolbox: 2 !important; + --zen-appcontent-border: 1px solid var(--zen-colors-border); --zen-panel-radius: var(--zen-border-radius); @@ -124,13 +138,16 @@ --zen-themed-toolbar-bg: light-dark(var(--zen-branding-bg), var(--zen-colors-tertiary)); --zen-themed-toolbar-bg-transparent: light-dark(var(--zen-branding-bg), var(--zen-colors-tertiary)); - @supports (-moz-osx-font-smoothing: auto) { - --zen-themed-toolbar-bg-transparency: 0.05; + @media (-moz-windows-mica) or (-moz-platform: macos) { + background: transparent; + --zen-themed-toolbar-bg-transparency: 0; --zen-themed-toolbar-bg-transparent: light-dark(rgba(255, 255, 255, var(--zen-themed-toolbar-bg-transparency)), rgba(0, 0, 0, var(--zen-themed-toolbar-bg-transparency))); } --toolbar-field-background-color: var(--zen-colors-input-bg) !important; --arrowpanel-background: var(--zen-dialog-background) !important; + + --tab-selected-shadow: 0 0 1px 1px rgba(0,0,0,.1) !important; } @media (prefers-color-scheme: dark) { diff --git a/src/browser/base/content/zen-styles/zen-urlbar.css b/src/browser/base/content/zen-styles/zen-urlbar.css index c836765b8..8f7bfb1cf 100644 --- a/src/browser/base/content/zen-styles/zen-urlbar.css +++ b/src/browser/base/content/zen-styles/zen-urlbar.css @@ -10,14 +10,9 @@ --urlbarView-hover-background: var(--toolbarbutton-hover-background); --urlbarView-highlight-background: var(--toolbarbutton-hover-background); border-radius: var(--toolbarbutton-border-radius); - overflow: hidden; padding: 1px; } -#urlbar[focused='true'][breakout-extend='true'] { - overflow: visible; -} - #searchbar:focus-within { border-color: transparent !important; } @@ -27,23 +22,18 @@ } #urlbar-background { - background: var(--zen-dialog-background); + background: var(--zen-toolbar-element-bg) !important; outline: none !important; } -#urlbar[focused='true'] > #urlbar-background { - background: var(--zen-dialog-background) !important; -} - -#urlbar:not([focused='true']):not([breakout-extend="true"]) > #urlbar-background { - background: light-dark(rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.1)) !important; - backdrop-filter: blur(10px); -} - #urlbar-background { border: transparent !important; margin: 1px; + box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.1) !important; + :root[zen-single-toolbar='true'] & { + box-shadow: none !important; + } } #urlbar[focused='true']:not([suppress-focus-border]) > #urlbar-background, @@ -84,7 +74,7 @@ position: relative; } -#urlbar:not([extend='true']) #identity-box:is(:not(.chromeUI), [pageproxystate='invalid']) { +#urlbar:not([breakout-extend='true']) #identity-box:is(:not(.chromeUI), [pageproxystate='invalid']) { margin-inline-end: 0 !important; } @@ -126,9 +116,41 @@ } :root[zen-single-toolbar='true'] { - #urlbar[breakout-extend='true'] { - top: 0px !important; - width: calc(var(--urlbar-width) + 2 * var(--urlbar-margin-inline) * 4); + + .urlbar-page-action:not(#star-button-box):not([open]), + #tracking-protection-icon-container { + margin-inline-end: calc(-16px - 2 * var(--urlbar-icon-padding)) !important; + opacity: 0; + transition: all 0.2s; + } + + #identity-permission-box > *:not(#permissions-granted-icon) { + visibility: collapse; + } + + #urlbar[open] :is(#tracking-protection-icon-container, .urlbar-page-action), + #urlbar:hover :is(#tracking-protection-icon-container, .urlbar-page-action), + .urlbar-page-action[open], + #tracking-protection-icon-container[open] { + opacity: 1; + margin-inline-end: 0 !important; + } + + #identity-permission-box:not([open]), + #notification-popup-box:not([open]) { + margin-inline-start: calc(-10px - 2 * var(--urlbar-icon-padding)); + opacity: 0; + transition: all 0.2s; + } + + #urlbar[open] #identity-permission-box, + #urlbar[open] #notification-popup-box, + #urlbar:hover #identity-permission-box, + #urlbar:hover #notification-popup-box, + #identity-permission-box[open], + #notification-popup-box[open] { + opacity: 1; + margin-inline-start: 0 !important; } #notification-popup-box { @@ -284,8 +306,18 @@ button.popup-notification-dropmarker { align-items: center; } -:root:not([zen-single-toolbar='true']) #nav-bar { - margin-bottom: -1px; +:root:not([zen-single-toolbar='true']) { + & #nav-bar { + margin-bottom: -1px; + } + + &[zen-right-side='true']:not([zen-window-buttons-reversed='true']) #nav-bar { + margin-inline-start: var(--zen-element-separation); + } + + &:not([zen-right-side='true'])[zen-window-buttons-reversed='true'] #nav-bar { + margin-inline-end: var(--zen-element-separation); + } } /* Other small tweaks */ @@ -309,6 +341,135 @@ button.popup-notification-dropmarker { padding-right: var(--zen-element-separation) !important; }*/ -#PersonalToolbar:not([collapsed='true']) { - padding-left: 0 !important; +#urlbar { + & .search-panel-one-offs-header { + display: none; + } + + & .search-panel-one-offs-container .searchbar-engine-one-off-item { + box-shadow: none; + } +} + +#urlbar[open] { + --urlbar-margin-inline: 5px !important; + + & #identity-box { + margin-right: var(--urlbar-margin-inline); + } + + & #urlbar-background { + /* We cant have a transparent background with a backdrop-filter because on normal websites, + the backdrop woudn't work, we would need to apply a clip-path to the site and that's not recommended + due to performance issues */ + background-color: light-dark(rgb(247, 247, 247), var(--zen-branding-bg)) !important; + box-shadow: 0 0 1px 1px light-dark(rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.1)) !important; + outline: 1px solid light-dark(rgba(20, 20, 20, 0.2), rgba(235, 235, 235, 0.2)) !important; + outline-offset: -1px !important; + } +} + +:root[zen-single-toolbar='true'] { + #urlbar[open] { + min-width: 30vw; + } + + &[zen-right-side='true'] #urlbar[open]:not([zen-floating-urlbar='true']) { + right: 0; + } +} + +#urlbar[open][zen-floating-urlbar='true'] { + z-index: 1000; + max-width: 45vw; + min-width: 45vw !important; + font-size: 1.1em; + --urlbar-container-height: 55px !important; + --urlbar-margin-inline: 10px !important; + position: absolute; + + top: calc(var(--zen-toolbar-height) * 2) !important; + + :root[zen-right-side='true'] & { + right: 28vw !important; + } + + :root:not([zen-right-side='true']) & { + left: 28vw !important; + } + + #urlbar-container:has(&) { + border-radius: 10px; + background: var(--toolbarbutton-hover-background); + } +} + +/* Code ~~stolen~~ taken inspiration from https://github.com/greeeen-dev/zen-arc-cmd-bar + * + * MIT License + * + * Copyright (c) 2024 green. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + **/ +.urlbarView-title, .urlbarView-title-separator, .urlbarView-action, .urlbarView-url { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.urlbarView-title { + font-size: 14px !important; + font-weight: 500 !important; +} + +.urlbarView-url, .urlbarView-title-separator::before { + font-size: 14px !important; + font-weight: 500 !important; + color: #aaa !important; +} + +.urlbarView-favicon { + margin-left: 0 !important; + margin-right: 12px !important; + padding: 6px !important; + border-radius: 6px !important; +} + +.urlbarView-row[has-action]:is([type="switchtab"], [type="remotetab"], [type="clipboard"]) .urlbarView-action { + margin-left: auto !important; + margin-right: 0 !important; +} + +.urlbarView-row { + .urlbarView-favicon { + transition: background-color 0.05s; + } + + &:hover { + background-color: light-dark(var(--zen-colors-secondary), var(--zen-colors-primary)) !important; + + .urlbarView-favicon { + background-color: color-mix(in srgb, var(--zen-branding-bg-reverse) 20%, transparent 80%) !important; + } + + .urlbarView-url, .urlbarView-title-separator::before { + color: color-mix(in srgb, var(--zen-colors-primary) 30%, lightgray) !important; + } + } } diff --git a/src/browser/base/content/zen-styles/zen-workspaces.css b/src/browser/base/content/zen-styles/zen-workspaces.css index 3db584ff0..48340aea2 100644 --- a/src/browser/base/content/zen-styles/zen-workspaces.css +++ b/src/browser/base/content/zen-styles/zen-workspaces.css @@ -84,6 +84,16 @@ height: calc(2 * var(--toolbarbutton-inner-padding) + 16px) !important; border-radius: var(--tab-border-radius) !important; + :root:not([zen-sidebar-expanded='true']) #navigator-toolbox & { + & .zen-workspace-sidebar-name { + display: none; + } + + & .zen-workspace-sidebar-icon { + margin-inline-end: 0 !important; + } + } + &:hover { background: var(--toolbarbutton-hover-background) !important; } @@ -373,7 +383,6 @@ #PanelUI-zen-workspaces-new, #PanelUI-zen-workspaces-reorder-mode, #PanelUI-zen-gradient-generator-color-custom-add { - margin-left: auto; min-height: 1px !important; padding: 3px; border-radius: 4px; @@ -395,6 +404,10 @@ width: 100%; } +#PanelUI-zen-workspaces-header { + margin-right: auto; +} + /* Mark workspaces indicator */ #zen-current-workspace-indicator { padding: 15px calc(4px + var(--tab-inline-padding)); @@ -416,16 +429,20 @@ display: block; position: absolute; - max-width: 100%; + max-width: calc(100% - var(--zen-toolbox-padding) * 4); } & #zen-current-workspace-indicator-icon:not([hidden]) + #zen-current-workspace-indicator-name { - margin-left: 22px; + padding-left: 24px; } } -@media not (-moz-bool-pref: 'zen.workspaces.show-workspace-indicator') or (not (-moz-bool-pref: 'zen.workspaces.enabled')) { +@media (not (-moz-bool-pref: 'zen.workspaces.show-workspace-indicator')) or (not (-moz-bool-pref: 'zen.workspaces.enabled')) { #zen-current-workspace-indicator { display: none !important; } } + +#zen-current-workspace-indicator[hidden='true'] { + display: none !important; +} diff --git a/src/browser/base/zen-components/ZenCommonUtils.mjs b/src/browser/base/zen-components/ZenCommonUtils.mjs index cf8aec999..4b151ee65 100644 --- a/src/browser/base/zen-components/ZenCommonUtils.mjs +++ b/src/browser/base/zen-components/ZenCommonUtils.mjs @@ -22,12 +22,16 @@ class ZenMultiWindowFeature { return Services.wm.getMostRecentWindow('navigator:browser'); } - isActiveWindow() { + static get isActiveWindow() { return ZenMultiWindowFeature.currentBrowser === window; } + windowIsActive(browser) { + return browser === ZenMultiWindowFeature.currentBrowser; + } + async foreachWindowAsActive(callback) { - if (!this.isActiveWindow()) { + if (!ZenMultiWindowFeature.isActiveWindow) { return; } for (const browser of ZenMultiWindowFeature.browsers) { @@ -53,3 +57,27 @@ class ZenPreloadedFeature { document.addEventListener('MozBeforeInitialXULLayout', initBound, { once: true }); } } + +var gZenCommonActions = { + copyCurrentURLToClipboard() { + const currentUrl = gBrowser.currentURI.spec; + if (currentUrl) { + let str = Cc["@mozilla.org/supports-string;1"].createInstance( + Ci.nsISupportsString + ); + str.data = currentUrl; + let transferable = Cc[ + "@mozilla.org/widget/transferable;1" + ].createInstance(Ci.nsITransferable); + transferable.init(getLoadContext()); + transferable.addDataFlavor("text/plain"); + transferable.setTransferData("text/plain", str); + Services.clipboard.setData( + transferable, + null, + Ci.nsIClipboard.kGlobalClipboard + ); + ConfirmationHint.show(document.getElementById("PanelUI-menu-button"), "zen-copy-current-url-confirmation"); + } + } +}; diff --git a/src/browser/base/zen-components/ZenCompactMode.mjs b/src/browser/base/zen-components/ZenCompactMode.mjs index 9a446e4f8..2537b5d11 100644 --- a/src/browser/base/zen-components/ZenCompactMode.mjs +++ b/src/browser/base/zen-components/ZenCompactMode.mjs @@ -17,6 +17,8 @@ var gZenCompactModeManager = { Services.prefs.addObserver('zen.view.sidebar-expanded.on-hover', this._disableTabsOnHoverIfConflict.bind(this)); Services.prefs.addObserver('zen.tabs.vertical.right-side', this._updateSidebarIsOnRight.bind(this)); + this._canAnimateSidebar = Services.prefs.getBoolPref('zen.view.compact.animate-sidebar', true); + gZenUIManager.addPopupTrackingAttribute(this.sidebar); gZenUIManager.addPopupTrackingAttribute(document.getElementById('zen-appcontent-navbar-container')); @@ -37,7 +39,8 @@ var gZenCompactModeManager = { if (this._sidebarIsOnRight) { return this._sidebarIsOnRight; } - return Services.prefs.getBoolPref('zen.tabs.vertical.right-side'); + this._sidebarIsOnRight = Services.prefs.getBoolPref('zen.tabs.vertical.right-side'); + return this._sidebarIsOnRight; }, get sidebar() { @@ -63,6 +66,15 @@ var gZenCompactModeManager = { this.updateContextMenu(); }, + updateCompactModeContext(isSingleToolbar) { + this.getAndApplySidebarWidth(); // Ignore return value + + const IDs = ['zen-context-menu-compact-mode-hide-sidebar', 'zen-context-menu-compact-mode-hide-toolbar', 'zen-context-menu-compact-mode-hide-both']; + for (let id of IDs) { + document.getElementById(id).disabled = isSingleToolbar; + } + }, + hideSidebar() { Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true); Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', false); @@ -86,6 +98,108 @@ var gZenCompactModeManager = { this._evenListeners.forEach((callback) => callback()); this._disableTabsOnHoverIfConflict(); this.updateContextMenu(); + this.animateCompactMode(); + }, + + getAndApplySidebarWidth() { + let sidebarWidth = this.sidebar.getBoundingClientRect().width; + if (sidebarWidth > 1) { + this.sidebar.style.setProperty("--zen-sidebar-width", `${sidebarWidth}px`); + } + return sidebarWidth; + }, + + animateCompactMode() { + const isCompactMode = this.prefefence; + const canHideSidebar = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar'); + if (this._isAnimating) { + return; + } + this._isAnimating = true; + // Do this so we can get the correct width ONCE compact mode styled have been applied + this.sidebar.setAttribute("animate", "true"); + window.requestAnimationFrame(() => { + let sidebarWidth = this.getAndApplySidebarWidth(); + if (!this._canAnimateSidebar) { + this.sidebar.removeAttribute("animate"); + this._isAnimating = false; + return; + } + if (canHideSidebar && isCompactMode) { + window.requestAnimationFrame(() => { + this.sidebar.style.position = "unset"; + this.sidebar.style.transition = "margin .4s ease"; + this.sidebar.style.left = "0"; + if (!this.sidebarIsOnRight) { + this.sidebar.style.marginLeft = `${-1 * sidebarWidth}px`; + } else { + this.sidebar.style.marginRight = `${-1 * sidebarWidth}px`; + } + this.sidebar.style.pointerEvents = "none"; + + window.requestAnimationFrame(() => { + setTimeout(() => { + window.requestAnimationFrame(() => { + this.sidebar.style.removeProperty("pointer-events"); + this.sidebar.style.removeProperty("position"); + this.sidebar.style.removeProperty("margin-left"); + this.sidebar.style.removeProperty("margin-right"); + this.sidebar.style.removeProperty("transform"); + this.sidebar.style.removeProperty("left"); + document.getElementById('browser').style.removeProperty("overflow"); + this.sidebar.removeAttribute("animate"); + window.requestAnimationFrame(() => { + this.sidebar.style.removeProperty("transition"); + this._isAnimating = false; + }); + }); + }, 450); + }); + }); + } else if (canHideSidebar && !isCompactMode) { + document.getElementById('browser').style.overflow = "hidden"; + this.sidebar.style.position = "relative"; + this.sidebar.style.left = "0"; + + if (!this.sidebarIsOnRight) { + this.sidebar.style.marginLeft = `${-1 * sidebarWidth}px`; + } else { + this.sidebar.style.marginRight = `${-1 * sidebarWidth}px`; + this.sidebar.style.transform = `translateX(${sidebarWidth}px)`; + } + + window.requestAnimationFrame(() => { + this.sidebar.style.transition = "margin .3s ease, transform .275s ease, opacity .3s ease"; + // we are in compact mode and we are exiting it + if (!this.sidebarIsOnRight) { + this.sidebar.style.marginLeft = "0"; + } else { + this.sidebar.style.marginRight = "0"; + this.sidebar.style.transform = "translateX(0)"; + } + this.sidebar.style.pointerEvents = "none"; + + setTimeout(() => { + window.requestAnimationFrame(() => { + this._isAnimating = false; + this.sidebar.style.removeProperty("position"); + this.sidebar.style.removeProperty("pointer-events"); + this.sidebar.style.removeProperty("opacity"); + this.sidebar.style.removeProperty("margin-left"); + this.sidebar.style.removeProperty("margin-right"); + this.sidebar.style.removeProperty("transform"); + this.sidebar.style.removeProperty("transition"); + this.sidebar.style.removeProperty("left"); + + document.getElementById('browser').style.removeProperty("overflow"); + this.sidebar.removeAttribute("animate"); + }); + }, 400); + }); + } else { + this.sidebar.removeAttribute("animate"); // remove the attribute if we are not animating + } + }); }, updateContextMenu() { diff --git a/src/browser/base/zen-components/ZenGradientGenerator.mjs b/src/browser/base/zen-components/ZenGradientGenerator.mjs index 1059defb7..5d1786b95 100644 --- a/src/browser/base/zen-components/ZenGradientGenerator.mjs +++ b/src/browser/base/zen-components/ZenGradientGenerator.mjs @@ -92,7 +92,6 @@ this.initContextMenu(); this.initThemePicker(); - this._hasInitialized = true; this.onDarkModeChange(null); } @@ -246,9 +245,7 @@ onThemePickerClick(event) { event.preventDefault(); - if (event.button !== 0 || this.dragging ) return; - const gradient = this.panel.querySelector('.zen-theme-picker-gradient'); const rect = gradient.getBoundingClientRect(); const padding = 90; // each side @@ -275,7 +272,6 @@ const relativeX = event.clientX - rect.left; const relativeY = event.clientY - rect.top; - const color = this.getColorFromPosition(relativeX, relativeY); // Create new dot @@ -358,7 +354,6 @@ listItems.querySelector('.zen-theme-picker-dot-custom').style.setProperty('--zen-theme-picker-dot-color', color); listItems.querySelector('.zen-theme-picker-custom-list-item-label').textContent = color; - this.customColorList.appendChild(listItems); } @@ -366,11 +361,9 @@ const color = this.customColorInput.value; if (!color) { - return; } - // can be any color format, we just add it to the list as a dot, but hidden const dot = document.createElement('div'); dot.classList.add('zen-theme-picker-dot', 'hidden', 'custom'); @@ -381,8 +374,6 @@ await this.updateCurrentWorkspace(); } - - onThemePickerClick(event) { event.preventDefault(); @@ -404,11 +395,9 @@ return; } - const clickedElement = event.target; const isExistingDot = clickedElement.classList.contains('zen-theme-picker-dot'); - if (!isExistingDot && this.numberOfDots < ZenThemePicker.MAX_DOTS) { const relativeX = event.clientX - rect.left; const relativeY = event.clientY - rect.top; @@ -497,11 +486,17 @@ this.updateCurrentWorkspace(); } + 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%)'; + } + getSingleRGBColor(color, forToolbar = false) { if (color.isCustom) { return color.c; } - const toolbarBg = forToolbar ? 'var(--zen-themed-toolbar-bg)' : 'var(--zen-themed-toolbar-bg-transparent)'; + const toolbarBg = forToolbar ? this.getToolbarModifiedBase() : 'var(--zen-themed-toolbar-bg-transparent)'; return `color-mix(in srgb, rgb(${color.c[0]}, ${color.c[1]}, ${color.c[2]}) ${this.currentOpacity * 100}%, ${toolbarBg} ${(1 - this.currentOpacity) * 100}%)`; } @@ -515,10 +510,10 @@ return `linear-gradient(${this.currentRotation}deg, ${themedColors.map(color => this.getSingleRGBColor(color, forToolbar)).join(', ')})`; } - getTheme(colors, opacity = 0.5, rotation = 45, texture = 0) { + static getTheme(colors = [], opacity = 0.5, rotation = 45, texture = 0) { return { type: 'gradient', - gradientColors: colors.filter(color => color), // remove undefined + gradientColors: colors ? colors.filter(color => color) : [], // remove undefined opacity, rotation, texture, @@ -662,8 +657,8 @@ } } - browser.document.documentElement.style.setProperty('--zen-main-browser-background', gradient); browser.document.documentElement.style.setProperty('--zen-main-browser-background-toolbar', gradientToolbar); + browser.document.documentElement.style.setProperty('--zen-main-browser-background', gradient); const dominantColor = this.getMostDominantColor(workspaceTheme.gradientColors); if (dominantColor) { @@ -717,7 +712,7 @@ const isCustom = dot.classList.contains('custom'); return {c: isCustom ? color : color.match(/\d+/g).map(Number), isCustom}; }); - const gradient = this.getTheme(colors, this.currentOpacity, this.currentRotation, this.currentTexture); + const gradient = ZenThemePicker.getTheme(colors, this.currentOpacity, this.currentRotation, this.currentTexture); let currentWorkspace = await ZenWorkspaces.getActiveWorkspace(); if(!skipSave) { diff --git a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs index b9dcdeaee..6a59df37f 100644 --- a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs +++ b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs @@ -11,6 +11,18 @@ const KEYCODE_MAP = { F10: 'VK_F10', F11: 'VK_F11', F12: 'VK_F12', + F13: 'VK_F13', + F14: 'VK_F14', + F15: 'VK_F15', + F16: 'VK_F16', + F17: 'VK_F17', + F18: 'VK_F18', + F19: 'VK_F19', + F20: 'VK_F20', + F21: 'VK_F21', + F22: 'VK_F22', + F23: 'VK_F23', + F24: 'VK_F24', TAB: 'VK_TAB', ENTER: 'VK_RETURN', ESCAPE: 'VK_ESCAPE', @@ -22,6 +34,8 @@ const KEYCODE_MAP = { DELETE: 'VK_DELETE', BACKSPACE: 'VK_BACK', HOME: 'VK_HOME', + NUM_LOCK: 'VK_NUMLOCK', + SCROLL_LOCK: 'VK_SCROLL', }; const defaultKeyboardGroups = { @@ -66,6 +80,7 @@ const defaultKeyboardGroups = { 'zen-search-find-again-shortcut-prev', ], pageOperations: [ + 'zen-text-action-copy-url-shortcut', 'zen-location-open-shortcut', 'zen-location-open-shortcut-alt', 'zen-save-page-shortcut', @@ -368,8 +383,8 @@ class KeyShortcut { } key.setAttribute('group', this.#group); - // note to "mr. macos": We add the `zen-` prefix because since firefox hasnt been built with the - // shortcuts in mind, it will siply just override the shortcuts with whatever the default is. + // note to "mr. macos": We add the `zen-` prefix because firefox hasnt been built with the + // shortcuts in mind, it will simply just override the shortcuts with whatever the default is. // note that this l10n id is not used for actually translating the key's label, but rather to // identify the default keybinds. if (this.#l10nId) { @@ -537,7 +552,7 @@ class ZenKeyboardShortcutsLoader { } catch (e) { // Recreate shortcuts file Services.prefs.clearUserPref('zen.keyboard.shortcuts.version'); - console.error('Error loading shortcuts file', e); + console.warn('Error loading shortcuts file', e); return null; } } @@ -556,7 +571,6 @@ function zenGetDefaultShortcuts() { // For adding new default shortcuts, add them to inside the migration function // and increment the version number. - console.info('Zen CKS: Loading default shortcuts...'); let keySet = document.getElementById(ZEN_MAIN_KEYSET_ID); let newShortcutList = []; @@ -702,7 +716,7 @@ function zenGetDefaultShortcuts() { } class ZenKeyboardShortcutsVersioner { - static LATEST_KBS_VERSION = 4; + static LATEST_KBS_VERSION = 6; constructor() {} @@ -807,6 +821,36 @@ class ZenKeyboardShortcutsVersioner { // since it's not used anymore. data = data.filter((shortcut) => shortcut.getID() != 'zen-toggle-sidebar'); } + if (version < 5) { + // Migrate from 4 to 5 + // Here, we are adding the 'zen-toggle-sidebar' shortcut back, but with a new action + data.push( + new KeyShortcut( + 'zen-toggle-sidebar', + 'B', + '', + ZEN_OTHER_SHORTCUTS_GROUP, + KeyShortcutModifiers.fromObject({ alt: true }), + 'code:gZenVerticalTabsManager.toggleExpand()', + 'zen-sidebar-shortcut-toggle' + ) + ); + } + if (version < 6) { + // Migrate from 5 to 6 + // In this new version, we add the "Copy URL" shortcut to the default shortcuts + data.push( + new KeyShortcut( + 'zen-copy-url', + 'C', + '', + ZEN_OTHER_SHORTCUTS_GROUP, + KeyShortcutModifiers.fromObject({ accel: true, shift: true }), + 'code:gZenCommonActions.copyCurrentURLToClipboard()', + 'zen-text-action-copy-url-shortcut' + ) + ); + } return data; } } @@ -926,7 +970,6 @@ var gZenKeyboardShortcutsManager = { } mainKeyset.after(keyset); - console.debug('Shortcuts applied...'); } }, diff --git a/src/browser/base/zen-components/ZenPinnedTabManager.mjs b/src/browser/base/zen-components/ZenPinnedTabManager.mjs index 6388bc761..77bbd2b5a 100644 --- a/src/browser/base/zen-components/ZenPinnedTabManager.mjs +++ b/src/browser/base/zen-components/ZenPinnedTabManager.mjs @@ -2,7 +2,7 @@ const lazy = {}; class ZenPinnedTabsObserver { - static ALL_EVENTS = ['TabPinned', 'TabUnpinned']; + static ALL_EVENTS = ['TabPinned', 'TabUnpinned', 'TabMove']; #listeners = []; @@ -49,7 +49,6 @@ this._zenClickEventListener = this._onTabClick.bind(this); ZenWorkspaces.addChangeListeners(this.onWorkspaceChange.bind(this)); - } async onWorkspaceChange(newWorkspace, onInit) { @@ -72,9 +71,6 @@ } async _refreshPinnedTabs(currentWorkspace,{ init = false } = {}) { - if(init) { - await ZenPinnedTabsStorage.init(); - } await this._initializePinsCache(); await this._initializePinnedTabs(init,currentWorkspace); } @@ -87,7 +83,7 @@ // Enhance pins with favicons const enhancedPins = await Promise.all(pins.map(async pin => { try { - const image = await this.getFaviconAsBase64(pin.url); + const image = await this.getFaviconAsBase64(Services.io.newURI(pin.url).spec); return { ...pin, iconUrl: image || null @@ -271,12 +267,35 @@ delete tab._zenClickEventListener; } break; + case "TabMove": + this._onTabMove(tab); + break; default: console.warn('ZenPinnedTabManager: Unhandled tab event', action); break; } } + async _onTabMove(tab) { + if (!tab.pinned) { + return; + } + + // Recollect pinned tabs and essentials after a tab move + const currentWorkspace = await ZenWorkspaces.getActiveWorkspace(); + + tab.position = tab._tPos; + + for (let otherTab of gBrowser.tabs) { + if (otherTab.pinned && otherTab._tPos > tab.position) { + otherTab.position = otherTab._tPos; + await ZenPinnedTabsStorage.savePin(otherTab, false); + } + } + + await ZenPinnedTabsStorage.savePin(tab); + } + _onTabClick(e) { const tab = e.target?.closest("tab"); if (e.button === 1 && tab) { @@ -361,7 +380,8 @@ } async _removePinnedAttributes(tab, isClosing = false) { - if(!tab.getAttribute("zen-pin-id")) { + if(!tab.getAttribute("zen-pin-id") || this._temporarilyUnpiningEssential) { + this._temporarilyUnpiningEssential = false; return; } @@ -492,8 +512,8 @@ // Return as a proper data URL return `data:${faviconData.mimeType};base64,${base64String}`; } catch (ex) { - console.error("Failed to get favicon:", ex); - return null; + // console.error("Failed to get favicon:", ex); + return `page-icon:${pageUrl}`; // Use this as a fallback } } @@ -506,6 +526,7 @@ tab.removeAttribute("zen-workspace-id"); } if (tab.pinned) { + this._temporarilyUnpiningEssential = true; gBrowser.unpinTab(tab); } gBrowser.pinTab(tab); @@ -577,4 +598,4 @@ } window.gZenPinnedTabManager = new ZenPinnedTabManager(); -} \ No newline at end of file +} diff --git a/src/browser/base/zen-components/ZenPinnedTabsStorage.mjs b/src/browser/base/zen-components/ZenPinnedTabsStorage.mjs index df4a84097..0a2c71aee 100644 --- a/src/browser/base/zen-components/ZenPinnedTabsStorage.mjs +++ b/src/browser/base/zen-components/ZenPinnedTabsStorage.mjs @@ -1,6 +1,5 @@ var ZenPinnedTabsStorage = { async init() { - console.log('ZenPinnedTabsStorage: Initializing...'); await this._ensureTable(); }, @@ -337,3 +336,5 @@ var ZenPinnedTabsStorage = { }); } }; + +ZenPinnedTabsStorage.init(); diff --git a/src/browser/base/zen-components/ZenProfileDialogUI.mjs b/src/browser/base/zen-components/ZenProfileDialogUI.mjs index 09faa3232..cdc8f7c3b 100644 --- a/src/browser/base/zen-components/ZenProfileDialogUI.mjs +++ b/src/browser/base/zen-components/ZenProfileDialogUI.mjs @@ -49,11 +49,7 @@ var ZenProfileDialogUI = { }, _openProfile(profile) { - SelectableProfileService.getProfile( - aEvent.target.getAttribute("profileid") - ).then(profile => { - SelectableProfileService.launchInstance(profile); - }); + Services.startup.createInstanceWithProfile(profile); }, _getProfilesSize(profiles) { diff --git a/src/browser/base/zen-components/ZenTabUnloader.mjs b/src/browser/base/zen-components/ZenTabUnloader.mjs index e3668c9c4..2db86f526 100644 --- a/src/browser/base/zen-components/ZenTabUnloader.mjs +++ b/src/browser/base/zen-components/ZenTabUnloader.mjs @@ -252,7 +252,7 @@ if ( (tab.pinned && !ignoreTimestamp) || tab.selected || - tab.multiselected || + (tab.multiselected && !ignoreTimestamp) || tab.hasAttribute('busy') || tab.hasAttribute('pending') || !tab.linkedPanel || diff --git a/src/browser/base/zen-components/ZenThemesImporter.mjs b/src/browser/base/zen-components/ZenThemesImporter.mjs index 9ac466c20..920656031 100644 --- a/src/browser/base/zen-components/ZenThemesImporter.mjs +++ b/src/browser/base/zen-components/ZenThemesImporter.mjs @@ -53,11 +53,9 @@ var gZenStylesheetManager = { var gZenThemesImporter = new (class { constructor() { - console.info('[ZenThemesImporter]: Initializing Zen Themes Importer'); - try { window.SessionStore.promiseInitialized.then(async () => { - if (Services.prefs.getBoolPref('zen.themes.disable-all', false)) { + if (Services.prefs.getBoolPref('zen.themes.disable-all', false) || Services.appinfo.inSafeMode) { console.log('[ZenThemesImporter]: Disabling all themes.'); return; } diff --git a/src/browser/base/zen-components/ZenWorkspaces.mjs b/src/browser/base/zen-components/ZenWorkspaces.mjs index 1397596c8..54650d4bd 100644 --- a/src/browser/base/zen-components/ZenWorkspaces.mjs +++ b/src/browser/base/zen-components/ZenWorkspaces.mjs @@ -28,6 +28,24 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { return; // We are in a hidden window, don't initialize ZenWorkspaces } this.ownerWindow = window; + 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', @@ -55,10 +73,13 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { ); ChromeUtils.defineLazyGetter(this, 'tabContainer', () => document.getElementById('tabbrowser-tabs')); this._activeWorkspace = Services.prefs.getStringPref('zen.workspaces.active', ''); - await ZenWorkspacesStorage.init(); + this._delayedStartup(); } async _delayedStartup() { + if (!this.workspaceEnabled) { + return; + } await this.initializeWorkspaces(); console.info('ZenWorkspaces: ZenWorkspaces initialized'); @@ -121,27 +142,65 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { this._hoveringSidebar = false; }); - const scrollCooldown = 500; // Milliseconds to wait before allowing another scroll - const scrollThreshold = 5; // Minimum scroll delta to trigger workspace change + const scrollCooldown = 200; // Milliseconds to wait before allowing another scroll + const scrollThreshold = 2; // Minimum scroll delta to trigger workspace change toolbox.addEventListener('wheel', async (event) => { if (!this.workspaceEnabled) return; - // Only process horizontal scroll (deltaX) - if (!event.deltaX) return; + + // Only process non-gesture scrolls + if (event.deltaMode !== 1) return; + + const isVerticalScroll = event.deltaY && !event.deltaX; + const isHorizontalScroll = event.deltaX && !event.deltaY; + + //if the scroll is vertical this checks that a modifier key is used before proceeding + if (isVerticalScroll) { + + const activationKeyMap = { + ctrl: event.ctrlKey, + alt: event.altKey, + shift: event.shiftKey, + meta: event.metaKey, + }; + + if (this.activationMethod in activationKeyMap && !activationKeyMap[this.activationMethod]) { + return; + } + } const currentTime = Date.now(); - if (currentTime - this._lastScrollTime < scrollCooldown) { - return; + if (currentTime - this._lastScrollTime < scrollCooldown) return; + + //this decides which delta to use + const delta = isVerticalScroll ? event.deltaY : event.deltaX; + if (Math.abs(delta) < scrollThreshold) return; + + // Determine scroll direction + let direction = delta > 0 ? 1 : -1; + if (this.naturalScroll) { + direction = delta > 0 ? -1 : 1; } - // Only process if the horizontal scroll is significant enough - if (Math.abs(event.deltaX) < scrollThreshold) { - return; + // Workspace logic + const workspaces = (await this._workspaces()).workspaces; + const currentIndex = workspaces.findIndex(w => w.uuid === this.activeWorkspace); + if (currentIndex === -1) return; // No valid current workspace + + let targetIndex = currentIndex + direction; + + if (this.shouldWrapAroundNavigation) { + // Add length to handle negative indices and loop + targetIndex = (targetIndex + workspaces.length) % workspaces.length; + } else { + // Clamp within bounds to disable looping + targetIndex = Math.max(0, Math.min(workspaces.length - 1, targetIndex)); + } + + if (targetIndex !== currentIndex) { + await this.changeWorkspace(workspaces[targetIndex]); } - // Change workspace based on scroll direction - const direction = event.deltaX > 0 ? 1 : -1; - await this.changeWorkspaceShortcut(direction); this._lastScrollTime = currentTime; }, { passive: true }); } @@ -205,14 +264,16 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { // Determine swipe direction based on cumulative delta if (Math.abs(this._swipeState.cumulativeDelta) > 0.25) { - this._swipeState.direction = this._swipeState.cumulativeDelta > 0 ? 'right' : 'left'; + this._swipeState.direction = this._swipeState.cumulativeDelta > 0 ? 'left' : 'right'; + if (this.naturalScroll){ + this._swipeState.direction = this._swipeState.cumulativeDelta > 0 ? 'right' : 'left'; + } } } async _handleSwipeEnd(event) { if (!this.workspaceEnabled || !this._swipeState?.isGestureActive) return; - event.preventDefault(); event.stopPropagation(); @@ -224,14 +285,21 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { const isRTL = document.documentElement.matches(':-moz-locale-dir(rtl)'); const moveForward = (this._swipeState.direction === 'right') !== isRTL; - let targetIndex; - if (moveForward) { - targetIndex = (currentIndex + 1) % workspaces.length; + let targetIndex = moveForward + ? currentIndex + 1 + : currentIndex - 1; + + if (this.shouldWrapAroundNavigation) { + // Add length to handle negative indices and clamp within bounds + targetIndex = (targetIndex + workspaces.length) % workspaces.length; } else { - targetIndex = (currentIndex - 1 + workspaces.length) % workspaces.length; + // Clamp within bounds for to remove looping + targetIndex = Math.max(0, Math.min(workspaces.length - 1, targetIndex)); } - await this.changeWorkspace(workspaces[targetIndex]); + if (targetIndex !== currentIndex) { + await this.changeWorkspace(workspaces[targetIndex]); + } } } @@ -370,22 +438,25 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { window.addEventListener('TabBrowserInserted', this.onTabBrowserInserted.bind(this)); await SessionStore.promiseInitialized; let workspaces = await this._workspaces(); + let activeWorkspace = null; if (workspaces.workspaces.length === 0) { - await this.createAndSaveWorkspace('Default Workspace', true, '🏠'); + activeWorkspace = await this.createAndSaveWorkspace('Default Workspace', true, '🏠'); } else { - let activeWorkspace = await this.getActiveWorkspace(); + activeWorkspace = await this.getActiveWorkspace(); if (!activeWorkspace) { activeWorkspace = workspaces.workspaces.find((workspace) => workspace.default); - this.activeWorkspace = activeWorkspace.uuid; + this.activeWorkspace = activeWorkspace?.uuid; } if (!activeWorkspace) { activeWorkspace = workspaces.workspaces[0]; - this.activeWorkspace = activeWorkspace.uuid; + this.activeWorkspace = activeWorkspace?.uuid; } await this.changeWorkspace(activeWorkspace, true); } try { - window.gZenThemePicker = new ZenThemePicker(); + if (activeWorkspace) { + window.gZenThemePicker = new ZenThemePicker(); + } } catch (e) { console.error('ZenWorkspaces: Error initializing theme picker', e); } @@ -593,9 +664,14 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { if (workspace.default) { element.setAttribute('default', 'true'); } - const containerGroup = browser.ContextualIdentityService.getPublicIdentities().find( - (container) => container.userContextId === workspace.containerTabId - ); + let containerGroup = undefined; + try { + containerGroup = browser.ContextualIdentityService.getPublicIdentities().find( + (container) => container.userContextId === workspace.containerTabId + ); + } catch (e) { + console.warn('ZenWorkspaces: Error setting container color', e); + } if (containerGroup) { element.classList.add('identity-color-' + containerGroup.color); element.setAttribute('data-usercontextid', containerGroup.userContextId); @@ -603,7 +679,6 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { if (this.isReorderModeOn(browser)) { element.setAttribute('draggable', 'true'); } - element.addEventListener( 'dragstart', function (event) { @@ -1157,8 +1232,8 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { // Animate acordingly if (previousWorkspace && !this._animatingChange) { // we want to know if we are moving forward or backward in sense of animation - let isNextWorkspace = onInit || - (workspaces.workspaces.findIndex((w) => w.uuid === previousWorkspace.uuid) + let isNextWorkspace = onInit || + (workspaces.workspaces.findIndex((w) => w.uuid === previousWorkspace.uuid) < workspaces.workspaces.findIndex((w) => w.uuid === window.uuid)); gBrowser.tabContainer.setAttribute('zen-workspace-animation', isNextWorkspace ? 'next' : 'previous'); this._animatingChange = true; @@ -1361,6 +1436,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { default: isDefault, icon: icon, name: name, + theme: ZenThemePicker.getTheme([]), }; this._prepareNewWorkspace(window); return window; @@ -1373,6 +1449,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { let workspaceData = this._createWorkspaceData(name, isDefault, icon); await this.saveWorkspace(workspaceData); await this.changeWorkspace(workspaceData); + return workspaceData; } async onTabBrowserInserted(event) { @@ -1398,16 +1475,21 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { const tab = gBrowser.getTabForBrowser(browser); const workspaceID = tab.getAttribute('zen-workspace-id'); const isEssential = tab.getAttribute("zen-essential") === "true"; - const activeWorkspace = await parent.ZenWorkspaces.getActiveWorkspace(); + if (!isEssential) { + const activeWorkspace = await parent.ZenWorkspaces.getActiveWorkspace(); + if (!activeWorkspace) { + return; + } - // Only update last selected tab for non-essential tabs in their workspace - if (!isEssential && workspaceID === activeWorkspace.uuid) { - this._lastSelectedWorkspaceTabs[workspaceID] = tab; - } + // Only update last selected tab for non-essential tabs in their workspace + if (!isEssential && workspaceID === activeWorkspace.uuid) { + this._lastSelectedWorkspaceTabs[workspaceID] = tab; + } - // Switch workspace if needed - if (workspaceID && workspaceID !== activeWorkspace.uuid) { - await parent.ZenWorkspaces.changeWorkspace({ uuid: workspaceID }); + // Switch workspace if needed + if (workspaceID && workspaceID !== activeWorkspace.uuid) { + await parent.ZenWorkspaces.changeWorkspace({ uuid: workspaceID }); + } } } @@ -1519,6 +1601,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { async changeTabWorkspace(workspaceID) { const tabs = TabContextMenu.contextTab.multiselected ? gBrowser.selectedTabs : [TabContextMenu.contextTab]; + document.getElementById('tabContextMenu').hidePopup(); const previousWorkspaceID = document.documentElement.getAttribute('zen-workspace-id'); for (let tab of tabs) { tab.setAttribute('zen-workspace-id', workspaceID); @@ -1546,7 +1629,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { getContextIdIfNeeded(userContextId, fromExternal, allowInheritPrincipal) { if (!this.workspaceEnabled) { - return [userContextId, false]; + return [userContextId, false, undefined]; } if (this.shouldForceContainerTabsToWorkspace && typeof userContextId !== 'undefined' && this._workspaceCache?.workspaces) { @@ -1558,7 +1641,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { const workspace = matchingWorkspaces[0]; if (workspace.uuid !== this.getActiveWorkspaceFromCache().uuid) { this.changeWorkspace(workspace); - return [userContextId, true]; + return [userContextId, true, workspace.uuid]; } } } @@ -1567,13 +1650,13 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { const activeWorkspaceUserContextId = activeWorkspace?.containerTabId; if ((fromExternal || allowInheritPrincipal === false) && !!activeWorkspaceUserContextId) { - return [activeWorkspaceUserContextId, true]; + return [activeWorkspaceUserContextId, true, undefined]; } if (typeof userContextId !== 'undefined' && userContextId !== activeWorkspaceUserContextId) { - return [userContextId, false]; + return [userContextId, false, undefined]; } - return [activeWorkspaceUserContextId, true]; + return [activeWorkspaceUserContextId, true, undefined]; } async shortcutSwitchTo(index) { diff --git a/src/browser/base/zen-components/ZenWorkspacesStorage.mjs b/src/browser/base/zen-components/ZenWorkspacesStorage.mjs index c0abdb7c8..d334b10b2 100644 --- a/src/browser/base/zen-components/ZenWorkspacesStorage.mjs +++ b/src/browser/base/zen-components/ZenWorkspacesStorage.mjs @@ -1,13 +1,17 @@ var ZenWorkspacesStorage = { + lazy: {}, + async init() { - console.log('ZenWorkspacesStorage: Initializing...'); + ChromeUtils.defineESModuleGetters(this.lazy, { + PlacesUtils: "resource://gre/modules/PlacesUtils.sys.mjs", + }); + await this._ensureTable(); await ZenWorkspaceBookmarksStorage.init(); - ZenWorkspaces._delayedStartup(); }, async _ensureTable() { - await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage._ensureTable', async (db) => { + await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage._ensureTable', async (db) => { // Create the main workspaces table if it doesn't exist await db.execute(` CREATE TABLE IF NOT EXISTS zen_workspaces ( @@ -100,7 +104,7 @@ var ZenWorkspacesStorage = { async saveWorkspace(workspace, notifyObservers = true) { const changedUUIDs = new Set(); - await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.saveWorkspace', async (db) => { + await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.saveWorkspace', async (db) => { await db.executeTransaction(async () => { const now = Date.now(); @@ -171,7 +175,7 @@ var ZenWorkspacesStorage = { }, async getWorkspaces() { - const db = await PlacesUtils.promiseDBConnection(); + const db = await this.lazy.PlacesUtils.promiseDBConnection(); const rows = await db.executeCached(` SELECT * FROM zen_workspaces ORDER BY created_at ASC `); @@ -195,7 +199,7 @@ var ZenWorkspacesStorage = { async removeWorkspace(uuid, notifyObservers = true) { const changedUUIDs = [uuid]; - await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.removeWorkspace', async (db) => { + await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.removeWorkspace', async (db) => { await db.execute( ` DELETE FROM zen_workspaces WHERE uuid = :uuid @@ -222,7 +226,7 @@ var ZenWorkspacesStorage = { }, async wipeAllWorkspaces() { - await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.wipeAllWorkspaces', async (db) => { + await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.wipeAllWorkspaces', async (db) => { await db.execute(`DELETE FROM zen_workspaces`); await db.execute(`DELETE FROM zen_workspaces_changes`); await this.updateLastChangeTimestamp(db); @@ -232,7 +236,7 @@ var ZenWorkspacesStorage = { async setDefaultWorkspace(uuid, notifyObservers = true) { const changedUUIDs = []; - await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.setDefaultWorkspace', async (db) => { + await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.setDefaultWorkspace', async (db) => { await db.executeTransaction(async () => { const now = Date.now(); // Unset the default flag for all other workspaces @@ -269,7 +273,7 @@ var ZenWorkspacesStorage = { }, async markChanged(uuid) { - await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.markChanged', async (db) => { + await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.markChanged', async (db) => { const now = Date.now(); await db.execute(` INSERT OR REPLACE INTO zen_workspaces_changes (uuid, timestamp) @@ -283,7 +287,7 @@ var ZenWorkspacesStorage = { async saveWorkspaceTheme(uuid, theme, notifyObservers = true) { const changedUUIDs = [uuid]; - await PlacesUtils.withConnectionWrapper('saveWorkspaceTheme', async (db) => { + await this.lazy.PlacesUtils.withConnectionWrapper('saveWorkspaceTheme', async (db) => { await db.execute(` UPDATE zen_workspaces SET @@ -314,7 +318,7 @@ var ZenWorkspacesStorage = { }, async getChangedIDs() { - const db = await PlacesUtils.promiseDBConnection(); + const db = await this.lazy.PlacesUtils.promiseDBConnection(); const rows = await db.execute(` SELECT uuid, timestamp FROM zen_workspaces_changes `); @@ -326,7 +330,7 @@ var ZenWorkspacesStorage = { }, async clearChangedIDs() { - await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.clearChangedIDs', async (db) => { + await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.clearChangedIDs', async (db) => { await db.execute(`DELETE FROM zen_workspaces_changes`); }); }, @@ -363,7 +367,7 @@ var ZenWorkspacesStorage = { }, async getLastChangeTimestamp() { - const db = await PlacesUtils.promiseDBConnection(); + const db = await this.lazy.PlacesUtils.promiseDBConnection(); const result = await db.executeCached(` SELECT value FROM moz_meta WHERE key = 'zen_workspaces_last_change' `); @@ -373,7 +377,7 @@ var ZenWorkspacesStorage = { async updateWorkspacePositions(workspaces) { const changedUUIDs = new Set(); - await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.updateWorkspacePositions', async (db) => { + await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.updateWorkspacePositions', async (db) => { await db.executeTransaction(async () => { const now = Date.now(); @@ -414,7 +418,7 @@ var ZenWorkspaceBookmarksStorage = { }, async _ensureTable() { - await PlacesUtils.withConnectionWrapper('ZenWorkspaceBookmarksStorage.init', async (db) => { + await ZenWorkspacesStorage.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspaceBookmarksStorage.init', async (db) => { // Create table using GUIDs instead of IDs await db.execute(` CREATE TABLE IF NOT EXISTS zen_bookmarks_workspaces ( @@ -475,7 +479,7 @@ var ZenWorkspaceBookmarksStorage = { * @returns {Promise} The timestamp of the last change. */ async getLastChangeTimestamp() { - const db = await PlacesUtils.promiseDBConnection(); + const db = await ZenWorkspacesStorage.lazy.PlacesUtils.promiseDBConnection(); const result = await db.executeCached(` SELECT value FROM moz_meta WHERE key = 'zen_bookmarks_workspaces_last_change' `); @@ -483,7 +487,7 @@ var ZenWorkspaceBookmarksStorage = { }, async getBookmarkWorkspaces(bookmarkGuid) { - const db = await PlacesUtils.promiseDBConnection(); + const db = await ZenWorkspacesStorage.lazy.PlacesUtils.promiseDBConnection(); const rows = await db.execute(` SELECT workspace_uuid @@ -505,7 +509,7 @@ var ZenWorkspaceBookmarksStorage = { * } */ async getBookmarkGuidsByWorkspace() { - const db = await PlacesUtils.promiseDBConnection(); + const db = await ZenWorkspacesStorage.lazy.PlacesUtils.promiseDBConnection(); const rows = await db.execute(` SELECT workspace_uuid, GROUP_CONCAT(bookmark_guid) as bookmark_guids @@ -528,9 +532,9 @@ var ZenWorkspaceBookmarksStorage = { * @returns {Promise} An object mapping bookmark+workspace pairs to their change data. */ async getChangedIDs() { - const db = await PlacesUtils.promiseDBConnection(); + const db = await ZenWorkspacesStorage.lazy.PlacesUtils.promiseDBConnection(); const rows = await db.execute(` - SELECT bookmark_guid, workspace_uuid, change_type, timestamp + SELECT bookmark_guid, workspace_uuid, change_type, timestamp FROM zen_bookmarks_workspaces_changes `); @@ -549,9 +553,11 @@ var ZenWorkspaceBookmarksStorage = { * Clear all recorded changes. */ async clearChangedIDs() { - await PlacesUtils.withConnectionWrapper('ZenWorkspaceBookmarksStorage.clearChangedIDs', async (db) => { + await ZenWorkspacesStorage.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspaceBookmarksStorage.clearChangedIDs', async (db) => { await db.execute(`DELETE FROM zen_bookmarks_workspaces_changes`); }); }, -}; \ No newline at end of file +}; + +ZenWorkspacesStorage.init(); diff --git a/src/browser/base/zen-components/actors/ZenGlanceChild.sys.mjs b/src/browser/base/zen-components/actors/ZenGlanceChild.sys.mjs index efec6ae20..b6fe22a07 100644 --- a/src/browser/base/zen-components/actors/ZenGlanceChild.sys.mjs +++ b/src/browser/base/zen-components/actors/ZenGlanceChild.sys.mjs @@ -44,7 +44,7 @@ export class ZenGlanceChild extends JSWindowActorChild { this.contentWindow.document.removeEventListener('click', this.clickListener); } else if (activationMethod === 'ctrl' || activationMethod === 'alt' || activationMethod === 'shift') { - this.contentWindow.document.addEventListener('click', this.clickListener); + this.contentWindow.document.addEventListener('click', this.clickListener, { capture: true }); this.contentWindow.removeEventListener('mousedown', this.mouseDownListener); this.contentWindow.removeEventListener('mouseup', this.mouseUpListener); diff --git a/src/browser/components/BrowserGlue-sys-mjs.patch b/src/browser/components/BrowserGlue-sys-mjs.patch index 9e1923e07..042d3a1d4 100644 --- a/src/browser/components/BrowserGlue-sys-mjs.patch +++ b/src/browser/components/BrowserGlue-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs -index f4ea0c87a35a19c09f811576201a7adb865ed74c..89e44ab4d3b6f0ce0ecf89c4b8b484b7da5fa2ea 100644 +index 2de73e75bf98b21dde9ec05213a66f9e9039200f..04ab3ea4c47d674778e8965654867c4cf0f99161 100644 --- a/browser/components/BrowserGlue.sys.mjs +++ b/browser/components/BrowserGlue.sys.mjs -@@ -4436,6 +4436,7 @@ BrowserGlue.prototype = { +@@ -4643,6 +4643,7 @@ BrowserGlue.prototype = { }, async _maybeShowDefaultBrowserPrompt() { @@ -10,14 +10,14 @@ index f4ea0c87a35a19c09f811576201a7adb865ed74c..89e44ab4d3b6f0ce0ecf89c4b8b484b7 // Highest priority is about:welcome window modal experiment // Second highest priority is the upgrade dialog, which can include a "primary // browser" request and is limited in various ways, e.g., major upgrades. -@@ -4894,6 +4895,16 @@ BrowserGlue.prototype = { +@@ -5169,6 +5170,16 @@ BrowserGlue.prototype = { "nsIObserver", "nsISupportsWeakReference", ]), + + _ZenMaybeShowWelcomeScreen() { -+ const welcomeEnabled = Services.prefs.getBoolPref("zen.welcomeScreen.enabled", true) -+ const welcomeSeen = Services.prefs.getBoolPref("zen.welcomeScreen.seen", false) ++ const welcomeEnabled = Services.prefs.getBoolPref("zen.welcome-screen.enabled", true) ++ const welcomeSeen = Services.prefs.getBoolPref("zen.welcome-screen.seen", false) + if (welcomeEnabled && !welcomeSeen) { + lazy.BrowserWindowTracker.getTopWindow().gDialogBox.open( + "chrome://browser/content/zen-welcome/welcome.html" diff --git a/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch b/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch index 20d6ec8f1..b56e2195c 100644 --- a/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch +++ b/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs -index 989e69245aeb1185125752db6b9c58e462d554e4..3eef114cc711505c647e21e35a063fb7bc9a0477 100644 +index 45d0e0e4872eeabf87862dbadfee1dc211ed7bed..04a65485a3493fd42b2a58523123f1392ed9c3b2 100644 --- a/browser/components/customizableui/CustomizableUI.sys.mjs +++ b/browser/components/customizableui/CustomizableUI.sys.mjs @@ -13,6 +13,7 @@ ChromeUtils.defineESModuleGetters(lazy, { @@ -19,7 +19,7 @@ index 989e69245aeb1185125752db6b9c58e462d554e4..3eef114cc711505c647e21e35a063fb7 const kSpecialWidgetPfx = "customizableui-special-"; -@@ -323,13 +324,14 @@ var CustomizableUIInternal = { +@@ -307,13 +308,14 @@ var CustomizableUIInternal = { "spring", "urlbar-container", "spring", @@ -37,7 +37,7 @@ index 989e69245aeb1185125752db6b9c58e462d554e4..3eef114cc711505c647e21e35a063fb7 this.registerArea( CustomizableUI.AREA_NAVBAR, { -@@ -338,7 +340,7 @@ var CustomizableUIInternal = { +@@ -322,7 +324,7 @@ var CustomizableUIInternal = { defaultPlacements: navbarPlacements, verticalTabsDefaultPlacements: [ "firefox-view-button", @@ -46,7 +46,7 @@ index 989e69245aeb1185125752db6b9c58e462d554e4..3eef114cc711505c647e21e35a063fb7 "alltabs-button", ], defaultCollapsed: false, -@@ -363,10 +365,10 @@ var CustomizableUIInternal = { +@@ -347,10 +349,10 @@ var CustomizableUIInternal = { { type: CustomizableUI.TYPE_TOOLBAR, defaultPlacements: [ @@ -60,7 +60,7 @@ index 989e69245aeb1185125752db6b9c58e462d554e4..3eef114cc711505c647e21e35a063fb7 ], verticalTabsDefaultPlacements: [], defaultCollapsed: null, -@@ -429,6 +431,7 @@ var CustomizableUIInternal = { +@@ -413,6 +415,7 @@ var CustomizableUIInternal = { CustomizableUI.AREA_NAVBAR, CustomizableUI.AREA_BOOKMARKS, CustomizableUI.AREA_TABSTRIP, @@ -68,7 +68,7 @@ index 989e69245aeb1185125752db6b9c58e462d554e4..3eef114cc711505c647e21e35a063fb7 ]); if (AppConstants.platform != "macosx") { toolbars.add(CustomizableUI.AREA_MENUBAR); -@@ -1144,6 +1147,9 @@ var CustomizableUIInternal = { +@@ -1128,6 +1131,9 @@ var CustomizableUIInternal = { placements = gPlacements.get(area); } @@ -78,15 +78,25 @@ index 989e69245aeb1185125752db6b9c58e462d554e4..3eef114cc711505c647e21e35a063fb7 // For toolbars that need it, mark as dirty. let defaultPlacements = areaProperties.get("defaultPlacements"); if ( -@@ -3603,6 +3609,7 @@ var CustomizableUIInternal = { +@@ -3603,7 +3609,7 @@ var CustomizableUIInternal = { + } + }, + +- _rebuildRegisteredAreas() { ++ _rebuildRegisteredAreas(zenDontRebuildCollapsed = false) { + for (let [areaId, areaNodes] of gBuildAreas) { + let placements = gPlacements.get(areaId); + let isFirstChangedToolbar = true; +@@ -3614,7 +3620,7 @@ var CustomizableUIInternal = { if (area.get("type") == CustomizableUI.TYPE_TOOLBAR) { let defaultCollapsed = area.get("defaultCollapsed"); let win = areaNode.ownerGlobal; -+ win.gZenVerticalTabsManager._updateEvent(); - if (defaultCollapsed !== null) { +- if (defaultCollapsed !== null) { ++ if (defaultCollapsed !== null && !zenDontRebuildCollapsed) { win.setToolbarVisibility( areaNode, -@@ -4558,6 +4565,7 @@ export var CustomizableUI = { + typeof defaultCollapsed == "string" +@@ -4572,6 +4578,7 @@ export var CustomizableUI = { unregisterArea(aName, aDestroyPlacements) { CustomizableUIInternal.unregisterArea(aName, aDestroyPlacements); }, diff --git a/src/browser/components/places/content/editBookmarkPanel-inc-xhtml.patch b/src/browser/components/places/content/editBookmarkPanel-inc-xhtml.patch index 363e8d2de..fd1ec981e 100644 --- a/src/browser/components/places/content/editBookmarkPanel-inc-xhtml.patch +++ b/src/browser/components/places/content/editBookmarkPanel-inc-xhtml.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/places/content/editBookmarkPanel.inc.xhtml b/browser/components/places/content/editBookmarkPanel.inc.xhtml -index 3ec3f094831c2143a818b43d1761a571f0ffa63d..c4dd904604ee10a909bbcc7c03dd0dd3536020b1 100644 +index 3ec3f094831c2143a818b43d1761a571f0ffa63d..98704f399089f2a33776c6ae9565b8ff9b8ddd34 100644 --- a/browser/components/places/content/editBookmarkPanel.inc.xhtml +++ b/browser/components/places/content/editBookmarkPanel.inc.xhtml @@ -5,7 +5,7 @@ @@ -34,7 +34,7 @@ index 3ec3f094831c2143a818b43d1761a571f0ffa63d..c4dd904604ee10a909bbcc7c03dd0dd3 oncommand="gEditItemOverlay.toggleFolderTreeVisibility();"/> + -+ ++ + @@ -49,7 +49,7 @@ index 3ec3f094831c2143a818b43d1761a571f0ffa63d..c4dd904604ee10a909bbcc7c03dd0dd3 + oncommand="gEditItemOverlay.onWorkspaceDropdownToggle();"/> + + -+ ++ + + + diff --git a/src/browser/components/preferences/zen-settings.js b/src/browser/components/preferences/zen-settings.js index e0961cc1c..f96b360ce 100644 --- a/src/browser/components/preferences/zen-settings.js +++ b/src/browser/components/preferences/zen-settings.js @@ -439,7 +439,7 @@ var gZenMarketplaceManager = { } input.addEventListener( - 'input', + 'change', ZenThemesCommon.throttle((event) => { const value = event.target.value; @@ -485,6 +485,9 @@ var gZenMarketplaceManager = { }, }; +const kZenExtendedSidebar = 'zen.view.sidebar-expanded'; +const kZenSingleToolbar = 'zen.view.use-single-toolbar'; + var gZenLooksAndFeel = { init() { if (this.__hasInitialized) return; @@ -495,12 +498,57 @@ var gZenLooksAndFeel = { gZenMarketplaceManager.init(); var onPreferColorSchemeChange = this.onPreferColorSchemeChange.bind(this); window.matchMedia('(prefers-color-scheme: dark)').addListener(onPreferColorSchemeChange); + for (const pref of [kZenExtendedSidebar, kZenSingleToolbar]) { + Services.prefs.addObserver(pref, this); + } this.onPreferColorSchemeChange(); window.addEventListener('unload', () => { window.matchMedia('(prefers-color-scheme: dark)').removeListener(onPreferColorSchemeChange); + for (const pref of [kZenExtendedSidebar, kZenSingleToolbar]) { + Services.prefs.removeObserver(pref, this); + } }); this.setDarkThemeListener(); this.setCompactModeStyle(); + + this.applySidebarLayout(); + }, + + observe(subject, topic, data) { + this.applySidebarLayout(); + }, + + applySidebarLayout() { + const isSingleToolbar = Services.prefs.getBoolPref(kZenSingleToolbar); + const isExtendedSidebar = Services.prefs.getBoolPref(kZenExtendedSidebar); + for (const layout of document.getElementById('zenLayoutList').children) { + layout.classList.remove('selected'); + if (layout.getAttribute('layout') == 'single' && isSingleToolbar) { + layout.classList.add('selected'); + } else if (layout.getAttribute('layout') == 'multiple' && !isSingleToolbar && isExtendedSidebar) { + layout.classList.add('selected'); + } else if (layout.getAttribute('layout') == 'collapsed' && !isExtendedSidebar) { + layout.classList.add('selected'); + } + } + if (this.__hasInitializedLayout) return; + this.__hasInitializedLayout = true; + for (const layout of document.getElementById('zenLayoutList').children) { + layout.addEventListener('click', () => { + if (layout.hasAttribute('disabled')) { + return; + } + + for (const el of document.getElementById('zenLayoutList').children) { + el.classList.remove('selected'); + } + + layout.classList.add('selected'); + + Services.prefs.setBoolPref(kZenExtendedSidebar, layout.getAttribute('layout') != 'collapsed'); + Services.prefs.setBoolPref(kZenSingleToolbar, layout.getAttribute('layout') == 'single'); + }); + } }, onPreferColorSchemeChange(event) { @@ -641,12 +689,10 @@ var gZenWorkspacesSettings = { }, async onWorkspaceChange(checked) { - if (checked) { - let buttonIndex = await confirmRestartPrompt(true, 1, true, false); - if (buttonIndex == CONFIRM_RESTART_PROMPT_RESTART_NOW) { - Services.startup.quit(Ci.nsIAppStartup.eAttemptQuit | Ci.nsIAppStartup.eRestart); - return; - } + let buttonIndex = await confirmRestartPrompt(true, 1, true, false); + if (buttonIndex == CONFIRM_RESTART_PROMPT_RESTART_NOW) { + Services.startup.quit(Ci.nsIAppStartup.eAttemptQuit | Ci.nsIAppStartup.eRestart); + return; } }, }; @@ -1041,6 +1087,11 @@ Preferences.addAll([ type: "bool", default: true, }, + { + id: "zen.urlbar.behavior", + type: "string", + default: "float", + }, { id: "zen.view.compact.color-sidebar", type: "bool", diff --git a/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml b/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml index 2c92b5fd5..170c6745b 100644 --- a/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml +++ b/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml @@ -1,6 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - diff --git a/src/browser/components/preferences/zenMarketplace.inc.xhtml b/src/browser/components/preferences/zenMarketplace.inc.xhtml index 77ab45998..ba923554c 100644 --- a/src/browser/components/preferences/zenMarketplace.inc.xhtml +++ b/src/browser/components/preferences/zenMarketplace.inc.xhtml @@ -15,7 +15,7 @@ - + diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index 699cafcd8..ba2192a4d 100644 --- a/src/browser/components/tabbrowser/content/tabbrowser-js.patch +++ b/src/browser/components/tabbrowser/content/tabbrowser-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js -index fec3dc8129a4d235fdd05e0390145a02064ebaa5..636b56754f48c1ec931152cf34bab8414a75cebc 100644 +index fec3dc8129a4d235fdd05e0390145a02064ebaa5..65f0675f558bda9a1d02335418ffb92bcb2463de 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js @@ -402,11 +402,26 @@ @@ -84,29 +84,47 @@ index fec3dc8129a4d235fdd05e0390145a02064ebaa5..636b56754f48c1ec931152cf34bab841 } else { aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1; } -@@ -2651,6 +2671,11 @@ +@@ -2651,6 +2671,12 @@ ); } + let hasZenDefaultUserContextId = false; ++ let zenForcedWorkspaceId = undefined; + if (typeof ZenWorkspaces !== "undefined") { -+ [userContextId, hasZenDefaultUserContextId] = ZenWorkspaces.getContextIdIfNeeded(userContextId, fromExternal, allowInheritPrincipal); ++ [userContextId, hasZenDefaultUserContextId, zenForcedWorkspaceId] = ZenWorkspaces.getContextIdIfNeeded(userContextId, fromExternal, allowInheritPrincipal); + } + if (!UserInteraction.running("browser.tabs.opening", window)) { UserInteraction.start("browser.tabs.opening", "initting", window); } -@@ -2720,6 +2745,9 @@ +@@ -2720,6 +2746,12 @@ noInitialLabel, skipBackgroundNotify, }); + if (hasZenDefaultUserContextId) { + t.setAttribute("zenDefaultUserContextId", "true"); ++ } ++ if (zenForcedWorkspaceId !== undefined) { ++ t.setAttribute("zen-workspace-id", zenForcedWorkspaceId); + } if (insertTab) { // insert the tab into the tab container in the correct position this._insertTabAtIndex(t, { -@@ -3342,6 +3370,23 @@ +@@ -2862,6 +2894,13 @@ + } + } + ++ requestAnimationFrame(() => { ++ t.setAttribute("zen-initial-fadein", "true"); ++ setTimeout(() => { ++ t.removeAttribute("zen-initial-fadein"); ++ }, 2000); ++ }); ++ + // Additionally send pinned tab events + if (pinned) { + this._notifyPinnedStatus(t); +@@ -3342,6 +3381,23 @@ ) { tabWasReused = true; tab = this.selectedTab; @@ -130,7 +148,7 @@ index fec3dc8129a4d235fdd05e0390145a02064ebaa5..636b56754f48c1ec931152cf34bab841 if (!tabData.pinned) { this.unpinTab(tab); } else { -@@ -3355,6 +3400,9 @@ +@@ -3355,6 +3411,9 @@ restoreTabsLazily && !select && !tabData.pinned; let url = "about:blank"; @@ -140,7 +158,7 @@ index fec3dc8129a4d235fdd05e0390145a02064ebaa5..636b56754f48c1ec931152cf34bab841 if (tabData.entries?.length) { let activeIndex = (tabData.index || tabData.entries.length) - 1; // Ensure the index is in bounds. -@@ -3391,6 +3439,21 @@ +@@ -3391,6 +3450,21 @@ preferredRemoteType, }); @@ -162,7 +180,7 @@ index fec3dc8129a4d235fdd05e0390145a02064ebaa5..636b56754f48c1ec931152cf34bab841 if (select) { tabToSelect = tab; } -@@ -3444,7 +3507,6 @@ +@@ -3444,7 +3518,6 @@ this.tabContainer._invalidateCachedTabs(); } } @@ -170,7 +188,7 @@ index fec3dc8129a4d235fdd05e0390145a02064ebaa5..636b56754f48c1ec931152cf34bab841 tab.initialize(); } -@@ -3992,6 +4054,10 @@ +@@ -3992,6 +4065,10 @@ return; } @@ -181,7 +199,7 @@ index fec3dc8129a4d235fdd05e0390145a02064ebaa5..636b56754f48c1ec931152cf34bab841 this.removeTabs(selectedTabs); }, -@@ -4309,6 +4375,13 @@ +@@ -4309,6 +4386,13 @@ TelemetryStopwatch.start("FX_TAB_CLOSE_TIME_NO_ANIM_MS", aTab); } @@ -195,7 +213,7 @@ index fec3dc8129a4d235fdd05e0390145a02064ebaa5..636b56754f48c1ec931152cf34bab841 // Handle requests for synchronously removing an already // asynchronously closing tab. if (!animate && aTab.closing) { -@@ -4324,6 +4397,10 @@ +@@ -4324,6 +4408,10 @@ // state). let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width; @@ -206,7 +224,7 @@ index fec3dc8129a4d235fdd05e0390145a02064ebaa5..636b56754f48c1ec931152cf34bab841 if ( !this._beginRemoveTab(aTab, { closeWindowFastpath: true, -@@ -4472,7 +4549,7 @@ +@@ -4472,7 +4560,7 @@ var closeWindow = false; var newTab = false; @@ -215,7 +233,7 @@ index fec3dc8129a4d235fdd05e0390145a02064ebaa5..636b56754f48c1ec931152cf34bab841 closeWindow = closeWindowWithLastTab != null ? closeWindowWithLastTab -@@ -5265,10 +5342,10 @@ +@@ -5265,10 +5353,10 @@ SessionStore.deleteCustomTabValue(aTab, "hiddenBy"); }, @@ -228,7 +246,7 @@ index fec3dc8129a4d235fdd05e0390145a02064ebaa5..636b56754f48c1ec931152cf34bab841 aTab.selected || aTab.closing || // Tabs that are sharing the screen, microphone or camera cannot be hidden. -@@ -7181,6 +7258,7 @@ +@@ -7181,6 +7269,7 @@ aWebProgress.isTopLevel ) { this.mTab.setAttribute("busy", "true"); @@ -236,7 +254,7 @@ index fec3dc8129a4d235fdd05e0390145a02064ebaa5..636b56754f48c1ec931152cf34bab841 gBrowser._tabAttrModified(this.mTab, ["busy"]); this.mTab._notselectedsinceload = !this.mTab.selected; gBrowser.syncThrobberAnimations(this.mTab); -@@ -8114,7 +8192,7 @@ var TabContextMenu = { +@@ -8114,7 +8203,7 @@ var TabContextMenu = { ); contextUnpinSelectedTabs.hidden = !this.contextTab.pinned || !multiselectionContext; @@ -245,7 +263,7 @@ index fec3dc8129a4d235fdd05e0390145a02064ebaa5..636b56754f48c1ec931152cf34bab841 // Move Tab items let contextMoveTabOptions = document.getElementById( "context_moveTabOptions" -@@ -8148,7 +8226,7 @@ var TabContextMenu = { +@@ -8148,7 +8237,7 @@ var TabContextMenu = { let contextMoveTabToStart = document.getElementById("context_moveToStart"); let isFirstTab = tabsToMove[0] == visibleTabs[0] || @@ -254,7 +272,7 @@ index fec3dc8129a4d235fdd05e0390145a02064ebaa5..636b56754f48c1ec931152cf34bab841 contextMoveTabToStart.disabled = isFirstTab && allSelectedTabsAdjacent; document.getElementById("context_openTabInWindow").disabled = -@@ -8376,6 +8454,7 @@ var TabContextMenu = { +@@ -8376,6 +8465,7 @@ var TabContextMenu = { if (this.contextTab.multiselected) { gBrowser.removeMultiSelectedTabs(); } else { diff --git a/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch b/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch new file mode 100644 index 000000000..60be28a95 --- /dev/null +++ b/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch @@ -0,0 +1,66 @@ +diff --git a/browser/components/urlbar/UrlbarInput.sys.mjs b/browser/components/urlbar/UrlbarInput.sys.mjs +index c504c9afc43785b5f003bb1f9f1dfbddef38d78b..b8acf033b211b18ff5114a81648483abf165be51 100644 +--- a/browser/components/urlbar/UrlbarInput.sys.mjs ++++ b/browser/components/urlbar/UrlbarInput.sys.mjs +@@ -65,6 +65,13 @@ XPCOMUtils.defineLazyPreferenceGetter( + false + ); + ++XPCOMUtils.defineLazyPreferenceGetter( ++ lazy, ++ "ZEN_URLBAR_BEHAVIOR", ++ "zen.urlbar.behavior", ++ 'default' ++); ++ + const DEFAULT_FORM_HISTORY_NAME = "searchbar-history"; + const SEARCH_BUTTON_CLASS = "urlbar-search-button"; + +@@ -2154,6 +2161,10 @@ export class UrlbarInput { + + this.setAttribute("breakout-extend", "true"); + ++ if (lazy.ZEN_URLBAR_BEHAVIOR == 'float' || (lazy.ZEN_URLBAR_BEHAVIOR == 'floating-on-type' && !this.focusedViaMousedown)) { ++ this.setAttribute("zen-floating-urlbar", "true"); ++ } else this.removeAttribute("zen-floating-urlbar"); ++ + // 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")) { +@@ -3901,6 +3912,11 @@ export class UrlbarInput { + } + + _on_click(event) { ++ if (lazy.ZEN_URLBAR_BEHAVIOR === 'float' && event.target == this.inputField) { ++ event.zenOriginalTarget = this.textbox; ++ this._on_mousedown(event); ++ } ++ + if ( + event.target == this.inputField || + event.target == this._inputContainer || +@@ -4012,9 +4028,12 @@ export class UrlbarInput { + } + + _on_mousedown(event) { +- switch (event.currentTarget) { ++ switch (event.zenOriginalTarget || event.currentTarget) { + case this.textbox: { + this._mousedownOnUrlbarDescendant = true; ++ if (event.type != "click" && lazy.ZEN_URLBAR_BEHAVIOR === 'float') { ++ return true; ++ } + + if ( + event.target != this.inputField && +@@ -4024,8 +4043,8 @@ export class UrlbarInput { + break; + } + +- this.focusedViaMousedown = !this.focused; +- this._preventClickSelectsAll = this.focused; ++ this.focusedViaMousedown = !(lazy.ZEN_URLBAR_BEHAVIOR === 'default' ? this.focused : this.hasAttribute("breakout-extend")); ++ this._preventClickSelectsAll = lazy.ZEN_URLBAR_BEHAVIOR === 'default' ? this.focused : this.hasAttribute("breakout-extend"); + + // Keep the focus status, since the attribute may be changed + // upon calling this.focus(). diff --git a/src/browser/components/urlbar/UrlbarView-sys-mjs.patch b/src/browser/components/urlbar/UrlbarView-sys-mjs.patch new file mode 100644 index 000000000..046c8d571 --- /dev/null +++ b/src/browser/components/urlbar/UrlbarView-sys-mjs.patch @@ -0,0 +1,13 @@ +diff --git a/browser/components/urlbar/UrlbarView.sys.mjs b/browser/components/urlbar/UrlbarView.sys.mjs +index 197e0a1c3030b6346c49a010338130797c1e5f4b..333d38aea2116c5407ffc242b805db633df12968 100644 +--- a/browser/components/urlbar/UrlbarView.sys.mjs ++++ b/browser/components/urlbar/UrlbarView.sys.mjs +@@ -628,7 +628,7 @@ export class UrlbarView { + !this.input.value || + this.input.getAttribute("pageproxystate") == "valid" + ) { +- if (!this.isOpen && ["mousedown", "command"].includes(event.type)) { ++ if (!this.isOpen && ["mousedown", "click", "command"].includes(event.type)) { + // Try to reuse the cached top-sites context. If it's not cached, then + // there will be a gap of time between when the input is focused and + // when the view opens that can be perceived as flicker. diff --git a/src/browser/components/zen-welcome/welcome.css b/src/browser/components/zen-welcome/welcome.css index 08ce799f6..27c7e5b20 100644 --- a/src/browser/components/zen-welcome/welcome.css +++ b/src/browser/components/zen-welcome/welcome.css @@ -19,96 +19,92 @@ body { width: 100%; height: 100%; overflow: hidden; - transition: 2s; - -moz-transform: scale(1.1); /* zoom */ user-select: none; } body { - --zen-gradient-color: var(--zen-colors-secondary); - --zen-gradient-background: var(--zen-colors-tertiary); - --zen-gradient-border: #fbffbe; - - &::before, - &::after { - content: ''; - position: absolute; - top: 0; - left: 0; - z-index: -1; - display: block; - width: 100%; - height: 100%; - } - - &::before { - background: radial-gradient(circle at 50%, var(--zen-gradient-background) 20%, var(--zen-gradient-color) 60%); - mask: var(--noise), radial-gradient(circle at 50%, transparent 20%, light-dark(#000, #fff) (60% + 10%)); - } - - &::after { - mask-image: var(--noise), linear-gradient(45deg, #000 0%, transparent 25%, transparent 75%, #000 100%); - background: linear-gradient( - 45deg, - #6d6dff 10%, - var(--zen-gradient-background) 25%, - var(--zen-gradient-background) 75%, - var(--zen-gradient-border) 90% - ); - } + background: var(--zen-branding-bg); } -@media (prefers-color-scheme: dark) { - body { - --zen-gradient-border: rgb(32, 32, 28); - --zen-gradient-color: transparent; - } -} - -#first-view { +#main-view { display: flex; flex-direction: column; justify-content: center; align-items: center; - box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1); - background: var(--zen-dialog-background); - width: 55%; position: relative; - padding: 5% 4%; - overflow: hidden; - border-right: 1px solid var(--zen-colors-border); + width: fit-content; + margin: auto; +} + +#welcome .zen-branding-title, +#thanks .zen-branding-title { + text-align: center; + font-size: 9rem; } #buttons-footer { margin-top: auto; - padding: 10px; - width: -moz-available; + padding: 20px 0; + width: 100%; display: flex; justify-content: space-between; align-items: center; z-index: 2; } -#second-view { +body:has(#welcome:not([hidden='true'])) { + background: var(--zen-branding-coral); + color: var(--zen-branding-paper); +} + +body:has(:is(#welcome, #thanks):not([hidden='true'])) { + & #buttons-footer { + justify-content: center; + position: fixed; + bottom: 40px; + margin: 0 auto; + + & button { + background: var(--zen-branding-paper) !important; + color: var(--zen-branding-dark) !important; + } + } +} + +:is(#theme, #search) > div:nth-child(2) { width: 100%; - height: 100%; - position: relative; +} + +#main-view:has(:is(#welcome, #thanks):not([hidden='true'])) { + width: 100%; + + & #back { + display: none; + } } button { padding: 8px; + border-radius: 999px; + font-size: 16px; + font-weight: 600; } -#footer-buttons button { - padding: 8px 0; +button.primary { + background: var(--zen-branding-bg-reverse); + color: var(--zen-branding-bg); + + &:hover { + background: var(--zen-branding-bg-reverse); + } } .page { display: flex; flex-direction: column; - justify-content: start; + justify-content: center; width: -moz-available; - height: 100%; + align-items: center; margin: 32px; } @@ -125,7 +121,7 @@ h2 { justify-content: start; } -.page-split > div:first-child { +.page-split:not(#import) > div:first-child { margin-bottom: 20px; } @@ -187,13 +183,16 @@ p { margin-bottom: 30px; } -.icon { +#zen-logo { -moz-context-properties: fill; fill: currentColor; display: inline-block; - height: 82px; - width: 82px; - margin-bottom: 20px; + height: 42px; + width: 42px; + position: absolute; + top: 40px; + left: 50%; + transform: translateX(-50%); } .asset { @@ -242,10 +241,50 @@ input[type='checkbox'] { animation: fadeInRight 0.3s ease-in-out forwards; } +#importBrowser { + width: 100%; + background: transparent !important; + border: 1px solid var(--zen-branding-bg-reverse); + color: var(--zen-branding-bg-reverse); + padding: 16px; + border-radius: 8px; + margin-bottom: 20px; + justify-content: start; + display: flex; +} + +#layoutList { + display: flex; + gap: 20px; + + & > [layout] { + display: flex; + flex-direction: column; + gap: 3px; + font-weight: 600; + cursor: pointer; + + &[disabled='true'] { + opacity: 0.7; + cursor: not-allowed; + } + + & img { + width: 250px; + border-radius: 10px; + border: 4px solid transparent; + } + + &.selected img { + border: 4px solid var(--zen-colors-primary); + } + } +} + @keyframes fadeInRight { from { opacity: 0; - transform: translate3d(40px, 0, 0); + transform: translate3d(0, 40px, 0); filter: blur(15px); } @@ -257,10 +296,12 @@ input[type='checkbox'] { } /* There should be no more than 5 elements in a page */ -.page:not([hidden='true']) > *:nth-child(2) { +.page:not([hidden='true']) > *:nth-child(2), +#layoutList [layout]:nth-child(2) { animation-delay: 0.1s; } -.page:not([hidden='true']) > *:nth-child(3) { +.page:not([hidden='true']) > *:nth-child(3), +#layoutList [layout]:nth-child(3) { animation-delay: 0.2s; } .page:not([hidden='true']) > *:nth-child(4) { @@ -298,7 +339,7 @@ input[type='checkbox'] { } #circular-progress circle.bg { - stroke: light-dark(#3f3f3f, #4d4d4d); + stroke: transparent; } #circular-progress circle.fg { @@ -306,7 +347,7 @@ input[type='checkbox'] { transform-origin: var(--half-size) var(--half-size); stroke-dasharray: var(--dash) calc(var(--circumference) - var(--dash)); transition: stroke-dasharray 0.3s linear 0s; - stroke: var(--zen-primary-color); + stroke: var(--zen-branding-coral); } #colorListWrapper { @@ -326,7 +367,7 @@ input[type='checkbox'] { border: 3px solid light-dark(#000, #fff); } -#welcome { +#welcome, #thanks { justify-content: center; } diff --git a/src/browser/components/zen-welcome/welcome.html b/src/browser/components/zen-welcome/welcome.html index aa31a24ed..41523d404 100644 --- a/src/browser/components/zen-welcome/welcome.html +++ b/src/browser/components/zen-welcome/welcome.html @@ -10,30 +10,34 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. - + + + + - - - - + + + - + + - - - - - + + @@ -41,15 +45,11 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. - - - - - + @@ -125,6 +125,27 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. + + + + + + + + + + + + + + + + + + + + + @@ -136,8 +157,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. - - + + - - - - - { + if (layout.hasAttribute('disabled')) { + return; + } + + for (const el of document.getElementById('layoutList').children) { + el.classList.remove('selected'); + } + + layout.classList.add('selected'); + + Services.prefs.setBoolPref(kExtendedSidebar, layout.getAttribute('layout') != 'collapsed'); + Services.prefs.setBoolPref(kSingleToolbar, layout.getAttribute('layout') == 'single'); + }); + } + } +} + class Thanks extends Page { constructor(id) { super(id); @@ -242,16 +272,12 @@ class Pages { * @param {Page[]} pages The pages */ constructor(pages) { - console.info('Initializing welcome pages...'); this.pages = pages; this.currentPage = 0; - window.maximize(); - this.pages.forEach((page) => page.setPages(this)); this._displayCurrentPage(); - console.info('Welcome pages initialized.'); this.nextEl = document.getElementById(`next`); this.prevEl = document.getElementById(`back`); @@ -304,6 +330,7 @@ class Pages { const pages = new Pages([ new Page('welcome'), new Themes('theme'), + new Layout('layout'), new Import('import'), new Search('search'), new Thanks('thanks'), diff --git a/src/browser/locales/en-US/browser/editBookmarkOverlay-ftl.patch b/src/browser/locales/en-US/browser/editBookmarkOverlay-ftl.patch deleted file mode 100644 index 6f857f41b..000000000 --- a/src/browser/locales/en-US/browser/editBookmarkOverlay-ftl.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/browser/locales/en-US/browser/editBookmarkOverlay.ftl b/browser/locales/en-US/browser/editBookmarkOverlay.ftl -index da74660e48620fe9097d05a51ba4be34f21246e6..d70b98c71ca3a70732c633d939079f9fb589726f 100644 ---- a/browser/locales/en-US/browser/editBookmarkOverlay.ftl -+++ b/browser/locales/en-US/browser/editBookmarkOverlay.ftl -@@ -37,6 +37,10 @@ bookmark-overlay-tags-2 = - .value = Tags - .accesskey = T - -+zen-bookmark-edit-panel-workspace-selector = -+ .value = Workspaces -+ .accesskey = W -+ - bookmark-overlay-tags-empty-description = - .placeholder = Separate tags with commas - diff --git a/src/browser/themes/shared/browser-shared-css.patch b/src/browser/themes/shared/browser-shared-css.patch index 577cb8896..4d96f3d11 100644 --- a/src/browser/themes/shared/browser-shared-css.patch +++ b/src/browser/themes/shared/browser-shared-css.patch @@ -1,8 +1,8 @@ diff --git a/browser/themes/shared/browser-shared.css b/browser/themes/shared/browser-shared.css -index f2171eb033a1143870f4708c63f565fabb535c4b..4280bc4b0f7cdbd94179fa2111f8001a331ea42b 100644 +index 08bc078c2572fb218b435e580ef71be2586989c3..e440b6dc3f331785c841e1702887f67a67e00e96 100644 --- a/browser/themes/shared/browser-shared.css +++ b/browser/themes/shared/browser-shared.css -@@ -188,7 +187,6 @@ body { +@@ -144,7 +144,6 @@ body { transition: background-color var(--inactive-window-transition); &:-moz-window-inactive { @@ -10,8 +10,8 @@ index f2171eb033a1143870f4708c63f565fabb535c4b..4280bc4b0f7cdbd94179fa2111f8001a color: var(--toolbox-non-lwt-textcolor-inactive); } -@@ -196,6 +194,31 @@ body { - border-bottom-color: var(--chrome-content-separator-color); +@@ -163,6 +162,31 @@ body { + border-bottom-color: var(--chrome-content-separator-color); } + @@ -38,7 +38,7 @@ index f2171eb033a1143870f4708c63f565fabb535c4b..4280bc4b0f7cdbd94179fa2111f8001a + background-repeat: no-repeat, var(--lwt-background-tiling); + background-position: right top, var(--lwt-background-alignment); + } -+ ++ :root[customizing] & { border-bottom-style: none; } diff --git a/src/browser/themes/shared/places/editBookmark-css.patch b/src/browser/themes/shared/places/editBookmark-css.patch deleted file mode 100644 index ba592ad75..000000000 --- a/src/browser/themes/shared/places/editBookmark-css.patch +++ /dev/null @@ -1,59 +0,0 @@ -diff --git a/browser/themes/shared/places/editBookmark.css b/browser/themes/shared/places/editBookmark.css -index 4c00982e620f4cfd5aa1d97d45a276f5d41d0d74..58018015d6046895c996f808785ab7282e5fed81 100644 ---- a/browser/themes/shared/places/editBookmark.css -+++ b/browser/themes/shared/places/editBookmark.css -@@ -158,3 +158,53 @@ - font-size: 0.9em; - margin: 2px 4px; - } -+ -+/*Bookmark workspace selector styles*/ -+.workspace-dropdown { -+ position: relative; -+ width: 100%; -+ display: flex; -+ gap: 16px; -+} -+ -+.workspace-trigger { -+ width: 100%; -+ text-align: left; -+ padding: 8px 12px; -+ border: 1px solid var(--card-outline-color); -+ border-radius: 4px; -+ background-color: var(--zen-colors-tertiary); -+ display: flex; -+ align-items: center; -+ justify-content: space-between; -+} -+ -+.workspace-list { -+ flex-direction: column; -+ width: 100%; -+ max-height: 200px; -+ overflow-y: auto; -+ margin-top: 4px; -+ border: 1px solid var(--card-outline-color); -+ border-radius: 4px; -+ background-color: var(--zen-colors-tertiary); -+ box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1); -+ padding: 4px 0; -+} -+ -+.workspace-list li { -+ list-style: none; -+ margin: 0; -+ padding: 0; -+} -+ -+.workspace-list li > label { -+ display: flex; -+ align-items: center; -+ padding: 4px 12px; -+ cursor: pointer; -+} -+ -+.workspace-list input[type="checkbox"] { -+ margin-right: 8px; -+} -\ No newline at end of file diff --git a/src/browser/themes/shared/preferences/zen-preferences.css b/src/browser/themes/shared/preferences/zen-preferences.css index 5e147c8ec..65b90e138 100644 --- a/src/browser/themes/shared/preferences/zen-preferences.css +++ b/src/browser/themes/shared/preferences/zen-preferences.css @@ -200,6 +200,12 @@ groupbox h2 { } } +@media (-moz-bool-pref: 'zen.view.use-single-toolbar') { + #zen-compact-mode-styles-form { + display: none; + } +} + #zen-expand-tabbar-strat { display: flex; flex-direction: column; @@ -260,7 +266,7 @@ groupbox h2 { padding: 7px; - &[left] div { + &[top] div { width: 100%; background: var(--zen-primary-color); border-radius: 5px; @@ -268,7 +274,7 @@ groupbox h2 { box-shadow: var(--zen-compact-mode-styles-shadow); } - &[top] div { + &[left] div { width: 18px; background: var(--zen-primary-color); border-radius: 5px; @@ -598,6 +604,35 @@ groupbox h2 { } } +#zenLayoutList { + display: flex; + gap: 20px; + margin-bottom: 10px; + + & > [layout] { + display: flex; + flex-direction: column; + gap: 3px; + font-weight: 600; + cursor: pointer; + + &[disabled='true'] { + opacity: 0.7; + cursor: not-allowed; + } + + & img { + width: 250px; + border-radius: 10px; + border: 4px solid transparent; + } + + &.selected img { + border: 4px solid var(--zen-colors-primary); + } + } +} + /* Disable mozilla's settings */ #dataCollectionCategory, diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css index 55d41a2cf..cfddf5e65 100644 --- a/src/browser/themes/shared/zen-icons/icons.css +++ b/src/browser/themes/shared/zen-icons/icons.css @@ -26,19 +26,11 @@ #forward-button, #zen-sidebar-web-panel-forward { list-style-image: url('forward.svg') !important; - - @media (max-width: 650px) { - display: none; - } } #reload-button, #zen-sidebar-web-panel-reload { list-style-image: url('reload.svg') !important; - - @media (max-width: 650px) { - display: none; - } } #stop-button, @@ -82,10 +74,6 @@ #appMenu-downloads-button, #appMenu-library-downloads-button { list-style-image: url('downloads.svg') !important; - - @media (max-width: 650px) { - display: none; - } } #appMenu-translate-button { @@ -302,7 +290,7 @@ } #identity-box[pageproxystate='valid'].chromeUI #identity-icon { - list-style-image: url('firefox.svg') !important; + filter: grayscale(1); } #identity-box[pageproxystate='valid'].localResource #identity-icon { @@ -342,7 +330,7 @@ } #identity-popup[connection='chrome'] .identity-popup-security-connection { - list-style-image: url('firefox.svg') !important; + filter: grayscale(1); } #identity-popup[connection='file'] .identity-popup-security-connection { diff --git a/src/browser/themes/windows/browser-css.patch b/src/browser/themes/windows/browser-css.patch index 0db07f4c2..1bf29c49f 100644 --- a/src/browser/themes/windows/browser-css.patch +++ b/src/browser/themes/windows/browser-css.patch @@ -1,8 +1,24 @@ diff --git a/browser/themes/windows/browser.css b/browser/themes/windows/browser.css -index b5cbdd7d226e4b7c8909688b05763db74f0b87fb..b5247cd4f43a906f72f34169775531e2266cb215 100644 +index 95b571aca107a6b3e0e5a7e5eb8672c66be9bf61..9ed448c2142b6a5dbb6132ffe5e65a1771a4a525 100644 --- a/browser/themes/windows/browser.css +++ b/browser/themes/windows/browser.css -@@ -47,7 +47,7 @@ +@@ -31,15 +31,6 @@ + &:not([lwtheme]) { + background-color: transparent; + +- /* Accent color in titlebar overrides Mica. */ +- @media not (-moz-windows-accent-color-in-titlebar) { +- /* Hide the Firefox buttons since Windows draws their own. +- * FIXME(emilio): Find a way of hiding the native buttons, or make them +- * taller, this is very hacky. */ +- .titlebar-buttonbox { +- opacity: 0; +- } +- } + } + } + +@@ -57,7 +48,7 @@ } &[sizemode="normal"] #navigator-toolbox { diff --git a/src/devtools/startup/locales/en-US/key-shortcuts-ftl.patch b/src/devtools/startup/locales/en-US/key-shortcuts-ftl.patch new file mode 100644 index 000000000..81f09b97d --- /dev/null +++ b/src/devtools/startup/locales/en-US/key-shortcuts-ftl.patch @@ -0,0 +1,13 @@ +diff --git a/devtools/startup/locales/en-US/key-shortcuts.ftl b/devtools/startup/locales/en-US/key-shortcuts.ftl +index bbc2c7ca1e8c3544289407371457790cf8b0fa65..f307e5cb75df9175106184f97b2f500c1adf9fca 100644 +--- a/devtools/startup/locales/en-US/key-shortcuts.ftl ++++ b/devtools/startup/locales/en-US/key-shortcuts.ftl +@@ -13,7 +13,7 @@ devtools-commandkey-browser-console = J + # Key pressed to toggle on the Responsive Design Mode + devtools-commandkey-responsive-design-mode = M + # Key pressed to open a toolbox with the inspector panel selected +-devtools-commandkey-inspector = C ++devtools-commandkey-inspector = L + # Key pressed to open a toolbox with the web console panel selected + devtools-commandkey-webconsole = K + # Key pressed to open a toolbox with the debugger panel selected diff --git a/src/modules/libpref/init/StaticPrefList-yaml.patch b/src/modules/libpref/init/StaticPrefList-yaml.patch new file mode 100644 index 000000000..02629e3b3 --- /dev/null +++ b/src/modules/libpref/init/StaticPrefList-yaml.patch @@ -0,0 +1,13 @@ +diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml +index c63a259a51c4862bc8f73eabdc5730bfe2f28da4..f9b8431071e73ce55972c12354ed44bc3a4df9c0 100644 +--- a/modules/libpref/init/StaticPrefList.yaml ++++ b/modules/libpref/init/StaticPrefList.yaml +@@ -17651,7 +17651,7 @@ + # Whether we use the mica backdrop. Off by default for now. + - name: widget.windows.mica + type: bool +- value: false ++ value: true + mirror: once + #endif + diff --git a/src/mozglue/misc/PreXULSkeletonUI-h.patch b/src/mozglue/misc/PreXULSkeletonUI-h.patch new file mode 100644 index 000000000..58bb15187 --- /dev/null +++ b/src/mozglue/misc/PreXULSkeletonUI-h.patch @@ -0,0 +1,15 @@ +diff --git a/mozglue/misc/PreXULSkeletonUI.h b/mozglue/misc/PreXULSkeletonUI.h +index 3e91eac21adce6d1a38d92ad36459c04cc1cbe1d..8f0c9b1a65bca1c35a4f6c042712715d872b0852 100644 +--- a/mozglue/misc/PreXULSkeletonUI.h ++++ b/mozglue/misc/PreXULSkeletonUI.h +@@ -21,8 +21,8 @@ namespace mozilla { + // to not vary based off of any user settings for the initial toplevel window, + // so we're safe here for now. + static const DWORD kPreXULSkeletonUIWindowStyle = +- WS_CLIPCHILDREN | WS_DLGFRAME | WS_BORDER | WS_MAXIMIZEBOX | +- WS_MINIMIZEBOX | WS_SIZEBOX | WS_SYSMENU; ++ WS_OVERLAPPED | WS_CLIPCHILDREN | WS_DLGFRAME | WS_BORDER | WS_THICKFRAME | ++ WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU; + static const DWORD kPreXULSkeletonUIWindowStyleEx = WS_EX_WINDOWEDGE; + + struct CSSPixelSpan { diff --git a/src/testing/profiles/profileserver/user-js.patch b/src/testing/profiles/profileserver/user-js.patch index 6fe1bd57a..3967e6da4 100644 --- a/src/testing/profiles/profileserver/user-js.patch +++ b/src/testing/profiles/profileserver/user-js.patch @@ -1,13 +1,16 @@ diff --git a/testing/profiles/profileserver/user.js b/testing/profiles/profileserver/user.js -index 19ff7d474f6d22d2d386764e2e6942ce6a324470..3cec3a25acc6f8780d56d273995974a905b6c031 100644 +index 19ff7d474f6d22d2d386764e2e6942ce6a324470..40d1906bdebd08510014fd6124be17052248e748 100644 --- a/testing/profiles/profileserver/user.js +++ b/testing/profiles/profileserver/user.js -@@ -8,3 +8,7 @@ +@@ -8,3 +8,11 @@ user_pref("dom.timeout.enable_budget_timer_throttling", false); // Turn off update user_pref("app.update.disabledForTesting", true); + +// zen: -+// Disable workspaces in order to prevent SQL calls ++// Disable some of zen's features to better match the default Firefox experience +user_pref("zen.workspaces.enabled", false); -\ No newline at end of file ++user_pref("zen.welcome-screen.enabled", false); ++user_pref("zen.tab-unloader.enabled", false); ++user_pref("zen.watermark.enabled", false); ++user_pref("zen.glance.enabled", false); diff --git a/src/toolkit/components/extensions/parent/ext-runtime-js.patch b/src/toolkit/components/extensions/parent/ext-runtime-js.patch new file mode 100644 index 000000000..d56116c25 --- /dev/null +++ b/src/toolkit/components/extensions/parent/ext-runtime-js.patch @@ -0,0 +1,13 @@ +diff --git a/toolkit/components/extensions/parent/ext-runtime.js b/toolkit/components/extensions/parent/ext-runtime.js +index ff7aae6e5f1919d8d4ff1c7e85b6150332adc20f..5d935e3d0dfb91cd01268d4e2c4dee4696c33efe 100644 +--- a/toolkit/components/extensions/parent/ext-runtime.js ++++ b/toolkit/components/extensions/parent/ext-runtime.js +@@ -331,7 +331,7 @@ this.runtime = class extends ExtensionAPIPersistent { + + getBrowserInfo: function () { + const { name, vendor, version, appBuildID } = Services.appinfo; +- const info = { name, vendor, version, buildID: appBuildID }; ++ const info = { name, vendor, version: AppConstants.ZEN_FIREFOX_VERSION, buildID: appBuildID }; + return Promise.resolve(info); + }, + diff --git a/src/widget/windows/nsLookAndFeel-cpp.patch b/src/widget/windows/nsLookAndFeel-cpp.patch new file mode 100644 index 000000000..be310601f --- /dev/null +++ b/src/widget/windows/nsLookAndFeel-cpp.patch @@ -0,0 +1,12 @@ +diff --git a/widget/windows/nsLookAndFeel.cpp b/widget/windows/nsLookAndFeel.cpp +index 58c5fc3b55da47109e16cc3d6f44b0950b2965e7..ae1713898d0b8298480bdaf8a9ef7629423c3dee 100644 +--- a/widget/windows/nsLookAndFeel.cpp ++++ b/widget/windows/nsLookAndFeel.cpp +@@ -849,6 +849,7 @@ auto nsLookAndFeel::ComputeTitlebarColors() -> TitlebarColors { + // turned on. + result.mUseAccent = + dwmKey.GetValueAsDword(u"ColorPrevalence"_ns).valueOr(0) == 1; ++ result.mUseAccent = false; // Zen: Disable accent color in titlebar because it's ugly + if (!result.mUseAccent) { + return result; + } diff --git a/src/widget/windows/nsWindow-cpp.patch b/src/widget/windows/nsWindow-cpp.patch new file mode 100644 index 000000000..2a51fb835 --- /dev/null +++ b/src/widget/windows/nsWindow-cpp.patch @@ -0,0 +1,176 @@ +diff --git a/widget/windows/nsWindow.cpp b/widget/windows/nsWindow.cpp +index 00681c216c838efedbbcded9d6b843dbd8b5b0b6..f07e6e723596d84fb53a8a72b06e02cd4ace6bc1 100644 +--- a/widget/windows/nsWindow.cpp ++++ b/widget/windows/nsWindow.cpp +@@ -2729,12 +2729,37 @@ nsresult nsWindow::SetNonClientMargins(const LayoutDeviceIntMargin& margins) { + mCustomNonClient = margins != LayoutDeviceIntMargin(-1, -1, -1, -1); + mNonClientMargins = margins; + ++ const LONG_PTR style = GetWindowLongPtrW(mWnd, GWL_STYLE); + // Force a reflow of content based on the new client dimensions. + if (mCustomNonClient) { +- UpdateNonClientMargins(); +- } else { +- ResetLayout(); +- } ++ if (style & WS_SYSMENU) { ++ // Remove the WS_SYSMENU style, so that DWM doesn't draw the caption ++ // buttons. Note that we still need WS_MAXIMIZEBOX at least to ++ // support Snap Layouts / Aero Snap. ++ // ++ // This behavior is not documented: per MSDN, WS_MAXIMIZEBOX simply ++ // requires WS_SYSMENU, and is not valid without it. However, omitting it ++ // doesn't seem to have negative side-effects on any version of Windows ++ // tested (other than losing the default system menu handling, which we ++ // implement ourselves in DisplaySystemMenu()). ++ // ++ // Since the system menu is lazily initialized (see [1]), we have to call ++ // GetSystemMenu() here in order to get it created before it is too late. ++ // An alternative would be to play with window styles later to force it ++ // to be created, but that seems a bit more finicky. ++ // ++ // [1]: https://devblogs.microsoft.com/oldnewthing/20100528-00/?p=13893 ++ ::GetSystemMenu(mWnd, FALSE); ++ ::SetWindowLongPtrW(mWnd, GWL_STYLE, style & ~WS_SYSMENU); ++ } ++ UpdateNonClientMargins(); ++ } else { ++ if (WindowStyle() & WS_SYSMENU) { ++ // Restore the WS_SYSMENU style if appropriate. ++ ::SetWindowLongPtrW(mWnd, GWL_STYLE, style | WS_SYSMENU); ++ } ++ ResetLayout(); ++ } + + return NS_OK; + } +@@ -4560,53 +4585,55 @@ void nsWindow::IPCWindowProcHandler(UINT& msg, WPARAM& wParam, LPARAM& lParam) { + static bool DisplaySystemMenu(HWND hWnd, nsSizeMode sizeMode, bool isRtl, + int32_t x, int32_t y) { + HMENU hMenu = GetSystemMenu(hWnd, FALSE); +- if (hMenu) { +- MENUITEMINFO mii; +- mii.cbSize = sizeof(MENUITEMINFO); +- mii.fMask = MIIM_STATE; +- mii.fType = 0; +- +- // update the options +- mii.fState = MF_ENABLED; +- SetMenuItemInfo(hMenu, SC_RESTORE, FALSE, &mii); +- SetMenuItemInfo(hMenu, SC_SIZE, FALSE, &mii); +- SetMenuItemInfo(hMenu, SC_MOVE, FALSE, &mii); +- SetMenuItemInfo(hMenu, SC_MAXIMIZE, FALSE, &mii); +- SetMenuItemInfo(hMenu, SC_MINIMIZE, FALSE, &mii); +- +- mii.fState = MF_GRAYED; +- switch (sizeMode) { +- case nsSizeMode_Fullscreen: +- // intentional fall through +- case nsSizeMode_Maximized: +- SetMenuItemInfo(hMenu, SC_SIZE, FALSE, &mii); +- SetMenuItemInfo(hMenu, SC_MOVE, FALSE, &mii); +- SetMenuItemInfo(hMenu, SC_MAXIMIZE, FALSE, &mii); +- break; +- case nsSizeMode_Minimized: +- SetMenuItemInfo(hMenu, SC_MINIMIZE, FALSE, &mii); +- break; +- case nsSizeMode_Normal: +- SetMenuItemInfo(hMenu, SC_RESTORE, FALSE, &mii); +- break; +- case nsSizeMode_Invalid: +- NS_ASSERTION(false, "Did the argument come from invalid IPC?"); +- break; +- default: +- MOZ_ASSERT_UNREACHABLE("Unhnalded nsSizeMode value detected"); +- break; +- } +- LPARAM cmd = TrackPopupMenu( +- hMenu, +- (TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_RETURNCMD | TPM_TOPALIGN | +- (isRtl ? TPM_RIGHTALIGN : TPM_LEFTALIGN)), +- x, y, 0, hWnd, nullptr); +- if (cmd) { +- PostMessage(hWnd, WM_SYSCOMMAND, cmd, 0); +- return true; +- } ++ if (NS_WARN_IF(!hMenu)) { ++ return false; + } +- return false; ++ ++ MENUITEMINFO mii; ++ mii.cbSize = sizeof(MENUITEMINFO); ++ mii.fMask = MIIM_STATE; ++ mii.fType = 0; ++ ++ // update the options ++ mii.fState = MF_ENABLED; ++ SetMenuItemInfo(hMenu, SC_RESTORE, FALSE, &mii); ++ SetMenuItemInfo(hMenu, SC_SIZE, FALSE, &mii); ++ SetMenuItemInfo(hMenu, SC_MOVE, FALSE, &mii); ++ SetMenuItemInfo(hMenu, SC_MAXIMIZE, FALSE, &mii); ++ SetMenuItemInfo(hMenu, SC_MINIMIZE, FALSE, &mii); ++ ++ mii.fState = MF_GRAYED; ++ switch (sizeMode) { ++ case nsSizeMode_Fullscreen: ++ // intentional fall through ++ case nsSizeMode_Maximized: ++ SetMenuItemInfo(hMenu, SC_SIZE, FALSE, &mii); ++ SetMenuItemInfo(hMenu, SC_MOVE, FALSE, &mii); ++ SetMenuItemInfo(hMenu, SC_MAXIMIZE, FALSE, &mii); ++ break; ++ case nsSizeMode_Minimized: ++ SetMenuItemInfo(hMenu, SC_MINIMIZE, FALSE, &mii); ++ break; ++ case nsSizeMode_Normal: ++ SetMenuItemInfo(hMenu, SC_RESTORE, FALSE, &mii); ++ break; ++ case nsSizeMode_Invalid: ++ NS_ASSERTION(false, "Did the argument come from invalid IPC?"); ++ break; ++ default: ++ MOZ_ASSERT_UNREACHABLE("Unhnalded nsSizeMode value detected"); ++ break; ++ } ++ LPARAM cmd = TrackPopupMenu(hMenu, ++ TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_RETURNCMD | ++ TPM_TOPALIGN | ++ (isRtl ? TPM_RIGHTALIGN : TPM_LEFTALIGN), ++ x, y, 0, hWnd, nullptr); ++ if (!cmd) { ++ return false; ++ } ++ PostMessage(hWnd, WM_SYSCOMMAND, cmd, 0); ++ return true; + } + + // The WndProc procedure for all nsWindows in this toolkit. This merely catches +@@ -5768,13 +5795,20 @@ bool nsWindow::ProcessMessageInternal(UINT msg, WPARAM& wParam, LPARAM& lParam, + result = true; + } + +- // Handle the system menu manually when we're in full screen mode +- // so we can set the appropriate options. +- if (filteredWParam == SC_KEYMENU && lParam == VK_SPACE && +- mFrameState->GetSizeMode() == nsSizeMode_Fullscreen) { +- DisplaySystemMenu(mWnd, mFrameState->GetSizeMode(), mIsRTL, +- MOZ_SYSCONTEXT_X_POS, MOZ_SYSCONTEXT_Y_POS); +- result = true; ++ if (filteredWParam == SC_KEYMENU && lParam == VK_SPACE) { ++ const auto sizeMode = mFrameState->GetSizeMode(); ++ // Handle the system menu manually when we're in full screen mode or ++ // with custom titlebar so we can set the appropriate options. ++ if (sizeMode == nsSizeMode_Fullscreen || mCustomNonClient) { ++ // Historically on fullscreen windows we've used this offset from the ++ // top left as our context menu position. Note that if the point we ++ // supply is offscreen, Windows will still try to put our menu in the ++ // right place. ++ constexpr LayoutDeviceIntPoint offset(20, 20); ++ auto pos = GetScreenBounds().TopLeft() + offset; ++ DisplaySystemMenu(mWnd, sizeMode, mIsRTL, pos.x, pos.y); ++ result = true; ++ } + } + } break; + diff --git a/src/xpfe/appshell/AppWindow-cpp.patch b/src/xpfe/appshell/AppWindow-cpp.patch new file mode 100644 index 000000000..a8328336e --- /dev/null +++ b/src/xpfe/appshell/AppWindow-cpp.patch @@ -0,0 +1,13 @@ +diff --git a/xpfe/appshell/AppWindow.cpp b/xpfe/appshell/AppWindow.cpp +index 69157dd642fe2f20bd77fb9e39fe3ae0c2806176..d4d0aa69ae6e3fd995255f22e1088eca0e58e959 100644 +--- a/xpfe/appshell/AppWindow.cpp ++++ b/xpfe/appshell/AppWindow.cpp +@@ -1845,7 +1845,7 @@ nsresult AppWindow::MaybeSaveEarlyWindowPersistentValues( + } + } + +- settings.verticalTabs = Preferences::GetBool("sidebar.verticalTabs", false); ++ settings.verticalTabs = Preferences::GetBool("zen.tabs.vertical", false); + + Unused << PersistPreXULSkeletonUIValues(settings); + #endif diff --git a/surfer.json b/surfer.json index 3ddaa0c64..077e94773 100644 --- a/surfer.json +++ b/surfer.json @@ -5,20 +5,20 @@ "binaryName": "zen", "version": { "product": "firefox", - "version": "133.0" + "version": "133.0.3" }, "buildOptions": { "generateBranding": true }, "addons": {}, "brands": { - "alpha": { + "beta": { "backgroundColor": "#282A33", "brandShorterName": "Zen", "brandShortName": "Zen Browser", "brandFullName": "Zen Browser", "release": { - "displayVersion": "1.0.1-a.22", + "displayVersion": "1.0.2-b.4", "github": { "repo": "zen-browser/desktop" }, @@ -27,8 +27,6 @@ "macos-aarch64": "macos-aarch64.mar", "linux": "linux.mar", "macos-x64": "macos-x64.mar", - "windows-compat": "windows-generic.mar", - "linux-compat": "linux-generic.mar", "windows-arm64": "windows-arm64.mar", "linux-aarch64": "linux-aarch64.mar" } @@ -40,7 +38,7 @@ "brandShortName": "Zen Twilight", "brandFullName": "Zen Twilight", "release": { - "displayVersion": "1.0.1-t.22", + "displayVersion": "1.0.2-t.5", "github": { "repo": "zen-browser/desktop" } @@ -54,4 +52,4 @@ "licenseType": "MPL-2.0" }, "updateHostname": "updates.zen-browser.app" -} \ No newline at end of file +}