diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 554e2ba13..1d67ab40f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -142,18 +142,9 @@ jobs: with: node-version-file: '.nvmrc' - - name: Setup pnpm - run: npm install -g pnpm - - - name: Get pnpm store directory - id: pnpm-cache - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - name: Install dependencies run: | - pnpm install + npm install - name: Setup Surfer run: | @@ -162,12 +153,12 @@ jobs: - name: Bump version if: ${{ inputs.update_version && inputs.update_branch == 'release' }} run: | - pnpm surfer ci --brand ${{ inputs.update_branch }} --bump prerelease + npm run surfer -- ci --brand ${{ inputs.update_branch }} --bump prerelease - name: Bump version without new version if: ${{ !inputs.update_version || inputs.update_branch == 'twilight' }} run: | - pnpm surfer ci --brand ${{ inputs.update_branch }} + npm run surfer -- ci --brand ${{ inputs.update_branch }} - name: Debug run: | @@ -211,18 +202,9 @@ jobs: with: node-version-file: '.nvmrc' - - name: Setup pnpm - run: npm install -g pnpm - - - name: Get pnpm store directory - id: pnpm-cache - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - name: Install dependencies run: | - pnpm install + npm install - name: Setup Surfer run: | @@ -230,15 +212,14 @@ jobs: - name: Activate Surfer CLI run: | - echo "There's a bug in the Surfer CLI, we run this so that Surfer sets everything up correctly" - pnpm surfer ci --brand ${{ inputs.update_branch }} --display-version ${{ needs.build-data.outputs.version }} + npm run surfer -- ci --brand ${{ inputs.update_branch }} --display-version ${{ needs.build-data.outputs.version }} - name: Check version run: | echo "$(pwd)" - ls . - echo "version=$(pnpm surfer get version | xargs)" >> $GITHUB_OUTPUT - if [[ $(pnpm surfer get version | xargs) == ${{ needs.build-data.outputs.version }} ]]; then + echo $(npm run --silent surfer -- get version | xargs) + echo "version=$(npm run --silent surfer -- get version | xargs)" >> $GITHUB_OUTPUT + if [[ $(npm run --silent surfer -- get version | xargs) == ${{ needs.build-data.outputs.version }} ]]; then echo ">>> Version matches" else echo ">>> Version mismatch" @@ -268,27 +249,18 @@ jobs: git config --global user.email "mauro-balades@users.noreply.github.com" git config --global user.name "mauro-balades" - - name: Setup pnpm - run: npm install -g pnpm - - - name: Get pnpm store directory - id: pnpm-cache - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - name: Install dependencies run: | - pnpm install + npm install - name: Load Surfer CI setup - run: pnpm surfer ci --brand ${{ inputs.update_branch }} --display-version ${{ needs.build-data.outputs.version }} + run: npm run surfer -- ci --brand ${{ inputs.update_branch }} --display-version ${{ needs.build-data.outputs.version }} - name: Download Firefox source and dependencies - run: pnpm surfer download --verbose + run: npm run download --verbose - name: Import - run: pnpm surfer import --verbose + run: npm run import -- --verbose - name: Compress run: | @@ -400,14 +372,14 @@ jobs: - name: Install dependencies run: | - npm install -g pnpm + npm install sudo apt-get update sudo apt-get -y install libfuse2 desktop-file-utils appstream - name: Download Linux build uses: actions/download-artifact@v4 with: - name: zen.linux-${{ matrix.arch }}.tar.bz2 + name: zen.linux-${{ matrix.arch }}.tar.xz - name: Execute AppImage build run: | @@ -510,6 +482,7 @@ jobs: token: ${{ secrets.DEPLOY_KEY }} - name: Download object files + if: ${{ inputs.update_branch == 'release' }} run: | git clone https://github.com/zen-browser/windows-binaries.git .github/workflows/object @@ -543,31 +516,33 @@ jobs: # If we are on Twilight, we want to just update the Twilight tag's release - name: Update Twilight tag if: ${{ inputs.update_branch == 'twilight' }} - uses: marvinpinto/action-automatic-releases@master + uses: softprops/action-gh-release@v2 with: files: | - zen.source.tar.zst - zen.linux-x86_64.tar.bz2 - zen.linux-aarch64.tar.bz2 - zen-x86_64.AppImage - zen-x86_64.AppImage.zsync - zen-aarch64.AppImage - zen-aarch64.AppImage.zsync - zen.win-x86_64.zip - zen.win-arm64.zip - linux.mar - linux-aarch64.mar - windows.mar - windows-arm64.mar - macos.mar - zen.installer.exe - zen.installer-arm64.exe - zen.macos-universal.dmg - automatic_release_tag: 'twilight' - title: 'Twilight build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }} at ${{ needs.build-data.outputs.build_time }})' + ./zen.source.tar.zst/* + ./zen.linux-x86_64.tar.xz/* + ./zen.linux-aarch64.tar.xz/* + ./zen-x86_64.AppImage/* + ./zen-x86_64.AppImage.zsync/* + ./zen-aarch64.AppImage/* + ./zen-aarch64.AppImage.zsync/* + ./zen.win-x86_64.zip/* + ./zen.win-arm64.zip/* + ./linux.mar/* + ./linux-aarch64.mar/* + ./windows.mar/* + ./windows-arm64.mar/* + ./macos.mar/* + ./zen.installer.exe/* + ./zen.installer-arm64.exe/* + ./zen.macos-universal.dmg/* + tag_name: 'twilight' + name: 'Twilight build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }} at ${{ needs.build-data.outputs.build_time }})' draft: false + generate_release_notes: false prerelease: true - repo_token: ${{ secrets.DEPLOY_KEY }} + token: ${{ secrets.DEPLOY_KEY }} + fail_on_unmatched_files: false env: GITHUB_REPOSITORY: ${{ github.repository }} @@ -575,28 +550,30 @@ jobs: uses: marvinpinto/action-automatic-releases@master if: ${{ inputs.update_branch == 'release' }} with: - repo_token: '${{ secrets.DEPLOY_KEY }}' - automatic_release_tag: ${{ needs.build-data.outputs.version }} + token: '${{ secrets.DEPLOY_KEY }}' + tag_name: ${{ needs.build-data.outputs.version }} prerelease: false - title: 'Release build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }})' + fail_on_unmatched_files: false + generate_release_notes: false + name: 'Release build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }})' files: | - zen.source.tar.zst - zen.linux-x86_64.tar.bz2 - zen.linux-aarch64.tar.bz2 - zen-x86_64.AppImage - zen-x86_64.AppImage.zsync - zen-aarch64.AppImage - zen-aarch64.AppImage.zsync - .github/workflows/object/windows-x64-signed-x86_64/zen.win-x86_64.zip - .github/workflows/object/windows-x64-signed-arm64/zen.win-arm64.zip - linux.mar - linux-aarch64.mar - .github/workflows/object/windows-x64-signed-x86_64/windows.mar - .github/workflows/object/windows-x64-signed-arm64/windows-arm64.mar - macos.mar - .github/workflows/object/windows-x64-signed-x86_64/zen.installer.exe - .github/workflows/object/windows-x64-signed-arm64/zen.installer-arm64.exe - zen.macos-universal.dmg + ./zen.source.tar.zst/* + ./zen.linux-x86_64.tar.xz/* + ./zen.linux-aarch64.tar.xz/* + ./zen-x86_64.AppImage/* + ./zen-x86_64.AppImage.zsync/* + ./zen-aarch64.AppImage/* + ./zen-aarch64.AppImage.zsync/* + ./.github/workflows/object/windows-x64-signed-x86_64/zen.win-x86_64.zip + ./.github/workflows/object/windows-x64-signed-arm64/zen.win-arm64.zip + ./linux.mar/* + ./linux-aarch64.mar/* + ./.github/workflows/object/windows-x64-signed-x86_64/windows.mar + ./.github/workflows/object/windows-x64-signed-arm64/windows-arm64.mar + ./macos.mar/* + ./.github/workflows/object/windows-x64-signed-x86_64/zen.installer.exe + ./.github/workflows/object/windows-x64-signed-arm64/zen.installer-arm64.exe + ./zen.macos-universal.dmg/* prepare-flatpak: if: ${{ inputs.create_release && inputs.update_branch == 'release' }} @@ -674,12 +651,12 @@ jobs: - name: Download Linux x86_64 build uses: actions/download-artifact@v4 with: - name: zen.linux-x86_64.tar.bz2 + name: zen.linux-x86_64.tar.xz - name: Download Linux aarch64 build uses: actions/download-artifact@v4 with: - name: zen.linux-aarch64.tar.bz2 + name: zen.linux-aarch64.tar.xz - name: Update repository uses: actions/checkout@v4 @@ -701,8 +678,8 @@ jobs: python3 ./zen-browser/scripts/prepare-flatpak-release.py \ --flatpak-archive archive.tar \ --version ${{ needs.build-data.outputs.version }} \ - --linux-archive zen.linux-x86_64.tar.bz2 \ - --linux-aarch64-archive zen.linux-aarch64.tar.bz2 \ + --linux-archive zen.linux-x86_64.tar.xz \ + --linux-aarch64-archive zen.linux-aarch64.tar.xz \ --output app.zen_browser.zen.yml \ --template-root ./zen-browser/flatpak @@ -715,7 +692,7 @@ jobs: run: | rm -rf zen-browser rm -rf archive.tar - rm -rf zen.linux-x86_64.tar.bz2 + rm -rf zen.linux-x86_64.tar.xz - name: Upload Flatpak manifest uses: actions/upload-artifact@v4 diff --git a/.github/workflows/code-linter.yml b/.github/workflows/code-linter.yml index 9928b2cfb..d9cd6db7c 100644 --- a/.github/workflows/code-linter.yml +++ b/.github/workflows/code-linter.yml @@ -27,11 +27,8 @@ jobs: - name: Setup autopep8 run: sudo apt install python3-autopep8 - - name: Setup pnpm - run: npm install -g pnpm - - name: Install dependencies - run: pnpm install + run: npm install - name: Lint - run: pnpm lint + run: npm run lint diff --git a/.github/workflows/linux-release-build.yml b/.github/workflows/linux-release-build.yml index db4aa4667..2b18b6976 100644 --- a/.github/workflows/linux-release-build.yml +++ b/.github/workflows/linux-release-build.yml @@ -81,24 +81,15 @@ jobs: path: /home/runner/.cache/sccache key: ${{ runner.os }}-sccache - - name: Setup pnpm - run: npm install -g pnpm - - - name: Get pnpm store directory - id: pnpm-cache - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - name: Install dependencies run: | - pnpm install + npm install - name: Load Surfer CI setup - run: pnpm surfer ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }} + run: npm run surfer -- ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }} - name: Download Firefox source and dependencies - run: pnpm surfer download + run: npm run download - name: Fix Rust version run: | @@ -115,7 +106,7 @@ jobs: - name: Import env: SURFER_COMPAT: ${{ matrix.arch }} - run: pnpm surfer import + run: npm run import - name: Build language packs run: sh scripts/download-language-packs.sh @@ -146,19 +137,19 @@ jobs: run: | export SURFER_PLATFORM="linux" export ZEN_RELEASE=1 - pnpm package + npm run package - name: Rename artifacts run: | - mv dist/zen-*.tar.bz2 "zen.linux-${{ matrix.arch }}.tar.bz2" + mv dist/zen-*.tar.xz "zen.linux-${{ matrix.arch }}.tar.xz" mv dist/output.mar linux${{ matrix.arch == 'aarch64' && '-aarch64' || '' }}.mar - name: Upload build artifact (binary) uses: actions/upload-artifact@v4 with: retention-days: 5 - name: zen.linux-${{ matrix.arch }}.tar.bz2 - path: ./zen.linux-${{ matrix.arch }}.tar.bz2 + name: zen.linux-${{ matrix.arch }}.tar.xz + path: ./zen.linux-${{ matrix.arch }}.tar.xz - name: Upload build artifact (.mar) uses: actions/upload-artifact@v4 diff --git a/.github/workflows/macos-release-build.yml b/.github/workflows/macos-release-build.yml index a5a143217..b3f5c51c0 100644 --- a/.github/workflows/macos-release-build.yml +++ b/.github/workflows/macos-release-build.yml @@ -81,24 +81,15 @@ jobs: echo 'export PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"' >> ~/.zsh source ~/.bash_profile - - name: Setup pnpm - run: npm install -g pnpm - - - name: Get pnpm store directory - id: pnpm-cache - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - name: Install dependencies run: | - pnpm install + npm install - name: Load surfer CI setup - run: pnpm surfer ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }} + run: npm run surfer -- ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }} - name: Download Firefox source and dependencies - run: pnpm surfer download + run: npm run download - name: Bootstrap run: | @@ -111,7 +102,7 @@ jobs: - name: Import env: SURFER_COMPAT: ${{ matrix.arch }} - run: pnpm surfer import --verbose + run: npm run import -- --verbose - name: Build language packs run: sh scripts/download-language-packs.sh @@ -134,7 +125,7 @@ jobs: run: | export SURFER_PLATFORM="darwin" export ZEN_RELEASE=1 - pnpm package + npm run package - name: Rename artifacts run: | diff --git a/.github/workflows/macos-universal-release-build.yml b/.github/workflows/macos-universal-release-build.yml index 69a380992..a940d2714 100644 --- a/.github/workflows/macos-universal-release-build.yml +++ b/.github/workflows/macos-universal-release-build.yml @@ -68,24 +68,15 @@ jobs: echo 'export PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"' >> ~/.zsh source ~/.bash_profile - - name: Setup pnpm - run: npm install -g pnpm - - - name: Get pnpm store directory - id: pnpm-cache - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - name: Install dependencies run: | - pnpm install + npm install - name: Load surfer CI setup - run: pnpm surfer ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }} + run: npm run surfer -- ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }} - name: Download Firefox source and dependencies - run: pnpm surfer download + run: npm run download - name: Bootstrap run: | @@ -96,13 +87,13 @@ jobs: cd .. - name: Import - run: pnpm surfer import + run: npm run import - name: Populate mozconfig env: SURFER_MOZCONFIG_ONLY: true run: | - pnpm build + npm run build cd engine ./mach configure @@ -252,7 +243,7 @@ jobs: export MAR=$(pwd)/zen-macos-host-mar chmod +x $MAR echo "MAR=$MAR" - pnpm package --verbose + npm run package -- --verbose mv ./dist/output.mar ./macos.mar - name: Upload build artifact (.mar) diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 385cb2fb4..2d18f0dcc 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -19,14 +19,11 @@ jobs: with: node-version-file: '.nvmrc' - - name: Setup pnpm - run: npm install -g pnpm - - name: Install Surfer run: npm i -g @zen-browser/surfer - name: Install dependencies - run: pnpm install + run: npm install - name: Download Firefox and dependencies run: surfer download diff --git a/.github/workflows/src/release-build.sh b/.github/workflows/src/release-build.sh index 29f1f4d32..be7119a2d 100644 --- a/.github/workflows/src/release-build.sh +++ b/.github/workflows/src/release-build.sh @@ -17,12 +17,12 @@ if command -v Xvfb &> /dev/null; then export DISPLAY=:2 fi export ZEN_RELEASE=1 - pnpm build + npm run build else echo "Xvfb could not be found, running without it" echo "ASSUMING YOU ARE RUNNING THIS ON MACOS" set -v export ZEN_RELEASE=1 - pnpm build + npm run build fi diff --git a/.github/workflows/update-submodules.yml b/.github/workflows/update-submodules.yml deleted file mode 100644 index 18fa6cc26..000000000 --- a/.github/workflows/update-submodules.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Update Components Submodules - -on: - push: - branches: - - dev - workflow_dispatch: - workflow_call: - -jobs: - update-submodules: - runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, '[skip ci]')" - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - submodules: recursive - token: ${{ secrets.DEPLOY_KEY }} - - - name: Update submodules - run: | - git submodule update --remote --merge - - - name: Commit - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: '[skip ci] 📦 Update submodules' - commit_user_name: Zen Browser Robot - commit_user_email: zen-browser-auto@users.noreply.github.com diff --git a/.github/workflows/windows-profile-build.yml b/.github/workflows/windows-profile-build.yml index 97a18017c..4076fcec3 100644 --- a/.github/workflows/windows-profile-build.yml +++ b/.github/workflows/windows-profile-build.yml @@ -41,14 +41,11 @@ jobs: git config --global user.email "mauro-balades@users.noreply.github.com" git config --global user.name "mauro-balades" - - name: Setup pnpm - run: npm install -g pnpm - - name: Install Surfer run: npm i -g @zen-browser/surfer - name: Load Surfer CI setup - run: pnpm surfer ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }} + run: npm run surfer -- ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }} - name: Download artifact if: ${{ matrix.arch == 'x86_64' }} @@ -74,13 +71,13 @@ jobs: if: ${{ matrix.arch == 'x86_64' }} run: | git config --global core.safecrlf false - pnpm surfer download + npm run download - name: Import patches if: ${{ matrix.arch == 'x86_64' }} env: SURFER_NO_BRANDING_PATCH: true - run: pnpm surfer import + run: npm run import - name: Generate if: ${{ matrix.arch == 'x86_64' }} diff --git a/.github/workflows/windows-release-build.yml b/.github/workflows/windows-release-build.yml index 799db21f9..ff49f48f3 100644 --- a/.github/workflows/windows-release-build.yml +++ b/.github/workflows/windows-release-build.yml @@ -52,9 +52,6 @@ jobs: with: node-version-file: '.nvmrc' - - name: Setup pnpm - run: npm install -g pnpm - - name: Setup Git run: | git config --global user.email "mauro-balades@users.noreply.github.com" @@ -62,16 +59,16 @@ jobs: - name: Install dependencies run: | - pnpm install + npm install sudo apt-get update sudo apt-get install -y python3 python3-pip dos2unix yasm nasm build-essential libgtk2.0-dev libpython3-dev m4 uuid libasound2-dev libcurl4-openssl-dev libdbus-1-dev libdrm-dev libdbus-glib-1-dev libgtk-3-dev libpulse-dev libx11-xcb-dev libxt-dev xvfb lld llvm --fix-missing - name: Load Surfer CI setup - run: pnpm surfer ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }} + run: npm run surfer -- ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }} - name: Download Firefox and dependencies if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }} - run: pnpm surfer download + run: npm run download - name: win-cross Cache env: @@ -152,9 +149,8 @@ jobs: cd engine/ chmod -R +x "$(echo ~)/win-cross/vs2022" || true cd .. - npm install -g pnpm export SURFER_PLATFORM="win32" - pnpm surfer bootstrap + npm run bootstrap cd engine/ ls ~/.mozbuild/clang/lib/clang/ echo "export LIB=\"$(cd ~/.mozbuild/clang/lib/clang/* && cd lib/windows && pwd)\"" >> ../configs/common/mozconfig @@ -185,7 +181,7 @@ jobs: if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }} env: SURFER_COMPAT: ${{ matrix.arch }} - run: pnpm surfer import --verbose + run: npm run import -- --verbose - name: Build language packs if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }} @@ -235,8 +231,8 @@ jobs: export SURFER_PLATFORM="win32" export ZEN_CROSS_COMPILING=1 export ZEN_RELEASE=1 - pnpm package - mv ./dist/zen-$(pnpm surfer get version | xargs).en-US.win64${{ matrix.arch == 'aarch64' && '-aarch64' || '' }}.zip zen.win64.zip + npm run package + mv ./dist/zen-$(npm run --silent surfer -- get version | xargs).en-US.win64${{ matrix.arch == 'aarch64' && '-aarch64' || '' }}.zip zen.win64.zip ls ./dist ls . diff --git a/README.md b/README.md index 1761b9107..8387bb050 100644 --- a/README.md +++ b/README.md @@ -28,9 +28,9 @@ ## 🖥️ Compatibility -Zen is currently built using firefox version `134.0.2`! 🚀 +Zen is currently built using firefox version `135.0`! 🚀 -- [`Zen Twilight`](https://zen-browser.app/download?twilight) - Is currently built using firefox version `RC 134.0.2`! +- [`Zen Twilight`](https://zen-browser.app/download?twilight) - Is currently built using firefox version `RC 135.0`! - Check out the latest [release notes](https://zen-browser.app/release-notes)! - Part of our mission is to keep Zen up-to-date with the latest version of Firefox, so you can enjoy the latest features and security updates! @@ -117,7 +117,7 @@ Some components used by @zen-browser as an attempt to make firefox forks a bette #### `Run Locally` -In order to download and run zen locally, please follow [these instructions](https://docs.zen-browser.app/contribute/desktop). +In order to download and run zen locally, please follow [these instructions](https://docs.zen-browser.app/building). #### `Special Thanks` diff --git a/build/winsign/sign.ps1 b/build/winsign/sign.ps1 index 89e7b6514..c5cba97c5 100644 --- a/build/winsign/sign.ps1 +++ b/build/winsign/sign.ps1 @@ -29,7 +29,7 @@ echo "Downloaded x86_64 artifacts" mkdir engine\obj-x86_64-pc-windows-msvc\ -ErrorAction SilentlyContinue -pnpm surfer ci --brand release +npm run surfer -- ci --brand release function SignAndPackage($name) { echo "Executing on $name" @@ -53,7 +53,7 @@ function SignAndPackage($name) { } echo "Compat Mode? $env:SURFER_COMPAT" - pnpm surfer package --verbose + npm run package -- --verbose # In the release script, we do the following: # tar -xvf .github/workflows/object/windows-x64-signed-x86_64.tar.gz -C windows-x64-signed-x86_64 diff --git a/configs/common/mozconfig b/configs/common/mozconfig index f840e768c..74fda5740 100644 --- a/configs/common/mozconfig +++ b/configs/common/mozconfig @@ -9,7 +9,6 @@ ac_add_options --with-l10n-base="${topsrcdir}/browser/locales" export MOZ_USER_DIR="${name}" export MOZ_APP_BASENAME=Zen export MOZ_APP_PROFILE=${binName} -export MOZ_APP_DISPLAYNAME="${name}" export MOZ_BRANDING_DIRECTORY=${brandingDir} export MOZ_OFFICIAL_BRANDING_DIRECTORY=${brandingDir} diff --git a/docs/issue-metrics/2025_2025-01-01..2025-01-31.md b/docs/issue-metrics/2025_2025-01-01..2025-01-31.md new file mode 100644 index 000000000..0eed99eba --- /dev/null +++ b/docs/issue-metrics/2025_2025-01-01..2025-01-31.md @@ -0,0 +1,522 @@ +# Issue Metrics + +| Metric | Average | Median | 90th percentile | +| --- | --- | --- | ---: | +| Time to first response | 1 day, 2:25:19 | 4:38:40 | 2 days, 20:40:51 | +| Time to close | 1 day, 21:15:55 | 8:22:21 | 5 days, 17:16:45 | + +| Metric | Count | +| --- | ---: | +| Number of items that remain open | 274 | +| Number of items closed | 230 | +| Total number of items created | 504 | + +| Title | URL | Time to first response | Time to close | +| --- | --- | --- | --- | +| Screen Sharing Issues when using Google Meet in Zen Browser | https://github.com/zen-browser/desktop/issues/4798 | 0:20:41 | 0:20:40 | +| All tabs are gone after I close Zen | https://github.com/zen-browser/desktop/issues/4797 | 1:59:48 | None | +| Setting the "Zen URL Bar" behavior to "Always floating" works the same as "Floating only when typing". | https://github.com/zen-browser/desktop/issues/4796 | None | None | +| Toggle Compact Mode Not Responsive | https://github.com/zen-browser/desktop/issues/4795 | 1:25:51 | 1:25:51 | +| Closing the last tab doesn't close the browser (again) | https://github.com/zen-browser/desktop/issues/4794 | 3:26:40 | None | +| flickering images | https://github.com/zen-browser/desktop/issues/4791 | None | None | +| Zen incorrectly assumes background color to be dark on some websites, making text unreadable | https://github.com/zen-browser/desktop/issues/4789 | 0:09:17 | 0:09:17 | +| Ctrl-tab should not cycle through essential tabs | https://github.com/zen-browser/desktop/issues/4787 | 4:08:36 | None | +| Erroneous conflicting shortcut (and maybe missing shortcut options) | https://github.com/zen-browser/desktop/issues/4785 | None | None | +| Touchpad space switching issue | https://github.com/zen-browser/desktop/issues/4783 | None | 0:02:16 | +| Closing 'new tab' or last opened tab opens last pinned tab or pinned essential if there is no pinned tab | https://github.com/zen-browser/desktop/issues/4779 | 0:41:29 | 1:03:21 | +| Scrolling bar UI issue: ugly white background | https://github.com/zen-browser/desktop/issues/4778 | 1:05:49 | 4:13:36 | +| Extensions become "big" after switching mode | https://github.com/zen-browser/desktop/issues/4777 | 1:36:21 | 1:36:21 | +| Missing "New Tab" option at the bottom of tab column | https://github.com/zen-browser/desktop/issues/4776 | 1:27:47 | 1:27:47 | +| PDF tab becomes unusable after unloading with unsaved edits | https://github.com/zen-browser/desktop/issues/4772 | None | 2:02:14 | +| Cloudflare ZeroTrust (Warp) VPN unable to connect if Zen is default browser | https://github.com/zen-browser/desktop/issues/4771 | None | None | +| Default Wayland Icon shows up in some places in KDE when installing from AppImage | https://github.com/zen-browser/desktop/issues/4770 | 2:51:55 | 2:54:44 | +| If i close a tab in the sidebar it reloads the entire window and also goes to the starting tabs again which i dont need | https://github.com/zen-browser/desktop/issues/4769 | 1:30:05 | 4:24:03 | +| Font doesnt load properly !! | https://github.com/zen-browser/desktop/issues/4767 | 1:27:56 | 3:58:48 | +| Tab Creation | https://github.com/zen-browser/desktop/issues/4766 | None | 0:01:11 | +| Open application menu button missing in Single toolbar mode | https://github.com/zen-browser/desktop/issues/4765 | 4:28:00 | 4:28:00 | +| moving through workspaces by trackpad swipe tracks the movement but not the direction | https://github.com/zen-browser/desktop/issues/4764 | None | None | +| Netflix does not work in zen | https://github.com/zen-browser/desktop/issues/4762 | 0:07:51 | 1:51:17 | +| Unable to remove duplicate workspaces buttons. | https://github.com/zen-browser/desktop/issues/4761 | 5:03:40 | 5:03:40 | +| Zen Identifies as Firefox in Powertoys run search plugin | https://github.com/zen-browser/desktop/issues/4759 | None | None | +| Close Window Keyboard Shortcut does nothing | https://github.com/zen-browser/desktop/issues/4758 | None | None | +| Scrolling on the tabs on a touch screen does nothing | https://github.com/zen-browser/desktop/issues/4757 | None | None | +| Glance stops working after closing with an unfinished form | https://github.com/zen-browser/desktop/issues/4756 | None | None | +| Dragging tabs scrollbar grabs window | https://github.com/zen-browser/desktop/issues/4755 | 7:07:32 | 7:07:31 | +| Pinned Tabs - URL does not reset when tab is closed, only when returning to the tab | https://github.com/zen-browser/desktop/issues/4754 | None | None | +| "empty space ontop of the vertical tabs" NOT fixed | https://github.com/zen-browser/desktop/issues/4753 | None | None | +| Passkeys using mac touchID is not working | https://github.com/zen-browser/desktop/issues/4752 | None | 8:03:39 | +| Out of order or hidden extensions on launch. Single Toolbar Mode | https://github.com/zen-browser/desktop/issues/4747 | None | None | +| Show in compact view not working | https://github.com/zen-browser/desktop/issues/4745 | 12:20:42 | 12:20:42 | +| Closing tab at the bottom of the tabs list puts you back on the top even if the tab isn't selected. | https://github.com/zen-browser/desktop/issues/4744 | 4:59:52 | 12:43:27 | +| Customizing toolbar spits the app | https://github.com/zen-browser/desktop/issues/4737 | 17:20:17 | 1 day, 0:31:32 | +| Zen URL bar settings doesn't work properly | https://github.com/zen-browser/desktop/issues/4736 | 12:52:11 | None | +| BUG: Bookmarks toolbar items shows 'Show more' arrow even though there are no more bookmarked items | https://github.com/zen-browser/desktop/issues/4735 | None | None | +| Scrolling after closing tab | https://github.com/zen-browser/desktop/issues/4733 | 15:39:10 | 1 day, 1:22:37 | +| BUG: Whole browser broken on Windows | https://github.com/zen-browser/desktop/issues/4732 | 0:08:04 | None | +| BUG: CTRL+SHIFT+B causes UI glitch by trying to show Bookmarks Toolbar in Single Toolbar Mode | https://github.com/zen-browser/desktop/issues/4731 | None | None | +| BUG:Abnormal printing of web articles | https://github.com/zen-browser/desktop/issues/4730 | 20:28:04 | 20:28:04 | +| JS close() calls constantly close the entire browser when a website calling it is the only tab left | https://github.com/zen-browser/desktop/issues/4729 | None | None | +| Dragging empty space on sidebar tabs undocks and moves the program | https://github.com/zen-browser/desktop/issues/4728 | 21:01:43 | 21:01:43 | +| The tab bar and top bar overlap and make it annoying to close the browser. | https://github.com/zen-browser/desktop/issues/4726 | None | None | +| Tab switching to recent tab (Ctrl-Tab) doesn't work across workspaces | https://github.com/zen-browser/desktop/issues/4725 | None | None | +| Top and side bars do not disappear in fullscreen mode | https://github.com/zen-browser/desktop/issues/4723 | 13:46:56 | 22:02:10 | +| Toggling "Display workspaces as an icon strip" twice doesn't return to correctly rendered strip | https://github.com/zen-browser/desktop/issues/4722 | None | None | +| Separate window cannot be closed | https://github.com/zen-browser/desktop/issues/4719 | 1 day, 1:32:05 | None | +| Customize the toolbar without the toggle sidebar icon | https://github.com/zen-browser/desktop/issues/4717 | 1 day, 1:07:42 | None | +| No option to translate to Vietnamese | https://github.com/zen-browser/desktop/issues/4716 | None | None | +| When opening a site with prompt credentials form, the site cannot be opened | https://github.com/zen-browser/desktop/issues/4715 | None | None | +| Links that are not from same domain are opened in Glance when clicked within essential tab, even when Glance is disabled and browser restarted. | https://github.com/zen-browser/desktop/issues/4714 | None | None | +| Selected audio output device (speaker) is not being used | https://github.com/zen-browser/desktop/issues/4713 | None | None | +| ZEN BROWSER crash when open "more tools" menu twice | https://github.com/zen-browser/desktop/issues/4712 | 0:02:34 | None | +| Infinity loading | https://github.com/zen-browser/desktop/issues/4711 | None | 6:24:50 | +| Duplicate entry in Settings > Keyboard Shortcuts | https://github.com/zen-browser/desktop/issues/4709 | None | None | +| [BUG] Extension icons becomes huge after folding tabbar | https://github.com/zen-browser/desktop/issues/4707 | 9:14:59 | None | +| Duplicate entries in settings page | https://github.com/zen-browser/desktop/issues/4706 | None | None | +| Jitter / Stutter on macbook pro with apple silicon | https://github.com/zen-browser/desktop/issues/4705 | 0:21:08 | None | +| Wallpaper settings subsections don't take full width | https://github.com/zen-browser/desktop/issues/4704 | None | None | +| Zen Rice sharing is broken | https://github.com/zen-browser/desktop/issues/4701 | 2:38:42 | 11:21:17 | +| Preedit text misplacement in search box under Wayland with Fcitx5 input method | https://github.com/zen-browser/desktop/issues/4699 | None | None | +| permanently disable browser.tabs.allow_transparent_browser | https://github.com/zen-browser/desktop/issues/4698 | 1 day, 15:39:09 | None | +| Bookmarks Duplicated & Out of Sync | https://github.com/zen-browser/desktop/issues/4697 | None | None | +| Twitch freeze when alt-tabbing | https://github.com/zen-browser/desktop/issues/4696 | 2 days, 3:55:36 | None | +| Popup for TST extension that should occur once, occurs every time Zen is launched (Windows build issue, not Mac) | https://github.com/zen-browser/desktop/issues/4695 | 0:17:58 | None | +| overflow menu. | https://github.com/zen-browser/desktop/issues/4694 | None | None | +| Close tab X button hitbox is different between hover hitbox and click hitbox | https://github.com/zen-browser/desktop/issues/4692 | None | None | +| Menu Alignment Issues | https://github.com/zen-browser/desktop/issues/4691 | None | None | +| Zen freezes several times a day | https://github.com/zen-browser/desktop/issues/4690 | 2 days, 1:37:06 | 2 days, 5:28:59 | +| Scroll issue | https://github.com/zen-browser/desktop/issues/4689 | None | None | +| Issue with Zen Browser Getting Uninstalled Automatically | https://github.com/zen-browser/desktop/issues/4688 | None | None | +| Glance and Keyboard Focus | https://github.com/zen-browser/desktop/issues/4687 | 15:14:37 | None | +| Opening a new Tab when currently in an Essential tab, opens the news tab in Glance Mode | https://github.com/zen-browser/desktop/issues/4686 | 2 days, 4:20:37 | None | +| Empty Space on Tab bar above Workspace when aligned to right | https://github.com/zen-browser/desktop/issues/4683 | 1 day, 23:36:21 | None | +| [BUG] Native sidebar and Zen sidepanel splitters are positioned too close to each other | https://github.com/zen-browser/desktop/issues/4680 | None | None | +| Terminology (and icons) for Sidebars and Side Web Panels too similar and ambiguous | https://github.com/zen-browser/desktop/issues/4679 | 0:11:52 | 2 days, 15:30:38 | +| Customize toolbar in single toolbar mode looks like multiple toolbars | https://github.com/zen-browser/desktop/issues/4678 | None | None | +| Elements in top toolbar overlap when it is resized too small | https://github.com/zen-browser/desktop/issues/4676 | None | None | +| Empty space on the top of compact mode small sidebar | https://github.com/zen-browser/desktop/issues/4674 | 0:14:45 | 0:14:45 | +| Headset is not recognized in google meet | https://github.com/zen-browser/desktop/issues/4671 | None | None | +| Popup is cut in compact mode | https://github.com/zen-browser/desktop/issues/4670 | None | None | +| Combining windows causes tabs in other workspaces to become inaccessible | https://github.com/zen-browser/desktop/issues/4668 | None | None | +| Adjust search text and icon size when searching on a new tab. | https://github.com/zen-browser/desktop/issues/4667 | None | None | +| Tabs freezes while my RAM/VRAM utlizing | https://github.com/zen-browser/desktop/issues/4666 | None | None | +| Workspace Icons are overlayed with the theme color | https://github.com/zen-browser/desktop/issues/4665 | 15:18:13 | 15:18:13 | +| Unable to assign Cmd+Z for undo | https://github.com/zen-browser/desktop/issues/4664 | None | None | +| Black Screen on Windows after opening the Zen Browser | https://github.com/zen-browser/desktop/issues/4663 | None | None | +| Forward button icon slightly offcenter | https://github.com/zen-browser/desktop/issues/4662 | None | None | +| Everything opens in Glance | https://github.com/zen-browser/desktop/issues/4661 | 13:00:08 | 13:00:08 | +| Wrong location of title bar buttons when opening external links from VS Code | https://github.com/zen-browser/desktop/issues/4660 | None | None | +| Web Page print would not render preview | https://github.com/zen-browser/desktop/issues/4659 | 0:18:04 | 0:18:04 | +| Issue with Youtube playback in 4K quality | https://github.com/zen-browser/desktop/issues/4652 | None | None | +| when searching on the address bar, a new tab open instead of the origion tab | https://github.com/zen-browser/desktop/issues/4651 | None | None | +| Compact mode won't disable after changing which toolbars are hidden | https://github.com/zen-browser/desktop/issues/4649 | 16:26:34 | None | +| Problem with tab bar and top bar | https://github.com/zen-browser/desktop/issues/4648 | 7:28:57 | None | +| Excessive margin between bookmark sidebar and center pane | https://github.com/zen-browser/desktop/issues/4647 | 7:37:12 | None | +| I am not able to save my bookmarks of zen with the autoExportHTML flag, this works fine on firefox though. | https://github.com/zen-browser/desktop/issues/4646 | None | None | +| Dropdown input is not selected | https://github.com/zen-browser/desktop/issues/4645 | None | None | +| Toolbar becomes big after customizing the bookmarks placement | https://github.com/zen-browser/desktop/issues/4641 | None | None | +| Zen Mods are not properly installing | https://github.com/zen-browser/desktop/issues/4640 | None | None | +| HDR video plays in SDR | https://github.com/zen-browser/desktop/issues/4639 | None | 3 days, 3:56:44 | +| The rounded corner to the bottom right of the web viewport needs a bigger border radius on linux GTK | https://github.com/zen-browser/desktop/issues/4638 | 3:57:05 | 3:57:05 | +| Tab bar title not aligned properly | https://github.com/zen-browser/desktop/issues/4636 | None | None | +| Window Control Buttons Missing on Linux | https://github.com/zen-browser/desktop/issues/4635 | None | None | +| System freezes while using zen browser | https://github.com/zen-browser/desktop/issues/4634 | 4 days, 17:38:33 | None | +| keymaps issue | https://github.com/zen-browser/desktop/issues/4631 | 0:42:05 | None | +| tool bar stucked | https://github.com/zen-browser/desktop/issues/4630 | 7:29:01 | 1 day, 2:03:18 | +| side bar bug | https://github.com/zen-browser/desktop/issues/4628 | None | None | +| System Crashes (Blue Screen) While Using Zen Browser | https://github.com/zen-browser/desktop/issues/4627 | 10:07:14 | None | +| Macos fullscreen url bar overlaps with bookmark | https://github.com/zen-browser/desktop/issues/4625 | None | None | +| pdf will not load to print | https://github.com/zen-browser/desktop/issues/4623 | 1:48:06 | 1 day, 21:47:12 | +| The sidebar loses it's colour when in compact mode and revealed using the mouse cursor | https://github.com/zen-browser/desktop/issues/4621 | None | None | +| Printer Menu Perpetually Loads; cannot print anything from the browser | https://github.com/zen-browser/desktop/issues/4620 | 0:17:13 | 0:17:13 | +| Extension install dialog is over the tab-bar | https://github.com/zen-browser/desktop/issues/4617 | None | None | +| Light and Dark Mode from Firefox UI Bug | https://github.com/zen-browser/desktop/issues/4616 | None | None | +| Starting 1.7.1b, colourful dark theme doesn't work on browser frame | https://github.com/zen-browser/desktop/issues/4615 | None | None | +| Installing mods overwrites all currently installed ones | https://github.com/zen-browser/desktop/issues/4614 | None | None | +| text pops out of the buttons in Russian | https://github.com/zen-browser/desktop/issues/4613 | None | None | +| Can't do sidebar smaller | https://github.com/zen-browser/desktop/issues/4612 | 0:54:29 | 1 day, 14:32:22 | +| Customized toolbar icons aren't showing | https://github.com/zen-browser/desktop/issues/4610 | 5 days, 0:37:36 | None | +| Web view rounded corners disappear when `backdrop-filter` is used in the page | https://github.com/zen-browser/desktop/issues/4609 | None | None | +| Links don't open in browser | https://github.com/zen-browser/desktop/issues/4608 | None | 6 days, 11:27:06 | +| Issues with tab bar padding and workspaces | https://github.com/zen-browser/desktop/issues/4607 | None | 6 days, 11:37:23 | +| New Windows do not focus the address bar automatically | https://github.com/zen-browser/desktop/issues/4606 | None | None | +| Keybinding Conflict in Zen Browser | https://github.com/zen-browser/desktop/issues/4605 | 2 days, 17:44:23 | None | +| Zen browser URL bar flickering | https://github.com/zen-browser/desktop/issues/4604 | 23:56:25 | None | +| Workspace icon does not get set on creation | https://github.com/zen-browser/desktop/issues/4603 | None | None | +| Browser crashed when clicking expand toolbar button | https://github.com/zen-browser/desktop/issues/4600 | None | None | +| Close Pinned tabs in right click menu ignores "close tab shortcut behaviour" in prefs | https://github.com/zen-browser/desktop/issues/4599 | None | None | +| Weird color highlight (again) & thin border on right side | https://github.com/zen-browser/desktop/issues/4598 | None | None | +| Window control buttons disappear on MacOS | https://github.com/zen-browser/desktop/issues/4597 | None | None | +| Zen is not showing up in the default web browser selection on Elementary OS 8 settings | https://github.com/zen-browser/desktop/issues/4594 | 3:27:41 | 23:09:00 | +| My accounts keep signing out after a while. (Google, Github) | https://github.com/zen-browser/desktop/issues/4593 | 6 days, 0:59:05 | None | +| Arrows are Backwards | https://github.com/zen-browser/desktop/issues/4592 | 7:58:01 | 19:33:43 | +| Bookmarks Toolbar automatically hides in "Single toolbar" layout even though "Alway Show" is enabled | https://github.com/zen-browser/desktop/issues/4591 | None | None | +| Zen couldn’t find any programs that contain bookmark, history or password data. | https://github.com/zen-browser/desktop/issues/4589 | 0:12:09 | 0:12:09 | +| Cannot remove Workspace switch from side bar/toolbar | https://github.com/zen-browser/desktop/issues/4588 | 0:10:50 | 0:18:19 | +| Window size of [Shows tabs from other devices] | https://github.com/zen-browser/desktop/issues/4586 | None | None | +| Bug, tabs getting "stuck" randomly, unclickable | https://github.com/zen-browser/desktop/issues/4583 | 11:25:21 | None | +| Sort Mods Store by popularity | https://github.com/zen-browser/desktop/issues/4582 | 6:36:38 | 6:36:38 | +| Significant FPS drop when playing 4k/1440p youtube video | https://github.com/zen-browser/desktop/issues/4580 | 0:12:21 | None | +| Adressbar only showing on hover if sidebar width is collabsed | https://github.com/zen-browser/desktop/issues/4579 | 0:07:48 | 0:13:21 | +| Can't find on github search | https://github.com/zen-browser/desktop/issues/4576 | 4:34:29 | 4:34:29 | +| URL is shifted to the right when a permission is granted to a website | https://github.com/zen-browser/desktop/issues/4574 | 4:46:44 | 15:13:36 | +| can't change font for different languages | https://github.com/zen-browser/desktop/issues/4573 | 13:11:54 | 2 days, 19:07:15 | +| Extention storage full or | https://github.com/zen-browser/desktop/issues/4572 | None | None | +| Sidebar layout issues | https://github.com/zen-browser/desktop/issues/4570 | None | None | +| codeiq.vex.com unsupported since 1.7.2b | https://github.com/zen-browser/desktop/issues/4569 | 0:56:16 | 17:32:41 | +| Zen not showing any webpage when out of compact mode | https://github.com/zen-browser/desktop/issues/4566 | None | None | +| Discord Web App Forces Links to Open in Glance Window, Overriding User Preferences | https://github.com/zen-browser/desktop/issues/4564 | 2:42:18 | 3:30:19 | +| Some Firefox settings wiped after signing into sync | https://github.com/zen-browser/desktop/issues/4562 | 0:39:56 | None | +| Empty space on top of sidebar in compact mode | https://github.com/zen-browser/desktop/issues/4561 | 0:05:34 | 0:05:34 | +| Cannot Click to Place Cursor in Address-Bar on Linux and Windows | https://github.com/zen-browser/desktop/issues/4560 | 4 days, 18:49:29 | None | +| Prezo.ai : site broken, not loading properly on Zen Browser. | https://github.com/zen-browser/desktop/issues/4557 | 1 day, 20:29:16 | None | +| Printing preview loads indefinitely | https://github.com/zen-browser/desktop/issues/4555 | 2:59:17 | 2 days, 9:39:10 | +| Neither swipe gestures nor mouse forward/backward buttons work to switch workspaces | https://github.com/zen-browser/desktop/issues/4554 | 1:04:38 | None | +| Expand Sidebar Icon missing when sidebar is folded | https://github.com/zen-browser/desktop/issues/4553 | 5:31:28 | None | +| Windows' button shadows, bleed into the website space | https://github.com/zen-browser/desktop/issues/4551 | None | None | +| MacOS pointer not hiding when entering fullscreen | https://github.com/zen-browser/desktop/issues/4550 | None | None | +| Private browsing Profile Icon is missing | https://github.com/zen-browser/desktop/issues/4549 | None | None | +| When customizing toolbar allows the browser window to be dragged but not maximized. | https://github.com/zen-browser/desktop/issues/4548 | None | None | +| Workspace icons moved from top to side bar | https://github.com/zen-browser/desktop/issues/4547 | 3:50:50 | 3:50:50 | +| macOS: 'All Desktops' option in dock icon context menu not functioning | https://github.com/zen-browser/desktop/issues/4546 | None | None | +| OPTIONS preflight request uses HTTPS while GET request is HTTP in Angular | https://github.com/zen-browser/desktop/issues/4545 | None | None | +| Cannot adjust horizontal split width when zen web panels are pinned | https://github.com/zen-browser/desktop/issues/4544 | None | None | +| Searchbar widget doesn't iconify in collapsed mode Sidebar | https://github.com/zen-browser/desktop/issues/4543 | None | None | +| Rightmost icon in multiple toolbars disappears on launch | https://github.com/zen-browser/desktop/issues/4542 | None | None | +| Essentials disappear when switching container with PiP playing | https://github.com/zen-browser/desktop/issues/4541 | None | None | +| Workspace switchers over vertical tabs misplaced after 1.7.2b | https://github.com/zen-browser/desktop/issues/4540 | 9:53:46 | 11:31:54 | +| Compact mode works once per window | https://github.com/zen-browser/desktop/issues/4539 | 0:15:28 | 18:44:40 | +| 1Password integrations | https://github.com/zen-browser/desktop/issues/4538 | 12:10:26 | 15:09:30 | +| Extra white space at the top of the sidebar | https://github.com/zen-browser/desktop/issues/4537 | 4:37:10 | 3 days, 6:44:37 | +| Windows - Can't hide any Bars | https://github.com/zen-browser/desktop/issues/4536 | 12:20:24 | 12:20:24 | +| Typo | https://github.com/zen-browser/desktop/issues/4534 | 13:55:02 | 13:55:02 | +| Viewport rounded corners flicker & sharpness | https://github.com/zen-browser/desktop/issues/4533 | None | 0:05:25 | +| Reloading Unloaded PDF tabs creates duplicates | https://github.com/zen-browser/desktop/issues/4532 | 9:22:02 | None | +| Browser shows extra animation every time user switches to a split | https://github.com/zen-browser/desktop/issues/4531 | 16:36:14 | None | +| Screenshot icon disappeads from toolbar after each time my MAC is shutdown | https://github.com/zen-browser/desktop/issues/4530 | None | 1 day, 8:23:32 | +| I want to close my WINDOW with Ctrl + W | https://github.com/zen-browser/desktop/issues/4529 | 0:21:41 | 1 day, 2:07:59 | +| Browser Closes when All Tabs in Default Workspace are Closed Even with Other Tabs | https://github.com/zen-browser/desktop/issues/4528 | None | None | +| IDN address show punny code in URL | https://github.com/zen-browser/desktop/issues/4527 | None | None | +| Text is garbled in google docs | https://github.com/zen-browser/desktop/issues/4522 | 1 day, 2:06:08 | 2 days, 6:20:50 | +| Sidebar issues | https://github.com/zen-browser/desktop/issues/4520 | None | None | +| Sidebar wallpaper blur Macos | https://github.com/zen-browser/desktop/issues/4519 | None | None | +| Zen crashes on macOS when expanding and collapsing tab bar | https://github.com/zen-browser/desktop/issues/4518 | 8:01:33 | 8:05:17 | +| Hide and unhide sidebar impacts the Extensions icons size | https://github.com/zen-browser/desktop/issues/4517 | 4 days, 11:55:27 | None | +| Overflow menu gone in single toolbar mode | https://github.com/zen-browser/desktop/issues/4516 | None | None | +| light theme page container looks like outset | https://github.com/zen-browser/desktop/issues/4515 | 6:33:55 | 6:33:55 | +| marvinpinto/action-automatic-releases should be updated to Node20 | https://github.com/zen-browser/desktop/issues/4514 | None | None | +| Searching using the new tab search box shows the name of the engine in the address bar | https://github.com/zen-browser/desktop/issues/4512 | None | None | +| Icons in collapsible top bar don't line up with other single toolbar icons | https://github.com/zen-browser/desktop/issues/4511 | None | None | +| Top button wrap feature hides buttons when there is space | https://github.com/zen-browser/desktop/issues/4510 | None | None | +| Hide bars doesn't work after last update | https://github.com/zen-browser/desktop/issues/4509 | 0:53:56 | 4:12:00 | +| artifacts/lines across screen on some websites. | https://github.com/zen-browser/desktop/issues/4508 | None | None | +| Browser freezes and CPU usage spikes after opening/closing "More tools" twice | https://github.com/zen-browser/desktop/issues/4507 | 1:22:50 | None | +| flood to Google by fast open/close broser. request support base64 favicon | https://github.com/zen-browser/desktop/issues/4506 | None | None | +| "Pin Tab" missing in keyboard shortcut settings | https://github.com/zen-browser/desktop/issues/4504 | None | None | +| Container tab opens the old signed in page | https://github.com/zen-browser/desktop/issues/4503 | None | None | +| Container Indicator Still Showing With New Window | https://github.com/zen-browser/desktop/issues/4502 | 8:13:52 | 8:13:52 | +| Text on PDFs/Powerpoints is completely unreadable | https://github.com/zen-browser/desktop/issues/4501 | 0:09:15 | 0:09:18 | +| Bookmarks in toolbar and ability to add bookmarks dissapppeared with release 1.7.1b | https://github.com/zen-browser/desktop/issues/4499 | 4 days, 3:23:33 | 3 days, 7:20:47 | +| Theme Selection Issue After Browser Update version 1.7.1b Windows | https://github.com/zen-browser/desktop/issues/4498 | 0:28:37 | 0:28:37 | +| Browser Freeze on image copy | https://github.com/zen-browser/desktop/issues/4497 | None | None | +| Fcitx5 doesn't load skins / themes / settings on KDE 6 wayland | https://github.com/zen-browser/desktop/issues/4495 | 1:42:18 | None | +| When starting zen browser it takes a long time starting up | https://github.com/zen-browser/desktop/issues/4494 | None | None | +| Scrolling between the workspaces is very slow.. | https://github.com/zen-browser/desktop/issues/4493 | None | 9 days, 9:07:24 | +| Theme colour interfering with webpage | https://github.com/zen-browser/desktop/issues/4492 | 1:24:45 | 1:24:45 | +| Essentials turning into pinned tab in new window | https://github.com/zen-browser/desktop/issues/4491 | None | None | +| All add-ons have been disabled by safe mode on version 1.7.1b Windows | https://github.com/zen-browser/desktop/issues/4490 | None | 23:06:20 | +| Opening the overflow menu twice freezes the browser window on MacOs | https://github.com/zen-browser/desktop/issues/4489 | 1 day, 10:02:01 | 5 days, 8:07:24 | +| After updating to 1.7.1 Zen "broke" | https://github.com/zen-browser/desktop/issues/4488 | 0:28:58 | 3:10:29 | +| After highlighting search toolbar the background blur breaks out. | https://github.com/zen-browser/desktop/issues/4487 | 3:22:32 | None | +| Compact Mode No Longer Hides Sidebar and Top Toolbar | https://github.com/zen-browser/desktop/issues/4486 | 0:13:16 | 0:20:02 | +| mailto dialog breaks when compact mode is enabled | https://github.com/zen-browser/desktop/issues/4485 | None | None | +| Toolbar is not hiding after hide both top bar and tab bar | https://github.com/zen-browser/desktop/issues/4484 | 0:46:49 | 0:54:21 | +| After last update, ZEN browser just disappered! | https://github.com/zen-browser/desktop/issues/4482 | 2:13:47 | 1 day, 19:31:19 | +| browser.tabs.closeWindowWithLastTab does not work when there are essentials or pinned tabs | https://github.com/zen-browser/desktop/issues/4481 | None | None | +| Address Bar Slides Down Unexpectedly When Hovering for Toolbar in Full-Screen Mode | https://github.com/zen-browser/desktop/issues/4480 | None | None | +| Web panel icon in the sidebar is missing | https://github.com/zen-browser/desktop/issues/4479 | 4:50:13 | None | +| Broken scrollbar on the sidebar | https://github.com/zen-browser/desktop/issues/4478 | 4:38:40 | 4:38:40 | +| Tab Toolbar No Longer Collapsing | https://github.com/zen-browser/desktop/issues/4477 | 2:05:12 | 4:17:18 | +| Tab group collapsing seems to not work | https://github.com/zen-browser/desktop/issues/4476 | 0:13:43 | 9:07:00 | +| No button to enable compact mode in settings page | https://github.com/zen-browser/desktop/issues/4473 | 5:51:29 | 6:25:51 | +| Can't click out of submenus or right-click context menu. | https://github.com/zen-browser/desktop/issues/4471 | None | 0:14:04 | +| "Some of Zen's security features may offer less protection on your current operating system" | https://github.com/zen-browser/desktop/issues/4470 | 0:42:44 | 0:42:47 | +| Dragging out the last tab from the tab list opens up another window | https://github.com/zen-browser/desktop/issues/4469 | 1:50:02 | None | +| Wrong location of input content directly after creating a new tab page | https://github.com/zen-browser/desktop/issues/4468 | 14:53:17 | 14:53:17 | +| active Essentials tab - url changed is opening in the active Essentials tab instead of new tab | https://github.com/zen-browser/desktop/issues/4467 | 0:04:56 | 0:04:56 | +| The Current Workspace Indicator is no longer clickable. | https://github.com/zen-browser/desktop/issues/4466 | 0:41:38 | None | +| My browser addons do not show up or have any effect in the Web panel tabs? | https://github.com/zen-browser/desktop/issues/4465 | None | None | +| Profile switcher not showing in collapsed sidebar | https://github.com/zen-browser/desktop/issues/4464 | None | None | +| Facebook does not work | https://github.com/zen-browser/desktop/issues/4463 | None | 0:08:40 | +| Latest Twilight Release breaks UI on MacOS | https://github.com/zen-browser/desktop/issues/4462 | 0:38:30 | 19:02:04 | +| Zen Compact mode doesn't work at all | https://github.com/zen-browser/desktop/issues/4461 | 0:33:07 | 1:45:21 | +| Extension permissions window shifted | https://github.com/zen-browser/desktop/issues/4460 | 1:45:17 | None | +| Browser Extensions Display Incorrectly When Changing Sidebar Width in Single Toolbar Mode | https://github.com/zen-browser/desktop/issues/4459 | None | None | +| Missing "Change theme colors" | https://github.com/zen-browser/desktop/issues/4458 | 3:34:32 | None | +| Zen getting closed immediately when I open it after screen is locked for some time | https://github.com/zen-browser/desktop/issues/4457 | 1 day, 3:23:38 | 6 days, 4:08:52 | +| Tab sidebar does not sliding properly with touchpad (IT FIXED WHEN UPDATE 1.7B) | https://github.com/zen-browser/desktop/issues/4456 | 4:03:13 | 4:04:23 | +| Massive Visual Glitch | https://github.com/zen-browser/desktop/issues/4455 | 4:28:14 | 4:38:13 | +| Tab and top bars not collapsing when upgrading from 1.7b to 1.7.1b | https://github.com/zen-browser/desktop/issues/4454 | 1:36:02 | 5:22:48 | +| Workspace Emoji not updating choice | https://github.com/zen-browser/desktop/issues/4453 | None | None | +| Synchronizing Duplicates Default Workspace | https://github.com/zen-browser/desktop/issues/4452 | 1 day, 7:42:33 | None | +| Tabs freeze when opening new ones | https://github.com/zen-browser/desktop/issues/4451 | 8:44:35 | None | +| Severe memory leak | https://github.com/zen-browser/desktop/issues/4450 | 3:35:43 | None | +| Tab Retitle Not Working For All Workspaces | https://github.com/zen-browser/desktop/issues/4448 | None | None | +| Scrolling horizontally on the sidebar animates even when current workspace is the only workspace | https://github.com/zen-browser/desktop/issues/4447 | None | None | +| Essentials Loading In Wrong Workspace When Using Firefox Multi-Acccount Containers | https://github.com/zen-browser/desktop/issues/4446 | 1 day, 13:29:49 | 1 day, 22:44:12 | +| Link to Firefox app in about:protections | https://github.com/zen-browser/desktop/issues/4445 | 17:52:50 | None | +| The name of the application displayed in the notification | https://github.com/zen-browser/desktop/issues/4444 | None | None | +| Bookmarks duplicate on new window (sometimes) | https://github.com/zen-browser/desktop/issues/4443 | None | 9 days, 4:00:20 | +| "Undo Close Window" action does not work correctly | https://github.com/zen-browser/desktop/issues/4442 | None | None | +| Zen Browser very slow to load all websites | https://github.com/zen-browser/desktop/issues/4441 | None | 8:28:11 | +| Close Browser issue | https://github.com/zen-browser/desktop/issues/4440 | None | None | +| 1password-extension connection failure on ZEN browser | https://github.com/zen-browser/desktop/issues/4438 | 0:13:02 | None | +| Container indicators always show on tabs dragged out of window, even if they are opened in their containers' default workspaces | https://github.com/zen-browser/desktop/issues/4437 | None | None | +| Essentials in new windows open in container of last used workspace instead of their actual containers | https://github.com/zen-browser/desktop/issues/4436 | None | None | +| Forced compact mode on multiple toolbars view, right of screen cut off | https://github.com/zen-browser/desktop/issues/4434 | 2:00:41 | 10:00:34 | +| Forced compact mode on multiple toolbars view, right of screen cut off | https://github.com/zen-browser/desktop/issues/4433 | 10:03:04 | 10:03:04 | +| problem moving icons | https://github.com/zen-browser/desktop/issues/4432 | None | 1 day, 22:26:39 | +| (Regression?) Tab moving is buggy after switching workspaces | https://github.com/zen-browser/desktop/issues/4431 | None | 13 days, 3:51:45 | +| Changing theme to light does not work | https://github.com/zen-browser/desktop/issues/4430 | None | 1:26:30 | +| Bottom Corners are not Rounded | https://github.com/zen-browser/desktop/issues/4428 | 0:09:07 | 0:09:07 | +| Moving bookmark items to sidebar makes it stuck | https://github.com/zen-browser/desktop/issues/4427 | None | None | +| Actual Window Width of Zen Twilight 1.7t (2025-01-18 at 00:37:45) | https://github.com/zen-browser/desktop/issues/4426 | 4:16:49 | None | +| Text in modals are blank | https://github.com/zen-browser/desktop/issues/4425 | None | None | +| Problem customizing the toolbar | https://github.com/zen-browser/desktop/issues/4424 | None | None | +| REGRESSION: Non-workspace users are seeing an useless button. | https://github.com/zen-browser/desktop/issues/4423 | 1:27:08 | 1:27:08 | +| Homepage and new tabs are clashing/reseting between two extensions after restarting the browser | https://github.com/zen-browser/desktop/issues/4420 | 9:59:30 | None | +| Zen browser (flatpak Linux) too slow to load the first website on first start | https://github.com/zen-browser/desktop/issues/4418 | None | None | +| Buggy Youtube entering and exiting full screen mode | https://github.com/zen-browser/desktop/issues/4417 | 1:28:01 | None | +| Unexpected UI for essential's active tabs | https://github.com/zen-browser/desktop/issues/4416 | None | None | +| old tab is not opening again. | https://github.com/zen-browser/desktop/issues/4412 | 13:38:37 | 13:57:44 | +| All gone on update | https://github.com/zen-browser/desktop/issues/4411 | 0:16:47 | 0:18:50 | +| https://discord.com requires login every refresh and is irresponsive when using Ctrl+Shift+I | https://github.com/zen-browser/desktop/issues/4408 | None | None | +| Required to double-click non tab elements in vertical tab bar | https://github.com/zen-browser/desktop/issues/4406 | None | 15 days, 1:43:06 | +| New tab opened with link click does not scroll into view, or have any indication that a new tab is been created | https://github.com/zen-browser/desktop/issues/4405 | None | None | +| Uneven padding in the window border | https://github.com/zen-browser/desktop/issues/4404 | None | None | +| editing problem in the url bar | https://github.com/zen-browser/desktop/issues/4403 | None | None | +| CMD+W closes the browser. | https://github.com/zen-browser/desktop/issues/4402 | 0:13:23 | 0:13:23 | +| Toolbar blinks when in compact mode and while hovering over it with a mouse | https://github.com/zen-browser/desktop/issues/4401 | 0:36:52 | 0:36:52 | +| When two windows of Zen are opened, they have slightly different color scheme | https://github.com/zen-browser/desktop/issues/4400 | 1 day, 4:29:58 | 2 days, 2:33:55 | +| Browser freezes after abruptly closing essential before loading them | https://github.com/zen-browser/desktop/issues/4399 | None | None | +| Collapsible Sidebar Not Functioning Correctly | https://github.com/zen-browser/desktop/issues/4398 | 2:47:32 | 2:47:32 | +| Failed to find update in twilight | https://github.com/zen-browser/desktop/issues/4397 | 2:49:14 | 3:02:05 | +| keepassxc addon not working on garuda linux | https://github.com/zen-browser/desktop/issues/4396 | None | 0:01:02 | +| (MacOS) Audio on browser not app-adjustable in utilities that allow individual app volume control. | https://github.com/zen-browser/desktop/issues/4395 | None | None | +| When enabling and disabling compact mode, depending on the web page you are viewing, the page jitters | https://github.com/zen-browser/desktop/issues/4394 | 3:26:06 | 3:26:06 | +| No dialog to give an "escape full screen" button when in full screen video, i.e on YouTube | https://github.com/zen-browser/desktop/issues/4392 | 4:01:26 | 4:01:26 | +| Pinned tabs are looking like regular tabs with a separator | https://github.com/zen-browser/desktop/issues/4391 | 0:48:28 | 21:14:22 | +| Added a new container and workspace, changed the icon and color, which caused in the search bar indicator to disappear. | https://github.com/zen-browser/desktop/issues/4390 | None | None | +| toolbar doesnt pop up when opening tabs with middle mouse click | https://github.com/zen-browser/desktop/issues/4389 | None | None | +| tabs are unloaded too quickly | https://github.com/zen-browser/desktop/issues/4388 | 0:27:37 | None | +| 1.7b When browser closes when the last tab is closed, it creates a new tab, and then quits | https://github.com/zen-browser/desktop/issues/4387 | None | None | +| 1.7b Active Tab Design | https://github.com/zen-browser/desktop/issues/4386 | 1:19:07 | None | +| Visual glitches with fonts on some websites | https://github.com/zen-browser/desktop/issues/4385 | 1:13:45 | 1:13:45 | +| 1.7b laggy in general compared to 1.6b | https://github.com/zen-browser/desktop/issues/4384 | 2:20:31 | 6 days, 23:13:36 | +| Tab unloader does not work; does not reduce resource consumption | https://github.com/zen-browser/desktop/issues/4383 | 6:47:30 | None | +| ZIP download button does nothing | https://github.com/zen-browser/desktop/issues/4382 | 0:26:46 | 0:26:46 | +| The history button is broken on the side bar | https://github.com/zen-browser/desktop/issues/4381 | 1:36:08 | None | +| Pixelated Text | https://github.com/zen-browser/desktop/issues/4380 | 1:34:11 | 1:34:11 | +| Allow workspaces have their own pinned tabs not working 1.7b | https://github.com/zen-browser/desktop/issues/4379 | 5:21:45 | 5:21:45 | +| Full LTO causes crash with flatpak | https://github.com/zen-browser/desktop/issues/4378 | 7:38:51 | None | +| Lost all pins and essentials on update 1.7b | https://github.com/zen-browser/desktop/issues/4377 | 6:01:05 | None | +| 1.7b tab bar choppy animation and interaction issue | https://github.com/zen-browser/desktop/issues/4376 | 22:56:24 | None | +| Workspace switching by touchpad swipe doesn't work with too many tabs open. | https://github.com/zen-browser/desktop/issues/4375 | 0:05:39 | None | +| Synced tabs pop-up layout messed up | https://github.com/zen-browser/desktop/issues/4371 | None | None | +| Keyboard shortcuts keep being reset | https://github.com/zen-browser/desktop/issues/4370 | 17:21:42 | 2 days, 1:32:20 | +| Zen doesn't respond quickly (~2 min) to discord attempting to download .deb file for update | https://github.com/zen-browser/desktop/issues/4369 | 0:32:40 | None | +| Compact tab bar isn't going to hide at last Twilight build (1.7t (2025-01-15)) | https://github.com/zen-browser/desktop/issues/4368 | 0:33:05 | 0:33:05 | +| Sidebar does't change width properly. | https://github.com/zen-browser/desktop/issues/4367 | 1:29:43 | 1:29:43 | +| Dialog box appearing in wrong direction | https://github.com/zen-browser/desktop/issues/4366 | 1:59:09 | 4:33:28 | +| 1Password says there's a Firefox update available | https://github.com/zen-browser/desktop/issues/4365 | 5:09:12 | None | +| Sometimes tabs stuck and not clickable | https://github.com/zen-browser/desktop/issues/4362 | 0:19:25 | None | +| Side Web Panel icon shows after start when deactivated | https://github.com/zen-browser/desktop/issues/4361 | 19:20:10 | None | +| Tab bar scrolls slow and buggy | https://github.com/zen-browser/desktop/issues/4359 | 0:09:28 | 0:23:50 | +| Zen Browser opens zen-beta? | https://github.com/zen-browser/desktop/issues/4358 | 11:38:19 | 1 day, 0:36:24 | +| Tab bar is blue | https://github.com/zen-browser/desktop/issues/4357 | 1:27:20 | 1:28:24 | +| Require Device Sign-in to fill passwords does not work | https://github.com/zen-browser/desktop/issues/4356 | 1 day, 13:54:07 | None | +| Quicktime browser plugin not displaying | https://github.com/zen-browser/desktop/issues/4355 | 0:02:21 | 1 day, 3:43:36 | +| Html Date (Month) Input is not working. | https://github.com/zen-browser/desktop/issues/4354 | 1 day, 4:02:04 | None | +| Proxies cannot be used to access google, YouTube, and more | https://github.com/zen-browser/desktop/issues/4352 | 1:35:57 | 1 day, 0:46:50 | +| Round edging not functional on some sites | https://github.com/zen-browser/desktop/issues/4351 | 2:37:01 | 1 day, 5:36:14 | +| Sign pop up windows not using container assigned to workspace. | https://github.com/zen-browser/desktop/issues/4350 | None | None | +| Browser bug , not work correctly | https://github.com/zen-browser/desktop/issues/4348 | 2:26:52 | 17 days, 7:42:31 | +| Opening settings causes sidebar to go ultra wide | https://github.com/zen-browser/desktop/issues/4347 | None | None | +| Notification for 'new tab' does not work | https://github.com/zen-browser/desktop/issues/4346 | 3:25:57 | 21:01:52 | +| New tab created with link click OR ctrl+T is obscured by empty/unused toolbar space | https://github.com/zen-browser/desktop/issues/4345 | None | None | +| Jittering in tab groups | https://github.com/zen-browser/desktop/issues/4343 | 3:11:54 | 3:32:43 | +| Sidebar Jittering While In compact mode | https://github.com/zen-browser/desktop/issues/4342 | None | None | +| [Windows] Videos crash in the second view | https://github.com/zen-browser/desktop/issues/4341 | 6:12:02 | None | +| Page refresh | https://github.com/zen-browser/desktop/issues/4338 | 11:57:25 | None | +| Expand Side's bar changes position of forward and backward buttons | https://github.com/zen-browser/desktop/issues/4336 | 12:19:39 | None | +| breaks after using rectify11 and mica for everyone | https://github.com/zen-browser/desktop/issues/4335 | None | 3:03:08 | +| Link "Zen support site" redirects to firefox support site | https://github.com/zen-browser/desktop/issues/4333 | 16:39:30 | 16:39:30 | +| Opening discord keeps crashing the tab | https://github.com/zen-browser/desktop/issues/4332 | 0:24:48 | 0:24:48 | +| space between essentials/tabs and the workspace title is different for default vs others | https://github.com/zen-browser/desktop/issues/4329 | None | 1 day, 0:42:55 | +| Essential disappears, but it's still there | https://github.com/zen-browser/desktop/issues/4328 | 17:21:42 | 2 days, 3:52:35 | +| Text in PDF is (still) distorted | https://github.com/zen-browser/desktop/issues/4327 | 1 day, 0:20:39 | 1 day, 0:20:39 | +| Waiting since very long for Hold click to preview link | https://github.com/zen-browser/desktop/issues/4326 | 1 day, 1:18:24 | 1 day, 1:18:24 | +| Can't close window by closing the last tab | https://github.com/zen-browser/desktop/issues/4325 | 0:50:23 | 1 day, 3:13:18 | +| Zen Browser on MacOS is not restoring tabs after closing window | https://github.com/zen-browser/desktop/issues/4324 | 1 day, 3:29:13 | None | +| Some videos can't play in Zen Browser | https://github.com/zen-browser/desktop/issues/4323 | 2 days, 14:26:03 | None | +| Web panel pin button has wrong icon when clicking for the first time | https://github.com/zen-browser/desktop/issues/4322 | None | None | +| Slow scrolling speed on the vertical tab bar in 1.6b | https://github.com/zen-browser/desktop/issues/4321 | 1:18:21 | 1 day, 5:19:47 | +| browser.urlbar.suggest.topsites set to false make url cannot be edited | https://github.com/zen-browser/desktop/issues/4319 | 1 day, 3:38:03 | 2 days, 9:54:46 | +| Tab volume icon not showing in collapsed toolbar unless tab is active | https://github.com/zen-browser/desktop/issues/4316 | None | 0:08:41 | +| Profile avatar picture flashes and is overridden by firefox account avatar | https://github.com/zen-browser/desktop/issues/4315 | 8:16:31 | 8:16:31 | +| Zen Browser Turn Light At Lost Focus | https://github.com/zen-browser/desktop/issues/4314 | 2 days, 4:11:22 | 5 days, 16:04:18 | +| "Log-in to this network" modal & button not interactible | https://github.com/zen-browser/desktop/issues/4313 | None | None | +| Sudden Crashes on Arch Linux with Multiple Tabs Opened | https://github.com/zen-browser/desktop/issues/4309 | 2:56:11 | None | +| Since 1.6b, tab bar scrolls slowly and unpredictably when using a touchpad | https://github.com/zen-browser/desktop/issues/4307 | 2:14:54 | 13:01:41 | +| Breaking Keyboard Shortcuts | https://github.com/zen-browser/desktop/issues/4306 | 2:00:54 | 4 days, 2:12:32 | +| [TWILIGHT] New update has some bugs I've found so far | https://github.com/zen-browser/desktop/issues/4304 | 4:56:10 | 19 days, 5:12:42 | +| blurry fonts on 32:9 aspect ratio | https://github.com/zen-browser/desktop/issues/4303 | 6:21:35 | None | +| Checked Radio button UI issue | https://github.com/zen-browser/desktop/issues/4302 | 0:51:38 | None | +| Firefox Home shortcut is turned off. | https://github.com/zen-browser/desktop/issues/4300 | 10:54:39 | None | +| Unable to edit URL in address bar | https://github.com/zen-browser/desktop/issues/4299 | 9:46:51 | 23:24:13 | +| Private Window New Tab is not showing blank page. | https://github.com/zen-browser/desktop/issues/4297 | None | None | +| Essential Tabs URLs Disappear After Brew Update and Browser Restart | https://github.com/zen-browser/desktop/issues/4296 | 2 days, 12:54:19 | None | +| Floating URL bar misplaced after opening Customize Toolbar | https://github.com/zen-browser/desktop/issues/4295 | 17:27:44 | None | +| Unfocusing the browser with "widget.gtk.rounded-bottom-corners.enabled" causes the bottom corners to stop being rounded | https://github.com/zen-browser/desktop/issues/4294 | None | 12:46:25 | +| Pin to toolbar text out of place on Mac | https://github.com/zen-browser/desktop/issues/4293 | None | None | +| the slider on the home screen looks just like a dot when turned on | https://github.com/zen-browser/desktop/issues/4291 | None | None | +| Closing the last tab in the only workspace should close the browser | https://github.com/zen-browser/desktop/issues/4289 | 2:29:09 | 19:14:35 | +| Scrolling on touchpad broken | https://github.com/zen-browser/desktop/issues/4288 | None | 0:07:44 | +| Sidebar behaving weird when compact mode is in "hide toolbar only" mode | https://github.com/zen-browser/desktop/issues/4287 | 1 day, 5:36:16 | 1 day, 23:15:29 | +| Zen Beta (any version) is completely broken for me | https://github.com/zen-browser/desktop/issues/4286 | 0:28:01 | 21:07:29 | +| Previous and Next page buttons switched | https://github.com/zen-browser/desktop/issues/4285 | 0:34:35 | 0:34:35 | +| Random crash after using the browser for some time. | https://github.com/zen-browser/desktop/issues/4284 | None | None | +| Even if you have recent activity turned on in the settings, it will be turned off the next time you start Zen Browser. | https://github.com/zen-browser/desktop/issues/4283 | 0:04:23 | None | +| [windows only] wired orange-ish background in new version | https://github.com/zen-browser/desktop/issues/4281 | 0:01:44 | 0:01:44 | +| Blurred fonts on Webpages | https://github.com/zen-browser/desktop/issues/4280 | 0:55:49 | 0:55:49 | +| Customize Toolbar breaks the browser layout | https://github.com/zen-browser/desktop/issues/4279 | 1:37:10 | None | +| When second window is opened, Essential tabs are not visible for this window | https://github.com/zen-browser/desktop/issues/4278 | None | None | +| Frame color is grey instead of light or dark themed | https://github.com/zen-browser/desktop/issues/4277 | 13:26:52 | 9 days, 19:55:41 | +| Tab styling bug | https://github.com/zen-browser/desktop/issues/4276 | None | 4:32:10 | +| Vertical Toolbar Resizing | https://github.com/zen-browser/desktop/issues/4275 | 1:10:26 | 5:40:14 | +| Scoll Bar has lower scroll factor. | https://github.com/zen-browser/desktop/issues/4274 | 8:35:00 | 8:35:00 | +| Closing last tab does not close browser | https://github.com/zen-browser/desktop/issues/4273 | 9:04:24 | 12:10:08 | +| I can't disable workspaces anymore | https://github.com/zen-browser/desktop/issues/4272 | 0:10:05 | 13:14:51 | +| Why there is strange styling / background color on some of the pages? | https://github.com/zen-browser/desktop/issues/4271 | None | 0:12:17 | +| Customize Toolbar not saving changes upon relaunch. | https://github.com/zen-browser/desktop/issues/4270 | 2 days, 0:05:19 | None | +| White line at the bottom | https://github.com/zen-browser/desktop/issues/4269 | None | None | +| History / recently visited pages list contains only icons, no names or adresses | https://github.com/zen-browser/desktop/issues/4265 | 2 days, 21:24:58 | None | +| Weird color highlight when window is in focus | https://github.com/zen-browser/desktop/issues/4264 | 1 day, 4:13:23 | 1 day, 20:39:36 | +| Workspaces | https://github.com/zen-browser/desktop/issues/4263 | None | 2:26:35 | +| Audio indicator not showing for sites playing audio when not chosen | https://github.com/zen-browser/desktop/issues/4262 | None | None | +| Theme color | https://github.com/zen-browser/desktop/issues/4261 | 0:11:52 | 3 days, 0:13:33 | +| Performance lag/FPS drops on HP Spectre laptop only | https://github.com/zen-browser/desktop/issues/4260 | None | None | +| Browser window colors change when window is inactive/unfocused | https://github.com/zen-browser/desktop/issues/4258 | 1 day, 7:13:53 | 0:08:23 | +| Each update requires the binary to be re-downloaded. | https://github.com/zen-browser/desktop/issues/4257 | None | None | +| Workspaces button (above tabs) does not hide even tho I have only one workspace. | https://github.com/zen-browser/desktop/issues/4256 | 0:39:33 | 2 days, 0:19:16 | +| Keyboard Shortcuts reset everytime I open the browser | https://github.com/zen-browser/desktop/issues/4255 | 8:48:29 | 2 days, 3:25:34 | +| When opening a new window, inned tabs are also reopen in the new window (tho some become "New Tab"). | https://github.com/zen-browser/desktop/issues/4254 | None | None | +| Back and Forward buttons moved to the right and flipped | https://github.com/zen-browser/desktop/issues/4253 | 12:03:43 | 0:11:45 | +| Web Developer Tools missing labels in collapsed toolbar. | https://github.com/zen-browser/desktop/issues/4252 | None | None | +| Can't change location in the weather widget | https://github.com/zen-browser/desktop/issues/4250 | 3 days, 18:40:41 | None | +| Tabs crashing randomlly | https://github.com/zen-browser/desktop/issues/4249 | 3 days, 11:21:20 | None | +| Freesync broken in fullscreen | https://github.com/zen-browser/desktop/issues/4248 | None | None | +| Floating URL touchpad switch workspace | https://github.com/zen-browser/desktop/issues/4246 | None | None | +| Page open. No Tab in tab bar. | https://github.com/zen-browser/desktop/issues/4244 | None | 12 days, 20:38:18 | +| Sidebar not working properly. | https://github.com/zen-browser/desktop/issues/4242 | 10:58:19 | 1 day, 6:06:30 | +| Why are the tabs on the right? | https://github.com/zen-browser/desktop/issues/4241 | 3:53:16 | 9 days, 21:54:56 | +| Shortcuts for cycling workspaces are not working on non-English keyboard layout | https://github.com/zen-browser/desktop/issues/4240 | 14:14:25 | None | +| Unsetting some keyboard shortcuts causes the application to get stuck in the splash screen. | https://github.com/zen-browser/desktop/issues/4238 | 4 days, 17:04:39 | 4 days, 17:04:38 | +| Google's access speed is very slow, other browsers open at the same time, no problem! | https://github.com/zen-browser/desktop/issues/4237 | None | None | +| Bookmark cannot deleted/edit when the the name starts with "?..." | https://github.com/zen-browser/desktop/issues/4236 | None | None | +| I set the startup page to be a blank page; browser never responds. | https://github.com/zen-browser/desktop/issues/4235 | 19 days, 4:19:18 | None | +| bug: In `compact mode` the `user account` icon in top bar is broken after first click - 1.0.2-b.5 (Firefox 133.0.3) | https://github.com/zen-browser/desktop/issues/4232 | 1 day, 11:10:39 | 2 days, 6:06:01 | +| screencast is not working underwayland | https://github.com/zen-browser/desktop/issues/4231 | 16 days, 20:54:10 | None | +| gradient theme color disappears | https://github.com/zen-browser/desktop/issues/4230 | 4 days, 12:17:20 | None | +| Autofilling not working in some webpages | https://github.com/zen-browser/desktop/issues/4229 | None | 2 days, 14:08:32 | +| Not possible to use CTRL + F on a web panel | https://github.com/zen-browser/desktop/issues/4228 | None | None | +| Switch workspace animation without workspaces | https://github.com/zen-browser/desktop/issues/4227 | None | None | +| Command Option L always opens inspector despite keyboard shortcut setting | https://github.com/zen-browser/desktop/issues/4224 | 2 days, 13:08:20 | 4 days, 12:27:38 | +| Webgl applications not working. | https://github.com/zen-browser/desktop/issues/4223 | 1:45:58 | None | +| Pins syncing across windows | https://github.com/zen-browser/desktop/issues/4222 | 2 days, 23:53:53 | 15 days, 21:21:10 | +| URL/Title bar can be scrolled up on Windows | https://github.com/zen-browser/desktop/issues/4220 | 5 days, 1:26:35 | None | +| [Linux][tarball] Twilight - Can't update/wrong notification | https://github.com/zen-browser/desktop/issues/4219 | 0:15:28 | 0:15:28 | +| [Linux][Flatpak] Light/Dark Theme settings not respected | https://github.com/zen-browser/desktop/issues/4217 | 0:49:02 | 1:47:37 | +| cant close side menu and back and forward buttons swapped. | https://github.com/zen-browser/desktop/issues/4216 | 12:38:36 | None | +| MacOS CMD+Shift+L opens Dev Tools | https://github.com/zen-browser/desktop/issues/4215 | 1:48:05 | 1:48:05 | +| Dark mode problem | https://github.com/zen-browser/desktop/issues/4214 | 2:02:31 | 2:02:35 | +| Unwanted separation in zen | https://github.com/zen-browser/desktop/issues/4213 | 2:48:23 | 2:48:23 | +| ctrl+shift+c not working | https://github.com/zen-browser/desktop/issues/4212 | 1:02:17 | 2:59:00 | +| Black screen on launch | https://github.com/zen-browser/desktop/issues/4211 | 2:12:26 | 5:25:52 | +| When adding 2500 Tabs to the essentials section the browser becomes unresponsive | https://github.com/zen-browser/desktop/issues/4210 | 3:34:59 | None | +| [Bug] Minimize & Maximize buttons are not visible in Title bar | https://github.com/zen-browser/desktop/issues/4209 | 22:13:45 | None | +| Vertical tab bar isn't working as expected | https://github.com/zen-browser/desktop/issues/4208 | 7:06:10 | None | +| thinks that there is an update available / failed | https://github.com/zen-browser/desktop/issues/4207 | 0:12:57 | 0:12:57 | +| Compact Bar Doesn't Fully Close | https://github.com/zen-browser/desktop/issues/4205 | 3:18:39 | 3:18:39 | +| twilight: release note link does not go to the right page | https://github.com/zen-browser/desktop/issues/4203 | 13:07:36 | 13:07:36 | +| Update pop up failed on twilight | https://github.com/zen-browser/desktop/issues/4202 | 0:12:04 | 0:25:02 | +| Auto-filling passwords is broken for any website on MacOS | https://github.com/zen-browser/desktop/issues/4201 | 1 day, 10:59:13 | 0:13:22 | +| Test | https://github.com/zen-browser/desktop/issues/4199 | None | 0:00:13 | +| If site opens tab using JS, and you switch workspace, it opens in wrong workspace | https://github.com/zen-browser/desktop/issues/4197 | None | None | +| Resetting keyboard shortcuts not reflected in the UI | https://github.com/zen-browser/desktop/issues/4194 | None | None | +| Fetch requests not showing in the Network panel | https://github.com/zen-browser/desktop/issues/4192 | 4 days, 12:19:17 | None | +| Search bar overlapping essentials area bug | https://github.com/zen-browser/desktop/issues/4191 | 20:07:09 | 20:07:09 | +| url bar is sized wrong when not in compact mode | https://github.com/zen-browser/desktop/issues/4190 | 10:45:50 | 10:45:50 | +| Compact mode sidebar trigger area is too wide (macOS) | https://github.com/zen-browser/desktop/issues/4189 | 15:13:53 | 15:13:53 | +| Install Add-on From File... | https://github.com/zen-browser/desktop/issues/4186 | None | None | +| Arrangement of back & forward arrows changes after toggling the sidebar's width | https://github.com/zen-browser/desktop/issues/4185 | None | None | +| Workspaces bar problems on toolbar | https://github.com/zen-browser/desktop/issues/4183 | 10 days, 6:32:09 | None | +| "Breakpoint A breakpoint has been reached." | https://github.com/zen-browser/desktop/issues/4181 | 3 days, 2:30:20 | None | +| (Detailed Report) Using Ctrl+Tab to switch from splitted tabs to other tabs only works for tabs adjacent to the last split if "change tabs on hover" is turned on | https://github.com/zen-browser/desktop/issues/4180 | None | None | +| unloaded tabs with unsaved changes cannot be opened | https://github.com/zen-browser/desktop/issues/4179 | 15 days, 8:16:21 | None | +| broken page background on some sites | https://github.com/zen-browser/desktop/issues/4178 | 1 day, 0:42:21 | 7 days, 5:35:11 | +| Deleting certain keyboard shortcuts crashes the file on restart | https://github.com/zen-browser/desktop/issues/4177 | 3 days, 13:52:28 | 7 days, 12:06:28 | +| Disabeling forward/backward mouse buttons for switching workspaces und trigger back/forward of current website. | https://github.com/zen-browser/desktop/issues/4176 | 10 days, 2:11:24 | None | +| A Silly White Line Appears At The Top Of The Browser Window In Windows | https://github.com/zen-browser/desktop/issues/4175 | 1 day, 23:59:40 | 1 day, 23:59:40 | +| Zooming in PDF viewer is not working when using scrollwheel click to scroll throught PDF | https://github.com/zen-browser/desktop/issues/4173 | 3 days, 2:26:50 | None | +| compact mode tabs flickers when cursor is on window border | https://github.com/zen-browser/desktop/issues/4172 | None | None | +| Since the app is no longer in beta, the app shouldn't use strings with 'beta' in it and replace those with a normal string such as "Zen Browser". | https://github.com/zen-browser/desktop/issues/4171 | 0:12:14 | 0:19:44 | +| Linux version doesn't use the system proxy | https://github.com/zen-browser/desktop/issues/4170 | 10 days, 23:13:16 | None | +| Reordering Essentials is weird | https://github.com/zen-browser/desktop/issues/4169 | 3 days, 8:53:15 | 8 days, 3:19:28 | +| Duplicate preferences for "Use themed...." | https://github.com/zen-browser/desktop/issues/4166 | None | 0:02:33 | +| Entering compact mode on one window engages compact mode on all windows | https://github.com/zen-browser/desktop/issues/4165 | 17 days, 6:17:00 | 17 days, 6:17:00 | +| Bug: Unable to perform a search, tab stuck on loading | https://github.com/zen-browser/desktop/issues/4160 | None | 1:30:36 | +| Windows 11 - Compact Mode - Hide Tab Bar - Doesn't hide if using touch | https://github.com/zen-browser/desktop/issues/4157 | None | None | +| just goes blank when i decide to open new tab | https://github.com/zen-browser/desktop/issues/4156 | None | None | +| decoding problem "i think" | https://github.com/zen-browser/desktop/issues/4155 | None | None | +| Performance And Black Squares Issue | https://github.com/zen-browser/desktop/issues/4154 | None | None | +| the design of the "new tab" button does not allow it to be distinguished properly | https://github.com/zen-browser/desktop/issues/4153 | 0:20:19 | None | +| Pinned tabs do not Refresh Automatically after browser restart | https://github.com/zen-browser/desktop/issues/4152 | 3 days, 4:53:05 | None | +| Startup load broken | https://github.com/zen-browser/desktop/issues/4151 | None | 0:06:12 | +| An intuitive problem with the automatic theme (light/dark) | https://github.com/zen-browser/desktop/issues/4150 | None | None | +| Zen keeps resetting Home page every so often | https://github.com/zen-browser/desktop/issues/4148 | 12 days, 1:40:29 | None | +| Bookmarks toolbar blank on single toolbar layout | https://github.com/zen-browser/desktop/issues/4146 | 1:28:06 | 1 day, 20:15:55 | +| UI Bug: Wrong aspect ratio in tab switcher on ultra wide screens (32:9) | https://github.com/zen-browser/desktop/issues/4144 | None | None | +| pdf.js jumps across pages when activating annonation tools | https://github.com/zen-browser/desktop/issues/4143 | None | None | +| A black bar appeared at the top of the browser. | https://github.com/zen-browser/desktop/issues/4137 | 1:08:53 | 1:08:53 | +| --zen-primary-color affecting Zen about pages | https://github.com/zen-browser/desktop/issues/4135 | 0:34:32 | 0:34:32 | +| Essentials load in wrong container when opening new window with different workspace | https://github.com/zen-browser/desktop/issues/4134 | 1 day, 4:39:10 | 9 days, 21:24:46 | +| Container Indicator Issue | https://github.com/zen-browser/desktop/issues/4132 | 0:15:50 | 1:36:18 | +| Bookmarks Separator Issue | https://github.com/zen-browser/desktop/issues/4131 | 6:20:17 | None | +| Bookmarks Modal Issue | https://github.com/zen-browser/desktop/issues/4130 | 0:19:20 | 1:37:35 | +| Bookmarks Random Appearing Issue | https://github.com/zen-browser/desktop/issues/4129 | 6:25:12 | 28 days, 23:29:22 | +| Bookmarks FOUC Type Issue | https://github.com/zen-browser/desktop/issues/4128 | 6:28:48 | None | +| Shortcuts Issue When Second Window Is Used: | https://github.com/zen-browser/desktop/issues/4127 | 4 days, 0:15:45 | 4 days, 0:15:45 | +| Essentials & Pinned Disappear With Second Window | https://github.com/zen-browser/desktop/issues/4126 | 3:18:35 | None | +| Can't install themes with nightly | https://github.com/zen-browser/desktop/issues/4124 | 9 days, 23:09:45 | 9 days, 23:11:39 | +| pid changes on boot | https://github.com/zen-browser/desktop/issues/4122 | 0:50:20 | 0:50:20 | +| Download fails if you delete a random file while downloading | https://github.com/zen-browser/desktop/issues/4120 | 7:44:40 | 7:59:19 | +| Zen asks to be the default browser every time after recent update. | https://github.com/zen-browser/desktop/issues/4118 | 7:20:20 | 2 days, 14:22:58 | +| Popups partially hidden when on sidebar | https://github.com/zen-browser/desktop/issues/4117 | 12:56:59 | 12:56:59 | +| [Twilight] Not seeing search for emojis for workspaces like mentioned in release notes | https://github.com/zen-browser/desktop/issues/4114 | 8:04:36 | 8:04:35 | +| Themes installed from Firefox store don't do anything | https://github.com/zen-browser/desktop/issues/4113 | 5 days, 19:00:45 | None | +| Misplaced Footer on Websites | https://github.com/zen-browser/desktop/issues/4112 | 0:01:36 | 0:34:51 | +| A weird bar appears randomly stopping the user from switching tabs | https://github.com/zen-browser/desktop/issues/4111 | 0:07:57 | None | +| Sidebar tries to handle event when trying to dismiss toast message | https://github.com/zen-browser/desktop/issues/4110 | 4:08:06 | None | +| pages are not saving | https://github.com/zen-browser/desktop/issues/4109 | 14:28:07 | 14:28:07 | +| Issue with Toolbar Pinning/Unpinning Affecting Sidebar Width in Zen Browser | https://github.com/zen-browser/desktop/issues/4108 | 19 days, 11:38:38 | 19 days, 11:38:38 | +| Doesn't download video after "save video as" button | https://github.com/zen-browser/desktop/issues/4106 | 0:24:18 | 1 day, 8:44:52 | +| Random bar when moving mouse to the top | https://github.com/zen-browser/desktop/issues/4105 | 0:28:07 | 19 days, 14:14:16 | +| Overflow menu is permanently shown with only Customize Toolbar | https://github.com/zen-browser/desktop/issues/4104 | None | 0:02:52 | +| Opens a weird tab after closing all tabs | https://github.com/zen-browser/desktop/issues/4103 | 1 day, 0:01:43 | 1 day, 0:01:43 | +| Horizontal tab layout when supposed to be vertical | https://github.com/zen-browser/desktop/issues/4102 | None | 0:09:22 | +| Unable to click on back button due to overlapping of the tab sidebar under `Multiple Toolbars` layout | https://github.com/zen-browser/desktop/issues/4100 | 4:11:09 | None | +| Toolbar rendering issue while browser is in Foreground | https://github.com/zen-browser/desktop/issues/4099 | 1:56:07 | 1:56:07 | +| Video playback stops when toggling mono audio | https://github.com/zen-browser/desktop/issues/4098 | None | None | + +_This report was generated with the [Issue Metrics Action](https://github.com/github/issue-metrics)_ +Search query used to find these items: `repo:zen-browser/desktop is:issue created:2025-01-01..2025-01-31` diff --git a/firefox-cache/l10n-last-commit-hash b/firefox-cache/l10n-last-commit-hash index dd4812842..3fd61f125 100644 --- a/firefox-cache/l10n-last-commit-hash +++ b/firefox-cache/l10n-last-commit-hash @@ -1 +1 @@ -1e9d5c766342b027f104f5071ec8e343abb1088b +7d861618502fc97ac8da8a1a78ec09b226c55dd5 diff --git a/flatpak/app.zen_browser.zen.yml.template b/flatpak/app.zen_browser.zen.yml.template index 8c76a831c..a8f5adeac 100644 --- a/flatpak/app.zen_browser.zen.yml.template +++ b/flatpak/app.zen_browser.zen.yml.template @@ -44,14 +44,14 @@ modules: sources: - type: archive - url: https://github.com/zen-browser/desktop/releases/download/{version}/zen.linux-x86_64.tar.bz2 + url: https://github.com/zen-browser/desktop/releases/download/{version}/zen.linux-x86_64.tar.xz sha256: {linux_sha256} strip-components: 0 only-arches: - x86_64 - type: archive - url: https://github.com/zen-browser/desktop/releases/download/{version}/zen.linux-aarch64.tar.bz2 + url: https://github.com/zen-browser/desktop/releases/download/{version}/zen.linux-aarch64.tar.xz sha256: {linux_aarch64_sha256} strip-components: 0 only-arches: diff --git a/l10n b/l10n index cb32b48cb..19e2af33c 160000 --- a/l10n +++ b/l10n @@ -1 +1 @@ -Subproject commit cb32b48cb58a807012e082a41190108463d25683 +Subproject commit 19e2af33c4d901a4edece2b95c4372b40d50a942 diff --git a/l10n-last-commit-hash b/l10n-last-commit-hash deleted file mode 100644 index e69de29bb..000000000 diff --git a/package-lock.json b/package-lock.json index 5391ea4b9..060ae5c5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@zen-browser/surfer": "^1.9.14" + "@zen-browser/surfer": "^1.9.18" }, "devDependencies": { "husky": "^9.1.7", @@ -270,9 +270,10 @@ "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" }, "node_modules/@zen-browser/surfer": { - "version": "1.9.15", - "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.9.15.tgz", - "integrity": "sha512-mG/nTFduaXpYmGNYh5+d5ZzRX6XOkF6VEgia1nSZUoiPAXbwKblmwKro/b6uYAELTvpMCEneRl86CIU8HK++Tg==", + "version": "1.9.18", + "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.9.18.tgz", + "integrity": "sha512-lTMQ/RkIYI1fBjvd+UWHwcZqIk3H2X0wZniwFFpQOVg3wNEjljk3DVcuxwOEy08PrQYbxEX1vfQLyyjzlJWnEw==", + "license": "MPL-2.0", "dependencies": { "@resvg/resvg-js": "^1.4.0", "async-icns": "^1.0.2", @@ -2810,9 +2811,9 @@ "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" }, "@zen-browser/surfer": { - "version": "1.9.15", - "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.9.15.tgz", - "integrity": "sha512-mG/nTFduaXpYmGNYh5+d5ZzRX6XOkF6VEgia1nSZUoiPAXbwKblmwKro/b6uYAELTvpMCEneRl86CIU8HK++Tg==", + "version": "1.9.18", + "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.9.18.tgz", + "integrity": "sha512-lTMQ/RkIYI1fBjvd+UWHwcZqIk3H2X0wZniwFFpQOVg3wNEjljk3DVcuxwOEy08PrQYbxEX1vfQLyyjzlJWnEw==", "requires": { "@resvg/resvg-js": "^1.4.0", "async-icns": "^1.0.2", diff --git a/package.json b/package.json index 613cc3d61..0e72e8cda 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "pretty": "prettier . --write && autopep8 -r --in-place scripts/ src/", "lint": "npx prettier . --check && autopep8 --diff scripts/ src/", "prepare": "husky", - "reset-ff": "surfer reset" + "reset-ff": "surfer reset", + "surfer": "surfer" }, "repository": { "type": "git", @@ -40,7 +41,7 @@ }, "homepage": "https://github.com/zen-browser/core#readme", "dependencies": { - "@zen-browser/surfer": "^1.9.16" + "@zen-browser/surfer": "^1.9.18" }, "devDependencies": { "husky": "^9.1.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..a05c0dac3 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1916 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@zen-browser/surfer': + specifier: ^1.9.16 + version: 1.9.16(glob@7.2.3) + devDependencies: + husky: + specifier: ^9.1.7 + version: 9.1.7 + lint-staged: + specifier: ^15.3.0 + version: 15.3.0 + prettier: + specifier: ^3.4.2 + version: 3.4.2 + prettier-plugin-sh: + specifier: ^0.14.0 + version: 0.14.0(prettier@3.4.2) + +packages: + + '@oozcitak/dom@1.15.10': + resolution: {integrity: sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==} + engines: {node: '>=8.0'} + + '@oozcitak/infra@1.0.8': + resolution: {integrity: sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==} + engines: {node: '>=6.0'} + + '@oozcitak/url@1.0.4': + resolution: {integrity: sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==} + engines: {node: '>=8.0'} + + '@oozcitak/util@8.3.8': + resolution: {integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==} + engines: {node: '>=8.0'} + + '@resvg/resvg-js-android-arm-eabi@1.4.0': + resolution: {integrity: sha512-8C7P2dYNeL5mghCgJ+2IqNwv5V50d5pZQYIvGYlbP7d3OB/T8uVEcmuflYgWq+/vEn1gZE+Q2A0tFJOHqIvH9A==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@resvg/resvg-js-android-arm64@1.4.0': + resolution: {integrity: sha512-BQp3zo+/8Ns9u2NCh7YeII2KflsiXfJDrwahXk21PuDp0l1KcMjdQ2o4dTWTskF5Dba/rcuDa94T5GD9Pgap7g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@resvg/resvg-js-darwin-arm64@1.4.0': + resolution: {integrity: sha512-IuvUOIpdxk5fEqr8EXgdCfugRWS88HlXwSeHPDVNCh/9kQ7exRoVi5CDOipkngUPYKxbKTekJWTxQHRUtf8oNQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@resvg/resvg-js-darwin-x64@1.4.0': + resolution: {integrity: sha512-XFao3tkBBPHubVvXDX/ViYf2509tgqcfUc6bDtVYHCUOecK10ppbtdMRRnXjesi3towPQj2peiRUEavTIBbfGg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@resvg/resvg-js-linux-arm-gnueabihf@1.4.0': + resolution: {integrity: sha512-RAjGdBJKGO5tSE1PsTl2WpG/TkgJGqsHIFtaQAUWNG4/LQ+0MNAptBOGrvNZvmRu+hVIk1t8m9rKme2RMdmlLQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@resvg/resvg-js-linux-arm64-gnu@1.4.0': + resolution: {integrity: sha512-mT0UWGyzSaTu48sJGQno9zaZqk7j9ZjZppNu/TkLqObYu0xSeTnxnU73/Xy+byZh9RvLY/994bEaOP50jpDW/g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@resvg/resvg-js-linux-arm64-musl@1.4.0': + resolution: {integrity: sha512-wfl0dk9pNExJeFxRoAO0P0ywVkqW80FqsCH6KCtTbB1f2P2NY0paAKPho1LJ2z1YSzq3ngganyAKPl2PoBqn4g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@resvg/resvg-js-linux-x64-gnu@1.4.0': + resolution: {integrity: sha512-XDebImgHmQMIjxISZ4UsV9iHcO2IJnkKrT9/F5SWF3MgqRLro2pIY1JsgW70sEjkHlcyF7dbTa/M7TAgSz0uvg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@resvg/resvg-js-linux-x64-musl@1.4.0': + resolution: {integrity: sha512-cvq7pPQECLyP5SoI5ECZL0RhKcgz7sQTjYWQdZjFdF6riN40uWSo1Le31+oLLCwSoSOo8Z60xmU95ChbZjSY5Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@resvg/resvg-js-win32-arm64-msvc@1.4.0': + resolution: {integrity: sha512-4waye03doDRsQmtibxiTQ7alAmvT2D7gt5n3gmIMsAP8fF+szRQ+cD/ClPZdBIMonhAUbe3nLMduocOe2Jp59Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@resvg/resvg-js-win32-ia32-msvc@1.4.0': + resolution: {integrity: sha512-9Ld/Hv8nXslvodPv9wL3wec8Tf9kFAO4t9632Y66aAcGZBNW/xAwzbgDOSv32N763tsLphleu1DhJ7nXKZIz9A==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@resvg/resvg-js-win32-x64-msvc@1.4.0': + resolution: {integrity: sha512-sMGQdOIop6a/s+cmFodnQNNykvr/MavgBXCzVt9jp1Rq4PXWtn8uwSsUupsn3SHPJCZ83kee6m4JCnak6Rec9A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@resvg/resvg-js@1.4.0': + resolution: {integrity: sha512-AcsRqAPFMIOxlMZCHxSxTG5vZTbW95xFDrQDTmsX/VEwc3tgLL9E4Be2nIJjWrdvIQxsTlaWYJsn2pxkki9Ltg==} + engines: {node: '>= 10'} + + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + + '@zen-browser/surfer@1.9.16': + resolution: {integrity: sha512-6/Vcp1Ox9mt53hoBUuxFvpnRMnlvjFb3GBOcRhpqoYW/yi9mlV3G48icE717wGCoR2TThfuS6SYVfiT/G1kkrw==} + hasBin: true + + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + async-compat@1.6.8: + resolution: {integrity: sha512-MVKdync5q2FgE+x/AErx0mtJSZgQxWBGIx7vOcQbXmTh04OAF41N2zQX5XhAb0Mq/sMSFqzZSSFwzZ3rrROsSg==} + engines: {node: '>=0.8'} + + async-icns@1.0.2: + resolution: {integrity: sha512-d2P/f3aAWdOE3+tEqTW4HLj9Ob7/t54/NH2nRFK9Q7ZhJJXK7TlF1G3vgB6UP/ILHjI3Akjv+d8sFXyAZxCIFQ==} + hasBin: true + + axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@0.0.2: + resolution: {integrity: sha512-Pj9L87dCdGcKlSqPVUjD+q96pbIx1zQQLb2CUiWURfjiBELv84YX+0nGnKmyT/9KkC7PQk7UN1w+Al8bBozaxQ==} + engines: {node: '>= 0.4'} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bl@2.2.1: + resolution: {integrity: sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==} + + bl@3.0.1: + resolution: {integrity: sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bops@0.1.1: + resolution: {integrity: sha512-Cx1zStcMp+YoFan8OgudNPMih82eJZE+27feki1WeyoFTR9Ye7AR1SUW3saE6QQvdS/g52aJ2IojBjWOiRiLbw==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + + buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + + buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + + buffer-v6-polyfill@1.0.5: + resolution: {integrity: sha512-LdUw/JMZyKN+EBDbOHqynYtOLXDjgo+uf5vCUhfO5hVsU2chvbqyexizvxUMaU4ipYZy9MiQyIFwMeIgsb6nBA==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + call-once-fn@1.0.15: + resolution: {integrity: sha512-LPMeZc0iO4Ep9XCtvRk9ecOdQpJd1DKRWly1+95F+OinTRJri39ZUVItxJu0ru/KzBbbv0cmKFb0gzG4PJCinA==} + engines: {node: '>=0.8'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-progress@3.12.0: + resolution: {integrity: sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==} + engines: {node: '>=4'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + core-js-pure@3.40.0: + resolution: {integrity: sha512-AtDzVIgRrmRKQai62yuSIN5vNiQjcJakJb4fbhVw3ehxx7Lohphvw9SGNWKhLFqSxC4ilD0g/L1huAYFQU3Q6A==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + extract-base-iterator@1.2.22: + resolution: {integrity: sha512-gGMzo6ijt6oh9VSLOG3H+rpyzkoCYkVBgF/qdxVM/Wc/eKJyX2gxrBN8gO7IbnAMxre36wvzwzzD6umw80i3CQ==} + engines: {node: '>=0.8'} + + fast-extract@1.3.31: + resolution: {integrity: sha512-P3poghIIxD7mEIHymqaeevrrdWD23JLyagIfox+/jw6r0L8CtjHJsg/S/YZsHH6V2/IfK5tHoBsiyAqBIocSHw==} + engines: {node: '>=0.8'} + peerDependencies: + lzma-native: '*' + peerDependenciesMeta: + lzma-native: + optional: true + + fifo@2.4.1: + resolution: {integrity: sha512-XTbUCNmo54Jav0hcL6VxDuY4x1eCQH61HEF80C2Oww283pfjQ2C8avZeyq4v43sW2S2403kmzssE9j4lbF66Sg==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + flush-write-stream@2.0.0: + resolution: {integrity: sha512-uXClqPxT4xW0lcdSBheb2ObVU+kuqUk3Jk64EwieirEXZx9XUrVwp/JuBfKAWaM4T5Td/VL7QLDWPXp/MvGm/g==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globalyzer@0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hash-string@1.0.0: + resolution: {integrity: sha512-dtNNyxXobzHavayZwOwRWhBTqS9GX4jDjIMsGc0fDyaN2A+4zMn5Ua9ODDCggN6w3Spma6mAHL3ImmW3BkWDmQ==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@3.0.1: + resolution: {integrity: sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + + is-apple-silicon@https://codeload.github.com/trickypr/is-apple-silicon/tar.gz/5f75501a1d7566ba9f94174b6825d7bd9d302b6a: + resolution: {tarball: https://codeload.github.com/trickypr/is-apple-silicon/tar.gz/5f75501a1d7566ba9f94174b6825d7bd9d302b6a} + version: 1.0.1 + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-error@2.2.2: + resolution: {integrity: sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + lifecycle@1.0.4: + resolution: {integrity: sha512-FJx0SNrM2rouctdOH4rATsHT+BvgyXX4LEQ+Yn9COQNPK3u4XAPp9qS7OKpRO22MeT39oxkjZkRcLnHxSmiduw==} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lint-staged@15.3.0: + resolution: {integrity: sha512-vHFahytLoF2enJklgtOtCtIjZrKD/LoxlaUusd5nh7dWv/dkKQJY74ndFSzxCdv7g0ueGg1ORgTSt4Y9LPZn9A==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.2.5: + resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} + engines: {node: '>=18.0.0'} + + lodash.compact@3.0.1: + resolution: {integrity: sha512-2ozeiPi+5eBXW1CLtzjk8XQFhQOEMwwfxblqeq6EGyTxZJ1bPATqilY0e6g2SLQpP4KuMeuioBhEnWz5Pr7ICQ==} + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mock-require-lazy@1.0.14: + resolution: {integrity: sha512-PNuw/5/+IJLgOSJoXv4DYBu840i2NmhRFgUoB/To/hvL7J8YxjjrvNaAaPotq7Ndff344pDFSqDqGpstdhB8Tg==} + engines: {node: '>=0.8'} + + modern-async@1.1.5: + resolution: {integrity: sha512-Yioj6tw1jvZef+bYjcZN9gMPBpVkkqGOMbQg/1U9dIqdij44mpftvNJxTf/u2Gc6oobuNGUFWNJwJwq8qEs9bw==} + + mount-dmg@1.0.1: + resolution: {integrity: sha512-YEHSgtE1d6jIm6ht0uqo4MWQSXHvHYujgURXf+59hQDErH5bL5rv4uGwko8ejiFIeK6ySk8jBX1oX9NrlmBTCg==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mvdan-sh@0.10.1: + resolution: {integrity: sha512-kMbrH0EObaKmK3nVRKUIIya1dpASHIEusM13S4V1ViHFuxuNxCo+arxoa6j/dbV22YBGjl7UKJm9QQKJ2Crzhg==} + + nanoassert@2.0.0: + resolution: {integrity: sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==} + + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + node-abi@3.73.0: + resolution: {integrity: sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg==} + engines: {node: '>=10'} + + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + on-one@0.1.4: + resolution: {integrity: sha512-fWyHjSVZvs7Dkt7F/fZCm4Eoxv7+uQkaiUYh3jDVN15khYa5iTnFWW9VM8rQgStAca5cDxHzyAT7cF+gfyLgcg==} + engines: {node: '>=0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + os-shim@0.1.3: + resolution: {integrity: sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==} + engines: {node: '>= 0.4.0'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + png-to-ico@2.1.8: + resolution: {integrity: sha512-Nf+IIn/cZ/DIZVdGveJp86NG5uNib1ZXMiDd/8x32HCTeKSvgpyg6D/6tUBn1QO/zybzoMK0/mc3QRgAyXdv9w==} + engines: {node: '>=8'} + hasBin: true + + pngjs@6.0.0: + resolution: {integrity: sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==} + engines: {node: '>=12.13.0'} + + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + + prettier-plugin-sh@0.14.0: + resolution: {integrity: sha512-hfXulj5+zEl/ulrO5kMuuTPKmXvOg0bnLHY1hKFNN/N+/903iZbNp8NyZBTsgI8dtkSgFfAEIQq0IQTyP1ZVFQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + prettier: ^3.0.3 + + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + engines: {node: '>=14'} + hasBin: true + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + progress-stream@2.0.0: + resolution: {integrity: sha512-xJwOWR46jcXUq6EH9yYyqp+I52skPySOeHfkxOZ2IY1AiBi/sFJhbhAKHoV3OTw/omQ45KTio9215dRJ2Yxd3Q==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + pumpify@2.0.1: + resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} + + queue-cb@1.4.16: + resolution: {integrity: sha512-7g8cAIeoENe4kYgLAjTF7j7nX71pLlGdIAViR8U8pmHD3UA116+LjMRyucE6c6qUYBlv4ppaYXCTZjlo/IN27w==} + engines: {node: '>=0.8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + require_optional@1.0.1: + resolution: {integrity: sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==} + + resolve-from@2.0.0: + resolution: {integrity: sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==} + engines: {node: '>=0.10.0'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf2@2.8.2: + resolution: {integrity: sha512-Bz7P3Zu6lEpek5LduIqg5A2mRu8kCllR+rGYofqq9bRRiHC9m+Py/EiINPt9iu/XOqQ//Q++XSka7EwL3K3Chw==} + hasBin: true + peerDependencies: + glob: '*' + peerDependenciesMeta: + glob: + optional: true + + rustic@1.2.2: + resolution: {integrity: sha512-aagYrcImcYj3QbaP7nirOw8/q8aULMu0LkKucP9B4WsRbXlXpk195nYAEB+uJzAcgk2pKS+yMzbAJtIoOqwZoQ==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + sh-syntax@0.4.2: + resolution: {integrity: sha512-/l2UZ5fhGZLVZa16XQM9/Vq/hezGGbdHeVEA01uWjOL1+7Ek/gt6FquW0iKKws4a9AYPYvlz6RyVvjh3JxOteg==} + engines: {node: '>=16.0.0'} + + sharp@0.30.7: + resolution: {integrity: sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==} + engines: {node: '>=12.13.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-escape@0.2.0: + resolution: {integrity: sha512-uRRBT2MfEOyxuECseCZd28jC1AJ8hmqqneWQ4VWUTgCAFvb3wKU1jLqj6egC4Exrr88ogg3dp+zroH4wJuaXzw==} + + short-hash@1.0.0: + resolution: {integrity: sha512-qbUCD2Pkl4IXRyVqneEjGnUr0NGDGLzZnBUVGJngIQZf/FrhOL0yJhH+JQzak0t8xMmScIKpoX1SxOsPHdwa4w==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + speedometer@1.0.0: + resolution: {integrity: sha512-lgxErLl/7A5+vgIIXsh9MbeukOaCb2axgQ+bKCdIE+ibNT4XNYGNCR1qFEGq6F+YDASXK3Fh/c5FgtZchFolxw==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-base-iterator@1.1.20: + resolution: {integrity: sha512-dlhhk0qesNjtXQCvJsayyvrUIh4gz6HkGC3g00RmXUgpbpYV7SJm97/Ac2HNUfO2mtq68DEGvt+msCf7Uk55Hg==} + engines: {node: '>=0.8'} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + tar-fs@2.1.2: + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} + + tar-iterator@1.2.25: + resolution: {integrity: sha512-PyjH/Rils3eQ2ThsBG4O8zQLx/nPkoS/Iqvob4wEtpOJoO5DcqQKeI88aGWC3ktG6ms1Lgf1qrYtCo59W4WeRg==} + engines: {node: '>=0.8'} + + tar-stream-compat@2.1.5: + resolution: {integrity: sha512-hhIcRHj6S+y7IDR+VO8IcOjPUsAJ+50POvGK1fDFqbOTLTs/J7YA07TUgvpSkYkYuRUfYsuAFM/0SrvrdIZMdQ==} + engines: {node: '>=0.8'} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + temp-suffix@0.1.14: + resolution: {integrity: sha512-OqUZmSYtyGgteGxgjh8mkV69Zr1GXSYMj/+VUol698zxnopimbAlmIx5cQIIg1F9XDyA01htZfxLqC1FQZ7hbw==} + engines: {node: '>=0.8'} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-glob@0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-utf8@0.0.1: + resolution: {integrity: sha512-zks18/TWT1iHO3v0vFp5qLKOG27m67ycq/Y7a7cTiRuUNlc4gf3HGnkRgMv0NyhnfTamtkYBJl+YeD1/j07gBQ==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + + unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xmlbuilder2@3.1.1: + resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} + engines: {node: '>=12.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + engines: {node: '>= 14'} + hasBin: true + + zip-iterator@1.2.23: + resolution: {integrity: sha512-gS+3YsU/vIHXxaViw67Dm1DMyN7U5iVU/NFB0rWYKyN7MYlOH61icBZm8RWesDtknsUaT9saEChwj+ueZKS8Dg==} + engines: {node: '>=0.8'} + + zip@1.2.0: + resolution: {integrity: sha512-8B4Z9BXJKkI8BkHhKvQan4rwCzUENnj95YHFYrI7F1NbqKCIdW86kujctzEB+kJ6XapHPiAhiZ9xi5GbW5SPdw==} + +snapshots: + + '@oozcitak/dom@1.15.10': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/url': 1.0.4 + '@oozcitak/util': 8.3.8 + + '@oozcitak/infra@1.0.8': + dependencies: + '@oozcitak/util': 8.3.8 + + '@oozcitak/url@1.0.4': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + + '@oozcitak/util@8.3.8': {} + + '@resvg/resvg-js-android-arm-eabi@1.4.0': + optional: true + + '@resvg/resvg-js-android-arm64@1.4.0': + optional: true + + '@resvg/resvg-js-darwin-arm64@1.4.0': + optional: true + + '@resvg/resvg-js-darwin-x64@1.4.0': + optional: true + + '@resvg/resvg-js-linux-arm-gnueabihf@1.4.0': + optional: true + + '@resvg/resvg-js-linux-arm64-gnu@1.4.0': + optional: true + + '@resvg/resvg-js-linux-arm64-musl@1.4.0': + optional: true + + '@resvg/resvg-js-linux-x64-gnu@1.4.0': + optional: true + + '@resvg/resvg-js-linux-x64-musl@1.4.0': + optional: true + + '@resvg/resvg-js-win32-arm64-msvc@1.4.0': + optional: true + + '@resvg/resvg-js-win32-ia32-msvc@1.4.0': + optional: true + + '@resvg/resvg-js-win32-x64-msvc@1.4.0': + optional: true + + '@resvg/resvg-js@1.4.0': + optionalDependencies: + '@resvg/resvg-js-android-arm-eabi': 1.4.0 + '@resvg/resvg-js-android-arm64': 1.4.0 + '@resvg/resvg-js-darwin-arm64': 1.4.0 + '@resvg/resvg-js-darwin-x64': 1.4.0 + '@resvg/resvg-js-linux-arm-gnueabihf': 1.4.0 + '@resvg/resvg-js-linux-arm64-gnu': 1.4.0 + '@resvg/resvg-js-linux-arm64-musl': 1.4.0 + '@resvg/resvg-js-linux-x64-gnu': 1.4.0 + '@resvg/resvg-js-linux-x64-musl': 1.4.0 + '@resvg/resvg-js-win32-arm64-msvc': 1.4.0 + '@resvg/resvg-js-win32-ia32-msvc': 1.4.0 + '@resvg/resvg-js-win32-x64-msvc': 1.4.0 + + '@types/node@17.0.45': {} + + '@zen-browser/surfer@1.9.16(glob@7.2.3)': + dependencies: + '@resvg/resvg-js': 1.4.0 + async-icns: 1.0.2 + axios: 0.21.4 + chalk: 4.1.2 + cli-progress: 3.12.0 + commander: 6.2.1 + execa: 5.1.1 + fast-extract: 1.3.31(glob@7.2.3) + fs-extra: 10.1.0 + ini: 3.0.1 + is-apple-silicon: https://codeload.github.com/trickypr/is-apple-silicon/tar.gz/5f75501a1d7566ba9f94174b6825d7bd9d302b6a + kleur: 4.1.5 + modern-async: 1.1.5 + mount-dmg: 1.0.1 + picomatch: 2.3.1 + png-to-ico: 2.1.8 + prompts: 2.4.2 + rustic: 1.2.2 + semver: 7.6.3 + sharp: 0.30.7 + tiny-glob: 0.2.9 + xmlbuilder2: 3.1.1 + transitivePeerDependencies: + - debug + - glob + - lzma-native + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + asap@2.0.6: {} + + async-compat@1.6.8: + dependencies: + is-error: 2.2.2 + is-promise: 4.0.0 + + async-icns@1.0.2: + dependencies: + commander: 9.5.0 + + axios@0.21.4: + dependencies: + follow-redirects: 1.15.9 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: + optional: true + + base64-js@0.0.2: {} + + base64-js@1.5.1: {} + + bl@2.2.1: + dependencies: + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + bl@3.0.1: + dependencies: + readable-stream: 3.6.2 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bops@0.1.1: + dependencies: + base64-js: 0.0.2 + to-utf8: 0.0.1 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + optional: true + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + buffer-alloc-unsafe@1.1.0: {} + + buffer-alloc@1.2.0: + dependencies: + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 + + buffer-fill@1.0.0: {} + + buffer-v6-polyfill@1.0.5: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + call-once-fn@1.0.15: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + chownr@1.1.4: {} + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-progress@3.12.0: + dependencies: + string-width: 4.2.3 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + colorette@2.0.20: {} + + commander@12.1.0: {} + + commander@6.2.1: {} + + commander@9.5.0: {} + + concat-map@0.0.1: + optional: true + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + core-js-pure@3.40.0: {} + + core-util-is@1.0.3: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-extend@0.6.0: {} + + detect-libc@2.0.3: {} + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + environment@1.1.0: {} + + esprima@4.0.1: {} + + eventemitter3@5.0.1: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + expand-template@2.0.3: {} + + extract-base-iterator@1.2.22(glob@7.2.3): + dependencies: + graceful-fs: 4.2.11 + is-absolute: 1.0.0 + lodash.compact: 3.0.1 + mkdirp-classic: 0.5.3 + object-assign: 4.1.1 + queue-cb: 1.4.16 + rimraf2: 2.8.2(glob@7.2.3) + stack-base-iterator: 1.1.20 + transitivePeerDependencies: + - glob + + fast-extract@1.3.31(glob@7.2.3): + dependencies: + bl: 3.0.1 + buffer-v6-polyfill: 1.0.5 + call-once-fn: 1.0.15 + content-disposition: 0.5.4 + flush-write-stream: 2.0.0 + lodash.throttle: 4.1.1 + mkdirp-classic: 0.5.3 + mock-require-lazy: 1.0.14 + next-tick: 1.1.0 + on-one: 0.1.4 + progress-stream: 2.0.0 + pumpify: 2.0.1 + queue-cb: 1.4.16 + readable-stream: 2.3.8 + require_optional: 1.0.1 + rimraf2: 2.8.2(glob@7.2.3) + signal-exit: 3.0.7 + tar-iterator: 1.2.25(glob@7.2.3) + temp-suffix: 0.1.14 + unbzip2-stream: 1.4.3 + zip-iterator: 1.2.23(glob@7.2.3) + transitivePeerDependencies: + - glob + + fifo@2.4.1: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + flush-write-stream@2.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + follow-redirects@1.15.9: {} + + fs-constants@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs.realpath@1.0.0: + optional: true + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.3.0: {} + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + github-from-package@0.0.0: {} + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + optional: true + + globalyzer@0.1.0: {} + + globrex@0.1.2: {} + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + hash-string@1.0.0: {} + + human-signals@2.1.0: {} + + human-signals@5.0.0: {} + + husky@9.1.7: {} + + ieee754@1.2.1: {} + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + optional: true + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@3.0.1: {} + + is-absolute@1.0.0: + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + + is-apple-silicon@https://codeload.github.com/trickypr/is-apple-silicon/tar.gz/5f75501a1d7566ba9f94174b6825d7bd9d302b6a: {} + + is-arrayish@0.3.2: {} + + is-error@2.2.2: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.3.0 + + is-number@7.0.0: {} + + is-promise@4.0.0: {} + + is-relative@1.0.0: + dependencies: + is-unc-path: 1.0.0 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-unc-path@1.0.0: + dependencies: + unc-path-regex: 0.1.2 + + is-windows@1.0.2: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + lifecycle@1.0.4: {} + + lilconfig@3.1.3: {} + + lint-staged@15.3.0: + dependencies: + chalk: 5.4.1 + commander: 12.1.0 + debug: 4.4.0 + execa: 8.0.1 + lilconfig: 3.1.3 + listr2: 8.2.5 + micromatch: 4.0.8 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.6.1 + transitivePeerDependencies: + - supports-color + + listr2@8.2.5: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + lodash.compact@3.0.1: {} + + lodash.throttle@4.1.1: {} + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + merge-stream@2.0.0: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + + mimic-response@3.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + optional: true + + minimist@1.2.8: {} + + mkdirp-classic@0.5.3: {} + + mock-require-lazy@1.0.14: + dependencies: + get-caller-file: 2.0.5 + normalize-path: 3.0.0 + + modern-async@1.1.5: + dependencies: + core-js-pure: 3.40.0 + nanoassert: 2.0.0 + + mount-dmg@1.0.1: + dependencies: + shell-escape: 0.2.0 + + ms@2.1.3: {} + + mvdan-sh@0.10.1: {} + + nanoassert@2.0.0: {} + + napi-build-utils@2.0.0: {} + + next-tick@1.1.0: {} + + node-abi@3.73.0: + dependencies: + semver: 7.6.3 + + node-addon-api@5.1.0: {} + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + object-assign@4.1.1: {} + + on-one@0.1.4: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + os-shim@0.1.3: {} + + path-is-absolute@1.0.1: + optional: true + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + picomatch@2.3.1: {} + + pidtree@0.6.0: {} + + png-to-ico@2.1.8: + dependencies: + '@types/node': 17.0.45 + minimist: 1.2.8 + pngjs: 6.0.0 + + pngjs@6.0.0: {} + + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.73.0 + pump: 3.0.2 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.2 + tunnel-agent: 0.6.0 + + prettier-plugin-sh@0.14.0(prettier@3.4.2): + dependencies: + mvdan-sh: 0.10.1 + prettier: 3.4.2 + sh-syntax: 0.4.2 + + prettier@3.4.2: {} + + process-nextick-args@2.0.1: {} + + progress-stream@2.0.0: + dependencies: + speedometer: 1.0.0 + through2: 2.0.5 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pumpify@2.0.1: + dependencies: + duplexify: 4.1.3 + inherits: 2.0.4 + pump: 3.0.2 + + queue-cb@1.4.16: {} + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + require_optional@1.0.1: + dependencies: + resolve-from: 2.0.0 + semver: 5.7.2 + + resolve-from@2.0.0: {} + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + rfdc@1.4.1: {} + + rimraf2@2.8.2(glob@7.2.3): + optionalDependencies: + glob: 7.2.3 + + rustic@1.2.2: {} + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + semver@5.7.2: {} + + semver@7.6.3: {} + + sh-syntax@0.4.2: + dependencies: + tslib: 2.8.1 + + sharp@0.30.7: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + node-addon-api: 5.1.0 + prebuild-install: 7.1.3 + semver: 7.6.3 + simple-get: 4.0.1 + tar-fs: 2.1.2 + tunnel-agent: 0.6.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-escape@0.2.0: {} + + short-hash@1.0.0: + dependencies: + hash-string: 1.0.0 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + sisteransi@1.0.5: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + speedometer@1.0.0: {} + + sprintf-js@1.0.3: {} + + stack-base-iterator@1.1.20: + dependencies: + asap: 2.0.6 + async-compat: 1.6.8 + call-once-fn: 1.0.15 + fifo: 2.4.1 + + stream-shift@1.0.3: {} + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-json-comments@2.0.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + tar-fs@2.1.2: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + + tar-iterator@1.2.25(glob@7.2.3): + dependencies: + call-once-fn: 1.0.15 + extract-base-iterator: 1.2.22(glob@7.2.3) + lifecycle: 1.0.4 + lodash.compact: 3.0.1 + mkdirp-classic: 0.5.3 + on-one: 0.1.4 + rimraf2: 2.8.2(glob@7.2.3) + tar-stream-compat: 2.1.5 + transitivePeerDependencies: + - glob + + tar-stream-compat@2.1.5: + dependencies: + bl: 2.2.1 + buffer-alloc: 1.2.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 2.3.8 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + temp-suffix@0.1.14: + dependencies: + imurmurhash: 0.1.4 + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + through@2.3.8: {} + + tiny-glob@0.2.9: + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + to-utf8@0.0.1: {} + + tslib@2.8.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 + + unc-path-regex@0.1.2: {} + + universalify@2.0.1: {} + + util-deprecate@1.0.2: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + xmlbuilder2@3.1.1: + dependencies: + '@oozcitak/dom': 1.15.10 + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + js-yaml: 3.14.1 + + xtend@4.0.2: {} + + yaml@2.6.1: {} + + zip-iterator@1.2.23(glob@7.2.3): + dependencies: + buffer-v6-polyfill: 1.0.5 + call-once-fn: 1.0.15 + extract-base-iterator: 1.2.22(glob@7.2.3) + lifecycle: 1.0.4 + lodash.compact: 3.0.1 + mkdirp-classic: 0.5.3 + on-one: 0.1.4 + os-shim: 0.1.3 + queue-cb: 1.4.16 + readable-stream: 2.3.8 + rimraf2: 2.8.2(glob@7.2.3) + short-hash: 1.0.0 + temp-suffix: 0.1.14 + zip: 1.2.0 + transitivePeerDependencies: + - glob + + zip@1.2.0: + dependencies: + bops: 0.1.1 diff --git a/scripts/download-language-packs.sh b/scripts/download-language-packs.sh index 11f472592..4363c6f21 100644 --- a/scripts/download-language-packs.sh +++ b/scripts/download-language-packs.sh @@ -10,6 +10,7 @@ cd $CURRENT_DIR LAST_FIREFOX_L10N_COMMIT=$(cat ./firefox-cache/l10n-last-commit-hash) cd ./l10n +rm -rf firefox-l10n # clone only from LAST_FIREFOX_L10N_COMMIT git clone https://github.com/mozilla-l10n/firefox-l10n cd firefox-l10n diff --git a/scripts/update_ff.py b/scripts/update_ff.py index cc1b0a89d..df61856d5 100644 --- a/scripts/update_ff.py +++ b/scripts/update_ff.py @@ -18,8 +18,8 @@ def update_rc(last_version: str): with open("surfer.json", "w") as f: data["version"]["candidate"] = rc_version json.dump(data, f, indent=2) - print("Download the new engine by running 'pnpm download'.") - os.system("pnpm download") + print("Download the new engine by running 'npm run download'.") + os.system("npm run download") else: print("No new Firefox RC version available.") @@ -28,7 +28,7 @@ def update_ff(is_rc: bool = False, last_version: str = ""): """Runs the npm command to update the 'ff' component.""" if is_rc: return update_rc(last_version) - result = os.system("pnpm update-ff:raw") + result = os.system("npm run update-ff:raw") if result != 0: raise RuntimeError("Failed to update 'ff' component.") @@ -63,8 +63,7 @@ def update_l10n_last_commit_hash(): os.system(f"git clone {L10N_REPO} l10n-temp") if not os.path.exists("firefox-cache"): os.mkdir("firefox-cache") - with open("l10n-last-commit-hash", "w") as f: - os.system("cat l10n-temp/.git/refs/heads/main > firefox-cache/l10n-last-commit-hash") + os.system("cat l10n-temp/.git/refs/heads/main > firefox-cache/l10n-last-commit-hash") except KeyboardInterrupt: print("Exiting...") shutil.rmtree("l10n-temp") diff --git a/src/browser/app/profile/zen-browser.js b/src/browser/app/profile/zen-browser.js index 0fe55448f..fb124d615 100644 --- a/src/browser/app/profile/zen-browser.js +++ b/src/browser/app/profile/zen-browser.js @@ -8,9 +8,7 @@ #endif #endif -pref("browser.tabs.cardPreview.enabled", true); -pref("browser.tabs.hoverPreview.enabled", true); -pref("browser.tabs.cardPreview.delayMs", 100); +pref("browser.tabs.hoverPreview.enabled", false); #ifdef MOZ_UPDATE_CHANNEL pref("devtools.debugger.prompt-connection", true); @@ -82,11 +80,12 @@ pref('zen.welcome-screen.seen', false); pref('zen.tabs.vertical', true); pref('zen.tabs.vertical.right-side', false); +pref('zen.tabs.rename-tabs', true); pref('zen.theme.accent-color', "#ffb787"); pref('zen.theme.content-element-separation', 6); // In pixels pref('zen.theme.pill-button', false); pref('zen.theme.gradient', true); -pref('zen.theme.essentials-favicon-bg', false); +pref('zen.theme.essentials-favicon-bg', true); pref('zen.tabs.show-newtab-vertical', true); pref('zen.view.show-newtab-button-border-top', false); @@ -102,18 +101,12 @@ pref('zen.injections.match-urls', 'http://localhost/*', locked); pref('zen.rice.share.notice.accepted', false); #ifdef XP_MACOSX -pref('zen.theme.border-radius', 12); // In pixels -#else -#ifdef XP_WIN -pref('zen.theme.border-radius', 12); // In pixels +pref('zen.theme.border-radius', 10); // In pixels #else pref('zen.theme.border-radius', 8); // In pixels #endif -#endif pref('zen.theme.color-prefs.use-workspace-colors', true); -pref('zen.theme.color-prefs.amoled', false); -pref('zen.theme.color-prefs.colorful', false); pref('zen.view.compact.hide-tabbar', true); pref('zen.view.compact.hide-toolbar', false); @@ -124,7 +117,9 @@ pref('zen.view.compact.color-toolbar', true); pref('zen.view.compact.color-sidebar', true); pref('zen.view.compact.animate-sidebar', true); +pref('zen.urlbar.replace-newtab', true); pref('zen.urlbar.behavior', 'floating-on-type'); // default, floating-on-type, float +pref('zen.urlbar.wait-to-clear', 45000); // in ms (default 45s) #ifdef XP_MACOSX // Disable for macos in the meantime until @HarryHeres finds a solution for hight DPI screens @@ -133,6 +128,10 @@ pref('zen.view.experimental-rounded-view', false); pref('zen.view.experimental-rounded-view', true); #endif +#ifdef XP_WIN +pref('zen.widget.windows.acrylic', true); +#endif + // Glance pref('zen.glance.enabled', true); pref('zen.glance.hold-duration', 300); // in ms @@ -144,6 +143,7 @@ pref('zen.view.sidebar-expanded.max-width', 500); #ifdef XP_MACOSX pref('zen.view.mac.show-three-dot-menu', false); +pref('zen.widget.mac.mono-window-controls', true); #endif pref('zen.view.show-bottom-border', false); pref('zen.view.use-single-toolbar', true); @@ -161,7 +161,6 @@ pref('zen.view.hide-window-controls', true); pref('zen.view.experimental-no-window-controls', false); pref('zen.tabs.dim-pending', true); -pref('zen.tabs.newtab-on-middle-click', true); pref('zen.keyboard.shortcuts.enabled', true); pref('zen.keyboard.shortcuts.version', 0); // Empty string means default shortcuts @@ -175,10 +174,10 @@ pref('zen.tab-unloader.excluded-urls', "example.com,example.org"); pref('zen.pinned-tab-manager.debug', false); pref('zen.pinned-tab-manager.restore-pinned-tabs-to-pinned-url', false); -pref('zen.pinned-tab-manager.close-shortcut-behavior', 'switch'); +pref('zen.pinned-tab-manager.close-shortcut-behavior', 'unload-switch'); -// Pref to enable the new profiles (TODO: Check this out!) -//pref("browser.profiles.enabled", true); +// TODO: Check this out! +pref("browser.profiles.enabled", false); // Zen webpanels (calling it sidebar due to legacy reasons) pref('zen.sidebar.data', "{\"data\":\n {\"p1\":{\n \"url\":\"https://www.wikipedia.org/\"\n },\n\"p2\":{\n \"url\":\"https://m.twitter.com/\",\n\"ua\": true\n },\n\"p3\": {\n \"url\": \"https://www.youtube.com/\",\n\"ua\": true\n},\n\"p4\": {\n \"url\": \"https://translate.google.com/\",\n\"ua\": true\n},\n\"p5\": {\n \"url\": \"https://todoist.com/\",\n\"ua\": true\n}},\n\"index\":[\"p1\",\"p2\",\"p3\",\"p4\",\"p5\"]}"); @@ -187,7 +186,6 @@ pref('zen.sidebar.close-on-blur', true); pref('zen.sidebar.max-webpanels', 8); // Zen Split View -pref('zen.splitView.working', false); pref('zen.splitView.min-resize-width', 7); pref('zen.splitView.change-on-hover', false); pref('zen.splitView.rearrange-hover-size', 24); @@ -385,6 +383,7 @@ 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.urlbar.keepPanelOpenDuringImeComposition", true); // IMPORTANT: Fixes closing the urlbar when on some languages pref("browser.formfill.enable", false); pref("security.insecure_connection_text.enabled", true); pref("security.insecure_connection_text.pbmode.enabled", true); @@ -432,7 +431,7 @@ pref("browser.aboutwelcome.enabled", false); // ---- Experimental settings to try make zen faster pref("gfx.canvas.accelerated.cache-items", 32768); -pref("gfx.canvas.accelerated.cache-size", 4096); +pref("gfx.canvas.accelerated.cache-size", 256); pref("gfx.content.skia-font-cache-size", 80); pref("media.memory_cache_max_size", 1048576); diff --git a/src/browser/base/content/ZenCustomizableUI.sys.mjs b/src/browser/base/content/ZenCustomizableUI.sys.mjs index fcd92ea1d..a3622a5ee 100644 --- a/src/browser/base/content/ZenCustomizableUI.sys.mjs +++ b/src/browser/base/content/ZenCustomizableUI.sys.mjs @@ -4,7 +4,7 @@ export var ZenCustomizableUI = new (class { constructor() {} TYPE_TOOLBAR = 'toolbar'; - defaultSidebarIcons = ['zen-profile-button', 'zen-workspaces-button', 'downloads-button']; + defaultSidebarIcons = ['preferences-button', 'zen-workspaces-button', 'downloads-button']; startup(CustomizableUIInternal) { CustomizableUIInternal.registerArea( diff --git a/src/browser/base/content/ZenStartup.mjs b/src/browser/base/content/ZenStartup.mjs index 67847f5f4..88e4fad4b 100644 --- a/src/browser/base/content/ZenStartup.mjs +++ b/src/browser/base/content/ZenStartup.mjs @@ -3,11 +3,9 @@ var ZenStartup = { init() { this.openWatermark(); - window.SessionStore.promiseInitialized.then(() => { - this._changeSidebarLocation(); - this._zenInitBrowserLayout(); - this._initSearchBar(); - }); + this._changeSidebarLocation(); + this._zenInitBrowserLayout(); + this._initSearchBar(); }, _zenInitBrowserLayout() { @@ -85,8 +83,7 @@ _initSidebarScrolling() { // Disable smooth scroll const canSmoothScroll = Services.prefs.getBoolPref('zen.startup.smooth-scroll-in-tabs', false); - const workspaceIndicator = document.getElementById('zen-current-workspace-indicator'); - const tabsWrapper = document.getElementById('zen-browser-tabs-wrapper'); + const tabsWrapper = document.getElementById('zen-tabs-wrapper'); gBrowser.tabContainer.addEventListener('wheel', (event) => { if (canSmoothScroll) return; event.preventDefault(); // Prevent the smooth scroll behavior @@ -95,13 +92,14 @@ // Detect overflow and underflow const observer = new ResizeObserver((_) => { const tabContainer = gBrowser.tabContainer; - const isVertical = tabContainer.getAttribute('orient') === 'vertical'; - let contentSize = tabsWrapper.getBoundingClientRect()[isVertical ? 'height' : 'width']; + // const isVertical = tabContainer.getAttribute('orient') === 'vertical'; + // let contentSize = tabsWrapper.getBoundingClientRect()[isVertical ? 'height' : 'width']; // NOTE: This should be contentSize > scrollClientSize, but due // to how Gecko internally rounds in those cases, we allow for some // minor differences (the internal Gecko layout size is 1/60th of a // pixel, so 0.02 should cover it). - let overflowing = contentSize - tabContainer.arrowScrollbox.scrollClientSize > 0.02; + //let overflowing = contentSize - tabContainer.arrowScrollbox.scrollClientSize > 0.02; + let overflowing = true; // cheatign the system, because we want to always show make the element overflowing window.requestAnimationFrame(() => { tabContainer.arrowScrollbox.toggleAttribute('overflowing', overflowing); diff --git a/src/browser/base/content/ZenUIManager.mjs b/src/browser/base/content/ZenUIManager.mjs index 59757a8f6..82de90f62 100644 --- a/src/browser/base/content/ZenUIManager.mjs +++ b/src/browser/base/content/ZenUIManager.mjs @@ -1,20 +1,26 @@ var gZenUIManager = { _popupTrackingElements: [], _hoverPausedForExpand: false, + _hasLoadedDOM: false, init() { document.addEventListener('popupshowing', this.onPopupShowing.bind(this)); document.addEventListener('popuphidden', this.onPopupHidden.bind(this)); XPCOMUtils.defineLazyPreferenceGetter(this, 'sidebarHeightThrottle', 'zen.view.sidebar-height-throttle', 500); XPCOMUtils.defineLazyPreferenceGetter(this, 'contentElementSeparation', 'zen.theme.content-element-separation', 0); + XPCOMUtils.defineLazyPreferenceGetter(this, 'urlbarWaitToClear', 'zen.urlbar.wait-to-clear', 0); + + gURLBar._zenTrimURL = this.urlbarTrim.bind(this); ChromeUtils.defineLazyGetter(this, 'motion', () => { return ChromeUtils.importESModule('chrome://browser/content/zen-vendor/motion.min.mjs', { global: 'current' }); }); - new ResizeObserver(gZenCommonActions.throttle(this.updateTabsToolbar.bind(this), this.sidebarHeightThrottle)).observe( - document.getElementById('TabsToolbar') - ); + ChromeUtils.defineLazyGetter(this, '_toastContainer', () => { + return document.getElementById('zen-toast-container'); + }); + + new ResizeObserver(this.updateTabsToolbar.bind(this)).observe(document.getElementById('TabsToolbar')); new ResizeObserver( gZenCommonActions.throttle( @@ -23,12 +29,18 @@ var gZenUIManager = { ) ).observe(document.getElementById('navigator-toolbox')); - window.addEventListener('TabClose', this.updateTabsToolbar.bind(this)); + SessionStore.promiseAllWindowsRestored.then(() => { + this._hasLoadedDOM = true; + this.updateTabsToolbar(); + }); + + window.addEventListener('TabClose', this.onTabClose.bind(this)); + this.tabsWrapper.addEventListener('scroll', this.saveScrollbarState.bind(this)); }, updateTabsToolbar() { // Set tabs max-height to the "toolbar-items" height - const tabs = document.getElementById('zen-browser-tabs-wrapper'); + const tabs = this.tabsWrapper; // Remove tabs so we can accurately calculate the height // without them affecting the height of the toolbar for (const tab of gBrowser.tabs) { @@ -51,6 +63,27 @@ var gZenUIManager = { tabs.style.maxHeight = height + 'px'; }, + get tabsWrapper() { + if (this._tabsWrapper) { + return this._tabsWrapper; + } + this._tabsWrapper = document.getElementById('zen-tabs-wrapper'); + return this._tabsWrapper; + }, + + saveScrollbarState() { + this._scrollbarState = this.tabsWrapper.scrollTop; + }, + + restoreScrollbarState() { + this.tabsWrapper.scrollTop = this._scrollbarState; + }, + + onTabClose(event) { + this.updateTabsToolbar(); + this.restoreScrollbarState(); + }, + openAndChangeToTab(url, options) { if (window.ownerGlobal.parent) { const tab = window.ownerGlobal.parent.gBrowser.addTrustedTab(url, options); @@ -63,9 +96,7 @@ var gZenUIManager = { }, generateUuidv4() { - return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, (c) => - (+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))).toString(16) - ); + return Services.uuid.generateUUID().toString(); }, toogleBookmarksSidebar() { @@ -121,6 +152,111 @@ var gZenUIManager = { this.__currentPopup = null; this.__currentPopupTrackElement = null; }, + + // Section: URL bar + + get newtabButtons() { + return document.querySelectorAll('#tabs-newtab-button'); + }, + + _prevUrlbarLabel: null, + _lastSearch: '', + _clearTimeout: null, + _lastTab: null, + + handleNewTab(werePassedURL, searchClipboard, where) { + const shouldOpenURLBar = + Services.prefs.getBoolPref('zen.urlbar.replace-newtab') && !werePassedURL && !searchClipboard && where === 'tab'; + if (shouldOpenURLBar) { + if (this._clearTimeout) { + clearTimeout(this._clearTimeout); + } + this._lastTab = gBrowser.selectedTab; + this._lastTab._visuallySelected = false; + this._prevUrlbarLabel = gURLBar._untrimmedValue; + gURLBar._zenHandleUrlbarClose = this.handleUrlbarClose.bind(this); + gURLBar.setAttribute('zen-newtab', true); + for (const button of this.newtabButtons) { + button.setAttribute('in-urlbar', true); + } + document.getElementById('Browser:OpenLocation').doCommand(); + gURLBar.search(this._lastSearch); + return true; + } + return false; + }, + + clearUrlbarData() { + this._prevUrlbarLabel = null; + this._lastSearch = ''; + }, + + handleUrlbarClose(onSwitch) { + gURLBar._zenHandleUrlbarClose = null; + gURLBar.removeAttribute('zen-newtab'); + this._lastTab._visuallySelected = true; + this._lastTab = null; + for (const button of this.newtabButtons) { + button.removeAttribute('in-urlbar'); + } + if (onSwitch) { + this.clearUrlbarData(); + } else { + this._lastSearch = gURLBar._untrimmedValue; + this._clearTimeout = setTimeout(() => { + this.clearUrlbarData(); + }, this.urlbarWaitToClear); + } + gURLBar.setURI(this._prevUrlbarLabel, onSwitch, false, false, !onSwitch); + gURLBar.handleRevert(); + if (gURLBar.focused) { + gURLBar.view.close({ elementPicked: onSwitch }); + gURLBar.updateTextOverflow(); + if (gBrowser.selectedTab.linkedBrowser && onSwitch) { + gURLBar.getBrowserState(gBrowser.selectedTab.linkedBrowser).urlbarFocused = false; + } + } + }, + + urlbarTrim(aURL) { + if (gZenVerticalTabsManager._hasSetSingleToolbar) { + let url = BrowserUIUtils.removeSingleTrailingSlashFromURL(aURL); + return url.startsWith('http://') || url.startsWith('https://') ? url.split('/')[2] : url; + } + return BrowserUIUtils.trimURL(aURL); + }, + + // Section: Notification messages + _createToastElement(messageId, options) { + const element = document.createXULElement('vbox'); + const label = document.createXULElement('label'); + document.l10n.setAttributes(label, messageId, options); + element.appendChild(label); + if (options.descriptionId) { + const description = document.createXULElement('label'); + description.classList.add('description'); + document.l10n.setAttributes(description, options.descriptionId, options); + element.appendChild(description); + } + element.classList.add('zen-toast'); + return element; + }, + + async showToast(messageId, options = {}) { + const toast = this._createToastElement(messageId, options); + this._toastContainer.removeAttribute('hidden'); + this._toastContainer.appendChild(toast); + await this.motion.animate(toast, { opacity: [0, 1], scale: [0.8, 1] }, { type: 'spring', bounce: 0.4 }); + await new Promise((resolve) => setTimeout(resolve, 3000)); + await this.motion.animate(toast, { opacity: [1, 0], scale: [1, 0.9] }, { duration: 0.2, bounce: 0 }); + const toastHeight = toast.getBoundingClientRect().height; + // 5 for the separation between toasts + await this.motion.animate(toast, { marginBottom: [0, `-${toastHeight + 5}px`] }, { duration: 0.2 }); + toast.remove(); + if (!this._toastContainer.hasChildNodes()) { + this._toastContainer.setAttribute('hidden', 'true'); + } + }, }; var gZenVerticalTabsManager = { @@ -155,27 +291,14 @@ var gZenVerticalTabsManager = { 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); + this._updateEvent(); if (!this.isWindowsStyledButtons) { document.documentElement.setAttribute('zen-window-buttons-reversed', true); } - if (tabs) { - tabs.addEventListener('mouseup', this.openNewTabOnTabsMiddleClick.bind(this)); - } - }, - - openNewTabOnTabsMiddleClick(event) { - if (event.button === 1 && event.target.id === 'tabbrowser-tabs' && this.canOpenTabOnMiddleClick) { - document.getElementById('cmd_newNavigatorTabNoEvent').doCommand(); - event.stopPropagation(); - event.preventDefault(); - } + this._renameTabHalt = this.renameTabHalt.bind(this); + gBrowser.tabContainer.addEventListener('dblclick', this.renameTabStart.bind(this)); }, toggleExpand() { @@ -213,7 +336,7 @@ var gZenVerticalTabsManager = { }, animateTab(aTab) { - if (!gZenUIManager.motion) { + if (!gZenUIManager.motion || !aTab || !gZenUIManager._hasLoadedDOM) { return; } // get next visible tab @@ -243,7 +366,7 @@ var gZenVerticalTabsManager = { aTab.style.removeProperty('opacity'); }); gZenUIManager.motion - .animate(aTab.querySelector('.tab-stack'), { + .animate(aTab.querySelector('.tab-content'), { filter: ['blur(1px)', 'blur(0px)'], }) .then(() => { @@ -342,6 +465,11 @@ var gZenVerticalTabsManager = { gBrowser.tabContainer.setAttribute('orient', isVerticalTabs ? 'vertical' : 'horizontal'); gBrowser.tabContainer.arrowScrollbox.setAttribute('orient', isVerticalTabs ? 'vertical' : 'horizontal'); + // on purpose, we set the orient to horizontal, because the arrowScrollbox is vertical + gBrowser.tabContainer.arrowScrollbox.scrollbox.setAttribute( + 'orient', + isVerticalTabs && ZenWorkspaces.workspaceEnabled ? 'horizontal' : 'vertical' + ); const buttonsTarget = document.getElementById('zen-sidebar-top-buttons-customization-target'); if (isRightSide) { @@ -495,6 +623,7 @@ var gZenVerticalTabsManager = { } catch (e) { console.error(e); } + gZenUIManager.updateTabsToolbar(); this._isUpdating = false; }, @@ -535,4 +664,85 @@ var gZenVerticalTabsManager = { } target.appendChild(child); }, + + renameTabKeydown(event) { + if (event.key === 'Enter') { + let label = this._tabEdited.querySelector('.tab-label-container-editing'); + let input = this._tabEdited.querySelector('#tab-label-input'); + let newName = input.value.trim(); + + // Check if name is blank, reset if so + // Always remove, so we can always rename and if it's empty, + // it will reset to the original name anyway + this._tabEdited.removeAttribute('zen-has-static-label'); + if (newName) { + gBrowser._setTabLabel(this._tabEdited, newName); + this._tabEdited.setAttribute('zen-has-static-label', 'true'); + } else { + gBrowser.setTabTitle(this._tabEdited); + } + + // Maybe add some confetti here?!? + gZenUIManager.motion.animate( + this._tabEdited, + { + scale: [1, 0.98, 1], + }, + { + duration: 0.25, + } + ); + + this._tabEdited.querySelector('.tab-editor-container').remove(); + label.classList.remove('tab-label-container-editing'); + + this._tabEdited = null; + } else if (event.key === 'Escape') { + event.target.blur(); + } + }, + + renameTabStart(event) { + if ( + this._tabEdited || + !Services.prefs.getBoolPref('zen.tabs.rename-tabs') || + Services.prefs.getBoolPref('browser.tabs.closeTabByDblclick') || + !gZenVerticalTabsManager._prefsSidebarExpanded + ) + return; + this._tabEdited = event.target.closest('.tabbrowser-tab'); + if (!this._tabEdited || !this._tabEdited.pinned || this._tabEdited.hasAttribute('zen-essential')) { + this._tabEdited = null; + return; + } + const label = this._tabEdited.querySelector('.tab-label-container'); + label.classList.add('tab-label-container-editing'); + + const container = window.MozXULElement.parseXULToFragment(` + + `); + label.after(container); + const containerHtml = this._tabEdited.querySelector('.tab-editor-container'); + const input = document.createElement('input'); + input.id = 'tab-label-input'; + input.value = this._tabEdited.label; + input.addEventListener('keydown', this.renameTabKeydown.bind(this)); + + containerHtml.appendChild(input); + input.focus(); + input.select(); + + input.addEventListener('blur', this._renameTabHalt); + }, + + renameTabHalt(event) { + if (document.activeElement === event.target || !this._tabEdited) { + return; + } + this._tabEdited.querySelector('.tab-editor-container').remove(); + const label = this._tabEdited.querySelector('.tab-label-container-editing'); + label.classList.remove('tab-label-container-editing'); + + this._tabEdited = null; + }, }; diff --git a/src/browser/base/content/browser-commands-js.patch b/src/browser/base/content/browser-commands-js.patch index 293d011e5..e39ef0bb4 100644 --- a/src/browser/base/content/browser-commands-js.patch +++ b/src/browser/base/content/browser-commands-js.patch @@ -1,8 +1,19 @@ diff --git a/browser/base/content/browser-commands.js b/browser/base/content/browser-commands.js -index 352de44dda36e3f6672eb353f42978ede0cd2681..d6956a318c34bfb12b0ba957edab1166e1a4edaf 100644 +index 352de44dda36e3f6672eb353f42978ede0cd2681..66d1616da17df3430cec0994a346f0f446944f1a 100644 --- a/browser/base/content/browser-commands.js +++ b/browser/base/content/browser-commands.js -@@ -407,8 +407,8 @@ var BrowserCommands = { +@@ -318,6 +318,10 @@ var BrowserCommands = { + } + } + ++ if (gZenUIManager.handleNewTab(werePassedURL, searchClipboard, where)) { ++ return; ++ } ++ + // A notification intended to be useful for modular peformance tracking + // starting as close as is reasonably possible to the time when the user + // expressed the intent to open a new tab. Since there are a lot of +@@ -407,8 +411,8 @@ var BrowserCommands = { (event.ctrlKey || event.metaKey || event.altKey) && gBrowser.selectedTab.pinned ) { diff --git a/src/browser/base/content/browser-init-js.patch b/src/browser/base/content/browser-init-js.patch index 3d3d188ed..0cbd4ecba 100644 --- a/src/browser/base/content/browser-init-js.patch +++ b/src/browser/base/content/browser-init-js.patch @@ -1,11 +1,11 @@ diff --git a/browser/base/content/browser-init.js b/browser/base/content/browser-init.js -index 9df41bb3c82919839ee1408aa4d177ea7ee40a56..e37c64fa2c2ea39762be4285a1a7055463ded537 100644 +index 63100defacf66c6b3232b9e0a783a5fd14e3a46a..22b79b021ff0baab4dac602447a124308208c828 100644 --- a/browser/base/content/browser-init.js +++ b/browser/base/content/browser-init.js -@@ -152,13 +152,15 @@ var gBrowserInit = { - elem.setAttribute("skipintoolbarset", "true"); - } - } +@@ -162,13 +162,15 @@ var gBrowserInit = { + elem.setAttribute("skipintoolbarset", "true"); + } + } + ZenCustomizableUI.init(window); for (let area of CustomizableUI.areas) { let type = CustomizableUI.getAreaType(area); @@ -16,10 +16,10 @@ index 9df41bb3c82919839ee1408aa4d177ea7ee40a56..e37c64fa2c2ea39762be4285a1a70554 } } + ZenCustomizableUI.registerToolbarNodes(window); - if (isVerticalTabs) { - // Show the vertical tabs toolbar - setToolbarVisibility( -@@ -253,6 +255,10 @@ var gBrowserInit = { + if (isVerticalTabs) { + // Show the vertical tabs toolbar + setToolbarVisibility( +@@ -287,6 +289,10 @@ var gBrowserInit = { gPrivateBrowsingUI.init(); BrowserSearch.init(); BrowserPageActions.init(); diff --git a/src/browser/base/content/browser-js.patch b/src/browser/base/content/browser-js.patch index 7ead783f1..db2f39965 100644 --- a/src/browser/base/content/browser-js.patch +++ b/src/browser/base/content/browser-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js -index 9a65dcc7ad41ab961907c95338e023b173d4f474..9477e0c115ed3c4a670f1ac63846b6de01bf8b8c 100644 +index 019b168c1aeae7e1c97a3ae58c99a48a27f54134..1f051e8a1e8a58e8bb721196deecfa36f4089dd6 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -32,6 +32,7 @@ ChromeUtils.defineESModuleGetters(this, { @@ -10,7 +10,7 @@ index 9a65dcc7ad41ab961907c95338e023b173d4f474..9477e0c115ed3c4a670f1ac63846b6de DevToolsSocketStatus: "resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs", DownloadUtils: "resource://gre/modules/DownloadUtils.sys.mjs", -@@ -630,6 +631,15 @@ XPCOMUtils.defineLazyPreferenceGetter( +@@ -632,6 +633,15 @@ XPCOMUtils.defineLazyPreferenceGetter( false ); @@ -26,19 +26,18 @@ index 9a65dcc7ad41ab961907c95338e023b173d4f474..9477e0c115ed3c4a670f1ac63846b6de customElements.setElementCreationCallback("screenshots-buttons", () => { Services.scriptloader.loadSubScript( "chrome://browser/content/screenshots/screenshots-buttons.js", -@@ -3440,6 +3450,11 @@ var XULBrowserWindow = { +@@ -3440,6 +3450,10 @@ var XULBrowserWindow = { AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser); TranslationsParent.onLocationChange(gBrowser.selectedBrowser); + gZenViewSplitter.onLocationChange(gBrowser.selectedBrowser); + ZenWorkspaces.onLocationChange(gBrowser.selectedBrowser); + gZenTabUnloader.onLocationChange(gBrowser.selectedBrowser); -+ gZenGlanceManager.onLocationChange(gBrowser.selectedBrowser); + PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser); if (!gMultiProcessBrowser) { -@@ -4435,7 +4450,7 @@ nsBrowserAccess.prototype = { +@@ -4435,7 +4449,7 @@ nsBrowserAccess.prototype = { // Passing a null-URI to only create the content window, // and pass true for aSkipLoad to prevent loading of // about:blank @@ -47,7 +46,7 @@ index 9a65dcc7ad41ab961907c95338e023b173d4f474..9477e0c115ed3c4a670f1ac63846b6de null, aParams, aWhere, -@@ -4443,6 +4458,10 @@ nsBrowserAccess.prototype = { +@@ -4443,6 +4457,10 @@ nsBrowserAccess.prototype = { aName, true ); @@ -58,7 +57,7 @@ index 9a65dcc7ad41ab961907c95338e023b173d4f474..9477e0c115ed3c4a670f1ac63846b6de }, openURIInFrame: function browser_openURIInFrame( -@@ -7281,6 +7300,12 @@ var gDialogBox = { +@@ -7285,6 +7303,12 @@ var gDialogBox = { parentElement.showModal(); this._didOpenHTMLDialog = true; diff --git a/src/browser/base/content/browser-sets-js.patch b/src/browser/base/content/browser-sets-js.patch index be4f74496..78d0fb929 100644 --- a/src/browser/base/content/browser-sets-js.patch +++ b/src/browser/base/content/browser-sets-js.patch @@ -1,13 +1,13 @@ diff --git a/browser/base/content/browser-sets.js b/browser/base/content/browser-sets.js -index 3031278749317d153624c6ccfbcc9d47aaf4089f..e67a8c3b56c01334627350c494b0139638ebf19a 100644 +index 61aef2d420a78fb1910f556b71f6db75a16180ed..a3a1e70bedb760c165c338c28de6f2ee924df8de 100644 --- a/browser/base/content/browser-sets.js +++ b/browser/base/content/browser-sets.js -@@ -245,7 +245,7 @@ document.addEventListener( +@@ -250,7 +250,7 @@ document.addEventListener( } }); - document.getElementById("mainKeyset").addEventListener("command", event => { + document.getElementById("zenKeyset").addEventListener("command", event => { - switch (event.target.id) { - case "goHome": - BrowserCommands.home(); + const SIDEBAR_REVAMP_PREF = "sidebar.revamp"; + const SIDEBAR_REVAMP_ENABLED = Services.prefs.getBoolPref( + SIDEBAR_REVAMP_PREF, diff --git a/src/browser/base/content/browser-xhtml.patch b/src/browser/base/content/browser-xhtml.patch index de5a5be77..248781b38 100644 --- a/src/browser/base/content/browser-xhtml.patch +++ b/src/browser/base/content/browser-xhtml.patch @@ -1,17 +1,17 @@ diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml -index ca8953f3604f4f70de76576964af5f3c733f17a0..a2731ef6d4392301217cd05f6583e4814f1118e2 100644 +index 891c067d6ad718061c410c04743bed25744504b5..b7ded9691225068b23e4d6a5113242d0c0f5f842 100644 --- a/browser/base/content/browser.xhtml +++ b/browser/base/content/browser.xhtml -@@ -101,6 +101,8 @@ +@@ -99,6 +99,8 @@ - + +#include zen-preloaded.inc.xhtml + # All JS files which are needed by browser.xhtml and other top level windows to # support MacOS specific features *must* go into the global-scripts.inc file so # that they can be shared with macWindow.inc.xhtml. -@@ -145,6 +147,7 @@ +@@ -143,6 +145,7 @@ window.addEventListener("DOMContentLoaded", gBrowserInit.onDOMContentLoaded.bind(gBrowserInit), { once: true }); @@ -19,7 +19,7 @@ index ca8953f3604f4f70de76576964af5f3c733f17a0..a2731ef6d4392301217cd05f6583e481 # All sets except for popupsets (commands, keys, and stringbundles) -@@ -166,9 +169,12 @@ +@@ -164,9 +167,13 @@ @@ -27,6 +27,7 @@ index ca8953f3604f4f70de76576964af5f3c733f17a0..a2731ef6d4392301217cd05f6583e481 - -#include browser-box.inc.xhtml + ++ + #include navigator-toolbox.inc.xhtml + + diff --git a/src/browser/base/content/main-popupset-inc-xhtml.patch b/src/browser/base/content/main-popupset-inc-xhtml.patch index b1423139c..1ebbd1437 100644 --- a/src/browser/base/content/main-popupset-inc-xhtml.patch +++ b/src/browser/base/content/main-popupset-inc-xhtml.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/main-popupset.inc.xhtml b/browser/base/content/main-popupset.inc.xhtml -index 1fb595272a184f9a40f56f87d86232e3324f7750..8dd0f0ff856be524a5fa27fb8c6180c1fe058134 100644 +index e5f3424eaeeec0ba552537f167dd99e912216d94..4bdfcdb23fe9c44ad3d4de273c64f4cc31cb4034 100644 --- a/browser/base/content/main-popupset.inc.xhtml +++ b/browser/base/content/main-popupset.inc.xhtml -@@ -144,6 +144,10 @@ +@@ -181,6 +181,10 @@ hidden="true" tabspecific="true" aria-labelledby="editBookmarkPanelTitle"> @@ -13,17 +13,17 @@ index 1fb595272a184f9a40f56f87d86232e3324f7750..8dd0f0ff856be524a5fa27fb8c6180c1 -@@ -169,6 +173,7 @@ +@@ -206,6 +210,7 @@ class="footer-button"/> -+ ++ -@@ -454,6 +459,8 @@ +@@ -535,6 +540,8 @@ - #include popup-notifications.inc + #include popup-notifications.inc.xhtml +#include zen-popupset.inc.xhtml + diff --git a/src/browser/base/content/navigator-toolbox-inc-xhtml.patch b/src/browser/base/content/navigator-toolbox-inc-xhtml.patch index 00ad568d9..0f75a3ff5 100644 --- a/src/browser/base/content/navigator-toolbox-inc-xhtml.patch +++ b/src/browser/base/content/navigator-toolbox-inc-xhtml.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml -index 00391af141d9015fe5839534e5e6b22a91ba65d9..b68767d0fef6cea2756376bbcfe00603d5d1a655 100644 +index a0a382643a2f74b6d789f3641ef300eed202d5e9..7a2be5fe6cdecb771ce3326008085ae402a465de 100644 --- a/browser/base/content/navigator-toolbox.inc.xhtml +++ b/browser/base/content/navigator-toolbox.inc.xhtml @@ -2,7 +2,7 @@ @@ -40,20 +40,18 @@ index 00391af141d9015fe5839534e5e6b22a91ba65d9..b68767d0fef6cea2756376bbcfe00603 + -+ -+ -+ -+ -+ ++ ++ ++ + @@ -86,7 +85,7 @@ index 00391af141d9015fe5839534e5e6b22a91ba65d9..b68767d0fef6cea2756376bbcfe00603 diff --git a/src/browser/base/content/navigator-toolbox-js.patch b/src/browser/base/content/navigator-toolbox-js.patch index e9c0f33c7..721a1e01b 100644 --- a/src/browser/base/content/navigator-toolbox-js.patch +++ b/src/browser/base/content/navigator-toolbox-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/navigator-toolbox.js b/browser/base/content/navigator-toolbox.js -index 64ded8fb2c08f1dbfec8fe08ab427a24b53f1169..69009d53d7242c26f777ac2e0bb1897ff27ad916 100644 +index 64ded8fb2c08f1dbfec8fe08ab427a24b53f1169..9e1e888554279b6e1df3bc1cb907afd2ccb330ca 100644 --- a/browser/base/content/navigator-toolbox.js +++ b/browser/base/content/navigator-toolbox.js @@ -8,7 +8,7 @@ @@ -11,3 +11,19 @@ index 64ded8fb2c08f1dbfec8fe08ab427a24b53f1169..69009d53d7242c26f777ac2e0bb1897f const widgetOverflow = document.getElementById("widget-overflow"); function onPopupShowing(event) { +@@ -187,6 +187,7 @@ document.addEventListener( + #reload-button , + #urlbar-go-button, + #reader-mode-button, ++ #zen-tabs-wrapper, + #picture-in-picture-button, + #shopping-sidebar-button, + #urlbar-zoom-button, +@@ -208,6 +209,7 @@ document.addEventListener( + case "vertical-tabs-newtab-button": + case "tabs-newtab-button": + case "new-tab-button": ++ case "zen-tabs-wrapper": + gBrowser.handleNewTabMiddleClick(element, event); + break; + diff --git a/src/browser/base/content/zen-assets.jar.inc.mn b/src/browser/base/content/zen-assets.jar.inc.mn index 69b4c1c56..563908e14 100644 --- a/src/browser/base/content/zen-assets.jar.inc.mn +++ b/src/browser/base/content/zen-assets.jar.inc.mn @@ -4,6 +4,7 @@ content/browser/ZenStartup.mjs (content/ZenStartup.mjs) content/browser/ZenUIManager.mjs (content/ZenUIManager.mjs) content/browser/ZenCustomizableUI.sys.mjs (content/ZenCustomizableUI.sys.mjs) + content/browser/zen-components/ZenUIMigration.mjs (zen-components/ZenUIMigration.mjs) content/browser/zen-components/ZenCompactMode.mjs (zen-components/ZenCompactMode.mjs) content/browser/zen-components/ZenViewSplitter.mjs (zen-components/ZenViewSplitter.mjs) content/browser/zen-components/ZenThemesCommon.mjs (zen-components/ZenThemesCommon.mjs) diff --git a/src/browser/base/content/zen-glance.inc.xhtml b/src/browser/base/content/zen-glance.inc.xhtml index 61c7bf385..64d5a0703 100644 --- a/src/browser/base/content/zen-glance.inc.xhtml +++ b/src/browser/base/content/zen-glance.inc.xhtml @@ -1,4 +1,4 @@ - - + \ No newline at end of file + diff --git a/src/browser/base/content/zen-styles/zen-animations.css b/src/browser/base/content/zen-styles/zen-animations.css index 01c231662..067582958 100644 --- a/src/browser/base/content/zen-styles/zen-animations.css +++ b/src/browser/base/content/zen-styles/zen-animations.css @@ -227,76 +227,6 @@ } } -@keyframes zen-glance-content-animation-out { - 0% { - /* make the box shrink to final width/height and x/y coordinates */ - transform: translate(-50%, -50%) translateZ(0); - width: 85%; - height: 100%; - top: 50%; - left: 50%; - opacity: 1; - } - - 100% { - /* make the box appear from initial width/height and x/y coordinates */ - transform: translate(-50%, -50%) translateZ(0); - opacity: 0; - width: 47%; - height: 53%; - top: 50%; - left: 50%; - opacity: 0; - } -} - -@keyframes zen-glance-buttons-animation-full { - from { - width: 85%; - height: 85%; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - } - - to { - width: 100%; - height: 100%; - top: 50%; - left: 50%; - opacity: 1; - transform: translate(-50%, -50%); - } -} - -@keyframes zen-glance-loading-animation { - 0% { - opacity: 1; - width: 80%; - } - - 90% { - width: 100%; - } - - 100% { - opacity: 0; - } -} - -@keyframes zen-glance-buttons-animation { - from { - right: 0; - opacity: 0; - width: fit-content; - } - - to { - opacity: 1; - transform: translateX(-100%) translateY(-50%); - } -} - @keyframes zen-rice-form-out { 0% { transform: translateX(0); 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 8627090b0..e6cb6cd3f 100644 --- a/src/browser/base/content/zen-styles/zen-browser-container.css +++ b/src/browser/base/content/zen-styles/zen-browser-container.css @@ -9,11 +9,6 @@ border-radius: var(--zen-native-inner-radius); position: relative; - /* For glance */ - transition: - transform 0.1s ease-in-out, - opacity 0.1s ease-in-out; - overflow: hidden; :root:not([zen-no-padding='true']) & { 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 13738aed2..853af4fbb 100644 --- a/src/browser/base/content/zen-styles/zen-browser-ui.css +++ b/src/browser/base/content/zen-styles/zen-browser-ui.css @@ -22,13 +22,13 @@ :root:is([inDOMFullscreen='true'], [chromehidden~='location'], [chromehidden~='toolbar']) { #navigator-toolbox, #zen-sidebar-splitter { - display: none; + visibility: collapse; } } #browser { width: 100%; - background: var(--zen-main-browser-background); + background: var(--zen-main-browser-background) !important; will-change: background-color; @@ -51,7 +51,7 @@ &[animating='true']::after { background: var(--zen-main-browser-background-old); backdrop-filter: blur(5px); - animation: zen-main-app-wrapper-animation 0.5s ease forwards; + animation: zen-main-app-wrapper-animation 0.2s ease forwards; transition: 0s; } } @@ -152,12 +152,33 @@ gap: var(--zen-element-separation); } -.titlebar-buttonbox-container { - height: 100%; +@media not (-moz-platform: macos) { + .titlebar-buttonbox-container { + height: 100%; + } } @media (-moz-platform: macos) { .titlebar-buttonbox-container { margin-inline-end: 8px; + padding: 3px 0; + + & > .titlebar-buttonbox { + margin-inline-start: var(--zen-toolbox-padding); + } + } + + @media (-moz-bool-pref: 'zen.widget.mac.mono-window-controls') { + .titlebar-buttonbox-container { + /* Draw 3 dots as background to represent the window controls, + all with the same cololr as the titlebar */ + background-image: radial-gradient(circle, var(--zen-toolbar-element-bg) 6px, transparent 0.5px); + background-size: 20px 22px; + background-position: 53% 50%; + + &:not([zen-has-hover='true']) > .titlebar-buttonbox { + opacity: 0; + } + } } } 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 fa3d4517d..0c95505d9 100644 --- a/src/browser/base/content/zen-styles/zen-compact-mode.css +++ b/src/browser/base/content/zen-styles/zen-compact-mode.css @@ -42,13 +42,13 @@ position: absolute; z-index: 10; transition: - left 0.25s ease, - right 0.25s ease, + left 0.15s ease, + right 0.15s ease, opacity 1.5s ease; top: 0; bottom: var(--zen-element-separation); - opacity: 0; padding: 0 var(--zen-compact-float) !important; + opacity: 0; :root[zen-single-toolbar='true'] & { top: var(--zen-element-separation); @@ -59,13 +59,13 @@ margin-left: 0 !important; } - & #urlbar[open] { + & #urlbar[open]:not([zen-floating-urlbar='true']) { top: 0 !important; } } &:not([zen-right-side='true']) #navigator-toolbox { - left: calc(-1 * var(--zen-sidebar-width) + var(--zen-element-separation)); + left: calc(-1 * var(--zen-sidebar-width) + 1px); } /* When we have multiple toolbars and the top-toolbar is NOT being hidden, @@ -82,7 +82,7 @@ --zen-compact-float: calc(var(--zen-element-separation) + 1px); &:not([animate='true']) { - right: calc(-1 * var(--zen-sidebar-width) + var(--zen-element-separation)); + right: calc(-1 * var(--zen-sidebar-width) + 1px); } } @@ -111,6 +111,15 @@ background-size: 2000px !important; /* Dont ask me why */ backdrop-filter: blur(5px) !important; } + + & #urlbar[open][zen-floating-urlbar='true'] { + --zen-urlbar-offset: var(--zen-sidebar-width); + transition: left 0.05s ease; + + #navigator-toolbox:has(&) { + opacity: 1; + } + } } #navigator-toolbox:hover, @@ -121,9 +130,9 @@ #navigator-toolbox[movingtab], #navigator-toolbox:has(.tabbrowser-tab:active), #navigator-toolbox:has( - *:is([panelopen='true'], [open='true'], #nav-bar:focus-within):not(tab):not(.zen-compact-mode-ignore) + *:is([panelopen='true'], [open='true'], #urlbar:not([zen-floating-urlbar='true']):focus-within):not(tab):not(.zen-compact-mode-ignore) ) { - &:not([animate='true']) { + &:not([animate='true']):not(:has(#urlbar[zen-floating-urlbar='true']:hover)) { --zen-compact-mode-func: linear( 0 0%, 0.002748 1%, @@ -232,10 +241,16 @@ right 0.3s var(--zen-compact-mode-func); opacity: 1; - left: -1px; - :root[zen-right-side='true'] & { - right: -1px; - left: auto; + &:not([supress-primary-adjustment='true']) { + left: -1px; + :root[zen-right-side='true'] & { + right: -1px; + left: auto; + } + + & #urlbar[open][zen-floating-urlbar='true'] { + --zen-urlbar-offset: 0px; + } } } } diff --git a/src/browser/base/content/zen-styles/zen-glance.css b/src/browser/base/content/zen-styles/zen-glance.css index d920af515..4ea37f5db 100644 --- a/src/browser/base/content/zen-styles/zen-glance.css +++ b/src/browser/base/content/zen-styles/zen-glance.css @@ -9,42 +9,49 @@ visibility: inherit; } -.zen-glance-background { - transform: scale(0.98); - backdrop-filter: blur(5px); - opacity: 0.6; -} - #zen-glance-sidebar-container { - display: none; + position: absolute; + display: flex; + z-index: 999; - & toolbarbutton:hover { - background: var(--button-background-color-hover); + &[hidden='true'] { + display: none; + } + + top: 10%; + transform: translateY(-50%); + + padding: 5px; + gap: 12px; + left: 2%; + + & toolbarbutton { + width: 32px; + height: 32px; + background: light-dark(rgb(24, 24, 24), rgb(231, 231, 231)); + transition: background 0.2s ease; + border-radius: 999px; + appearance: none; + box-shadow: 0 0 12px 1px rgba(0, 0, 0, 0.07); + opacity: 0; + + &:hover { + background: light-dark(rgb(41, 41, 41), rgb(204, 204, 204)); + } + + & label { + display: none; + } + + & image { + filter: invert(1); + } } } .browserSidebarContainer.zen-glance-overlay { box-shadow: none !important; - &[fade-out='true'] { - background: transparent; - opacity: 1; - - & .browserContainer { - opacity: 1; - animation: zen-glance-content-animation-out 0.3s ease-in-out forwards !important; - - & browser { - opacity: 1 !important; - } - - & #zen-glance-sidebar-container { - opacity: 0; - transition: opacity 0.1s ease-in-out; - } - } - } - & .browserContainer { background: var(--zen-dialog-background); position: fixed; @@ -69,37 +76,6 @@ overflow: hidden; } - & #zen-glance-sidebar-container { - position: absolute; - display: flex; - top: 10%; - left: 0; - transform: translateY(-50%); - opacity: 0; - background: var(--zen-dialog-background); - - border: 1px solid var(--zen-colors-border); - border-right: none; - - border-top-left-radius: var(--zen-native-inner-radius); - border-bottom-left-radius: var(--zen-native-inner-radius); - - padding: 5px; - gap: 6px; - - animation: zen-glance-buttons-animation 0.2s ease-in-out forwards; - animation-delay: 0.3s; - - & toolbarbutton { - width: 32px; - height: 32px; - - & label { - display: none; - } - } - } - & browser { width: 100%; height: 100%; @@ -108,9 +84,7 @@ } &[animate-full='true'] { - opacity: 1; - animation: zen-glance-buttons-animation-full 0.2s ease-in-out forwards !important; - + transform: translate(-50%, -50%); & #zen-glance-sidebar-container { opacity: 0 !important; } @@ -118,22 +92,18 @@ &[animate='true'] { position: absolute; - transform: translate(-50%, -50%); - - &:not([animate-end='true']) { - pointer-events: none; - - & browser { - opacity: 0; - visibility: hidden; - } - - & #zen-glance-sidebar-container { - opacity: 0; - animation: none; - pointer-events: none; - } - } } } + + &[fade-out='true'] { + & browser { + transition: opacity 0.1s ease; + opacity: 0; + } + } + + & browser[animate-glance-open='true'] { + transition: opacity 0.2s ease-in-out; + opacity: 0; + } } diff --git a/src/browser/base/content/zen-styles/zen-popup.css b/src/browser/base/content/zen-styles/zen-popup.css index adc2fb884..e6f773936 100644 --- a/src/browser/base/content/zen-styles/zen-popup.css +++ b/src/browser/base/content/zen-styles/zen-popup.css @@ -349,3 +349,30 @@ menuitem { #editBMPanel_workspaceList input[type='checkbox'] { margin-right: 8px; } + +/* Section: Toast notifications */ + +#zen-toast-container { + position: fixed; + top: calc(var(--zen-element-separation) * 2); + right: calc(var(--zen-element-separation) * 2); + z-index: 1000; + gap: 1rem; + + & .zen-toast { + padding: 0.9rem 0.8rem; + border-radius: 12px; + background-color: var(--button-primary-bgcolor); + color: var(--button-primary-color); + box-shadow: var(--zen-big-shadow); + display: flex; + gap: 5px; + flex-direction: column; + gap: 2px; + width: fit-content; + + & .description { + opacity: 0.6; + } + } +} diff --git a/src/browser/base/content/zen-styles/zen-sidebar.css b/src/browser/base/content/zen-styles/zen-sidebar.css index 1cb4b970d..01b170d82 100644 --- a/src/browser/base/content/zen-styles/zen-sidebar.css +++ b/src/browser/base/content/zen-styles/zen-sidebar.css @@ -42,14 +42,13 @@ #zen-tabbox-wrapper { & #sidebar-splitter { opacity: 0; - margin-inline-end: -4px; + margin: 0 calc(-1 * var(--zen-element-separation)); } & #sidebar-box { border-radius: var(--zen-native-inner-radius); box-shadow: var(--zen-big-shadow); overflow: hidden; - border: 1px solid var(--zen-colors-border); :root:not([zen-right-side='true']) &[positionend='true'] { margin-right: var(--zen-element-separation); diff --git a/src/browser/base/content/zen-styles/zen-tabs/horizontal-tabs.css b/src/browser/base/content/zen-styles/zen-tabs/horizontal-tabs.css index e96e2fc8a..d1b2cb365 100644 --- a/src/browser/base/content/zen-styles/zen-tabs/horizontal-tabs.css +++ b/src/browser/base/content/zen-styles/zen-tabs/horizontal-tabs.css @@ -28,7 +28,7 @@ --tab-min-height: 10px !important; } - #vertical-pinned-tabs-container-separator { + .vertical-pinned-tabs-container-separator { display: none !important; } @@ -214,7 +214,7 @@ } /* Other UI Elements */ - #zen-current-workspace-indicator { + .zen-current-workspace-indicator { display: none !important; } 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 69882ca04..eeab85cdb 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 @@ -29,7 +29,7 @@ & #zen-sidebar-top-buttons .toolbarbutton-1 { & > .toolbarbutton-icon { - padding: 5px; + padding: 4px; } } @@ -72,7 +72,14 @@ } #browser { - --zen-toolbox-padding: max(.4rem, calc(var(--zen-element-separation) / 1.5)); + --zen-min-toolbox-padding: .4rem; + @media (-moz-platform: macos) { + --zen-min-toolbox-padding: .52rem; + } + @media (-moz-platform: linux) { + --zen-min-toolbox-padding: .35rem; + } + --zen-toolbox-padding: max(var(--zen-min-toolbox-padding), calc(var(--zen-element-separation) / 1.5)); } :root[zen-single-toolbar='true'] { @@ -80,17 +87,6 @@ width: -moz-available !important; } - .sharing-icon, - #identity-icon, - .urlbar-icon, - #permissions-granted-icon, - #tracking-protection-icon, - #tracking-protection-icon-box, - #blocked-permissions-container > .blocked-permission-icon { - width: 12px; - height: 12px; - } - #identity-icon-box, #identity-permission-box { margin-top: auto; @@ -121,7 +117,7 @@ } } -#vertical-pinned-tabs-container-separator { +.vertical-pinned-tabs-container-separator { background: light-dark(rgba(1, 1, 1, 0.075), rgba(255, 255, 255, 0.1)); margin: 8px auto; border: none; @@ -130,8 +126,7 @@ width: 98%; transition: margin 0.2s ease-in-out, background 0.2s ease-in-out, max-height 0.2s ease-in-out; - #vertical-pinned-tabs-container:not(:has(tab:not([hidden]))) + &, - #tabbrowser-tabs:not(:has(#tabbrowser-arrowscrollbox tab:not([hidden]))) & { + #vertical-pinned-tabs-container .zen-workspace-tabs-section[hide-separator] & { max-height: 0; margin: 0 auto; } @@ -245,6 +240,7 @@ padding-inline-start: 0 !important; overflow-y: unset !important; /* DO NOT CHANGE THIS: Firefox renders badly workspace changes */ overflow-x: clip; + overflow-clip-margin: var(--zen-toolbox-padding); --tab-inner-inline-margin: 0; @@ -253,25 +249,18 @@ --tab-block-margin: 2px; --tab-selected-bgcolor: light-dark(rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.12)); + --tab-selected-shadow: 0 1px 1px 1px light-dark(rgba(0, 0, 0, 0.09), rgba(0, 0, 0, 0.1)) !important; grid-gap: 0 !important; &[overflow]::after, - #vertical-tabs-newtab-button { + #vertical-tabs-newtab-button, + #vertical-pinned-tabs-container-separator { /* notice #vertical-pinned-tabs-container-separator is an ID */ /* Hide separator they give us, eww */ display: none !important; } & .tabbrowser-tab { transition: scale 0.07s ease; - #tabbrowser-tabs &:not([zen-essential='true']) { - #tabbrowser-tabs[dont-animate-tabs] & { - opacity: 0; - } - - &:is([selected], [multiselected], [visuallyselected]) .tab-background { - box-shadow: 0 1px 1px 1px light-dark(rgba(0, 0, 0, 0.09), rgba(0, 0, 0, 0.1)); - } - } &:active { scale: 0.98; @@ -281,7 +270,6 @@ padding: 0 !important; position: relative; - border-radius: var(--border-radius-medium); & .tab-background { overflow: hidden; @@ -292,10 +280,6 @@ } } - &[selected] .tab-background { - backdrop-filter: blur(10px); - } - @media (-moz-bool-pref: 'zen.tabs.dim-pending') { &[pending='true'] .tab-icon-image { opacity: 0.5; @@ -305,14 +289,23 @@ /* We have a tab inside a tab, this means, it's a glance tab */ & .tabbrowser-tab { pointer-events: none; - margin: 0; + margin: 0 0 0 4px; --toolbarbutton-inner-padding: 0; --border-radius-medium: 8px; + width: 24px; + height: 24px; + --tab-min-height: 24px; + --tab-min-width: 24px; & .tab-background { - background: transparent; + background: var(--zen-toolbar-element-bg) !important; + margin-block: 0 !important; + margin-inline: 0 !important; box-shadow: none !important; } + & .tab-content { + padding: 0 5px; + } & label { display: none !important; } & .tab-close-button, & .tab-reset-button { @@ -321,19 +314,26 @@ & .tab-icon-image { --toolbarbutton-inner-padding: 0 !important; + width: 14px; + height: 14px; } } /* On essentials, glance tabs are floating */ &[zen-essential='true'] .tabbrowser-tab { position: absolute; - top: 4px; - right: 4px; - --tab-collapsed-width: 35px; + top: 0px; + right: 0px; + --tab-collapsed-width: 34px; --tab-min-height: 16px; width: var(--tab-collapsed-width) !important; z-index: 1; pointer-events: none; + & .tab-background { + /* Solid colors because we don't want to show the background */ + background: light-dark(rgb(249, 249, 249), rgb(63, 63, 63)) !important; + border: 2px solid light-dark(rgba(0, 0, 0, 0.4), rgba(255, 255, 255, 0.4)); + } } } } @@ -344,6 +344,7 @@ align-items: center; padding-top: var(--zen-element-separation); + --toolbarbutton-inner-padding: 5px; & > toolbarbutton:not(#zen-workspaces-button) { padding: 0 !important; @@ -365,10 +366,16 @@ } } -#zen-browser-tabs-wrapper { +#zen-tabs-wrapper { min-height: fit-content; overflow-y: auto; - overflow-x: hidden; + height: 100%; + scrollbar-width: thin; +} + +#zen-browser-tabs-container { + overflow-x: clip !important; /* might break custom css with new design, so let's force it */ + position: relative; } #vertical-pinned-tabs-container { @@ -376,7 +383,8 @@ display: flex !important; flex-direction: column; min-height: fit-content !important; - overflow: visible; + overflow-x: clip; + overflow-y: visible; max-height: unset !important; & .tabbrowser-tab:not(:hover) .tab-background:not([selected]):not([multiselected]) { @@ -434,7 +442,7 @@ width: calc(100% - 10px) !important; } - & #zen-current-workspace-indicator-icon[no-icon='true'] { + & .zen-current-workspace-indicator-icon[no-icon='true'] { display: none; } @@ -514,7 +522,7 @@ } &:hover { - background: var(--toolbarbutton-hover-background) !important; + background: var(--toolbarbutton-hover-background); & image, label { @@ -565,11 +573,11 @@ #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, + & .zen-current-workspace-indicator-name, & .toolbarbutton-text { display: none !important; } - & #zen-current-workspace-indicator { + & .zen-current-workspace-indicator { padding-left: 0; padding-right: 0; display: flex; @@ -718,31 +726,33 @@ /* Mark: Move sidebar to the right */ :root[zen-right-side='true'] { & #navigator-toolbox { - order: 3 !important; + order: 10 !important; } & #zen-sidebar-splitter { - order: 2 !important; + order: 9 !important; } } /* Mark: Override the default tab close button */ #tabbrowser-tabs { & .tabbrowser-tab { - &[pinned] .tab-close-button { + &[pinned]:not([pending='true']) .tab-close-button { display: none !important; } - &[pinned]:not([zen-essential]):hover .tab-reset-button, - &[pinned][visuallyselected]:not([zen-essential]) .tab-reset-button { - display: block; + &[pinned]:not([pending='true']):not([zen-essential]) { + &:hover .tab-reset-button, + &[visuallyselected] .tab-reset-button { + display: block; + } } &[zen-essential] .tab-reset-button { display: none; } - &:not([pinned]) .tab-reset-button { + &:not([pinned][visuallyselected]) .tab-reset-button { display: none; } @@ -758,7 +768,7 @@ border-radius: var(--tab-border-radius); color: inherit; fill: currentColor; - padding: 6px; + padding: var(--tab-close-button-padding); width: 24px; height: 24px; outline: var(--toolbarbutton-outline); @@ -879,10 +889,22 @@ @media (-moz-bool-pref: 'zen.tabs.show-newtab-vertical') { #tabs-newtab-button { display: flex !important; + transition: scale 0.1s ease; & .toolbarbutton-text { align-items: center; padding-top: 0; } + + &:active, + &[open] { + scale: 0.98; + } + + &[in-urlbar] { + background: var(--tab-selected-bgcolor) !important; + opacity: 1 !important; + box-shadow: var(--tab-selected-shadow); + } } #tabbrowser-arrowscrollbox-periphery { @@ -927,30 +949,25 @@ transition: max-height 0.3s ease-out; opacity: 1; grid-template-columns: repeat(auto-fit, minmax(var(--tab-pinned-min-width-expanded), auto)); - overflow-y: auto; - overflow-x: hidden; + overflow: hidden; scrollbar-width: thin; display: grid; padding: 0; } -#zen-essentials-container .tabbrowser-tab { +#zen-essentials-container > .tabbrowser-tab { --toolbarbutton-inner-padding: 0; max-width: unset; width: 100% !important; & .tab-background { border-radius: var(--border-radius-medium) !important; - transition: background 0.2s ease-in-out; + transition: background 0.1s ease-in-out; } --tab-selected-bgcolor: light-dark(rgba(255, 255, 255, 0.85), rgba(255, 255, 255, 0.2)); - &[selected] .tab-background { - box-shadow: 0 1px 1px 1px light-dark(rgba(0, 0, 0, 0.09), rgba(0, 0, 0, 0.1)); - } - - &:not([selected], [multiselected="true"]) .tab-background { + &:not([visuallyselected], [multiselected="true"]) .tab-background { background: var(--zen-toolbar-element-bg); border: none; } @@ -978,7 +995,7 @@ } @media (-moz-bool-pref: 'zen.theme.essentials-favicon-bg') { - &[selected] .tab-background { + &[visuallyselected] > .tab-stack > .tab-background { &::after { content: ""; inset: -50%; @@ -1002,11 +1019,11 @@ inset: 0; z-index: 0; content: ""; - transition: background 0.2s ease-in-out; + transition: background 0.1s ease-in-out; } } - &[selected]:hover .tab-background::before { + &[visuallyselected]:hover .tab-background::before { background: light-dark(rgba(255, 255, 255, 0.80), rgba(68, 64, 64, 0.80)); } } @@ -1065,3 +1082,80 @@ %include vertical-tabs-topbuttons-fix.css } } + +/* Vertical tabs reordering indicators */ +#zen-drag-indicator { + --zen-drag-indicator-height: 2px; + --zen-drag-indicator-bg: color-mix(in srgb, var(--zen-primary-color) 50%, light-dark(rgba(0, 0, 0, .85), rgba(255, 255, 255, .95)) 50%); + position: fixed; + z-index: 1000; + background: var(--zen-drag-indicator-bg); + pointer-events: none; + border-radius: 5px; + + &::before { + content: ""; + position: absolute; + height: calc(2 * var(--zen-drag-indicator-height)); + width: calc(2 * var(--zen-drag-indicator-height)); + border: var(--zen-drag-indicator-height) solid var(--zen-drag-indicator-bg); + border-radius: 50%; + background: transparent; + } + + &[orientation='horizontal'] { + left: calc(var(--indicator-left) + 2 * var(--zen-drag-indicator-height) + 4px); + width: calc(var(--indicator-width) - 2 * var(--zen-drag-indicator-height) - 4px); + height: var(--zen-drag-indicator-height); + transition: top 0.1s ease-out, left 0.1s ease-out, width 0.1s ease-out; + + &::before { + left: calc(-2 * var(--zen-drag-indicator-height)); + top: 50%; + transform: translate(calc(-1 * var(--zen-drag-indicator-height)), -50%); + } + } + + &[orientation='vertical'] { + top: calc(var(--indicator-top) + 2 * var(--zen-drag-indicator-height) + 4px); + height: calc(var(--indicator-height) - 2 * var(--zen-drag-indicator-height) - 4px); + width: var(--zen-drag-indicator-height); + transition: top 0.1s ease-out, left 0.1s ease-out, height 0.1s ease-out; + + &::before { + top: calc(-2 * var(--zen-drag-indicator-height)); + left: 50%; + transform: translate(-50%, calc(-1 * var(--zen-drag-indicator-height))); + } + } +} + +/* Horizontal tabs reordering indicators */ +#zen-essentials-container .tabbrowser-tab.drag-over-before { + box-shadow: 3px 0 6px -2px var(--toolbarbutton-active-background, rgba(0, 255, 0, 0.2)); +} + +#zen-essentials-container .tabbrowser-tab.drag-over-after { + box-shadow: -3px 0 6px -2px var(--toolbarbutton-active-background, rgba(0, 255, 0, 0.2)); +} + +/* Renaming tabs */ +.tab-label-container-editing { + display: none !important; +} + +#tab-label-input { + white-space: nowrap; + overflow-x: scroll; + margin: 0; + background: transparent; + border: none; + padding: 0; +} + +/* Section: tab workspaces stylings */ +.zen-workspace-tabs-section { + position: absolute; + transform: translateX(-100%); + min-width: 100%; +} diff --git a/src/browser/base/content/zen-styles/zen-theme.css b/src/browser/base/content/zen-styles/zen-theme.css index a4e15cb8a..9a36206bf 100644 --- a/src/browser/base/content/zen-styles/zen-theme.css +++ b/src/browser/base/content/zen-styles/zen-theme.css @@ -12,8 +12,8 @@ :root, .zenLooksAndFeelColorOption { /** We also add `.zenLooksAndFeelColorOption` so that it recalculates the colors when the theme changes - * in the preferences page. - */ + * in the preferences page. + */ /* Default values */ --zen-border-radius: 7px; @@ -46,21 +46,21 @@ --in-content-primary-button-background: color-mix( in srgb, - var(--zen-primary-color) 10%, - var(--zen-branding-bg) 90% + var(--zen-primary-color) 30%, + var(--zen-branding-bg-reverse) 70% ) !important; --in-content-primary-button-background-hover: color-mix( in srgb, - var(--zen-primary-color) 15%, - var(--zen-branding-bg) 85% + var(--zen-primary-color) 35%, + var(--zen-branding-bg-reverse) 65% ) !important; --in-content-primary-button-background-active: color-mix( in srgb, - var(--zen-primary-color) 20%, - var(--zen-branding-bg) 80% + var(--zen-primary-color) 40%, + var(--zen-branding-bg-reverse) 60% ) !important; - --button-text-color-primary: var(--zen-branding-bg-reverse) !important; - --in-content-primary-button-text-color: var(--zen-colors-primary-foreground) !important; + --button-text-color-primary: var(--zen-branding-bg) !important; + --in-content-primary-button-text-color: var(--zen-branding-bg) !important; --in-content-primary-button-border-color: transparent !important; --in-content-primary-button-border-hover: transparent !important; --in-content-primary-button-border-active: var(--zen-colors-border) !important; @@ -72,7 +72,7 @@ /* 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) 60%) !important; + --in-content-button-background-hover: color-mix(in srgb, currentColor 3%, transparent 97%) !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; @@ -88,7 +88,7 @@ --button-background-color: var(--in-content-button-background) !important; --button-background-color-hover: var(--in-content-button-background-hover) !important; - --button-background-color-active: var(--in-content-primary-button-background-active) !important; + --button-background-color-active: color-mix(in srgb, currentColor 5%, transparent 95%) !important; --color-accent-primary: var(--button-primary-bgcolor) !important; --color-accent-primary-hover: var(--button-primary-hover-bgcolor) !important; @@ -131,6 +131,8 @@ --toolbarbutton-border-radius: 6px; --urlbar-margin-inline: 1px !important; + --tab-icon-overlay-stroke: light-dark(white, black) !important; + --fp-contextmenu-border-radius: 8px; --fp-contextmenu-padding: calc(4px - var(--fp-contextmenu-menuitem-border-width)) 0; --fp-contextmenu-menuitem-border-radius: calc(4px + var(--fp-contextmenu-menuitem-border-width)); @@ -146,6 +148,8 @@ --fp-contextmenu-bgcolor: light-dark(Menu, rgb(43 42 51 / 0.95)); --toolbar-bgcolor: transparent; + --tab-close-button-padding: 5px !important; + --toolbarbutton-active-background: var(--zen-toolbar-element-bg); --input-bgcolor: var(--zen-colors-tertiary) !important; @@ -153,19 +157,19 @@ --zen-themed-toolbar-bg: light-dark(var(--zen-branding-bg), #161616); --zen-themed-toolbar-bg-transparent: light-dark(var(--zen-branding-bg), #161616); + --zen-workspace-indicator-height: 45px; + @media (-moz-windows-mica) or (-moz-platform: macos) { 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)) - ); + --zen-themed-toolbar-bg-transparent: transparent; + @media (-moz-bool-pref: 'zen.widget.windows.acrylic') { + --zen-themed-toolbar-bg-transparent: color-mix(in srgb, var(--zen-themed-toolbar-bg) 85%, transparent 15%); + } } --toolbar-field-background-color: var(--zen-colors-input-bg) !important; --arrowpanel-background: var(--zen-dialog-background) !important; - --tab-selected-shadow: none !important; --zen-big-shadow: 0 0 9.73px 0px light-dark(rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.25)); /* Nativity */ @@ -176,10 +180,10 @@ --zen-native-inner-radius: var( --zen-webview-border-radius, /* Inner radius calculation: - * 1. If the native radius - the separation is less than 4px, use 4px. - * 2. Otherwise, use the the calculated value (inner radius = outer radius - separation). - */ - max(5px, calc(var(--zen-native-content-radius) - var(--zen-element-separation))) + * 1. If the native radius - the separation is less than 4px, use 4px. + * 2. Otherwise, use the the calculated value (inner radius = outer radius - separation). + */ + max(5px, calc(var(--zen-native-content-radius) - var(--zen-element-separation) / 2)) ); /** Other theme-related styles */ @@ -209,7 +213,7 @@ --zen-colors-primary-foreground: color-mix(in srgb, var(--zen-primary-color) 80%, white 20%); --zen-colors-input-bg: color-mix(in srgb, var(--zen-primary-color) 1%, var(--zen-dark-color-mix-base) 99%); - --zen-colors-border: color-mix(in srgb, var(--zen-colors-secondary) 20%, rgb(53, 53, 53) 80%); + --zen-colors-border: color-mix(in srgb, var(--zen-colors-secondary) 20%, rgb(79, 79, 79) 80%); --zen-colors-border-contrast: color-mix(in srgb, var(--zen-colors-secondary) 10%, rgba(255, 255, 255, 0.11) 90%); --zen-dialog-background: var(--zen-dark-color-mix-base); @@ -218,33 +222,3 @@ --zen-browser-gradient-base: color-mix(in srgb, var(--zen-primary-color) 30%, var(--zen-dark-color-mix-base) 70%); } } - -@media (prefers-color-scheme: dark) { - @media (-moz-bool-pref: 'zen.theme.color-prefs.amoled') { - :root { - --zen-dark-color-mix-base: hsl(5 5 5); - --zen-urlbar-background: color-mix(in srgb, var(--zen-primary-color) 4%, rgb(0, 0, 0) 96%); - } - } - - @media (-moz-bool-pref: 'zen.theme.color-prefs.colorful') { - :root { - --zen-in-content-dialog-background: rgb(28, 28, 32); - - --zen-colors-primary: color-mix(in srgb, var(--zen-primary-color) 50%, black 50%); - --zen-colors-secondary: color-mix(in srgb, var(--zen-primary-color) 40%, black 60%); - --zen-colors-tertiary: color-mix(in srgb, var(--zen-primary-color) 15%, black 85%); - - --zen-colors-hover-bg: color-mix(in srgb, var(--zen-primary-color) 90%, black 10%); - --zen-colors-primary-foreground: color-mix(in srgb, var(--zen-primary-color) 80%, white 20%); - - --zen-colors-input-bg: color-mix(in srgb, var(--zen-primary-color) 10%, black 80%); - --zen-colors-border: color-mix(in srgb, var(--zen-colors-secondary) 80%, black 20%); - - --zen-dialog-background: color-mix(in srgb, var(--zen-primary-color) 10%, black 90%); - --zen-urlbar-background: color-mix(in srgb, var(--zen-primary-color) 8%, rgb(15, 15, 15) 92%); - - --zen-browser-gradient-base: color-mix(in srgb, var(--zen-primary-color) 30%, black 70%); - } - } -} diff --git a/src/browser/base/content/zen-styles/zen-urlbar.css b/src/browser/base/content/zen-styles/zen-urlbar.css index eda3ebab3..a9f1dc608 100644 --- a/src/browser/base/content/zen-styles/zen-urlbar.css +++ b/src/browser/base/content/zen-styles/zen-urlbar.css @@ -10,8 +10,8 @@ } #urlbar { - --toolbarbutton-border-radius: 10px; - --urlbarView-separator-color: var(--zen-colors-border); + --toolbarbutton-border-radius: 8px; + --urlbarView-separator-color: light-dark(hsl(0, 0%, 90%), hsl(0, 0%, 20%)); --urlbarView-hover-background: var(--toolbarbutton-hover-background); --urlbarView-highlight-background: var(--toolbarbutton-hover-background); border-radius: var(--toolbarbutton-border-radius); @@ -121,26 +121,32 @@ } #urlbar[breakout-extend='true'] #urlbar-background { - border: 1px solid var(--zen-colors-border) !important; - box-shadow: var(--zen-big-shadow) !important; + box-shadow: + inset 0 0 0.5px 1px hsla(0, 0%, 100%, 0.1), + /* 2. shadow ring 👇 */ 0 0 0 1px hsla(230, 13%, 9%, 0.075), + /* 3. multiple soft shadows 👇 */ 0 0.3px 0.4px hsla(230, 13%, 9%, 0.02), + 0 0.9px 1.5px hsla(230, 13%, 9%, 0.045), + 0 6.5px 12px hsla(230, 13%, 9%, 0.1) !important; backdrop-filter: none !important; } :root[zen-single-toolbar='true'] { .urlbar-page-action:not([open]), + .identity-box-button:not([open]), #tracking-protection-icon-container { - margin-inline-end: calc(-16px - 2 * var(--urlbar-icon-padding)) !important; + margin-inline-end: calc(-8px - 2 * var(--urlbar-icon-padding)) !important; opacity: 0; - transition: all 0.2s; + transition: all 0.1s ease; } #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[open] :is(#tracking-protection-icon-container, .urlbar-page-action, .identity-box-button), + #urlbar:hover :is(#tracking-protection-icon-container, .urlbar-page-action, .identity-box-button), .urlbar-page-action[open], + .identity-box-button[open], #tracking-protection-icon-container[open] { opacity: 1; margin-inline-end: 0 !important; @@ -234,9 +240,23 @@ button.popup-notification-dropmarker { } @container urlbar-container (width < 350px) { + #userContext-icons { + transition: all 0.1s ease; + } + #userContext-label { display: none; } + + #userContext-indicator { + margin-inline-end: 4px; + } + + #urlbar:hover:not([breakout-extend='true']) #userContext-icons { + margin-inline-end: calc(-16px - 2 * var(--urlbar-icon-padding)) !important; + opacity: 0; + pointer-events: none; + } } @media (max-width: 550px) { @@ -274,7 +294,7 @@ button.popup-notification-dropmarker { #urlbar .urlbar-page-action, #urlbar #tracking-protection-icon-container, #urlbar:not([breakout-extend='true']) #identity-box:is(:not(.chromeUI), [pageproxystate='invalid']) #identity-icon-box { - border-radius: 10px !important; + border-radius: 8px !important; } /* Extensions or similar */ @@ -373,13 +393,14 @@ button.popup-notification-dropmarker { /* 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; + background-color: light-dark(hsl(0, 0%, 100%), hsl(0, 0%, 14%)) !important; + outline: 1px solid rgba(0, 0, 0, 0.3) !important; } } :root[zen-single-toolbar='true'] { #urlbar[open] { - min-width: 30vw; + min-width: 35vw; } &[zen-right-side='true'] #urlbar[open]:not([zen-floating-urlbar='true']) { @@ -391,20 +412,24 @@ button.popup-notification-dropmarker { 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; font-size: 1.15em !important; + @media (-moz-platform: macos) { + font-size: 1.5em !important; + } top: calc(var(--zen-toolbar-height) * 2) !important; + --zen-urlbar-center: calc(var(--zen-urlbar-offset, 0px) + 28vw); + :root[zen-right-side='true'] & { - right: 28vw !important; + right: var(--zen-urlbar-center) !important; } :root:not([zen-right-side='true']) & { - left: 28vw !important; + left: var(--zen-urlbar-center) !important; } #urlbar-container:has(&) { @@ -475,10 +500,9 @@ button.popup-notification-dropmarker { } &: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-favicon, + & { + background-color: color-mix(in srgb, var(--zen-branding-bg-reverse) 5%, transparent 95%) !important; } .urlbarView-url, diff --git a/src/browser/base/content/zen-styles/zen-workspaces.css b/src/browser/base/content/zen-styles/zen-workspaces.css index 3fe0b2a71..34a6e6466 100644 --- a/src/browser/base/content/zen-styles/zen-workspaces.css +++ b/src/browser/base/content/zen-styles/zen-workspaces.css @@ -73,6 +73,10 @@ filter: grayscale(0); opacity: 1; } + + &:hover { + background-color: var(--zen-toolbar-element-bg); + } } } } @@ -141,14 +145,6 @@ & #zen-workspaces-button .zen-workspace-sidebar-icon { margin-inline-end: 5px; - - & [no-icon='true'] { - display: none; - } - } - - & #zen-workspaces-button .zen-workspace-sidebar-icon[no-icon='true'] + .zen-workspace-sidebar-name { - margin-left: 0; } & #zen-workspaces-button { @@ -431,8 +427,8 @@ min-height: 1px !important; padding: 3px; border-radius: 4px; - width: 20px; - height: 20px; + width: 24px; + height: 24px; } #PanelUI-zen-workspaces-create-footer, @@ -454,44 +450,60 @@ } /* Mark workspaces indicator */ -#zen-current-workspace-indicator { +#zen-current-workspace-indicator-container { + margin-bottom: var(--zen-workspace-indicator-height); +} + +.zen-current-workspace-indicator { padding: 15px calc(4px + var(--tab-inline-padding)); font-weight: 600; - align-items: center; - position: relative; + position: absolute; + max-height: var(--zen-workspace-indicator-height); + min-height: var(--zen-workspace-indicator-height); + gap: 12px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex-direction: row !important; - & #zen-current-workspace-indicator-icon { - font-size: 14px; + &::before { + border-radius: var(--border-radius-medium); + background: transparent; + transition: background 0.1s; + pointer-events: none; + content: ''; + position: absolute; + top: 4px; + left: 2px; + z-index: -1; + width: calc(100% - 4px); + height: calc(100% - 10px); } - #zen-current-workspace-indicator-name { + &:hover, + &[open='true'] { + &::before { + background: var(--tab-hover-background-color); + } + } + + & .zen-current-workspace-indicator-icon { + font-size: 12px; + } + + .zen-current-workspace-indicator-name { font-size: 13px; opacity: 0.5; - - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; display: block; - - position: absolute; - max-width: calc(100% - var(--zen-toolbox-padding) * 4); - } - - & #zen-current-workspace-indicator-icon { - min-height: 16px; - } - - & #zen-current-workspace-indicator-icon:not([hidden]) + #zen-current-workspace-indicator-name { - padding-left: 24px; } } @media not (-moz-bool-pref: 'zen.workspaces.show-workspace-indicator') { - #zen-current-workspace-indicator { + #zen-current-workspace-indicator-container { display: none !important; } } -#zen-current-workspace-indicator[hidden='true'] { +#zen-current-workspace-indicator-container[hidden='true'] { display: none !important; } diff --git a/src/browser/base/zen-components/ZenCommonUtils.mjs b/src/browser/base/zen-components/ZenCommonUtils.mjs index 0ecabfac8..83a75a1c8 100644 --- a/src/browser/base/zen-components/ZenCommonUtils.mjs +++ b/src/browser/base/zen-components/ZenCommonUtils.mjs @@ -69,7 +69,22 @@ var gZenCommonActions = { 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'); + gZenUIManager.showToast('zen-copy-current-url-confirmation'); + } + }, + copyCurrentURLAsMarkdownToClipboard() { + const currentUrl = gBrowser.currentURI.spec; + const tabTitle = gBrowser.selectedTab.label; + if (currentUrl && tabTitle) { + const markdownLink = `[${tabTitle}](${currentUrl})`; + let str = Cc['@mozilla.org/supports-string;1'].createInstance(Ci.nsISupportsString); + str.data = markdownLink; + let transferable = Cc['@mozilla.org/widget/transferable;1'].createInstance(Ci.nsITransferable); + transferable.init(getLoadContext()); + transferable.addDataFlavor('text/plain'); + transferable.setTransferData('text/plain', str); + Services.clipboard.setData(transferable, null, Ci.nsIClipboard.kGlobalClipboard); + gZenUIManager.showToast('zen-copy-current-url-confirmation'); } }, diff --git a/src/browser/base/zen-components/ZenCompactMode.mjs b/src/browser/base/zen-components/ZenCompactMode.mjs index 53c039d42..2dc713b25 100644 --- a/src/browser/base/zen-components/ZenCompactMode.mjs +++ b/src/browser/base/zen-components/ZenCompactMode.mjs @@ -41,9 +41,15 @@ var gZenCompactModeManager = { get preference() { if (!document.documentElement.hasAttribute('zen-compact-mode')) { - document.documentElement.setAttribute( - 'zen-compact-mode', - lazyCompactMode.mainAppWrapper.getAttribute('zen-compact-mode') + window.addEventListener( + 'MozAfterPaint', + () => { + document.documentElement.setAttribute( + 'zen-compact-mode', + lazyCompactMode.mainAppWrapper.getAttribute('zen-compact-mode') + ); + }, + { once: true } ); } return lazyCompactMode.mainAppWrapper.getAttribute('zen-compact-mode') === 'true'; @@ -100,8 +106,6 @@ var gZenCompactModeManager = { }, updateCompactModeContext(isSingleToolbar) { - this.getAndApplySidebarWidth(); // Ignore return value - const IDs = [ 'zen-context-menu-compact-mode-hide-sidebar', 'zen-context-menu-compact-mode-hide-toolbar', @@ -140,6 +144,7 @@ var gZenCompactModeManager = { getAndApplySidebarWidth() { let sidebarWidth = this.sidebar.getBoundingClientRect().width; if (sidebarWidth > 1) { + gZenUIManager.restoreScrollbarState(); this.sidebar.style.setProperty('--zen-sidebar-width', `${sidebarWidth}px`); } return sidebarWidth; @@ -157,6 +162,9 @@ var gZenCompactModeManager = { if (canAnimate) { this.sidebar.setAttribute('animate', 'true'); } + this.sidebar.style.removeProperty('margin-right'); + this.sidebar.style.removeProperty('margin-left'); + this.sidebar.style.removeProperty('transform'); window.requestAnimationFrame(() => { let sidebarWidth = this.getAndApplySidebarWidth(); if (!canAnimate) { @@ -176,24 +184,23 @@ var gZenCompactModeManager = { { ease: 'easeIn', type: 'spring', - stiffness: 3000, - damping: 150, - mass: 1, + bounce: 0, + duration: 0.2, } ) .then(() => { this.sidebar.removeAttribute('animate'); - this.sidebar.style.transition = 'none'; this.sidebar.style.removeProperty('margin-right'); this.sidebar.style.removeProperty('margin-left'); this.sidebar.style.removeProperty('transform'); - this._animating = false; + this.sidebar.style.transition = 'none'; setTimeout(() => { + this._animating = false; this.sidebar.style.removeProperty('transition'); }); }); } else if (canHideSidebar && !isCompactMode) { - document.getElementById('browser').style.overflow = 'hidden'; + document.getElementById('browser').style.overflow = 'clip'; if (this.sidebarIsOnRight) { this.sidebar.style.marginRight = `-${sidebarWidth}px`; } else { @@ -204,16 +211,15 @@ var gZenCompactModeManager = { this.sidebar, this.sidebarIsOnRight ? { - marginRight: 0, + marginRight: [`-${sidebarWidth}px`, 0], transform: ['translateX(100%)', 'translateX(0)'], } : { marginLeft: 0 }, { ease: 'easeOut', type: 'spring', - stiffness: 3000, - damping: 150, - mass: 1, + bounce: 0, + duration: 0.2, } ) .then(() => { @@ -286,6 +292,9 @@ var gZenCompactModeManager = { element: document.getElementById('zen-appcontent-navbar-container'), screenEdge: 'top', }, + { + element: gZenVerticalTabsManager.actualWindowButtons, + }, ]; }, @@ -330,9 +339,15 @@ var gZenCompactModeManager = { target.addEventListener('mouseleave', (event) => { // If on Mac, ignore mouseleave in the area of window buttons if (AppConstants.platform == 'macosx') { - const MAC_WINDOW_BUTTONS_X_BORDER = 75; - const MAC_WINDOW_BUTTONS_Y_BORDER = 40; - if (event.clientX < MAC_WINDOW_BUTTONS_X_BORDER && event.clientY < MAC_WINDOW_BUTTONS_Y_BORDER) { + const buttonRect = gZenVerticalTabsManager.actualWindowButtons.getBoundingClientRect(); + const MAC_WINDOW_BUTTONS_X_BORDER = buttonRect.width + buttonRect.x; + const MAC_WINDOW_BUTTONS_Y_BORDER = buttonRect.height + buttonRect.y; + if ( + event.clientX < MAC_WINDOW_BUTTONS_X_BORDER && + event.clientY < MAC_WINDOW_BUTTONS_Y_BORDER && + event.clientX > buttonRect.x && + event.clientY > buttonRect.y + ) { return; } } @@ -342,7 +357,7 @@ var gZenCompactModeManager = { return; } - if (this.hoverableElements[i].keepHoverDuration) { + if (this.hoverableElements[i].keepHoverDuration && !event.target.querySelector('#urlbar[zen-floating-urlbar]')) { this.flashElement(target, this.hoverableElements[i].keepHoverDuration, 'has-hover' + target.id, 'zen-has-hover'); } else { this._removeHoverFrames[target.id] = window.requestAnimationFrame(() => target.removeAttribute('zen-has-hover')); diff --git a/src/browser/base/zen-components/ZenGlanceManager.mjs b/src/browser/base/zen-components/ZenGlanceManager.mjs index 1e703078d..ba9ecb0ec 100644 --- a/src/browser/base/zen-components/ZenGlanceManager.mjs +++ b/src/browser/base/zen-components/ZenGlanceManager.mjs @@ -1,14 +1,15 @@ { class ZenGlanceManager extends ZenDOMOperatedFeature { - #currentBrowser = null; - #currentTab = null; - _animating = false; _lazyPref = {}; + #glances = new Map(); + #currentGlanceID = null; + init() { window.addEventListener('keydown', this.onKeyDown.bind(this)); window.addEventListener('TabClose', this.onTabClose.bind(this)); + window.addEventListener('TabSelect', this.onLocationChange.bind(this)); XPCOMUtils.defineLazyPreferenceGetter( this._lazyPref, @@ -24,17 +25,29 @@ Services.obs.addObserver(this, 'quit-application-requested'); } + get #currentBrowser() { + return this.#glances.get(this.#currentGlanceID)?.browser; + } + + get #currentTab() { + return this.#glances.get(this.#currentGlanceID)?.tab; + } + + get #currentParentTab() { + return this.#glances.get(this.#currentGlanceID)?.parentTab; + } + onKeyDown(event) { - if (event.key === 'Escape' && this.#currentBrowser) { + if (event.key === 'Escape' && this.#currentGlanceID) { event.preventDefault(); event.stopPropagation(); - this.closeGlance(); + this.closeGlance({ onTabClose: true }); } } onOverlayClick(event) { if (event.target === this.overlay && event.originalTarget !== this.contentWrapper) { - this.closeGlance(); + this.closeGlance({ onTabClose: true }); } } @@ -48,13 +61,13 @@ onUnload() { // clear everything - if (this.#currentBrowser) { - gBrowser.removeTab(this.#currentTab); + for (let [id, glance] of this.#glances) { + gBrowser.removeTab(glance.tab, { animate: false }); } } getTabPosition(tab) { - return Math.max(gBrowser._numVisiblePinTabs, tab._tPos) + 1; + return Math.max(gBrowser._numVisiblePinTabs, tab._tPos); } createBrowserElement(url, currentTab, existingTab = null) { @@ -65,21 +78,57 @@ skipLoad: false, index: this.getTabPosition(currentTab), }; - this.currentParentTab = currentTab; + currentTab._selected = true; + const newUUID = gZenUIManager.generateUuidv4(); const newTab = existingTab ?? gBrowser.addTrustedTab(Services.io.newURI(url).spec, newTabOptions); - - gBrowser.selectedTab = newTab; + if (currentTab.hasAttribute('zenDefaultUserContextId')) { + newTab.setAttribute('zenDefaultUserContextId', true); + } currentTab.querySelector('.tab-content').appendChild(newTab); newTab.setAttribute('zen-glance-tab', true); - this.#currentBrowser = newTab.linkedBrowser; - this.#currentTab = newTab; + newTab.setAttribute('glance-id', newUUID); + currentTab.setAttribute('glance-id', newUUID); + this.#glances.set(newUUID, { + tab: newTab, + parentTab: currentTab, + browser: newTab.linkedBrowser, + }); + this.#currentGlanceID = newUUID; + gBrowser.selectedTab = newTab; return this.#currentBrowser; } + fillOverlay(browser) { + this.overlay = browser.closest('.browserSidebarContainer'); + this.browserWrapper = browser.closest('.browserContainer'); + this.contentWrapper = browser.closest('.browserStack'); + } + + showSidebarButtons(animate = false) { + if (this.sidebarButtons.hasAttribute('hidden') && animate) { + gZenUIManager.motion.animate( + this.sidebarButtons.querySelectorAll('toolbarbutton'), + { x: [50, 0], opacity: [0, 1] }, + { delay: gZenUIManager.motion.stagger(0.1) } + ); + } + this.sidebarButtons.removeAttribute('hidden'); + } + + hideSidebarButtons() { + this.sidebarButtons.setAttribute('hidden', true); + } + openGlance(data, existingTab = null, ownerTab = null) { if (this.#currentBrowser) { return; } + if (gBrowser.selectedTab === this.#currentParentTab) { + gBrowser.selectedTab = this.#currentTab; + return; + } + this.animatingOpen = true; + this._animating = true; const initialX = data.x; const initialY = data.y; @@ -89,36 +138,52 @@ this.browserWrapper?.removeAttribute('animate'); this.browserWrapper?.removeAttribute('animate-end'); this.browserWrapper?.removeAttribute('animate-full'); - this.browserWrapper?.removeAttribute('animate-full-end'); this.browserWrapper?.removeAttribute('has-finished-animation'); this.overlay?.removeAttribute('post-fade-out'); const currentTab = ownerTab ?? gBrowser.selectedTab; - this.animatingOpen = true; - this._animating = true; - const browserElement = this.createBrowserElement(data.url, currentTab, existingTab); - this.overlay = browserElement.closest('.browserSidebarContainer'); - this.browserWrapper = browserElement.closest('.browserContainer'); - this.contentWrapper = browserElement.closest('.browserStack'); - - this.browserWrapper.prepend(this.sidebarButtons); + this.fillOverlay(browserElement); this.overlay.classList.add('zen-glance-overlay'); this.browserWrapper.removeAttribute('animate-end'); window.requestAnimationFrame(() => { - this.quickOpenGlance(); + this.quickOpenGlance({ dontOpenButtons: true }); + this.showSidebarButtons(true); + gZenUIManager.motion.animate( + this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer'), + { + scale: [1, 0.98], + backdropFilter: ['blur(0px)', 'blur(5px)'], + opacity: [1, 0.5], + }, + { + duration: 0.4, + type: 'spring', + bounce: 0.2, + } + ); + this.#currentBrowser.setAttribute('animate-glance-open', true); this.overlay.removeAttribute('fade-out'); this.browserWrapper.setAttribute('animate', true); - this.browserWrapper.style.top = `${initialY + initialHeight / 2}px`; - this.browserWrapper.style.left = `${initialX + initialWidth / 2}px`; + const top = initialY + initialHeight / 2; + const left = initialX + initialWidth / 2; + this.browserWrapper.style.top = `${top}px`; + this.browserWrapper.style.left = `${left}px`; this.browserWrapper.style.width = `${initialWidth}px`; this.browserWrapper.style.height = `${initialHeight}px`; this.browserWrapper.style.opacity = 0.8; + this.#glances.get(this.#currentGlanceID).originalPosition = { + top: this.browserWrapper.style.top, + left: this.browserWrapper.style.left, + width: this.browserWrapper.style.width, + height: this.browserWrapper.style.height, + }; + this.browserWrapper.style.transform = 'translate(-50%, -50%)'; this.overlay.style.overflow = 'visible'; gZenUIManager.motion .animate( @@ -131,12 +196,13 @@ opacity: 1, }, { - duration: 0.4, + duration: 0.3, type: 'spring', bounce: 0.2, } ) .then(() => { + this.#currentBrowser.removeAttribute('animate-glance-open'); this.overlay.style.removeProperty('overflow'); this.browserWrapper.removeAttribute('animate'); this.browserWrapper.setAttribute('animate-end', true); @@ -147,166 +213,236 @@ }); } - closeGlance({ noAnimation = false, onTabClose = false } = {}) { + closeGlance({ noAnimation = false, onTabClose = false, setNewID = null, isDifferent = false } = {}) { if (this._animating || !this.#currentBrowser || this.animatingOpen || this._duringOpening) { return; } this.browserWrapper.removeAttribute('has-finished-animation'); if (noAnimation) { + this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').removeAttribute('style'); this.quickCloseGlance({ closeCurrentTab: false }); - this.#currentBrowser = null; - this.#currentTab = null; return; } + this.closingGlance = true; this._animating = true; gBrowser._insertTabAtIndex(this.#currentTab, { - index: this.getTabPosition(this.currentParentTab), + index: this.getTabPosition(this.#currentParentTab), }); let quikcCloseZen = false; if (onTabClose) { // Create new tab if no more ex if (gBrowser.tabs.length === 1) { - gBrowser.selectedTab = gZenUIManager.openAndChangeToTab(Services.prefs.getStringPref('browser.startup.homepage')); + BrowserCommands.openTab(); return; - } else if (gBrowser.selectedTab === this.#currentTab) { - this._duringOpening = true; - gBrowser.tabContainer.advanceSelectedTab(1, true); // to skip the current tab - this._duringOpening = false; - quikcCloseZen = true; } } // do NOT touch here, I don't know what it does, but it works... - window.requestAnimationFrame(() => { - this.#currentTab.style.display = 'none'; - this.browserWrapper.removeAttribute('animate'); - this.browserWrapper.removeAttribute('animate-end'); - this.overlay.setAttribute('fade-out', true); - window.requestAnimationFrame(() => { - this.quickCloseGlance({ justAnimateParent: true }); - this.browserWrapper.setAttribute('animate', true); - setTimeout(() => { - if (!this.currentParentTab) { - return; - } - - if (!onTabClose || quikcCloseZen) { - this.quickCloseGlance(); - } - this.overlay.removeAttribute('fade-out'); - this.browserWrapper.removeAttribute('animate'); - - this.lastCurrentTab = this.#currentTab; - - this.overlay.classList.remove('zen-glance-overlay'); - gBrowser._getSwitcher().setTabStateNoAction(this.lastCurrentTab, gBrowser.AsyncTabSwitcher.STATE_UNLOADED); - - if (!onTabClose && gBrowser.selectedTab === this.lastCurrentTab) { - this._duringOpening = true; - gBrowser.selectedTab = this.currentParentTab; - } - - // reset everything - this.currentParentTab = null; - this.browserWrapper = null; - this.overlay = null; - this.contentWrapper = null; - - this.lastCurrentTab.removeAttribute('zen-glance-tab'); - this.lastCurrentTab._closingGlance = true; - - gBrowser.tabContainer._invalidateCachedTabs(); - gBrowser.removeTab(this.lastCurrentTab, { animate: true }); - - this.#currentTab = null; - this.#currentBrowser = null; - - this.lastCurrentTab = null; - this._duringOpening = false; - - this._animating = false; - }, 400); + this.#currentTab.style.display = 'none'; + this.overlay.setAttribute('fade-out', true); + this.overlay.style.pointerEvents = 'none'; + this.quickCloseGlance({ justAnimateParent: true, clearID: false }); + const originalPosition = this.#glances.get(this.#currentGlanceID).originalPosition; + gZenUIManager.motion + .animate( + this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer'), + { + scale: [0.98, 1], + backdropFilter: ['blur(5px)', 'blur(0px)'], + opacity: [0.5, 1], + }, + { + duration: 0.4, + type: 'spring', + bounce: 0.2, + } + ) + .then(() => { + this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').removeAttribute('style'); + }); + gZenUIManager.motion + .animate( + this.browserWrapper, + { + ...originalPosition, + opacity: 0.3, + }, + { type: 'spring', bounce: 0, duration: 0.4, easing: 'ease' } + ) + .then(() => { + this.browserWrapper.removeAttribute('animate'); + this.browserWrapper.removeAttribute('animate-end'); + if (!this.#currentParentTab) { + return; + } + + if (!onTabClose || quikcCloseZen) { + this.quickCloseGlance({ clearID: false }); + } + this.overlay.removeAttribute('fade-out'); + this.browserWrapper.removeAttribute('animate'); + + this.lastCurrentTab = this.#currentTab; + + this.overlay.classList.remove('zen-glance-overlay'); + gBrowser._getSwitcher().setTabStateNoAction(this.lastCurrentTab, gBrowser.AsyncTabSwitcher.STATE_UNLOADED); + + if (!onTabClose) { + this.#currentParentTab._visuallySelected = false; + } + + // reset everything + const prevOverlay = this.overlay; + this.browserWrapper = null; + this.overlay = null; + this.contentWrapper = null; + + this.lastCurrentTab.removeAttribute('zen-glance-tab'); + this.lastCurrentTab._closingGlance = true; + + if (!isDifferent) { + gBrowser.selectedTab = this.#currentParentTab; + } + this._ignoreClose = true; + gBrowser.removeTab(this.lastCurrentTab, { animate: true }); + gBrowser.tabContainer._invalidateCachedTabs(); + + this.#currentParentTab.removeAttribute('glance-id'); + + this.#glances.delete(this.#currentGlanceID); + this.#currentGlanceID = setNewID; + + this.lastCurrentTab = null; + this._duringOpening = false; + + this._animating = false; + this.closingGlance = false; + + if (this.#currentGlanceID) { + this.quickOpenGlance(); + } }); - }); } - quickOpenGlance() { + quickOpenGlance({ dontOpenButtons = false } = {}) { if (!this.#currentBrowser || this._duringOpening) { return; } this._duringOpening = true; - try { - gBrowser.selectedTab = this.#currentTab; - } catch (e) {} + if (!dontOpenButtons) { + this.showSidebarButtons(); + } - this.currentParentTab.linkedBrowser - .closest('.browserSidebarContainer') - .classList.add('deck-selected', 'zen-glance-background'); - this.currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('zen-glance-overlay'); - this.currentParentTab.linkedBrowser.zenModeActive = true; + const parentBrowserContainer = this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer'); + parentBrowserContainer.classList.add('zen-glance-background'); + parentBrowserContainer.classList.remove('zen-glance-overlay'); + parentBrowserContainer.classList.add('deck-selected'); + this.#currentParentTab.linkedBrowser.zenModeActive = true; + this.#currentParentTab.linkedBrowser.docShellIsActive = true; this.#currentBrowser.zenModeActive = true; - this.currentParentTab.linkedBrowser.docShellIsActive = true; this.#currentBrowser.docShellIsActive = true; this.#currentBrowser.setAttribute('zen-glance-selected', true); + this.fillOverlay(this.#currentBrowser); + this.#currentParentTab._visuallySelected = true; - this.currentParentTab._visuallySelected = true; this.overlay.classList.add('deck-selected'); + this.overlay.classList.add('zen-glance-overlay'); this._duringOpening = false; } - quickCloseGlance({ closeCurrentTab = true, closeParentTab = true, justAnimateParent = false } = {}) { - const parentHasBrowser = !!this.currentParentTab.linkedBrowser; - if (!justAnimateParent) { + quickCloseGlance({ closeCurrentTab = true, closeParentTab = true, justAnimateParent = false, clearID = true } = {}) { + const parentHasBrowser = !!this.#currentParentTab.linkedBrowser; + this.hideSidebarButtons(); + if (parentHasBrowser) { + this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('zen-glance-background'); + } + if (!justAnimateParent && this.overlay) { if (parentHasBrowser) { if (closeParentTab) { - this.currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('deck-selected'); + this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('deck-selected'); } - this.currentParentTab.linkedBrowser.zenModeActive = false; + this.#currentParentTab.linkedBrowser.zenModeActive = false; } this.#currentBrowser.zenModeActive = false; if (closeParentTab && parentHasBrowser) { - this.currentParentTab.linkedBrowser.docShellIsActive = false; + this.#currentParentTab.linkedBrowser.docShellIsActive = false; } if (closeCurrentTab) { this.#currentBrowser.docShellIsActive = false; this.overlay.classList.remove('deck-selected'); + this.#currentTab._selected = false; } - if (!this.currentParentTab._visuallySelected && closeParentTab) { - this.currentParentTab._visuallySelected = false; + if (!this.#currentParentTab._visuallySelected && closeParentTab) { + this.#currentParentTab._visuallySelected = false; } this.#currentBrowser.removeAttribute('zen-glance-selected'); + this.overlay.classList.remove('zen-glance-overlay'); } - if (parentHasBrowser) { - this.currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('zen-glance-background'); + if (clearID) { + this.#currentGlanceID = null; } } - onLocationChange(_) { - if (this._duringOpening) { + onLocationChangeOpenGlance() { + if (!this.animatingOpen) { + this.quickOpenGlance(); + } + } + + // note: must be async to avoid timing issues + onLocationChange(event) { + const tab = event.target; + if (this.animatingFullOpen || this.closingGlance) { return; } - if (gBrowser.selectedTab === this.#currentTab && !this.animatingOpen && !this._duringOpening && this.#currentBrowser) { - this.quickOpenGlance(); + if (this._duringOpening || !tab.hasAttribute('glance-id')) { + if (this.#currentGlanceID && !this._duringOpening) { + this.quickCloseGlance(); + } return; } - if (gBrowser.selectedTab === this.currentParentTab && this.#currentBrowser) { - this.quickOpenGlance(); - } else if ((!this.animatingFullOpen || this.animatingOpen) && this.#currentBrowser) { - this.closeGlance(); + if (this.#currentGlanceID && this.#currentGlanceID !== tab.getAttribute('glance-id')) { + this.quickCloseGlance(); + } + this.#currentGlanceID = tab.getAttribute('glance-id'); + if (gBrowser.selectedTab === this.#currentParentTab && this.#currentBrowser) { + const curTab = this.#currentTab; + setTimeout(() => { + gBrowser.selectedTab = curTab; + }, 0); + } else if (gBrowser.selectedTab === this.#currentTab) { + setTimeout(this.onLocationChangeOpenGlance.bind(this), 0); } } onTabClose(event) { - if (event.target === this.currentParentTab) { + if (event.target === this.#currentParentTab) { this.closeGlance({ onTabClose: true }); } } + manageTabClose(tab) { + if (tab.hasAttribute('glance-id')) { + const oldGlanceID = this.#currentGlanceID; + const newGlanceID = tab.getAttribute('glance-id'); + this.#currentGlanceID = newGlanceID; + const isDifferent = newGlanceID !== oldGlanceID; + if (this._ignoreClose) { + this._ignoreClose = false; + return false; + } + this.closeGlance({ onTabClose: true, setNewID: isDifferent ? oldGlanceID : null, isDifferent }); + // only keep continueing tab close if we are not on the currently selected tab + return !isDifferent; + } + return false; + } + tabDomainsDiffer(tab1, url2) { try { if (!tab1) { @@ -350,29 +486,41 @@ } fullyOpenGlance() { + this.animatingFullOpen = true; gBrowser._insertTabAtIndex(this.#currentTab, { index: this.getTabPosition(this.#currentTab), }); - this.animatingFullOpen = true; - this.currentParentTab._visuallySelected = false; - this.browserWrapper.removeAttribute('style'); this.browserWrapper.removeAttribute('has-finished-animation'); this.browserWrapper.setAttribute('animate-full', true); this.#currentTab.removeAttribute('zen-glance-tab'); + this.#currentTab.removeAttribute('glance-id'); + this.#currentParentTab.removeAttribute('glance-id'); gBrowser.selectedTab = this.#currentTab; - this.currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('zen-glance-background'); - setTimeout(() => { - window.requestAnimationFrame(() => { - this.browserWrapper.setAttribute('animate-full-end', true); + this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('zen-glance-background'); + this.#currentParentTab._visuallySelected = false; + this.hideSidebarButtons(); + gZenUIManager.motion + .animate( + this.browserWrapper, + { + width: ['85%', '100%'], + height: ['100%', '100%'], + }, + { + duration: 0.4, + type: 'spring', + } + ) + .then(() => { + this.browserWrapper.removeAttribute('animate-full'); this.overlay.classList.remove('zen-glance-overlay'); - setTimeout(() => { - this.animatingFullOpen = false; - this.closeGlance({ noAnimation: true }); - }, 600); + this.browserWrapper.removeAttribute('style'); + this.animatingFullOpen = false; + this.closeGlance({ noAnimation: true }); + this.#glances.delete(this.#currentGlanceID); }); - }, 300); } openGlanceForBookmark(event) { @@ -406,6 +554,10 @@ return false; } + + getFocusedTab(aDir) { + return aDir < 0 ? this.#currentParentTab : this.#currentTab; + } } window.gZenGlanceManager = new ZenGlanceManager(); @@ -422,6 +574,7 @@ DOMContentLoaded: {}, }, }, + matches: ['https://*/*'], }); } } diff --git a/src/browser/base/zen-components/ZenGradientGenerator.mjs b/src/browser/base/zen-components/ZenGradientGenerator.mjs index 8080d686a..59a19671a 100644 --- a/src/browser/base/zen-components/ZenGradientGenerator.mjs +++ b/src/browser/base/zen-components/ZenGradientGenerator.mjs @@ -37,7 +37,6 @@ this.initCanvas(); this.initCustomColorInput(); - ZenWorkspaces.addChangeListeners(this.onWorkspaceChange.bind(this)); window.matchMedia('(prefers-color-scheme: dark)').addListener(this.onDarkModeChange.bind(this)); } @@ -614,7 +613,7 @@ // Reactivate the transition after the animation appWrapper.removeAttribute('post-animating'); }, 100); - }, 500); + }, 200); }); } @@ -726,7 +725,7 @@ if (!skipSave) { await ZenWorkspacesStorage.saveWorkspaceTheme(currentWorkspace.uuid, gradient); await ZenWorkspaces._propagateWorkspaceData(); - ConfirmationHint.show(document.getElementById('PanelUI-menu-button'), 'zen-panel-ui-gradient-generator-saved-message'); + gZenUIManager.showToast('zen-panel-ui-gradient-generator-saved-message'); currentWorkspace = await ZenWorkspaces.getActiveWorkspace(); } diff --git a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs index dee74be78..986dd3d26 100644 --- a/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs +++ b/src/browser/base/zen-components/ZenKeyboardShortcuts.mjs @@ -80,6 +80,7 @@ const defaultKeyboardGroups = { 'zen-search-find-again-shortcut-prev', ], pageOperations: [ + 'zen-text-action-copy-url-markdown-shortcut', 'zen-text-action-copy-url-shortcut', 'zen-location-open-shortcut', 'zen-location-open-shortcut-alt', @@ -755,7 +756,7 @@ class ZenKeyboardShortcutsLoader { } class ZenKeyboardShortcutsVersioner { - static LATEST_KBS_VERSION = 7; + static LATEST_KBS_VERSION = 8; constructor() {} @@ -809,6 +810,20 @@ class ZenKeyboardShortcutsVersioner { return this.migrateIfNeeded(data); } + fillDefaultIfNotPresent(data) { + for (let shortcut of ZenKeyboardShortcutsLoader.zenGetDefaultShortcuts()) { + // If it has an ID and we dont find it in the data, we add it + if (shortcut.getID() && !data.find((s) => s.getID() == shortcut.getID())) { + data.push(shortcut); + } + } + return data; + } + + fixedKeyboardShortcuts(data) { + return this.fillDefaultIfNotPresent(this.migrateIfNeeded(data)); + } + migrate(data, version) { if (version < 1) { // Migrate from 0 to 1 @@ -907,6 +922,21 @@ class ZenKeyboardShortcutsVersioner { gZenKeyboardShortcutsManager._hasToLoadDefaultDevtools = true; window.addEventListener('zen-devtools-keyset-added', listener); } + if (version < 8) { + // Migrate from 7 to 8 + // In this new version, we add the "Copy URL as Markdown" shortcut to the default shortcuts + data.push( + new KeyShortcut( + 'zen-copy-url-markdown', + 'C', + '', + ZEN_OTHER_SHORTCUTS_GROUP, + KeyShortcutModifiers.fromObject({ accel: true, shift: true, alt: true }), + 'code:gZenCommonActions.copyCurrentURLAsMarkdownToClipboard()', + 'zen-text-action-copy-url-markdown-shortcut' + ) + ); + } return data; } } @@ -934,7 +964,7 @@ var gZenKeyboardShortcutsManager = { if (this.inBrowserView) { const loadedShortcuts = await this._loadSaved(); - this._currentShortcutList = this.versioner.migrateIfNeeded(loadedShortcuts); + this._currentShortcutList = this.versioner.fixedKeyboardShortcuts(loadedShortcuts); this._applyShortcuts(); await this._saveShortcuts(); diff --git a/src/browser/base/zen-components/ZenPinnedTabManager.mjs b/src/browser/base/zen-components/ZenPinnedTabManager.mjs index 056ad76ca..084cb0ad1 100644 --- a/src/browser/base/zen-components/ZenPinnedTabManager.mjs +++ b/src/browser/base/zen-components/ZenPinnedTabManager.mjs @@ -69,7 +69,9 @@ return; } - await this._refreshPinnedTabs(newWorkspace, { init: onInit }); + if (onInit) { + await this._refreshPinnedTabs(newWorkspace, { init: onInit }); + } } log(message) { @@ -152,7 +154,7 @@ const pinsToCreate = new Set(pins.map((p) => p.uuid)); // First pass: identify existing tabs and remove those without pins - for (let tab of gBrowser.tabs) { + for (let tab of ZenWorkspaces.allStoredTabs) { const pinId = tab.getAttribute('zen-pin-id'); if (!pinId) { continue; @@ -178,10 +180,6 @@ continue; // Skip pins that already have tabs } - if (!this._shouldShowPin(pin, currentWorkspace, workspaces)) { - continue; // Skip pins not relevant to current workspace - } - let params = { skipAnimation: true, allowInheritPrincipal: false, @@ -234,6 +232,13 @@ this.log(`Created new pinned tab for pin ${pin.uuid} (isEssential: ${pin.isEssential})`); gBrowser.pinTab(newTab); + if (!pin.isEssential) { + const contaienr = document.querySelector( + `#vertical-pinned-tabs-container .zen-workspace-tabs-section[zen-workspace-id="${pin.workspaceUuid}"]` + ); + contaienr.insertBefore(newTab, contaienr.lastChild); + } + gBrowser.tabContainer._invalidateCachedTabs(); newTab.initialize(); } @@ -244,43 +249,7 @@ } gBrowser._updateTabBarForPinnedTabs(); - } - - _shouldShowPin(pin, currentWorkspace, workspaces) { - const isEssential = pin.isEssential; - const pinWorkspaceUuid = pin.workspaceUuid; - const pinContextId = pin.containerTabId ? pin.containerTabId.toString() : '0'; - const workspaceContextId = currentWorkspace.containerTabId?.toString() || '0'; - const containerSpecificEssentials = ZenWorkspaces.containerSpecificEssentials; - - // Handle essential pins - if (isEssential) { - if (!containerSpecificEssentials) { - return true; // Show all essential pins when containerSpecificEssentials is false - } - - if (workspaceContextId !== '0') { - // In workspaces with default container: Show essentials that match the container - return pinContextId === workspaceContextId; - } else { - // In workspaces without a default container: Show essentials that aren't in container-specific workspaces - // or have userContextId="0" or no userContextId - return ( - !pinContextId || - pinContextId === '0' || - !workspaces.workspaces.some((workspace) => workspace.containerTabId === parseInt(pinContextId, 10)) - ); - } - } - - // For non-essential pins - if (!pinWorkspaceUuid) { - // Pins without a workspace belong to all workspaces (if that's your desired behavior) - return true; - } - - // Show if pin belongs to current workspace - return pinWorkspaceUuid === currentWorkspace.uuid; + gZenUIManager.updateTabsToolbar(); } _onPinnedTabEvent(action, event) { @@ -321,12 +290,19 @@ for (let otherTab of gBrowser.tabs) { if (otherTab.pinned && otherTab._tPos > tab.position) { const actualPin = this._pinsCache.find((pin) => pin.uuid === otherTab.getAttribute('zen-pin-id')); + if (!actualPin) { + continue; + } actualPin.position = otherTab._tPos; await ZenPinnedTabsStorage.savePin(actualPin, false); } } const actualPin = this._pinsCache.find((pin) => pin.uuid === tab.getAttribute('zen-pin-id')); + + if (!actualPin) { + return; + } actualPin.position = tab.position; await ZenPinnedTabsStorage.savePin(actualPin); } @@ -446,7 +422,7 @@ } } - _onCloseTabShortcut(event, selectedTab = gBrowser.selectedTab) { + _onCloseTabShortcut(event, selectedTab = gBrowser.selectedTab, behavior = lazy.zenPinnedTabCloseShortcutBehavior) { if (!selectedTab?.pinned) { return; } @@ -454,8 +430,6 @@ event.stopPropagation(); event.preventDefault(); - const behavior = lazy.zenPinnedTabCloseShortcutBehavior; - switch (behavior) { case 'close': this._removePinnedAttributes(selectedTab, true); @@ -470,6 +444,9 @@ this._resetTabToStoredState(selectedTab); } if (behavior.includes('unload')) { + if (selectedTab.hasAttribute('glance-id')) { + break; + } gBrowser.explicitUnloadTabs([selectedTab]); selectedTab.removeAttribute('linkedpanel'); } @@ -557,8 +534,8 @@ } } - addToEssentials() { - const tabs = TabContextMenu.contextTab.multiselected ? gBrowser.selectedTabs : [TabContextMenu.contextTab]; + addToEssentials(tab) { + const tabs = tab ? [tab] : TabContextMenu.contextTab.multiselected ? gBrowser.selectedTabs : [TabContextMenu.contextTab]; for (let i = 0; i < tabs.length; i++) { const tab = tabs[i]; tab.setAttribute('zen-essential', 'true'); @@ -575,8 +552,8 @@ gZenUIManager.updateTabsToolbar(); } - removeEssentials() { - const tabs = TabContextMenu.contextTab.multiselected ? gBrowser.selectedTabs : [TabContextMenu.contextTab]; + removeEssentials(tab) { + const tabs = tab ? [tab] : TabContextMenu.contextTab.multiselected ? gBrowser.selectedTabs : [TabContextMenu.contextTab]; for (let i = 0; i < tabs.length; i++) { const tab = tabs[i]; tab.removeAttribute('zen-essential'); @@ -640,6 +617,172 @@ document.getElementById('context_unpinSelectedTabs').hidden || contextTab.getAttribute('zen-essential'); document.getElementById('context_zen-pinned-tab-separator').hidden = !isVisible; } + + moveToAnotherTabContainerIfNecessary(event, movingTabs) { + const pinnedTabsTarget = + event.target.closest('#vertical-pinned-tabs-container') || event.target.closest('.zen-current-workspace-indicator'); + const essentialTabsTarget = event.target.closest('#zen-essentials-container'); + const tabsTarget = event.target.closest('#tabbrowser-arrowscrollbox'); + + let isVertical = this.expandedSidebarMode; + let moved = false; + for (const draggedTab of movingTabs) { + let isRegularTabs = false; + // Check for pinned tabs container + if (pinnedTabsTarget) { + if (!draggedTab.pinned) { + gBrowser.pinTab(draggedTab); + moved = true; + } else if (draggedTab.hasAttribute('zen-essential')) { + this.removeEssentials(draggedTab); + gBrowser.pinTab(draggedTab); + moved = true; + } + } + // Check for essentials container + else if (essentialTabsTarget) { + if (!draggedTab.hasAttribute('zen-essential')) { + this.addToEssentials(draggedTab); + moved = true; + isVertical = false; + } + } + // Check for normal tabs container + else if (tabsTarget || event.target.id === 'zen-tabs-wrapper') { + if (draggedTab.pinned && !draggedTab.hasAttribute('zen-essential')) { + gBrowser.unpinTab(draggedTab); + moved = true; + isRegularTabs = true; + } else if (draggedTab.hasAttribute('zen-essential')) { + this.removeEssentials(draggedTab); + moved = true; + isRegularTabs = true; + } + } + + // If the tab was moved, adjust its position relative to the target tab + if (moved) { + const targetTab = event.target.closest('.tabbrowser-tab'); + if (targetTab) { + const rect = targetTab.getBoundingClientRect(); + let newIndex = targetTab._tPos; + + if (isVertical) { + const middleY = targetTab.screenY + rect.height / 2; + if (!isRegularTabs && event.screenY > middleY) { + newIndex++; + } else if (isRegularTabs && event.screenY < middleY) { + newIndex--; + } + } else { + const middleX = targetTab.screenX + rect.width / 2; + if (event.screenX > middleX) { + newIndex++; + } + } + gBrowser.moveTabTo(draggedTab, newIndex); + } + } + } + + return moved; + } + + removeTabContainersDragoverClass() { + this.dragIndicator.remove(); + this._dragIndicator = null; + ZenWorkspaces.activeWorkspaceIndicator.removeAttribute('open'); + } + + get dragIndicator() { + if (!this._dragIndicator) { + this._dragIndicator = document.createElement('div'); + this._dragIndicator.id = 'zen-drag-indicator'; + document.body.appendChild(this._dragIndicator); + } + return this._dragIndicator; + } + + get expandedSidebarMode() { + return document.documentElement.getAttribute('zen-sidebar-expanded') === 'true'; + } + + applyDragoverClass(event, draggedTab) { + const pinnedTabsTarget = event.target.closest('#vertical-pinned-tabs-container'); + const essentialTabsTarget = event.target.closest('#zen-essentials-container'); + const tabsTarget = event.target.closest('#tabbrowser-arrowscrollbox'); + const targetTab = event.target.closest('.tabbrowser-tab'); + if (event.target.closest('.zen-current-workspace-indicator')) { + this.removeTabContainersDragoverClass(); + ZenWorkspaces.activeWorkspaceIndicator.setAttribute('open', true); + } else { + ZenWorkspaces.activeWorkspaceIndicator.removeAttribute('open'); + } + + // If there's no valid target tab, nothing to do + if (!targetTab) { + return; + } + + let shouldAddDragOverElement = false; + let isVertical = this.expandedSidebarMode; + + // Decide whether we should show a dragover class for the given target + if (pinnedTabsTarget) { + if (!draggedTab.pinned || draggedTab.hasAttribute('zen-essential')) { + shouldAddDragOverElement = true; + } + } else if (essentialTabsTarget) { + if (!draggedTab.hasAttribute('zen-essential')) { + shouldAddDragOverElement = true; + isVertical = false; + } + } else if (tabsTarget) { + if (draggedTab.pinned || draggedTab.hasAttribute('zen-essential')) { + shouldAddDragOverElement = true; + } + } + + if (!shouldAddDragOverElement) { + this.removeTabContainersDragoverClass(); + return; + } + + // Calculate middle to decide 'before' or 'after' + const rect = targetTab.getBoundingClientRect(); + + if (isVertical) { + const separation = 8; + const middleY = targetTab.screenY + rect.height / 2; + const indicator = this.dragIndicator; + let top = 0; + if (event.screenY > middleY) { + top = rect.top + rect.height + 'px'; + } else { + top = rect.top + 'px'; + } + indicator.setAttribute('orientation', 'horizontal'); + indicator.style.setProperty('--indicator-left', rect.left + separation / 2 + 'px'); + indicator.style.setProperty('--indicator-width', rect.width - separation + 'px'); + indicator.style.top = top; + indicator.style.removeProperty('left'); + } else { + const separation = 8; + const middleX = targetTab.screenX + rect.width / 2; + const indicator = this.dragIndicator; + let left = 0; + if (event.screenX > middleX) { + left = rect.left + rect.width + 1 + 'px'; + } else { + left = rect.left - 2 + 'px'; + } + indicator.setAttribute('orientation', 'vertical'); + indicator.style.setProperty('--indicator-top', rect.top + separation / 2 + 'px'); + indicator.style.setProperty('--indicator-height', rect.height - separation + 'px'); + indicator.style.left = left; + indicator.style.removeProperty('top'); + } + } } window.gZenPinnedTabManager = new ZenPinnedTabManager(); diff --git a/src/browser/base/zen-components/ZenPinnedTabsStorage.mjs b/src/browser/base/zen-components/ZenPinnedTabsStorage.mjs index 7e5ab6017..b47850b4e 100644 --- a/src/browser/base/zen-components/ZenPinnedTabsStorage.mjs +++ b/src/browser/base/zen-components/ZenPinnedTabsStorage.mjs @@ -46,7 +46,6 @@ var ZenPinnedTabsStorage = { CREATE INDEX IF NOT EXISTS idx_zen_pins_changes_uuid ON zen_pins_changes(uuid) `); - await SessionStore.promiseInitialized; this._resolveInitialized(); }); }, diff --git a/src/browser/base/zen-components/ZenTabUnloader.mjs b/src/browser/base/zen-components/ZenTabUnloader.mjs index a9a29a16a..e14b606ab 100644 --- a/src/browser/base/zen-components/ZenTabUnloader.mjs +++ b/src/browser/base/zen-components/ZenTabUnloader.mjs @@ -173,7 +173,7 @@ } handleTabClose(tab) { - // Nothing yet + tab.lastActivity = null; } handleTabOpen(tab) { @@ -226,7 +226,7 @@ unloadTab() { const tabs = TabContextMenu.contextTab.multiselected ? gBrowser.selectedTabs : [TabContextMenu.contextTab]; for (let i = 0; i < tabs.length; i++) { - if (this.canUnloadTab(tabs[i], Date.now(), [], true)) { + if (this.canUnloadTab(tabs[i], Date.now(), this.intervalUnloader.excludedUrls, true)) { this.unload(tabs[i]); } } @@ -258,6 +258,7 @@ !tab.linkedPanel || tab.splitView || tab.attention || + tab.hasAttribute('glance-id') || tab.linkedBrowser?.zenModeActive || (tab.pictureinpicture && !ignoreTimestamp) || (tab.soundPlaying && !ignoreTimestamp) || diff --git a/src/browser/base/zen-components/ZenUIMigration.mjs b/src/browser/base/zen-components/ZenUIMigration.mjs new file mode 100644 index 000000000..6aa1454b7 --- /dev/null +++ b/src/browser/base/zen-components/ZenUIMigration.mjs @@ -0,0 +1,63 @@ +const lazy = {}; + +ChromeUtils.defineESModuleGetters(lazy, { + BrowserWindowTracker: 'resource:///modules/BrowserWindowTracker.sys.mjs', +}); + +class ZenUIMigration { + PREF_NAME = 'zen.migration.version'; + MIGRATION_VERSION = 1; + + init(isNewProfile, win) { + if (!isNewProfile) { + this._migrate(win); + } + this.clearVariables(); + } + + get _migrationVersion() { + return Services.prefs.getIntPref(this.PREF_NAME, 0); + } + + set _migrationVersion(value) { + Services.prefs.setIntPref(this.PREF_NAME, value); + } + + _migrate(win) { + if (this._migrationVersion < 1) { + this._migrateV1(win); + } + } + + clearVariables() { + this._migrationVersion = this.MIGRATION_VERSION; + } + + async _migrateV1(win) { + // Introduction of the new URL bar, show a message to the user + const notification = win.gNotificationBox.appendNotification( + 'zen-new-urlbar-notification', + { + label: { 'l10n-id': 'zen-new-urlbar-notification' }, + image: 'chrome://browser/skin/notification-icons/persistent-storage-blocked.svg', + priority: win.gNotificationBox.PRIORITY_WARNING_HIGH, + }, + [ + { + 'l10n-id': 'zen-disable', + accessKey: 'D', + callback: () => { + Services.prefs.setBoolPref('zen.urlbar.replace-newtab', false); + }, + }, + { + link: 'https://docs.zen-browser.app/user-manual/urlbar/', + 'l10n-id': 'zen-learn-more-text', + }, + ] + ); + notification.persistence = -1; + } +} + +export var gZenUIMigration = new ZenUIMigration(); diff --git a/src/browser/base/zen-components/ZenViewSplitter.mjs b/src/browser/base/zen-components/ZenViewSplitter.mjs index fb715e2a5..2224f6c5c 100644 --- a/src/browser/base/zen-components/ZenViewSplitter.mjs +++ b/src/browser/base/zen-components/ZenViewSplitter.mjs @@ -192,14 +192,13 @@ class ZenViewSplitter extends ZenDOMOperatedFeature { afterRearangeAction() { document.getElementById('zenSplitViewModifier').hidePopup(); - ConfirmationHint.show(document.getElementById('zen-split-views-box'), 'zen-split-view-modifier-enabled-toast', { + gZenUIManager.showToast('zen-split-view-modifier-enabled-toast', { descriptionId: 'zen-split-view-modifier-enabled-toast-description', - showDescription: true, }); } afterRearangeRemove() { - ConfirmationHint.show(document.getElementById('zen-split-views-box'), 'zen-split-view-modifier-disabled-toast'); + gZenUIManager.showToast('zen-split-view-modifier-disabled-toast'); } toggleWrapperDisplay(value) { diff --git a/src/browser/base/zen-components/ZenWorkspaces.mjs b/src/browser/base/zen-components/ZenWorkspaces.mjs index e4d4121e7..7baabccac 100644 --- a/src/browser/base/zen-components/ZenWorkspaces.mjs +++ b/src/browser/base/zen-components/ZenWorkspaces.mjs @@ -8,7 +8,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { _swipeState = { isGestureActive: true, - cumulativeDelta: 0, + lastDelta: 0, direction: null, }; _lastScrollTime = 0; @@ -28,13 +28,22 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { this._resolvePinnedInitialized = resolve; }); + promiseSectionsInitialized = new Promise((resolve) => { + this._resolveSectionsInitialized = resolve; + }); + + workspaceIndicatorXUL = ` + + + `; + async waitForPromises() { - await Promise.all([this.promiseDBInitialized, this.promisePinnedInitialized, SessionStore.promiseAllWindowsRestored]); + await Promise.all([this.promiseDBInitialized, this.promisePinnedInitialized]); } async init() { if (!this.shouldHaveWorkspaces) { - document.getElementById('zen-current-workspace-indicator').setAttribute('hidden', 'true'); + document.getElementById('zen-current-workspace-indicator-container').setAttribute('hidden', 'true'); console.warn('ZenWorkspaces: !!! ZenWorkspaces is disabled in hidden windows !!!'); return; // We are in a hidden window, don't initialize ZenWorkspaces } @@ -70,17 +79,25 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { ); ChromeUtils.defineLazyGetter(this, 'tabContainer', () => document.getElementById('tabbrowser-tabs')); this._activeWorkspace = Services.prefs.getStringPref('zen.workspaces.active', ''); - this._delayedStartup(); + await SessionStore.promiseInitialized; + if (!this._hasInitializedTabsStrip) { + await this.delayedStartup(); + } + await this.promiseSectionsInitialized; + window.addEventListener( + 'MozAfterPaint', + async () => { + await SessionStore.promiseAllWindowsRestored; + await this.afterLoadInit(); + }, + { once: true } + ); } - async _delayedStartup() { - if (!this.workspaceEnabled) { - return; - } - await this.waitForPromises(); - await this.initializeWorkspaces(); + async afterLoadInit() { console.info('ZenWorkspaces: ZenWorkspaces initialized'); + await this.initializeWorkspaces(); if (Services.prefs.getBoolPref('zen.workspaces.swipe-actions', false) && this.workspaceEnabled) { this.initializeGestureHandlers(); this.initializeWorkspaceNavigation(); @@ -97,6 +114,137 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { ); } + async delayedStartup() { + if (!this.workspaceEnabled) { + return; + } + this._pinnedTabsResizeObserver = new ResizeObserver(this.onPinnedTabsResize.bind(this)); + await this.waitForPromises(); + await this.initializeTabsStripSections(); + this._resolveSectionsInitialized(); + } + + registerPinnedResizeObserver() { + if (!this._hasInitializedTabsStrip) { + return; + } + this._pinnedTabsResizeObserver.disconnect(); + for (let element of document.getElementById('vertical-pinned-tabs-container').children) { + if (element.classList.contains('tabbrowser-tab')) { + continue; + } + this._pinnedTabsResizeObserver.observe(element); + } + } + + get activeWorkspaceStrip() { + if (!this._hasInitializedTabsStrip) { + return gBrowser.tabContainer.arrowScrollbox; + } + const activeWorkspace = this.activeWorkspace; + return document.querySelector( + `#tabbrowser-arrowscrollbox .zen-workspace-tabs-section[zen-workspace-id="${activeWorkspace}"]` + ); + } + + get activeWorkspaceIndicator() { + return document.querySelector( + `#zen-current-workspace-indicator-container .zen-workspace-tabs-section[zen-workspace-id="${this.activeWorkspace}"]` + ); + } + + get tabboxChildren() { + return this.activeWorkspaceStrip.children; + } + + get pinnedTabsContainer() { + if (!this.workspaceEnabled || !this._hasInitializedTabsStrip) { + return document.getElementById('vertical-pinned-tabs-container'); + } + return document.querySelector( + `#vertical-pinned-tabs-container .zen-workspace-tabs-section[zen-workspace-id="${this.activeWorkspace}"]` + ); + } + + async initializeTabsStripSections() { + const perifery = document.getElementById('tabbrowser-arrowscrollbox-periphery'); + const tabs = gBrowser.tabContainer.allTabs; + const workspaces = await this._workspaces(); + for (const workspace of workspaces.workspaces) { + this._createWorkspaceTabsSection(workspace, tabs, perifery); + } + if (tabs.length) { + const defaultSelectedContainer = document.querySelector( + `#tabbrowser-arrowscrollbox .zen-workspace-tabs-section[zen-workspace-id="${this.activeWorkspace}"]` + ); + // New profile with no workspaces does not have a default selected container + if (defaultSelectedContainer) { + const pinnedContainer = document.querySelector( + `#vertical-pinned-tabs-container .zen-workspace-tabs-section[zen-workspace-id="${this.activeWorkspace}"]` + ); + for (const tab of tabs) { + if (tab.pinned) { + pinnedContainer.insertBefore(tab, pinnedContainer.lastChild); + continue; + } + // before to the last child (perifery) + defaultSelectedContainer.insertBefore(tab, defaultSelectedContainer.lastChild); + } + } + } + perifery.setAttribute('hidden', 'true'); + this._hasInitializedTabsStrip = true; + this.registerPinnedResizeObserver(); + this._fixIndicatorsNames(workspaces); + } + + _createWorkspaceSection(workspace) { + const section = document.createXULElement('vbox'); + section.className = 'zen-workspace-tabs-section'; + section.setAttribute('flex', '1'); + section.setAttribute('zen-workspace-id', workspace.uuid); + return section; + } + + async _createWorkspaceTabsSection(workspace, tabs, perifery) { + const container = gBrowser.tabContainer.arrowScrollbox; + const section = this._createWorkspaceSection(workspace); + container.appendChild(section); + + const pinnedContainer = document.getElementById('vertical-pinned-tabs-container'); + const pinnedSection = this._createWorkspaceSection(workspace); + this._organizeTabsToWorkspaceSections(workspace, section, pinnedSection, tabs); + section.appendChild(perifery.cloneNode(true)); + pinnedSection.appendChild( + window.MozXULElement.parseXULToFragment(` + + `) + ); + pinnedContainer.appendChild(pinnedSection); + + const workspaceIndicator = this._createWorkspaceSection(workspace); + workspaceIndicator.classList.add('zen-current-workspace-indicator'); + workspaceIndicator.appendChild(window.MozXULElement.parseXULToFragment(this.workspaceIndicatorXUL)); + document.getElementById('zen-current-workspace-indicator-container').appendChild(workspaceIndicator); + this.initIndicatorContextMenu(workspaceIndicator); + } + + _organizeTabsToWorkspaceSections(workspace, section, pinnedSection, tabs) { + const workspaceTabs = Array.from(tabs).filter((tab) => tab.getAttribute('zen-workspace-id') === workspace.uuid); + for (const tab of workspaceTabs) { + if (tab.hasAttribute('zen-essential')) { + continue; // Ignore essentials as they need to be in their own section + } + // remove tab from list + tabs.splice(tabs.indexOf(tab), 1); + if (tab.pinned) { + pinnedSection.appendChild(tab); + } else { + section.appendChild(tab); + } + } + } + initializeWorkspaceNavigation() { this._setupAppCommandHandlers(); this._setupSidebarHandlers(); @@ -207,7 +355,10 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { element.addEventListener('MozSwipeGestureMayStart', this._handleSwipeMayStart.bind(this), true); element.addEventListener('MozSwipeGestureStart', this._handleSwipeStart.bind(this), true); element.addEventListener('MozSwipeGestureUpdate', this._handleSwipeUpdate.bind(this), true); - element.addEventListener('MozSwipeGestureEnd', this._handleSwipeEnd.bind(this), true); + + // Use MozSwipeGesture instead of MozSwipeGestureEnd because MozSwipeGestureEnd is fired after animation ends, + // while MozSwipeGesture is fired immediately after swipe ends. + element.addEventListener('MozSwipeGesture', this._handleSwipeEnd.bind(this), true); } _handleSwipeMayStart(event) { @@ -231,7 +382,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { this._swipeState = { isGestureActive: true, - cumulativeDelta: 0, + lastDelta: 0, direction: null, }; } @@ -242,26 +393,19 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { event.preventDefault(); event.stopPropagation(); - // Update cumulative delta - this._swipeState.cumulativeDelta += event.delta; + const delta = event.delta * 300; + this._swipeState.lastDelta = delta; - // Determine swipe direction based on cumulative delta - if (Math.abs(this._swipeState.cumulativeDelta) > 1) { - this._swipeState.direction = this._swipeState.cumulativeDelta > 0 ? 'left' : 'right'; + if (Math.abs(delta) > 1) { + this._swipeState.direction = delta > 0 ? 'left' : 'right'; } // Apply a translateX to the tab strip to give the user feedback on the swipe const stripWidth = document.getElementById('tabbrowser-tabs').scrollWidth; - // To make the animation larger, we multiply the delta by 5 - let translateX = this._swipeState.cumulativeDelta * 10; - if (this._swipeState.direction === 'left') { - translateX = Math.min(translateX, stripWidth); - } else { - translateX = Math.max(translateX, -stripWidth); - } - for (const element of this._animateTabsElements) { - element.style.transform = `translateX(${translateX}px)`; - } + const translateX = Math.max(-stripWidth, Math.min(delta, stripWidth)); + + const currentWorkspace = this.activeWorkspace; + this._organizeWorkspaceStripLocations({ uuid: currentWorkspace }, true, translateX); } async _handleSwipeEnd(event) { @@ -274,7 +418,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { let rawDirection = moveForward ? 1 : -1; if (this._swipeState.direction) { let direction = this.naturalScroll ? -1 : 1; - this.changeWorkspaceShortcut(rawDirection * direction); + this.changeWorkspaceShortcut(rawDirection * direction, true); } else { this._cancelSwipeAnimation(); } @@ -282,7 +426,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { // Reset swipe state this._swipeState = { isGestureActive: false, - cumulativeDelta: 0, + lastDelta: 0, direction: null, }; } @@ -399,35 +543,28 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { this._initializeWorkspaceTabContextMenus(); await this.workspaceBookmarks(); window.addEventListener('TabBrowserInserted', this.onTabBrowserInserted.bind(this)); + window.addEventListener('TabOpen', this.updateTabsContainers.bind(this)); let workspaces = await this._workspaces(); let activeWorkspace = null; if (workspaces.workspaces.length === 0) { activeWorkspace = await this.createAndSaveWorkspace('Default Workspace', true, '🏠'); } else { activeWorkspace = await this.getActiveWorkspace(); - if (!activeWorkspace) { - activeWorkspace = workspaces.workspaces.find((workspace) => workspace.default); - this.activeWorkspace = activeWorkspace?.uuid; - } - if (!activeWorkspace) { - activeWorkspace = workspaces.workspaces[0]; - this.activeWorkspace = activeWorkspace?.uuid; - } + this.activeWorkspace = activeWorkspace?.uuid; } try { if (activeWorkspace) { window.gZenThemePicker = new ZenThemePicker(); await this.changeWorkspace(activeWorkspace, { onInit: true }); + gBrowser.tabContainer._positionPinnedTabs(); } } catch (e) { console.error('ZenWorkspaces: Error initializing theme picker', e); } } - this.initIndicatorContextMenu(); } - initIndicatorContextMenu() { - const indicator = document.getElementById('zen-current-workspace-indicator'); + initIndicatorContextMenu(indicator) { const th = (event) => { event.preventDefault(); event.stopPropagation(); @@ -639,7 +776,11 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { async getActiveWorkspace() { const workspaces = await this._workspaces(); - return workspaces.workspaces.find((workspace) => workspace.uuid === this.activeWorkspace) ?? workspaces.workspaces[0]; + return ( + workspaces.workspaces.find((workspace) => workspace.uuid === this.activeWorkspace) ?? + workspaces.workspaces.find((workspace) => workspace.default) ?? + workspaces.workspaces[0] + ); } // Workspaces dialog UI management @@ -741,7 +882,6 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { if (!browser.ZenWorkspaces.workspaceEnabled) { return; } - await browser.ZenWorkspaces.updateWorkspaceIndicator(); let workspaceList = browser.document.getElementById('PanelUI-zen-workspaces-list'); const createWorkspaceElement = (workspace) => { let element = browser.document.createXULElement('toolbarbutton'); @@ -1035,7 +1175,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { if (!this.workspaceEnabled) { return; } - let target = event.target.closest('#zen-current-workspace-indicator') || document.getElementById('zen-workspaces-button'); + let target = event.target.closest('.zen-current-workspace-indicator') || document.getElementById('zen-workspaces-button'); let panel = document.getElementById('PanelUI-zen-workspaces'); await this._propagateWorkspaceData({ ignoreStrip: true, @@ -1192,13 +1332,25 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { } } + moveTabToWorkspace(tab, workspaceID) { + if (tab.getAttribute('zen-workspace-id') === workspaceID) { + return; + } + tab.setAttribute('zen-workspace-id', workspaceID); + const parent = tab.pinned ? '#zen-browser-tabs-pinned ' : '#zen-browser-tabs '; + const container = document.querySelector(parent + '.zen-workspace-tabs-section'); + if (container) { + container.insertBefore(tab, container.firstChild); + } + } + _prepareNewWorkspace(window) { document.documentElement.setAttribute('zen-workspace-id', window.uuid); let tabCount = 0; for (let tab of gBrowser.tabs) { const isEssential = tab.getAttribute('zen-essential') === 'true'; if (!tab.hasAttribute('zen-workspace-id') && !tab.pinned && !isEssential) { - tab.setAttribute('zen-workspace-id', window.uuid); + this.moveTabToWorkspace(tab, window.uuid); tabCount++; } } @@ -1213,6 +1365,8 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { if (window.uuid) { tab.setAttribute('zen-workspace-id', window.uuid); } + + return tab; } async saveWorkspaceFromCreate() { @@ -1277,39 +1431,24 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { if (!this.workspaceEnabled || this._inChangingWorkspace) { return; } - - await SessionStore.promiseInitialized; this._inChangingWorkspace = true; try { await this._performWorkspaceChange(window, ...args); } finally { this._inChangingWorkspace = false; - this.tabContainer.removeAttribute('dont-animate-tabs'); } } _cancelSwipeAnimation() { - const existingTransform = this._animateTabsElements[0].style.transform; - const newTransform = 'translateX(0)'; - for (const element of this._animateTabsElements) { - gZenUIManager.motion.animate( - element, - { - transform: existingTransform ? [existingTransform, newTransform] : newTransform, - }, - { - type: 'spring', - bounce: 0, - duration: 0.12, - } - ); - } + const currentWorkspace = this.activeWorkspace; + this._animateTabs({ uuid: currentWorkspace }, true); } - async _performWorkspaceChange(window, { onInit = false, explicitAnimationDirection = undefined } = {}) { + async _performWorkspaceChange(window, { onInit = false, alwaysChange = false, whileScrolling = false } = {}) { const previousWorkspace = await this.getActiveWorkspace(); + alwaysChange = alwaysChange || onInit; - if (previousWorkspace && previousWorkspace.uuid === window.uuid && !onInit) { + if (previousWorkspace && previousWorkspace.uuid === window.uuid && !alwaysChange) { this._cancelSwipeAnimation(); return; } @@ -1319,105 +1458,130 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { const workspaces = await this._workspaces(); // Refresh tab cache + gBrowser.verticalPinnedTabsContainer = this.pinnedTabsContainer; + gBrowser.tabContainer.verticalPinnedTabsContainer = this.pinnedTabsContainer; this.tabContainer._invalidateCachedTabs(); - - let animationDirection; - if (previousWorkspace && !onInit && !this._animatingChange) { - animationDirection = - explicitAnimationDirection ?? - (workspaces.workspaces.findIndex((w) => w.uuid === previousWorkspace.uuid) < - workspaces.workspaces.findIndex((w) => w.uuid === window.uuid) - ? 'right' - : 'left'); - } - if (animationDirection) { - // Animate tabs out of view before changing workspace, therefor we - // need to animate in the opposite direction - await this._animateTabs(animationDirection === 'left' ? 'right' : 'left', true); + if (!whileScrolling) { + await this._organizeWorkspaceStripLocations(previousWorkspace); } // First pass: Handle tab visibility and workspace ID assignment - const visibleTabs = this._processTabVisibility(window.uuid, containerId, workspaces); + this._processTabVisibility(window.uuid, containerId, workspaces); // Second pass: Handle tab selection - await this._handleTabSelection(window, onInit, visibleTabs, containerId, workspaces); + this.tabContainer._invalidateCachedTabs(); + const tabToSelect = await this._handleTabSelection(window, onInit, containerId, workspaces, previousWorkspace.uuid); // Update UI and state - await this._updateWorkspaceState(window, onInit); + await this._updateWorkspaceState(window, onInit, tabToSelect); + } - if (animationDirection) { - await this._animateTabs(animationDirection); + _updateMarginTopPinnedTabs(arrowscrollbox, pinnedContainer) { + if (arrowscrollbox) { + arrowscrollbox.style.marginTop = pinnedContainer.getBoundingClientRect().height + 'px'; } } - get _animateTabsElements() { - const selector = `#zen-browser-tabs-wrapper`; - const extraSelector = `#zen-current-workspace-indicator`; - return [...this.tabContainer.querySelectorAll(selector), ...this.tabContainer.querySelectorAll(extraSelector)]; - } - - async _animateTabs(direction, out = false) { - this.tabContainer.removeAttribute('dont-animate-tabs'); - const tabsWidth = this.tabContainer.getBoundingClientRect().width; - // order by actual position in the children list to animate - const elements = this._animateTabsElements; - if (out) { - const existingTransform = elements[0].style.transform; - const newTransform = `translateX(${direction === 'left' ? '-' : ''}${tabsWidth}px)`; - return gZenUIManager.motion.animate( - elements, - { - transform: existingTransform ? [existingTransform, newTransform] : newTransform, - }, - { - type: 'spring', - bounce: 0, - duration: 0.12, + async _organizeWorkspaceStripLocations(workspace, justMove = false, offsetPixels = 0) { + const workspaces = await this._workspaces(); + let workspaceIndex = workspaces.workspaces.findIndex((w) => w.uuid === workspace.uuid); + if (!justMove) { + this._fixIndicatorsNames(workspaces); + } + for (const otherWorkspace of workspaces.workspaces) { + const selector = `.zen-workspace-tabs-section[zen-workspace-id="${otherWorkspace.uuid}"]`; + const newTransform = -(workspaceIndex - workspaces.workspaces.indexOf(otherWorkspace)) * 100; + for (const container of document.querySelectorAll(selector)) { + container.style.transform = `translateX(${newTransform + offsetPixels / 2}%)`; + container.style.opacity = offsetPixels ? 1 : !newTransform; + if (!offsetPixels && !container.hasAttribute('active')) { + container.setAttribute('hidden', 'true'); + } else { + container.removeAttribute('hidden'); } - ); - } - return gZenUIManager.motion.animate( - elements, - { - transform: [`translateX(${direction === 'left' ? '-' : ''}${tabsWidth}px)`, 'translateX(0px)'], - }, - { - duration: 0.15, - type: 'spring', - bounce: 0, } - ); + } + } + + updateWorkspaceIndicator(currentWorkspace, workspaceIndicator) { + if (!workspaceIndicator) { + return; + } + const indicatorName = workspaceIndicator.querySelector('.zen-current-workspace-indicator-name'); + const indicatorIcon = workspaceIndicator.querySelector('.zen-current-workspace-indicator-icon'); + + if (this.workspaceHasIcon(currentWorkspace)) { + indicatorIcon.removeAttribute('no-icon'); + } else { + indicatorIcon.setAttribute('no-icon', 'true'); + } + indicatorIcon.textContent = this.getWorkspaceIcon(currentWorkspace); + indicatorName.textContent = currentWorkspace.name; + } + + _fixIndicatorsNames(workspaces) { + for (const workspace of workspaces.workspaces) { + const workspaceIndicator = document.querySelector( + `#zen-current-workspace-indicator-container .zen-workspace-tabs-section[zen-workspace-id="${workspace.uuid}"]` + ); + this.updateWorkspaceIndicator(workspace, workspaceIndicator); + } + } + + async _animateTabs(newWorkspace, shouldAnimate, tabToSelect = null) { + this._animatingChange = true; + const animations = []; + const workspaces = await this._workspaces(); + const newWorkspaceIndex = workspaces.workspaces.findIndex((w) => w.uuid === newWorkspace.uuid); + for (const element of document.querySelectorAll('.zen-workspace-tabs-section')) { + const existingTransform = element.style.transform; + const elementWorkspaceId = element.getAttribute('zen-workspace-id'); + const elementWorkspaceIndex = workspaces.workspaces.findIndex((w) => w.uuid === elementWorkspaceId); + const offset = -(newWorkspaceIndex - elementWorkspaceIndex) * 100; + const newTransform = `translateX(${offset}%)`; + const isCurrent = offset === 0; + if (shouldAnimate) { + element.removeAttribute('hidden'); + if (isCurrent) { + element.style.opacity = 1; + } + animations.push( + gZenUIManager.motion.animate( + element, + { + transform: existingTransform ? [existingTransform, newTransform] : newTransform, + // -0 to convert to number + opacity: !isCurrent ? [!!offset - 0, !offset - 0] : [1, 1], + }, + { + type: 'spring', + bounce: 0, + duration: 0.3, + } + ) + ); + } + if (offset === 0) { + element.setAttribute('active', 'true'); + if (tabToSelect != gBrowser.selectedTab) { + gBrowser.selectedTab = tabToSelect; + } + } else { + element.removeAttribute('active'); + } + } + await Promise.all(animations); + this._animatingChange = false; } _processTabVisibility(workspaceUuid, containerId, workspaces) { - const visibleTabs = new Set(); - const lastSelectedTab = this._lastSelectedWorkspaceTabs[workspaceUuid]; - - this.tabContainer.setAttribute('dont-animate-tabs', 'true'); for (const tab of gBrowser.tabs) { - const tabWorkspaceId = tab.getAttribute('zen-workspace-id'); - const isEssential = tab.getAttribute('zen-essential') === 'true'; - - // Always hide last selected tabs from other workspaces - if (lastSelectedTab === tab && tabWorkspaceId !== workspaceUuid && !isEssential) { - gBrowser.hideTab(tab, undefined, true); - continue; - } - - if (this._shouldShowTab(tab, workspaceUuid, containerId, workspaces)) { - gBrowser.showTab(tab); - visibleTabs.add(tab); - - // Assign workspace ID if needed - if (!tabWorkspaceId && !isEssential) { - tab.setAttribute('zen-workspace-id', workspaceUuid); - } - } else { + if (!this._shouldShowTab(tab, workspaceUuid, containerId, workspaces)) { gBrowser.hideTab(tab, undefined, true); + } else if (tab.hasAttribute('zen-essential')) { + gBrowser.showTab(tab, undefined, true); } } - - return visibleTabs; } _shouldShowTab(tab, workspaceUuid, containerId, workspaces) { @@ -1448,7 +1612,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { // For non-essential tabs (both normal and pinned) if (!tabWorkspaceId) { // Assign workspace ID to tabs without one - tab.setAttribute('zen-workspace-id', workspaceUuid); + this.moveTabToWorkspace(tab, workspaceUuid); return true; } @@ -1456,9 +1620,9 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { return tabWorkspaceId === workspaceUuid; } - async _handleTabSelection(window, onInit, visibleTabs, containerId, workspaces) { + async _handleTabSelection(window, onInit, containerId, workspaces, previousWorkspaceId) { const currentSelectedTab = gBrowser.selectedTab; - const oldWorkspaceId = currentSelectedTab.getAttribute('zen-workspace-id'); + const oldWorkspaceId = previousWorkspaceId; const lastSelectedTab = this._lastSelectedWorkspaceTabs[window.uuid]; // Save current tab as last selected for old workspace if it shouldn't be visible in new workspace @@ -1467,53 +1631,54 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { } let tabToSelect = null; - - // If current tab is visible in new workspace, keep it - if (this._shouldShowTab(currentSelectedTab, window.uuid, containerId, workspaces) && visibleTabs.has(currentSelectedTab)) { - tabToSelect = currentSelectedTab; - } // Try last selected tab if it is visible - else if ( - lastSelectedTab && - this._shouldShowTab(lastSelectedTab, window.uuid, containerId, workspaces) && - visibleTabs.has(lastSelectedTab) - ) { + if (lastSelectedTab && this._shouldShowTab(lastSelectedTab, window.uuid, containerId, workspaces)) { tabToSelect = lastSelectedTab; } // Find first suitable tab else { - tabToSelect = Array.from(visibleTabs).find((tab) => !tab.pinned); + tabToSelect = gBrowser.visibleTabs.find((tab) => !tab.pinned); + if (!tabToSelect && gBrowser.visibleTabs.length) { + tabToSelect = gBrowser.visibleTabs[gBrowser.visibleTabs.length - 1]; + } } - const previousSelectedTab = gBrowser.selectedTab; - // If we found a tab to select, select it - if (tabToSelect) { - gBrowser.selectedTab = tabToSelect; - this._lastSelectedWorkspaceTabs[window.uuid] = tabToSelect; - } else if (!onInit) { + if (!onInit && !tabToSelect) { // Create new tab if needed and no suitable tab was found const newTab = this._createNewTabForWorkspace(window); - gBrowser.selectedTab = newTab; - this._lastSelectedWorkspaceTabs[window.uuid] = newTab; + tabToSelect = newTab; + } + if (tabToSelect) { + tabToSelect._visuallySelected = true; } - // After selecting the new tab, hide the previous selected tab if it shouldn't be visible in the new workspace - if (!this._shouldShowTab(previousSelectedTab, window.uuid, containerId, workspaces)) { - gBrowser.hideTab(previousSelectedTab, undefined, true); + // Always make sure we always unselect the tab from the old workspace + if (currentSelectedTab && currentSelectedTab !== tabToSelect) { + currentSelectedTab._selected = false; } + return tabToSelect; } - async _updateWorkspaceState(window, onInit) { + async _updateWorkspaceState(window, onInit, tabToSelect) { // Update document state document.documentElement.setAttribute('zen-workspace-id', window.uuid); + // Recalculate new tab observers + gBrowser.tabContainer.observe(null, 'nsPref:changed', 'privacy.userContext.enabled'); + // Update workspace UI await this._updateWorkspacesChangeContextMenu(); - document.getElementById('tabbrowser-tabs')._positionPinnedTabs(); gZenUIManager.updateTabsToolbar(); await this._propagateWorkspaceData({ clearCache: false }); + gZenThemePicker.onWorkspaceChange(window); + + document.getElementById('zen-tabs-wrapper').style.scrollbarWidth = 'none'; + await this._animateTabs(window, !onInit && !this._animatingChange, tabToSelect); + await this._organizeWorkspaceStripLocations(window, true); + document.getElementById('zen-tabs-wrapper').style.scrollbarWidth = ''; + // Notify listeners if (this._changeListeners?.length) { for (const listener of this._changeListeners) { @@ -1525,7 +1690,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { this._invalidateBookmarkContainers(); // Update workspace indicator - await this.updateWorkspaceIndicator(); + await this.updateWorkspaceIndicator(window, this.workspaceIndicator); } _invalidateBookmarkContainers() { @@ -1538,22 +1703,6 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { } } - async updateWorkspaceIndicator() { - // Update current workspace indicator - const currentWorkspace = await this.getActiveWorkspace(); - if (!currentWorkspace) return; - const indicatorName = document.getElementById('zen-current-workspace-indicator-name'); - const indicatorIcon = document.getElementById('zen-current-workspace-indicator-icon'); - - if (this.workspaceHasIcon(currentWorkspace)) { - indicatorIcon.removeAttribute('no-icon'); - } else { - indicatorIcon.setAttribute('no-icon', 'true'); - } - indicatorIcon.textContent = this.getWorkspaceIcon(currentWorkspace); - indicatorName.textContent = currentWorkspace.name; - } - async _updateWorkspacesChangeContextMenu() { const workspaces = await this._workspaces(); @@ -1578,7 +1727,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { } } - _createWorkspaceData(name, isDefault, icon) { + _createWorkspaceData(name, isDefault, icon, tabs) { let window = { uuid: gZenUIManager.generateUuidv4(), default: isDefault, @@ -1587,6 +1736,10 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { theme: ZenThemePicker.getTheme([]), }; this._prepareNewWorkspace(window); + const perifery = document.querySelector('#tabbrowser-arrowscrollbox-periphery[hidden]'); + perifery?.removeAttribute('hidden'); + this._createWorkspaceTabsSection(window, tabs, perifery); + perifery.setAttribute('hidden', 'true'); return window; } @@ -1594,12 +1747,49 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { if (!this.workspaceEnabled) { return; } - let workspaceData = this._createWorkspaceData(name, isDefault, icon); + // get extra tabs remaning (e.g. on new profiles) and just move them to the new workspace + const extraTabs = Array.from(gBrowser.tabContainer.arrowScrollbox.children).filter( + (child) => child.tagName === 'tab' && !child.hasAttribute('zen-workspace-id') + ); + let workspaceData = this._createWorkspaceData(name, isDefault, icon, extraTabs); await this.saveWorkspace(workspaceData); + this.registerPinnedResizeObserver(); + let changed = extraTabs.length > 0; + if (changed) { + gBrowser.tabContainer._invalidateCachedTabs(); + gBrowser.selectedTab = extraTabs[0]; + } await this.changeWorkspace(workspaceData); return workspaceData; } + updateTabsContainers() { + this.onPinnedTabsResize([{ target: this.pinnedTabsContainer }]); + } + + updateShouldHideSeparator(arrowScrollbox, pinnedContainer) { + const shouldHideSeparator = pinnedContainer.children.length === 1 || arrowScrollbox.children.length === 1; + if (shouldHideSeparator) { + pinnedContainer.setAttribute('hide-separator', 'true'); + } else { + pinnedContainer.removeAttribute('hide-separator'); + } + } + + onPinnedTabsResize(entries) { + if (!this._hasInitializedTabsStrip) { + return; + } + for (const entry of entries) { + const workspaceId = entry.target.getAttribute('zen-workspace-id'); + const arrowScrollbox = document.querySelector( + `#tabbrowser-arrowscrollbox .zen-workspace-tabs-section[zen-workspace-id="${workspaceId}"]` + ); + this._updateMarginTopPinnedTabs(arrowScrollbox, entry.target); + this.updateShouldHideSeparator(arrowScrollbox, entry.target); + } + } + async onTabBrowserInserted(event) { let tab = event.originalTarget; const isEssential = tab.getAttribute('zen-essential') === 'true'; @@ -1635,12 +1825,48 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { } // Switch workspace if needed - if (workspaceID && workspaceID !== activeWorkspace.uuid) { + if (workspaceID && workspaceID !== activeWorkspace.uuid && parent.ZenWorkspaces._hasInitializedTabsStrip) { await parent.ZenWorkspaces.changeWorkspace({ uuid: workspaceID }); } } } + makeSurePinTabIsInCorrectPosition() { + if (!this.pinnedTabsContainer) { + return 0; // until we initialize the pinned tabs container + } + const tabsInsidePinTab = Array.from(this.pinnedTabsContainer.parentElement.children).filter( + (child) => child.tagName === 'tab' + ); + let changed = false; + for (const tab of tabsInsidePinTab) { + if (tab.getAttribute('zen-glance-tab') === 'true') { + continue; + } + if (tab.getAttribute('zen-essential') === 'true') { + const container = document.getElementById('zen-essentials-container'); + container.appendChild(tab); + changed = true; + continue; + } + const workspaceId = tab.getAttribute('zen-workspace-id'); + if (!workspaceId) { + continue; + } + const contaienr = document.querySelector( + `#vertical-pinned-tabs-container .zen-workspace-tabs-section[zen-workspace-id="${workspaceId}"]` + ); + contaienr.insertBefore(tab, contaienr.firstChild); + changed = true; + } + if (changed) { + gBrowser.tabContainer._invalidateCachedTabs(); + } + // Return the number of essentials INSIDE the pinned tabs container so we can correctly change their parent + return Array.from(this.pinnedTabsContainer.children).filter((child) => child.getAttribute('zen-essential') === 'true') + .length; + } + // Context menu management _contextMenuId = null; @@ -1737,7 +1963,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { this._emojis = null; } - async changeWorkspaceShortcut(offset = 1) { + async changeWorkspaceShortcut(offset = 1, whileScrolling = false) { // Cycle through workspaces let workspaces = await this._workspaces(); let activeWorkspace = await this.getActiveWorkspace(); @@ -1754,7 +1980,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { } let nextWorkspace = workspaces.workspaces[targetIndex]; - await this.changeWorkspace(nextWorkspace, { explicitAnimationDirection: offset > 0 ? 'right' : 'left' }); + await this.changeWorkspace(nextWorkspace, { whileScrolling }); } _initializeWorkspaceTabContextMenus() { @@ -1776,7 +2002,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { document.getElementById('tabContextMenu').hidePopup(); const previousWorkspaceID = document.documentElement.getAttribute('zen-workspace-id'); for (let tab of tabs) { - tab.setAttribute('zen-workspace-id', workspaceID); + this.moveTabToWorkspace(tab, workspaceID); if (this._lastSelectedWorkspaceTabs[previousWorkspaceID] === tab) { // This tab is no longer the last selected tab in the previous workspace because it's being moved to // the current workspace @@ -1814,7 +2040,13 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { if (matchingWorkspaces.length === 1) { const workspace = matchingWorkspaces[0]; if (workspace.uuid !== this.getActiveWorkspaceFromCache().uuid) { - this.changeWorkspace(workspace); + window.addEventListener( + 'TabSelected', + (event) => { + this.changeWorkspace(workspace, { alwaysChange: true }); + }, + { once: true } + ); return [userContextId, true, workspace.uuid]; } } @@ -1863,4 +2095,43 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { // Return true only if the bookmark is in another workspace and not in the active one return isInOtherWorkspace && !isInActiveWorkspace; } + + // Session restore functions + get allStoredTabs() { + if (!this._hasInitializedTabsStrip) { + const children = Array.from(this.tabboxChildren); + children.pop(); // Remove the last child which is the new tab button + return children; + } + + const tabs = []; + // we need to go through each tab in each container + const essentialsContainer = document.getElementById('zen-essentials-container'); + const pinnedContainers = document.querySelectorAll('#vertical-pinned-tabs-container .zen-workspace-tabs-section'); + const normalContainers = document.querySelectorAll('#tabbrowser-arrowscrollbox .zen-workspace-tabs-section'); + const containers = [essentialsContainer, ...pinnedContainers, ...normalContainers]; + for (const container of containers) { + for (const tab of container.children) { + if (tab.tagName === 'tab' || tab.tagName == 'tab-group') { + tabs.push(tab); + } + } + } + return tabs; + } + + get pinnedTabCount() { + return this.pinnedTabsContainer.children.length - 1; + } + + get normalTabCount() { + return this.tabboxChildren.length - 1; + } + + get allWorkspaceTabs() { + const currentWorkspace = this.activeWorkspace; + return this.allStoredTabs.filter( + (tab) => tab.hasAttribute('zen-essential') || tab.getAttribute('zen-workspace-id') === currentWorkspace + ); + } })(); diff --git a/src/browser/base/zen-components/actors/ZenGlanceChild.sys.mjs b/src/browser/base/zen-components/actors/ZenGlanceChild.sys.mjs index 6a328f870..c43451375 100644 --- a/src/browser/base/zen-components/actors/ZenGlanceChild.sys.mjs +++ b/src/browser/base/zen-components/actors/ZenGlanceChild.sys.mjs @@ -96,7 +96,7 @@ export class ZenGlanceChild extends JSWindowActorChild { } handleClick(event) { - if (this.ensureOnlyKeyModifiers(event)) { + if (this.ensureOnlyKeyModifiers(event) || event.button !== 0 || event.defaultPrevented) { return; } const activationMethod = this._activationMethod; diff --git a/src/browser/base/zen-components/actors/ZenThemeMarketplaceParent.sys.mjs b/src/browser/base/zen-components/actors/ZenThemeMarketplaceParent.sys.mjs index e9c6d0622..ac5174e2c 100644 --- a/src/browser/base/zen-components/actors/ZenThemeMarketplaceParent.sys.mjs +++ b/src/browser/base/zen-components/actors/ZenThemeMarketplaceParent.sys.mjs @@ -122,10 +122,10 @@ export class ZenThemeMarketplaceParent extends JSWindowActorParent { } getStyleSheetFullContent(style = '') { - let stylesheet = '@-moz-document url-prefix("chrome:") {'; + let stylesheet = '@-moz-document url-prefix("chrome:") {\n'; for (const line of style.split('\n')) { - stylesheet += ` ${line}`; + stylesheet += ` ${line}\n`; } stylesheet += '}'; diff --git a/src/browser/components/BrowserGlue-sys-mjs.patch b/src/browser/components/BrowserGlue-sys-mjs.patch index 042d3a1d4..cc19b6ee6 100644 --- a/src/browser/components/BrowserGlue-sys-mjs.patch +++ b/src/browser/components/BrowserGlue-sys-mjs.patch @@ -1,8 +1,24 @@ diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs -index 2de73e75bf98b21dde9ec05213a66f9e9039200f..04ab3ea4c47d674778e8965654867c4cf0f99161 100644 +index b888a753a7f23a9800fe04da51a4e6b898314ff2..35eea774e1ea4b1807ec65ebc767f423d81602bd 100644 --- a/browser/components/BrowserGlue.sys.mjs +++ b/browser/components/BrowserGlue.sys.mjs -@@ -4643,6 +4643,7 @@ BrowserGlue.prototype = { +@@ -121,6 +121,7 @@ ChromeUtils.defineESModuleGetters(lazy, { + WindowsGPOParser: "resource://gre/modules/policies/WindowsGPOParser.sys.mjs", + clearTimeout: "resource://gre/modules/Timer.sys.mjs", + setTimeout: "resource://gre/modules/Timer.sys.mjs", ++ gZenUIMigration: "chrome://browser/content/zen-components/ZenUIMigration.mjs", + }); + + if (AppConstants.MOZ_UPDATER) { +@@ -1951,6 +1952,7 @@ BrowserGlue.prototype = { + + lazy.UrlbarPrefs.updateFirefoxSuggestScenario(); + ++ lazy.gZenUIMigration.init(this._isNewProfile, aWindow); + // A channel for "remote troubleshooting" code... + let channel = new lazy.WebChannel( + "remote-troubleshooting", +@@ -4761,6 +4763,7 @@ BrowserGlue.prototype = { }, async _maybeShowDefaultBrowserPrompt() { @@ -10,7 +26,7 @@ index 2de73e75bf98b21dde9ec05213a66f9e9039200f..04ab3ea4c47d674778e8965654867c4c // 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. -@@ -5169,6 +5170,16 @@ BrowserGlue.prototype = { +@@ -5302,6 +5305,16 @@ BrowserGlue.prototype = { "nsIObserver", "nsISupportsWeakReference", ]), diff --git a/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch b/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch index f21fc6c15..35657acbd 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 b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a2191a5f15dc 100644 +index e6b9b7dcfab179e7552c146eb1551b45ad042266..d9d838a7a51f67b52b69f419024cc3174ae5260b 100644 --- a/browser/components/customizableui/CustomizableUI.sys.mjs +++ b/browser/components/customizableui/CustomizableUI.sys.mjs @@ -13,6 +13,7 @@ ChromeUtils.defineESModuleGetters(lazy, { @@ -19,8 +19,8 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a219 const kSpecialWidgetPfx = "customizableui-special-"; -@@ -307,13 +308,11 @@ var CustomizableUIInternal = { - "spring", +@@ -317,13 +318,11 @@ var CustomizableUIInternal = { + "vertical-spacer", "urlbar-container", "spring", - "save-to-pocket-button", @@ -35,7 +35,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a219 this.registerArea( CustomizableUI.AREA_NAVBAR, { -@@ -321,7 +320,6 @@ var CustomizableUIInternal = { +@@ -331,7 +330,6 @@ var CustomizableUIInternal = { overflowable: true, defaultPlacements: navbarPlacements, verticalTabsDefaultPlacements: [ @@ -43,7 +43,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a219 "alltabs-button", ], defaultCollapsed: false, -@@ -346,10 +344,7 @@ var CustomizableUIInternal = { +@@ -356,10 +354,7 @@ var CustomizableUIInternal = { { type: CustomizableUI.TYPE_TOOLBAR, defaultPlacements: [ @@ -54,7 +54,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a219 ], verticalTabsDefaultPlacements: [], defaultCollapsed: null, -@@ -412,6 +407,7 @@ var CustomizableUIInternal = { +@@ -422,6 +417,7 @@ var CustomizableUIInternal = { CustomizableUI.AREA_NAVBAR, CustomizableUI.AREA_BOOKMARKS, CustomizableUI.AREA_TABSTRIP, @@ -62,7 +62,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a219 ]); if (AppConstants.platform != "macosx") { toolbars.add(CustomizableUI.AREA_MENUBAR); -@@ -1127,6 +1123,9 @@ var CustomizableUIInternal = { +@@ -1151,6 +1147,9 @@ var CustomizableUIInternal = { placements = gPlacements.get(area); } @@ -72,7 +72,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a219 // For toolbars that need it, mark as dirty. let defaultPlacements = areaProperties.get("defaultPlacements"); if ( -@@ -1540,7 +1539,7 @@ var CustomizableUIInternal = { +@@ -1564,7 +1563,7 @@ var CustomizableUIInternal = { lazy.log.info( "Widget " + aWidgetId + " not found, unable to remove from " + aArea ); @@ -81,7 +81,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a219 } this.notifyDOMChange(widgetNode, null, container, true, () => { -@@ -1550,7 +1549,7 @@ var CustomizableUIInternal = { +@@ -1574,7 +1573,7 @@ var CustomizableUIInternal = { // We also need to remove the panel context menu if it's there: this.ensureButtonContextMenu(widgetNode); if (gPalette.has(aWidgetId) || this.isSpecialWidget(aWidgetId)) { @@ -90,7 +90,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a219 } else { window.gNavToolbox.palette.appendChild(widgetNode); } -@@ -2654,7 +2653,6 @@ var CustomizableUIInternal = { +@@ -2678,7 +2677,6 @@ var CustomizableUIInternal = { if (!this.isWidgetRemovable(aWidgetId)) { return; } @@ -98,7 +98,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a219 let placements = gPlacements.get(oldPlacement.area); let position = placements.indexOf(aWidgetId); if (position != -1) { -@@ -3609,7 +3607,7 @@ var CustomizableUIInternal = { +@@ -3669,7 +3667,7 @@ var CustomizableUIInternal = { } }, @@ -107,7 +107,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a219 for (let [areaId, areaNodes] of gBuildAreas) { let placements = gPlacements.get(areaId); let isFirstChangedToolbar = true; -@@ -3620,7 +3618,7 @@ var CustomizableUIInternal = { +@@ -3680,7 +3678,7 @@ var CustomizableUIInternal = { if (area.get("type") == CustomizableUI.TYPE_TOOLBAR) { let defaultCollapsed = area.get("defaultCollapsed"); let win = areaNode.ownerGlobal; @@ -116,7 +116,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a219 win.setToolbarVisibility( areaNode, typeof defaultCollapsed == "string" -@@ -4583,6 +4581,7 @@ export var CustomizableUI = { +@@ -4658,6 +4656,7 @@ export var CustomizableUI = { unregisterArea(aName, aDestroyPlacements) { CustomizableUIInternal.unregisterArea(aName, aDestroyPlacements); }, @@ -124,7 +124,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a219 /** * Add a widget to an area. * If the area to which you try to add is not known to CustomizableUI, -@@ -6408,11 +6407,11 @@ class OverflowableToolbar { +@@ -6483,11 +6482,11 @@ class OverflowableToolbar { parseFloat(style.paddingLeft) - parseFloat(style.paddingRight) - toolbarChildrenWidth; @@ -138,7 +138,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a219 }); lazy.log.debug( -@@ -6422,7 +6421,8 @@ class OverflowableToolbar { +@@ -6497,7 +6496,8 @@ class OverflowableToolbar { // If the target has min-width: 0, their children might actually overflow // it, so check for both cases explicitly. let targetContentWidth = Math.max(targetWidth, targetChildrenWidth); @@ -148,7 +148,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a219 return { isOverflowing, targetContentWidth, totalAvailWidth }; } -@@ -6516,7 +6516,7 @@ class OverflowableToolbar { +@@ -6591,7 +6591,7 @@ class OverflowableToolbar { } } if (!inserted) { @@ -157,7 +157,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..67dbc54de5704be8fe09ec9982e3a219 } child.removeAttribute("cui-anchorid"); child.removeAttribute("overflowedItem"); -@@ -6678,6 +6678,9 @@ class OverflowableToolbar { +@@ -6753,6 +6753,9 @@ class OverflowableToolbar { * @param {MouseEvent} aEvent the click event. */ #onClickDefaultListButton(aEvent) { diff --git a/src/browser/components/places/content/editBookmarkPanel-inc-xhtml.patch b/src/browser/components/places/content/editBookmarkPanel-inc-xhtml.patch index fd1ec981e..87cd3f11f 100644 --- a/src/browser/components/places/content/editBookmarkPanel-inc-xhtml.patch +++ b/src/browser/components/places/content/editBookmarkPanel-inc-xhtml.patch @@ -1,58 +1,50 @@ diff --git a/browser/components/places/content/editBookmarkPanel.inc.xhtml b/browser/components/places/content/editBookmarkPanel.inc.xhtml -index 3ec3f094831c2143a818b43d1761a571f0ffa63d..98704f399089f2a33776c6ae9565b8ff9b8ddd34 100644 +index 40366677b60123c66bf0739d1b2374b423d3061c..3e722dce6b21ab62535369f20afe5f0acd43838f 100644 --- a/browser/components/places/content/editBookmarkPanel.inc.xhtml +++ b/browser/components/places/content/editBookmarkPanel.inc.xhtml -@@ -5,7 +5,7 @@ -
-