Compare commits
36 Commits
chore/upst
...
library
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0e213d54db | ||
|
|
2c98d5849a | ||
|
|
cccdcc960b | ||
|
|
123a7923af | ||
|
|
cd71a36765 | ||
|
|
80f424f68d | ||
|
|
7ce5fb77b9 | ||
|
|
08acc6a39e | ||
|
|
8ae271d982 | ||
|
|
ba26c902fb | ||
|
|
89a50770a9 | ||
|
|
036f764d2b | ||
|
|
2c11b9295e | ||
|
|
d7839cdb91 | ||
|
|
67cef284dd | ||
|
|
36df7e718f | ||
|
|
d5b88ead22 | ||
|
|
7261eb1688 | ||
|
|
b5a251a92f | ||
|
|
a217cacfef | ||
|
|
a56bcf3d9c | ||
|
|
5963de1486 | ||
|
|
57ad5c45e7 | ||
|
|
e6bebab10a | ||
|
|
a8820ed409 | ||
|
|
a82a7fb055 | ||
|
|
2be85a2890 | ||
|
|
9301e1b64c | ||
|
|
1e04f394a5 | ||
|
|
665f500925 | ||
|
|
88ebf6e5da | ||
|
|
556beb01b0 | ||
|
|
48d5b32a5a | ||
|
|
4682c8d545 | ||
|
|
2c5fc47e74 | ||
|
|
237f0c0ea5 |
51
.github/workflows/build.yml
vendored
@@ -26,11 +26,6 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
type: "boolean"
|
type: "boolean"
|
||||||
default: false
|
default: false
|
||||||
disable-pgo:
|
|
||||||
description: "Build without PGO (skips the profile generation stages)"
|
|
||||||
required: false
|
|
||||||
type: "boolean"
|
|
||||||
default: false
|
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
create_release:
|
create_release:
|
||||||
@@ -53,11 +48,6 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
type: "boolean"
|
type: "boolean"
|
||||||
default: false
|
default: false
|
||||||
disable-pgo:
|
|
||||||
description: "Build without PGO (skips the profile generation stages)"
|
|
||||||
required: false
|
|
||||||
type: "boolean"
|
|
||||||
default: false
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
buildid:
|
buildid:
|
||||||
@@ -83,7 +73,6 @@ jobs:
|
|||||||
echo "create_release: ${{ inputs.create_release }}"
|
echo "create_release: ${{ inputs.create_release }}"
|
||||||
echo "update_version: ${{ inputs.update_version }}"
|
echo "update_version: ${{ inputs.update_version }}"
|
||||||
echo "use sccache: ${{ inputs.use-sccache }}"
|
echo "use sccache: ${{ inputs.use-sccache }}"
|
||||||
echo "disable-pgo: ${{ inputs.disable-pgo }}"
|
|
||||||
echo "update_branch: ${{ inputs.update_branch }}"
|
echo "update_branch: ${{ inputs.update_branch }}"
|
||||||
echo "GITHUB_REPOSITORY: ${{ github.repository }}"
|
echo "GITHUB_REPOSITORY: ${{ github.repository }}"
|
||||||
echo "GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}"
|
echo "GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}"
|
||||||
@@ -113,14 +102,14 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Download aws-cli
|
- name: Download aws-cli
|
||||||
if: ${{ inputs.update_branch == 'release' }}
|
if: ${{ inputs.create_release && inputs.update_branch == 'release' }}
|
||||||
run: |
|
run: |
|
||||||
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
|
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
|
||||||
unzip awscliv2.zip
|
unzip awscliv2.zip
|
||||||
sudo ./aws/install --update
|
sudo ./aws/install --update
|
||||||
|
|
||||||
- name: Start self-hosted runner
|
- name: Start self-hosted runner
|
||||||
if: ${{ inputs.update_branch == 'release' }}
|
if: ${{ inputs.create_release && inputs.update_branch == 'release' }}
|
||||||
run: |
|
run: |
|
||||||
echo "Starting self-hosted runner"
|
echo "Starting self-hosted runner"
|
||||||
echo "${{ secrets.SELF_HOSTED_RUNNER_START_SCRIPT }}" | base64 -d > start.sh
|
echo "${{ secrets.SELF_HOSTED_RUNNER_START_SCRIPT }}" | base64 -d > start.sh
|
||||||
@@ -128,7 +117,7 @@ jobs:
|
|||||||
bash ./start.sh
|
bash ./start.sh
|
||||||
|
|
||||||
- name: Remove self-hosted runner script
|
- name: Remove self-hosted runner script
|
||||||
if: always() && ${{ inputs.update_branch == 'release' }}
|
if: always() && ${{ inputs.create_release && inputs.update_branch == 'release' }}
|
||||||
run: |
|
run: |
|
||||||
echo "Removing self-hosted runner script"
|
echo "Removing self-hosted runner script"
|
||||||
rm start.sh || true
|
rm start.sh || true
|
||||||
@@ -291,7 +280,6 @@ jobs:
|
|||||||
windows-step-1:
|
windows-step-1:
|
||||||
name: Windows build step 1 (PGO build)
|
name: Windows build step 1 (PGO build)
|
||||||
uses: ./.github/workflows/windows-release-build.yml
|
uses: ./.github/workflows/windows-release-build.yml
|
||||||
if: ${{ !inputs.disable-pgo }}
|
|
||||||
needs: [build-data, buildid]
|
needs: [build-data, buildid]
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
@@ -307,7 +295,6 @@ jobs:
|
|||||||
windows-step-2:
|
windows-step-2:
|
||||||
name: Windows build step 2 (Generate profile data)
|
name: Windows build step 2 (Generate profile data)
|
||||||
uses: ./.github/workflows/windows-profile-build.yml
|
uses: ./.github/workflows/windows-profile-build.yml
|
||||||
if: ${{ !inputs.disable-pgo }}
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
@@ -323,13 +310,10 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
# windows-step-2 is skipped when PGO is disabled, so don't inherit its skip
|
|
||||||
if: ${{ !failure() && !cancelled() }}
|
|
||||||
needs: [build-data, windows-step-2, start-self-host, buildid]
|
needs: [build-data, windows-step-2, start-self-host, buildid]
|
||||||
with:
|
with:
|
||||||
build-version: ${{ needs.build-data.outputs.version }}
|
build-version: ${{ needs.build-data.outputs.version }}
|
||||||
generate-pgo: false
|
generate-pgo: false
|
||||||
disable-pgo: ${{ inputs.disable-pgo }}
|
|
||||||
release-branch: ${{ inputs.update_branch }}
|
release-branch: ${{ inputs.update_branch }}
|
||||||
MOZ_BUILD_DATE: ${{needs.buildid.outputs.buildids}}
|
MOZ_BUILD_DATE: ${{needs.buildid.outputs.buildids}}
|
||||||
use-sccache: ${{ inputs.use-sccache }}
|
use-sccache: ${{ inputs.use-sccache }}
|
||||||
@@ -346,12 +330,10 @@ jobs:
|
|||||||
release-branch: ${{ inputs.update_branch }}
|
release-branch: ${{ inputs.update_branch }}
|
||||||
MOZ_BUILD_DATE: ${{needs.buildid.outputs.buildids}}
|
MOZ_BUILD_DATE: ${{needs.buildid.outputs.buildids}}
|
||||||
use-sccache: ${{ inputs.use-sccache }}
|
use-sccache: ${{ inputs.use-sccache }}
|
||||||
disable-pgo: ${{ inputs.disable-pgo }}
|
|
||||||
|
|
||||||
mac-step-1:
|
mac-step-1:
|
||||||
name: macOS build step 1 (PGO build)
|
name: macOS build step 1 (PGO build)
|
||||||
uses: ./.github/workflows/macos-release-build.yml
|
uses: ./.github/workflows/macos-release-build.yml
|
||||||
if: ${{ !inputs.disable-pgo }}
|
|
||||||
needs: [build-data, buildid]
|
needs: [build-data, buildid]
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
@@ -366,7 +348,6 @@ jobs:
|
|||||||
mac-step-2:
|
mac-step-2:
|
||||||
name: macOS build step 2 (Generate profile data)
|
name: macOS build step 2 (Generate profile data)
|
||||||
uses: ./.github/workflows/macos-profile-build.yml
|
uses: ./.github/workflows/macos-profile-build.yml
|
||||||
if: ${{ !inputs.disable-pgo }}
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
@@ -381,13 +362,10 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
# mac-step-2 is skipped when PGO is disabled, so don't inherit its skip
|
|
||||||
if: ${{ !failure() && !cancelled() }}
|
|
||||||
needs: [build-data, mac-step-2, start-self-host, buildid]
|
needs: [build-data, mac-step-2, start-self-host, buildid]
|
||||||
with:
|
with:
|
||||||
build-version: ${{ needs.build-data.outputs.version }}
|
build-version: ${{ needs.build-data.outputs.version }}
|
||||||
generate-pgo: false
|
generate-pgo: false
|
||||||
disable-pgo: ${{ inputs.disable-pgo }}
|
|
||||||
release-branch: ${{ inputs.update_branch }}
|
release-branch: ${{ inputs.update_branch }}
|
||||||
MOZ_BUILD_DATE: ${{needs.buildid.outputs.buildids}}
|
MOZ_BUILD_DATE: ${{needs.buildid.outputs.buildids}}
|
||||||
use-sccache: ${{ inputs.use-sccache }}
|
use-sccache: ${{ inputs.use-sccache }}
|
||||||
@@ -492,14 +470,14 @@ jobs:
|
|||||||
if: always()
|
if: always()
|
||||||
steps:
|
steps:
|
||||||
- name: Download aws-cli
|
- name: Download aws-cli
|
||||||
if: ${{ inputs.update_branch == 'release' }}
|
if: ${{ inputs.create_release && inputs.update_branch == 'release' }}
|
||||||
run: |
|
run: |
|
||||||
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
|
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
|
||||||
unzip awscliv2.zip
|
unzip awscliv2.zip
|
||||||
sudo ./aws/install --update
|
sudo ./aws/install --update
|
||||||
|
|
||||||
- name: Stop self-hosted runner
|
- name: Stop self-hosted runner
|
||||||
if: ${{ inputs.update_branch == 'release' }}
|
if: ${{ inputs.create_release && inputs.update_branch == 'release' }}
|
||||||
run: |
|
run: |
|
||||||
echo "Stopping self-hosted runner"
|
echo "Stopping self-hosted runner"
|
||||||
echo "${{ secrets.SELF_HOSTED_RUNNER_STOP_SCRIPT }}" | base64 -d > stop.sh
|
echo "${{ secrets.SELF_HOSTED_RUNNER_STOP_SCRIPT }}" | base64 -d > stop.sh
|
||||||
@@ -507,12 +485,13 @@ jobs:
|
|||||||
bash ./stop.sh > /dev/null
|
bash ./stop.sh > /dev/null
|
||||||
|
|
||||||
- name: Remove self-hosted runner script
|
- name: Remove self-hosted runner script
|
||||||
if: always() && ${{ inputs.update_branch == 'release' }}
|
if: always() && ${{ inputs.create_release && inputs.update_branch == 'release' }}
|
||||||
run: |
|
run: |
|
||||||
echo "Removing self-hosted runner script"
|
echo "Removing self-hosted runner script"
|
||||||
rm stop.sh || true
|
rm stop.sh || true
|
||||||
|
|
||||||
release:
|
release:
|
||||||
|
if: ${{ inputs.create_release || inputs.update_branch == 'twilight' }}
|
||||||
permissions: write-all
|
permissions: write-all
|
||||||
name: Release
|
name: Release
|
||||||
needs:
|
needs:
|
||||||
@@ -606,7 +585,6 @@ jobs:
|
|||||||
|
|
||||||
- name: Commit
|
- name: Commit
|
||||||
uses: stefanzweifel/git-auto-commit-action@v5
|
uses: stefanzweifel/git-auto-commit-action@v5
|
||||||
if: ${{ inputs.create_release || inputs.update_branch == 'twilight' }}
|
|
||||||
with:
|
with:
|
||||||
commit_message: 🚀 Update update manifests
|
commit_message: 🚀 Update update manifests
|
||||||
commit_user_name: Zen Browser Robot
|
commit_user_name: Zen Browser Robot
|
||||||
@@ -650,22 +628,9 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
GITHUB_REPOSITORY: ${{ github.repository }}
|
GITHUB_REPOSITORY: ${{ github.repository }}
|
||||||
|
|
||||||
- name: Upload signed MAR files to workflow artifacts
|
|
||||||
if: ${{ inputs.update_branch == 'release' && !inputs.create_release }}
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
retention-days: 5
|
|
||||||
name: signed-mar-files
|
|
||||||
path: |
|
|
||||||
./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/*
|
|
||||||
|
|
||||||
- name: Release
|
- name: Release
|
||||||
uses: softprops/action-gh-release@v2.2.2
|
uses: softprops/action-gh-release@v2.2.2
|
||||||
if: ${{ inputs.update_branch == 'release' && inputs.create_release }}
|
if: ${{ inputs.update_branch == 'release' }}
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.DEPLOY_KEY }}
|
token: ${{ secrets.DEPLOY_KEY }}
|
||||||
tag_name: ${{ needs.build-data.outputs.version }}
|
tag_name: ${{ needs.build-data.outputs.version }}
|
||||||
|
|||||||
10
.github/workflows/linux-release-build.yml
vendored
@@ -20,11 +20,6 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
default: false
|
||||||
disable-pgo:
|
|
||||||
description: "Build without PGO at all"
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-linux:
|
build-linux:
|
||||||
@@ -127,7 +122,7 @@ jobs:
|
|||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
- name: Build (PGO stage 1 - generate)
|
- name: Build (PGO stage 1 - generate)
|
||||||
if: ${{ matrix.arch == 'x86_64' && !inputs.disable-pgo }}
|
if: ${{ matrix.arch == 'x86_64' }}
|
||||||
env:
|
env:
|
||||||
SURFER_COMPAT: ${{ matrix.arch }}
|
SURFER_COMPAT: ${{ matrix.arch }}
|
||||||
ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }}
|
ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }}
|
||||||
@@ -144,7 +139,7 @@ jobs:
|
|||||||
bash .github/workflows/src/release-build.sh
|
bash .github/workflows/src/release-build.sh
|
||||||
|
|
||||||
- name: Generate PGO profile data
|
- name: Generate PGO profile data
|
||||||
if: ${{ matrix.arch == 'x86_64' && !inputs.disable-pgo }}
|
if: ${{ matrix.arch == 'x86_64' }}
|
||||||
run: |
|
run: |
|
||||||
set -x
|
set -x
|
||||||
export DISPLAY=:2
|
export DISPLAY=:2
|
||||||
@@ -162,7 +157,6 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
SURFER_COMPAT: ${{ matrix.arch }}
|
SURFER_COMPAT: ${{ matrix.arch }}
|
||||||
ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }}
|
ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }}
|
||||||
ZEN_GA_DISABLE_PGO: ${{ inputs.disable-pgo && '1' || '' }}
|
|
||||||
ZEN_SAFEBROWSING_API_KEY: ${{ secrets.ZEN_SAFEBROWSING_API_KEY }}
|
ZEN_SAFEBROWSING_API_KEY: ${{ secrets.ZEN_SAFEBROWSING_API_KEY }}
|
||||||
ZEN_MOZILLA_API_KEY: ${{ secrets.ZEN_MOZILLA_API_KEY }}
|
ZEN_MOZILLA_API_KEY: ${{ secrets.ZEN_MOZILLA_API_KEY }}
|
||||||
ZEN_GOOGLE_LOCATION_SERVICE_API_KEY: ${{ secrets.ZEN_GOOGLE_LOCATION_SERVICE_API_KEY }}
|
ZEN_GOOGLE_LOCATION_SERVICE_API_KEY: ${{ secrets.ZEN_GOOGLE_LOCATION_SERVICE_API_KEY }}
|
||||||
|
|||||||
12
.github/workflows/macos-release-build.yml
vendored
@@ -10,11 +10,6 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
default: false
|
||||||
disable-pgo:
|
|
||||||
description: "Build without PGO at all"
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
build-version:
|
build-version:
|
||||||
description: "The version to build"
|
description: "The version to build"
|
||||||
required: true
|
required: true
|
||||||
@@ -145,13 +140,13 @@ jobs:
|
|||||||
|
|
||||||
- name: Download artifact (if use profdata)
|
- name: Download artifact (if use profdata)
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v4
|
||||||
if: ${{ !inputs.generate-pgo && !inputs.disable-pgo }}
|
if: ${{ !inputs.generate-pgo }}
|
||||||
with:
|
with:
|
||||||
path: ~/artifact
|
path: ~/artifact
|
||||||
name: macos-profdata-${{ matrix.arch }}
|
name: macos-profdata-${{ matrix.arch }}
|
||||||
|
|
||||||
- name: Show artifact info
|
- name: Show artifact info
|
||||||
if: ${{ !inputs.generate-pgo && !inputs.disable-pgo }}
|
if: ${{ !inputs.generate-pgo }}
|
||||||
run: |
|
run: |
|
||||||
ls ~/artifact
|
ls ~/artifact
|
||||||
ls ~/artifact/en-US.log
|
ls ~/artifact/en-US.log
|
||||||
@@ -171,9 +166,6 @@ jobs:
|
|||||||
if test ${{ inputs.generate-pgo }} = true; then
|
if test ${{ inputs.generate-pgo }} = true; then
|
||||||
export ZEN_GA_GENERATE_PROFILE=1
|
export ZEN_GA_GENERATE_PROFILE=1
|
||||||
fi
|
fi
|
||||||
if test ${{ inputs.disable-pgo }} = true; then
|
|
||||||
export ZEN_GA_DISABLE_PGO=1
|
|
||||||
fi
|
|
||||||
if [[ -n ${{ inputs.MOZ_BUILD_DATE }} ]];then
|
if [[ -n ${{ inputs.MOZ_BUILD_DATE }} ]];then
|
||||||
export MOZ_BUILD_DATE=${{ inputs.MOZ_BUILD_DATE }}
|
export MOZ_BUILD_DATE=${{ inputs.MOZ_BUILD_DATE }}
|
||||||
fi
|
fi
|
||||||
|
|||||||
12
.github/workflows/windows-release-build.yml
vendored
@@ -10,11 +10,6 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
default: false
|
||||||
disable-pgo:
|
|
||||||
description: "Build without PGO at all"
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
build-version:
|
build-version:
|
||||||
description: "The version to build"
|
description: "The version to build"
|
||||||
required: true
|
required: true
|
||||||
@@ -220,13 +215,13 @@ jobs:
|
|||||||
|
|
||||||
- name: Download artifact (if use profdata)
|
- name: Download artifact (if use profdata)
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v4
|
||||||
if: ${{ !inputs.generate-pgo && !inputs.disable-pgo && matrix.arch == 'x86_64' }}
|
if: ${{ !inputs.generate-pgo && matrix.arch == 'x86_64' }}
|
||||||
with:
|
with:
|
||||||
path: ~/artifact
|
path: ~/artifact
|
||||||
name: windows-profdata-${{ matrix.arch == 'aarch64' && 'arm64' || matrix.arch }}
|
name: windows-profdata-${{ matrix.arch == 'aarch64' && 'arm64' || matrix.arch }}
|
||||||
|
|
||||||
- name: Show artifact info
|
- name: Show artifact info
|
||||||
if: ${{ !inputs.generate-pgo && !inputs.disable-pgo && matrix.arch == 'x86_64' }}
|
if: ${{ !inputs.generate-pgo && matrix.arch == 'x86_64' }}
|
||||||
run: |
|
run: |
|
||||||
ls ~/artifact
|
ls ~/artifact
|
||||||
ls ~/artifact/en-US.log
|
ls ~/artifact/en-US.log
|
||||||
@@ -251,9 +246,6 @@ jobs:
|
|||||||
if test ${{ inputs.generate-pgo }} = true; then
|
if test ${{ inputs.generate-pgo }} = true; then
|
||||||
export ZEN_GA_GENERATE_PROFILE=1
|
export ZEN_GA_GENERATE_PROFILE=1
|
||||||
fi
|
fi
|
||||||
if test ${{ inputs.disable-pgo }} = true; then
|
|
||||||
export ZEN_GA_DISABLE_PGO=1
|
|
||||||
fi
|
|
||||||
if [[ -n ${{ inputs.MOZ_BUILD_DATE }} ]];then
|
if [[ -n ${{ inputs.MOZ_BUILD_DATE }} ]];then
|
||||||
export MOZ_BUILD_DATE=${{ inputs.MOZ_BUILD_DATE }}
|
export MOZ_BUILD_DATE=${{ inputs.MOZ_BUILD_DATE }}
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ Zen is a firefox-based browser with the aim of pushing your productivity to a ne
|
|||||||
|
|
||||||
### Firefox Versions
|
### Firefox Versions
|
||||||
|
|
||||||
- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `155.0`!
|
- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `154.0.1`!
|
||||||
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 155.0`!
|
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 154.0.1`!
|
||||||
|
|
||||||
### Contributing
|
### Contributing
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
20e5abbb642ab21d943bc1261864d9c531ba421a
|
bf4b57fd7fe94054457be7018e8e7beaf754c520
|
||||||
@@ -20,6 +20,8 @@ files:
|
|||||||
translation: browser/browser/preferences/zen-preferences.ftl
|
translation: browser/browser/preferences/zen-preferences.ftl
|
||||||
- source: en-US/browser/browser/zen-folders.ftl
|
- source: en-US/browser/browser/zen-folders.ftl
|
||||||
translation: browser/browser/zen-folders.ftl
|
translation: browser/browser/zen-folders.ftl
|
||||||
|
- source: en-US/browser/browser/zen-library.ftl
|
||||||
|
translation: browser/browser/zen-library.ftl
|
||||||
- source: en-US/browser/browser/zen-boosts.ftl
|
- source: en-US/browser/browser/zen-boosts.ftl
|
||||||
translation: browser/browser/zen-boosts.ftl
|
translation: browser/browser/zen-boosts.ftl
|
||||||
- source: en-US/browser/browser/zen-space-routing.ftl
|
- source: en-US/browser/browser/zen-space-routing.ftl
|
||||||
|
|||||||
@@ -64,10 +64,6 @@ zen-tabs-select-recently-used-on-close =
|
|||||||
zen-tabs-close-on-back-with-no-history =
|
zen-tabs-close-on-back-with-no-history =
|
||||||
.label = Close tab and switch to its owner tab (or most recently used tab) when going back with no history
|
.label = Close tab and switch to its owner tab (or most recently used tab) when going back with no history
|
||||||
|
|
||||||
zen-settings-workspaces-sync =
|
|
||||||
.label = Sync your sidebar across devices
|
|
||||||
.description = Keep your workspaces, pinned tabs and folders in sync on all your devices through your Mozilla account.
|
|
||||||
|
|
||||||
zen-settings-workspaces-sync-unpinned-tabs =
|
zen-settings-workspaces-sync-unpinned-tabs =
|
||||||
.label = Sync only pinned tabs in workspaces
|
.label = Sync only pinned tabs in workspaces
|
||||||
|
|
||||||
|
|||||||
94
locales/en-US/browser/browser/zen-library.ftl
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
library-spaces-section-title = Spaces
|
||||||
|
library-downloads-section-title = Downloads
|
||||||
|
library-history-section-title = History
|
||||||
|
library-boosts-section-title = Boosts
|
||||||
|
|
||||||
|
library-search-placeholder =
|
||||||
|
.placeholder = Search…
|
||||||
|
library-history-search-placeholder =
|
||||||
|
.placeholder = Search History…
|
||||||
|
library-downloads-search-placeholder =
|
||||||
|
.placeholder = Search Downloads…
|
||||||
|
|
||||||
|
library-history-today = Today
|
||||||
|
library-history-yesterday = Yesterday
|
||||||
|
|
||||||
|
library-history-empty = No history found
|
||||||
|
library-downloads-empty = No downloads found
|
||||||
|
library-spaces-empty = No spaces available
|
||||||
|
library-boosts-empty = No boosts yet
|
||||||
|
library-search-no-results = No results
|
||||||
|
|
||||||
|
library-boosts-search-placeholder =
|
||||||
|
.placeholder = Search Boosts…
|
||||||
|
|
||||||
|
library-boost-toggle =
|
||||||
|
.tooltiptext = Toggle boost for this site
|
||||||
|
library-boost-context-edit =
|
||||||
|
.label = Edit Boost
|
||||||
|
library-boost-context-export =
|
||||||
|
.label = Export Boost
|
||||||
|
library-boost-context-delete =
|
||||||
|
.label = Delete Boost
|
||||||
|
|
||||||
|
library-filter-button = Filter
|
||||||
|
|
||||||
|
library-history-filter-all =
|
||||||
|
.label = All time
|
||||||
|
library-history-filter-today =
|
||||||
|
.label = Today
|
||||||
|
library-history-filter-yesterday =
|
||||||
|
.label = Yesterday
|
||||||
|
library-history-filter-last-7-days =
|
||||||
|
.label = Last 7 days
|
||||||
|
library-history-filter-last-30-days =
|
||||||
|
.label = Last 30 days
|
||||||
|
|
||||||
|
library-downloads-filter-all =
|
||||||
|
.label = All
|
||||||
|
library-downloads-filter-completed =
|
||||||
|
.label = Completed
|
||||||
|
library-downloads-filter-in-progress =
|
||||||
|
.label = In progress
|
||||||
|
library-downloads-filter-failed =
|
||||||
|
.label = Failed
|
||||||
|
library-downloads-filter-paused =
|
||||||
|
.label = Paused
|
||||||
|
|
||||||
|
library-item-context-open =
|
||||||
|
.label = Open
|
||||||
|
library-item-context-open-glance =
|
||||||
|
.label = Open in Glance
|
||||||
|
library-item-context-open-new-tab =
|
||||||
|
.label = Open in New Tab
|
||||||
|
library-item-context-open-new-window =
|
||||||
|
.label = Open in New Window
|
||||||
|
library-item-context-copy-url =
|
||||||
|
.label = Copy URL
|
||||||
|
library-item-context-delete-history =
|
||||||
|
.label = Forget About This Page
|
||||||
|
library-item-context-open-source =
|
||||||
|
.label = Open Source URL
|
||||||
|
library-item-context-remove =
|
||||||
|
.label = Remove from History
|
||||||
|
library-item-context-delete-file =
|
||||||
|
.label = Delete File
|
||||||
|
|
||||||
|
library-history-action-remove =
|
||||||
|
.tooltiptext = Forget About This Page
|
||||||
|
library-history-action-open-tab =
|
||||||
|
.tooltiptext = Open in New Tab
|
||||||
|
|
||||||
|
library-downloads-state-downloading = Downloading…
|
||||||
|
library-downloads-state-canceled = Canceled
|
||||||
|
library-downloads-state-failed = Failed
|
||||||
|
library-downloads-state-incomplete = Incomplete
|
||||||
|
|
||||||
|
library-close-button =
|
||||||
|
.tooltiptext = Close Library
|
||||||
|
library-donate-button =
|
||||||
|
.tooltiptext = Support Zen
|
||||||
@@ -5,28 +5,29 @@
|
|||||||
zen-welcome-title-line1 = Welcome to
|
zen-welcome-title-line1 = Welcome to
|
||||||
zen-welcome-title-line2 = a calmer internet
|
zen-welcome-title-line2 = a calmer internet
|
||||||
|
|
||||||
zen-welcome-back = Back
|
zen-welcome-import-title = A Fresh Start, Same Bookmarks
|
||||||
zen-welcome-skip = Skip for now
|
zen-welcome-import-description-1 = Your bookmarks, history, and passwords are like a trail of breadcrumbs through the internet—don’t leave them behind!
|
||||||
|
zen-welcome-import-description-2 = Easily bring them over from another browser and pick up right where you left off.
|
||||||
|
zen-welcome-import-button = Import now
|
||||||
|
|
||||||
zen-welcome-import-title = Bring your stuff along.
|
zen-welcome-set-default-browser = Set { -brand-short-name } as your default browser
|
||||||
zen-welcome-import-description = Import your bookmarks, history and passwords from another browser and pick up right where you left off.
|
zen-welcome-dont-set-default-browser = DON’T set { -brand-short-name } as your default browser
|
||||||
zen-welcome-import-yes = <strong>YES</strong>, import from another browser.
|
|
||||||
zen-welcome-import-no = <strong>NO</strong>, start fresh.
|
|
||||||
|
|
||||||
zen-welcome-default-browser-title = Make { -brand-short-name } your default?
|
zen-welcome-initial-essentials-title = Your Key Tabs, Always Within Reach
|
||||||
zen-welcome-default-browser-description = Links from other apps will open in { -brand-short-name }. You can always change this later.
|
zen-welcome-initial-essentials-description-1 = Keep your most important tabs easily accessible and always at hand, no matter how many you open.
|
||||||
zen-welcome-set-default-browser = <strong>YES</strong>, make { -brand-short-name } default.
|
zen-welcome-initial-essentials-description-2 = Essential tabs are always visible, no matter what workspace you are in.
|
||||||
zen-welcome-dont-set-default-browser = <strong>NO</strong>, still exploring my options.
|
|
||||||
|
|
||||||
zen-welcome-default-search-title = Pick your search engine.
|
zen-welcome-workspace-colors-title = Your Workspaces, Your Colors
|
||||||
zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
|
zen-welcome-workspace-colors-description = Personalize your browser by giving each workspace its own unique color identity.
|
||||||
|
|
||||||
zen-welcome-essentials-title = Choose the apps you use most.
|
zen-welcome-start-browsing-title = All set?<br/>
|
||||||
zen-welcome-essentials-description = Select your favorite apps to keep them handy in your sidebar.
|
Let’s get rolling!
|
||||||
|
|
||||||
zen-welcome-workspace-colors-title = Your space, your colors.
|
|
||||||
zen-welcome-workspace-colors-description = Personalize your browser by giving each space its own unique color identity.
|
|
||||||
|
|
||||||
zen-welcome-start-browsing-title = All set? Let’s get rolling!
|
|
||||||
zen-welcome-start-browsing-description-1 = You’re all set up and ready to go. Click the button below to start browsing with { -brand-short-name }.
|
zen-welcome-start-browsing-description-1 = You’re all set up and ready to go. Click the button below to start browsing with { -brand-short-name }.
|
||||||
zen-welcome-start-browsing = Dive in!
|
zen-welcome-start-browsing = Dive in!
|
||||||
|
|
||||||
|
zen-welcome-default-search-title = Your Default Search Engine
|
||||||
|
zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
|
||||||
|
|
||||||
|
zen-welcome-skip-button = Skip
|
||||||
|
|
||||||
|
zen-welcome-finished = Your Zen has been set up correctly!
|
||||||
|
|||||||
8
package-lock.json
generated
@@ -11,7 +11,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/preset-typescript": "^7.27.0",
|
"@babel/preset-typescript": "^7.27.0",
|
||||||
"@zen-browser/prettier": "^3.9.3",
|
"@zen-browser/prettier": "^3.9.3",
|
||||||
"@zen-browser/surfer": "^1.14.9",
|
"@zen-browser/surfer": "^1.14.8",
|
||||||
"formal-git": "^1.2.9",
|
"formal-git": "^1.2.9",
|
||||||
"globals": "^16.3.0",
|
"globals": "^16.3.0",
|
||||||
"husky": "^9.1.7",
|
"husky": "^9.1.7",
|
||||||
@@ -860,9 +860,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@zen-browser/surfer": {
|
"node_modules/@zen-browser/surfer": {
|
||||||
"version": "1.14.9",
|
"version": "1.14.8",
|
||||||
"resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.14.9.tgz",
|
"resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.14.8.tgz",
|
||||||
"integrity": "sha512-XbMzG4GHSRoGzKR/DkpyywcbTYemieDRD1A6qgJ8CaVDixenj/uzMhp6HXAUksRTeh1u9j3lzNcVrI99axcZLw==",
|
"integrity": "sha512-5HHcfibwHIK5n3huhJL2TLBX2+8odj6ebCMA6U2EcUj9ROSrcz7/bjY2n5MIa9oIRL9gtV3ott0jwJj6SlapxA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/preset-typescript": "^7.27.0",
|
"@babel/preset-typescript": "^7.27.0",
|
||||||
"@zen-browser/prettier": "^3.9.3",
|
"@zen-browser/prettier": "^3.9.3",
|
||||||
"@zen-browser/surfer": "^1.14.9",
|
"@zen-browser/surfer": "^1.14.8",
|
||||||
"formal-git": "^1.2.9",
|
"formal-git": "^1.2.9",
|
||||||
"globals": "^16.3.0",
|
"globals": "^16.3.0",
|
||||||
"husky": "^9.1.7",
|
"husky": "^9.1.7",
|
||||||
|
|||||||
@@ -95,9 +95,6 @@
|
|||||||
- name: browser.search.widget.new
|
- name: browser.search.widget.new
|
||||||
value: true
|
value: true
|
||||||
|
|
||||||
- name: layout.css.corner-shape.enabled
|
|
||||||
value: true
|
|
||||||
|
|
||||||
# Disabled from https://searchfox.org/firefox-main/rev/d6bfff43852356ca98af848b4705d37f8d41856f/modules/libpref/init/StaticPrefList.yaml#2008
|
# Disabled from https://searchfox.org/firefox-main/rev/d6bfff43852356ca98af848b4705d37f8d41856f/modules/libpref/init/StaticPrefList.yaml#2008
|
||||||
# Only enabled for windows, doesn't really fit inside Zen.
|
# Only enabled for windows, doesn't really fit inside Zen.
|
||||||
- name: browser.startup.preXulSkeletonUI
|
- name: browser.startup.preXulSkeletonUI
|
||||||
|
|||||||
6
prefs/firefox/library.yaml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
- name: zen.library.enabled
|
||||||
|
value: false
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/.stylelintrc.js b/.stylelintrc.js
|
diff --git a/.stylelintrc.js b/.stylelintrc.js
|
||||||
index b5f8245fa04ffb8fc82240261d63f893f4629f19..1b6ead24adbe69fcb5aeb95cfd3e7fa9662d89d8 100644
|
index b484bf6600a7e1b8ad2aed8c8b7fe5e84cc3d023..f89712e2c13dfa0bcb48e55cd3872c67f5c98dad 100644
|
||||||
--- a/.stylelintrc.js
|
--- a/.stylelintrc.js
|
||||||
+++ b/.stylelintrc.js
|
+++ b/.stylelintrc.js
|
||||||
@@ -67,7 +67,7 @@ module.exports = {
|
@@ -67,7 +67,7 @@ module.exports = {
|
||||||
@@ -11,10 +11,10 @@ index b5f8245fa04ffb8fc82240261d63f893f4629f19..1b6ead24adbe69fcb5aeb95cfd3e7fa9
|
|||||||
{
|
{
|
||||||
ignore: ["blockless-at-rules"],
|
ignore: ["blockless-at-rules"],
|
||||||
},
|
},
|
||||||
@@ -281,7 +281,7 @@ module.exports = {
|
@@ -280,7 +280,7 @@ module.exports = {
|
||||||
|
"media-query-no-invalid": null,
|
||||||
"stylelint-plugin-mozilla/media-query-no-invalid": true,
|
"stylelint-plugin-mozilla/media-query-no-invalid": true,
|
||||||
"stylelint-plugin-mozilla/no-base-design-tokens": true,
|
"stylelint-plugin-mozilla/no-base-design-tokens": true,
|
||||||
"stylelint-plugin-mozilla/no-has-selector": true,
|
|
||||||
- "stylelint-plugin-mozilla/use-design-tokens": true,
|
- "stylelint-plugin-mozilla/use-design-tokens": true,
|
||||||
+ "stylelint-plugin-mozilla/use-design-tokens": false,
|
+ "stylelint-plugin-mozilla/use-design-tokens": false,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml
|
diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml
|
||||||
index dd2f391096968564086911c532f696dc7ffb8ae1..c968e5f0ebb5f0151fb124bafe10d8d5361e060f 100644
|
index dd2f391096968564086911c532f696dc7ffb8ae1..c3e809a543397ab360fb83b3f61ef52d3c3bb738 100644
|
||||||
--- a/browser/base/content/navigator-toolbox.inc.xhtml
|
--- a/browser/base/content/navigator-toolbox.inc.xhtml
|
||||||
+++ b/browser/base/content/navigator-toolbox.inc.xhtml
|
+++ b/browser/base/content/navigator-toolbox.inc.xhtml
|
||||||
@@ -2,7 +2,7 @@
|
@@ -2,7 +2,7 @@
|
||||||
@@ -19,7 +19,7 @@ index dd2f391096968564086911c532f696dc7ffb8ae1..c968e5f0ebb5f0151fb124bafe10d8d5
|
|||||||
</toolbar>
|
</toolbar>
|
||||||
|
|
||||||
+<hbox id="titlebar">
|
+<hbox id="titlebar">
|
||||||
+ <html:div id="zen-toolbar-background" class="zen-toolbar-background zen-squircle-before zen-squircle-after zen-browser-generic-background">
|
+ <html:div id="zen-toolbar-background" class="zen-toolbar-background zen-browser-generic-background">
|
||||||
+ <html:div class="zen-browser-grain" />
|
+ <html:div class="zen-browser-grain" />
|
||||||
+ </html:div>
|
+ </html:div>
|
||||||
+ <box id="zen-overflow-extensions-list" skipintoolbarset="true" contextmenu="toolbar-context-menu" />
|
+ <box id="zen-overflow-extensions-list" skipintoolbarset="true" contextmenu="toolbar-context-menu" />
|
||||||
@@ -55,3 +55,11 @@ index dd2f391096968564086911c532f696dc7ffb8ae1..c968e5f0ebb5f0151fb124bafe10d8d5
|
|||||||
|
|
||||||
<toolbar id="nav-bar"
|
<toolbar id="nav-bar"
|
||||||
class="browser-toolbar chromeclass-location"
|
class="browser-toolbar chromeclass-location"
|
||||||
|
@@ -177,7 +185,6 @@
|
||||||
|
<toolbartabstop/>
|
||||||
|
<html:moz-urlbar id="urlbar"
|
||||||
|
class="urlbar"
|
||||||
|
- popover="manual"
|
||||||
|
pageproxystate="invalid"
|
||||||
|
unifiedsearchbutton-available=""
|
||||||
|
sap-name="urlbar">
|
||||||
|
|||||||
@@ -20,4 +20,5 @@
|
|||||||
#include ../../../zen/fonts/jar.inc.mn
|
#include ../../../zen/fonts/jar.inc.mn
|
||||||
#include ../../../zen/boosts/jar.inc.mn
|
#include ../../../zen/boosts/jar.inc.mn
|
||||||
#include ../../../zen/live-folders/jar.inc.mn
|
#include ../../../zen/live-folders/jar.inc.mn
|
||||||
|
#include ../../../zen/library/jar.inc.mn
|
||||||
#include ../../../zen/space-routing/jar.inc.mn
|
#include ../../../zen/space-routing/jar.inc.mn
|
||||||
|
|||||||
@@ -69,5 +69,7 @@
|
|||||||
|
|
||||||
<command id="cmd_zenNewLiveFolder" />
|
<command id="cmd_zenNewLiveFolder" />
|
||||||
|
|
||||||
|
<command id="cmd_zenToggleLibrary" />
|
||||||
|
|
||||||
<command id="cmd_zenDuplicateTab" />
|
<command id="cmd_zenDuplicateTab" />
|
||||||
</commandset>
|
</commandset>
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
<link rel="localization" href="browser/zen-menubar.ftl"/>
|
<link rel="localization" href="browser/zen-menubar.ftl"/>
|
||||||
<link rel="localization" href="browser/zen-vertical-tabs.ftl"/>
|
<link rel="localization" href="browser/zen-vertical-tabs.ftl"/>
|
||||||
<link rel="localization" href="browser/zen-folders.ftl"/>
|
<link rel="localization" href="browser/zen-folders.ftl"/>
|
||||||
|
<link rel="localization" href="browser/zen-library.ftl"/>
|
||||||
<link rel="localization" href="browser/zen-boosts.ftl"/>
|
<link rel="localization" href="browser/zen-boosts.ftl"/>
|
||||||
<link rel="localization" href="browser/zen-live-folders.ftl"/>
|
<link rel="localization" href="browser/zen-live-folders.ftl"/>
|
||||||
<link rel="localization" href="browser/zen-space-routing.ftl"/>
|
<link rel="localization" href="browser/zen-space-routing.ftl"/>
|
||||||
|
|||||||
@@ -15,23 +15,19 @@
|
|||||||
mainview-with-header="true">
|
mainview-with-header="true">
|
||||||
<hbox id="zen-site-data-header">
|
<hbox id="zen-site-data-header">
|
||||||
<toolbarbutton id="zen-site-data-header-share"
|
<toolbarbutton id="zen-site-data-header-share"
|
||||||
class="zen-squircle-before"
|
|
||||||
data-l10n-id="zen-site-data-header-share"
|
data-l10n-id="zen-site-data-header-share"
|
||||||
flex="1"
|
flex="1"
|
||||||
closemenu="none" />
|
closemenu="none" />
|
||||||
<toolbarbutton id="zen-site-data-header-reader-mode"
|
<toolbarbutton id="zen-site-data-header-reader-mode"
|
||||||
class="zen-squircle-before"
|
|
||||||
data-l10n-id="zen-site-data-header-reader-mode"
|
data-l10n-id="zen-site-data-header-reader-mode"
|
||||||
command="View:ReaderView"
|
command="View:ReaderView"
|
||||||
tooltip="dynamic-shortcut-tooltip"
|
tooltip="dynamic-shortcut-tooltip"
|
||||||
flex="1" />
|
flex="1" />
|
||||||
<toolbarbutton id="zen-site-data-header-screenshot"
|
<toolbarbutton id="zen-site-data-header-screenshot"
|
||||||
class="zen-squircle-before"
|
|
||||||
data-l10n-id="zen-site-data-header-screenshot"
|
data-l10n-id="zen-site-data-header-screenshot"
|
||||||
command="Browser:Screenshot"
|
command="Browser:Screenshot"
|
||||||
flex="1" />
|
flex="1" />
|
||||||
<toolbarbutton id="zen-site-data-header-bookmark"
|
<toolbarbutton id="zen-site-data-header-bookmark"
|
||||||
class="zen-squircle-before"
|
|
||||||
data-l10n-id="zen-site-data-header-bookmark"
|
data-l10n-id="zen-site-data-header-bookmark"
|
||||||
command="Browser:AddBookmarkAs"
|
command="Browser:AddBookmarkAs"
|
||||||
flex="1" />
|
flex="1" />
|
||||||
|
|||||||
@@ -14,14 +14,14 @@
|
|||||||
<panelview id="PanelUI-zen-gradient-generator-view" class="PanelUI-subView zen-theme-picker" role="document" mainview-with-header="true" has-custom-header="true">
|
<panelview id="PanelUI-zen-gradient-generator-view" class="PanelUI-subView zen-theme-picker" role="document" mainview-with-header="true" has-custom-header="true">
|
||||||
<hbox class="zen-theme-picker-gradient">
|
<hbox class="zen-theme-picker-gradient">
|
||||||
<hbox id="PanelUI-zen-gradient-generator-scheme">
|
<hbox id="PanelUI-zen-gradient-generator-scheme">
|
||||||
<button id="PanelUI-zen-gradient-generator-scheme-auto" class="no-squircles subviewbutton"/>
|
<button id="PanelUI-zen-gradient-generator-scheme-auto" class="subviewbutton"/>
|
||||||
<button id="PanelUI-zen-gradient-generator-scheme-light" class="no-squircles subviewbutton"/>
|
<button id="PanelUI-zen-gradient-generator-scheme-light" class="subviewbutton"/>
|
||||||
<button id="PanelUI-zen-gradient-generator-scheme-dark" class="no-squircles subviewbutton"/>
|
<button id="PanelUI-zen-gradient-generator-scheme-dark" class="subviewbutton"/>
|
||||||
</hbox>
|
</hbox>
|
||||||
<hbox id="PanelUI-zen-gradient-generator-color-actions">
|
<hbox id="PanelUI-zen-gradient-generator-color-actions">
|
||||||
<button id="PanelUI-zen-gradient-generator-color-add" class="no-squircles subviewbutton" />
|
<button id="PanelUI-zen-gradient-generator-color-add" class="subviewbutton" />
|
||||||
<button id="PanelUI-zen-gradient-generator-color-remove" class="no-squircles subviewbutton" />
|
<button id="PanelUI-zen-gradient-generator-color-remove" class="subviewbutton" />
|
||||||
<button id="PanelUI-zen-gradient-generator-color-toggle-algo" class="no-squircles subviewbutton" />
|
<button id="PanelUI-zen-gradient-generator-color-toggle-algo" class="subviewbutton" />
|
||||||
</hbox>
|
</hbox>
|
||||||
<label data-l10n-id="zen-panel-ui-gradient-click-to-add" id="PanelUI-zen-gradient-generator-color-click-to-add"></label>
|
<label data-l10n-id="zen-panel-ui-gradient-click-to-add" id="PanelUI-zen-gradient-generator-color-click-to-add"></label>
|
||||||
</hbox>
|
</hbox>
|
||||||
@@ -29,82 +29,82 @@
|
|||||||
<toolbarbutton id="PanelUI-zen-gradient-generator-color-page-left" class="toolbarbutton-1" disabled="true" />
|
<toolbarbutton id="PanelUI-zen-gradient-generator-color-page-left" class="toolbarbutton-1" disabled="true" />
|
||||||
<hbox id="PanelUI-zen-gradient-generator-color-pages">
|
<hbox id="PanelUI-zen-gradient-generator-color-pages">
|
||||||
<hbox>
|
<hbox>
|
||||||
<box class="no-squircles" data-lightness="90" data-algo="float" data-num-dots="1" data-position="240,240" style="background: #f4efdf;"></box>
|
<box data-lightness="90" data-algo="float" data-num-dots="1" data-position="240,240" style="background: #f4efdf;"></box>
|
||||||
<box class="no-squircles" data-lightness="80" data-algo="float" data-num-dots="1" data-position="233,157" style="background: #f0b8cd;"></box>
|
<box data-lightness="80" data-algo="float" data-num-dots="1" data-position="233,157" style="background: #f0b8cd;"></box>
|
||||||
<box class="no-squircles" data-lightness="80" data-algo="float" data-num-dots="1" data-position="236,111" style="background: #e9c3e3;"></box>
|
<box data-lightness="80" data-algo="float" data-num-dots="1" data-position="236,111" style="background: #e9c3e3;"></box>
|
||||||
<box class="no-squircles" data-lightness="70" data-algo="float" data-num-dots="1" data-position="234,173" style="background: #da7682;"></box>
|
<box data-lightness="70" data-algo="float" data-num-dots="1" data-position="234,173" style="background: #da7682;"></box>
|
||||||
<box class="no-squircles" data-lightness="70" data-algo="float" data-num-dots="1" data-position="220,187" style="background: #eb8570;"></box>
|
<box data-lightness="70" data-algo="float" data-num-dots="1" data-position="220,187" style="background: #eb8570;"></box>
|
||||||
<box class="no-squircles" data-lightness="60" data-algo="float" data-num-dots="1" data-position="225,237" style="background: #dcce7f;"></box>
|
<box data-lightness="60" data-algo="float" data-num-dots="1" data-position="225,237" style="background: #dcce7f;"></box>
|
||||||
<box class="no-squircles" data-lightness="60" data-algo="float" data-num-dots="1" data-position="147,195" style="background: #5becad;"></box>
|
<box data-lightness="60" data-algo="float" data-num-dots="1" data-position="147,195" style="background: #5becad;"></box>
|
||||||
<box class="no-squircles" data-lightness="50" data-algo="float" data-num-dots="1" data-position="81,84" style="background: #919bb5;"></box>
|
<box data-lightness="50" data-algo="float" data-num-dots="1" data-position="81,84" style="background: #919bb5;"></box>
|
||||||
</hbox>
|
</hbox>
|
||||||
<hbox>
|
<hbox>
|
||||||
<box class="no-squircles" data-lightness="90" data-algo="analogous" data-num-dots="3" data-position="240,240"
|
<box data-lightness="90" data-algo="analogous" data-num-dots="3" data-position="240,240"
|
||||||
style="--c1: rgb(245, 237, 214); --c2: rgb(221, 243, 216); --c3: rgb(243, 216, 225);" />
|
style="--c1: rgb(245, 237, 214); --c2: rgb(221, 243, 216); --c3: rgb(243, 216, 225);" />
|
||||||
<box class="no-squircles" data-lightness="85" data-algo="analogous" data-num-dots="3" data-position="233,157"
|
<box data-lightness="85" data-algo="analogous" data-num-dots="3" data-position="233,157"
|
||||||
style="--c1: rgb(243, 190, 222); --c2: rgb(247, 222, 186); --c3: rgb(223, 195, 238);" />
|
style="--c1: rgb(243, 190, 222); --c2: rgb(247, 222, 186); --c3: rgb(223, 195, 238);" />
|
||||||
<box class="no-squircles" data-lightness="80" data-algo="analogous" data-num-dots="3" data-position="236,111"
|
<box data-lightness="80" data-algo="analogous" data-num-dots="3" data-position="236,111"
|
||||||
style="--c1: rgb(229, 179, 228); --c2: rgb(236, 172, 178); --c3: rgb(197, 185, 223);" />
|
style="--c1: rgb(229, 179, 228); --c2: rgb(236, 172, 178); --c3: rgb(197, 185, 223);" />
|
||||||
<box class="no-squircles" data-lightness="70" data-algo="analogous" data-num-dots="3" data-position="234,173"
|
<box data-lightness="70" data-algo="analogous" data-num-dots="3" data-position="234,173"
|
||||||
style="--c1: rgb(235, 122, 159); --c2: rgb(239, 239, 118); --c3: rgb(210, 133, 224);" />
|
style="--c1: rgb(235, 122, 159); --c2: rgb(239, 239, 118); --c3: rgb(210, 133, 224);" />
|
||||||
<box class="no-squircles" data-lightness="70" data-algo="analogous" data-num-dots="3" data-position="220,187"
|
<box data-lightness="70" data-algo="analogous" data-num-dots="3" data-position="220,187"
|
||||||
style="--c1: rgb(242, 115, 123); --c2: rgb(175, 242, 115); --c3: rgb(230, 125, 232);" />
|
style="--c1: rgb(242, 115, 123); --c2: rgb(175, 242, 115); --c3: rgb(230, 125, 232);" />
|
||||||
<box class="no-squircles" data-lightness="60" data-algo="analogous" data-num-dots="3" data-position="225,237"
|
<box data-lightness="60" data-algo="analogous" data-num-dots="3" data-position="225,237"
|
||||||
style="--c1: rgb(221, 205, 85); --c2: rgb(97, 212, 94); --c3: rgb(215, 91, 124);" />
|
style="--c1: rgb(221, 205, 85); --c2: rgb(97, 212, 94); --c3: rgb(215, 91, 124);" />
|
||||||
<box class="no-squircles" data-lightness="60" data-algo="analogous" data-num-dots="3" data-position="147,195"
|
<box data-lightness="60" data-algo="analogous" data-num-dots="3" data-position="147,195"
|
||||||
style="--c1: rgb(75, 231, 210); --c2: rgb(84, 175, 222); --c3: rgb(62, 244, 112);" />
|
style="--c1: rgb(75, 231, 210); --c2: rgb(84, 175, 222); --c3: rgb(62, 244, 112);" />
|
||||||
<box class="no-squircles" data-lightness="55" data-algo="analogous" data-num-dots="3" data-position="81,84"
|
<box data-lightness="55" data-algo="analogous" data-num-dots="3" data-position="81,84"
|
||||||
style="--c1: rgb(122, 132, 158); --c2: rgb(137, 117, 164); --c3: rgb(116, 162, 164);" />
|
style="--c1: rgb(122, 132, 158); --c2: rgb(137, 117, 164); --c3: rgb(116, 162, 164);" />
|
||||||
</hbox>
|
</hbox>
|
||||||
<hbox>
|
<hbox>
|
||||||
<box class="no-squircles" data-lightness="10" data-algo="float" data-num-dots="1" data-position="171,72" style="background:rgb(93, 86, 106);"></box>
|
<box data-lightness="10" data-algo="float" data-num-dots="1" data-position="171,72" style="background:rgb(93, 86, 106);"></box>
|
||||||
<box class="no-squircles" data-lightness="40" data-algo="float" data-num-dots="1" data-position="265,79" style="background: #997096;"></box>
|
<box data-lightness="40" data-algo="float" data-num-dots="1" data-position="265,79" style="background: #997096;"></box>
|
||||||
<box class="no-squircles" data-lightness="35" data-algo="float" data-num-dots="1" data-position="301,176" style="background: #956066;"></box>
|
<box data-lightness="35" data-algo="float" data-num-dots="1" data-position="301,176" style="background: #956066;"></box>
|
||||||
<box class="no-squircles" data-lightness="30" data-algo="float" data-num-dots="1" data-position="237,210" style="background: #9c6645;"></box>
|
<box data-lightness="30" data-algo="float" data-num-dots="1" data-position="237,210" style="background: #9c6645;"></box>
|
||||||
<box class="no-squircles" data-lightness="30" data-algo="float" data-num-dots="1" data-position="91,228" style="background: #517b6c;"></box>
|
<box data-lightness="30" data-algo="float" data-num-dots="1" data-position="91,228" style="background: #517b6c;"></box>
|
||||||
<box class="no-squircles" data-lightness="25" data-algo="float" data-num-dots="1" data-position="67,159" style="background: #576e75;"></box>
|
<box data-lightness="25" data-algo="float" data-num-dots="1" data-position="67,159" style="background: #576e75;"></box>
|
||||||
<box class="no-squircles" data-lightness="20" data-algo="float" data-num-dots="1" data-position="314,235" style="background:rgb(131, 109, 95);"></box>
|
<box data-lightness="20" data-algo="float" data-num-dots="1" data-position="314,235" style="background:rgb(131, 109, 95);"></box>
|
||||||
<box class="no-squircles" data-lightness="20" data-algo="float" data-num-dots="1" data-position="118,215" style="background: #447464;"></box>
|
<box data-lightness="20" data-algo="float" data-num-dots="1" data-position="118,215" style="background: #447464;"></box>
|
||||||
</hbox>
|
</hbox>
|
||||||
<hbox>
|
<hbox>
|
||||||
<box class="no-squircles" data-lightness="10" data-algo="analogous" data-num-dots="3" data-position="171,72"
|
<box data-lightness="10" data-algo="analogous" data-num-dots="3" data-position="171,72"
|
||||||
style="--c1: rgb(23, 17, 34); --c2: rgb(37, 14, 35); --c3: rgb(18, 22, 33);" />
|
style="--c1: rgb(23, 17, 34); --c2: rgb(37, 14, 35); --c3: rgb(18, 22, 33);" />
|
||||||
<box class="no-squircles" data-lightness="40" data-algo="analogous" data-num-dots="3" data-position="265,79"
|
<box data-lightness="40" data-algo="analogous" data-num-dots="3" data-position="265,79"
|
||||||
style="--c1: rgb(128, 76, 124); --c2: rgb(141, 63, 66); --c3: rgb(97, 88, 116);" />
|
style="--c1: rgb(128, 76, 124); --c2: rgb(141, 63, 66); --c3: rgb(97, 88, 116);" />
|
||||||
<box class="no-squircles" data-lightness="35" data-algo="analogous" data-num-dots="3" data-position="301,176"
|
<box data-lightness="35" data-algo="analogous" data-num-dots="3" data-position="301,176"
|
||||||
style="--c1: rgb(122, 56, 64); --c2: rgb(126, 121, 52); --c3: rgb(111, 68, 110);" />
|
style="--c1: rgb(122, 56, 64); --c2: rgb(126, 121, 52); --c3: rgb(111, 68, 110);" />
|
||||||
<box class="no-squircles" data-lightness="30" data-algo="analogous" data-num-dots="3" data-position="237,210"
|
<box data-lightness="30" data-algo="analogous" data-num-dots="3" data-position="237,210"
|
||||||
style="--c1: rgb(131, 65, 22); --c2: rgb(64, 128, 25); --c3: rgb(122, 31, 91);" />
|
style="--c1: rgb(131, 65, 22); --c2: rgb(64, 128, 25); --c3: rgb(122, 31, 91);" />
|
||||||
<box class="no-squircles" data-lightness="30" data-algo="analogous" data-num-dots="3" data-position="91,228"
|
<box data-lightness="30" data-algo="analogous" data-num-dots="3" data-position="91,228"
|
||||||
style="--c1: rgb(45, 108, 85); --c2: rgb(52, 85, 101); --c3: rgb(52, 118, 35);" />
|
style="--c1: rgb(45, 108, 85); --c2: rgb(52, 85, 101); --c3: rgb(52, 118, 35);" />
|
||||||
<box class="no-squircles" data-lightness="25" data-algo="analogous" data-num-dots="3" data-position="67,159"
|
<box data-lightness="25" data-algo="analogous" data-num-dots="3" data-position="67,159"
|
||||||
style="--c1: rgb(45, 74, 83); --c2: rgb(46, 50, 81); --c3: rgb(38, 90, 65);" />
|
style="--c1: rgb(45, 74, 83); --c2: rgb(46, 50, 81); --c3: rgb(38, 90, 65);" />
|
||||||
<box class="no-squircles" data-lightness="20" data-algo="analogous" data-num-dots="3" data-position="314,235"
|
<box data-lightness="20" data-algo="analogous" data-num-dots="3" data-position="314,235"
|
||||||
style="--c1: rgb(64, 47, 38); --c2: rgb(55, 64, 38); --c3: rgb(59, 43, 52);" />
|
style="--c1: rgb(64, 47, 38); --c2: rgb(55, 64, 38); --c3: rgb(59, 43, 52);" />
|
||||||
<box class="no-squircles" data-lightness="20" data-algo="analogous" data-num-dots="3" data-position="118,215"
|
<box data-lightness="20" data-algo="analogous" data-num-dots="3" data-position="118,215"
|
||||||
style="--c1: rgb(22, 80, 61); --c2: rgb(26, 60, 76); --c3: rgb(27, 87, 15);" />
|
style="--c1: rgb(22, 80, 61); --c2: rgb(26, 60, 76); --c3: rgb(27, 87, 15);" />
|
||||||
</hbox>
|
</hbox>
|
||||||
<hbox>
|
<hbox>
|
||||||
# Start from black to white in a span on 8 steps and.
|
# Start from black to white in a span on 8 steps and.
|
||||||
# They must all go from the middle to the right side. They must always stay verically centered.
|
# They must all go from the middle to the right side. They must always stay verically centered.
|
||||||
# And reach to 180 on the right side, meaning we must divide the width in 16 segments.
|
# And reach to 180 on the right side, meaning we must divide the width in 16 segments.
|
||||||
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
||||||
data-position="340,180" style="background: rgb(224, 224, 224);"></box>
|
data-position="340,180" style="background: rgb(224, 224, 224);"></box>
|
||||||
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
||||||
data-position="337.5,180" style="background: rgb(224, 224, 224);"></box>
|
data-position="337.5,180" style="background: rgb(224, 224, 224);"></box>
|
||||||
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
||||||
data-position="315,180" style="background: rgb(192, 192, 192);"></box>
|
data-position="315,180" style="background: rgb(192, 192, 192);"></box>
|
||||||
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
||||||
data-position="292.5,180" style="background: rgb(160, 160, 160);"></box>
|
data-position="292.5,180" style="background: rgb(160, 160, 160);"></box>
|
||||||
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
||||||
data-position="270,180" style="background: rgb(128, 128, 128);"></box>
|
data-position="270,180" style="background: rgb(128, 128, 128);"></box>
|
||||||
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
||||||
data-position="247.5,180" style="background: rgb(96, 96, 96);"></box>
|
data-position="247.5,180" style="background: rgb(96, 96, 96);"></box>
|
||||||
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
||||||
data-position="225,180" style="background: rgb(64, 64, 64);"></box>
|
data-position="225,180" style="background: rgb(64, 64, 64);"></box>
|
||||||
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
||||||
data-position="202.5,180" style="background: rgb(32, 32, 32);"></box>
|
data-position="202.5,180" style="background: rgb(32, 32, 32);"></box>
|
||||||
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
|
||||||
data-position="180,180" style="background: rgb(0, 0, 0);"></box>
|
data-position="180,180" style="background: rgb(0, 0, 0);"></box>
|
||||||
</hbox>
|
</hbox>
|
||||||
</hbox>
|
</hbox>
|
||||||
@@ -131,10 +131,10 @@
|
|||||||
</box>
|
</box>
|
||||||
<html:input type="range" value="0.4" step="0.001" id="PanelUI-zen-gradient-generator-opacity"
|
<html:input type="range" value="0.4" step="0.001" id="PanelUI-zen-gradient-generator-opacity"
|
||||||
#ifdef XP_MACOSX
|
#ifdef XP_MACOSX
|
||||||
max="0.8"
|
max="0.9"
|
||||||
min="0.30"
|
min="0.30"
|
||||||
#else
|
#else
|
||||||
max="0.8"
|
max="0.9"
|
||||||
min="0.25"
|
min="0.25"
|
||||||
#endif
|
#endif
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
skipintoolbarset="true"
|
skipintoolbarset="true"
|
||||||
context="toolbar-context-menu"
|
context="toolbar-context-menu"
|
||||||
mode="icons">
|
mode="icons">
|
||||||
|
<toolbarbutton removable="true" class="chromeclass-toolbar-additional toolbarbutton-1 zen-sidebar-action-button" id="zen-library-button" command="cmd_zenToggleLibrary"></toolbarbutton>
|
||||||
<toolbarbutton removable="true" class="chromeclass-toolbar-additional toolbarbutton-1 zen-sidebar-action-button" id="zen-expand-sidebar-button" command="cmd_zenToggleSidebar" data-l10n-id="sidebar-zen-expand"></toolbarbutton>
|
<toolbarbutton removable="true" class="chromeclass-toolbar-additional toolbarbutton-1 zen-sidebar-action-button" id="zen-expand-sidebar-button" command="cmd_zenToggleSidebar" data-l10n-id="sidebar-zen-expand"></toolbarbutton>
|
||||||
<zen-workspace-icons id="zen-workspaces-button" overflows="false" removable="false"></zen-workspace-icons>
|
<zen-workspace-icons id="zen-workspaces-button" overflows="false" removable="false"></zen-workspace-icons>
|
||||||
<toolbarbutton removable="true" class="chromeclass-toolbar-additional toolbarbutton-1 zen-sidebar-action-button" id="zen-create-new-button" context="zenCreateNewPopup" data-l10n-id="sidebar-zen-create-new"></toolbarbutton>
|
<toolbarbutton removable="true" class="chromeclass-toolbar-additional toolbarbutton-1 zen-sidebar-action-button" id="zen-create-new-button" context="zenCreateNewPopup" data-l10n-id="sidebar-zen-create-new"></toolbarbutton>
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
diff --git a/browser/components/contextualidentity/content/ContainerCreationPanel.mjs b/browser/components/contextualidentity/content/ContainerCreationPanel.mjs
|
|
||||||
index e04d7a4738192703e8f7f8555f50aaf0a619a5bd..b86e4853c421856f84ad8e017062f0d611b88aad 100644
|
|
||||||
--- a/browser/components/contextualidentity/content/ContainerCreationPanel.mjs
|
|
||||||
+++ b/browser/components/contextualidentity/content/ContainerCreationPanel.mjs
|
|
||||||
@@ -4,7 +4,7 @@
|
|
||||||
|
|
||||||
import { ContainerEditor } from "chrome://browser/content/usercontext/ContainerEditor.mjs";
|
|
||||||
|
|
||||||
-const ANCHOR_ID = "userContext-icons";
|
|
||||||
+const ANCHOR_ID = "navigator-toolbox";
|
|
||||||
const ANCHOR_PINNED_CLASS = "container-anchor-pinned";
|
|
||||||
|
|
||||||
const lazy = {};
|
|
||||||
@@ -95,6 +95,6 @@ export const ContainerCreationPanel = {
|
|
||||||
anchor.hidden = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
- panel.openPopup(anchor, "bottomright topright");
|
|
||||||
+ panel.openPopup(anchor, win.gZenUIManager.panelUIPosition());
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs
|
diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs
|
||||||
index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa13303d3a3 100644
|
index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2681652e5 100644
|
||||||
--- a/browser/components/customizableui/CustomizableUI.sys.mjs
|
--- a/browser/components/customizableui/CustomizableUI.sys.mjs
|
||||||
+++ b/browser/components/customizableui/CustomizableUI.sys.mjs
|
+++ b/browser/components/customizableui/CustomizableUI.sys.mjs
|
||||||
@@ -13,6 +13,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
|
@@ -13,6 +13,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
|
||||||
@@ -10,7 +10,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
HomePage: "resource:///modules/HomePage.sys.mjs",
|
HomePage: "resource:///modules/HomePage.sys.mjs",
|
||||||
PanelMultiView:
|
PanelMultiView:
|
||||||
"moz-src:///browser/components/customizableui/PanelMultiView.sys.mjs",
|
"moz-src:///browser/components/customizableui/PanelMultiView.sys.mjs",
|
||||||
@@ -352,7 +353,7 @@ var CustomizableUIInternal = {
|
@@ -348,7 +349,7 @@ var CustomizableUIInternal = {
|
||||||
{
|
{
|
||||||
type: CustomizableUI.TYPE_PANEL,
|
type: CustomizableUI.TYPE_PANEL,
|
||||||
defaultPlacements: [],
|
defaultPlacements: [],
|
||||||
@@ -19,7 +19,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
},
|
},
|
||||||
false
|
false
|
||||||
);
|
);
|
||||||
@@ -362,27 +363,23 @@ var CustomizableUIInternal = {
|
@@ -358,27 +359,23 @@ var CustomizableUIInternal = {
|
||||||
"back-button",
|
"back-button",
|
||||||
"forward-button",
|
"forward-button",
|
||||||
"stop-reload-button",
|
"stop-reload-button",
|
||||||
@@ -50,18 +50,17 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
defaultCollapsed: false,
|
defaultCollapsed: false,
|
||||||
},
|
},
|
||||||
true
|
true
|
||||||
@@ -406,10 +403,6 @@ var CustomizableUIInternal = {
|
@@ -402,9 +399,6 @@ var CustomizableUIInternal = {
|
||||||
type: CustomizableUI.TYPE_TOOLBAR,
|
type: CustomizableUI.TYPE_TOOLBAR,
|
||||||
defaultPlacements: [
|
defaultPlacements: [
|
||||||
"tabbrowser-tabs",
|
"tabbrowser-tabs",
|
||||||
- "new-tab-button",
|
- "new-tab-button",
|
||||||
- "spring",
|
|
||||||
- "alltabs-button",
|
- "alltabs-button",
|
||||||
- "ai-window-toggle",
|
- "ai-window-toggle",
|
||||||
],
|
],
|
||||||
verticalTabsDefaultPlacements: [],
|
verticalTabsDefaultPlacements: [],
|
||||||
defaultCollapsed: null,
|
defaultCollapsed: null,
|
||||||
@@ -502,6 +495,7 @@ var CustomizableUIInternal = {
|
@@ -484,6 +478,7 @@ var CustomizableUIInternal = {
|
||||||
CustomizableUI.AREA_NAVBAR,
|
CustomizableUI.AREA_NAVBAR,
|
||||||
CustomizableUI.AREA_BOOKMARKS,
|
CustomizableUI.AREA_BOOKMARKS,
|
||||||
CustomizableUI.AREA_TABSTRIP,
|
CustomizableUI.AREA_TABSTRIP,
|
||||||
@@ -69,7 +68,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
]);
|
]);
|
||||||
if (AppConstants.platform != "macosx") {
|
if (AppConstants.platform != "macosx") {
|
||||||
toolbars.add(CustomizableUI.AREA_MENUBAR);
|
toolbars.add(CustomizableUI.AREA_MENUBAR);
|
||||||
@@ -1334,6 +1328,9 @@ var CustomizableUIInternal = {
|
@@ -1285,6 +1280,9 @@ var CustomizableUIInternal = {
|
||||||
placements = gPlacements.get(area);
|
placements = gPlacements.get(area);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +78,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
// For toolbars that need it, mark as dirty.
|
// For toolbars that need it, mark as dirty.
|
||||||
let defaultPlacements = areaProperties.get("defaultPlacements");
|
let defaultPlacements = areaProperties.get("defaultPlacements");
|
||||||
if (
|
if (
|
||||||
@@ -1842,7 +1839,6 @@ var CustomizableUIInternal = {
|
@@ -1793,7 +1791,6 @@ var CustomizableUIInternal = {
|
||||||
lazy.log.info(
|
lazy.log.info(
|
||||||
"Widget " + aWidgetId + " not found, unable to remove from " + aArea
|
"Widget " + aWidgetId + " not found, unable to remove from " + aArea
|
||||||
);
|
);
|
||||||
@@ -87,7 +86,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.notifyDOMChange(widgetNode, null, container, true, () => {
|
this.notifyDOMChange(widgetNode, null, container, true, () => {
|
||||||
@@ -1852,7 +1848,7 @@ var CustomizableUIInternal = {
|
@@ -1803,7 +1800,7 @@ var CustomizableUIInternal = {
|
||||||
// We also need to remove the panel context menu if it's there:
|
// We also need to remove the panel context menu if it's there:
|
||||||
this.ensureButtonContextMenu(widgetNode);
|
this.ensureButtonContextMenu(widgetNode);
|
||||||
if (gPalette.has(aWidgetId) || this.isSpecialWidget(aWidgetId)) {
|
if (gPalette.has(aWidgetId) || this.isSpecialWidget(aWidgetId)) {
|
||||||
@@ -96,7 +95,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
} else {
|
} else {
|
||||||
window.gNavToolbox.palette.appendChild(widgetNode);
|
window.gNavToolbox.palette.appendChild(widgetNode);
|
||||||
}
|
}
|
||||||
@@ -2020,16 +2016,16 @@ var CustomizableUIInternal = {
|
@@ -1971,16 +1968,16 @@ var CustomizableUIInternal = {
|
||||||
elem.setAttribute("skipintoolbarset", "true");
|
elem.setAttribute("skipintoolbarset", "true");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -116,7 +115,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
// Handle initial state of vertical tabs.
|
// Handle initial state of vertical tabs.
|
||||||
if (isVerticalTabs) {
|
if (isVerticalTabs) {
|
||||||
// Show the vertical tabs toolbar
|
// Show the vertical tabs toolbar
|
||||||
@@ -2271,6 +2267,10 @@ var CustomizableUIInternal = {
|
@@ -2222,6 +2219,10 @@ var CustomizableUIInternal = {
|
||||||
* The identifier string of the area that aNode is being inserted into.
|
* The identifier string of the area that aNode is being inserted into.
|
||||||
*/
|
*/
|
||||||
insertWidgetBefore(aNode, aNextNode, aContainer, aAreaId) {
|
insertWidgetBefore(aNode, aNextNode, aContainer, aAreaId) {
|
||||||
@@ -127,7 +126,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
this.notifyDOMChange(aNode, aNextNode, aContainer, false, () => {
|
this.notifyDOMChange(aNode, aNextNode, aContainer, false, () => {
|
||||||
this.setLocationAttributes(aNode, aAreaId);
|
this.setLocationAttributes(aNode, aAreaId);
|
||||||
aContainer.insertBefore(aNode, aNextNode);
|
aContainer.insertBefore(aNode, aNextNode);
|
||||||
@@ -4647,7 +4647,7 @@ var CustomizableUIInternal = {
|
@@ -4592,7 +4593,7 @@ var CustomizableUIInternal = {
|
||||||
* For all registered areas, builds those areas to reflect the current
|
* For all registered areas, builds those areas to reflect the current
|
||||||
* placement state of all widgets.
|
* placement state of all widgets.
|
||||||
*/
|
*/
|
||||||
@@ -136,7 +135,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
for (let [areaId, areaNodes] of gBuildAreas) {
|
for (let [areaId, areaNodes] of gBuildAreas) {
|
||||||
let placements = gPlacements.get(areaId);
|
let placements = gPlacements.get(areaId);
|
||||||
let isFirstChangedToolbar = true;
|
let isFirstChangedToolbar = true;
|
||||||
@@ -4658,7 +4658,7 @@ var CustomizableUIInternal = {
|
@@ -4603,7 +4604,7 @@ var CustomizableUIInternal = {
|
||||||
if (area.get("type") == CustomizableUI.TYPE_TOOLBAR) {
|
if (area.get("type") == CustomizableUI.TYPE_TOOLBAR) {
|
||||||
let defaultCollapsed = area.get("defaultCollapsed");
|
let defaultCollapsed = area.get("defaultCollapsed");
|
||||||
let win = areaNode.documentGlobal;
|
let win = areaNode.documentGlobal;
|
||||||
@@ -145,7 +144,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
win.setToolbarVisibility(
|
win.setToolbarVisibility(
|
||||||
areaNode,
|
areaNode,
|
||||||
typeof defaultCollapsed == "string"
|
typeof defaultCollapsed == "string"
|
||||||
@@ -5971,6 +5971,7 @@ export var CustomizableUI = {
|
@@ -5899,6 +5900,7 @@ export var CustomizableUI = {
|
||||||
unregisterArea(aName, aDestroyPlacements) {
|
unregisterArea(aName, aDestroyPlacements) {
|
||||||
CustomizableUIInternal.unregisterArea(aName, aDestroyPlacements);
|
CustomizableUIInternal.unregisterArea(aName, aDestroyPlacements);
|
||||||
},
|
},
|
||||||
@@ -153,7 +152,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
/**
|
/**
|
||||||
* Add a widget to an area.
|
* Add a widget to an area.
|
||||||
* If the area to which you try to add is not known to CustomizableUI,
|
* If the area to which you try to add is not known to CustomizableUI,
|
||||||
@@ -7946,7 +7947,9 @@ class OverflowableToolbar {
|
@@ -7869,7 +7871,9 @@ class OverflowableToolbar {
|
||||||
);
|
);
|
||||||
|
|
||||||
if (webExtList && CustomizableUI.isWebExtensionWidget(child.id)) {
|
if (webExtList && CustomizableUI.isWebExtensionWidget(child.id)) {
|
||||||
@@ -163,27 +162,16 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
webExtList.insertBefore(child, webExtList.firstElementChild);
|
webExtList.insertBefore(child, webExtList.firstElementChild);
|
||||||
} else {
|
} else {
|
||||||
child.setAttribute("cui-anchorid", this.#defaultListButton.id);
|
child.setAttribute("cui-anchorid", this.#defaultListButton.id);
|
||||||
@@ -7995,6 +7998,7 @@ class OverflowableToolbar {
|
@@ -7929,7 +7933,7 @@ class OverflowableToolbar {
|
||||||
return aElement.getBoundingClientRect().width;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ let toolbar = this.#toolbar;
|
|
||||||
function sumChildrenInlineSize(aParent, aExceptChild = null) {
|
|
||||||
let sum = 0;
|
|
||||||
for (let child of aParent.children) {
|
|
||||||
@@ -8006,7 +8010,10 @@ class OverflowableToolbar {
|
|
||||||
) {
|
) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
- sum += parseFloat(style.marginLeft) + parseFloat(style.marginRight);
|
- sum += parseFloat(style.marginLeft) + parseFloat(style.marginRight);
|
||||||
+ sum += parseFloat(style.marginLeft) + (win.gZenVerticalTabsManager._hasSetSingleToolbar ? Math.max(0, parseFloat(style.marginRight)) : parseFloat(style.marginRight));
|
+ sum += parseFloat(style.marginLeft) + (win.gZenVerticalTabsManager._hasSetSingleToolbar ? Math.max(0, parseFloat(style.marginRight)) : parseFloat(style.marginRight));
|
||||||
+ if (toolbar.id == 'zen-sidebar-top-buttons' && toolbar.hasAttribute("overflowing")) {
|
|
||||||
+ sum += 2; // Add extra padding that we remove from the CSS
|
|
||||||
+ }
|
|
||||||
if (child != aExceptChild) {
|
if (child != aExceptChild) {
|
||||||
sum += getInlineSize(child);
|
sum += getInlineSize(child);
|
||||||
}
|
}
|
||||||
@@ -8030,11 +8037,11 @@ class OverflowableToolbar {
|
@@ -7953,11 +7957,11 @@ class OverflowableToolbar {
|
||||||
parseFloat(style.paddingLeft) -
|
parseFloat(style.paddingLeft) -
|
||||||
parseFloat(style.paddingRight) -
|
parseFloat(style.paddingRight) -
|
||||||
toolbarChildrenWidth;
|
toolbarChildrenWidth;
|
||||||
@@ -197,7 +185,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
});
|
});
|
||||||
|
|
||||||
lazy.log.debug(
|
lazy.log.debug(
|
||||||
@@ -8049,7 +8056,39 @@ class OverflowableToolbar {
|
@@ -7972,7 +7976,39 @@ class OverflowableToolbar {
|
||||||
Math.max(targetWidth, targetChildrenWidth)
|
Math.max(targetWidth, targetChildrenWidth)
|
||||||
);
|
);
|
||||||
totalAvailWidth = Math.ceil(totalAvailWidth);
|
totalAvailWidth = Math.ceil(totalAvailWidth);
|
||||||
@@ -238,7 +226,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
return { isOverflowing, targetContentWidth, totalAvailWidth };
|
return { isOverflowing, targetContentWidth, totalAvailWidth };
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8110,7 +8149,11 @@ class OverflowableToolbar {
|
@@ -8033,7 +8069,11 @@ class OverflowableToolbar {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -251,7 +239,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
lazy.log.debug(
|
lazy.log.debug(
|
||||||
`Need ${minSize} but width is ${totalAvailWidth} so bailing`
|
`Need ${minSize} but width is ${totalAvailWidth} so bailing`
|
||||||
);
|
);
|
||||||
@@ -8143,7 +8186,7 @@ class OverflowableToolbar {
|
@@ -8066,7 +8106,7 @@ class OverflowableToolbar {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!inserted) {
|
if (!inserted) {
|
||||||
@@ -260,7 +248,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
}
|
}
|
||||||
child.removeAttribute("cui-anchorid");
|
child.removeAttribute("cui-anchorid");
|
||||||
child.removeAttribute("overflowedItem");
|
child.removeAttribute("overflowedItem");
|
||||||
@@ -8269,6 +8312,9 @@ class OverflowableToolbar {
|
@@ -8192,6 +8232,9 @@ class OverflowableToolbar {
|
||||||
* if no such list exists.
|
* if no such list exists.
|
||||||
*/
|
*/
|
||||||
get #webExtList() {
|
get #webExtList() {
|
||||||
@@ -270,7 +258,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
if (!this.#webExtListRef) {
|
if (!this.#webExtListRef) {
|
||||||
let targetID = this.#toolbar.getAttribute("addon-webext-overflowtarget");
|
let targetID = this.#toolbar.getAttribute("addon-webext-overflowtarget");
|
||||||
if (!targetID) {
|
if (!targetID) {
|
||||||
@@ -8280,6 +8326,9 @@ class OverflowableToolbar {
|
@@ -8203,6 +8246,9 @@ class OverflowableToolbar {
|
||||||
let win = this.#toolbar.documentGlobal;
|
let win = this.#toolbar.documentGlobal;
|
||||||
let { panel } = win.gUnifiedExtensions;
|
let { panel } = win.gUnifiedExtensions;
|
||||||
this.#webExtListRef = panel.querySelector(`#${targetID}`);
|
this.#webExtListRef = panel.querySelector(`#${targetID}`);
|
||||||
@@ -280,7 +268,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
|
|||||||
}
|
}
|
||||||
return this.#webExtListRef;
|
return this.#webExtListRef;
|
||||||
}
|
}
|
||||||
@@ -8488,7 +8537,7 @@ class OverflowableToolbar {
|
@@ -8411,7 +8457,7 @@ class OverflowableToolbar {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "mousedown": {
|
case "mousedown": {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
diff --git a/browser/components/preferences/config/account-sync.mjs b/browser/components/preferences/config/account-sync.mjs
|
diff --git a/browser/components/preferences/config/account-sync.mjs b/browser/components/preferences/config/account-sync.mjs
|
||||||
index b01fd4bb163ad53139fcbd8e79e12ef994d1fa13..dd60be4fe268618d6596cd5cfac3342975bd241a 100644
|
index b503987a08e2ce64bfc01c4e3a21e5e19ef834f0..b1c03a0b219fd3eddd93c1deaeb18ab79c85f168 100644
|
||||||
--- a/browser/components/preferences/config/account-sync.mjs
|
--- a/browser/components/preferences/config/account-sync.mjs
|
||||||
+++ b/browser/components/preferences/config/account-sync.mjs
|
+++ b/browser/components/preferences/config/account-sync.mjs
|
||||||
@@ -46,6 +46,7 @@ Preferences.addAll([
|
@@ -42,6 +42,7 @@ Preferences.addAll([
|
||||||
{ id: "services.sync.engine.creditcards", type: "bool" },
|
{ id: "services.sync.engine.creditcards", type: "bool" },
|
||||||
{ id: "services.sync.engine.addons", type: "bool" },
|
{ id: "services.sync.engine.addons", type: "bool" },
|
||||||
{ id: "services.sync.engine.prefs", type: "bool" },
|
{ id: "services.sync.engine.prefs", type: "bool" },
|
||||||
@@ -10,7 +10,7 @@ index b01fd4bb163ad53139fcbd8e79e12ef994d1fa13..dd60be4fe268618d6596cd5cfac33429
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -557,6 +558,7 @@ const SYNC_ENGINE_SETTINGS = [
|
@@ -546,6 +547,7 @@ const SYNC_ENGINE_SETTINGS = [
|
||||||
type: "payments",
|
type: "payments",
|
||||||
},
|
},
|
||||||
{ id: "syncAddons", pref: "services.sync.engine.addons", type: "addons" },
|
{ id: "syncAddons", pref: "services.sync.engine.addons", type: "addons" },
|
||||||
@@ -18,37 +18,3 @@ index b01fd4bb163ad53139fcbd8e79e12ef994d1fa13..dd60be4fe268618d6596cd5cfac33429
|
|||||||
{ id: "syncSettings", pref: "services.sync.engine.prefs", type: "settings" },
|
{ id: "syncSettings", pref: "services.sync.engine.prefs", type: "settings" },
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -564,6 +566,12 @@ SYNC_ENGINE_SETTINGS.forEach(({ id, pref }) => {
|
|
||||||
Preferences.addSetting({ id, pref });
|
|
||||||
});
|
|
||||||
|
|
||||||
+Preferences.addSetting({ id: "zenSyncWorkspacesGroup" });
|
|
||||||
+Preferences.addSetting({
|
|
||||||
+ id: "zenSyncWorkspaces",
|
|
||||||
+ pref: "services.sync.engine.spaces",
|
|
||||||
+});
|
|
||||||
+
|
|
||||||
Preferences.addSetting({
|
|
||||||
id: "syncEngines",
|
|
||||||
deps: SYNC_ENGINE_SETTINGS.map(({ id }) => id),
|
|
||||||
@@ -995,6 +1003,20 @@ SettingGroupManager.registerGroups({
|
|
||||||
id: "syncEnginesList",
|
|
||||||
control: "sync-engines-list",
|
|
||||||
},
|
|
||||||
+ {
|
|
||||||
+ id: "zenSyncWorkspacesGroup",
|
|
||||||
+ control: "moz-box-item",
|
|
||||||
+ items: [
|
|
||||||
+ {
|
|
||||||
+ id: "zenSyncWorkspaces",
|
|
||||||
+ l10nId: "zen-settings-workspaces-sync",
|
|
||||||
+ control: "moz-toggle",
|
|
||||||
+ controlAttrs: {
|
|
||||||
+ inputlayout: "inline-end",
|
|
||||||
+ },
|
|
||||||
+ },
|
|
||||||
+ ],
|
|
||||||
+ },
|
|
||||||
{
|
|
||||||
id: "syncChangeOptions",
|
|
||||||
control: "moz-box-button",
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js
|
diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js
|
||||||
index 94612d8e28af58fcb04914440348b899a0a1e08f..da3b1ffd09745d09589283356d1001dbfb76a468 100644
|
index a76699af75252bec31e17b562463c37236cbbfe5..6355a6ee92754846ffcdd123ac49545d520470c7 100644
|
||||||
--- a/browser/components/preferences/preferences.js
|
--- a/browser/components/preferences/preferences.js
|
||||||
+++ b/browser/components/preferences/preferences.js
|
+++ b/browser/components/preferences/preferences.js
|
||||||
@@ -132,6 +132,7 @@ ChromeUtils.defineLazyGetter(this, "gSubDialog", function () {
|
@@ -132,6 +132,7 @@ ChromeUtils.defineLazyGetter(this, "gSubDialog", function () {
|
||||||
@@ -10,7 +10,7 @@ index 94612d8e28af58fcb04914440348b899a0a1e08f..da3b1ffd09745d09589283356d1001db
|
|||||||
],
|
],
|
||||||
resizeCallback: async ({ title, frame }) => {
|
resizeCallback: async ({ title, frame }) => {
|
||||||
// Search within main document and highlight matched keyword.
|
// Search within main document and highlight matched keyword.
|
||||||
@@ -471,6 +472,8 @@ const CONFIG_PANES = Object.freeze({
|
@@ -462,6 +463,8 @@ const CONFIG_PANES = Object.freeze({
|
||||||
tabsBrowsing: {
|
tabsBrowsing: {
|
||||||
l10nId: "tabs-browsing-section",
|
l10nId: "tabs-browsing-section",
|
||||||
groupIds: [
|
groupIds: [
|
||||||
@@ -19,7 +19,7 @@ index 94612d8e28af58fcb04914440348b899a0a1e08f..da3b1ffd09745d09589283356d1001db
|
|||||||
"browserLayout",
|
"browserLayout",
|
||||||
"tabs",
|
"tabs",
|
||||||
"pageNavigation",
|
"pageNavigation",
|
||||||
@@ -518,7 +521,7 @@ function register_module(categoryName, categoryObject) {
|
@@ -509,7 +512,7 @@ function register_module(categoryName, categoryObject) {
|
||||||
}
|
}
|
||||||
this._initted = true;
|
this._initted = true;
|
||||||
let template = document.getElementById("template-" + categoryName);
|
let template = document.getElementById("template-" + categoryName);
|
||||||
@@ -28,7 +28,7 @@ index 94612d8e28af58fcb04914440348b899a0a1e08f..da3b1ffd09745d09589283356d1001db
|
|||||||
// Replace the template element with the nodes inside of it.
|
// Replace the template element with the nodes inside of it.
|
||||||
template.replaceWith(template.content);
|
template.replaceWith(template.content);
|
||||||
|
|
||||||
@@ -562,6 +565,10 @@ function init_all() {
|
@@ -553,6 +556,10 @@ function init_all() {
|
||||||
register_module("paneHome", gHomePane);
|
register_module("paneHome", gHomePane);
|
||||||
register_module("paneSearch", gSearchPane);
|
register_module("paneSearch", gSearchPane);
|
||||||
register_module("panePrivacy", gPrivacyPane);
|
register_module("panePrivacy", gPrivacyPane);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ index 1b8c38159314b6edee9e6f455beb2b63db1ad3f0..1308345db640dba6b2848b49ef7c1181
|
|||||||
+ </html:moz-page-nav-button>
|
+ </html:moz-page-nav-button>
|
||||||
+ <html:moz-page-nav-button id="category-zen-CKS"
|
+ <html:moz-page-nav-button id="category-zen-CKS"
|
||||||
+ view="paneZenCKS"
|
+ view="paneZenCKS"
|
||||||
+ iconsrc="chrome://browser/skin/preferences/category-accessibility.svg"
|
+ iconsrc="chrome://browser/skin/quickactions.svg"
|
||||||
+ data-l10n-id="pane-zen-CKS-title">
|
+ data-l10n-id="pane-zen-CKS-title">
|
||||||
+ </html:moz-page-nav-button>
|
+ </html:moz-page-nav-button>
|
||||||
+ <html:moz-page-nav-button id="category-zen-marketplace"
|
+ <html:moz-page-nav-button id="category-zen-marketplace"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/browser/components/tabbrowser/content/drag-and-drop.js b/browser/components/tabbrowser/content/drag-and-drop.js
|
diff --git a/browser/components/tabbrowser/content/drag-and-drop.js b/browser/components/tabbrowser/content/drag-and-drop.js
|
||||||
index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8edf9bcf4 100644
|
index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b15a030046 100644
|
||||||
--- a/browser/components/tabbrowser/content/drag-and-drop.js
|
--- a/browser/components/tabbrowser/content/drag-and-drop.js
|
||||||
+++ b/browser/components/tabbrowser/content/drag-and-drop.js
|
+++ b/browser/components/tabbrowser/content/drag-and-drop.js
|
||||||
@@ -35,6 +35,9 @@
|
@@ -35,6 +35,9 @@
|
||||||
@@ -12,7 +12,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
if (isTab(element) || isSplitViewWrapper(element)) {
|
if (isTab(element) || isSplitViewWrapper(element)) {
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
@@ -128,6 +131,9 @@
|
@@ -118,6 +121,9 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
|
let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
|
||||||
@@ -22,7 +22,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
if (
|
if (
|
||||||
(dropEffect == "move" || dropEffect == "copy") &&
|
(dropEffect == "move" || dropEffect == "copy") &&
|
||||||
document == draggedTab.ownerDocument &&
|
document == draggedTab.ownerDocument &&
|
||||||
@@ -148,6 +154,7 @@
|
@@ -138,6 +144,7 @@
|
||||||
!draggedTab.group.collapsed
|
!draggedTab.group.collapsed
|
||||||
) {
|
) {
|
||||||
draggedTab.group.collapsed = true;
|
draggedTab.group.collapsed = true;
|
||||||
@@ -30,7 +30,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dropEffect == "move") {
|
if (dropEffect == "move") {
|
||||||
@@ -155,10 +162,6 @@
|
@@ -145,10 +152,6 @@
|
||||||
|
|
||||||
// Pinned tabs in expanded vertical mode are on a grid format and require
|
// Pinned tabs in expanded vertical mode are on a grid format and require
|
||||||
// different logic to drag and drop.
|
// different logic to drag and drop.
|
||||||
@@ -41,7 +41,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
this._animateTabMove(event);
|
this._animateTabMove(event);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -297,6 +300,10 @@
|
@@ -287,6 +290,10 @@
|
||||||
|
|
||||||
this._tabDropIndicator.hidden = true;
|
this._tabDropIndicator.hidden = true;
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
@@ -52,7 +52,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
if (draggedTab && dropEffect == "copy") {
|
if (draggedTab && dropEffect == "copy") {
|
||||||
let duplicatedDraggedTab;
|
let duplicatedDraggedTab;
|
||||||
let duplicatedTabs = [];
|
let duplicatedTabs = [];
|
||||||
@@ -324,12 +331,16 @@
|
@@ -312,12 +319,16 @@
|
||||||
let translateOffsetY = oldTranslateY % tabHeight;
|
let translateOffsetY = oldTranslateY % tabHeight;
|
||||||
let newTranslateX = oldTranslateX - translateOffsetX;
|
let newTranslateX = oldTranslateX - translateOffsetX;
|
||||||
let newTranslateY = oldTranslateY - translateOffsetY;
|
let newTranslateY = oldTranslateY - translateOffsetY;
|
||||||
@@ -73,7 +73,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
|
|
||||||
if (this._tabbrowserTabs.isContainerVerticalPinnedGrid(draggedTab)) {
|
if (this._tabbrowserTabs.isContainerVerticalPinnedGrid(draggedTab)) {
|
||||||
// Update both translate axis for pinned vertical expanded tabs
|
// Update both translate axis for pinned vertical expanded tabs
|
||||||
@@ -404,11 +415,13 @@
|
@@ -392,11 +403,13 @@
|
||||||
this._dragToPinPromoCard,
|
this._dragToPinPromoCard,
|
||||||
];
|
];
|
||||||
let shouldPin =
|
let shouldPin =
|
||||||
@@ -87,15 +87,15 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
isTab(draggedTab) &&
|
isTab(draggedTab) &&
|
||||||
draggedTab.pinned &&
|
draggedTab.pinned &&
|
||||||
this._tabbrowserTabs.arrowScrollbox.contains(event.target);
|
this._tabbrowserTabs.arrowScrollbox.contains(event.target);
|
||||||
@@ -484,6 +497,7 @@
|
@@ -466,6 +479,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+ shouldTranslate = false;
|
+ shouldTranslate = false;
|
||||||
if (shouldTranslate) {
|
if (shouldTranslate) {
|
||||||
this.#dropAnimationEndTime = Date.now() + DROP_ANIMATION_GRACE_MS;
|
|
||||||
let translationPromises = [];
|
let translationPromises = [];
|
||||||
@@ -496,7 +510,7 @@
|
for (let item of movingTabs) {
|
||||||
|
@@ -477,7 +491,7 @@
|
||||||
item.removeAttribute("tabdrop-samewindow");
|
item.removeAttribute("tabdrop-samewindow");
|
||||||
resolve();
|
resolve();
|
||||||
};
|
};
|
||||||
@@ -104,7 +104,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
postTransitionCleanup();
|
postTransitionCleanup();
|
||||||
} else {
|
} else {
|
||||||
let onTransitionEnd = transitionendEvent => {
|
let onTransitionEnd = transitionendEvent => {
|
||||||
@@ -580,7 +594,7 @@
|
@@ -552,7 +566,7 @@
|
||||||
if (tab.selected) {
|
if (tab.selected) {
|
||||||
selectedTab = tab;
|
selectedTab = tab;
|
||||||
indexForSelectedTab = newIndex;
|
indexForSelectedTab = newIndex;
|
||||||
@@ -113,7 +113,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
const droppedIntoPinnedArea = dropIndex < gBrowser.pinnedTabCount;
|
const droppedIntoPinnedArea = dropIndex < gBrowser.pinnedTabCount;
|
||||||
const newSplitView = gBrowser.adoptSplitView(tab, {
|
const newSplitView = gBrowser.adoptSplitView(tab, {
|
||||||
elementIndex: droppedIntoPinnedArea
|
elementIndex: droppedIntoPinnedArea
|
||||||
@@ -605,7 +619,7 @@
|
@@ -577,7 +591,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -122,7 +122,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
const newTab = gBrowser.adoptTab(selectedTab, {
|
const newTab = gBrowser.adoptTab(selectedTab, {
|
||||||
elementIndex: indexForSelectedTab,
|
elementIndex: indexForSelectedTab,
|
||||||
selectTab: selectedTab == draggedTab,
|
selectTab: selectedTab == draggedTab,
|
||||||
@@ -639,10 +653,6 @@
|
@@ -611,10 +625,6 @@
|
||||||
this._tabbrowserTabs.dragAndDropElements[
|
this._tabbrowserTabs.dragAndDropElements[
|
||||||
gBrowser.pinnedTabCount + unpinnedSplitViews.length - 1
|
gBrowser.pinnedTabCount + unpinnedSplitViews.length - 1
|
||||||
];
|
];
|
||||||
@@ -133,7 +133,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -703,6 +713,7 @@
|
@@ -664,6 +674,7 @@
|
||||||
|
|
||||||
let nextItem = this._tabbrowserTabs.dragAndDropElements[newIndex];
|
let nextItem = this._tabbrowserTabs.dragAndDropElements[newIndex];
|
||||||
let tabGroup = isTab(nextItem) && nextItem.group;
|
let tabGroup = isTab(nextItem) && nextItem.group;
|
||||||
@@ -141,15 +141,12 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
gBrowser.loadTabs(urls, {
|
gBrowser.loadTabs(urls, {
|
||||||
inBackground,
|
inBackground,
|
||||||
replace,
|
replace,
|
||||||
@@ -744,6 +755,22 @@
|
@@ -705,7 +716,16 @@
|
||||||
this._expandGroupOnDrop(draggedTab);
|
this._expandGroupOnDrop(draggedTab);
|
||||||
}
|
}
|
||||||
this._resetTabsAfterDrop(draggedTab);
|
this._resetTabsAfterDrop(draggedTab.ownerDocument);
|
||||||
+ if (
|
-
|
||||||
+ !dt.mozUserCancelled &&
|
+ if (!dt.mozUserCancelled && dt.dropEffect == "none" && !this._isCustomizing) {
|
||||||
+ dt.dropEffect == "none" &&
|
|
||||||
+ !this._tabbrowserTabs._isCustomizing
|
|
||||||
+ ) {
|
|
||||||
+ const moved = gZenViewSplitter.moveTabToSplitView(event, draggedTab);
|
+ const moved = gZenViewSplitter.moveTabToSplitView(event, draggedTab);
|
||||||
+ if (moved) {
|
+ if (moved) {
|
||||||
+ delete draggedTab._dragData;
|
+ delete draggedTab._dragData;
|
||||||
@@ -157,14 +154,12 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
+ }
|
+ }
|
||||||
+ } else if (dt.mozUserCancelled) {
|
+ } else if (dt.mozUserCancelled) {
|
||||||
+ gZenViewSplitter.onBrowserDragEndToSplit(event, true);
|
+ gZenViewSplitter.onBrowserDragEndToSplit(event, true);
|
||||||
+ if (gZenViewSplitter._lastOpenedTab) {
|
+ if (gZenViewSplitter._lastOpenedTab) gZenViewSplitter._lastOpenedTab._visuallySelected = false;
|
||||||
+ gZenViewSplitter._lastOpenedTab._visuallySelected = false;
|
|
||||||
+ }
|
|
||||||
+ }
|
+ }
|
||||||
|
|
||||||
if (
|
if (
|
||||||
dt.mozUserCancelled ||
|
dt.mozUserCancelled ||
|
||||||
@@ -1074,11 +1101,10 @@
|
dt.dropEffect != "none" ||
|
||||||
|
@@ -927,11 +947,10 @@
|
||||||
return this.#getHorizontalScrollboxDragTarget(event, ignoreSides);
|
return this.#getHorizontalScrollboxDragTarget(event, ignoreSides);
|
||||||
}
|
}
|
||||||
while (target) {
|
while (target) {
|
||||||
@@ -180,7 +175,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
target = target.parentNode;
|
target = target.parentNode;
|
||||||
@@ -1108,6 +1134,9 @@
|
@@ -961,6 +980,9 @@
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -190,36 +185,17 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1170,14 +1199,20 @@
|
@@ -1014,7 +1036,8 @@
|
||||||
let releaseReservedSpace = () =>
|
isTabGroupLabel(draggedTab) &&
|
||||||
this.#releaseSpaceInScrolledContent(periphery);
|
draggedTab._dragData?.expandGroupOnDrop
|
||||||
if (group.collapsed) {
|
) {
|
||||||
- // The group's tabs animate back to their full size, so hold on to the
|
- draggedTab.group.collapsed = false;
|
||||||
- // space reserved for them until they get there.
|
+ draggedTab.group.collapsed = draggedTab.group.hasAttribute("has-active");
|
||||||
- group.addEventListener(
|
+ gZenFolders.animateGroupMove(draggedTab.group, true);
|
||||||
- "TabGroupAnimationComplete",
|
|
||||||
- releaseReservedSpace,
|
|
||||||
- { once: true }
|
|
||||||
- );
|
|
||||||
- group.collapsed = false;
|
|
||||||
+ const expand = !group.hasAttribute("has-active");
|
|
||||||
+ if (expand) {
|
|
||||||
+ // The group's tabs animate back to their full size, so hold on to the
|
|
||||||
+ // space reserved for them until they get there.
|
|
||||||
+ group.addEventListener(
|
|
||||||
+ "TabGroupAnimationComplete",
|
|
||||||
+ releaseReservedSpace,
|
|
||||||
+ { once: true }
|
|
||||||
+ );
|
|
||||||
+ } else {
|
|
||||||
+ releaseReservedSpace();
|
|
||||||
+ }
|
|
||||||
+ group.collapsed = !expand;
|
|
||||||
+ gZenFolders.animateGroupMove(group, true);
|
|
||||||
} else {
|
|
||||||
releaseReservedSpace();
|
|
||||||
}
|
}
|
||||||
@@ -1362,7 +1397,6 @@
|
}
|
||||||
|
|
||||||
|
@@ -1206,7 +1229,6 @@
|
||||||
// using updateDragImage. On Linux, we can use a panel.
|
// using updateDragImage. On Linux, we can use a panel.
|
||||||
if (platform == "win" || platform == "macosx") {
|
if (platform == "win" || platform == "macosx") {
|
||||||
captureListener = function () {
|
captureListener = function () {
|
||||||
@@ -227,7 +203,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
// Create a panel to use it in setDragImage
|
// Create a panel to use it in setDragImage
|
||||||
@@ -1400,7 +1434,6 @@
|
@@ -1244,7 +1266,6 @@
|
||||||
);
|
);
|
||||||
dragImageOffset = dragImageOffset * scale;
|
dragImageOffset = dragImageOffset * scale;
|
||||||
}
|
}
|
||||||
@@ -235,7 +211,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
|
|
||||||
// _dragData.offsetX/Y give the coordinates that the mouse should be
|
// _dragData.offsetX/Y give the coordinates that the mouse should be
|
||||||
// positioned relative to the corner of the new window created upon
|
// positioned relative to the corner of the new window created upon
|
||||||
@@ -1419,7 +1452,7 @@
|
@@ -1263,7 +1284,7 @@
|
||||||
let dropEffect = this.getDropEffectForTabDrag(event);
|
let dropEffect = this.getDropEffectForTabDrag(event);
|
||||||
let isMovingInTabStrip = !fromTabList && dropEffect == "move";
|
let isMovingInTabStrip = !fromTabList && dropEffect == "move";
|
||||||
let collapseTabGroupDuringDrag =
|
let collapseTabGroupDuringDrag =
|
||||||
@@ -244,7 +220,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
|
|
||||||
tab._dragData = {
|
tab._dragData = {
|
||||||
offsetX: this._tabbrowserTabs.verticalMode
|
offsetX: this._tabbrowserTabs.verticalMode
|
||||||
@@ -1429,7 +1462,7 @@
|
@@ -1273,7 +1294,7 @@
|
||||||
? event.screenY - window.screenY - tabOffset
|
? event.screenY - window.screenY - tabOffset
|
||||||
: event.screenY - window.screenY,
|
: event.screenY - window.screenY,
|
||||||
scrollPos:
|
scrollPos:
|
||||||
@@ -253,7 +229,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
? this._tabbrowserTabs.pinnedTabsContainer.scrollPosition
|
? this._tabbrowserTabs.pinnedTabsContainer.scrollPosition
|
||||||
: this._tabbrowserTabs.arrowScrollbox.scrollPosition,
|
: this._tabbrowserTabs.arrowScrollbox.scrollPosition,
|
||||||
screenX: event.screenX,
|
screenX: event.screenX,
|
||||||
@@ -1522,6 +1555,7 @@
|
@@ -1320,6 +1341,7 @@
|
||||||
if (tabStripItemElement.hasAttribute("dragtarget")) {
|
if (tabStripItemElement.hasAttribute("dragtarget")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -261,7 +237,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
let isPinned = tab.pinned;
|
let isPinned = tab.pinned;
|
||||||
let dragAndDropElements = this._tabbrowserTabs.dragAndDropElements;
|
let dragAndDropElements = this._tabbrowserTabs.dragAndDropElements;
|
||||||
let isGrid = this._tabbrowserTabs.isContainerVerticalPinnedGrid(tab);
|
let isGrid = this._tabbrowserTabs.isContainerVerticalPinnedGrid(tab);
|
||||||
@@ -1895,23 +1929,6 @@
|
@@ -1686,23 +1708,6 @@
|
||||||
|
|
||||||
// Slide the relevant tabs to their new position.
|
// Slide the relevant tabs to their new position.
|
||||||
// non-moving tabs adjust for RTL
|
// non-moving tabs adjust for RTL
|
||||||
@@ -285,7 +261,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
// moving tabs don't adjust for RTL
|
// moving tabs don't adjust for RTL
|
||||||
for (let item of selectedElements) {
|
for (let item of selectedElements) {
|
||||||
if (
|
if (
|
||||||
@@ -1960,7 +1977,6 @@
|
@@ -1751,7 +1756,6 @@
|
||||||
for (let item of this._tabbrowserTabs.dragAndDropElements) {
|
for (let item of this._tabbrowserTabs.dragAndDropElements) {
|
||||||
delete item._moveTogetherSelectedTabsData;
|
delete item._moveTogetherSelectedTabsData;
|
||||||
item = elementToMove(item);
|
item = elementToMove(item);
|
||||||
@@ -293,7 +269,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
item.removeAttribute("multiselected-move-together");
|
item.removeAttribute("multiselected-move-together");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2812,7 +2828,6 @@
|
@@ -2598,7 +2602,6 @@
|
||||||
tab.style.top = "";
|
tab.style.top = "";
|
||||||
tab.style.maxWidth = "";
|
tab.style.maxWidth = "";
|
||||||
tab.style.pointerEvents = "";
|
tab.style.pointerEvents = "";
|
||||||
@@ -301,7 +277,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
|
|||||||
tab.removeAttribute("small-stack");
|
tab.removeAttribute("small-stack");
|
||||||
tab.removeAttribute("big-stack");
|
tab.removeAttribute("big-stack");
|
||||||
}
|
}
|
||||||
@@ -2821,11 +2836,9 @@
|
@@ -2607,11 +2610,9 @@
|
||||||
)) {
|
)) {
|
||||||
label.style.width = "";
|
label.style.width = "";
|
||||||
label.style.maxWidth = "";
|
label.style.maxWidth = "";
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
|
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
|
||||||
index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db542566eba2 100644
|
index 39b5babee5942427a82a7a64ad69e1b16efebcc1..32beac13dd4215a16de3a783db6c32da5504f9d8 100644
|
||||||
--- a/browser/components/tabbrowser/content/tabbrowser.js
|
--- a/browser/components/tabbrowser/content/tabbrowser.js
|
||||||
+++ b/browser/components/tabbrowser/content/tabbrowser.js
|
+++ b/browser/components/tabbrowser/content/tabbrowser.js
|
||||||
@@ -514,6 +514,7 @@
|
@@ -513,6 +513,7 @@
|
||||||
* @type {MozBrowser[]}
|
* @type {MozBrowser[]}
|
||||||
*/
|
*/
|
||||||
get splitViewBrowsers() {
|
get splitViewBrowsers() {
|
||||||
@@ -10,7 +10,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
const browsers = [];
|
const browsers = [];
|
||||||
if (this.#activeSplitView) {
|
if (this.#activeSplitView) {
|
||||||
for (const tab of this.#activeSplitView.tabs) {
|
for (const tab of this.#activeSplitView.tabs) {
|
||||||
@@ -612,15 +613,66 @@
|
@@ -611,15 +612,66 @@
|
||||||
return this.tabContainer.visibleTabs;
|
return this.tabContainer.visibleTabs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
setSelectedTab(val, metricsContext = null) {
|
setSelectedTab(val, metricsContext = null) {
|
||||||
if (this.selectedTab === val) {
|
if (this.selectedTab === val) {
|
||||||
return;
|
return;
|
||||||
@@ -633,6 +685,9 @@
|
@@ -632,6 +684,9 @@
|
||||||
) {
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -89,7 +89,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
// Update the tab
|
// Update the tab
|
||||||
this.tabbox.selectedTab = val;
|
this.tabbox.selectedTab = val;
|
||||||
|
|
||||||
@@ -709,6 +764,10 @@
|
@@ -708,6 +763,10 @@
|
||||||
userContextId = parseInt(tabArgument.getAttribute("usercontextid"), 10);
|
userContextId = parseInt(tabArgument.getAttribute("usercontextid"), 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
if (openWindowInfo) {
|
if (openWindowInfo) {
|
||||||
userContextId = openWindowInfo.originAttributes.userContextId;
|
userContextId = openWindowInfo.originAttributes.userContextId;
|
||||||
}
|
}
|
||||||
@@ -810,6 +869,8 @@
|
@@ -809,6 +868,8 @@
|
||||||
this.tabpanels.appendChild(panel);
|
this.tabpanels.appendChild(panel);
|
||||||
|
|
||||||
let tab = this.tabs[0];
|
let tab = this.tabs[0];
|
||||||
@@ -109,7 +109,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
tab.linkedPanel = uniqueId;
|
tab.linkedPanel = uniqueId;
|
||||||
this._selectedTab = tab;
|
this._selectedTab = tab;
|
||||||
this._selectedBrowser = browser;
|
this._selectedBrowser = browser;
|
||||||
@@ -1179,18 +1240,24 @@
|
@@ -1178,18 +1239,24 @@
|
||||||
* The context for the operation for telemetry purposes, defaults to an unknown context.
|
* The context for the operation for telemetry purposes, defaults to an unknown context.
|
||||||
*/
|
*/
|
||||||
pinTab(aTab, { metricsContext = this.TabMetrics.UNKNOWN_CONTEXT } = {}) {
|
pinTab(aTab, { metricsContext = this.TabMetrics.UNKNOWN_CONTEXT } = {}) {
|
||||||
@@ -135,7 +135,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
|
|
||||||
aTab.setAttribute("pinned", "true");
|
aTab.setAttribute("pinned", "true");
|
||||||
this._updateTabBarForPinnedTabs();
|
this._updateTabBarForPinnedTabs();
|
||||||
@@ -1207,16 +1274,25 @@
|
@@ -1206,16 +1273,25 @@
|
||||||
* The context for the operation for telemetry purposes, defaults to an unknown context.
|
* The context for the operation for telemetry purposes, defaults to an unknown context.
|
||||||
*/
|
*/
|
||||||
unpinTab(aTab, { metricsContext = this.TabMetrics.UNKNOWN_CONTEXT } = {}) {
|
unpinTab(aTab, { metricsContext = this.TabMetrics.UNKNOWN_CONTEXT } = {}) {
|
||||||
@@ -162,7 +162,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
});
|
});
|
||||||
|
|
||||||
aTab.style.marginInlineStart = "";
|
aTab.style.marginInlineStart = "";
|
||||||
@@ -1432,6 +1508,9 @@
|
@@ -1430,6 +1506,9 @@
|
||||||
|
|
||||||
let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"];
|
let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"];
|
||||||
|
|
||||||
@@ -172,7 +172,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
if (
|
if (
|
||||||
aIconURL &&
|
aIconURL &&
|
||||||
!LOCAL_PROTOCOLS.some(protocol => aIconURL.startsWith(protocol))
|
!LOCAL_PROTOCOLS.some(protocol => aIconURL.startsWith(protocol))
|
||||||
@@ -1441,6 +1520,9 @@
|
@@ -1439,6 +1518,9 @@
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -182,7 +182,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
|
|
||||||
let browser = this.getBrowserForTab(aTab);
|
let browser = this.getBrowserForTab(aTab);
|
||||||
browser.mIconURL = aIconURL;
|
browser.mIconURL = aIconURL;
|
||||||
@@ -1763,7 +1845,6 @@
|
@@ -1761,7 +1843,6 @@
|
||||||
|
|
||||||
// Preview mode should not reset the owner
|
// Preview mode should not reset the owner
|
||||||
if (!this.#previewMode && !oldTab.selected) {
|
if (!this.#previewMode && !oldTab.selected) {
|
||||||
@@ -190,7 +190,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
}
|
}
|
||||||
|
|
||||||
let lastRelatedTab = this.#lastRelatedTabMap.get(oldTab);
|
let lastRelatedTab = this.#lastRelatedTabMap.get(oldTab);
|
||||||
@@ -1854,6 +1935,7 @@
|
@@ -1852,6 +1933,7 @@
|
||||||
if (!this.#previewMode) {
|
if (!this.#previewMode) {
|
||||||
newTab.recordTimeFromUnloadToReload();
|
newTab.recordTimeFromUnloadToReload();
|
||||||
newTab.updateLastAccessed();
|
newTab.updateLastAccessed();
|
||||||
@@ -198,7 +198,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
oldTab.updateLastAccessed();
|
oldTab.updateLastAccessed();
|
||||||
// if this is the foreground window, update the last-seen timestamps.
|
// if this is the foreground window, update the last-seen timestamps.
|
||||||
if (this.documentGlobal == BrowserWindowTracker.getTopWindow()) {
|
if (this.documentGlobal == BrowserWindowTracker.getTopWindow()) {
|
||||||
@@ -2068,6 +2150,9 @@
|
@@ -2066,6 +2148,9 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
let activeEl = document.activeElement;
|
let activeEl = document.activeElement;
|
||||||
@@ -208,7 +208,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
// If focus is on the old tab, move it to the new tab.
|
// If focus is on the old tab, move it to the new tab.
|
||||||
if (activeEl == oldTab) {
|
if (activeEl == oldTab) {
|
||||||
newTab.focus();
|
newTab.focus();
|
||||||
@@ -2106,7 +2191,7 @@
|
@@ -2104,7 +2189,7 @@
|
||||||
// Focus the location bar if it was previously focused for that tab.
|
// Focus the location bar if it was previously focused for that tab.
|
||||||
// In full screen mode, only bother making the location bar visible
|
// In full screen mode, only bother making the location bar visible
|
||||||
// if the tab is a blank one.
|
// if the tab is a blank one.
|
||||||
@@ -217,7 +217,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
let selectURL = () => {
|
let selectURL = () => {
|
||||||
if (this._asyncTabSwitching) {
|
if (this._asyncTabSwitching) {
|
||||||
// Set _awaitingSetURI flag to suppress popup notification
|
// Set _awaitingSetURI flag to suppress popup notification
|
||||||
@@ -2394,7 +2479,12 @@
|
@@ -2392,7 +2477,12 @@
|
||||||
return this._setTabLabel(aTab, aLabel);
|
return this._setTabLabel(aTab, aLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,7 +231,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
if (!aLabel || (isURL && /^about:reader\?url=/.test(aLabel))) {
|
if (!aLabel || (isURL && /^about:reader\?url=/.test(aLabel))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -2520,7 +2610,7 @@
|
@@ -2518,7 +2608,7 @@
|
||||||
newIndex = this.selectedTab._tPos + 1;
|
newIndex = this.selectedTab._tPos + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,7 +240,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
if (this.isTabGroupLabel(targetTab)) {
|
if (this.isTabGroupLabel(targetTab)) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"Replacing a tab group label with a tab is not supported"
|
"Replacing a tab group label with a tab is not supported"
|
||||||
@@ -2795,6 +2885,7 @@
|
@@ -2793,6 +2883,7 @@
|
||||||
uriIsAboutBlank,
|
uriIsAboutBlank,
|
||||||
userContextId,
|
userContextId,
|
||||||
skipLoad,
|
skipLoad,
|
||||||
@@ -248,7 +248,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
} = {}) {
|
} = {}) {
|
||||||
let b = document.createXULElement("browser");
|
let b = document.createXULElement("browser");
|
||||||
// Use the JSM global to create the permanentKey, so that if the
|
// Use the JSM global to create the permanentKey, so that if the
|
||||||
@@ -2868,8 +2959,7 @@
|
@@ -2866,8 +2957,7 @@
|
||||||
// we use a different attribute name for this?
|
// we use a different attribute name for this?
|
||||||
b.setAttribute("name", name);
|
b.setAttribute("name", name);
|
||||||
}
|
}
|
||||||
@@ -258,7 +258,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
b.setAttribute("transparent", "true");
|
b.setAttribute("transparent", "true");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3024,7 +3114,7 @@
|
@@ -3022,7 +3112,7 @@
|
||||||
|
|
||||||
let panel = this.getPanel(browser);
|
let panel = this.getPanel(browser);
|
||||||
let uniqueId = this._generateUniquePanelID();
|
let uniqueId = this._generateUniquePanelID();
|
||||||
@@ -267,7 +267,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
aTab.linkedPanel = uniqueId;
|
aTab.linkedPanel = uniqueId;
|
||||||
|
|
||||||
// Inject the <browser> into the DOM if necessary.
|
// Inject the <browser> into the DOM if necessary.
|
||||||
@@ -3084,8 +3174,8 @@
|
@@ -3082,8 +3172,8 @@
|
||||||
// If we transitioned from one browser to two browsers, we need to set
|
// If we transitioned from one browser to two browsers, we need to set
|
||||||
// hasSiblings=false on both the existing browser and the new browser.
|
// hasSiblings=false on both the existing browser and the new browser.
|
||||||
if (this.tabs.length == 2) {
|
if (this.tabs.length == 2) {
|
||||||
@@ -278,7 +278,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
} else {
|
} else {
|
||||||
aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1;
|
aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1;
|
||||||
}
|
}
|
||||||
@@ -3270,7 +3360,6 @@
|
@@ -3268,7 +3358,6 @@
|
||||||
this.selectedTab = this.addTrustedTab(BROWSER_NEW_TAB_URL, {
|
this.selectedTab = this.addTrustedTab(BROWSER_NEW_TAB_URL, {
|
||||||
tabIndex: tab._tPos + 1,
|
tabIndex: tab._tPos + 1,
|
||||||
userContextId: tab.userContextId,
|
userContextId: tab.userContextId,
|
||||||
@@ -286,7 +286,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
focusUrlBar: true,
|
focusUrlBar: true,
|
||||||
});
|
});
|
||||||
resolve(this.selectedBrowser);
|
resolve(this.selectedBrowser);
|
||||||
@@ -3380,6 +3469,10 @@
|
@@ -3378,6 +3467,10 @@
|
||||||
schemelessInput,
|
schemelessInput,
|
||||||
hasValidUserGestureActivation = false,
|
hasValidUserGestureActivation = false,
|
||||||
textDirectiveUserActivation = false,
|
textDirectiveUserActivation = false,
|
||||||
@@ -297,7 +297,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
} = {}
|
} = {}
|
||||||
) {
|
) {
|
||||||
// all callers of addTab that pass a params object need to pass
|
// all callers of addTab that pass a params object need to pass
|
||||||
@@ -3390,10 +3483,25 @@
|
@@ -3388,10 +3481,25 @@
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -323,7 +323,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
// If we're opening a foreground tab, set the owner by default.
|
// If we're opening a foreground tab, set the owner by default.
|
||||||
ownerTab ??= inBackground ? null : this.selectedTab;
|
ownerTab ??= inBackground ? null : this.selectedTab;
|
||||||
|
|
||||||
@@ -3401,6 +3509,7 @@
|
@@ -3399,6 +3507,7 @@
|
||||||
if (this.selectedTab.owner) {
|
if (this.selectedTab.owner) {
|
||||||
this.selectedTab.owner = null;
|
this.selectedTab.owner = null;
|
||||||
}
|
}
|
||||||
@@ -331,7 +331,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
|
|
||||||
// Find the tab that opened this one, if any. This is used for
|
// Find the tab that opened this one, if any. This is used for
|
||||||
// determining positioning, and inherited attributes such as the
|
// determining positioning, and inherited attributes such as the
|
||||||
@@ -3453,6 +3562,22 @@
|
@@ -3451,6 +3560,22 @@
|
||||||
noInitialLabel,
|
noInitialLabel,
|
||||||
skipBackgroundNotify,
|
skipBackgroundNotify,
|
||||||
});
|
});
|
||||||
@@ -354,7 +354,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
if (insertTab) {
|
if (insertTab) {
|
||||||
// Insert the tab into the tab container in the correct position.
|
// Insert the tab into the tab container in the correct position.
|
||||||
this.#insertTabAtIndex(t, {
|
this.#insertTabAtIndex(t, {
|
||||||
@@ -3461,6 +3586,7 @@
|
@@ -3459,6 +3584,7 @@
|
||||||
ownerTab,
|
ownerTab,
|
||||||
openerTab,
|
openerTab,
|
||||||
pinned,
|
pinned,
|
||||||
@@ -362,7 +362,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
bulkOrderedOpen,
|
bulkOrderedOpen,
|
||||||
tabGroup: tabGroup ?? openerTab?.group,
|
tabGroup: tabGroup ?? openerTab?.group,
|
||||||
});
|
});
|
||||||
@@ -3479,6 +3605,7 @@
|
@@ -3477,6 +3603,7 @@
|
||||||
openWindowInfo,
|
openWindowInfo,
|
||||||
skipLoad,
|
skipLoad,
|
||||||
triggeringRemoteType,
|
triggeringRemoteType,
|
||||||
@@ -370,7 +370,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
if (focusUrlBar) {
|
if (focusUrlBar) {
|
||||||
@@ -3603,6 +3730,12 @@
|
@@ -3601,6 +3728,12 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -383,7 +383,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
// Additionally send pinned tab events
|
// Additionally send pinned tab events
|
||||||
if (pinned) {
|
if (pinned) {
|
||||||
this.#notifyPinnedStatus(t);
|
this.#notifyPinnedStatus(t);
|
||||||
@@ -3613,6 +3746,15 @@
|
@@ -3611,6 +3744,15 @@
|
||||||
if (!inBackground) {
|
if (!inBackground) {
|
||||||
this.selectedTab = t;
|
this.selectedTab = t;
|
||||||
}
|
}
|
||||||
@@ -399,7 +399,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3836,6 +3978,7 @@
|
@@ -3834,6 +3976,7 @@
|
||||||
insertBefore = null,
|
insertBefore = null,
|
||||||
isAdoptingGroup = false,
|
isAdoptingGroup = false,
|
||||||
metricsContext = this.TabMetrics.UNKNOWN_CONTEXT,
|
metricsContext = this.TabMetrics.UNKNOWN_CONTEXT,
|
||||||
@@ -407,7 +407,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
} = {}
|
} = {}
|
||||||
) {
|
) {
|
||||||
if (
|
if (
|
||||||
@@ -3846,9 +3989,6 @@
|
@@ -3844,9 +3987,6 @@
|
||||||
!this.isSplitViewWrapper(tabOrSplitView)
|
!this.isSplitViewWrapper(tabOrSplitView)
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
@@ -417,7 +417,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!color) {
|
if (!color) {
|
||||||
@@ -3869,9 +4009,14 @@
|
@@ -3867,9 +4007,14 @@
|
||||||
label,
|
label,
|
||||||
isAdoptingGroup
|
isAdoptingGroup
|
||||||
);
|
);
|
||||||
@@ -434,7 +434,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
);
|
);
|
||||||
group.addTabs(tabsAndSplitViews, metricsContext);
|
group.addTabs(tabsAndSplitViews, metricsContext);
|
||||||
|
|
||||||
@@ -3975,7 +4120,7 @@
|
@@ -3973,7 +4118,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.#handleTabMove(tab, () =>
|
this.#handleTabMove(tab, () =>
|
||||||
@@ -443,7 +443,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4061,6 +4206,7 @@
|
@@ -4059,6 +4204,7 @@
|
||||||
color: group.color,
|
color: group.color,
|
||||||
insertBefore: newTabs[0],
|
insertBefore: newTabs[0],
|
||||||
isAdoptingGroup: true,
|
isAdoptingGroup: true,
|
||||||
@@ -451,7 +451,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4271,6 +4417,7 @@
|
@@ -4269,6 +4415,7 @@
|
||||||
openWindowInfo,
|
openWindowInfo,
|
||||||
skipLoad,
|
skipLoad,
|
||||||
triggeringRemoteType,
|
triggeringRemoteType,
|
||||||
@@ -459,7 +459,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
// If we don't have a preferred remote type (or it is `NOT_REMOTE`), and
|
// If we don't have a preferred remote type (or it is `NOT_REMOTE`), and
|
||||||
@@ -4331,6 +4478,7 @@
|
@@ -4329,6 +4476,7 @@
|
||||||
openWindowInfo,
|
openWindowInfo,
|
||||||
name,
|
name,
|
||||||
skipLoad,
|
skipLoad,
|
||||||
@@ -467,7 +467,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4544,9 +4692,9 @@
|
@@ -4542,9 +4690,9 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a new tab if needed.
|
// Add a new tab if needed.
|
||||||
@@ -479,7 +479,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
|
|
||||||
let url = "about:blank";
|
let url = "about:blank";
|
||||||
if (tabData.entries?.length) {
|
if (tabData.entries?.length) {
|
||||||
@@ -4579,8 +4727,10 @@
|
@@ -4577,8 +4725,10 @@
|
||||||
insertTab: false,
|
insertTab: false,
|
||||||
skipLoad: true,
|
skipLoad: true,
|
||||||
preferredRemoteType,
|
preferredRemoteType,
|
||||||
@@ -491,7 +491,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
if (select) {
|
if (select) {
|
||||||
tabToSelect = tab;
|
tabToSelect = tab;
|
||||||
}
|
}
|
||||||
@@ -4602,7 +4752,8 @@
|
@@ -4600,7 +4750,8 @@
|
||||||
this.pinTab(tab);
|
this.pinTab(tab);
|
||||||
// Then ensure all the tab open/pinning information is sent.
|
// Then ensure all the tab open/pinning information is sent.
|
||||||
this._fireTabOpen(tab, {});
|
this._fireTabOpen(tab, {});
|
||||||
@@ -501,7 +501,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
let { groupId } = tabData;
|
let { groupId } = tabData;
|
||||||
const tabGroup = tabGroupWorkingData.get(groupId);
|
const tabGroup = tabGroupWorkingData.get(groupId);
|
||||||
// if a tab refers to a tab group we don't know, skip any group
|
// if a tab refers to a tab group we don't know, skip any group
|
||||||
@@ -4622,7 +4773,10 @@
|
@@ -4620,7 +4771,10 @@
|
||||||
tabGroup.stateData.id,
|
tabGroup.stateData.id,
|
||||||
tabGroup.stateData.color,
|
tabGroup.stateData.color,
|
||||||
tabGroup.stateData.collapsed,
|
tabGroup.stateData.collapsed,
|
||||||
@@ -513,7 +513,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
);
|
);
|
||||||
tabsFragment.appendChild(tabGroup.node);
|
tabsFragment.appendChild(tabGroup.node);
|
||||||
}
|
}
|
||||||
@@ -4677,9 +4831,21 @@
|
@@ -4675,9 +4829,21 @@
|
||||||
// to remove the old selected tab.
|
// to remove the old selected tab.
|
||||||
if (tabToSelect) {
|
if (tabToSelect) {
|
||||||
let leftoverTab = this.selectedTab;
|
let leftoverTab = this.selectedTab;
|
||||||
@@ -535,7 +535,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
|
|
||||||
if (tabs.length > 1 || !tabs[0].selected) {
|
if (tabs.length > 1 || !tabs[0].selected) {
|
||||||
this._updateTabsAfterInsert();
|
this._updateTabsAfterInsert();
|
||||||
@@ -4884,11 +5050,17 @@
|
@@ -4882,11 +5048,17 @@
|
||||||
if (ownerTab) {
|
if (ownerTab) {
|
||||||
tab.owner = ownerTab;
|
tab.owner = ownerTab;
|
||||||
}
|
}
|
||||||
@@ -554,7 +554,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
if (
|
if (
|
||||||
!bulkOrderedOpen &&
|
!bulkOrderedOpen &&
|
||||||
((openerTab &&
|
((openerTab &&
|
||||||
@@ -4900,7 +5072,7 @@
|
@@ -4898,7 +5070,7 @@
|
||||||
let lastRelatedTab =
|
let lastRelatedTab =
|
||||||
openerTab && this.#lastRelatedTabMap.get(openerTab);
|
openerTab && this.#lastRelatedTabMap.get(openerTab);
|
||||||
let previousTab = lastRelatedTab || openerTab || this.selectedTab;
|
let previousTab = lastRelatedTab || openerTab || this.selectedTab;
|
||||||
@@ -563,7 +563,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
tabGroup = previousTab.group;
|
tabGroup = previousTab.group;
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
@@ -4916,7 +5088,7 @@
|
@@ -4914,7 +5086,7 @@
|
||||||
previousTab.splitview
|
previousTab.splitview
|
||||||
) + 1;
|
) + 1;
|
||||||
} else if (previousTab.visible) {
|
} else if (previousTab.visible) {
|
||||||
@@ -572,7 +572,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
} else if (previousTab == FirefoxViewHandler.tab) {
|
} else if (previousTab == FirefoxViewHandler.tab) {
|
||||||
elementIndex = 0;
|
elementIndex = 0;
|
||||||
}
|
}
|
||||||
@@ -4944,14 +5116,14 @@
|
@@ -4942,14 +5114,14 @@
|
||||||
}
|
}
|
||||||
// Ensure index is within bounds.
|
// Ensure index is within bounds.
|
||||||
if (tab.pinned) {
|
if (tab.pinned) {
|
||||||
@@ -591,7 +591,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
|
|
||||||
if (pinned && !itemAfter?.pinned) {
|
if (pinned && !itemAfter?.pinned) {
|
||||||
itemAfter = null;
|
itemAfter = null;
|
||||||
@@ -4968,7 +5140,7 @@
|
@@ -4966,7 +5138,7 @@
|
||||||
|
|
||||||
this.tabContainer._invalidateCachedTabs();
|
this.tabContainer._invalidateCachedTabs();
|
||||||
|
|
||||||
@@ -600,7 +600,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
if (
|
if (
|
||||||
(this.isTab(itemAfter) && itemAfter.group == tabGroup) ||
|
(this.isTab(itemAfter) && itemAfter.group == tabGroup) ||
|
||||||
this.isSplitViewWrapper(itemAfter)
|
this.isSplitViewWrapper(itemAfter)
|
||||||
@@ -4999,7 +5171,11 @@
|
@@ -4997,7 +5169,11 @@
|
||||||
const tabContainer = pinned
|
const tabContainer = pinned
|
||||||
? this.tabContainer.pinnedTabsContainer
|
? this.tabContainer.pinnedTabsContainer
|
||||||
: this.tabContainer;
|
: this.tabContainer;
|
||||||
@@ -612,7 +612,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tab.group?.collapsed) {
|
if (tab.group?.collapsed) {
|
||||||
@@ -5014,6 +5190,7 @@
|
@@ -5012,6 +5188,7 @@
|
||||||
if (pinned) {
|
if (pinned) {
|
||||||
this._updateTabBarForPinnedTabs();
|
this._updateTabBarForPinnedTabs();
|
||||||
}
|
}
|
||||||
@@ -620,7 +620,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
|
|
||||||
TabBarVisibility.update();
|
TabBarVisibility.update();
|
||||||
}
|
}
|
||||||
@@ -5577,6 +5754,7 @@
|
@@ -5568,6 +5745,7 @@
|
||||||
metricsContext,
|
metricsContext,
|
||||||
} = {}
|
} = {}
|
||||||
) {
|
) {
|
||||||
@@ -628,7 +628,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
// When 'closeWindowWithLastTab' pref is enabled, closing all tabs
|
// When 'closeWindowWithLastTab' pref is enabled, closing all tabs
|
||||||
// can be considered equivalent to closing the window.
|
// can be considered equivalent to closing the window.
|
||||||
if (
|
if (
|
||||||
@@ -5687,6 +5865,7 @@
|
@@ -5678,6 +5856,7 @@
|
||||||
closedTabCount -= 1;
|
closedTabCount -= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -636,7 +636,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
|
|
||||||
if (closedTabCount > 0) {
|
if (closedTabCount > 0) {
|
||||||
this.recordTabMetrics(
|
this.recordTabMetrics(
|
||||||
@@ -5761,6 +5940,14 @@
|
@@ -5730,6 +5909,14 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -651,7 +651,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
let isVisibleTab = aTab.visible;
|
let isVisibleTab = aTab.visible;
|
||||||
// We have to sample the tab width now, since _beginRemoveTab might
|
// We have to sample the tab width now, since _beginRemoveTab might
|
||||||
// end up modifying the DOM in such a way that aTab gets a new
|
// end up modifying the DOM in such a way that aTab gets a new
|
||||||
@@ -5768,6 +5955,9 @@
|
@@ -5737,6 +5924,9 @@
|
||||||
// state).
|
// state).
|
||||||
let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width;
|
let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width;
|
||||||
let isLastTab = this.#isLastTabInWindow(aTab);
|
let isLastTab = this.#isLastTabInWindow(aTab);
|
||||||
@@ -661,7 +661,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
if (
|
if (
|
||||||
!this._beginRemoveTab(aTab, {
|
!this._beginRemoveTab(aTab, {
|
||||||
closeWindowFastpath: true,
|
closeWindowFastpath: true,
|
||||||
@@ -5778,13 +5968,14 @@
|
@@ -5747,13 +5937,14 @@
|
||||||
metricsContext,
|
metricsContext,
|
||||||
})
|
})
|
||||||
) {
|
) {
|
||||||
@@ -677,7 +677,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
let lockTabSizing =
|
let lockTabSizing =
|
||||||
!this.tabContainer.verticalMode &&
|
!this.tabContainer.verticalMode &&
|
||||||
!aTab.pinned &&
|
!aTab.pinned &&
|
||||||
@@ -5815,7 +6006,13 @@
|
@@ -5784,7 +5975,13 @@
|
||||||
// We're not animating, so we can cancel the animation stopwatch.
|
// We're not animating, so we can cancel the animation stopwatch.
|
||||||
Glean.browserTabclose.timeAnim.cancel(aTab._closeTimeAnimTimerId);
|
Glean.browserTabclose.timeAnim.cancel(aTab._closeTimeAnimTimerId);
|
||||||
aTab._closeTimeAnimTimerId = null;
|
aTab._closeTimeAnimTimerId = null;
|
||||||
@@ -692,18 +692,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5855,7 +6052,9 @@
|
@@ -5827,7 +6024,7 @@
|
||||||
get #shouldCloseWindowWithLastTab() {
|
|
||||||
return (
|
|
||||||
!window.toolbar.visible ||
|
|
||||||
- Services.prefs.getBoolPref("browser.tabs.closeWindowWithLastTab")
|
|
||||||
+ (Services.prefs.getBoolPref("browser.tabs.closeWindowWithLastTab") &&
|
|
||||||
+ !gZenWorkspaces._isClosingWindow &&
|
|
||||||
+ !gZenWorkspaces._removedByStartupPage)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -5871,7 +6070,7 @@
|
|
||||||
*/
|
*/
|
||||||
#isLastTabInWindow(tab) {
|
#isLastTabInWindow(tab) {
|
||||||
for (const otherTab of this.tabs) {
|
for (const otherTab of this.tabs) {
|
||||||
@@ -712,7 +701,16 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5982,6 +6181,7 @@
|
@@ -5917,7 +6114,7 @@
|
||||||
|
closeWindowWithLastTab != null
|
||||||
|
? closeWindowWithLastTab
|
||||||
|
: !window.toolbar.visible ||
|
||||||
|
- Services.prefs.getBoolPref("browser.tabs.closeWindowWithLastTab");
|
||||||
|
+ Services.prefs.getBoolPref("browser.tabs.closeWindowWithLastTab") && !gZenWorkspaces._isClosingWindow && !gZenWorkspaces._removedByStartupPage;
|
||||||
|
|
||||||
|
if (closeWindow) {
|
||||||
|
// We've already called beforeunload on all the relevant tabs if we get here,
|
||||||
|
@@ -5941,6 +6138,7 @@
|
||||||
|
|
||||||
newTab = true;
|
newTab = true;
|
||||||
}
|
}
|
||||||
@@ -720,8 +718,8 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
aTab._endRemoveArgs = [closeWindow, newTab];
|
aTab._endRemoveArgs = [closeWindow, newTab];
|
||||||
|
|
||||||
// swapBrowsersAndCloseOther will take care of closing the window without animation.
|
// swapBrowsersAndCloseOther will take care of closing the window without animation.
|
||||||
@@ -6029,13 +6229,7 @@
|
@@ -5982,13 +6180,7 @@
|
||||||
}
|
aTab._mouseleave();
|
||||||
|
|
||||||
if (newTab) {
|
if (newTab) {
|
||||||
- this.addTrustedTab(BROWSER_NEW_TAB_URL, {
|
- this.addTrustedTab(BROWSER_NEW_TAB_URL, {
|
||||||
@@ -735,7 +733,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
} else {
|
} else {
|
||||||
TabBarVisibility.update();
|
TabBarVisibility.update();
|
||||||
}
|
}
|
||||||
@@ -6192,6 +6386,7 @@
|
@@ -6128,6 +6320,7 @@
|
||||||
this.tabs[i]._tPos = i;
|
this.tabs[i]._tPos = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -743,7 +741,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
if (!this.#windowIsClosing) {
|
if (!this.#windowIsClosing) {
|
||||||
// update tab close buttons state
|
// update tab close buttons state
|
||||||
this.tabContainer._updateCloseButtons();
|
this.tabContainer._updateCloseButtons();
|
||||||
@@ -6377,6 +6572,7 @@
|
@@ -6313,6 +6506,7 @@
|
||||||
memory_after: await getTotalMemoryUsage(),
|
memory_after: await getTotalMemoryUsage(),
|
||||||
time_to_unload_in_ms: timeElapsed,
|
time_to_unload_in_ms: timeElapsed,
|
||||||
});
|
});
|
||||||
@@ -751,7 +749,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -6422,6 +6618,7 @@
|
@@ -6358,6 +6552,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
let excludeTabs = new Set(aExcludeTabs);
|
let excludeTabs = new Set(aExcludeTabs);
|
||||||
@@ -759,7 +757,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
|
|
||||||
// If this tab has a successor, it should be selectable, since
|
// If this tab has a successor, it should be selectable, since
|
||||||
// hiding or closing a tab removes that tab as a successor.
|
// hiding or closing a tab removes that tab as a successor.
|
||||||
@@ -6434,13 +6631,13 @@
|
@@ -6370,13 +6565,13 @@
|
||||||
!excludeTabs.has(aTab.owner) &&
|
!excludeTabs.has(aTab.owner) &&
|
||||||
Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose")
|
Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose")
|
||||||
) {
|
) {
|
||||||
@@ -775,7 +773,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (Services.prefs.getBoolPref("browser.tabs.selectMRUOnClose", false)) {
|
if (Services.prefs.getBoolPref("browser.tabs.selectMRUOnClose", false)) {
|
||||||
@@ -6456,6 +6653,13 @@
|
@@ -6392,6 +6587,13 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -789,7 +787,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
let tab = this.tabContainer.findNextTab(aTab, {
|
let tab = this.tabContainer.findNextTab(aTab, {
|
||||||
direction: 1,
|
direction: 1,
|
||||||
filter: _tab => remainingTabs.includes(_tab),
|
filter: _tab => remainingTabs.includes(_tab),
|
||||||
@@ -6469,7 +6673,7 @@
|
@@ -6405,7 +6607,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tab) {
|
if (tab) {
|
||||||
@@ -798,7 +796,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If no qualifying visible tab was found, see if there is a tab in
|
// If no qualifying visible tab was found, see if there is a tab in
|
||||||
@@ -6490,7 +6694,7 @@
|
@@ -6426,7 +6628,7 @@
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -807,7 +805,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
}
|
}
|
||||||
|
|
||||||
_blurTab(aTab) {
|
_blurTab(aTab) {
|
||||||
@@ -6501,7 +6705,7 @@
|
@@ -6437,7 +6639,7 @@
|
||||||
* @returns {boolean}
|
* @returns {boolean}
|
||||||
* False if swapping isn't permitted, true otherwise.
|
* False if swapping isn't permitted, true otherwise.
|
||||||
*/
|
*/
|
||||||
@@ -816,7 +814,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
// Do not allow transfering a private tab to a non-private window
|
// Do not allow transfering a private tab to a non-private window
|
||||||
// and vice versa.
|
// and vice versa.
|
||||||
if (
|
if (
|
||||||
@@ -6555,6 +6759,7 @@
|
@@ -6491,6 +6693,7 @@
|
||||||
// fire the beforeunload event in the process. Close the other
|
// fire the beforeunload event in the process. Close the other
|
||||||
// window if this was its last tab.
|
// window if this was its last tab.
|
||||||
if (
|
if (
|
||||||
@@ -824,7 +822,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
!remoteBrowser._beginRemoveTab(aOtherTab, {
|
!remoteBrowser._beginRemoveTab(aOtherTab, {
|
||||||
adoptedByTab: aOurTab,
|
adoptedByTab: aOurTab,
|
||||||
closeWindowWithLastTab: true,
|
closeWindowWithLastTab: true,
|
||||||
@@ -6566,7 +6771,7 @@
|
@@ -6502,7 +6705,7 @@
|
||||||
// If this is the last tab of the window, hide the window
|
// If this is the last tab of the window, hide the window
|
||||||
// immediately without animation before the docshell swap, to avoid
|
// immediately without animation before the docshell swap, to avoid
|
||||||
// about:blank being painted.
|
// about:blank being painted.
|
||||||
@@ -833,7 +831,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
if (closeWindow) {
|
if (closeWindow) {
|
||||||
let win = aOtherTab.documentGlobal;
|
let win = aOtherTab.documentGlobal;
|
||||||
win.windowUtils.suppressAnimation(true);
|
win.windowUtils.suppressAnimation(true);
|
||||||
@@ -6700,11 +6905,13 @@
|
@@ -6636,11 +6839,13 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finish tearing down the tab that's going away.
|
// Finish tearing down the tab that's going away.
|
||||||
@@ -847,7 +845,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
|
|
||||||
this.setTabTitle(aOurTab);
|
this.setTabTitle(aOurTab);
|
||||||
|
|
||||||
@@ -6928,10 +7135,10 @@
|
@@ -6860,10 +7065,10 @@
|
||||||
SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
|
SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -860,7 +858,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
aTab.selected ||
|
aTab.selected ||
|
||||||
aTab.closing ||
|
aTab.closing ||
|
||||||
// Tabs that are sharing the screen, microphone or camera cannot be hidden.
|
// Tabs that are sharing the screen, microphone or camera cannot be hidden.
|
||||||
@@ -6991,7 +7198,8 @@
|
@@ -6923,7 +7128,8 @@
|
||||||
* @param {object} [aOptions={}]
|
* @param {object} [aOptions={}]
|
||||||
* Key-value pairs that will be serialized into the features string.
|
* Key-value pairs that will be serialized into the features string.
|
||||||
*/
|
*/
|
||||||
@@ -870,7 +868,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
if (this.tabs.length == 1) {
|
if (this.tabs.length == 1) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -7008,7 +7216,7 @@
|
@@ -6940,7 +7146,7 @@
|
||||||
// tell a new window to take the "dropped" tab
|
// tell a new window to take the "dropped" tab
|
||||||
let args = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray);
|
let args = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray);
|
||||||
args.appendElement(aTab.splitview ?? aTab);
|
args.appendElement(aTab.splitview ?? aTab);
|
||||||
@@ -879,7 +877,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
private: PrivateBrowsingUtils.isWindowPrivate(window),
|
private: PrivateBrowsingUtils.isWindowPrivate(window),
|
||||||
features: Object.entries(aOptions)
|
features: Object.entries(aOptions)
|
||||||
.map(([key, value]) => `${key}=${value}`)
|
.map(([key, value]) => `${key}=${value}`)
|
||||||
@@ -7016,6 +7224,8 @@
|
@@ -6948,6 +7154,8 @@
|
||||||
openerWindow: window,
|
openerWindow: window,
|
||||||
args,
|
args,
|
||||||
});
|
});
|
||||||
@@ -888,7 +886,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -7142,7 +7352,7 @@
|
@@ -7074,7 +7282,7 @@
|
||||||
* `true` if element is a `<tab-group>`
|
* `true` if element is a `<tab-group>`
|
||||||
*/
|
*/
|
||||||
isTabGroup(element) {
|
isTabGroup(element) {
|
||||||
@@ -897,7 +895,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -7214,8 +7424,8 @@
|
@@ -7146,8 +7354,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't allow mixing pinned and unpinned tabs.
|
// Don't allow mixing pinned and unpinned tabs.
|
||||||
@@ -908,7 +906,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
} else {
|
} else {
|
||||||
tabIndex = Math.max(tabIndex, this.pinnedTabCount);
|
tabIndex = Math.max(tabIndex, this.pinnedTabCount);
|
||||||
}
|
}
|
||||||
@@ -7261,8 +7471,8 @@
|
@@ -7193,8 +7401,8 @@
|
||||||
this.#handleTabMove(
|
this.#handleTabMove(
|
||||||
element,
|
element,
|
||||||
() => {
|
() => {
|
||||||
@@ -919,7 +917,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
neighbor = neighbor.group;
|
neighbor = neighbor.group;
|
||||||
}
|
}
|
||||||
if (neighbor?.splitview) {
|
if (neighbor?.splitview) {
|
||||||
@@ -7273,6 +7483,12 @@
|
@@ -7205,6 +7413,12 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -932,7 +930,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
|
|
||||||
if (movingForwards && neighbor) {
|
if (movingForwards && neighbor) {
|
||||||
neighbor.after(element);
|
neighbor.after(element);
|
||||||
@@ -7346,23 +7562,31 @@
|
@@ -7278,23 +7492,31 @@
|
||||||
) {
|
) {
|
||||||
if (this.isTabGroupLabel(targetElement)) {
|
if (this.isTabGroupLabel(targetElement)) {
|
||||||
targetElement = targetElement.group;
|
targetElement = targetElement.group;
|
||||||
@@ -970,7 +968,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
} else if (!element.pinned && targetElement && targetElement.pinned) {
|
} else if (!element.pinned && targetElement && targetElement.pinned) {
|
||||||
// If the caller asks to move an unpinned element next to a pinned
|
// If the caller asks to move an unpinned element next to a pinned
|
||||||
// tab, move the unpinned element to be the first unpinned element
|
// tab, move the unpinned element to be the first unpinned element
|
||||||
@@ -7375,12 +7599,35 @@
|
@@ -7307,12 +7529,35 @@
|
||||||
// move the tab group right before the first unpinned tab.
|
// move the tab group right before the first unpinned tab.
|
||||||
// 4. Moving a tab group and the first unpinned tab is grouped:
|
// 4. Moving a tab group and the first unpinned tab is grouped:
|
||||||
// move the tab group right before the first unpinned tab's tab group.
|
// move the tab group right before the first unpinned tab's tab group.
|
||||||
@@ -1007,7 +1005,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
|
|
||||||
// We want to include the splitview wrapper if it's the targetElement, but
|
// We want to include the splitview wrapper if it's the targetElement, but
|
||||||
// not in the case where we want to reverse tabs within the same splitview.
|
// not in the case where we want to reverse tabs within the same splitview.
|
||||||
@@ -7389,6 +7636,7 @@
|
@@ -7321,6 +7566,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
let getContainer = () =>
|
let getContainer = () =>
|
||||||
@@ -1015,7 +1013,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
element.pinned
|
element.pinned
|
||||||
? this.tabContainer.pinnedTabsContainer
|
? this.tabContainer.pinnedTabsContainer
|
||||||
: this.tabContainer;
|
: this.tabContainer;
|
||||||
@@ -7397,11 +7645,15 @@
|
@@ -7329,11 +7575,15 @@
|
||||||
element,
|
element,
|
||||||
() => {
|
() => {
|
||||||
if (moveBefore) {
|
if (moveBefore) {
|
||||||
@@ -1032,7 +1030,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ metricsContext }
|
{ metricsContext }
|
||||||
@@ -7479,11 +7731,15 @@
|
@@ -7411,11 +7661,15 @@
|
||||||
* The context for the operation for telemetry purposes.
|
* The context for the operation for telemetry purposes.
|
||||||
*/
|
*/
|
||||||
moveTabToExistingGroup(aTab, aGroup, { metricsContext } = {}) {
|
moveTabToExistingGroup(aTab, aGroup, { metricsContext } = {}) {
|
||||||
@@ -1051,7 +1049,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
}
|
}
|
||||||
if (aTab.group && aTab.group.id === aGroup.id) {
|
if (aTab.group && aTab.group.id === aGroup.id) {
|
||||||
return;
|
return;
|
||||||
@@ -7557,6 +7813,7 @@
|
@@ -7489,6 +7743,7 @@
|
||||||
|
|
||||||
let state = {
|
let state = {
|
||||||
tabIndex: tab._tPos,
|
tabIndex: tab._tPos,
|
||||||
@@ -1059,7 +1057,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
};
|
};
|
||||||
if (tab.visible) {
|
if (tab.visible) {
|
||||||
state.elementIndex = tab.elementIndex;
|
state.elementIndex = tab.elementIndex;
|
||||||
@@ -7595,7 +7852,7 @@
|
@@ -7527,7 +7782,7 @@
|
||||||
let changedSplitView =
|
let changedSplitView =
|
||||||
previousTabState.splitViewId != currentTabState.splitViewId;
|
previousTabState.splitViewId != currentTabState.splitViewId;
|
||||||
|
|
||||||
@@ -1068,7 +1066,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
tab.dispatchEvent(
|
tab.dispatchEvent(
|
||||||
new CustomEvent("TabMove", {
|
new CustomEvent("TabMove", {
|
||||||
bubbles: true,
|
bubbles: true,
|
||||||
@@ -7647,6 +7904,10 @@
|
@@ -7579,6 +7834,10 @@
|
||||||
|
|
||||||
moveActionCallback();
|
moveActionCallback();
|
||||||
|
|
||||||
@@ -1079,7 +1077,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
// Clear tabs cache after moving nodes because the order of tabs may have
|
// Clear tabs cache after moving nodes because the order of tabs may have
|
||||||
// changed.
|
// changed.
|
||||||
this.tabContainer._invalidateCachedTabs();
|
this.tabContainer._invalidateCachedTabs();
|
||||||
@@ -7694,7 +7955,22 @@
|
@@ -7626,7 +7885,22 @@
|
||||||
* @returns {object}
|
* @returns {object}
|
||||||
* The new tab in the current window, null if the tab couldn't be adopted.
|
* The new tab in the current window, null if the tab couldn't be adopted.
|
||||||
*/
|
*/
|
||||||
@@ -1103,7 +1101,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
// Swap the dropped tab with a new one we create and then close
|
// Swap the dropped tab with a new one we create and then close
|
||||||
// it in the other window (making it seem to have moved between
|
// it in the other window (making it seem to have moved between
|
||||||
// windows). We also ensure that the tab we create to swap into has
|
// windows). We also ensure that the tab we create to swap into has
|
||||||
@@ -7737,6 +8013,8 @@
|
@@ -7669,6 +7943,8 @@
|
||||||
}
|
}
|
||||||
params.skipLoad = true;
|
params.skipLoad = true;
|
||||||
let newTab = this.addWebTab("about:blank", params);
|
let newTab = this.addWebTab("about:blank", params);
|
||||||
@@ -1112,7 +1110,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
|
|
||||||
aTab.container.tabDragAndDrop.finishAnimateTabMove();
|
aTab.container.tabDragAndDrop.finishAnimateTabMove();
|
||||||
|
|
||||||
@@ -8516,7 +8794,7 @@
|
@@ -8448,7 +8724,7 @@
|
||||||
// preventDefault(). It will still raise the window if appropriate.
|
// preventDefault(). It will still raise the window if appropriate.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1121,7 +1119,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
window.focus();
|
window.focus();
|
||||||
aEvent.preventDefault();
|
aEvent.preventDefault();
|
||||||
}
|
}
|
||||||
@@ -8533,7 +8811,6 @@
|
@@ -8465,7 +8741,6 @@
|
||||||
|
|
||||||
on_TabGroupCollapse(aEvent) {
|
on_TabGroupCollapse(aEvent) {
|
||||||
aEvent.target.tabs.forEach(tab => {
|
aEvent.target.tabs.forEach(tab => {
|
||||||
@@ -1129,7 +1127,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8887,7 +9164,9 @@
|
@@ -8819,7 +9094,9 @@
|
||||||
|
|
||||||
let filter = this.#tabFilters.get(tab);
|
let filter = this.#tabFilters.get(tab);
|
||||||
if (filter) {
|
if (filter) {
|
||||||
@@ -1139,7 +1137,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
|
|
||||||
let listener = this.#tabListeners.get(tab);
|
let listener = this.#tabListeners.get(tab);
|
||||||
if (listener) {
|
if (listener) {
|
||||||
@@ -9676,6 +9955,7 @@
|
@@ -9604,6 +9881,7 @@
|
||||||
aWebProgress.isTopLevel
|
aWebProgress.isTopLevel
|
||||||
) {
|
) {
|
||||||
this._tab.setAttribute("busy", "true");
|
this._tab.setAttribute("busy", "true");
|
||||||
@@ -1147,7 +1145,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
gBrowser._tabAttrModified(this._tab, ["busy"]);
|
gBrowser._tabAttrModified(this._tab, ["busy"]);
|
||||||
this._tab._notselectedsinceload = !this._tab.selected;
|
this._tab._notselectedsinceload = !this._tab.selected;
|
||||||
}
|
}
|
||||||
@@ -9756,6 +10036,7 @@
|
@@ -9684,6 +9962,7 @@
|
||||||
// known defaults. Note we use the original URL since about:newtab
|
// known defaults. Note we use the original URL since about:newtab
|
||||||
// redirects to a prerendered page.
|
// redirects to a prerendered page.
|
||||||
const shouldRemoveFavicon =
|
const shouldRemoveFavicon =
|
||||||
@@ -1155,7 +1153,7 @@ index 43180487a2fac15b7a65fac94f233eeed9094990..ae1288974cae29da929f27b78ff8db54
|
|||||||
!this._browser.mIconURL &&
|
!this._browser.mIconURL &&
|
||||||
!ignoreBlank &&
|
!ignoreBlank &&
|
||||||
!(originalLocation.spec in FAVICON_DEFAULTS);
|
!(originalLocation.spec in FAVICON_DEFAULTS);
|
||||||
@@ -9930,13 +10211,6 @@
|
@@ -9858,13 +10137,6 @@
|
||||||
this._browser.originalURI = aRequest.originalURI;
|
this._browser.originalURI = aRequest.originalURI;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/browser/components/tabbrowser/content/tabgroup.js b/browser/components/tabbrowser/content/tabgroup.js
|
diff --git a/browser/components/tabbrowser/content/tabgroup.js b/browser/components/tabbrowser/content/tabgroup.js
|
||||||
index 237950fb2c449ce088c204d33a70b1d95dae549b..635f9dbc5c79b6bb869b4ab4ec2d4b4e226b4672 100644
|
index 237950fb2c449ce088c204d33a70b1d95dae549b..af200a043dcd2e24393fcefe32493e356c9f8c6f 100644
|
||||||
--- a/browser/components/tabbrowser/content/tabgroup.js
|
--- a/browser/components/tabbrowser/content/tabgroup.js
|
||||||
+++ b/browser/components/tabbrowser/content/tabgroup.js
|
+++ b/browser/components/tabbrowser/content/tabgroup.js
|
||||||
@@ -14,11 +14,11 @@
|
@@ -14,11 +14,11 @@
|
||||||
@@ -101,7 +101,7 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..635f9dbc5c79b6bb869b4ab4ec2d4b4e
|
|||||||
|
|
||||||
resetDefaultGroupName = () => {
|
resetDefaultGroupName = () => {
|
||||||
this.#defaultGroupName = "";
|
this.#defaultGroupName = "";
|
||||||
@@ -175,10 +198,18 @@
|
@@ -175,10 +198,15 @@
|
||||||
if (!this.#tabChangeObserver) {
|
if (!this.#tabChangeObserver) {
|
||||||
this.#tabChangeObserver = new window.MutationObserver(mutations => {
|
this.#tabChangeObserver = new window.MutationObserver(mutations => {
|
||||||
if (!this.tabs.length) {
|
if (!this.tabs.length) {
|
||||||
@@ -112,15 +112,12 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..635f9dbc5c79b6bb869b4ab4ec2d4b4e
|
|||||||
new CustomEvent("TabGroupRemoved", { bubbles: true })
|
new CustomEvent("TabGroupRemoved", { bubbles: true })
|
||||||
);
|
);
|
||||||
+ gZenVerticalTabsManager.animateItemClose(this).then(() => {
|
+ gZenVerticalTabsManager.animateItemClose(this).then(() => {
|
||||||
+ this.dispatchEvent(
|
|
||||||
+ new CustomEvent("TabGroupRemovedFromDOM", { bubbles: true })
|
|
||||||
+ );
|
|
||||||
this.remove();
|
this.remove();
|
||||||
+ });
|
+ });
|
||||||
Services.obs.notifyObservers(
|
Services.obs.notifyObservers(
|
||||||
this,
|
this,
|
||||||
"browser-tabgroup-removed-from-dom"
|
"browser-tabgroup-removed-from-dom"
|
||||||
@@ -223,7 +254,10 @@
|
@@ -223,7 +251,10 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -132,7 +129,7 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..635f9dbc5c79b6bb869b4ab4ec2d4b4e
|
|||||||
}
|
}
|
||||||
|
|
||||||
get color() {
|
get color() {
|
||||||
@@ -330,6 +364,9 @@
|
@@ -330,6 +361,9 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
set collapsed(val) {
|
set collapsed(val) {
|
||||||
@@ -142,7 +139,7 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..635f9dbc5c79b6bb869b4ab4ec2d4b4e
|
|||||||
if (!!val == this.collapsed) {
|
if (!!val == this.collapsed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -416,7 +453,6 @@
|
@@ -416,7 +450,6 @@
|
||||||
tabGroupName,
|
tabGroupName,
|
||||||
})
|
})
|
||||||
.then(result => {
|
.then(result => {
|
||||||
@@ -150,7 +147,7 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..635f9dbc5c79b6bb869b4ab4ec2d4b4e
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -491,13 +527,68 @@
|
@@ -491,13 +524,68 @@
|
||||||
* @returns {MozTabbrowserTab[]}
|
* @returns {MozTabbrowserTab[]}
|
||||||
*/
|
*/
|
||||||
get tabs() {
|
get tabs() {
|
||||||
@@ -165,8 +162,9 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..635f9dbc5c79b6bb869b4ab4ec2d4b4e
|
|||||||
+ tabsCollect.push(item);
|
+ tabsCollect.push(item);
|
||||||
+ if (gBrowser.isTabGroup(item)) {
|
+ if (gBrowser.isTabGroup(item)) {
|
||||||
+ tabsCollect.push(...item.tabs);
|
+ tabsCollect.push(...item.tabs);
|
||||||
+ }
|
}
|
||||||
+ }
|
}
|
||||||
|
- return childrenArray.filter(node => node.matches("tab"));
|
||||||
+ return tabsCollect.filter(node => node.matches("tab"));
|
+ return tabsCollect.filter(node => node.matches("tab"));
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
@@ -210,9 +208,8 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..635f9dbc5c79b6bb869b4ab4ec2d4b4e
|
|||||||
+ currentGroup = currentGroup?.group;
|
+ currentGroup = currentGroup?.group;
|
||||||
+ if (currentGroup.collapsed) {
|
+ if (currentGroup.collapsed) {
|
||||||
+ return false;
|
+ return false;
|
||||||
}
|
+ }
|
||||||
}
|
+ }
|
||||||
- return childrenArray.filter(node => node.matches("tab"));
|
|
||||||
+ if (this.pinned && gZenWorkspaces.activeWorkspaceElement?.hasCollapsedPinnedTabs) {
|
+ if (this.pinned && gZenWorkspaces.activeWorkspaceElement?.hasCollapsedPinnedTabs) {
|
||||||
+ return false;
|
+ return false;
|
||||||
+ }
|
+ }
|
||||||
@@ -224,7 +221,7 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..635f9dbc5c79b6bb869b4ab4ec2d4b4e
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -617,9 +708,6 @@
|
@@ -617,9 +705,6 @@
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
if (tabOrSplitView.pinned) {
|
if (tabOrSplitView.pinned) {
|
||||||
@@ -234,7 +231,7 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..635f9dbc5c79b6bb869b4ab4ec2d4b4e
|
|||||||
}
|
}
|
||||||
let tabToMove =
|
let tabToMove =
|
||||||
this.documentGlobal === tabOrSplitView.documentGlobal
|
this.documentGlobal === tabOrSplitView.documentGlobal
|
||||||
@@ -682,7 +770,7 @@
|
@@ -682,7 +767,7 @@
|
||||||
*/
|
*/
|
||||||
on_click(event) {
|
on_click(event) {
|
||||||
let isToggleElement =
|
let isToggleElement =
|
||||||
@@ -243,7 +240,7 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..635f9dbc5c79b6bb869b4ab4ec2d4b4e
|
|||||||
event.target === this.#overflowCountLabel;
|
event.target === this.#overflowCountLabel;
|
||||||
if (isToggleElement && event.button === 0) {
|
if (isToggleElement && event.button === 0) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
@@ -761,5 +849,6 @@
|
@@ -761,5 +846,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
diff --git a/browser/components/urlbar/UrlbarPrefs.sys.mjs b/browser/components/urlbar/UrlbarPrefs.sys.mjs
|
diff --git a/browser/components/urlbar/UrlbarPrefs.sys.mjs b/browser/components/urlbar/UrlbarPrefs.sys.mjs
|
||||||
index e48f0295d803ba9eac5ab9d01ebb3b3dacbc9d4b..cb78b74230f63a47479404767b5ab5883278dfba 100644
|
index 89f0d44d462de3d7d0f581d6371606f475443822..0d45ce5f6455e9c7276c54f504906bade5b3d286 100644
|
||||||
--- a/browser/components/urlbar/UrlbarPrefs.sys.mjs
|
--- a/browser/components/urlbar/UrlbarPrefs.sys.mjs
|
||||||
+++ b/browser/components/urlbar/UrlbarPrefs.sys.mjs
|
+++ b/browser/components/urlbar/UrlbarPrefs.sys.mjs
|
||||||
@@ -161,6 +161,9 @@ const PREF_URLBAR_DEFAULTS = /** @type {PreferenceDefinition[]} */ ([
|
@@ -163,6 +163,9 @@ const PREF_URLBAR_DEFAULTS = /** @type {PreferenceDefinition[]} */ ([
|
||||||
// Feature gate pref for flight status suggestions in the urlbar.
|
// Feature gate pref for flight status suggestions in the urlbar.
|
||||||
["flightStatus.featureGate", false],
|
["flightStatus.featureGate", false],
|
||||||
|
|
||||||
@@ -12,7 +12,7 @@ index e48f0295d803ba9eac5ab9d01ebb3b3dacbc9d4b..cb78b74230f63a47479404767b5ab588
|
|||||||
// The minimum prefix length of a flight status keyword the user must type to
|
// The minimum prefix length of a flight status keyword the user must type to
|
||||||
// trigger the suggestion. 0 means the min length should be taken from Nimbus
|
// trigger the suggestion. 0 means the min length should be taken from Nimbus
|
||||||
// or remote settings.
|
// or remote settings.
|
||||||
@@ -486,6 +489,7 @@ const PREF_URLBAR_DEFAULTS = /** @type {PreferenceDefinition[]} */ ([
|
@@ -482,6 +485,7 @@ const PREF_URLBAR_DEFAULTS = /** @type {PreferenceDefinition[]} */ ([
|
||||||
["shortcuts.tabs", true],
|
["shortcuts.tabs", true],
|
||||||
["shortcuts.history", true],
|
["shortcuts.history", true],
|
||||||
["shortcuts.actions", true],
|
["shortcuts.actions", true],
|
||||||
@@ -20,12 +20,12 @@ index e48f0295d803ba9eac5ab9d01ebb3b3dacbc9d4b..cb78b74230f63a47479404767b5ab588
|
|||||||
|
|
||||||
// Boolean to determine if the providers defined in `exposureResults`
|
// Boolean to determine if the providers defined in `exposureResults`
|
||||||
// should be displayed in search results. This can be set by a
|
// should be displayed in search results. This can be set by a
|
||||||
@@ -854,6 +858,8 @@ function makeDefaultResultGroups({
|
@@ -840,6 +844,8 @@ function makeDefaultResultGroups({
|
||||||
*/
|
*/
|
||||||
let rootGroup = {
|
let rootGroup = {
|
||||||
children: [
|
children: [
|
||||||
+ { children: [{ group: lazy.UrlbarShared.RESULT_GROUP.ZEN_ACTION }] },
|
+ { children: [{ group: lazy.UrlbarUtils.RESULT_GROUP.ZEN_ACTION }] },
|
||||||
+ { children: [{ group: lazy.UrlbarShared.RESULT_GROUP.ZEN_WORKSPACE }] },
|
+ { children: [{ group: lazy.UrlbarUtils.RESULT_GROUP.ZEN_WORKSPACE }] },
|
||||||
// heuristic
|
// heuristic
|
||||||
{
|
{
|
||||||
maxResultCount: 1,
|
maxResultCount: 1,
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
diff --git a/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs b/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs
|
diff --git a/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs b/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs
|
||||||
index cfc232f038cd491db32e0c0ca35622360dd9dec5..4806a725ddefa9d0709020d537eae5464249a294 100644
|
index f611d8e44af518aa1adc7505c5021235f55b49de..0eca20cb869626dfa6ace02acc00cad84462d54f 100644
|
||||||
--- a/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs
|
--- a/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs
|
||||||
+++ b/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs
|
+++ b/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs
|
||||||
@@ -77,22 +77,26 @@ export class UrlbarProviderHeuristicFallback extends UrlbarProvider {
|
@@ -78,22 +78,26 @@ export class UrlbarProviderHeuristicFallback extends UrlbarProvider {
|
||||||
// Since we can't tell if this is a real URL and whether the user wants
|
// Since we can't tell if this is a real URL and whether the user wants
|
||||||
// to visit or search for it, we provide an alternative searchengine
|
// to visit or search for it, we provide an alternative searchengine
|
||||||
// match if the string looks like an alphanumeric origin or an e-mail.
|
// match if the string looks like an alphanumeric origin or an e-mail.
|
||||||
@@ -17,7 +17,7 @@ index cfc232f038cd491db32e0c0ca35622360dd9dec5..4806a725ddefa9d0709020d537eae546
|
|||||||
- lazy.UrlUtils.REGEXP_COMMON_EMAIL.test(str))
|
- lazy.UrlUtils.REGEXP_COMMON_EMAIL.test(str))
|
||||||
- ) {
|
- ) {
|
||||||
+ let trimmedSearchString = queryContext.trimmedSearchString;
|
+ let trimmedSearchString = queryContext.trimmedSearchString;
|
||||||
+ let [searchCandidate] = lazy.UrlbarShared.stripPrefixAndTrim(
|
+ let [searchCandidate] = UrlbarUtils.stripPrefixAndTrim(
|
||||||
+ trimmedSearchString,
|
+ trimmedSearchString,
|
||||||
+ {
|
+ {
|
||||||
+ trimSlash: true,
|
+ trimSlash: true,
|
||||||
|
|||||||
@@ -1,16 +1,41 @@
|
|||||||
diff --git a/browser/components/urlbar/UrlbarUtils.sys.mjs b/browser/components/urlbar/UrlbarUtils.sys.mjs
|
diff --git a/browser/components/urlbar/UrlbarUtils.sys.mjs b/browser/components/urlbar/UrlbarUtils.sys.mjs
|
||||||
index 178cd5e84fda74a28b2de59b671b3399cc28fac4..b03c6e06de4ee9a95dcb4d33d7ac9f0b053be4e1 100644
|
index 78c76bde00b6b581184cee1cd0e1756e5f2da6a4..94c713470b1240729ef2350d090b0449f3801af4 100644
|
||||||
--- a/browser/components/urlbar/UrlbarUtils.sys.mjs
|
--- a/browser/components/urlbar/UrlbarUtils.sys.mjs
|
||||||
+++ b/browser/components/urlbar/UrlbarUtils.sys.mjs
|
+++ b/browser/components/urlbar/UrlbarUtils.sys.mjs
|
||||||
@@ -214,6 +214,11 @@ export var UrlbarUtils = {
|
@@ -126,6 +126,8 @@ export var UrlbarUtils = {
|
||||||
return UrlbarShared.RESULT_GROUP.HEURISTIC_FALLBACK;
|
SEMANTIC_HISTORY: "semanticHistory",
|
||||||
|
SUGGESTED_INDEX: "suggestedIndex",
|
||||||
|
TAIL_SUGGESTION: "tailSuggestion",
|
||||||
|
+ ZEN_ACTION: "zenAction",
|
||||||
|
+ ZEN_WORKSPACE: "zenWorkspace",
|
||||||
|
}),
|
||||||
|
|
||||||
|
// Defines provider types.
|
||||||
|
@@ -274,6 +276,14 @@ export var UrlbarUtils = {
|
||||||
|
telemetryLabel: "actions",
|
||||||
|
uiLabel: "urlbar-searchmode-actions3",
|
||||||
|
},
|
||||||
|
+ {
|
||||||
|
+ source: UrlbarShared.RESULT_SOURCE.WORKSPACES,
|
||||||
|
+ restrict: UrlbarShared.RESTRICT_TOKENS.WORKSPACE,
|
||||||
|
+ icon: "chrome://browser/skin/zen-icons/selectable/layers.svg",
|
||||||
|
+ pref: "shortcuts.workspaces",
|
||||||
|
+ telemetryLabel: "workspaces",
|
||||||
|
+ uiLabel: "urlbar-search-mode-workspaces",
|
||||||
|
+ },
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
|
||||||
|
@@ -566,6 +576,12 @@ export var UrlbarUtils = {
|
||||||
|
return this.RESULT_GROUP.HEURISTIC_FALLBACK;
|
||||||
case "UrlbarProviderHistoryUrlHeuristic":
|
case "UrlbarProviderHistoryUrlHeuristic":
|
||||||
return UrlbarShared.RESULT_GROUP.HEURISTIC_HISTORY_URL;
|
return this.RESULT_GROUP.HEURISTIC_HISTORY_URL;
|
||||||
+ case "ZenUrlbarProviderGlobalActions":
|
+ case "ZenUrlbarProviderGlobalActions":
|
||||||
+ if (result.source == UrlbarShared.RESULT_SOURCE.WORKSPACES) {
|
+ if (result.source == UrlbarShared.RESULT_SOURCE.WORKSPACES) {
|
||||||
+ return UrlbarShared.RESULT_GROUP.ZEN_WORKSPACE;
|
+ return this.RESULT_GROUP.ZEN_WORKSPACE;
|
||||||
|
+ } else {
|
||||||
|
+ return this.RESULT_GROUP.ZEN_ACTION;
|
||||||
+ }
|
+ }
|
||||||
+ return UrlbarShared.RESULT_GROUP.ZEN_ACTION;
|
|
||||||
case "UrlbarProviderOmnibox":
|
case "UrlbarProviderOmnibox":
|
||||||
return UrlbarShared.RESULT_GROUP.HEURISTIC_OMNIBOX;
|
return this.RESULT_GROUP.HEURISTIC_OMNIBOX;
|
||||||
case "UrlbarProviderRestrictKeywordsAutofill":
|
case "UrlbarProviderRestrictKeywordsAutofill":
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
diff --git a/browser/components/urlbar/content/UrlbarChildController.mjs b/browser/components/urlbar/content/UrlbarChildController.mjs
|
diff --git a/browser/components/urlbar/content/UrlbarChildController.mjs b/browser/components/urlbar/content/UrlbarChildController.mjs
|
||||||
index a17a4de079b69d2818388b33a2c1746cc6148c73..4fee63a22919972af08716db2d2de1c7549ff100 100644
|
index a8e9d3093d046612650a17970330a8279f55833f..063a3e8adf009d6c0ddc60430bc0e7485e812b8a 100644
|
||||||
--- a/browser/components/urlbar/content/UrlbarChildController.mjs
|
--- a/browser/components/urlbar/content/UrlbarChildController.mjs
|
||||||
+++ b/browser/components/urlbar/content/UrlbarChildController.mjs
|
+++ b/browser/components/urlbar/content/UrlbarChildController.mjs
|
||||||
@@ -438,7 +438,6 @@ export class UrlbarChildController {
|
@@ -258,7 +258,6 @@ export class UrlbarChildController {
|
||||||
const isMac = AppConstants.platform == "macosx";
|
const isMac = AppConstants.platform == "macosx";
|
||||||
// Handle readline/emacs-style navigation bindings on Mac.
|
// Handle readline/emacs-style navigation bindings on Mac.
|
||||||
if (
|
if (
|
||||||
@@ -10,7 +10,7 @@ index a17a4de079b69d2818388b33a2c1746cc6148c73..4fee63a22919972af08716db2d2de1c7
|
|||||||
this.view.isOpen &&
|
this.view.isOpen &&
|
||||||
event.ctrlKey &&
|
event.ctrlKey &&
|
||||||
(event.key == "n" || event.key == "p")
|
(event.key == "n" || event.key == "p")
|
||||||
@@ -630,6 +629,8 @@ export class UrlbarChildController {
|
@@ -450,6 +449,8 @@ export class UrlbarChildController {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
@@ -19,25 +19,3 @@ index a17a4de079b69d2818388b33a2c1746cc6148c73..4fee63a22919972af08716db2d2de1c7
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -934,6 +935,10 @@ export class UrlbarChildController {
|
|
||||||
}
|
|
||||||
reuseEmpty = true;
|
|
||||||
}
|
|
||||||
+ if (this.#input.hasAttribute?.("zen-newtab")) {
|
|
||||||
+ where = "tab";
|
|
||||||
+ reuseEmpty = true;
|
|
||||||
+ }
|
|
||||||
// The browser window exists only in chrome; a content-process input has no
|
|
||||||
// tab to reuse, so `gBrowser` is absent and the reuse is skipped.
|
|
||||||
if (
|
|
||||||
@@ -943,6 +948,10 @@ export class UrlbarChildController {
|
|
||||||
) {
|
|
||||||
where = "current";
|
|
||||||
}
|
|
||||||
+ if (this.window.gBrowser?.selectedTab.hasAttribute("zen-empty-tab")) {
|
|
||||||
+ // Always open in a new tab if the current tab is our empty tab.
|
|
||||||
+ return "tab";
|
|
||||||
+ }
|
|
||||||
return where;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
diff --git a/browser/components/urlbar/content/UrlbarInput.mjs b/browser/components/urlbar/content/UrlbarInput.mjs
|
diff --git a/browser/components/urlbar/content/UrlbarInput.mjs b/browser/components/urlbar/content/UrlbarInput.mjs
|
||||||
index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1a95e28b8 100644
|
index e7e9495e56076cd112beafb8297dece4ae4cea58..afdc80c034e2a3c9a50e6e5d2cc650e59bf2eb91 100644
|
||||||
--- a/browser/components/urlbar/content/UrlbarInput.mjs
|
--- a/browser/components/urlbar/content/UrlbarInput.mjs
|
||||||
+++ b/browser/components/urlbar/content/UrlbarInput.mjs
|
+++ b/browser/components/urlbar/content/UrlbarInput.mjs
|
||||||
@@ -88,6 +88,13 @@ const lazy = XPCOMUtils.declareLazy({
|
@@ -101,6 +101,13 @@ const lazy = XPCOMUtils.declareLazy({
|
||||||
logger: () => UrlbarShared.getLogger({ prefix: "Input" }),
|
logger: () => UrlbarShared.getLogger({ prefix: "Input" }),
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
const UNLIMITED_MAX_RESULTS = 99;
|
const UNLIMITED_MAX_RESULTS = 99;
|
||||||
|
|
||||||
let getBoundsWithoutFlushing = element =>
|
let getBoundsWithoutFlushing = element =>
|
||||||
@@ -771,7 +778,16 @@ ${
|
@@ -769,7 +776,16 @@ ${
|
||||||
// See _on_select(). HTMLInputElement.select() dispatches a "select"
|
// See _on_select(). HTMLInputElement.select() dispatches a "select"
|
||||||
// event but does not set the primary selection.
|
// event but does not set the primary selection.
|
||||||
this._suppressPrimaryAdjustment = true;
|
this._suppressPrimaryAdjustment = true;
|
||||||
@@ -33,7 +33,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
this._suppressPrimaryAdjustment = false;
|
this._suppressPrimaryAdjustment = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -846,6 +862,10 @@ ${
|
@@ -843,6 +859,10 @@ ${
|
||||||
hideSearchTerms = false,
|
hideSearchTerms = false,
|
||||||
isSameDocument = false,
|
isSameDocument = false,
|
||||||
} = {}) {
|
} = {}) {
|
||||||
@@ -44,7 +44,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
if (!this.#isAddressbar) {
|
if (!this.#isAddressbar) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"Cannot set URI for UrlbarInput that is not an address bar"
|
"Cannot set URI for UrlbarInput that is not an address bar"
|
||||||
@@ -1143,7 +1163,16 @@ ${
|
@@ -1137,7 +1157,16 @@ ${
|
||||||
this.searchModeSwitcher?.updateSearchIcon();
|
this.searchModeSwitcher?.updateSearchIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1726,7 +1755,11 @@ ${
|
@@ -1626,7 +1655,11 @@ ${
|
||||||
openParams.avoidBrowserFocus = keepViewOpen;
|
openParams.avoidBrowserFocus = keepViewOpen;
|
||||||
|
|
||||||
if (!this.#providesSearchMode(result) && !keepViewOpen) {
|
if (!this.#providesSearchMode(result) && !keepViewOpen) {
|
||||||
@@ -74,7 +74,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isCanonized) {
|
if (isCanonized) {
|
||||||
@@ -3016,6 +3049,42 @@ ${
|
@@ -2974,6 +3007,42 @@ ${
|
||||||
await this.#updateLayoutBreakoutDimensions();
|
await this.#updateLayoutBreakoutDimensions();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,7 +117,8 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
startLayoutExtend() {
|
startLayoutExtend() {
|
||||||
if (!this.#allowBreakout || this.hasAttribute("breakout-extend")) {
|
if (!this.#allowBreakout || this.hasAttribute("breakout-extend")) {
|
||||||
// Do not expand if the Urlbar does not support being expanded or it is
|
// Do not expand if the Urlbar does not support being expanded or it is
|
||||||
@@ -3030,6 +3099,13 @@ ${
|
@@ -2988,6 +3057,14 @@ ${
|
||||||
|
+ this.setAttribute("popover", "manual");
|
||||||
this.toggleAttribute("breakout-extend", true);
|
this.toggleAttribute("breakout-extend", true);
|
||||||
this.#updateTextboxPosition();
|
this.#updateTextboxPosition();
|
||||||
|
|
||||||
@@ -131,7 +132,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
// Enable the animation only after the first extend call to ensure it
|
// Enable the animation only after the first extend call to ensure it
|
||||||
// doesn't run when opening a new window.
|
// doesn't run when opening a new window.
|
||||||
if (!this.hasAttribute("breakout-extend-animate")) {
|
if (!this.hasAttribute("breakout-extend-animate")) {
|
||||||
@@ -3053,6 +3129,29 @@ ${
|
@@ -3011,6 +3088,30 @@ ${
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,9 +160,10 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
+ this.removeAttribute("zen-floating-urlbar");
|
+ this.removeAttribute("zen-floating-urlbar");
|
||||||
+
|
+
|
||||||
this.toggleAttribute("breakout-extend", false);
|
this.toggleAttribute("breakout-extend", false);
|
||||||
|
+ this.removeAttribute("popover");
|
||||||
this.#updateTextboxPosition();
|
this.#updateTextboxPosition();
|
||||||
}
|
}
|
||||||
@@ -3091,7 +3190,7 @@ ${
|
@@ -3049,7 +3148,7 @@ ${
|
||||||
forceUnifiedSearchButtonAvailable = false
|
forceUnifiedSearchButtonAvailable = false
|
||||||
) {
|
) {
|
||||||
let prevState = this.getAttribute("pageproxystate");
|
let prevState = this.getAttribute("pageproxystate");
|
||||||
@@ -170,7 +172,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
this.setAttribute("pageproxystate", state);
|
this.setAttribute("pageproxystate", state);
|
||||||
this._inputContainer.setAttribute("pageproxystate", state);
|
this._inputContainer.setAttribute("pageproxystate", state);
|
||||||
this._identityBox?.setAttribute("pageproxystate", state);
|
this._identityBox?.setAttribute("pageproxystate", state);
|
||||||
@@ -3355,10 +3454,12 @@ ${
|
@@ -3332,10 +3431,12 @@ ${
|
||||||
}
|
}
|
||||||
|
|
||||||
this.style.top = px(
|
this.style.top = px(
|
||||||
@@ -183,7 +185,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3417,9 +3518,10 @@ ${
|
@@ -3394,9 +3495,10 @@ ${
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,9 +195,9 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
- px(getBoundsWithoutFlushing(this.parentNode).height)
|
- px(getBoundsWithoutFlushing(this.parentNode).height)
|
||||||
+ px(getBoundsWithoutFlushing(this.parentNode).height + 8)
|
+ px(getBoundsWithoutFlushing(this.parentNode).height + 8)
|
||||||
);
|
);
|
||||||
|
this.style.setProperty(
|
||||||
if (this.#breakoutBlockerCount) {
|
"--urlbar-height",
|
||||||
@@ -3929,6 +4031,7 @@ ${
|
@@ -3902,6 +4004,7 @@ ${
|
||||||
}
|
}
|
||||||
|
|
||||||
_toggleActionOverride(event) {
|
_toggleActionOverride(event) {
|
||||||
@@ -203,33 +205,47 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
if (
|
if (
|
||||||
event.keyCode == KeyEvent.DOM_VK_SHIFT ||
|
event.keyCode == KeyEvent.DOM_VK_SHIFT ||
|
||||||
event.keyCode == KeyEvent.DOM_VK_ALT ||
|
event.keyCode == KeyEvent.DOM_VK_ALT ||
|
||||||
@@ -4027,9 +4130,10 @@ ${
|
@@ -4014,8 +4117,8 @@ ${
|
||||||
if (!this.#isAddressbar) {
|
if (!this.#isAddressbar) {
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
- let trimmedValue = UrlbarPrefs.get("trimURLs")
|
- let trimmedValue = lazy.UrlbarPrefs.get("trimURLs")
|
||||||
- ? lazy.BrowserUIUtils.trimURL(val)
|
- ? lazy.BrowserUIUtils.trimURL(val)
|
||||||
- : val;
|
+ let trimmedValue = lazy.UrlbarPrefs.get("trimURLs") && this._zenTrimURL
|
||||||
+ let trimmedValue =
|
+ ? this._zenTrimURL(val)
|
||||||
+ UrlbarPrefs.get("trimURLs") && this._zenTrimURL
|
: val;
|
||||||
+ ? this._zenTrimURL(val)
|
|
||||||
+ : val;
|
|
||||||
// Only trim value if the directionality doesn't change to RTL and we're not
|
// Only trim value if the directionality doesn't change to RTL and we're not
|
||||||
// showing a strikeout https protocol.
|
// showing a strikeout https protocol.
|
||||||
return this.controller.isTextDirectionRTL(trimmedValue) ||
|
@@ -4317,6 +4420,7 @@ ${
|
||||||
@@ -4235,6 +4339,11 @@ ${
|
browser = this.window.gBrowser.selectedBrowser,
|
||||||
keepViewOpen = false,
|
keepViewOpen = false
|
||||||
browserId = null,
|
) {
|
||||||
}) {
|
+ openUILinkWhere = this.window.gZenUIManager.getOpenUILinkWhere(url, browser, openUILinkWhere);
|
||||||
+ where = this.window.gZenUIManager.getOpenUILinkWhere(
|
if (this.#isAddressbar) {
|
||||||
+ url,
|
this.#prepareAddressbarLoad(
|
||||||
+ this.window.gBrowser.selectedBrowser,
|
url,
|
||||||
+ where
|
@@ -4430,6 +4534,10 @@ ${
|
||||||
+ );
|
}
|
||||||
let userTypedValue;
|
reuseEmpty = true;
|
||||||
if (this.#isAddressbar && where == "current") {
|
}
|
||||||
// Make sure URL is formatted properly (don't show punycode).
|
+ if (this.hasAttribute("zen-newtab")) {
|
||||||
@@ -4576,6 +4685,7 @@ ${
|
+ where = "tab";
|
||||||
|
+ reuseEmpty = true;
|
||||||
|
+ }
|
||||||
|
if (
|
||||||
|
where == "tab" &&
|
||||||
|
reuseEmpty &&
|
||||||
|
@@ -4437,6 +4545,9 @@ ${
|
||||||
|
) {
|
||||||
|
where = "current";
|
||||||
|
}
|
||||||
|
+ if (this.window.gBrowser.selectedTab.hasAttribute("zen-empty-tab")) {
|
||||||
|
+ return "tab"; // Always open in a new tab if the current tab is "our empty tab".
|
||||||
|
+ }
|
||||||
|
return where;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -4691,6 +4802,7 @@ ${
|
||||||
this.setResultForCurrentValue(null);
|
this.setResultForCurrentValue(null);
|
||||||
this.handleCommand();
|
this.handleCommand();
|
||||||
this.controller.clearLastQueryContextCache();
|
this.controller.clearLastQueryContextCache();
|
||||||
@@ -237,7 +253,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
|
|
||||||
this._suppressStartQuery = false;
|
this._suppressStartQuery = false;
|
||||||
});
|
});
|
||||||
@@ -4583,7 +4693,6 @@ ${
|
@@ -4698,7 +4810,6 @@ ${
|
||||||
contextMenu.addEventListener("popupshowing", () => {
|
contextMenu.addEventListener("popupshowing", () => {
|
||||||
// Close the results pane when the input field contextual menu is open,
|
// Close the results pane when the input field contextual menu is open,
|
||||||
// because paste and go doesn't want a result selection.
|
// because paste and go doesn't want a result selection.
|
||||||
@@ -245,7 +261,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
|
|
||||||
let controller =
|
let controller =
|
||||||
this.document.commandDispatcher.getControllerForCommand("cmd_paste");
|
this.document.commandDispatcher.getControllerForCommand("cmd_paste");
|
||||||
@@ -4850,7 +4959,11 @@ ${
|
@@ -4979,7 +5090,11 @@ ${
|
||||||
if (!engineName && !source && !this.hasAttribute("searchmode")) {
|
if (!engineName && !source && !this.hasAttribute("searchmode")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -258,7 +274,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
if (this._searchModeIndicatorTitle) {
|
if (this._searchModeIndicatorTitle) {
|
||||||
this._searchModeIndicatorTitle.textContent = "";
|
this._searchModeIndicatorTitle.textContent = "";
|
||||||
this._searchModeIndicatorTitle.removeAttribute("data-l10n-id");
|
this._searchModeIndicatorTitle.removeAttribute("data-l10n-id");
|
||||||
@@ -5149,6 +5262,7 @@ ${
|
@@ -5297,6 +5412,7 @@ ${
|
||||||
|
|
||||||
this.document.l10n.setAttributes(
|
this.document.l10n.setAttributes(
|
||||||
this.inputField,
|
this.inputField,
|
||||||
@@ -266,20 +282,20 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
l10nId,
|
l10nId,
|
||||||
l10nId == "urlbar-placeholder-with-name"
|
l10nId == "urlbar-placeholder-with-name"
|
||||||
? { name: engineName }
|
? { name: engineName }
|
||||||
@@ -5199,6 +5313,12 @@ ${
|
@@ -5347,6 +5463,12 @@ ${
|
||||||
}
|
}
|
||||||
|
|
||||||
lazy.logger.debug("Blur Event");
|
lazy.logger.debug("Blur Event");
|
||||||
+ if (
|
+ if (
|
||||||
+ this.document.commandDispatcher.focusedElement == this.inputField &&
|
+ this.document.commandDispatcher.focusedElement == this.inputField &&
|
||||||
+ !UrlbarPrefs.get("closeOnWindowBlur")
|
+ !lazy.UrlbarPrefs.get("closeOnWindowBlur")
|
||||||
+ ) {
|
+ ) {
|
||||||
+ return;
|
+ return;
|
||||||
+ }
|
+ }
|
||||||
// We cannot count every blur events after a missed engagement as abandoment
|
// We cannot count every blur events after a missed engagement as abandoment
|
||||||
// because the user may have clicked on some view element that executes
|
// because the user may have clicked on some view element that executes
|
||||||
// a command causing a focus change. For example opening preferences from
|
// a command causing a focus change. For example opening preferences from
|
||||||
@@ -5276,6 +5396,11 @@ ${
|
@@ -5424,6 +5546,11 @@ ${
|
||||||
}
|
}
|
||||||
|
|
||||||
_on_click(event) {
|
_on_click(event) {
|
||||||
@@ -291,7 +307,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
switch (event.target) {
|
switch (event.target) {
|
||||||
case this.inputField:
|
case this.inputField:
|
||||||
case this._inputContainer:
|
case this._inputContainer:
|
||||||
@@ -5371,10 +5496,11 @@ ${
|
@@ -5513,10 +5640,11 @@ ${
|
||||||
}
|
}
|
||||||
if (untrim) {
|
if (untrim) {
|
||||||
this.setValue(this._untrimmedValue);
|
this.setValue(this._untrimmedValue);
|
||||||
@@ -304,7 +320,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
this.view.autoOpen({ event });
|
this.view.autoOpen({ event });
|
||||||
} else {
|
} else {
|
||||||
if (this._untrimOnFocusAfterKeydown) {
|
if (this._untrimOnFocusAfterKeydown) {
|
||||||
@@ -5414,9 +5540,16 @@ ${
|
@@ -5556,9 +5684,16 @@ ${
|
||||||
}
|
}
|
||||||
|
|
||||||
_on_mousedown(event) {
|
_on_mousedown(event) {
|
||||||
@@ -322,7 +338,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
if (
|
if (
|
||||||
event.composedTarget != this.inputField &&
|
event.composedTarget != this.inputField &&
|
||||||
event.composedTarget != this._inputContainer
|
event.composedTarget != this._inputContainer
|
||||||
@@ -5426,6 +5559,10 @@ ${
|
@@ -5568,6 +5703,10 @@ ${
|
||||||
|
|
||||||
this.focusedViaMousedown = !this.focused;
|
this.focusedViaMousedown = !this.focused;
|
||||||
this.#preventClickSelectsAll = this.focused;
|
this.#preventClickSelectsAll = this.focused;
|
||||||
@@ -333,7 +349,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
|
|
||||||
// Keep the focus status, since the attribute may be changed
|
// Keep the focus status, since the attribute may be changed
|
||||||
// upon calling this.focus().
|
// upon calling this.focus().
|
||||||
@@ -5463,7 +5600,7 @@ ${
|
@@ -5605,7 +5744,7 @@ ${
|
||||||
// view open on tab switch, and the TabSelect event arrived earlier.
|
// view open on tab switch, and the TabSelect event arrived earlier.
|
||||||
// Also ignore mousedown on the urlbarView context menu: opening/closing the
|
// Also ignore mousedown on the urlbarView context menu: opening/closing the
|
||||||
// view is already handled by the result opening flow.
|
// view is already handled by the result opening flow.
|
||||||
@@ -342,12 +358,12 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5754,7 +5891,7 @@ ${
|
@@ -5894,7 +6033,7 @@ ${
|
||||||
// When we are in actions search mode we can show more results so
|
// When we are in actions search mode we can show more results so
|
||||||
// increase the limit.
|
// increase the limit.
|
||||||
let maxResults =
|
let maxResults =
|
||||||
- this.searchMode?.source != UrlbarShared.RESULT_SOURCE.ACTIONS
|
- this.searchMode?.source != UrlbarShared.RESULT_SOURCE.ACTIONS
|
||||||
+ this.searchMode?.source != UrlbarShared.RESULT_SOURCE.ZEN_ACTIONS
|
+ this.searchMode?.source != UrlbarShared.RESULT_SOURCE.ZEN_ACTIONS
|
||||||
? UrlbarPrefs.get("maxRichResults")
|
? lazy.UrlbarPrefs.get("maxRichResults")
|
||||||
: UNLIMITED_MAX_RESULTS;
|
: UNLIMITED_MAX_RESULTS;
|
||||||
let options = {
|
let options = {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
diff --git a/browser/components/urlbar/content/UrlbarShared.mjs b/browser/components/urlbar/content/UrlbarShared.mjs
|
diff --git a/browser/components/urlbar/content/UrlbarShared.mjs b/browser/components/urlbar/content/UrlbarShared.mjs
|
||||||
index 4e67dad66ae006842abc6eed547e4a244320d57a..393b61b4d2543c73e60afd334a353f36119ae73e 100644
|
index 5b45afb747bfcdbd06782186737669aa2c4c634d..f68bd009f70415b5fb513abdfe19b4427ceefbfc 100644
|
||||||
--- a/browser/components/urlbar/content/UrlbarShared.mjs
|
--- a/browser/components/urlbar/content/UrlbarShared.mjs
|
||||||
+++ b/browser/components/urlbar/content/UrlbarShared.mjs
|
+++ b/browser/components/urlbar/content/UrlbarShared.mjs
|
||||||
@@ -100,6 +100,7 @@ export const UrlbarShared = {
|
@@ -47,6 +47,7 @@ export const UrlbarShared = {
|
||||||
// `looksLikeOrigin()` returned `LOOKS_LIKE_ORIGIN.OTHER` for this token.
|
// `looksLikeOrigin()` returned `LOOKS_LIKE_ORIGIN.OTHER` for this token.
|
||||||
// It may or may not be an origin.
|
// It may or may not be an origin.
|
||||||
POSSIBLE_ORIGIN_BUT_SEARCH_ALLOWED: 12,
|
POSSIBLE_ORIGIN_BUT_SEARCH_ALLOWED: 12,
|
||||||
@@ -10,7 +10,7 @@ index 4e67dad66ae006842abc6eed547e4a244320d57a..393b61b4d2543c73e60afd334a353f36
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -120,6 +121,7 @@ export const UrlbarShared = {
|
@@ -67,6 +68,7 @@ export const UrlbarShared = {
|
||||||
TITLE: "#",
|
TITLE: "#",
|
||||||
URL: "$",
|
URL: "$",
|
||||||
ACTION: ">",
|
ACTION: ">",
|
||||||
@@ -18,7 +18,7 @@ index 4e67dad66ae006842abc6eed547e4a244320d57a..393b61b4d2543c73e60afd334a353f36
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
// Defines UrlbarResult types.
|
// Defines UrlbarResult types.
|
||||||
@@ -165,6 +167,8 @@ export const UrlbarShared = {
|
@@ -112,6 +114,8 @@ export const UrlbarShared = {
|
||||||
OTHER_NETWORK: 6,
|
OTHER_NETWORK: 6,
|
||||||
ADDON: 7,
|
ADDON: 7,
|
||||||
ACTIONS: 8,
|
ACTIONS: 8,
|
||||||
@@ -26,33 +26,9 @@ index 4e67dad66ae006842abc6eed547e4a244320d57a..393b61b4d2543c73e60afd334a353f36
|
|||||||
+ WORKSPACES: 10,
|
+ WORKSPACES: 10,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
// Results are categorized into groups to help the muxer compose them. See
|
/**
|
||||||
@@ -200,6 +204,8 @@ export const UrlbarShared = {
|
@@ -128,6 +132,7 @@ export const UrlbarShared = {
|
||||||
SEMANTIC_HISTORY: "semanticHistory",
|
if (lazy.UrlbarPrefs.get("scotchBonnet.enableOverride")) {
|
||||||
SUGGESTED_INDEX: "suggestedIndex",
|
|
||||||
TAIL_SUGGESTION: "tailSuggestion",
|
|
||||||
+ ZEN_ACTION: "zenAction",
|
|
||||||
+ ZEN_WORKSPACE: "zenWorkspace",
|
|
||||||
}),
|
|
||||||
|
|
||||||
// Defines provider types.
|
|
||||||
@@ -385,6 +391,14 @@ export const UrlbarShared = {
|
|
||||||
telemetryLabel: "actions",
|
|
||||||
uiLabel: "urlbar-searchmode-actions3",
|
|
||||||
},
|
|
||||||
+ {
|
|
||||||
+ source: this.RESULT_SOURCE.WORKSPACES,
|
|
||||||
+ restrict: this.RESTRICT_TOKENS.WORKSPACE,
|
|
||||||
+ icon: "chrome://browser/skin/zen-icons/selectable/layers.svg",
|
|
||||||
+ pref: "shortcuts.workspaces",
|
|
||||||
+ telemetryLabel: "workspaces",
|
|
||||||
+ uiLabel: "urlbar-search-mode-workspaces",
|
|
||||||
+ },
|
|
||||||
]);
|
|
||||||
},
|
|
||||||
|
|
||||||
@@ -402,6 +416,7 @@ export const UrlbarShared = {
|
|
||||||
if (UrlbarPrefs.get("scotchBonnet.enableOverride")) {
|
|
||||||
keys.push(this.RESTRICT_TOKENS.ACTION);
|
keys.push(this.RESTRICT_TOKENS.ACTION);
|
||||||
}
|
}
|
||||||
+ keys.push(this.RESTRICT_TOKENS.WORKSPACE);
|
+ keys.push(this.RESTRICT_TOKENS.WORKSPACE);
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
diff --git a/browser/components/urlbar/content/UrlbarView.mjs b/browser/components/urlbar/content/UrlbarView.mjs
|
diff --git a/browser/components/urlbar/content/UrlbarView.mjs b/browser/components/urlbar/content/UrlbarView.mjs
|
||||||
index 9a2c787cfa4d70bd587d49e017075f905c90f626..1c3b341e5d520ec9541c4021aaedce98751b6993 100644
|
index e465806c4ae4fc372d9aa2b71aa7f0e74c65d026..c0b3781901298bedee2736819a93edbf545507a7 100644
|
||||||
--- a/browser/components/urlbar/content/UrlbarView.mjs
|
--- a/browser/components/urlbar/content/UrlbarView.mjs
|
||||||
+++ b/browser/components/urlbar/content/UrlbarView.mjs
|
+++ b/browser/components/urlbar/content/UrlbarView.mjs
|
||||||
@@ -822,7 +822,7 @@ export class UrlbarView {
|
@@ -803,7 +803,7 @@ export class UrlbarView {
|
||||||
!this.input.value ||
|
!this.input.value ||
|
||||||
this.input.getAttribute("pageproxystate") == "valid"
|
this.input.getAttribute("pageproxystate") == "valid"
|
||||||
) {
|
) {
|
||||||
@@ -11,7 +11,7 @@ index 9a2c787cfa4d70bd587d49e017075f905c90f626..1c3b341e5d520ec9541c4021aaedce98
|
|||||||
// Try to reuse the cached top-sites context. If it's not cached, then
|
// Try to reuse the cached top-sites context. If it's not cached, then
|
||||||
// there will be a gap of time between when the input is focused and
|
// there will be a gap of time between when the input is focused and
|
||||||
// when the view opens that can be perceived as flicker.
|
// when the view opens that can be perceived as flicker.
|
||||||
@@ -963,10 +963,6 @@ export class UrlbarView {
|
@@ -941,10 +941,6 @@ export class UrlbarView {
|
||||||
}
|
}
|
||||||
|
|
||||||
// If search mode isn't active, close the view.
|
// If search mode isn't active, close the view.
|
||||||
@@ -22,7 +22,7 @@ index 9a2c787cfa4d70bd587d49e017075f905c90f626..1c3b341e5d520ec9541c4021aaedce98
|
|||||||
|
|
||||||
// Search mode is active. If the one-offs should be shown, make sure they
|
// Search mode is active. If the one-offs should be shown, make sure they
|
||||||
// are enabled and show the view.
|
// are enabled and show the view.
|
||||||
@@ -3306,6 +3302,8 @@ export class UrlbarView {
|
@@ -3203,6 +3199,8 @@ export class UrlbarView {
|
||||||
if (row?.hasAttribute("row-selectable")) {
|
if (row?.hasAttribute("row-selectable")) {
|
||||||
row?.toggleAttribute("selected", true);
|
row?.toggleAttribute("selected", true);
|
||||||
}
|
}
|
||||||
@@ -31,7 +31,7 @@ index 9a2c787cfa4d70bd587d49e017075f905c90f626..1c3b341e5d520ec9541c4021aaedce98
|
|||||||
if (element != row) {
|
if (element != row) {
|
||||||
row?.toggleAttribute("descendant-selected", true);
|
row?.toggleAttribute("descendant-selected", true);
|
||||||
}
|
}
|
||||||
@@ -3972,7 +3970,7 @@ export class UrlbarView {
|
@@ -3715,7 +3713,7 @@ export class UrlbarView {
|
||||||
}
|
}
|
||||||
|
|
||||||
#enableOrDisableRowWrap() {
|
#enableOrDisableRowWrap() {
|
||||||
@@ -40,13 +40,13 @@ index 9a2c787cfa4d70bd587d49e017075f905c90f626..1c3b341e5d520ec9541c4021aaedce98
|
|||||||
this.#rows.toggleAttribute("wrap", wrap);
|
this.#rows.toggleAttribute("wrap", wrap);
|
||||||
this.oneOffSearchButtons?.container.toggleAttribute("wrap", wrap);
|
this.oneOffSearchButtons?.container.toggleAttribute("wrap", wrap);
|
||||||
}
|
}
|
||||||
@@ -4387,6 +4385,12 @@ export class UrlbarView {
|
@@ -4144,6 +4142,12 @@ export class UrlbarView {
|
||||||
}
|
}
|
||||||
|
|
||||||
on_blur() {
|
on_blur() {
|
||||||
+ if (
|
+ if (
|
||||||
+ this.document.commandDispatcher.focusedElement == this.input.inputField &&
|
+ this.document.commandDispatcher.focusedElement == this.input.inputField &&
|
||||||
+ !UrlbarPrefs.get("closeOnWindowBlur")
|
+ !lazy.UrlbarPrefs.get("closeOnWindowBlur")
|
||||||
+ ) {
|
+ ) {
|
||||||
+ return;
|
+ return;
|
||||||
+ }
|
+ }
|
||||||
|
|||||||
@@ -1,124 +0,0 @@
|
|||||||
diff --git a/browser/installer/windows/nsis/shared.nsh b/browser/installer/windows/nsis/shared.nsh
|
|
||||||
index b81c7ef59be0d25f67668215028008a451860df2..fa0ab8947e011289d25158cab17ff9388b5cab0d 100755
|
|
||||||
--- a/browser/installer/windows/nsis/shared.nsh
|
|
||||||
+++ b/browser/installer/windows/nsis/shared.nsh
|
|
||||||
@@ -873,50 +873,87 @@ FunctionEnd
|
|
||||||
!ifdef MOZ_MAINTENANCE_SERVICE
|
|
||||||
; Adds maintenance service certificate keys for the install dir.
|
|
||||||
; For the cert to work, it must also be signed by a trusted cert for the user.
|
|
||||||
+; Writes this application's allowed certificate values into _KEY, which must be
|
|
||||||
+; a maintenance service registry path such as the one returned by
|
|
||||||
+; ServicesHelper::PathToUniqueRegistryPath.
|
|
||||||
+!macro AddMaintCertKeyValues _KEY
|
|
||||||
+ ; PrefetchProcessName was originally used to experiment with deleting
|
|
||||||
+ ; Windows prefetch as a speed optimization. It is no longer used though.
|
|
||||||
+ DeleteRegValue HKLM "${_KEY}" "prefetchProcessName"
|
|
||||||
+
|
|
||||||
+ ; Setting the Attempted value will ensure that a new Maintenance Service
|
|
||||||
+ ; install will never be attempted again after this from updates. The value
|
|
||||||
+ ; is used only to see if updates should attempt new service installs.
|
|
||||||
+ WriteRegDWORD HKLM "Software\Mozilla\MaintenanceService" "Attempted" 1
|
|
||||||
+
|
|
||||||
+ ; More than one certificate can be specified in a different subfolder
|
|
||||||
+ ; for example: ${_KEY}\1, but each individual binary can be signed
|
|
||||||
+ ; with at most one certificate. A fallback certificate can only be used
|
|
||||||
+ ; if the binary is replaced with a different certificate.
|
|
||||||
+ WriteRegStr HKLM "${_KEY}\0" "name" "${CERTIFICATE_NAME}"
|
|
||||||
+ WriteRegStr HKLM "${_KEY}\0" "issuer" "${CERTIFICATE_ISSUER}"
|
|
||||||
+ ; These values associate the allowed certificates for the previous
|
|
||||||
+ ; installation, so that we can update from it cleanly using the
|
|
||||||
+ ; old updater.exe (which will still have this signature).
|
|
||||||
+ WriteRegStr HKLM "${_KEY}\1" "name" "${CERTIFICATE_NAME_PREVIOUS}"
|
|
||||||
+ WriteRegStr HKLM "${_KEY}\1" "issuer" "${CERTIFICATE_ISSUER_PREVIOUS}"
|
|
||||||
+ ClearErrors
|
|
||||||
+!macroend
|
|
||||||
+
|
|
||||||
!macro AddMaintCertKeys
|
|
||||||
Push $R0
|
|
||||||
; Allow main Mozilla cert information for updates
|
|
||||||
; This call will push the needed key on the stack
|
|
||||||
ServicesHelper::PathToUniqueRegistryPath "$INSTDIR"
|
|
||||||
Pop $R0
|
|
||||||
+ Push $R1
|
|
||||||
+ Push $R2
|
|
||||||
+ Push $R3
|
|
||||||
+ ; We always use the 64bit registry for certs.
|
|
||||||
+ ${If} ${RunningX64}
|
|
||||||
+ ${OrIf} ${IsNativeARM64}
|
|
||||||
+ SetRegView 64
|
|
||||||
+ ${EndIf}
|
|
||||||
+
|
|
||||||
${If} $R0 != ""
|
|
||||||
- ; More than one certificate can be specified in a different subfolder
|
|
||||||
- ; for example: $R0\1, but each individual binary can be signed
|
|
||||||
- ; with at most one certificate. A fallback certificate can only be used
|
|
||||||
- ; if the binary is replaced with a different certificate.
|
|
||||||
- ; We always use the 64bit registry for certs.
|
|
||||||
- ${If} ${RunningX64}
|
|
||||||
- ${OrIf} ${IsNativeARM64}
|
|
||||||
- SetRegView 64
|
|
||||||
- ${EndIf}
|
|
||||||
+ !insertmacro AddMaintCertKeyValues "$R0"
|
|
||||||
+ ${Else}
|
|
||||||
+ ; ServicesHelper could not be loaded. This happens when PostUpdate is run
|
|
||||||
+ ; by the updater, which launches it with an environment too minimal for
|
|
||||||
+ ; NSIS to load its plugins, leaving the unique registry path uncomputable.
|
|
||||||
+ ; Fall back to refreshing every key that already records one of our own
|
|
||||||
+ ; certificate names, so that any installation of this application is kept
|
|
||||||
+ ; current rather than only the first one found. Keys belonging to other
|
|
||||||
+ ; applications record a different name and are left alone.
|
|
||||||
+ StrCpy $R1 0
|
|
||||||
+ ${Do}
|
|
||||||
+ EnumRegKey $R2 HKLM "Software\Mozilla\MaintenanceService" $R1
|
|
||||||
+ ${If} $R2 == ""
|
|
||||||
+ ${ExitDo}
|
|
||||||
+ ${EndIf}
|
|
||||||
+ ReadRegStr $R3 HKLM "Software\Mozilla\MaintenanceService\$R2\0" "name"
|
|
||||||
+ ${If} $R3 == "${CERTIFICATE_NAME}"
|
|
||||||
+ ${OrIf} $R3 == "${CERTIFICATE_NAME_PREVIOUS}"
|
|
||||||
+ StrCpy $R0 "Software\Mozilla\MaintenanceService\$R2"
|
|
||||||
+ !insertmacro AddMaintCertKeyValues "$R0"
|
|
||||||
+ ${EndIf}
|
|
||||||
+ IntOp $R1 $R1 + 1
|
|
||||||
+ ${Loop}
|
|
||||||
+ StrCpy $R0 ""
|
|
||||||
+ ${EndIf}
|
|
||||||
|
|
||||||
- ; PrefetchProcessName was originally used to experiment with deleting
|
|
||||||
- ; Windows prefetch as a speed optimization. It is no longer used though.
|
|
||||||
- DeleteRegValue HKLM "$R0" "prefetchProcessName"
|
|
||||||
-
|
|
||||||
- ; Setting the Attempted value will ensure that a new Maintenance Service
|
|
||||||
- ; install will never be attempted again after this from updates. The value
|
|
||||||
- ; is used only to see if updates should attempt new service installs.
|
|
||||||
- WriteRegDWORD HKLM "Software\Mozilla\MaintenanceService" "Attempted" 1
|
|
||||||
-
|
|
||||||
- ; These values associate the allowed certificates for the current
|
|
||||||
- ; installation.
|
|
||||||
- WriteRegStr HKLM "$R0\0" "name" "${CERTIFICATE_NAME}"
|
|
||||||
- WriteRegStr HKLM "$R0\0" "issuer" "${CERTIFICATE_ISSUER}"
|
|
||||||
- ; These values associate the allowed certificates for the previous
|
|
||||||
- ; installation, so that we can update from it cleanly using the
|
|
||||||
- ; old updater.exe (which will still have this signature).
|
|
||||||
- WriteRegStr HKLM "$R0\1" "name" "${CERTIFICATE_NAME_PREVIOUS}"
|
|
||||||
- WriteRegStr HKLM "$R0\1" "issuer" "${CERTIFICATE_ISSUER_PREVIOUS}"
|
|
||||||
- ${If} ${RunningX64}
|
|
||||||
- ${OrIf} ${IsNativeARM64}
|
|
||||||
- SetRegView lastused
|
|
||||||
- ${EndIf}
|
|
||||||
- ClearErrors
|
|
||||||
+ ${If} ${RunningX64}
|
|
||||||
+ ${OrIf} ${IsNativeARM64}
|
|
||||||
+ SetRegView lastused
|
|
||||||
${EndIf}
|
|
||||||
+
|
|
||||||
+ Pop $R3
|
|
||||||
+ Pop $R2
|
|
||||||
+ Pop $R1
|
|
||||||
; Restore the previously used value back
|
|
||||||
Pop $R0
|
|
||||||
!macroend
|
|
||||||
+
|
|
||||||
!define AddMaintCertKeys "!insertmacro AddMaintCertKeys"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
@@ -1,18 +1,9 @@
|
|||||||
diff --git a/browser/installer/windows/nsis/uninstaller.nsi b/browser/installer/windows/nsis/uninstaller.nsi
|
diff --git a/browser/installer/windows/nsis/uninstaller.nsi b/browser/installer/windows/nsis/uninstaller.nsi
|
||||||
old mode 100755
|
old mode 100755
|
||||||
new mode 100644
|
new mode 100644
|
||||||
index becbb0f70c84eb7f2d9bff5a3aedcbb7a78a61cf..a23a8a1b160932368377fc841b501df9355918db
|
index becbb0f70c84eb7f2d9bff5a3aedcbb7a78a61cf..05835d2088ab631316a25a9f0728898bd7998d8d
|
||||||
--- a/browser/installer/windows/nsis/uninstaller.nsi
|
--- a/browser/installer/windows/nsis/uninstaller.nsi
|
||||||
+++ b/browser/installer/windows/nsis/uninstaller.nsi
|
+++ b/browser/installer/windows/nsis/uninstaller.nsi
|
||||||
@@ -150,7 +150,7 @@ OutFile "helper.exe"
|
|
||||||
!endif
|
|
||||||
ShowUnInstDetails nevershow
|
|
||||||
|
|
||||||
-!define URLUninstallSurvey "https://qsurvey.mozilla.com/s3/FF-Desktop-Post-Uninstall?channel=${UpdateChannel}&version=${AppVersion}&osversion="
|
|
||||||
+!define URLUninstallSurvey "https://links.zen-browser.app/uninstall-feedback?osversion="
|
|
||||||
|
|
||||||
; Support for the profile refresh feature
|
|
||||||
!define URLProfileRefreshHelp "https://support.mozilla.org/kb/refresh-firefox-reset-add-ons-and-settings"
|
|
||||||
@@ -516,6 +516,7 @@ Section "Uninstall"
|
@@ -516,6 +516,7 @@ Section "Uninstall"
|
||||||
${un.RegCleanFileHandler} ".svg" "FirefoxHTML-$AppUserModelID"
|
${un.RegCleanFileHandler} ".svg" "FirefoxHTML-$AppUserModelID"
|
||||||
${un.RegCleanFileHandler} ".webp" "FirefoxHTML-$AppUserModelID"
|
${un.RegCleanFileHandler} ".webp" "FirefoxHTML-$AppUserModelID"
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
diff --git a/browser/themes/linux/browser.css b/browser/themes/linux/browser.css
|
diff --git a/browser/themes/linux/browser.css b/browser/themes/linux/browser.css
|
||||||
index f276db1d456703493ee713370691352985021708..619ee6724eec1e6a25adcb257af0d02eb7a29d34 100644
|
index e735ec80b56e1a2da4bc5bec29136ce60353277b..330ea62d220d9acd96a95a605888839388e97452 100644
|
||||||
--- a/browser/themes/linux/browser.css
|
--- a/browser/themes/linux/browser.css
|
||||||
+++ b/browser/themes/linux/browser.css
|
+++ b/browser/themes/linux/browser.css
|
||||||
@@ -14,7 +14,6 @@
|
@@ -14,7 +14,6 @@
|
||||||
@media (-moz-gtk-theme-family) {
|
@media (-moz-gtk-theme-family) {
|
||||||
--tabs-navbar-separator-style: none;
|
--tabs-navbar-separator-style: none;
|
||||||
@media (prefers-color-scheme: light) {
|
@media (prefers-color-scheme: light) and (not -moz-pref("browser.nova.enabled")) {
|
||||||
- --urlbar-box-background-color: #fafafa;
|
- --urlbar-box-background-color: #fafafa;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ html|dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
groupbox button {
|
groupbox button {
|
||||||
border-radius: calc(5px * var(--zen-squircle-value)) !important;
|
border-radius: 5px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
groupbox button,
|
groupbox button,
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
diff --git a/browser/themes/shared/tabbrowser/content-area.css b/browser/themes/shared/tabbrowser/content-area.css
|
diff --git a/browser/themes/shared/tabbrowser/content-area.css b/browser/themes/shared/tabbrowser/content-area.css
|
||||||
index 2374ed38bd9361d6c7e1886117099c6761e403b8..72f1f52a13096f19ca4009037ad0cdc880775ff7 100644
|
index 3acdec2b8e043fe27919cfa54e73f4d3c491bfc8..267a1087134464a8193a824a2d7f8ac15ff8ad60 100644
|
||||||
--- a/browser/themes/shared/tabbrowser/content-area.css
|
--- a/browser/themes/shared/tabbrowser/content-area.css
|
||||||
+++ b/browser/themes/shared/tabbrowser/content-area.css
|
+++ b/browser/themes/shared/tabbrowser/content-area.css
|
||||||
@@ -239,7 +239,6 @@
|
@@ -157,7 +157,6 @@
|
||||||
min-width: 0;
|
min-height: 0;
|
||||||
|
|
||||||
/* We want to be able to show the frame color behind the clipped radiused corner */
|
/* We want to be able to show the frame color behind the clipped radiused corner */
|
||||||
- background: var(--tabpanel-background-color);
|
- background: var(--tabpanel-background-color);
|
||||||
|
|
||||||
display: grid;
|
@media -moz-pref("sidebar.revamp") {
|
||||||
/**
|
outline: 0.01px solid var(--chrome-content-separator-color);
|
||||||
@@ -425,7 +424,6 @@
|
@@ -216,7 +215,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
browser:is([blank], [pendingpaint]) {
|
browser:is([blank], [pendingpaint]) {
|
||||||
@@ -18,7 +18,7 @@ index 2374ed38bd9361d6c7e1886117099c6761e403b8..72f1f52a13096f19ca4009037ad0cdc8
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Exclude browsers with smartwindow-content attribute which inherit
|
/* Exclude browsers with smartwindow-content attribute which inherit
|
||||||
@@ -865,7 +863,7 @@ split-view-footer {
|
@@ -553,7 +551,7 @@ split-view-footer {
|
||||||
|
|
||||||
.dialogStack {
|
.dialogStack {
|
||||||
z-index: var(--browser-stack-z-index-dialog-stack);
|
z-index: var(--browser-stack-z-index-dialog-stack);
|
||||||
@@ -27,12 +27,12 @@ index 2374ed38bd9361d6c7e1886117099c6761e403b8..72f1f52a13096f19ca4009037ad0cdc8
|
|||||||
inset: 0;
|
inset: 0;
|
||||||
/* --browser-with-dialog set on browser[tabDialogShowing], we want to position the overlay
|
/* --browser-with-dialog set on browser[tabDialogShowing], we want to position the overlay
|
||||||
only on the top of the <browser> element so it doesn't overlap the DevTools toolbox */
|
only on the top of the <browser> element so it doesn't overlap the DevTools toolbox */
|
||||||
@@ -1034,7 +1032,7 @@ split-view-footer {
|
@@ -718,7 +716,7 @@ split-view-footer {
|
||||||
|
|
||||||
.dialogOverlay[topmost="true"],
|
.dialogOverlay[topmost="true"],
|
||||||
#window-modal-dialog::backdrop {
|
#window-modal-dialog::backdrop {
|
||||||
- background-color: var(--background-color-overlay);
|
- background-color: var(--background-color-overlay);
|
||||||
+ background-color: light-dark(rgba(255, 255, 255, .3), rgba(0, 0, 0, .3));
|
+ background-color: light-dark(rgba(255, 255, 255, .3), rgba(0, 0, 0, .3));
|
||||||
border-radius: var(--chrome-block-radius);
|
}
|
||||||
|
|
||||||
.browserSidebarContainer.responsive-mode & {
|
.dialogOverlay[hideContent="true"][topmost="true"] {
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
diff --git a/browser/themes/shared/tabbrowser/tabs.css b/browser/themes/shared/tabbrowser/tabs.css
|
diff --git a/browser/themes/shared/tabbrowser/tabs.css b/browser/themes/shared/tabbrowser/tabs.css
|
||||||
index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46b61c0480 100644
|
index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f253804576e 100644
|
||||||
--- a/browser/themes/shared/tabbrowser/tabs.css
|
--- a/browser/themes/shared/tabbrowser/tabs.css
|
||||||
+++ b/browser/themes/shared/tabbrowser/tabs.css
|
+++ b/browser/themes/shared/tabbrowser/tabs.css
|
||||||
@@ -46,7 +46,7 @@
|
@@ -45,7 +45,7 @@
|
||||||
--tab-group-line-thickness: 2px;
|
--tab-group-line-thickness: 2px;
|
||||||
--tab-group-line-toolbar-border-distance: 1px;
|
--tab-group-line-toolbar-border-distance: 1px;
|
||||||
/* Collapsed tabs should be square, so set width to match the min height */
|
/* Collapsed tabs should be square, so set width to match the min height */
|
||||||
- --tab-collapsed-background-width: var(--tab-min-height);
|
- --tab-collapsed-background-width: var(--tab-min-height);
|
||||||
+ --tab-collapsed-background-width: 48px;
|
+ --tab-collapsed-background-width: 48px;
|
||||||
--tab-collapsed-width: calc(var(--tab-collapsed-background-width) + 2 * var(--tab-inner-inline-margin));
|
--tab-collapsed-width: calc(var(--tab-collapsed-background-width) + 2 * var(--tab-inner-inline-margin));
|
||||||
--tab-collapsed-split-pill-offset: 0px;
|
|
||||||
--tab-pinned-min-width-expanded: calc(var(--tab-pinned-expanded-background-width) + 2 * var(--tab-pinned-margin-inline-expanded));
|
--tab-pinned-min-width-expanded: calc(var(--tab-pinned-expanded-background-width) + 2 * var(--tab-pinned-margin-inline-expanded));
|
||||||
@@ -308,7 +308,6 @@ tab-split-view-wrapper[dragtarget] {
|
--tab-note-icon-end-margin: var(--dimension-4);
|
||||||
|
@@ -295,7 +295,6 @@ tab-split-view-wrapper[dragtarget] {
|
||||||
}
|
}
|
||||||
|
|
||||||
:root:not([uidensity="compact"], [sidebar-expand-on-hover]) &[pinned] {
|
:root:not([uidensity="compact"], [sidebar-expand-on-hover]) &[pinned] {
|
||||||
@@ -19,7 +19,7 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
}
|
}
|
||||||
|
|
||||||
&:is([selected], [multiselected]) {
|
&:is([selected], [multiselected]) {
|
||||||
@@ -322,6 +321,7 @@ tab-split-view-wrapper[dragtarget] {
|
@@ -309,6 +308,7 @@ tab-split-view-wrapper[dragtarget] {
|
||||||
border-radius: inherit;
|
border-radius: inherit;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -27,7 +27,7 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@@ -519,10 +519,6 @@ tab-split-view-wrapper[dragtarget] {
|
@@ -506,10 +506,6 @@ tab-split-view-wrapper[dragtarget] {
|
||||||
|
|
||||||
@media -moz-pref("browser.tabs.fadeOutUnloadedTabs") {
|
@media -moz-pref("browser.tabs.fadeOutUnloadedTabs") {
|
||||||
&[pending] {
|
&[pending] {
|
||||||
@@ -38,7 +38,7 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
/* Fade the favicon out */
|
/* Fade the favicon out */
|
||||||
transition-property: filter, opacity;
|
transition-property: filter, opacity;
|
||||||
@@ -538,10 +534,6 @@ tab-split-view-wrapper[dragtarget] {
|
@@ -525,10 +521,6 @@ tab-split-view-wrapper[dragtarget] {
|
||||||
|
|
||||||
@media -moz-pref("browser.tabs.fadeOutExplicitlyUnloadedTabs") {
|
@media -moz-pref("browser.tabs.fadeOutExplicitlyUnloadedTabs") {
|
||||||
&[pending][discarded] {
|
&[pending][discarded] {
|
||||||
@@ -49,7 +49,7 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
/* Fade the favicon out */
|
/* Fade the favicon out */
|
||||||
transition-property: filter, opacity;
|
transition-property: filter, opacity;
|
||||||
@@ -615,7 +607,7 @@ tab-split-view-wrapper[dragtarget] {
|
@@ -602,7 +594,7 @@ tab-split-view-wrapper[dragtarget] {
|
||||||
}
|
}
|
||||||
|
|
||||||
#tabbrowser-tabs[orient="vertical"] & {
|
#tabbrowser-tabs[orient="vertical"] & {
|
||||||
@@ -58,7 +58,7 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
}
|
}
|
||||||
|
|
||||||
&[crashed] {
|
&[crashed] {
|
||||||
@@ -623,7 +615,7 @@ tab-split-view-wrapper[dragtarget] {
|
@@ -610,7 +602,7 @@ tab-split-view-wrapper[dragtarget] {
|
||||||
}
|
}
|
||||||
|
|
||||||
#tabbrowser-tabs[orient="vertical"]:not([expanded]) &:not([crashed]),
|
#tabbrowser-tabs[orient="vertical"]:not([expanded]) &:not([crashed]),
|
||||||
@@ -67,7 +67,7 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
&[soundplaying] {
|
&[soundplaying] {
|
||||||
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-playing-small.svg");
|
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-playing-small.svg");
|
||||||
}
|
}
|
||||||
@@ -677,7 +669,7 @@ tab-split-view-wrapper[dragtarget] {
|
@@ -664,7 +656,7 @@ tab-split-view-wrapper[dragtarget] {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
&[crashed] {
|
&[crashed] {
|
||||||
display: revert;
|
display: revert;
|
||||||
}
|
}
|
||||||
@@ -837,7 +829,7 @@ tab-split-view-wrapper[dragtarget] {
|
@@ -824,7 +816,7 @@ tab-split-view-wrapper[dragtarget] {
|
||||||
has not been added to root. There are certain scenarios when that attribute is temporarily
|
has not been added to root. There are certain scenarios when that attribute is temporarily
|
||||||
removed from root such as when toggling the sidebar to expand with the toolbar button. */
|
removed from root such as when toggling the sidebar to expand with the toolbar button. */
|
||||||
#tabbrowser-tabs[orient="horizontal"] &:not([pinned]):not([crashed]),
|
#tabbrowser-tabs[orient="horizontal"] &:not([pinned]):not([crashed]),
|
||||||
@@ -85,7 +85,7 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
&:is([soundplaying], [muted], [activemedia-blocked]) {
|
&:is([soundplaying], [muted], [activemedia-blocked]) {
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
@@ -1151,7 +1143,6 @@ tab-split-view-wrapper[dragtarget] {
|
@@ -1044,7 +1036,6 @@ tab-split-view-wrapper[dragtarget] {
|
||||||
.tabbrowser-tab:is([image], [pinned]) > .tab-stack > .tab-content[attention]:not([selected]),
|
.tabbrowser-tab:is([image], [pinned]) > .tab-stack > .tab-content[attention]:not([selected]),
|
||||||
.tabbrowser-tab > .tab-stack > .tab-content[pinned][titlechanged]:not([selected]),
|
.tabbrowser-tab > .tab-stack > .tab-content[pinned][titlechanged]:not([selected]),
|
||||||
#tabbrowser-tabs[orient="vertical"] .tabbrowser-tab > .tab-stack > .tab-content[titlechanged]:not([selected]) {
|
#tabbrowser-tabs[orient="vertical"] .tabbrowser-tab > .tab-stack > .tab-content[titlechanged]:not([selected]) {
|
||||||
@@ -93,7 +93,7 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
background-position: center bottom 6.5px;
|
background-position: center bottom 6.5px;
|
||||||
background-size: 4px 4px;
|
background-size: 4px 4px;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
@@ -1904,7 +1895,7 @@ tab-group {
|
@@ -1797,7 +1788,7 @@ tab-group {
|
||||||
}
|
}
|
||||||
|
|
||||||
#tabbrowser-tabs[orient="vertical"][expanded] {
|
#tabbrowser-tabs[orient="vertical"][expanded] {
|
||||||
@@ -102,7 +102,7 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
&[movingtab][movingtab-addToGroup]:not([movingtab-group], [movingtab-ungroup]) .tabbrowser-tab:is(:active, [multiselected]) {
|
&[movingtab][movingtab-addToGroup]:not([movingtab-group], [movingtab-ungroup]) .tabbrowser-tab:is(:active, [multiselected]) {
|
||||||
margin-inline-start: var(--space-medium);
|
margin-inline-start: var(--space-medium);
|
||||||
}
|
}
|
||||||
@@ -2504,7 +2495,7 @@ tab-group {
|
@@ -2351,7 +2342,7 @@ tab-group {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,8 +111,8 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
#vertical-tabs-newtab-button {
|
#vertical-tabs-newtab-button {
|
||||||
appearance: none;
|
appearance: none;
|
||||||
min-height: var(--tab-min-height);
|
min-height: var(--tab-min-height);
|
||||||
@@ -2524,7 +2515,7 @@ tab-group {
|
@@ -2362,7 +2353,7 @@ tab-group {
|
||||||
}
|
margin-inline: var(--tab-inner-inline-margin);
|
||||||
|
|
||||||
#tabbrowser-tabs[orient="vertical"]:not([expanded]) & > .toolbarbutton-text {
|
#tabbrowser-tabs[orient="vertical"]:not([expanded]) & > .toolbarbutton-text {
|
||||||
- display: none;
|
- display: none;
|
||||||
@@ -120,7 +120,7 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
@@ -2548,7 +2539,7 @@ tab-group {
|
@@ -2386,7 +2377,7 @@ tab-group {
|
||||||
* flex container. #tabs-newtab-button is a child of the arrowscrollbox where
|
* flex container. #tabs-newtab-button is a child of the arrowscrollbox where
|
||||||
* we don't want a gap (between tabs), so we have to add some margin.
|
* we don't want a gap (between tabs), so we have to add some margin.
|
||||||
*/
|
*/
|
||||||
@@ -129,7 +129,7 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
margin-block: var(--tab-margin-block);
|
margin-block: var(--tab-margin-block);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2740,7 +2731,6 @@ tab-group {
|
@@ -2576,7 +2567,6 @@ tab-group {
|
||||||
|
|
||||||
&:not([expanded]) {
|
&:not([expanded]) {
|
||||||
.tabbrowser-tab[pinned] {
|
.tabbrowser-tab[pinned] {
|
||||||
@@ -137,7 +137,7 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
}
|
}
|
||||||
|
|
||||||
.tab-background {
|
.tab-background {
|
||||||
@@ -2779,8 +2769,8 @@ tab-group {
|
@@ -2615,8 +2605,8 @@ tab-group {
|
||||||
display: block;
|
display: block;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
inset: auto;
|
inset: auto;
|
||||||
@@ -148,7 +148,7 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
|
|
||||||
&:-moz-window-inactive {
|
&:-moz-window-inactive {
|
||||||
background-image:
|
background-image:
|
||||||
@@ -2878,9 +2868,6 @@ tab-group {
|
@@ -2714,9 +2704,6 @@ tab-group {
|
||||||
~ #tabbrowser-tabs[orient="horizontal"]::before {
|
~ #tabbrowser-tabs[orient="horizontal"]::before {
|
||||||
display: flex;
|
display: flex;
|
||||||
content: "";
|
content: "";
|
||||||
@@ -158,7 +158,7 @@ index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2913,7 +2900,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
|
@@ -2749,7 +2736,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
|
||||||
list-style-image: url(chrome://global/skin/icons/plus.svg);
|
list-style-image: url(chrome://global/skin/icons/plus.svg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
diff --git a/browser/themes/shared/urlbar-searchbar.css b/browser/themes/shared/urlbar-searchbar.css
|
diff --git a/browser/themes/shared/urlbar-searchbar.css b/browser/themes/shared/urlbar-searchbar.css
|
||||||
index 149f123e26cd79e89432dfeb504ca7218ee04810..7e0e6d981d6c2aa53bc2a76d82d2078419659065 100644
|
index 22d624d718a289dd7b84ffc2f04dd35893dfbe95..4f57f7853f3043e3ad01d893aa928b9d2e6f3c16 100644
|
||||||
--- a/browser/themes/shared/urlbar-searchbar.css
|
--- a/browser/themes/shared/urlbar-searchbar.css
|
||||||
+++ b/browser/themes/shared/urlbar-searchbar.css
|
+++ b/browser/themes/shared/urlbar-searchbar.css
|
||||||
@@ -19,8 +19,8 @@
|
@@ -19,8 +19,8 @@
|
||||||
|
|
||||||
@media not -moz-pref("browser.nova.enabled") {
|
@media not -moz-pref("browser.nova.enabled") {
|
||||||
--urlbar-basic-component-size: calc(var(--urlbar-height) - 2 * (var(--urlbar-input-container-border-width) + var(--urlbar-input-container-padding)));
|
--urlbar-basic-component-size: calc(var(--urlbar-min-height) - 2 * (var(--urlbar-input-container-border-width) + var(--urlbar-input-container-padding)));
|
||||||
- --urlbar-icon-padding: calc((var(--urlbar-height) - 2px /* border */ - 2px /* padding */ - 16px /* icon */) / 2);
|
- --urlbar-icon-padding: calc((var(--urlbar-min-height) - 2px /* border */ - 2px /* padding */ - 16px /* icon */) / 2);
|
||||||
- --urlbar-input-container-padding: round(up, 1px, env(hairline));
|
- --urlbar-input-container-padding: round(up, 1px, env(hairline));
|
||||||
+ --urlbar-icon-padding: calc((var(--urlbar-height) - 2px /* border */ - 14px /* icon */) / 2);
|
+ --urlbar-icon-padding: calc((var(--urlbar-min-height) - 2px /* border */ - 14px /* icon */) / 2);
|
||||||
+ --urlbar-input-container-padding: 2px;
|
+ --urlbar-input-container-padding: 2px;
|
||||||
}
|
}
|
||||||
@media (max-width: 770px) {
|
@media (max-width: 770px) {
|
||||||
--urlbar-container-min-width: 240px;
|
--urlbar-container-min-width: 240px;
|
||||||
@@ -127,7 +127,7 @@ toolbar[inactive="true"] .urlbar,
|
@@ -126,7 +126,7 @@ toolbar[inactive="true"] .urlbar,
|
||||||
.urlbar:not([usertyping]) > .urlbar-input-container > .urlbar-go-button,
|
.urlbar:not([usertyping]) > .urlbar-input-container > .urlbar-go-button,
|
||||||
.urlbar:not(#searchbar-new, [focused]) > .urlbar-input-container > .urlbar-go-button,
|
.urlbar:not(#searchbar-new, [focused]) > .urlbar-input-container > .urlbar-go-button,
|
||||||
#urlbar-revert-button-container {
|
#urlbar-revert-button-container {
|
||||||
@@ -22,7 +22,7 @@ index 149f123e26cd79e89432dfeb504ca7218ee04810..7e0e6d981d6c2aa53bc2a76d82d20784
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Document Picture-in-Picture API window */
|
/* Document Picture-in-Picture API window */
|
||||||
@@ -405,6 +405,10 @@ toolbar[inactive="true"] .urlbar,
|
@@ -403,6 +403,10 @@ toolbar[inactive="true"] .urlbar,
|
||||||
.urlbar:not([focused])[textoverflow="left"][domaindir="rtl"] > .urlbar-input-container > .urlbar-input-box > & {
|
.urlbar:not([focused])[textoverflow="left"][domaindir="rtl"] > .urlbar-input-container > .urlbar-input-box > & {
|
||||||
mask-image: linear-gradient(to right, transparent var(--urlbar-scheme-size), black calc(var(--urlbar-scheme-size) + 3ch));
|
mask-image: linear-gradient(to right, transparent var(--urlbar-scheme-size), black calc(var(--urlbar-scheme-size) + 3ch));
|
||||||
}
|
}
|
||||||
@@ -33,18 +33,16 @@ index 149f123e26cd79e89432dfeb504ca7218ee04810..7e0e6d981d6c2aa53bc2a76d82d20784
|
|||||||
}
|
}
|
||||||
|
|
||||||
#urlbar-scheme {
|
#urlbar-scheme {
|
||||||
@@ -476,10 +480,15 @@ toolbar[inactive="true"] .urlbar,
|
@@ -492,10 +496,14 @@ toolbar[inactive="true"] .urlbar,
|
||||||
}
|
|
||||||
|
|
||||||
.urlbar[breakout][breakout-extend] {
|
.urlbar[breakout][breakout-extend] {
|
||||||
- margin-left: calc(-1 * var(--urlbar-margin-inline));
|
height: auto;
|
||||||
+ align-items: center;
|
+ align-items: center;
|
||||||
|
+ :root:not([zen-single-toolbar='true']) & {
|
||||||
|
margin-left: calc(-1 * var(--urlbar-margin-inline));
|
||||||
|
+ }
|
||||||
width: calc(var(--urlbar-width) + 2 * var(--urlbar-margin-inline));
|
width: calc(var(--urlbar-width) + 2 * var(--urlbar-margin-inline));
|
||||||
|
|
||||||
+ :root:not([zen-single-toolbar="true"]) & {
|
|
||||||
+ margin-left: calc(-1 * var(--urlbar-margin-inline));
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
> .urlbar-input-container {
|
> .urlbar-input-container {
|
||||||
+ align-items: center;
|
+ align-items: center;
|
||||||
height: var(--urlbar-container-height);
|
height: var(--urlbar-container-height);
|
||||||
|
|||||||
@@ -0,0 +1,69 @@
|
|||||||
|
#filter dumbComments emptyLines substitution
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
<svg class="zen-library-icon" width="18" height="18" viewBox="4 4 18 18" fill="context-fill" fill-opacity="context-fill-opacity" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<style>
|
||||||
|
@property --zen-triangle-anim { syntax: '<number>'; initial-value: 0; inherits: false; }
|
||||||
|
@property --zen-circle-anim { syntax: '<number>'; initial-value: 0; inherits: false; }
|
||||||
|
@keyframes StarForward {
|
||||||
|
0% { transform: rotate(0deg); }
|
||||||
|
100% { transform: rotate(120deg); }
|
||||||
|
}
|
||||||
|
@keyframes TriangleForward {
|
||||||
|
0% { --zen-triangle-anim: 0; }
|
||||||
|
100% { --zen-triangle-anim: 1; }
|
||||||
|
}
|
||||||
|
@keyframes CircleForward {
|
||||||
|
0% { --zen-circle-anim: 0; }
|
||||||
|
100% { --zen-circle-anim: 1; }
|
||||||
|
}
|
||||||
|
@keyframes GlowForward {
|
||||||
|
0% { opacity: 0; }
|
||||||
|
100% { opacity: 0.4; }
|
||||||
|
}
|
||||||
|
@keyframes GlowElementsForward {
|
||||||
|
0% { opacity: 0; }
|
||||||
|
100% { opacity: 0.5; }
|
||||||
|
}
|
||||||
|
.zen-library-star { transform-origin: 10px 10.2px; animation: StarForward 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; }
|
||||||
|
.zen-library-triangle-group { transform-origin: 17px 9.2px; animation: TriangleForward 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; transform: translate(calc(var(--zen-triangle-anim) * 2px), 0px) rotate(calc(var(--zen-triangle-anim) * 365deg)) scale(max(1 - var(--zen-triangle-anim) / 0.65, (var(--zen-triangle-anim) - 0.65) / 0.35)); }
|
||||||
|
.zen-library-circle { transform-origin: 0px 0px; animation: CircleForward 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; transform: translate(calc(var(--zen-circle-anim) * 1px), calc(var(--zen-circle-anim) * -1.5px)) scale(max(0, max((var(--zen-circle-anim) - 0.75) / 0.25, min(1, 1 - (var(--zen-circle-anim) - 0.3) / 0.35)))); }
|
||||||
|
.zen-library-glow { filter: blur(2px); animation: GlowForward 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; }
|
||||||
|
.zen-library-glow-element { filter: blur(2px); animation: GlowElementsForward 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; }
|
||||||
|
.zen-library-glow-bg, .zen-library-glow-element { fill: transparent !important; stroke: none !important; }
|
||||||
|
.zen-library-glow-rays { stroke: transparent !important; fill: none !important; }
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
.zen-library-glow-bg, .zen-library-glow-element { fill: white !important; }
|
||||||
|
.zen-library-glow-rays { stroke: white !important; }
|
||||||
|
.zen-library-star:not(.zen-library-glow-element), .zen-library-circle:not(.zen-library-glow-element), .zen-library-triangle:not(.zen-library-glow-element) { fill: white !important; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<defs>
|
||||||
|
<mask id="zen-library-box-mask">
|
||||||
|
<rect x="-10" y="-10" width="40" height="40" fill="white"/>
|
||||||
|
<rect x="-10" y="11.635" width="40" height="40" fill="black"/>
|
||||||
|
</mask>
|
||||||
|
</defs>
|
||||||
|
<g fill-rule="evenodd">
|
||||||
|
<g mask="url(#zen-library-box-mask)">
|
||||||
|
<path class="zen-library-star zen-library-glow-element" d="M 7.773 11.635 C 8.136 11.863 8.24 12.075 8.218 12.294 L 8.036 14.082 C 7.984 14.598 8.584 14.917 8.982 14.585 L 10.362 13.432 C 10.53 13.291 10.764 13.258 10.966 13.347 L 12.61 14.072 C 13.085 14.281 13.574 13.808 13.38 13.327 L 12.701 11.635 C 12.632 11.437 12.675 11.216 12.816 11.058 L 14.014 9.718 C 14.36 9.331 14.061 8.72 13.544 8.756 L 11.75 8.877 C 11.531 8.892 11.322 8.781 11.211 8.591 L 10.307 7.038 C 10.046 6.59 9.373 6.685 9.247 7.188 L 8.808 8.931 C 8.754 9.144 8.585 9.309 8.37 9.355 L 6.613 9.735 C 6.106 9.845 5.988 10.514 6.427 10.79 L 7.773 11.635 Z"/>
|
||||||
|
<path class="zen-library-star" d="M 7.773 11.635 C 8.136 11.863 8.24 12.075 8.218 12.294 L 8.036 14.082 C 7.984 14.598 8.584 14.917 8.982 14.585 L 10.362 13.432 C 10.53 13.291 10.764 13.258 10.966 13.347 L 12.61 14.072 C 13.085 14.281 13.574 13.808 13.38 13.327 L 12.701 11.635 C 12.632 11.437 12.675 11.216 12.816 11.058 L 14.014 9.718 C 14.36 9.331 14.061 8.72 13.544 8.756 L 11.75 8.877 C 11.531 8.892 11.322 8.781 11.211 8.591 L 10.307 7.038 C 10.046 6.59 9.373 6.685 9.247 7.188 L 8.808 8.931 C 8.754 9.144 8.585 9.309 8.37 9.355 L 6.613 9.735 C 6.106 9.845 5.988 10.514 6.427 10.79 L 7.773 11.635 Z"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(14, 7.3)">
|
||||||
|
<circle class="zen-library-circle zen-library-glow-element" cx="0" cy="0" r="1.4"/>
|
||||||
|
<circle class="zen-library-circle" cx="0" cy="0" r="1"/>
|
||||||
|
</g>
|
||||||
|
<g class="zen-library-triangle-group">
|
||||||
|
<g transform="translate(17, 9.2)">
|
||||||
|
<path class="zen-library-triangle zen-library-glow-element" d="M -1.1 1.8 C -1.4 2.0, -1.7 1.8, -1.7 1.5 L -1.7 -1.5 C -1.7 -1.8, -1.4 -2.0, -1.1 -1.8 L 1.4 -0.4 C 1.7 -0.2, 1.7 0.2, 1.4 0.4 Z"/>
|
||||||
|
<path class="zen-library-triangle" d="M -1.1 1.8 C -1.4 2.0, -1.7 1.8, -1.7 1.5 L -1.7 -1.5 C -1.7 -1.8, -1.4 -2.0, -1.1 -1.8 L 1.4 -0.4 C 1.7 -0.2, 1.7 0.2, 1.4 0.4 Z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g class="zen-library-glow">
|
||||||
|
<path class="zen-library-glow-bg" d="M 6.6 6.6 L 8.04 12.7 L 17.96 12.7 L 19.4 6.6 Z"/>
|
||||||
|
<path class="zen-library-glow-rays" d="M 6.1 6.6 L 8.04 12.7 L 17.96 12.7 L 19.9 6.6"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-library-box" d="M 7.218 13.287 C 7.218 12.831 7.588 12.461 8.044 12.461 H 17.957 C 18.414 12.461 18.783 12.831 18.783 13.287 V 17.418 C 18.783 19.243 17.304 20.722 15.479 20.722 H 10.523 C 8.698 20.722 7.218 19.243 7.218 17.418 V 13.287 Z M 10.609 14.526 C 10.609 14.07 10.979 13.7 11.435 13.7 H 14.739 C 15.196 13.7 15.565 14.07 15.565 14.526 C 15.565 14.982 15.196 15.352 14.739 15.352 H 11.435 C 10.979 15.352 10.609 14.982 10.609 14.526 Z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
#filter dumbComments emptyLines substitution
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
<svg class="zen-boosts-icon" width="28" height="28" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<style>
|
||||||
|
@keyframes zenBoostsCardTilt {
|
||||||
|
0%, 13.33% { transform: translate(61.889px, 63.143px) scale(1.1) rotate(-15deg); animation-timing-function: cubic-bezier(0.35, 0, 0.685, 1); }
|
||||||
|
37.77% { transform: translate(61.889px, 68.143px) scale(1.1) rotate(-23deg); animation-timing-function: cubic-bezier(0.25, 0, 0.7, 1); }
|
||||||
|
64.8% { transform: translate(61.889px, 55.143px) scale(1.1) rotate(-5.4deg); animation-timing-function: cubic-bezier(0.28, 0, 0.68, 1); }
|
||||||
|
87%, 100% { transform: translate(61.889px, 63.143px) scale(1.1) rotate(-15deg); }
|
||||||
|
}
|
||||||
|
@keyframes zenBoostsBrushRotate {
|
||||||
|
0%, 2.22% { transform: translate(18.247px, 109.504px) scale(1.1) rotate(0deg); animation-timing-function: cubic-bezier(0.6, 0, 0.7, 1); }
|
||||||
|
32% { transform: translate(18.247px, 112px) scale(1.1) rotate(12deg); animation-timing-function: cubic-bezier(0.3, 0, 0.6, 1); }
|
||||||
|
52% { transform: translate(18.247px, 97.957px) scale(1.1) rotate(-16.5deg); animation-timing-function: cubic-bezier(0.4, 0, 0.5, 1); }
|
||||||
|
80%, 100% { transform: translate(18.247px, 109.504px) scale(1.1) rotate(0deg); }
|
||||||
|
}
|
||||||
|
@keyframes zenBoostsStarLargeBounce {
|
||||||
|
0%, 20% { transform: translate(85.002px, 50.174px) rotate(2.014deg) scale(1); animation-timing-function: cubic-bezier(0.29, 0, 0.83, 1); }
|
||||||
|
33.3% { transform: translate(85.002px, 59px) rotate(2.014deg) scale(1); animation-timing-function: linear; }
|
||||||
|
42.2% { transform: translate(85.002px, 60.5px) rotate(2.014deg) scale(0); animation-timing-function: linear; }
|
||||||
|
53.3% { transform: translate(85.002px, 45px) rotate(2.014deg) scale(0); animation-timing-function: cubic-bezier(0.45, 0, 0.63, 1); }
|
||||||
|
62.2% { transform: translate(85.002px, 33.344px) rotate(2.014deg) scale(1); animation-timing-function: cubic-bezier(0.45, 0, 0.63, 1); }
|
||||||
|
88.8%, 100% { transform: translate(85.002px, 50.174px) rotate(2.014deg) scale(1); }
|
||||||
|
}
|
||||||
|
@keyframes zenBoostsStarSmallBounce {
|
||||||
|
0%, 26.6% { transform: translate(68.002px, 37.075px) rotate(2.014deg) scale(1); animation-timing-function: cubic-bezier(0.29, 0, 0.83, 1); }
|
||||||
|
44.8% { transform: translate(68.002px, 44.632px) rotate(2.014deg) scale(1); animation-timing-function: linear; }
|
||||||
|
55.5% { transform: translate(68.002px, 34px) rotate(2.014deg) scale(1); animation-timing-function: linear; }
|
||||||
|
64.4% { transform: translate(68.002px, 25px) rotate(2.014deg) scale(0); animation-timing-function: linear; }
|
||||||
|
75.5% { transform: translate(68.002px, 15px) rotate(2.014deg) scale(0); animation-timing-function: cubic-bezier(0.45, 0, 0.63, 1); }
|
||||||
|
84.4% { transform: translate(68.002px, 28px) rotate(2.014deg) scale(1); animation-timing-function: cubic-bezier(0.45, 0, 0.63, 1); }
|
||||||
|
93.3%, 100% { transform: translate(68.002px, 37.075px) rotate(2.014deg) scale(1); }
|
||||||
|
}
|
||||||
|
.zen-boosts-card { animation: zenBoostsCardTilt 0.583s forwards; }
|
||||||
|
.zen-boosts-brush { animation: zenBoostsBrushRotate 0.583s forwards; }
|
||||||
|
.zen-boosts-star-large { animation: zenBoostsStarLargeBounce 0.583s forwards; }
|
||||||
|
.zen-boosts-star-small { animation: zenBoostsStarSmallBounce 0.583s forwards; }
|
||||||
|
</style>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="zen-boosts-grad" gradientUnits="userSpaceOnUse" x1="64" y1="16" x2="64" y2="144">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
<mask id="zen-boosts-mask" maskContentUnits="userSpaceOnUse">
|
||||||
|
<rect x="-100" y="-100" width="300" height="300" fill="#fff"/>
|
||||||
|
<path fill="#000" stroke="#000" stroke-width="8" stroke-linejoin="round" d="M-3.79 54.121C-5.31 51.635-6.984 48.884-7.082 42.132L-7.073 42.091-7.063 42.051C-6.2 38.573-3.904 36.054-1.1 34.382L4.474 31.059C6.968 29.572 9.896 28.739 13.003 29.233 13.558 28.514 14.137 27.648 14.736 26.617L14.752 26.589 14.769 26.561C15.438 25.438 16.22 24.032 17.105 22.317 18.032 20.521 19.176 18.3 20.531 15.65 21.63 13.5 23.221 11.59 25.405 10.221 27.368 8.99 29.589 8.271 31.984 8.218L32.013 8.218C34.325 8.178 36.528 8.749 38.557 9.821 40.713 10.96 42.401 12.627 43.642 14.615L43.662 14.646 63.922 47.997C66.006 51.466 67.049 55.422 66.104 59.547 65.148 63.723 62.394 66.785 58.898 68.869L44.274 77.586C44.222 77.953 44.148 78.323 44.06 78.696 43.24 82.158 40.963 84.66 38.246 86.34L38.205 86.365 32.548 89.738C29.738 91.413 26.42 92.18 22.922 91.299 18.565 90.201 14.485 87.919 10.34 86.196 10.34 86.196 8.779 87.737 7.305 89.123 5.699 90.632 4.021 91.927 2.291 92.956-2.345 95.712-7.442 96.912-12.65 95.581-17.868 94.248-21.776 90.71-24.597 86.068-27.411 81.439-28.702 76.368-27.456 71.195-26.206 66.005-22.739 62.101-18.096 59.333-16.417 58.332-14.507 57.488-12.438 56.763L-12.4 56.75C-10.473 56.089-8.488 55.472-6.445 54.899-5.537 54.635-4.652 54.375-3.79 54.121Z"/>
|
||||||
|
</mask>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-boosts-card" style="transform-origin: 0 0;" transform="translate(61.889 63.143) scale(1.1) rotate(-15)">
|
||||||
|
<g class="zen-boosts-card-anchor" transform="translate(-44 -44)">
|
||||||
|
<rect class="zen-boosts-bg" x="3.55" y="3.55" width="80.9" height="80.9" rx="12.45" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<rect class="zen-boosts-gradient" x="3.55" y="3.55" width="80.9" height="80.9" rx="12.45" fill="url(#zen-boosts-grad)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<rect class="zen-boosts-border" width="88" height="88" rx="16" mask="url(#zen-boosts-mask)" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g class="zen-boosts-brush" style="transform-origin: 0 0;" transform="translate(18.247 109.504) scale(1.1)">
|
||||||
|
<g class="zen-boosts-brush-anchor" transform="translate(-15 -70)">
|
||||||
|
<g class="zen-boosts-brush-tip-translate" transform="translate(27.307 3.73)">
|
||||||
|
<path class="zen-boosts-bg" d="M0 28 6 14 12 0 44 34 26 54Z" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<path class="zen-boosts-gradient" d="M0 28 6 14 12 0 44 34 26 54Z" fill="url(#zen-boosts-grad)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
</g>
|
||||||
|
<g class="zen-boosts-brush-silhouette-fills">
|
||||||
|
<path class="zen-boosts-bg" fill="context-fill" fill-opacity="1" d="M0 69.826C-0.023 66.459 1.467 63.29 4.469 60.318 5.501 59.296 6.814 58.264 8.409 57.219 10.027 56.174 11.717 55.176 13.476 54.154 15.235 53.132 16.877 52.158 18.472 51.229L22.377 48.617 15.024 41.373C13.546 39.91 12.795 38.354 12.772 36.706 12.772 35.034 13.5 33.479 14.954 32.04L19.563 27.478C21.017 26.039 22.577 25.33 24.242 25.353 26.219 25.381 26.531 25.828 28.992 27.547L56.964 55.303C58.465 56.766 59.215 58.322 59.215 59.97 59.238 61.595 58.535 63.139 57.104 64.602L52.46 69.199C51.029 70.615 49.47 71.311 47.781 71.288 46.092 71.288 44.52 70.557 43.066 69.094L35.748 61.816C34.904 62.814 34.012 64.091 33.074 65.647 32.136 67.203 31.15 68.862 30.118 70.627 29.109 72.392 28.078 74.063 27.022 75.642 25.99 77.244 24.946 78.555 23.89 79.577 20.888 82.549 17.686 84.023 14.285 84 10.884 83.977 7.658 82.444 4.609 79.403 1.56 76.385 0.023 73.193 0 69.826ZM56.257 54.603L54.309 52.669 68.012 38.552C68.669 37.902 68.997 37.182 68.997 36.393 68.997 35.604 68.633 34.849 67.906 34.129L41.764 8.289C41.412 7.941 41.048 7.754 40.673 7.731 40.321 7.708 39.993 7.825 39.688 8.08 39.407 8.312 39.196 8.695 39.055 9.229 38.211 12.294 37.495 14.917 36.909 17.099 36.323 19.281 35.712 21.244 35.079 22.985 34.446 24.726 33.636 26.444 32.651 28.139 31.689 29.811 31.369 29.906 31.369 29.906L28.992 27.547 26.531 25.828C27.258 24.69 28.147 22.962 28.64 21.871 29.133 20.757 29.578 19.514 29.977 18.144 30.399 16.751 30.845 15.079 31.314 13.129 31.783 11.156 32.358 8.718 33.038 5.816 33.39 4.307 34.023 3.088 34.938 2.159 35.853 1.207 36.909 0.569 38.105 0.244 39.325-0.081 40.556-0.081 41.799 0.244 43.042 0.546 44.168 1.184 45.177 2.159L72.832 29.567C74.92 31.657 75.975 33.85 75.998 36.149 76.045 38.447 75.049 40.607 73.008 42.627L58.083 56.603 56.257 54.603Z"/>
|
||||||
|
<path class="zen-boosts-gradient" fill="url(#zen-boosts-grad)" style="mix-blend-mode: overlay; opacity: 0.1;" d="M0 69.826C-0.023 66.459 1.467 63.29 4.469 60.318 5.501 59.296 6.814 58.264 8.409 57.219 10.027 56.174 11.717 55.176 13.476 54.154 15.235 53.132 16.877 52.158 18.472 51.229L22.377 48.617 15.024 41.373C13.546 39.91 12.795 38.354 12.772 36.706 12.772 35.034 13.5 33.479 14.954 32.04L19.563 27.478C21.017 26.039 22.577 25.33 24.242 25.353 26.219 25.381 26.531 25.828 28.992 27.547L56.964 55.303C58.465 56.766 59.215 58.322 59.215 59.97 59.238 61.595 58.535 63.139 57.104 64.602L52.46 69.199C51.029 70.615 49.47 71.311 47.781 71.288 46.092 71.288 44.52 70.557 43.066 69.094L35.748 61.816C34.904 62.814 34.012 64.091 33.074 65.647 32.136 67.203 31.15 68.862 30.118 70.627 29.109 72.392 28.078 74.063 27.022 75.642 25.99 77.244 24.946 78.555 23.89 79.577 20.888 82.549 17.686 84.023 14.285 84 10.884 83.977 7.658 82.444 4.609 79.403 1.56 76.385 0.023 73.193 0 69.826ZM56.257 54.603L54.309 52.669 68.012 38.552C68.669 37.902 68.997 37.182 68.997 36.393 68.997 35.604 68.633 34.849 67.906 34.129L41.764 8.289C41.412 7.941 41.048 7.754 40.673 7.731 40.321 7.708 39.993 7.825 39.688 8.08 39.407 8.312 39.196 8.695 39.055 9.229 38.211 12.294 37.495 14.917 36.909 17.099 36.323 19.281 35.712 21.244 35.079 22.985 34.446 24.726 33.636 26.444 32.651 28.139 31.689 29.811 31.369 29.906 31.369 29.906L28.992 27.547 26.531 25.828C27.258 24.69 28.147 22.962 28.64 21.871 29.133 20.757 29.578 19.514 29.977 18.144 30.399 16.751 30.845 15.079 31.314 13.129 31.783 11.156 32.358 8.718 33.038 5.816 33.39 4.307 34.023 3.088 34.938 2.159 35.853 1.207 36.909 0.569 38.105 0.244 39.325-0.081 40.556-0.081 41.799 0.244 43.042 0.546 44.168 1.184 45.177 2.159L72.832 29.567C74.92 31.657 75.975 33.85 75.998 36.149 76.045 38.447 75.049 40.607 73.008 42.627L58.083 56.603 56.257 54.603Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-boosts-border" fill-rule="evenodd" fill="context-stroke" d="M0 69.826C-0.023 66.459 1.467 63.29 4.469 60.318 5.501 59.296 6.814 58.264 8.409 57.219 10.027 56.174 11.717 55.176 13.476 54.154 15.235 53.132 16.877 52.158 18.472 51.229L22.377 48.617 15.024 41.373C13.546 39.91 12.795 38.354 12.772 36.706 12.772 35.034 13.5 33.479 14.954 32.04L19.563 27.478C21.017 26.039 22.577 25.33 24.242 25.353 26.219 25.381 26.531 25.828 28.992 27.547L56.964 55.303C58.465 56.766 59.215 58.322 59.215 59.97 59.238 61.595 58.535 63.139 57.104 64.602L52.46 69.199C51.029 70.615 49.47 71.311 47.781 71.288 46.092 71.288 44.52 70.557 43.066 69.094L35.748 61.816C34.904 62.814 34.012 64.091 33.074 65.647 32.136 67.203 31.15 68.862 30.118 70.627 29.109 72.392 28.078 74.063 27.022 75.642 25.99 77.244 24.946 78.555 23.89 79.577 20.888 82.549 17.686 84.023 14.285 84 10.884 83.977 7.658 82.444 4.609 79.403 1.56 76.385 0.023 73.193 0 69.826ZM20.618 38.308L29.133 46.701C29.86 47.398 30.188 48.187 30.118 49.069 30.048 49.951 29.625 50.799 28.851 51.612 28.171 52.309 27.034 53.11 25.439 54.015 23.844 54.92 22.037 55.931 20.02 57.045 18.026 58.159 16.044 59.355 14.074 60.632 12.104 61.909 10.427 63.232 9.043 64.602 7.425 66.181 6.615 67.887 6.615 69.721 6.638 71.555 7.471 73.297 9.113 74.945 10.778 76.57 12.525 77.383 14.355 77.383 16.208 77.406 17.945 76.617 19.563 75.015 20.97 73.645 22.307 71.985 23.574 70.035 24.864 68.085 26.072 66.122 27.198 64.149 28.324 62.152 29.344 60.377 30.259 58.821 31.197 57.242 32.007 56.116 32.687 55.443 33.508 54.654 34.364 54.235 35.255 54.189 36.146 54.119 36.956 54.444 37.683 55.164L46.127 63.557C46.971 64.416 47.804 64.404 48.625 63.522L51.299 60.875C52.12 60.039 52.132 59.216 51.334 58.403L25.79 33.154C25.415 32.759 25.016 32.574 24.594 32.597 24.172 32.597 23.762 32.794 23.363 33.189L20.618 35.836C19.774 36.649 19.774 37.472 20.618 38.308ZM11.294 72.855C10.473 72.042 10.063 71.068 10.063 69.93 10.063 68.792 10.473 67.818 11.294 67.005 12.115 66.192 13.101 65.786 14.25 65.786 15.399 65.786 16.384 66.192 17.205 67.005 18.026 67.818 18.437 68.792 18.437 69.93 18.437 71.068 18.026 72.042 17.205 72.855 16.384 73.668 15.399 74.074 14.25 74.074 13.101 74.074 12.115 73.668 11.294 72.855ZM56.257 54.603L54.309 52.669 68.012 38.552C68.669 37.902 68.997 37.182 68.997 36.393 68.997 35.604 68.633 34.849 67.906 34.129L41.764 8.289C41.412 7.941 41.048 7.754 40.673 7.731 40.321 7.708 39.993 7.825 39.688 8.08 39.407 8.312 39.196 8.695 39.055 9.229 38.211 12.294 37.495 14.917 36.909 17.099 36.323 19.281 35.712 21.244 35.079 22.985 34.446 24.726 33.636 26.444 32.651 28.139 31.689 29.811 31.369 29.906 31.369 29.906L28.992 27.547 26.531 25.828C27.258 24.69 28.147 22.962 28.64 21.871 29.133 20.757 29.578 19.514 29.977 18.144 30.399 16.751 30.845 15.079 31.314 13.129 31.783 11.156 32.358 8.718 33.038 5.816 33.39 4.307 34.023 3.088 34.938 2.159 35.853 1.207 36.909 0.569 38.105 0.244 39.325-0.081 40.556-0.081 41.799 0.244 43.042 0.546 44.168 1.184 45.177 2.159L72.832 29.567C74.92 31.657 75.975 33.85 75.998 36.149 76.045 38.447 75.049 40.607 73.008 42.627L58.083 56.603 56.257 54.603ZM50.455 37.786C52.425 35.836 54.138 33.7 55.592 31.378 57.07 29.056 57.973 26.352 58.301 23.264L66.041 30.89C65.15 32.004 63.93 33.142 62.382 34.303 60.834 35.441 59.216 36.463 57.527 37.368 55.862 38.25 54.36 38.878 53.023 39.249 51.709 39.62 50.818 39.573 50.349 39.109 49.927 38.714 49.962 38.274 50.455 37.786Z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g class="zen-boosts-star-small" style="transform-origin: 0 0;" transform="translate(68.002 37.075) rotate(2.014)">
|
||||||
|
<g class="zen-boosts-star-small-anchor" transform="translate(-8 -8)">
|
||||||
|
<path class="zen-boosts-border" d="M8 0C8 4.418 4.418 8 0 8 4.418 8 8 11.582 8 16 8 11.582 11.582 8 16 8 11.582 8 8 4.418 8 0Z" fill="context-stroke" stroke="context-stroke" stroke-width="3" stroke-linejoin="round"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g class="zen-boosts-star-large" style="transform-origin: 0 0;" transform="translate(85.002 50.174) rotate(2.014)">
|
||||||
|
<g class="zen-boosts-star-large-anchor" transform="translate(-12 -12)">
|
||||||
|
<path class="zen-boosts-border" d="M12 0C12 6.627 6.627 12 0 12 6.627 12 12 17.373 12 24 12 17.373 17.373 12 24 12 17.373 12 12 6.627 12 0Z" fill="context-stroke" stroke="context-stroke" stroke-width="3" stroke-linejoin="round"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 400 KiB |
@@ -0,0 +1,32 @@
|
|||||||
|
#filter dumbComments emptyLines substitution
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
<svg class="zen-boosts-icon" width="28" height="28" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<mask id="zen-boosts-mask" maskContentUnits="userSpaceOnUse">
|
||||||
|
<rect x="-100" y="-100" width="300" height="300" fill="#fff"/>
|
||||||
|
<path fill="#000" stroke="#000" stroke-width="8" stroke-linejoin="round" d="M-3.79 54.121C-5.31 51.635-6.984 48.884-7.082 42.132L-7.073 42.091-7.063 42.051C-6.2 38.573-3.904 36.054-1.1 34.382L4.474 31.059C6.968 29.572 9.896 28.739 13.003 29.233 13.558 28.514 14.137 27.648 14.736 26.617L14.752 26.589 14.769 26.561C15.438 25.438 16.22 24.032 17.105 22.317 18.032 20.521 19.176 18.3 20.531 15.65 21.63 13.5 23.221 11.59 25.405 10.221 27.368 8.99 29.589 8.271 31.984 8.218L32.013 8.218C34.325 8.178 36.528 8.749 38.557 9.821 40.713 10.96 42.401 12.627 43.642 14.615L43.662 14.646 63.922 47.997C66.006 51.466 67.049 55.422 66.104 59.547 65.148 63.723 62.394 66.785 58.898 68.869L44.274 77.586C44.222 77.953 44.148 78.323 44.06 78.696 43.24 82.158 40.963 84.66 38.246 86.34L38.205 86.365 32.548 89.738C29.738 91.413 26.42 92.18 22.922 91.299 18.565 90.201 14.485 87.919 10.34 86.196 10.34 86.196 8.779 87.737 7.305 89.123 5.699 90.632 4.021 91.927 2.291 92.956-2.345 95.712-7.442 96.912-12.65 95.581-17.868 94.248-21.776 90.71-24.597 86.068-27.411 81.439-28.702 76.368-27.456 71.195-26.206 66.005-22.739 62.101-18.096 59.333-16.417 58.332-14.507 57.488-12.438 56.763L-12.4 56.75C-10.473 56.089-8.488 55.472-6.445 54.899-5.537 54.635-4.652 54.375-3.79 54.121Z"/>
|
||||||
|
</mask>
|
||||||
|
</defs>
|
||||||
|
<g transform="translate(61.889 63.143) scale(1.1) rotate(-15)">
|
||||||
|
<g transform="translate(-44 -44)">
|
||||||
|
<rect width="88" height="88" rx="16" mask="url(#zen-boosts-mask)" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(18.247 109.504) scale(1.1)">
|
||||||
|
<g transform="translate(-15 -70)">
|
||||||
|
<path fill-rule="evenodd" fill="context-stroke" d="M0 69.826C-0.023 66.459 1.467 63.29 4.469 60.318 5.501 59.296 6.814 58.264 8.409 57.219 10.027 56.174 11.717 55.176 13.476 54.154 15.235 53.132 16.877 52.158 18.472 51.229L22.377 48.617 15.024 41.373C13.546 39.91 12.795 38.354 12.772 36.706 12.772 35.034 13.5 33.479 14.954 32.04L19.563 27.478C21.017 26.039 22.577 25.33 24.242 25.353 26.219 25.381 26.531 25.828 28.992 27.547L56.964 55.303C58.465 56.766 59.215 58.322 59.215 59.97 59.238 61.595 58.535 63.139 57.104 64.602L52.46 69.199C51.029 70.615 49.47 71.311 47.781 71.288 46.092 71.288 44.52 70.557 43.066 69.094L35.748 61.816C34.904 62.814 34.012 64.091 33.074 65.647 32.136 67.203 31.15 68.862 30.118 70.627 29.109 72.392 28.078 74.063 27.022 75.642 25.99 77.244 24.946 78.555 23.89 79.577 20.888 82.549 17.686 84.023 14.285 84 10.884 83.977 7.658 82.444 4.609 79.403 1.56 76.385 0.023 73.193 0 69.826ZM20.618 38.308L29.133 46.701C29.86 47.398 30.188 48.187 30.118 49.069 30.048 49.951 29.625 50.799 28.851 51.612 28.171 52.309 27.034 53.11 25.439 54.015 23.844 54.92 22.037 55.931 20.02 57.045 18.026 58.159 16.044 59.355 14.074 60.632 12.104 61.909 10.427 63.232 9.043 64.602 7.425 66.181 6.615 67.887 6.615 69.721 6.638 71.555 7.471 73.297 9.113 74.945 10.778 76.57 12.525 77.383 14.355 77.383 16.208 77.406 17.945 76.617 19.563 75.015 20.97 73.645 22.307 71.985 23.574 70.035 24.864 68.085 26.072 66.122 27.198 64.149 28.324 62.152 29.344 60.377 30.259 58.821 31.197 57.242 32.007 56.116 32.687 55.443 33.508 54.654 34.364 54.235 35.255 54.189 36.146 54.119 36.956 54.444 37.683 55.164L46.127 63.557C46.971 64.416 47.804 64.404 48.625 63.522L51.299 60.875C52.12 60.039 52.132 59.216 51.334 58.403L25.79 33.154C25.415 32.759 25.016 32.574 24.594 32.597 24.172 32.597 23.762 32.794 23.363 33.189L20.618 35.836C19.774 36.649 19.774 37.472 20.618 38.308ZM11.294 72.855C10.473 72.042 10.063 71.068 10.063 69.93 10.063 68.792 10.473 67.818 11.294 67.005 12.115 66.192 13.101 65.786 14.25 65.786 15.399 65.786 16.384 66.192 17.205 67.005 18.026 67.818 18.437 68.792 18.437 69.93 18.437 71.068 18.026 72.042 17.205 72.855 16.384 73.668 15.399 74.074 14.25 74.074 13.101 74.074 12.115 73.668 11.294 72.855ZM56.257 54.603L54.309 52.669 68.012 38.552C68.669 37.902 68.997 37.182 68.997 36.393 68.997 35.604 68.633 34.849 67.906 34.129L41.764 8.289C41.412 7.941 41.048 7.754 40.673 7.731 40.321 7.708 39.993 7.825 39.688 8.08 39.407 8.312 39.196 8.695 39.055 9.229 38.211 12.294 37.495 14.917 36.909 17.099 36.323 19.281 35.712 21.244 35.079 22.985 34.446 24.726 33.636 26.444 32.651 28.139 31.689 29.811 31.369 29.906 31.369 29.906L28.992 27.547 26.531 25.828C27.258 24.69 28.147 22.962 28.64 21.871 29.133 20.757 29.578 19.514 29.977 18.144 30.399 16.751 30.845 15.079 31.314 13.129 31.783 11.156 32.358 8.718 33.038 5.816 33.39 4.307 34.023 3.088 34.938 2.159 35.853 1.207 36.909 0.569 38.105 0.244 39.325-0.081 40.556-0.081 41.799 0.244 43.042 0.546 44.168 1.184 45.177 2.159L72.832 29.567C74.92 31.657 75.975 33.85 75.998 36.149 76.045 38.447 75.049 40.607 73.008 42.627L58.083 56.603 56.257 54.603ZM50.455 37.786C52.425 35.836 54.138 33.7 55.592 31.378 57.07 29.056 57.973 26.352 58.301 23.264L66.041 30.89C65.15 32.004 63.93 33.142 62.382 34.303 60.834 35.441 59.216 36.463 57.527 37.368 55.862 38.25 54.36 38.878 53.023 39.249 51.709 39.62 50.818 39.573 50.349 39.109 49.927 38.714 49.962 38.274 50.455 37.786Z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(68.002 37.075) rotate(2.014)">
|
||||||
|
<g transform="translate(-8 -8)">
|
||||||
|
<path d="M8 0C8 4.418 4.418 8 0 8 4.418 8 8 11.582 8 16 8 11.582 11.582 8 16 8 11.582 8 8 4.418 8 0Z" fill="context-stroke" stroke="context-stroke" stroke-width="3" stroke-linejoin="round"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(85.002 50.174) rotate(2.014)">
|
||||||
|
<g transform="translate(-12 -12)">
|
||||||
|
<path d="M12 0C12 6.627 6.627 12 0 12 6.627 12 12 17.373 12 24 12 17.373 17.373 12 24 12 17.373 12 12 6.627 12 0Z" fill="context-stroke" stroke="context-stroke" stroke-width="3" stroke-linejoin="round"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
#filter dumbComments emptyLines substitution
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
<svg class="zen-downloads-icon" width="28" height="28" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<style>
|
||||||
|
@keyframes zenDownloadsArrowBounce {
|
||||||
|
0% { transform: translateY(0px); d: path('M 64 45 L 64 83 M 50 69 L 64 83 L 78 69'); animation-timing-function: cubic-bezier(0.33, 0, 0.7, 1.28); }
|
||||||
|
31.43% { transform: translateY(10px); d: path('M 64 57 L 64 83 M 50 69 L 64 83 L 78 69'); animation-timing-function: cubic-bezier(0.44, 0.2, 0.44, 0.98); }
|
||||||
|
54.29% { transform: translateY(-10.83px); d: path('M 64 45 L 64 83 M 50 69 L 64 83 L 78 69'); animation-timing-function: cubic-bezier(0.45, -0.03, 0.83, 0.9); }
|
||||||
|
85.71% { transform: translateY(0.66px); d: path('M 64 45 L 64 83 M 50 69 L 64 83 L 78 69'); animation-timing-function: cubic-bezier(0.17, -0.98, 0.83, 0.83); }
|
||||||
|
100% { transform: translateY(0px); d: path('M 64 45 L 64 83 M 50 69 L 64 83 L 78 69'); }
|
||||||
|
}
|
||||||
|
@keyframes zenDownloadsCircleBounce {
|
||||||
|
0% { transform: translateY(0px); animation-timing-function: cubic-bezier(0.33, 0, 0.71, 2.31); }
|
||||||
|
31.43% { transform: translateY(2.5px); animation-timing-function: cubic-bezier(0.23, 0.15, 0.36, 0.97); }
|
||||||
|
54.29% { transform: translateY(-11.46px); animation-timing-function: cubic-bezier(0.48, -0.04, 0.83, 0.89); }
|
||||||
|
85.71% { transform: translateY(0.85px); animation-timing-function: cubic-bezier(0.17, -0.70, 0.83, 0.83); }
|
||||||
|
100% { transform: translateY(0px); }
|
||||||
|
}
|
||||||
|
.zen-downloads-circle-translate { animation: zenDownloadsCircleBounce 0.583s forwards; }
|
||||||
|
.zen-downloads-arrow { animation: zenDownloadsArrowBounce 0.583s forwards; }
|
||||||
|
</style>
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" style="transform-origin: 64px 64px;">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
@@ -0,0 +1,511 @@
|
|||||||
|
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||||
|
<!-- Generated by scripts/generate-library-sprites.mjs. Do not edit;
|
||||||
|
- regenerate from the library-*-active.svg sources instead. -->
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="1008" height="28" fill="none">
|
||||||
|
<svg x="0" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f0">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 0) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f0)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 0)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="28" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f1">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 0.131) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f1)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45.355 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 0.296)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="56" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f2">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 0.473) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f2)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 46.299 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 1.082)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="84" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f3">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 0.955) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f3)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 47.669 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 2.224)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="112" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f4">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 1.517) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f4)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 49.32 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 3.6)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="140" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f5">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 2.103) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f5)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 51.12 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 5.1)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="168" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f6">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 2.656) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f6)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 52.937 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 6.614)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="196" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f7">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 3.119) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f7)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 54.637 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 8.031)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="224" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f8">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 3.425) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f8)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 56.076 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 9.23)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="252" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f9">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 3.496) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f9)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 57.089 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 10.075)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="280" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f10">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 3.233) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f10)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 57.481 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 10.4)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="308" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f11">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 2.501) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f11)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 57.001 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 10)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="336" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f12">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 0.423) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f12)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 56.035 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 8.325)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="364" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f13">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -2.757) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f13)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 54.37 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 5.434)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="392" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f14">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -5.733) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f14)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 51.937 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 1.211)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="420" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f15">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -8.006) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f15)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 49.263 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -3.429)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="448" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f16">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -9.597) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f16)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 47.182 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -7.043)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="476" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f17">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -10.631) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f17)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45.895 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -9.277)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="504" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f18">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -11.223) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f18)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45.228 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -10.434)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="532" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f19">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -11.46) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f19)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -10.83)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="560" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f20">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -11.413) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f20)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -10.754)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="588" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f21">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -11.089) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f21)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -10.398)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="616" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f22">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -10.494) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f22)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -9.781)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="644" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f23">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -9.636) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f23)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -8.922)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="672" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f24">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -8.527) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f24)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -7.844)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="700" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f25">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -7.186) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f25)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -6.57)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="728" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f26">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -5.639) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f26)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -5.133)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="756" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f27">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -3.928) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f27)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -3.575)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="784" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f28">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -2.132) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f28)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -1.967)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="812" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f29">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 -0.407) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f29)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 -0.441)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="840" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f30">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 0.851) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f30)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 0.661)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="868" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f31">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 0.99) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f31)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 0.846)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="896" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f32">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 0.823) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f32)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 0.718)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="924" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f33">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 0.566) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f33)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 0.496)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="952" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f34">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 0.271) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f34)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 0.236)"/>
|
||||||
|
</svg>
|
||||||
|
<svg x="980" width="28" height="28" viewBox="0 0 128 128">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-downloads-grad-front-f35">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-downloads-circle-translate" transform="translate(64 64) translate(0 0) translate(-64 -64)">
|
||||||
|
<circle class="zen-downloads-bg" cx="64" cy="64" r="47.5" fill="context-fill" fill-opacity="1"/>
|
||||||
|
<circle class="zen-downloads-gradient" cx="64" cy="64" r="47.5" fill="url(#zen-downloads-grad-front-f35)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<circle class="zen-downloads-border" cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-downloads-arrow" d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round" transform="translate(0 0)"/>
|
||||||
|
</svg>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 39 KiB |
@@ -0,0 +1,8 @@
|
|||||||
|
#filter dumbComments emptyLines substitution
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
<svg class="zen-downloads-icon" width="28" height="28" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="64" cy="64" r="47.5" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
<path d="M 64 45 L 64 83 M 50 69 L 64 83 L 78 69" stroke="context-stroke" stroke-width="7.1" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
#filter dumbComments emptyLines substitution
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
<svg class="zen-history-icon" width="28" height="28" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<style>
|
||||||
|
@keyframes zenHistoryBodyTranslate {
|
||||||
|
0%, 31.43% { transform: translate(63.977px, 79.047px); animation-timing-function: cubic-bezier(0.16, 0.41, 0.34, 1); }
|
||||||
|
60% { transform: translate(63.977px, 63.253px); animation-timing-function: cubic-bezier(0.33, 0, 0.62, 0.55); }
|
||||||
|
77.14%, 100% { transform: translate(63.977px, 79.047px); }
|
||||||
|
}
|
||||||
|
@keyframes zenHistoryLid {
|
||||||
|
0% { transform: translate(63.977px, 37.148px) rotate(0deg) translate(-46.852px, -12.82px); animation-timing-function: cubic-bezier(0.21, 0, 0.56, 1); }
|
||||||
|
31.43% { transform: translate(63.977px, 51.609px) rotate(0deg) translate(-46.852px, -12.82px); animation-timing-function: cubic-bezier(0.38, 0, 0.55, 1); }
|
||||||
|
62.86% { transform: translate(63.977px, 17.08px) rotate(-6.93deg) translate(-46.852px, -12.82px); animation-timing-function: cubic-bezier(0.43, 0.14, 0.38, 1); }
|
||||||
|
82.86% { transform: translate(63.977px, 23.397px) rotate(4.2deg) translate(-46.852px, -12.82px); animation-timing-function: cubic-bezier(0.41, 0, 0.49, 1); }
|
||||||
|
100% { transform: translate(63.977px, 37.148px) rotate(0deg) translate(-46.852px, -12.82px); }
|
||||||
|
}
|
||||||
|
@keyframes zenHistoryDashTranslate {
|
||||||
|
0% { transform: translate(64px, 65px) scale(0.9, 1); animation-timing-function: cubic-bezier(0.33, 0, 0.7, 1.28); }
|
||||||
|
31.43% { transform: translate(64px, 79.461px) scale(0.8, 1); animation-timing-function: cubic-bezier(0.44, 0.2, 0.44, 0.98); }
|
||||||
|
54.29% { transform: translate(64px, 61.033px) scale(0.86, 1); animation-timing-function: cubic-bezier(0.45, -0.03, 0.83, 0.9); }
|
||||||
|
85.71% { transform: translate(64px, 65.66px) scale(0.9, 1); animation-timing-function: cubic-bezier(0.22, -0.9, 0.25, 1.25); }
|
||||||
|
100% { transform: translate(64px, 65px) scale(0.9, 1); }
|
||||||
|
}
|
||||||
|
.zen-history-body-translate { animation: zenHistoryBodyTranslate 0.583s forwards; }
|
||||||
|
.zen-history-lid { animation: zenHistoryLid 0.583s forwards; }
|
||||||
|
.zen-history-dash-translate { animation: zenHistoryDashTranslate 0.583s forwards; }
|
||||||
|
</style>
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="0" x2="64" y2="128" id="zen-history-grad-front">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-history-body-translate" style="transform-origin: 0 0; transform: translate(63.977px, 79.047px);">
|
||||||
|
<g transform="translate(-39.867, -30.328)">
|
||||||
|
<path class="zen-history-bg"
|
||||||
|
d="M 3.55 0 L 76.184 0 L 76.184 46.856 A 10.25 10.25 0 0 1 65.934 57.106 L 13.8 57.106 A 10.25 10.25 0 0 1 3.55 46.856 Z"
|
||||||
|
fill="context-fill" fill-opacity="1"/>
|
||||||
|
<path class="zen-history-gradient"
|
||||||
|
d="M 3.55 0 L 76.184 0 L 76.184 46.856 A 10.25 10.25 0 0 1 65.934 57.106 L 13.8 57.106 A 10.25 10.25 0 0 1 3.55 46.856 Z"
|
||||||
|
fill="url(#zen-history-grad-front)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<path class="zen-history-border"
|
||||||
|
d="M 3.55 0 L 76.184 0 L 76.184 46.856 A 10.25 10.25 0 0 1 65.934 57.106 L 13.8 57.106 A 10.25 10.25 0 0 1 3.55 46.856 Z"
|
||||||
|
fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g class="zen-history-lid" style="transform-origin: 0 0; transform: translate(63.977px, 37.148px) rotate(0deg) translate(-46.852px, -12.82px);">
|
||||||
|
<rect class="zen-history-bg" x="3.55" y="3.55" width="86.603" height="18.541" rx="6.05"
|
||||||
|
fill="context-fill" fill-opacity="1"/>
|
||||||
|
<rect class="zen-history-gradient" x="3.55" y="3.55" width="86.603" height="18.541" rx="6.05"
|
||||||
|
fill="url(#zen-history-grad-front)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<rect class="zen-history-border" x="3.55" y="3.55" width="86.603" height="18.541" rx="6.05"
|
||||||
|
fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<g class="zen-history-dash-translate" style="transform-origin: 0 0; transform: translate(64px, 65px) scale(0.9, 1);">
|
||||||
|
<path class="zen-history-dash-path" fill="none"
|
||||||
|
d="M -16 0 L 16 0"
|
||||||
|
stroke="context-stroke" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 79 KiB |
@@ -0,0 +1,14 @@
|
|||||||
|
#filter dumbComments emptyLines substitution
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
<svg class="zen-history-icon" width="28" height="28" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="translate(63.977, 79.047)">
|
||||||
|
<path d="M -36.317 -30.328 L 36.317 -30.328 L 36.317 16.528 A 10.25 10.25 0 0 1 26.067 26.778 L -26.067 26.778 A 10.25 10.25 0 0 1 -36.317 16.528 Z"
|
||||||
|
fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(17.125, 24.328)">
|
||||||
|
<rect x="3.55" y="3.55" width="86.603" height="18.541" rx="6.05" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<path d="M 49.6 65 L 78.4 65" fill="none" stroke="context-stroke" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
#filter dumbComments emptyLines substitution
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
<svg class="zen-media-icon" width="28" height="28" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<style>
|
||||||
|
@keyframes zenMediaBackBounce {
|
||||||
|
0% { transform: translate(54.799px, 57.743px) rotate(-7deg) translate(-46.27px, -36.445px); animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1); }
|
||||||
|
24.41% { transform: translate(57.299px, 65.243px) rotate(3deg) translate(-46.27px, -36.445px); animation-timing-function: cubic-bezier(0.3, 0, 0.8, 1); }
|
||||||
|
43.67% { transform: translate(56.16px, 47.803px) rotate(-18.58deg) translate(-46.27px, -36.445px); animation-timing-function: cubic-bezier(0.16, 0, 0.8, 1); }
|
||||||
|
78.21% { transform: translate(55.25px, 54.3px) rotate(-3.2deg) translate(-46.27px, -36.445px); animation-timing-function: cubic-bezier(0.65, 0, 0.35, 1); }
|
||||||
|
100% { transform: translate(54.799px, 57.743px) rotate(-7deg) translate(-46.27px, -36.445px); }
|
||||||
|
}
|
||||||
|
@keyframes zenMediaFrontBounce {
|
||||||
|
0% { transform: translate(78.827px, 77.737px) rotate(0deg) translate(-46.27px, -36.445px); animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1); }
|
||||||
|
24.41% { transform: translate(78.827px, 80.737px) rotate(0deg) translate(-46.27px, -36.445px); animation-timing-function: cubic-bezier(0.4, 0, 0.64, 1); }
|
||||||
|
55.88% { transform: translate(75.827px, 62.61px) rotate(9.32deg) translate(-46.27px, -36.445px); animation-timing-function: cubic-bezier(0.25, 0, 0.75, 1); }
|
||||||
|
88.24% { transform: translate(78.827px, 77.737px) rotate(0deg) translate(-46.27px, -36.445px); animation-timing-function: linear; }
|
||||||
|
100% { transform: translate(78.827px, 77.737px) rotate(0deg) translate(-46.27px, -36.445px); }
|
||||||
|
}
|
||||||
|
@keyframes zenMediaSunBounce {
|
||||||
|
0% { transform: translate(64.76px, 67.886px) translate(-9.914px, -9.984px); animation-timing-function: cubic-bezier(0.32, 0, 0.67, 1); }
|
||||||
|
24.41% { transform: translate(64.76px, 73.606px) translate(-9.914px, -9.984px); animation-timing-function: linear; }
|
||||||
|
35.29% { transform: translate(64.76px, 73.606px) translate(-9.914px, -9.984px); animation-timing-function: cubic-bezier(0.35, 0, 0.76, 0.72); }
|
||||||
|
55.88% { transform: translate(61.737px, 51.974px) translate(-9.914px, -9.984px); animation-timing-function: cubic-bezier(0.21, -0.71, 0.45, 1); }
|
||||||
|
100% { transform: translate(64.76px, 67.886px) translate(-9.914px, -9.984px); }
|
||||||
|
}
|
||||||
|
.zen-media-back-card { animation: zenMediaBackBounce 0.583s forwards; }
|
||||||
|
.zen-media-front-card { animation: zenMediaFrontBounce 0.583s forwards; }
|
||||||
|
.zen-media-sun { animation: zenMediaSunBounce 0.583s forwards; }
|
||||||
|
</style>
|
||||||
|
<defs>
|
||||||
|
<mask id="zen-media-mask">
|
||||||
|
<rect x="-10" y="-10" width="148" height="148" fill="white"/>
|
||||||
|
<g class="zen-media-front-card-mask" transform="translate(78.827, 77.737) translate(-46.27, -36.445)">
|
||||||
|
<rect x="0" y="0" width="92.539" height="72.891" rx="12.812" fill="black"/>
|
||||||
|
</g>
|
||||||
|
</mask>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="0" x2="64" y2="128" id="zen-media-grad-back">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="0" x2="64" y2="128" id="zen-media-grad-front">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-media-back-wrapper" mask="url(#zen-media-mask)">
|
||||||
|
<g class="zen-media-back-card" transform="translate(54.799, 57.743) rotate(-7) translate(-46.27, -36.445)">
|
||||||
|
<rect class="zen-media-bg" x="3.55" y="3.55" width="85.439" height="65.791" rx="9.262"
|
||||||
|
fill="context-fill" fill-opacity="1"/>
|
||||||
|
<rect class="zen-media-gradient" x="3.55" y="3.55" width="85.439" height="65.791" rx="9.262"
|
||||||
|
fill="url(#zen-media-grad-back)" fill-opacity="1" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<rect class="zen-media-border" x="3.55" y="3.55" width="85.439" height="65.791" rx="9.262"
|
||||||
|
fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g class="zen-media-front-card" transform="translate(78.827, 77.737) translate(-46.27, -36.445)">
|
||||||
|
<rect class="zen-media-bg" x="3.55" y="3.55" width="85.439" height="65.791" rx="9.262"
|
||||||
|
fill="context-fill" fill-opacity="1"/>
|
||||||
|
<rect class="zen-media-gradient" x="3.55" y="3.55" width="85.439" height="65.791" rx="9.262"
|
||||||
|
fill="url(#zen-media-grad-front)" fill-opacity="1" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<g class="zen-media-mountain" transform="translate(0.289, 32.609)">
|
||||||
|
<path class="zen-media-mountain-path" d="M7.432 21.147 L17.865 12.11 C19.665 10.596 21.373 9.862 23.173 9.862 C25.158 9.862 27.005 10.596 28.805 12.202 L36.191 18.853 L54.84 2.431 C56.779 0.734 58.81 0 61.072 0 C63.334 0 65.55 0.826 67.35 2.477 L84.568 18.67 L92 25.78 C92 35.23 87.153 40 77.551 40 L14.495 40 C4.801 40 0 35.275 0 25.78 Z"
|
||||||
|
fill="context-stroke"/>
|
||||||
|
</g>
|
||||||
|
<rect class="zen-media-border" x="3.55" y="3.55" width="85.439" height="65.791" rx="9.262"
|
||||||
|
fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
<g class="zen-media-sun" transform="translate(64.76, 67.886) translate(-9.914, -9.984)">
|
||||||
|
<circle class="zen-media-sun-path" cx="9.914" cy="9.984" r="9.914"
|
||||||
|
fill="context-stroke"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 108 KiB |
@@ -0,0 +1,22 @@
|
|||||||
|
#filter dumbComments emptyLines substitution
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
<svg class="zen-media-icon" width="28" height="28" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<mask id="zen-media-mask-inactive">
|
||||||
|
<rect x="-10" y="-10" width="148" height="148" fill="white"/>
|
||||||
|
<g transform="translate(78.827, 77.737) translate(-46.27, -36.445)">
|
||||||
|
<rect x="0" y="0" width="92.539" height="72.891" rx="12.812" fill="black"/>
|
||||||
|
</g>
|
||||||
|
</mask>
|
||||||
|
</defs>
|
||||||
|
<g mask="url(#zen-media-mask-inactive)">
|
||||||
|
<g transform="translate(54.799, 57.743) rotate(-7) translate(-46.27, -36.445)">
|
||||||
|
<rect x="3.55" y="3.55" width="85.439" height="65.791" rx="9.262" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(78.827, 77.737) translate(-46.27, -36.445)">
|
||||||
|
<rect x="3.55" y="3.55" width="85.439" height="65.791" rx="9.262" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
#filter dumbComments emptyLines substitution
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
<svg class="zen-spaces-icon" width="28" height="28" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<style>
|
||||||
|
@keyframes zenSpacesBackBounce {
|
||||||
|
0% { transform: translate(51.28px, 61.69px) rotate(-17.5deg) translate(-35.022px, -44.68px); animation-timing-function: cubic-bezier(0.21, 0, 0.56, 1); }
|
||||||
|
34.28% { transform: translate(56.28px, 72.19px) rotate(6deg) translate(-35.022px, -44.68px); animation-timing-function: cubic-bezier(0.38, 0, 0.55, 1); }
|
||||||
|
62.86% { transform: translate(51.28px, 55.52px) rotate(-27.83deg) translate(-35.022px, -44.68px); animation-timing-function: cubic-bezier(0.73, 0, 0.63, 1); }
|
||||||
|
100% { transform: translate(51.28px, 61.69px) rotate(-17.5deg) translate(-35.022px, -44.68px); }
|
||||||
|
}
|
||||||
|
@keyframes zenSpacesFrontBounce {
|
||||||
|
0% { transform: translate(77.02px, 75.93px) rotate(0deg) translate(-35.022px, -44.68px); animation-timing-function: cubic-bezier(0.21, 0, 0.56, 1); }
|
||||||
|
31.43% { transform: translate(77.02px, 78.18px) rotate(-5deg) translate(-35.022px, -44.68px); animation-timing-function: cubic-bezier(0.38, 0, 0.55, 1); }
|
||||||
|
54.28% { transform: translate(77.02px, 55.71px) rotate(28.96deg) translate(-35.022px, -44.68px); animation-timing-function: cubic-bezier(0.73, 0, 0.63, 1); }
|
||||||
|
100% { transform: translate(77.02px, 75.93px) rotate(0deg) translate(-35.022px, -44.68px); }
|
||||||
|
}
|
||||||
|
.zen-spaces-back-card { animation: zenSpacesBackBounce 0.583s forwards; }
|
||||||
|
.zen-spaces-front-card { animation: zenSpacesFrontBounce 0.583s forwards; }
|
||||||
|
</style>
|
||||||
|
<defs>
|
||||||
|
<mask id="zen-spaces-mask">
|
||||||
|
<rect x="-10" y="-10" width="148" height="148" fill="white"/>
|
||||||
|
<g class="zen-spaces-front-card" style="transform-origin: 0 0; transform: translate(77.02px, 75.93px) rotate(0deg) translate(-35.022px, -44.68px);">
|
||||||
|
<rect x="0" y="0" width="70.04" height="89.36" rx="14" fill="black"/>
|
||||||
|
</g>
|
||||||
|
</mask>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-spaces-grad-back">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="64" y1="20" x2="64" y2="148" id="zen-spaces-grad-front">
|
||||||
|
<stop offset="0" stop-color="context-fill"/>
|
||||||
|
<stop offset="1" stop-color="context-stroke"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="zen-spaces-back-wrapper" mask="url(#zen-spaces-mask)">
|
||||||
|
<g class="zen-spaces-back-card" style="transform-origin: 0 0; transform: translate(51.28px, 61.69px) rotate(-17.5deg) translate(-35.022px, -44.68px);">
|
||||||
|
<rect class="zen-spaces-bg" x="3.55" y="3.55" width="62.94" height="82.26" rx="10.45"
|
||||||
|
fill="context-fill" fill-opacity="1"/>
|
||||||
|
<rect class="zen-spaces-gradient" x="3.55" y="3.55" width="62.94" height="82.26" rx="10.45"
|
||||||
|
fill="url(#zen-spaces-grad-back)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<rect class="zen-spaces-border" x="3.55" y="3.55" width="62.94" height="82.26" rx="10.45"
|
||||||
|
fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g class="zen-spaces-front-card" style="transform-origin: 0 0; transform: translate(77.02px, 75.93px) rotate(0deg) translate(-35.022px, -44.68px);">
|
||||||
|
<rect class="zen-spaces-bg" x="3.55" y="3.55" width="62.94" height="82.26" rx="10.45"
|
||||||
|
fill="context-fill" fill-opacity="1"/>
|
||||||
|
<rect class="zen-spaces-gradient" x="3.55" y="3.55" width="62.94" height="82.26" rx="10.45"
|
||||||
|
fill="url(#zen-spaces-grad-front)" style="mix-blend-mode: overlay; opacity: 0.1;"/>
|
||||||
|
<rect class="zen-spaces-border" x="3.55" y="3.55" width="62.94" height="82.26" rx="10.45"
|
||||||
|
fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 83 KiB |
@@ -0,0 +1,22 @@
|
|||||||
|
#filter dumbComments emptyLines substitution
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
<svg class="zen-spaces-icon" width="28" height="28" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<mask id="zen-spaces-mask-inactive">
|
||||||
|
<rect x="-10" y="-10" width="148" height="148" fill="white"/>
|
||||||
|
<g style="transform-origin: 0 0; transform: translate(77.02px, 75.93px) translate(-35.022px, -44.68px);">
|
||||||
|
<rect x="0" y="0" width="70.04" height="89.36" rx="14" fill="black"/>
|
||||||
|
</g>
|
||||||
|
</mask>
|
||||||
|
</defs>
|
||||||
|
<g mask="url(#zen-spaces-mask-inactive)">
|
||||||
|
<g style="transform-origin: 0 0; transform: translate(51.28px, 61.69px) rotate(-17.5deg) translate(-35.022px, -44.68px);">
|
||||||
|
<rect x="3.55" y="3.55" width="62.94" height="82.26" rx="10.45" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g style="transform-origin: 0 0; transform: translate(77.02px, 75.93px) translate(-35.022px, -44.68px);">
|
||||||
|
<rect x="3.55" y="3.55" width="62.94" height="82.26" rx="10.45" fill="none" stroke="context-stroke" stroke-width="7.1"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
#filter dumbComments emptyLines substitution
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
<svg class="zen-library-icon" width="18" height="18" viewBox="4 4 18 18" fill="context-fill" fill-opacity="context-fill-opacity" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<style>
|
||||||
|
@property --zen-triangle-anim { syntax: '<number>'; initial-value: 1; inherits: false; }
|
||||||
|
@property --zen-circle-anim { syntax: '<number>'; initial-value: 1; inherits: false; }
|
||||||
|
@keyframes StarBackward {
|
||||||
|
0% { transform: rotate(120deg); }
|
||||||
|
100% { transform: rotate(0deg); }
|
||||||
|
}
|
||||||
|
@keyframes TriangleBackward {
|
||||||
|
0% { --zen-triangle-anim: 1; }
|
||||||
|
100% { --zen-triangle-anim: 0; }
|
||||||
|
}
|
||||||
|
@keyframes CircleBackward {
|
||||||
|
0% { --zen-circle-anim: 1; }
|
||||||
|
100% { --zen-circle-anim: 0; }
|
||||||
|
}
|
||||||
|
@keyframes GlowBackward {
|
||||||
|
0% { opacity: 0.4; }
|
||||||
|
100% { opacity: 0; }
|
||||||
|
}
|
||||||
|
@keyframes GlowElementsBackward {
|
||||||
|
0% { opacity: 0.5; }
|
||||||
|
100% { opacity: 0; }
|
||||||
|
}
|
||||||
|
.zen-library-star { transform-origin: 10px 10.2px; animation: StarBackward 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; }
|
||||||
|
.zen-library-triangle-group { transform-origin: 17px 9.2px; animation: TriangleBackward 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; transform: translate(calc(var(--zen-triangle-anim) * 2px), 0px) rotate(calc(var(--zen-triangle-anim) * 365deg)) scale(max(1 - var(--zen-triangle-anim) / 0.65, (var(--zen-triangle-anim) - 0.65) / 0.35)); }
|
||||||
|
.zen-library-circle { transform-origin: 0px 0px; animation: CircleBackward 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; transform: translate(calc(var(--zen-circle-anim) * 1px), calc(var(--zen-circle-anim) * -1.5px)) scale(max(0, max((var(--zen-circle-anim) - 0.75) / 0.25, min(1, 1 - (var(--zen-circle-anim) - 0.3) / 0.35)))); }
|
||||||
|
.zen-library-glow { filter: blur(2px); animation: GlowBackward 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; }
|
||||||
|
.zen-library-glow-element { filter: blur(2px); animation: GlowElementsBackward 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; }
|
||||||
|
.zen-library-glow-bg, .zen-library-glow-element { fill: transparent !important; stroke: none !important; }
|
||||||
|
.zen-library-glow-rays { stroke: transparent !important; fill: none !important; }
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
.zen-library-glow-bg, .zen-library-glow-element { fill: white !important; }
|
||||||
|
.zen-library-glow-rays { stroke: white !important; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<defs>
|
||||||
|
<mask id="zen-library-box-mask">
|
||||||
|
<rect x="-10" y="-10" width="40" height="40" fill="white"/>
|
||||||
|
<rect x="-10" y="11.635" width="40" height="40" fill="black"/>
|
||||||
|
</mask>
|
||||||
|
</defs>
|
||||||
|
<g fill-rule="evenodd">
|
||||||
|
<g mask="url(#zen-library-box-mask)">
|
||||||
|
<path class="zen-library-star zen-library-glow-element" d="M 7.773 11.635 C 8.136 11.863 8.24 12.075 8.218 12.294 L 8.036 14.082 C 7.984 14.598 8.584 14.917 8.982 14.585 L 10.362 13.432 C 10.53 13.291 10.764 13.258 10.966 13.347 L 12.61 14.072 C 13.085 14.281 13.574 13.808 13.38 13.327 L 12.701 11.635 C 12.632 11.437 12.675 11.216 12.816 11.058 L 14.014 9.718 C 14.36 9.331 14.061 8.72 13.544 8.756 L 11.75 8.877 C 11.531 8.892 11.322 8.781 11.211 8.591 L 10.307 7.038 C 10.046 6.59 9.373 6.685 9.247 7.188 L 8.808 8.931 C 8.754 9.144 8.585 9.309 8.37 9.355 L 6.613 9.735 C 6.106 9.845 5.988 10.514 6.427 10.79 L 7.773 11.635 Z"/>
|
||||||
|
<path class="zen-library-star" d="M 7.773 11.635 C 8.136 11.863 8.24 12.075 8.218 12.294 L 8.036 14.082 C 7.984 14.598 8.584 14.917 8.982 14.585 L 10.362 13.432 C 10.53 13.291 10.764 13.258 10.966 13.347 L 12.61 14.072 C 13.085 14.281 13.574 13.808 13.38 13.327 L 12.701 11.635 C 12.632 11.437 12.675 11.216 12.816 11.058 L 14.014 9.718 C 14.36 9.331 14.061 8.72 13.544 8.756 L 11.75 8.877 C 11.531 8.892 11.322 8.781 11.211 8.591 L 10.307 7.038 C 10.046 6.59 9.373 6.685 9.247 7.188 L 8.808 8.931 C 8.754 9.144 8.585 9.309 8.37 9.355 L 6.613 9.735 C 6.106 9.845 5.988 10.514 6.427 10.79 L 7.773 11.635 Z"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(14, 6.2)">
|
||||||
|
<circle class="zen-library-circle zen-library-glow-element" cx="0" cy="0" r="1.4"/>
|
||||||
|
<circle class="zen-library-circle" cx="0" cy="0" r="1"/>
|
||||||
|
</g>
|
||||||
|
<g class="zen-library-triangle-group">
|
||||||
|
<g transform="translate(17, 9.2)">
|
||||||
|
<path class="zen-library-triangle zen-library-glow-element" d="M -1.1 1.8 C -1.4 2.0, -1.7 1.8, -1.7 1.5 L -1.7 -1.5 C -1.7 -1.8, -1.4 -2.0, -1.1 -1.8 L 1.4 -0.4 C 1.7 -0.2, 1.7 0.2, 1.4 0.4 Z"/>
|
||||||
|
<path class="zen-library-triangle" d="M -1.1 1.8 C -1.4 2.0, -1.7 1.8, -1.7 1.5 L -1.7 -1.5 C -1.7 -1.8, -1.4 -2.0, -1.1 -1.8 L 1.4 -0.4 C 1.7 -0.2, 1.7 0.2, 1.4 0.4 Z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g class="zen-library-glow">
|
||||||
|
<path class="zen-library-glow-bg" d="M 6.6 6.6 L 8.04 12.7 L 17.96 12.7 L 19.4 6.6 Z"/>
|
||||||
|
<path class="zen-library-glow-rays" d="M 6.1 6.6 L 8.04 12.7 L 17.96 12.7 L 19.9 6.6"/>
|
||||||
|
</g>
|
||||||
|
<path class="zen-library-box" d="M 7.218 13.287 C 7.218 12.831 7.588 12.461 8.044 12.461 H 17.957 C 18.414 12.461 18.783 12.831 18.783 13.287 V 17.418 C 18.783 19.243 17.304 20.722 15.479 20.722 H 10.523 C 8.698 20.722 7.218 19.243 7.218 17.418 V 13.287 Z M 10.609 14.526 C 10.609 14.07 10.979 13.7 11.435 13.7 H 14.739 C 15.196 13.7 15.565 14.07 15.565 14.526 C 15.565 14.982 15.196 15.352 14.739 15.352 H 11.435 C 10.979 15.352 10.609 14.982 10.609 14.526 Z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
@@ -309,7 +309,8 @@
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#library-button {
|
#library-button,
|
||||||
|
#zen-library-button {
|
||||||
list-style-image: url("library.svg") !important;
|
list-style-image: url("library.svg") !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -435,6 +436,10 @@
|
|||||||
list-style-image: url("arrow-left.svg") !important;
|
list-style-image: url("arrow-left.svg") !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#appmenu-moreTools-button {
|
||||||
|
list-style-image: url("customize.svg") !important;
|
||||||
|
}
|
||||||
|
|
||||||
#zen-copy-current-url-button,
|
#zen-copy-current-url-button,
|
||||||
#share-tab-button,
|
#share-tab-button,
|
||||||
#zen-site-data-header-share {
|
#zen-site-data-header-share {
|
||||||
@@ -808,8 +813,7 @@
|
|||||||
|
|
||||||
#toolbar-context-toggle-vertical-tabs,
|
#toolbar-context-toggle-vertical-tabs,
|
||||||
#toolbar-context-customize-sidebar,
|
#toolbar-context-customize-sidebar,
|
||||||
#sidebarRevampSeparator,
|
#sidebarRevampSeparator {
|
||||||
.fxa-menu-sign-in-promo-image {
|
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -876,7 +880,7 @@
|
|||||||
border-radius: var(--tab-border-radius);
|
border-radius: var(--tab-border-radius);
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background: var(--toolbarbutton-background-color-hover);
|
background: var(--toolbarbutton-hover-background);
|
||||||
}
|
}
|
||||||
|
|
||||||
& image {
|
& image {
|
||||||
|
|||||||
@@ -104,7 +104,6 @@
|
|||||||
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
|
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
|
||||||
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
|
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
|
||||||
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
|
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
|
||||||
* skin/classic/browser/zen-icons/private-window-small.svg (../shared/zen-icons/nucleo/private-window-small.svg)
|
|
||||||
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
|
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
|
||||||
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
|
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
|
||||||
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
|
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
|
||||||
@@ -255,7 +254,6 @@
|
|||||||
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
|
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
|
||||||
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
|
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
|
||||||
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
|
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
|
||||||
* skin/classic/browser/zen-icons/private-window-small.svg (../shared/zen-icons/nucleo/private-window-small.svg)
|
|
||||||
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
|
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
|
||||||
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
|
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
|
||||||
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
|
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
|
||||||
@@ -406,7 +404,6 @@
|
|||||||
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
|
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
|
||||||
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
|
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
|
||||||
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
|
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
|
||||||
* skin/classic/browser/zen-icons/private-window-small.svg (../shared/zen-icons/nucleo/private-window-small.svg)
|
|
||||||
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
|
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
|
||||||
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
|
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
|
||||||
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
|
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
|
||||||
@@ -456,6 +453,11 @@
|
|||||||
* skin/classic/browser/zen-icons/zoom-out.svg (../shared/zen-icons/nucleo/zoom-out.svg)
|
* skin/classic/browser/zen-icons/zoom-out.svg (../shared/zen-icons/nucleo/zoom-out.svg)
|
||||||
#endif
|
#endif
|
||||||
* skin/classic/browser/zen-icons/urlbar-arrow.svg (../shared/zen-icons/common/urlbar-arrow.svg)
|
* skin/classic/browser/zen-icons/urlbar-arrow.svg (../shared/zen-icons/common/urlbar-arrow.svg)
|
||||||
|
skin/classic/browser/zen-icons/library/library-boosts-sprite.svg (../shared/zen-icons/common/library/library-boosts-sprite.svg)
|
||||||
|
skin/classic/browser/zen-icons/library/library-downloads-sprite.svg (../shared/zen-icons/common/library/library-downloads-sprite.svg)
|
||||||
|
skin/classic/browser/zen-icons/library/library-history-sprite.svg (../shared/zen-icons/common/library/library-history-sprite.svg)
|
||||||
|
skin/classic/browser/zen-icons/library/library-media-sprite.svg (../shared/zen-icons/common/library/library-media-sprite.svg)
|
||||||
|
skin/classic/browser/zen-icons/library/library-spaces-sprite.svg (../shared/zen-icons/common/library/library-spaces-sprite.svg)
|
||||||
* skin/classic/browser/zen-icons/selectable/airplane.svg (../shared/zen-icons/common/selectable/airplane.svg)
|
* skin/classic/browser/zen-icons/selectable/airplane.svg (../shared/zen-icons/common/selectable/airplane.svg)
|
||||||
* skin/classic/browser/zen-icons/selectable/american-football.svg (../shared/zen-icons/common/selectable/american-football.svg)
|
* skin/classic/browser/zen-icons/selectable/american-football.svg (../shared/zen-icons/common/selectable/american-football.svg)
|
||||||
* skin/classic/browser/zen-icons/selectable/baseball.svg (../shared/zen-icons/common/selectable/baseball.svg)
|
* skin/classic/browser/zen-icons/selectable/baseball.svg (../shared/zen-icons/common/selectable/baseball.svg)
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
#filter dumbComments emptyLines substitution
|
|
||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="context-fill" fill-opacity="context-fill-opacity" viewBox="0 -1 20 20"><path d="M12.75 10.5a3.25 3.25 0 1 1-3.19 2.632 1.25 1.25 0 0 0-1.119 0q.059.3.059.618a3.25 3.25 0 1 1-3.25-3.25 3.24 3.24 0 0 1 2.571 1.268 2.74 2.74 0 0 1 2.357 0A3.24 3.24 0 0 1 12.75 10.5M5.25 12a1.75 1.75 0 1 0 0 3.5 1.75 1.75 0 0 0 0-3.5m7.5 0a1.75 1.75 0 1 0 0 3.5 1.75 1.75 0 0 0 0-3.5m-.867-11c.87 0 1.61.64 1.732 1.503l.34 2.393L16.78 7.72A.75.75 0 0 1 16.25 9H1.75a.751.751 0 0 1-.53-1.28l2.823-2.824.342-2.393A1.75 1.75 0 0 1 6.117 1zM3.56 7.5h10.88L12.94 6H5.06zm2.557-5a.25.25 0 0 0-.237.17l-.011.045L5.614 4.5h6.772l-.255-1.785a.25.25 0 0 0-.248-.215z"/></svg>
|
|
||||||
@@ -53,12 +53,15 @@ do_common_icons() {
|
|||||||
echo "Working on $filename"
|
echo "Working on $filename"
|
||||||
echo "* skin/classic/browser/zen-icons/$filename (../shared/zen-icons/common/$filename) " >> jar.inc.mn
|
echo "* skin/classic/browser/zen-icons/$filename (../shared/zen-icons/common/$filename) " >> jar.inc.mn
|
||||||
done
|
done
|
||||||
for filename in common/selectable/*.svg; do
|
# go through all subdirectories of common and do the same
|
||||||
# remove the os/ prefix
|
for dir in common/*/; do
|
||||||
add_header_to_file $filename
|
display_dir=$(basename $dir)
|
||||||
filename=$(basename $filename)
|
for filename in $dir/*.svg; do
|
||||||
echo "Working on $filename"
|
add_header_to_file $filename
|
||||||
echo "* skin/classic/browser/zen-icons/selectable/$filename (../shared/zen-icons/common/selectable/$filename) " >> jar.inc.mn
|
filename=$(basename $filename)
|
||||||
|
echo "Working on $filename"
|
||||||
|
echo "* skin/classic/browser/zen-icons/$display_dir/$filename (../shared/zen-icons/common/$display_dir/$filename) " >> jar.inc.mn
|
||||||
|
done
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,13 +31,12 @@ diff --git a/gfx/webrender_bindings/src/bindings.rs b/gfx/webrender_bindings/src
|
|||||||
|
|
||||||
// Ensure the WR profiler callbacks are hooked up to the Gecko profiler.
|
// Ensure the WR profiler callbacks are hooked up to the Gecko profiler.
|
||||||
set_profiler_hooks(Some(&PROFILER_HOOKS));
|
set_profiler_hooks(Some(&PROFILER_HOOKS));
|
||||||
@@ -2164,11 +2165,12 @@
|
@@ -2164,10 +2165,11 @@
|
||||||
texture_cache_config,
|
texture_cache_config,
|
||||||
reject_software_rasterizer,
|
reject_software_rasterizer,
|
||||||
low_quality_pinch_zoom,
|
low_quality_pinch_zoom,
|
||||||
max_shared_surface_size,
|
max_shared_surface_size,
|
||||||
enable_dithering,
|
enable_dithering,
|
||||||
enable_shared_instance_buffer,
|
|
||||||
+ opaque_backdrop_fallback,
|
+ opaque_backdrop_fallback,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
@@ -74,9 +73,8 @@ diff --git a/gfx/wr/webrender/src/renderer/init.rs b/gfx/wr/webrender/src/render
|
|||||||
+ /// See explanation of `gfx.webrender.opaque-backdrop-fallback`.
|
+ /// See explanation of `gfx.webrender.opaque-backdrop-fallback`.
|
||||||
+ pub opaque_backdrop_fallback: bool,
|
+ pub opaque_backdrop_fallback: bool,
|
||||||
}
|
}
|
||||||
@@ -277,10 +279,11 @@
|
@@ -277,9 +279,10 @@
|
||||||
enable_instancing: true,
|
enable_instancing: true,
|
||||||
enable_shared_instance_buffer: false,
|
|
||||||
reject_software_rasterizer: false,
|
reject_software_rasterizer: false,
|
||||||
low_quality_pinch_zoom: false,
|
low_quality_pinch_zoom: false,
|
||||||
max_shared_surface_size: 2048,
|
max_shared_surface_size: 2048,
|
||||||
@@ -86,13 +84,12 @@ diff --git a/gfx/wr/webrender/src/renderer/init.rs b/gfx/wr/webrender/src/render
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -802,11 +805,12 @@
|
@@ -802,10 +805,11 @@
|
||||||
allocated_native_surfaces: FastHashSet::default(),
|
allocated_native_surfaces: FastHashSet::default(),
|
||||||
debug_overlay_state: DebugOverlayState::new(),
|
debug_overlay_state: DebugOverlayState::new(),
|
||||||
buffer_damage_tracker: BufferDamageTracker::default(),
|
buffer_damage_tracker: BufferDamageTracker::default(),
|
||||||
max_primitive_instance_count,
|
max_primitive_instance_count,
|
||||||
enable_instancing: options.enable_instancing,
|
enable_instancing: options.enable_instancing,
|
||||||
use_shared_instance_buffer,
|
|
||||||
+ opaque_backdrop_fallback: options.opaque_backdrop_fallback,
|
+ opaque_backdrop_fallback: options.opaque_backdrop_fallback,
|
||||||
consecutive_oom_frames: 0,
|
consecutive_oom_frames: 0,
|
||||||
target_frame_publish_id: None,
|
target_frame_publish_id: None,
|
||||||
@@ -102,14 +99,11 @@ diff --git a/gfx/wr/webrender/src/renderer/init.rs b/gfx/wr/webrender/src/render
|
|||||||
diff --git a/gfx/wr/webrender/src/renderer/mod.rs b/gfx/wr/webrender/src/renderer/mod.rs
|
diff --git a/gfx/wr/webrender/src/renderer/mod.rs b/gfx/wr/webrender/src/renderer/mod.rs
|
||||||
--- a/gfx/wr/webrender/src/renderer/mod.rs
|
--- a/gfx/wr/webrender/src/renderer/mod.rs
|
||||||
+++ b/gfx/wr/webrender/src/renderer/mod.rs
|
+++ b/gfx/wr/webrender/src/renderer/mod.rs
|
||||||
@@ -867,13 +867,15 @@
|
@@ -867,10 +867,12 @@
|
||||||
buffer_damage_tracker: BufferDamageTracker,
|
buffer_damage_tracker: BufferDamageTracker,
|
||||||
|
|
||||||
max_primitive_instance_count: usize,
|
max_primitive_instance_count: usize,
|
||||||
enable_instancing: bool,
|
enable_instancing: bool,
|
||||||
/// If true, stream instance data into large buffers shared by multiple
|
|
||||||
/// draws, rather than allocating a new instance buffer for each draw.
|
|
||||||
use_shared_instance_buffer: bool,
|
|
||||||
|
|
||||||
+ opaque_backdrop_fallback: bool,
|
+ opaque_backdrop_fallback: bool,
|
||||||
+
|
+
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ diff --git a/docshell/shistory/SessionHistoryEntry.cpp b/docshell/shistory/Sessi
|
|||||||
: mURI(aLoadState->URI()),
|
: mURI(aLoadState->URI()),
|
||||||
mOriginalURI(aLoadState->OriginalURI()),
|
mOriginalURI(aLoadState->OriginalURI()),
|
||||||
mResultPrincipalURI(aLoadState->ResultPrincipalURI()),
|
mResultPrincipalURI(aLoadState->ResultPrincipalURI()),
|
||||||
@@ -59,11 +67,12 @@
|
@@ -59,9 +67,10 @@
|
||||||
mLoadReplace(aLoadState->LoadReplace()),
|
mLoadReplace(aLoadState->LoadReplace()),
|
||||||
mHasUserActivation(aLoadState->HasValidUserGestureActivation()),
|
mHasUserActivation(aLoadState->HasValidUserGestureActivation()),
|
||||||
mSharedState(SharedState::Create(
|
mSharedState(SharedState::Create(
|
||||||
@@ -148,8 +148,6 @@ diff --git a/docshell/shistory/SessionHistoryEntry.cpp b/docshell/shistory/Sessi
|
|||||||
+ aLoadState->PolicyContainer()),
|
+ aLoadState->PolicyContainer()),
|
||||||
/* FIXME Is this correct? */
|
/* FIXME Is this correct? */
|
||||||
aLoadState->TypeHint())) {
|
aLoadState->TypeHint())) {
|
||||||
MOZ_DIAGNOSTIC_ASSERT(!mURI->SchemeIs("javascript"));
|
|
||||||
|
|
||||||
// Pull the upload stream off of the channel instead of the load state, as
|
// Pull the upload stream off of the channel instead of the load state, as
|
||||||
@@ -124,11 +133,12 @@
|
@@ -124,11 +133,12 @@
|
||||||
loadInfo->GetPrincipalToInherit(
|
loadInfo->GetPrincipalToInherit(
|
||||||
|
|||||||
@@ -1,24 +1,7 @@
|
|||||||
diff --git a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs b/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
|
diff --git a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs b/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
|
||||||
--- a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
|
--- a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
|
||||||
+++ b/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
|
+++ b/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
|
||||||
@@ -39,10 +39,16 @@
|
@@ -119,10 +119,19 @@
|
||||||
const TOGGLE_POSITION_PREF =
|
|
||||||
"media.videocontrols.picture-in-picture.video-toggle.position";
|
|
||||||
const TOGGLE_POSITION_RIGHT = "right";
|
|
||||||
const TOGGLE_POSITION_LEFT = "left";
|
|
||||||
const RESIZE_MARGIN_PX = 16;
|
|
||||||
+// Close reasons that should suppress auto-toggle when the originating tab is backgrounded
|
|
||||||
+const DELIBERATE_CLOSE_REASONS = [
|
|
||||||
+ "CloseButton",
|
|
||||||
+ "ClosePlayerShortcut",
|
|
||||||
+ "Shortcut",
|
|
||||||
+];
|
|
||||||
|
|
||||||
XPCOMUtils.defineLazyPreferenceGetter(
|
|
||||||
lazy,
|
|
||||||
"PIP_ENABLED",
|
|
||||||
"media.videocontrols.picture-in-picture.enabled",
|
|
||||||
@@ -119,10 +125,19 @@
|
|
||||||
}
|
}
|
||||||
case "PictureInPicture:VideoTabHidden": {
|
case "PictureInPicture:VideoTabHidden": {
|
||||||
if (!lazy.PIP_ENABLED || !lazy.PIP_WHEN_SWITCHING_TABS) {
|
if (!lazy.PIP_ENABLED || !lazy.PIP_WHEN_SWITCHING_TABS) {
|
||||||
@@ -38,13 +21,12 @@ diff --git a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs b/tool
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
let actor = browsingContext.currentWindowGlobal.getActor(
|
let actor = browsingContext.currentWindowGlobal.getActor(
|
||||||
@@ -261,10 +276,13 @@
|
@@ -261,10 +270,12 @@
|
||||||
maxConcurrentPlayerCount: 0,
|
maxConcurrentPlayerCount: 0,
|
||||||
|
|
||||||
// Maps auto pip browser to PictureInPictureParent actor
|
// Maps auto pip browser to PictureInPictureParent actor
|
||||||
weakAutoPipBrowserToParent: new WeakMap(),
|
weakAutoPipBrowserToParent: new WeakMap(),
|
||||||
|
|
||||||
+ // Browsers with deliberately closed PiP windows; suppresses auto-toggle.
|
|
||||||
+ weakAutoPipBrowserClosedDeliberately: new WeakSet(),
|
+ weakAutoPipBrowserClosedDeliberately: new WeakSet(),
|
||||||
+
|
+
|
||||||
/**
|
/**
|
||||||
@@ -52,28 +34,7 @@ diff --git a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs b/tool
|
|||||||
*
|
*
|
||||||
* @param {PictureInPictureParent} pipActorRef
|
* @param {PictureInPictureParent} pipActorRef
|
||||||
* Reference to the calling PictureInPictureParent actor
|
* Reference to the calling PictureInPictureParent actor
|
||||||
@@ -441,10 +459,20 @@
|
@@ -899,10 +910,17 @@
|
||||||
},
|
|
||||||
|
|
||||||
onPipSwappedBrowsers(event) {
|
|
||||||
let otherTab = event.detail;
|
|
||||||
if (otherTab) {
|
|
||||||
+ if (
|
|
||||||
+ this.weakAutoPipBrowserClosedDeliberately.has(
|
|
||||||
+ event.target.linkedBrowser
|
|
||||||
+ )
|
|
||||||
+ ) {
|
|
||||||
+ this.weakAutoPipBrowserClosedDeliberately.add(otherTab.linkedBrowser);
|
|
||||||
+ this.weakAutoPipBrowserClosedDeliberately.delete(
|
|
||||||
+ event.target.linkedBrowser
|
|
||||||
+ );
|
|
||||||
+ }
|
|
||||||
for (let win of Services.wm.getEnumerator(WINDOW_TYPE)) {
|
|
||||||
if (this.weakWinToBrowser.get(win) === event.target.linkedBrowser) {
|
|
||||||
this.weakWinToBrowser.set(win, otherTab.linkedBrowser);
|
|
||||||
this.removePiPBrowserFromWeakMap(event.target.linkedBrowser);
|
|
||||||
this.removeOriginatingWinFromWeakMap(event.target.linkedBrowser);
|
|
||||||
@@ -899,10 +927,20 @@
|
|
||||||
const { reason, actorRef } = closeData;
|
const { reason, actorRef } = closeData;
|
||||||
const win = this.getWeakPipPlayer(actorRef);
|
const win = this.getWeakPipPlayer(actorRef);
|
||||||
if (!win) {
|
if (!win) {
|
||||||
@@ -82,11 +43,8 @@ diff --git a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs b/tool
|
|||||||
+
|
+
|
||||||
+ const browser = this.weakWinToBrowser.get(win);
|
+ const browser = this.weakWinToBrowser.get(win);
|
||||||
+
|
+
|
||||||
+ if (browser && DELIBERATE_CLOSE_REASONS.includes(reason)) {
|
+ if (reason === "CloseButton") {
|
||||||
+ const tabbrowser = browser.getTabBrowser();
|
+ PictureInPicture.weakAutoPipBrowserClosedDeliberately.add(browser);
|
||||||
+ if (tabbrowser && tabbrowser.selectedBrowser != browser) {
|
|
||||||
+ PictureInPicture.weakAutoPipBrowserClosedDeliberately.add(browser);
|
|
||||||
+ }
|
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
this.removePiPBrowserFromWeakMap(this.weakWinToBrowser.get(win));
|
this.removePiPBrowserFromWeakMap(this.weakWinToBrowser.get(win));
|
||||||
@@ -94,69 +52,4 @@ diff --git a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs b/tool
|
|||||||
|
|
||||||
Glean.pictureinpicture["closedMethod" + reason].record();
|
Glean.pictureinpicture["closedMethod" + reason].record();
|
||||||
await this.closePipWindow(win);
|
await this.closePipWindow(win);
|
||||||
diff --git a/toolkit/components/pictureinpicture/tests/browser_autotoggle.js b/toolkit/components/pictureinpicture/tests/browser_autotoggle.js
|
|
||||||
--- a/toolkit/components/pictureinpicture/tests/browser_autotoggle.js
|
|
||||||
+++ b/toolkit/components/pictureinpicture/tests/browser_autotoggle.js
|
|
||||||
@@ -297,5 +297,61 @@
|
|
||||||
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
||||||
assertNoPiPWindowsOpen();
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Tests that closing a PiP window deliberately (via Shift+ESC) while the tab is backgrounded
|
|
||||||
+ * suppresses auto-toggle, but auto-toggle works normally on the next background.
|
|
||||||
+ */
|
|
||||||
+add_task(async function autopip_suppress_on_deliberate_close() {
|
|
||||||
+ await SpecialPowers.pushPrefEnv({
|
|
||||||
+ set: [[ALWAYS_SHOW_PREF, true]],
|
|
||||||
+ });
|
|
||||||
+
|
|
||||||
+ // Open a new window and save a handle for the first tab
|
|
||||||
+ let win1 = await BrowserTestUtils.openNewBrowserWindow();
|
|
||||||
+ let firstTab = win1.gBrowser.selectedTab;
|
|
||||||
+
|
|
||||||
+ // Open a new tab containing a video
|
|
||||||
+ let pipTab = await BrowserTestUtils.openNewForegroundTab(
|
|
||||||
+ win1.gBrowser,
|
|
||||||
+ TEST_PAGE
|
|
||||||
+ );
|
|
||||||
+ let browser = pipTab.linkedBrowser;
|
|
||||||
+
|
|
||||||
+ // Ensure the video is playing
|
|
||||||
+ let videoID = "with-controls";
|
|
||||||
+ await ensureVideosReady(browser);
|
|
||||||
+ await SpecialPowers.spawn(browser, [videoID], async videoID => {
|
|
||||||
+ await content.document.getElementById(videoID).play();
|
|
||||||
+ });
|
|
||||||
+
|
|
||||||
+ // Switch from the video tab to the first tab and check if the PiP window opened
|
|
||||||
+ let domWindowOpened = BrowserTestUtils.domWindowOpenedAndLoaded(null);
|
|
||||||
+ await BrowserTestUtils.switchTab(win1.gBrowser, firstTab);
|
|
||||||
+ let pipWin = await domWindowOpened;
|
|
||||||
+ ok(pipWin, "PiP window automatically opened.");
|
|
||||||
+
|
|
||||||
+ // Close the PiP window deliberately while the tab is backgrounded and check that it doesn't reopen
|
|
||||||
+ domWindowOpened = BrowserTestUtils.domWindowOpenedAndLoaded(null);
|
|
||||||
+ // A short delay is needed to make the test more robust
|
|
||||||
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
|
|
||||||
+ await new Promise(resolve => setTimeout(resolve, 2000));
|
|
||||||
+ EventUtils.synthesizeKey("KEY_Escape", { shiftKey: true }, pipWin);
|
|
||||||
+ let reopened = await Promise.race([
|
|
||||||
+ domWindowOpened.then(() => true),
|
|
||||||
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
|
|
||||||
+ new Promise(resolve => setTimeout(() => resolve(false), 2000)),
|
|
||||||
+ ]);
|
|
||||||
+ ok(!reopened, "PiP window should not reopen after deliberate close");
|
|
||||||
+
|
|
||||||
+ // Switch to the video tab and back to the first tab, which should automatically open the PiP window
|
|
||||||
+ domWindowOpened = BrowserTestUtils.domWindowOpenedAndLoaded(null);
|
|
||||||
+ await BrowserTestUtils.switchTab(win1.gBrowser, pipTab);
|
|
||||||
+ await BrowserTestUtils.switchTab(win1.gBrowser, firstTab);
|
|
||||||
+ pipWin = await domWindowOpened;
|
|
||||||
+ ok(pipWin, "PiP window automatically opened.");
|
|
||||||
+
|
|
||||||
+ await BrowserTestUtils.closeWindow(win1);
|
|
||||||
+});
|
|
||||||
|
|
||||||
|
|||||||
@@ -44,15 +44,17 @@
|
|||||||
{
|
{
|
||||||
"type": "phabricator",
|
"type": "phabricator",
|
||||||
"id": "D320897",
|
"id": "D320897",
|
||||||
"name": "Bug 2011236"
|
"name": "Bug 2011236",
|
||||||
|
"replaces": {
|
||||||
|
// The upstream patch context includes a MOZ_DIAGNOSTIC_ASSERT that
|
||||||
|
// doesn't exist yet in our Firefox version.
|
||||||
|
"@@ -59,11 +67,12 @@": "@@ -59,9 +67,10 @@",
|
||||||
|
"aLoadState->TypeHint())) {\n MOZ_DIAGNOSTIC_ASSERT(!mURI->SchemeIs(\"javascript\"));\n \n // Pull": "aLoadState->TypeHint())) {\n // Pull"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "phabricator",
|
"type": "phabricator",
|
||||||
"id": "D321446",
|
"id": "D321446",
|
||||||
"name": "Issue 14710"
|
"name": "Issue 14710"
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "local",
|
|
||||||
"path": "firefox/css_corner_shape_rendering.patch"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
diff --git a/layout/style/StyleColor.cpp b/layout/style/StyleColor.cpp
|
diff --git a/layout/style/StyleColor.cpp b/layout/style/StyleColor.cpp
|
||||||
index f922f7fdacc7e1a14beb8da77b48aef3f6ae0b2b..47d19242baaf2a1f25ee07c6e210c839cc7b5089 100644
|
index bbee32af30f35525730a10d0b242c0e8a8fe4695..a590fff105b30bc96fa7a0d8a8d3b1d5aa997e08 100644
|
||||||
--- a/layout/style/StyleColor.cpp
|
--- a/layout/style/StyleColor.cpp
|
||||||
+++ b/layout/style/StyleColor.cpp
|
+++ b/layout/style/StyleColor.cpp
|
||||||
@@ -8,6 +8,7 @@
|
@@ -9,6 +9,7 @@
|
||||||
#include "mozilla/StyleColorInlines.h"
|
#include "mozilla/dom/BindingDeclarations.h"
|
||||||
#include "nsIFrame.h"
|
#include "nsIFrame.h"
|
||||||
#include "nsStyleStruct.h"
|
#include "nsStyleStruct.h"
|
||||||
+#include "mozilla/nsZenBoostsBackend.h"
|
+#include "mozilla/nsZenBoostsBackend.h"
|
||||||
#include "nsStyleUtil.h"
|
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
@@ -98,23 +99,24 @@ StyleAbsoluteColor StyleColor::ResolveColor(
|
|
||||||
|
@@ -96,23 +97,24 @@ StyleAbsoluteColor StyleColor::ResolveColor(
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
nscolor StyleColor::CalcColor(nscolor aColor) const {
|
nscolor StyleColor::CalcColor(nscolor aColor) const {
|
||||||
@@ -40,7 +40,7 @@ index f922f7fdacc7e1a14beb8da77b48aef3f6ae0b2b..47d19242baaf2a1f25ee07c6e210c839
|
|||||||
}
|
}
|
||||||
|
|
||||||
StyleAbsoluteColor StyleAbsoluteColor::ToColorSpace(
|
StyleAbsoluteColor StyleAbsoluteColor::ToColorSpace(
|
||||||
@@ -122,7 +124,7 @@ StyleAbsoluteColor StyleAbsoluteColor::ToColorSpace(
|
@@ -120,7 +122,7 @@ StyleAbsoluteColor StyleAbsoluteColor::ToColorSpace(
|
||||||
return Servo_ConvertColorSpace(this, aColorSpace);
|
return Servo_ConvertColorSpace(this, aColorSpace);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ index f922f7fdacc7e1a14beb8da77b48aef3f6ae0b2b..47d19242baaf2a1f25ee07c6e210c839
|
|||||||
constexpr StyleColorSpace DEST_COLOR_SPACE = StyleColorSpace::Srgb;
|
constexpr StyleColorSpace DEST_COLOR_SPACE = StyleColorSpace::Srgb;
|
||||||
|
|
||||||
constexpr float MIN = 0.0f;
|
constexpr float MIN = 0.0f;
|
||||||
@@ -164,11 +166,13 @@ nscolor StyleAbsoluteColor::ToColor() const {
|
@@ -162,11 +164,13 @@ nscolor StyleAbsoluteColor::ToColor() const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/layout/svg/SVGImageContext.h b/layout/svg/SVGImageContext.h
|
diff --git a/layout/svg/SVGImageContext.h b/layout/svg/SVGImageContext.h
|
||||||
index ad833c7c2ee6a4c4984efdb0d59e3576c2d1bc19..36864a34badc0cbfe44d6295798622fd6178f9e3 100644
|
index b1f811989697966e30859610f4fc07579d0385ab..f6f4cd5a45fc49b416111d980fab4e612788903e 100644
|
||||||
--- a/layout/svg/SVGImageContext.h
|
--- a/layout/svg/SVGImageContext.h
|
||||||
+++ b/layout/svg/SVGImageContext.h
|
+++ b/layout/svg/SVGImageContext.h
|
||||||
@@ -6,6 +6,7 @@
|
@@ -6,6 +6,7 @@
|
||||||
@@ -44,7 +44,7 @@ index ad833c7c2ee6a4c4984efdb0d59e3576c2d1bc19..36864a34badc0cbfe44d6295798622fd
|
|||||||
const Maybe<SVGPreserveAspectRatio>& GetPreserveAspectRatio() const {
|
const Maybe<SVGPreserveAspectRatio>& GetPreserveAspectRatio() const {
|
||||||
return mPreserveAspectRatio;
|
return mPreserveAspectRatio;
|
||||||
}
|
}
|
||||||
@@ -110,7 +131,11 @@ class SVGImageContext {
|
@@ -116,7 +137,11 @@ class SVGImageContext {
|
||||||
return contextPaintIsEqual && mViewportSize == aOther.mViewportSize &&
|
return contextPaintIsEqual && mViewportSize == aOther.mViewportSize &&
|
||||||
mPreserveAspectRatio == aOther.mPreserveAspectRatio &&
|
mPreserveAspectRatio == aOther.mPreserveAspectRatio &&
|
||||||
mColorScheme == aOther.mColorScheme &&
|
mColorScheme == aOther.mColorScheme &&
|
||||||
@@ -57,17 +57,17 @@ index ad833c7c2ee6a4c4984efdb0d59e3576c2d1bc19..36864a34badc0cbfe44d6295798622fd
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool operator!=(const SVGImageContext&) const = default;
|
bool operator!=(const SVGImageContext&) const = default;
|
||||||
@@ -123,7 +148,8 @@ class SVGImageContext {
|
@@ -129,7 +154,8 @@ class SVGImageContext {
|
||||||
return AddToHash(hash, mViewportSize.map(HashSize).valueOr(0),
|
return HashGeneric(hash, mViewportSize.map(HashSize).valueOr(0),
|
||||||
mPreserveAspectRatio.map(HashPAR).valueOr(0),
|
mPreserveAspectRatio.map(HashPAR).valueOr(0),
|
||||||
mColorScheme.map(HashColorScheme).valueOr(0),
|
mColorScheme.map(HashColorScheme).valueOr(0),
|
||||||
- HashLinkParameters(mLinkParameters));
|
- HashLinkParameters(mLinkParameters));
|
||||||
+ HashLinkParameters(mLinkParameters), mZenBoostsAccent,
|
+ HashLinkParameters(mLinkParameters), mZenBoostsAccent,
|
||||||
+ mZenBoostsComplementaryRotation, mZenBoostsInverted);
|
+ mZenBoostsComplementaryRotation, mZenBoostsInverted);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -156,6 +182,9 @@ class SVGImageContext {
|
@@ -167,6 +193,9 @@ class SVGImageContext {
|
||||||
Maybe<SVGPreserveAspectRatio> mPreserveAspectRatio;
|
Maybe<SVGPreserveAspectRatio> mPreserveAspectRatio;
|
||||||
Maybe<ColorScheme> mColorScheme;
|
Maybe<ColorScheme> mColorScheme;
|
||||||
StyleLinkParameters mLinkParameters;
|
StyleLinkParameters mLinkParameters;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/toolkit/content/widgets/moz-toggle/moz-toggle.tokens.css b/toolkit/content/widgets/moz-toggle/moz-toggle.tokens.css
|
diff --git a/toolkit/content/widgets/moz-toggle/moz-toggle.tokens.css b/toolkit/content/widgets/moz-toggle/moz-toggle.tokens.css
|
||||||
index c0976c54418a28046802443931042bd285aefbde..2adb18d25edbb8aac4e396fcfc64a4a664607836 100644
|
index 6247d7a3923a6fedd4ec9911aba309ce565cd498..744e670eccc936dde664aa07df3e87bdcafd5e48 100644
|
||||||
--- a/toolkit/content/widgets/moz-toggle/moz-toggle.tokens.css
|
--- a/toolkit/content/widgets/moz-toggle/moz-toggle.tokens.css
|
||||||
+++ b/toolkit/content/widgets/moz-toggle/moz-toggle.tokens.css
|
+++ b/toolkit/content/widgets/moz-toggle/moz-toggle.tokens.css
|
||||||
@@ -13,8 +13,8 @@
|
@@ -13,8 +13,8 @@
|
||||||
@@ -11,5 +11,5 @@ index c0976c54418a28046802443931042bd285aefbde..2adb18d25edbb8aac4e396fcfc64a4a6
|
|||||||
+ --toggle-background-color-pressed: var(--zen-primary-color);
|
+ --toggle-background-color-pressed: var(--zen-primary-color);
|
||||||
+ --toggle-background-color-pressed-hover: var(--zen-colors-hover-bg);
|
+ --toggle-background-color-pressed-hover: var(--zen-colors-hover-bg);
|
||||||
--toggle-background-color-pressed-active: var(--color-accent-primary-active);
|
--toggle-background-color-pressed-active: var(--color-accent-primary-active);
|
||||||
--toggle-border-color: light-dark(var(--color-gray-70), var(--border-color-interactive));
|
--toggle-border-color: var(--border-color-interactive);
|
||||||
--toggle-border-color-hover: var(--toggle-border-color);
|
--toggle-border-color-hover: var(--toggle-border-color);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/toolkit/themes/shared/design-system/dist/tokens-shared.css b/toolkit/themes/shared/design-system/dist/tokens-shared.css
|
diff --git a/toolkit/themes/shared/design-system/dist/tokens-shared.css b/toolkit/themes/shared/design-system/dist/tokens-shared.css
|
||||||
index 63c641f560d4c0ce06b40a652ca99d1c48cd6941..39c81e773a442870763396e68fb57bd336e3625a 100644
|
index 15c0d98a18b4f19e7f2e03d2b78066b0353f416a..b32f6244c7a07e93894bab422691a605456034a1 100644
|
||||||
--- a/toolkit/themes/shared/design-system/dist/tokens-shared.css
|
--- a/toolkit/themes/shared/design-system/dist/tokens-shared.css
|
||||||
+++ b/toolkit/themes/shared/design-system/dist/tokens-shared.css
|
+++ b/toolkit/themes/shared/design-system/dist/tokens-shared.css
|
||||||
@@ -7,6 +7,8 @@
|
@@ -7,6 +7,8 @@
|
||||||
@@ -11,22 +11,7 @@ index 63c641f560d4c0ce06b40a652ca99d1c48cd6941..39c81e773a442870763396e68fb57bd3
|
|||||||
@layer tokens-foundation {
|
@layer tokens-foundation {
|
||||||
:root,
|
:root,
|
||||||
:host(.anonymous-content-host) {
|
:host(.anonymous-content-host) {
|
||||||
@@ -28,10 +30,10 @@
|
@@ -424,8 +426,8 @@
|
||||||
--border-color-selected: var(--color-accent-primary);
|
|
||||||
--border-color-transparent: transparent;
|
|
||||||
--border-radius-circle: 9999px;
|
|
||||||
- --border-radius-xsmall: 2px;
|
|
||||||
- --border-radius-small: 4px;
|
|
||||||
- --border-radius-medium: 8px;
|
|
||||||
- --border-radius-large: 16px;
|
|
||||||
+ --border-radius-xsmall: calc(2px * var(--zen-squircle-value));
|
|
||||||
+ --border-radius-small: calc(4px * var(--zen-squircle-value));
|
|
||||||
+ --border-radius-medium: calc(8px * var(--zen-squircle-value));
|
|
||||||
+ --border-radius-large: calc(16px * var(--zen-squircle-value));
|
|
||||||
--border-width: 1px;
|
|
||||||
|
|
||||||
/** box-shadow **/
|
|
||||||
@@ -477,8 +479,8 @@
|
|
||||||
--panel-background-color-dimmed-further: var(--background-color-dimmed-further);
|
--panel-background-color-dimmed-further: var(--background-color-dimmed-further);
|
||||||
--panel-border-color: light-dark(rgb(240, 240, 244), rgb(82, 82, 94));
|
--panel-border-color: light-dark(rgb(240, 240, 244), rgb(82, 82, 94));
|
||||||
--panel-border-radius: var(--border-radius-medium);
|
--panel-border-radius: var(--border-radius-medium);
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
diff --git a/widget/cocoa/nsCocoaWindow.h b/widget/cocoa/nsCocoaWindow.h
|
diff --git a/widget/cocoa/nsCocoaWindow.h b/widget/cocoa/nsCocoaWindow.h
|
||||||
index 22a2a7ef3a5e9257c8bb00ba6a55e8d39d2abbd9..6d8353fd11921585f7101f5717bdb3dd8f2a5eae 100644
|
index 312011c1c2ac41e78affecbdef25d72766a7c882..e5865c7d6259f0a3df48edf7a26b1b75a23cdb3a 100644
|
||||||
--- a/widget/cocoa/nsCocoaWindow.h
|
--- a/widget/cocoa/nsCocoaWindow.h
|
||||||
+++ b/widget/cocoa/nsCocoaWindow.h
|
+++ b/widget/cocoa/nsCocoaWindow.h
|
||||||
@@ -461,6 +461,10 @@ class nsCocoaWindow final : public nsIWidget {
|
@@ -462,6 +462,10 @@ class nsCocoaWindow final : public nsIWidget {
|
||||||
void SetHideTitlebarSeparator(bool) override;
|
void SetHideTitlebarSeparator(bool) override;
|
||||||
bool IsMacTitlebarDirectionRTL() override;
|
bool IsMacTitlebarDirectionRTL() override;
|
||||||
void SetCustomTitlebar(bool) override;
|
void SetCustomTitlebar(bool) override;
|
||||||
@@ -13,9 +13,9 @@ index 22a2a7ef3a5e9257c8bb00ba6a55e8d39d2abbd9..6d8353fd11921585f7101f5717bdb3dd
|
|||||||
void UpdateThemeGeometries(
|
void UpdateThemeGeometries(
|
||||||
const nsTArray<ThemeGeometry>& aThemeGeometries) override;
|
const nsTArray<ThemeGeometry>& aThemeGeometries) override;
|
||||||
void LockAspectRatio(bool aShouldLock) override;
|
void LockAspectRatio(bool aShouldLock) override;
|
||||||
@@ -674,6 +678,7 @@ class nsCocoaWindow final : public nsIWidget {
|
@@ -672,6 +676,7 @@ class nsCocoaWindow final : public nsIWidget {
|
||||||
// show (e.g. a window created by detaching a tab from a fullscreen window).
|
bool mAspectRatioLocked = false;
|
||||||
bool mIsInitialFullscreenSuppressed = false;
|
bool mIsAlert = false; // True if this is an non-native alert window.
|
||||||
bool mWasShown = false;
|
bool mWasShown = false;
|
||||||
+ bool mIsBrowserWindow = false;
|
+ bool mIsBrowserWindow = false;
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
diff --git a/widget/gtk/nsDragSessionSource.cpp b/widget/gtk/nsDragSessionSource.cpp
|
diff --git a/widget/gtk/nsDragService.cpp b/widget/gtk/nsDragService.cpp
|
||||||
index a5f67d700f8c80d513f08cc25405b57cf28a2a9a..58186470bcbb7b1eda34ee20a19e29d540ab052a 100644
|
index f760a6bb887b321376761431886c771f14fd03af..d52110ba52a95ef7c7bfb915e120b8dd636c9448 100644
|
||||||
--- a/widget/gtk/nsDragSessionSource.cpp
|
--- a/widget/gtk/nsDragService.cpp
|
||||||
+++ b/widget/gtk/nsDragSessionSource.cpp
|
+++ b/widget/gtk/nsDragService.cpp
|
||||||
@@ -13,6 +13,7 @@
|
@@ -23,6 +23,7 @@
|
||||||
#include "mozilla/Services.h"
|
|
||||||
#include "mozilla/StaticPrefs_widget.h"
|
#include "mozilla/StaticPrefs_widget.h"
|
||||||
|
#include "mozilla/WidgetUtils.h"
|
||||||
#include "mozilla/WidgetUtilsGtk.h"
|
#include "mozilla/WidgetUtilsGtk.h"
|
||||||
+#include "mozilla/nsZenDragAndDrop.h"
|
+#include "mozilla/nsZenDragAndDrop.h"
|
||||||
#include "nsAppShell.h"
|
#include "nsAppShell.h"
|
||||||
#include "nsArrayUtils.h"
|
#include "nsArrayUtils.h"
|
||||||
#include "nsCRT.h"
|
#include "nsCRT.h"
|
||||||
@@ -1196,11 +1197,15 @@ bool nsDragSessionSource::SetAlphaPixmap(SourceSurface* aSurface,
|
@@ -2304,11 +2305,15 @@ bool nsDragSession::SetAlphaPixmap(SourceSurface* aSurface,
|
||||||
cairo_image_surface_get_stride(surf), SurfaceFormat::B8G8R8A8);
|
cairo_image_surface_get_stride(surf), SurfaceFormat::B8G8R8A8);
|
||||||
if (!dt) return false;
|
if (!dt) return false;
|
||||||
|
|
||||||
@@ -49,9 +49,9 @@
|
|||||||
<vbox flex="1" id="zen-boost-filter-wrapper">
|
<vbox flex="1" id="zen-boost-filter-wrapper">
|
||||||
<hbox class="zen-boost-color-picker-gradient zen-boost-panel-disabled">
|
<hbox class="zen-boost-color-picker-gradient zen-boost-panel-disabled">
|
||||||
<button data-l10n-id="zen-boost-magic-theme" id="zen-boost-magic-theme" class="subviewbutton mod-button"></button>
|
<button data-l10n-id="zen-boost-magic-theme" id="zen-boost-magic-theme" class="subviewbutton mod-button"></button>
|
||||||
<html:div id="zen-boost-color-picker-dot-primary" class="zen-boost-color-picker-dot no-squircles"></html:div>
|
<html:div id="zen-boost-color-picker-dot-primary" class="zen-boost-color-picker-dot"></html:div>
|
||||||
<html:div id="zen-boost-color-picker-dot-secondary" class="zen-boost-color-picker-dot no-squircles"></html:div>
|
<html:div id="zen-boost-color-picker-dot-secondary" class="zen-boost-color-picker-dot"></html:div>
|
||||||
<html:div class="zen-boost-color-picker-circle no-squircles"></html:div>
|
<html:div class="zen-boost-color-picker-circle"></html:div>
|
||||||
</hbox>
|
</hbox>
|
||||||
|
|
||||||
<hbox flex="1" id="zen-boost-toolbar-wrapper-colors">
|
<hbox flex="1" id="zen-boost-toolbar-wrapper-colors">
|
||||||
|
|||||||
@@ -194,8 +194,7 @@ body {
|
|||||||
max-height: 40px;
|
max-height: 40px;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background-color: var(--zen-boosts-secondary-background);
|
background-color: var(--zen-boosts-secondary-background);
|
||||||
border: solid 1px transparent;
|
border: solid 1px var(--zen-boosts-primary-border-color);
|
||||||
border-bottom-color: var(--zen-boosts-primary-border-color);
|
|
||||||
|
|
||||||
@media (-moz-windows-mica) {
|
@media (-moz-windows-mica) {
|
||||||
background-color: var(--zen-boosts-mica-background);
|
background-color: var(--zen-boosts-mica-background);
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
"chrome://browser/content/zen-components/ZenEmojiPicker.mjs",
|
"chrome://browser/content/zen-components/ZenEmojiPicker.mjs",
|
||||||
"chrome://browser/content/zen-components/ZenLiveFoldersUI.mjs",
|
"chrome://browser/content/zen-components/ZenLiveFoldersUI.mjs",
|
||||||
"chrome://browser/content/zen-components/ZenDownloadAnimation.mjs",
|
"chrome://browser/content/zen-components/ZenDownloadAnimation.mjs",
|
||||||
|
"moz-src:///zen/library/ZenLibraryButton.mjs",
|
||||||
];
|
];
|
||||||
|
|
||||||
for (let script of scripts) {
|
for (let script of scripts) {
|
||||||
|
|||||||
@@ -543,10 +543,6 @@ window.gZenUIManager = {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (document.documentElement.hasAttribute("zen-welcome-stage")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const shouldOpenURLBar =
|
const shouldOpenURLBar =
|
||||||
overridePreferance ||
|
overridePreferance ||
|
||||||
(gZenVerticalTabsManager._canReplaceNewTab &&
|
(gZenVerticalTabsManager._canReplaceNewTab &&
|
||||||
@@ -868,6 +864,7 @@ window.gZenUIManager = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
panelUIPosition(panel, anchor) {
|
panelUIPosition(panel, anchor) {
|
||||||
|
void panel;
|
||||||
// The alignment position of the panel is determined during the "popuppositioned" event
|
// The alignment position of the panel is determined during the "popuppositioned" event
|
||||||
// when the panel opens. The alignment positions help us determine in which orientation
|
// when the panel opens. The alignment positions help us determine in which orientation
|
||||||
// the panel is anchored to the screen space.
|
// the panel is anchored to the screen space.
|
||||||
@@ -1351,21 +1348,18 @@ window.gZenVerticalTabsManager = {
|
|||||||
document.documentElement.removeAttribute("zen-right-side");
|
document.documentElement.removeAttribute("zen-right-side");
|
||||||
}
|
}
|
||||||
|
|
||||||
const wasSidebarExpanded = document.documentElement.hasAttribute(
|
delete this._hadSidebarCollapse;
|
||||||
"zen-sidebar-expanded"
|
if (isSidebarExpanded) {
|
||||||
);
|
this._hadSidebarCollapse = !document.documentElement.hasAttribute(
|
||||||
if (isSidebarExpanded !== wasSidebarExpanded) {
|
"zen-sidebar-expanded"
|
||||||
delete this._hadSidebarCollapse;
|
);
|
||||||
if (isSidebarExpanded) {
|
this.navigatorToolbox.setAttribute("zen-sidebar-expanded", "true");
|
||||||
this._hadSidebarCollapse = true;
|
document.documentElement.setAttribute("zen-sidebar-expanded", "true");
|
||||||
this.navigatorToolbox.setAttribute("zen-sidebar-expanded", "true");
|
gBrowser.tabContainer.setAttribute("expanded", "true");
|
||||||
document.documentElement.setAttribute("zen-sidebar-expanded", "true");
|
} else {
|
||||||
gBrowser.tabContainer.setAttribute("expanded", "true");
|
this.navigatorToolbox.removeAttribute("zen-sidebar-expanded");
|
||||||
} else {
|
document.documentElement.removeAttribute("zen-sidebar-expanded");
|
||||||
this.navigatorToolbox.removeAttribute("zen-sidebar-expanded");
|
gBrowser.tabContainer.removeAttribute("expanded");
|
||||||
document.documentElement.removeAttribute("zen-sidebar-expanded");
|
|
||||||
gBrowser.tabContainer.removeAttribute("expanded");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const appContentNavbarContaienr = document.getElementById(
|
const appContentNavbarContaienr = document.getElementById(
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ dialog::part(dialog-button) {
|
|||||||
|
|
||||||
position: relative;
|
position: relative;
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: calc(10px * var(--zen-squircle-value));
|
border-radius: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (-moz-platform: macos) {
|
@media (-moz-platform: macos) {
|
||||||
|
|||||||
@@ -18,11 +18,11 @@
|
|||||||
|
|
||||||
.urlbar {
|
.urlbar {
|
||||||
--urlbarview-separator-color: light-dark(hsl(0, 0%, 80%), hsl(0, 0%, 20%));
|
--urlbarview-separator-color: light-dark(hsl(0, 0%, 80%), hsl(0, 0%, 20%));
|
||||||
--urlbarview-background-color-hover: var(--toolbarbutton-background-color-hover);
|
--urlbarview-background-color-hover: var(--toolbarbutton-hover-background);
|
||||||
border-radius: calc(var(--toolbarbutton-border-radius) - 2px);
|
border-radius: calc(var(--toolbarbutton-border-radius) - 2px);
|
||||||
|
height: var(--urlbar-height);
|
||||||
--urlbarView-results-padding: 10px !important;
|
--urlbarView-results-padding: 10px !important;
|
||||||
--urlbar-container-height: 48px !important;
|
--urlbar-container-height: 48px !important;
|
||||||
--urlbar-input-container-border: none;
|
|
||||||
|
|
||||||
--urlbar-margin-inline: 5px;
|
--urlbar-margin-inline: 5px;
|
||||||
--urlbar-container-padding: 4px;
|
--urlbar-container-padding: 4px;
|
||||||
@@ -60,9 +60,6 @@
|
|||||||
.urlbar-background {
|
.urlbar-background {
|
||||||
background: var(--zen-toolbar-element-bg) !important;
|
background: var(--zen-toolbar-element-bg) !important;
|
||||||
border-radius: var(--border-radius-medium);
|
border-radius: var(--border-radius-medium);
|
||||||
:root:not([zen-single-toolbar="true"]) & {
|
|
||||||
border-radius: calc(var(--border-radius-medium) * var(--zen-squircle-value));
|
|
||||||
}
|
|
||||||
outline: none !important;
|
outline: none !important;
|
||||||
|
|
||||||
#urlbar:not([breakout-extend]) & {
|
#urlbar:not([breakout-extend]) & {
|
||||||
@@ -139,13 +136,8 @@
|
|||||||
|
|
||||||
& #identity-box {
|
& #identity-box {
|
||||||
margin-inline-end: 0 !important;
|
margin-inline-end: 0 !important;
|
||||||
|
|
||||||
:root[zen-has-empty-tab="true"] &[pageproxystate="invalid"]:not(.chromeUI) {
|
|
||||||
margin-inline-end: -4px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.chromeUI:not([pageproxystate="invalid"]) #identity-icon-box {
|
&.chromeUI:not([pageproxystate="invalid"]) #identity-icon-box {
|
||||||
border-radius: calc(10px * var(--zen-squircle-value)) !important;
|
border-radius: 10px !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,9 +166,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
:root:not([zen-single-toolbar="true"]):not([zen-has-empty-tab="true"]) #urlbar:not([breakout-extend]) .urlbar-input-container {
|
:root:not([zen-single-toolbar="true"]):not([zen-has-empty-tab="true"]) #urlbar:not([breakout-extend]) .urlbar-input-container {
|
||||||
padding: 2px 5px;
|
padding: 2px 3px;
|
||||||
gap: 2px;
|
gap: 2px;
|
||||||
|
|
||||||
|
& .urlbar-page-action {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
& #zen-copy-url-button {
|
& #zen-copy-url-button {
|
||||||
order: -1;
|
order: -1;
|
||||||
}
|
}
|
||||||
@@ -330,7 +326,6 @@
|
|||||||
order: 2;
|
order: 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* stylelint-disable-next-line stylelint-plugin-mozilla/no-has-selector */
|
|
||||||
#notification-popup-box:not([open]):not(:has(> [showing="true"])) {
|
#notification-popup-box:not([open]):not(:has(> [showing="true"])) {
|
||||||
margin-inline-start: calc(-10px - 2 * var(--urlbar-icon-padding));
|
margin-inline-start: calc(-10px - 2 * var(--urlbar-icon-padding));
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
@@ -351,7 +346,7 @@
|
|||||||
padding: 4px !important;
|
padding: 4px !important;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background: var(--toolbarbutton-background-color-hover);
|
background: var(--toolbarbutton-hover-background);
|
||||||
border-radius: var(--toolbarbutton-border-radius);
|
border-radius: var(--toolbarbutton-border-radius);
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
}
|
}
|
||||||
@@ -410,7 +405,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
#notification-popup-box {
|
#notification-popup-box {
|
||||||
border-radius: calc(10px * var(--zen-squircle-value)) !important;
|
border-radius: 10px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Border radius on hover */
|
/* Border radius on hover */
|
||||||
@@ -492,10 +487,9 @@
|
|||||||
translate: -50% 0%;
|
translate: -50% 0%;
|
||||||
left: 50% !important;
|
left: 50% !important;
|
||||||
|
|
||||||
/* stylelint-disable-next-line stylelint-plugin-mozilla/no-has-selector */
|
|
||||||
#urlbar-container:has(&) {
|
#urlbar-container:has(&) {
|
||||||
border-radius: var(--border-radius-medium);
|
border-radius: var(--border-radius-medium);
|
||||||
background: var(--toolbarbutton-background-color-hover);
|
background: var(--toolbarbutton-hover-background);
|
||||||
height: var(--urlbar-height) !important;
|
height: var(--urlbar-height) !important;
|
||||||
margin-inline: 0.15rem !important;
|
margin-inline: 0.15rem !important;
|
||||||
:root:not([zen-single-toolbar="true"]) & {
|
:root:not([zen-single-toolbar="true"]) & {
|
||||||
@@ -639,7 +633,6 @@
|
|||||||
|
|
||||||
#urlbar-label-box,
|
#urlbar-label-box,
|
||||||
#urlbar-search-mode-indicator {
|
#urlbar-search-mode-indicator {
|
||||||
--urlbar-basic-component-size: auto;
|
|
||||||
background-color: color-mix(in srgb, var(--zen-primary-color) 50%, light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.2)) 50%) !important;
|
background-color: color-mix(in srgb, var(--zen-primary-color) 50%, light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.2)) 50%) !important;
|
||||||
color: white;
|
color: white;
|
||||||
padding: 4px 8px;
|
padding: 4px 8px;
|
||||||
@@ -705,7 +698,7 @@
|
|||||||
|
|
||||||
:root:not([zen-single-toolbar="true"]) #urlbar[breakout-extend]:not([zen-floating-urlbar="true"]) {
|
:root:not([zen-single-toolbar="true"]) #urlbar[breakout-extend]:not([zen-floating-urlbar="true"]) {
|
||||||
& .urlbar-background {
|
& .urlbar-background {
|
||||||
border-radius: calc(10px * var(--zen-squircle-value)) !important;
|
border-radius: 10px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
#urlbar-results {
|
#urlbar-results {
|
||||||
@@ -724,10 +717,6 @@
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.urlbarView {
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
#urlbar-search-mode-indicator-title {
|
#urlbar-search-mode-indicator-title {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
.dialogBox {
|
.dialogBox {
|
||||||
border-radius: calc(12px * var(--zen-squircle-value)) !important;
|
border-radius: 12px !important;
|
||||||
border: 0.5px solid light-dark(rgba(0, 0, 0, 0.4), var(--zen-dialog-background)) !important;
|
border: 0.5px solid light-dark(rgba(0, 0, 0, 0.4), var(--zen-dialog-background)) !important;
|
||||||
outline: 1px solid light-dark(transparent, rgba(168, 168, 169, 0.50)) !important;
|
outline: 1px solid light-dark(transparent, rgba(168, 168, 169, 0.50)) !important;
|
||||||
box-shadow: 0 10px 8px rgba(0, 0 , 0, 0.15) !important;
|
box-shadow: 0 10px 8px rgba(0, 0 , 0, 0.15) !important;
|
||||||
|
|||||||
@@ -335,7 +335,7 @@ menuseparator {
|
|||||||
gap: 8px;
|
gap: 8px;
|
||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
padding: var(--zen-toast-padding);
|
padding: var(--zen-toast-padding);
|
||||||
border-radius: 14px;
|
border-radius: 10px;
|
||||||
background: linear-gradient(to bottom, var(--zen-primary-color) -40%, color-mix(in srgb, var(--zen-primary-color), #0f0f0f 20%));
|
background: linear-gradient(to bottom, var(--zen-primary-color) -40%, color-mix(in srgb, var(--zen-primary-color), #0f0f0f 20%));
|
||||||
box-shadow: light-dark(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.4)) 0 0 22px 2px;
|
box-shadow: light-dark(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.4)) 0 0 22px 2px;
|
||||||
border: none;
|
border: none;
|
||||||
@@ -374,7 +374,7 @@ menuseparator {
|
|||||||
min-width: unset !important;
|
min-width: unset !important;
|
||||||
min-height: 28px;
|
min-height: 28px;
|
||||||
margin: 0 !important;
|
margin: 0 !important;
|
||||||
border-radius: 10px !important;
|
border-radius: 6px !important;
|
||||||
border-top: 2px solid light-dark(transparent, rgba(255, 255, 255, 0.1));
|
border-top: 2px solid light-dark(transparent, rgba(255, 255, 255, 0.1));
|
||||||
color: light-dark(rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0.8)) !important;
|
color: light-dark(rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0.8)) !important;
|
||||||
box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.05);
|
box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.05);
|
||||||
|
|||||||
@@ -185,7 +185,7 @@
|
|||||||
.toolbarbutton-1:not(#tabs-newtab-button),
|
.toolbarbutton-1:not(#tabs-newtab-button),
|
||||||
.urlbar-page-action,
|
.urlbar-page-action,
|
||||||
.identity-box-button {
|
.identity-box-button {
|
||||||
--tab-border-radius: 8px;
|
--tab-border-radius: 6px;
|
||||||
--toolbarbutton-border-radius: var(--tab-border-radius);
|
--toolbarbutton-border-radius: var(--tab-border-radius);
|
||||||
--toolbarbutton-padding-inner: 6px;
|
--toolbarbutton-padding-inner: 6px;
|
||||||
--toolbarbutton-padding-outer: 1px;
|
--toolbarbutton-padding-outer: 1px;
|
||||||
@@ -291,7 +291,7 @@
|
|||||||
--panel-width: 234px;
|
--panel-width: 234px;
|
||||||
--menu-panel-width-wide: calc(var(--panel-width) - var(--panel-padding) * 2);
|
--menu-panel-width-wide: calc(var(--panel-width) - var(--panel-padding) * 2);
|
||||||
--uei-icon-size: 16px;
|
--uei-icon-size: 16px;
|
||||||
--arrowpanel-menuitem-border-radius: calc(10px * var(--zen-squircle-value));
|
--arrowpanel-menuitem-border-radius: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#unified-extensions-empty-state,
|
#unified-extensions-empty-state,
|
||||||
@@ -500,16 +500,13 @@
|
|||||||
transition:
|
transition:
|
||||||
transform 0.12s ease-in-out,
|
transform 0.12s ease-in-out,
|
||||||
opacity 0.12s ease-in-out;
|
opacity 0.12s ease-in-out;
|
||||||
will-change: transform;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* stylelint-disable-next-line stylelint-plugin-mozilla/no-has-selector */
|
|
||||||
.permission-popup-permission-item:hover &::before,
|
.permission-popup-permission-item:hover &::before,
|
||||||
.permission-popup-boost-item:hover:not(:has(.zen-permission-popup-boost-editor-button:hover)) &::before {
|
.permission-popup-boost-item:hover:not(:has(.zen-permission-popup-boost-editor-button:hover)) &::before {
|
||||||
transform: scale(1.05);
|
transform: scale(1.05);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* stylelint-disable-next-line stylelint-plugin-mozilla/no-has-selector */
|
|
||||||
.permission-popup-permission-item:active:hover &::before,
|
.permission-popup-permission-item:active:hover &::before,
|
||||||
.permission-popup-boost-item:active:hover:not(:has(.zen-permission-popup-boost-editor-button:hover)) &::before {
|
.permission-popup-boost-item:active:hover:not(:has(.zen-permission-popup-boost-editor-button:hover)) &::before {
|
||||||
transform: scale(0.95);
|
transform: scale(0.95);
|
||||||
@@ -604,8 +601,6 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
will-change: transform;
|
|
||||||
|
|
||||||
@media (-moz-platform: macos) {
|
@media (-moz-platform: macos) {
|
||||||
background: linear-gradient(to bottom, light-dark(rgb(255, 255, 255), rgb(34, 34, 34)), light-dark(rgb(246, 246, 246), rgb(21, 21, 21)));
|
background: linear-gradient(to bottom, light-dark(rgb(255, 255, 255), rgb(34, 34, 34)), light-dark(rgb(246, 246, 246), rgb(21, 21, 21)));
|
||||||
|
|
||||||
@@ -800,3 +795,162 @@
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#zen-library-button {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
#zen-library-button::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 1px;
|
||||||
|
right: 1px;
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background:
|
||||||
|
conic-gradient(
|
||||||
|
var(--zen-colors-primary, currentColor)
|
||||||
|
calc(var(--zen-library-button-progress, 0) * 360deg),
|
||||||
|
color-mix(in srgb, currentColor 25%, transparent) 0
|
||||||
|
);
|
||||||
|
mask: radial-gradient(circle, transparent 3.5px, black 4px);
|
||||||
|
pointer-events: none;
|
||||||
|
opacity: 0;
|
||||||
|
transform: scale(0.6);
|
||||||
|
transition:
|
||||||
|
opacity 0.18s ease,
|
||||||
|
transform 0.18s cubic-bezier(0.32, 0.72, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#zen-library-button[downloading]::after {
|
||||||
|
opacity: 1;
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes zen-library-button-spin {
|
||||||
|
to {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#zen-library-button[downloading-indeterminate]::after {
|
||||||
|
background: conic-gradient(
|
||||||
|
var(--zen-colors-primary, currentColor) 0deg 90deg,
|
||||||
|
color-mix(in srgb, currentColor 20%, transparent) 90deg 360deg
|
||||||
|
);
|
||||||
|
animation: zen-library-button-spin 1.05s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
#zen-library-button[downloading]::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 5px;
|
||||||
|
right: 5px;
|
||||||
|
width: 4px;
|
||||||
|
height: 4px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: var(--zen-colors-primary, currentColor);
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Stack of recent download tiles inserted just before
|
||||||
|
* #zen-sidebar-foot-buttons. Visible only while hovering the library button
|
||||||
|
* (or the stack itself). Anchored to the bottom of #navigator-toolbox so it
|
||||||
|
* floats above the tab strip without pushing layout.
|
||||||
|
*/
|
||||||
|
#navigator-toolbox {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zen-library-button-panel {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: var(--zen-library-stack-bottom-offset, 42px);
|
||||||
|
z-index: 2;
|
||||||
|
padding: 6px 8px;
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(8px);
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zen-library-button-panel[data-state="open"] {
|
||||||
|
pointer-events: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fade the bottom of the tab strip so it doesn't visually collide with
|
||||||
|
* the floating download stack. The fade region scales with the actual
|
||||||
|
* stack height (published from JS as --zen-library-stack-height). */
|
||||||
|
#tabbrowser-tabs[zen-library-stack-open="true"] {
|
||||||
|
mask-image: linear-gradient(to bottom, black var(--zen-library-stack-height), black 50%, transparent calc(100% - var(--zen-library-stack-height) + 20px));
|
||||||
|
transition: mask-image 0.18s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zen-library-button-panel-list {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zen-library-button-panel-empty {
|
||||||
|
padding: 12px 10px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 12px;
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zen-library-button-panel-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
padding: 6px 8px;
|
||||||
|
border-radius: 8px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background-color 0.12s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zen-library-button-panel-row:hover {
|
||||||
|
background: color-mix(in srgb, currentColor 10%, transparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.zen-library-button-panel-icon {
|
||||||
|
flex-shrink: 0;
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zen-library-button-panel-labels {
|
||||||
|
display: flex;
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zen-library-button-panel-name {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 12.5px;
|
||||||
|
font-weight: 500;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zen-library-button-panel-row[data-file-deleted] .zen-library-button-panel-name {
|
||||||
|
text-decoration: line-through;
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zen-library-button-panel-status {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 10.5px;
|
||||||
|
opacity: 0.65;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|||||||
@@ -168,7 +168,7 @@
|
|||||||
--zen-toolbar-height-with-bookmarks: calc(var(--zen-toolbar-height) + 30px);
|
--zen-toolbar-height-with-bookmarks: calc(var(--zen-toolbar-height) + 30px);
|
||||||
}
|
}
|
||||||
|
|
||||||
--toolbarbutton-background-color-hover: var(--zen-toolbar-element-bg-hover) !important;
|
--toolbarbutton-hover-background: var(--zen-toolbar-element-bg-hover) !important;
|
||||||
--zen-toolbar-button-size: 16px;
|
--zen-toolbar-button-size: 16px;
|
||||||
@media (-moz-platform: macos) {
|
@media (-moz-platform: macos) {
|
||||||
--zen-toolbar-button-size: 17px;
|
--zen-toolbar-button-size: 17px;
|
||||||
@@ -181,7 +181,7 @@
|
|||||||
* background on the native theme. */
|
* background on the native theme. */
|
||||||
--toolbar-background-color: light-dark(rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.15));
|
--toolbar-background-color: light-dark(rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.15));
|
||||||
|
|
||||||
--toolbarbutton-background-color-active: color-mix(
|
--toolbarbutton-active-background: color-mix(
|
||||||
in srgb,
|
in srgb,
|
||||||
var(--zen-branding-bg-reverse) 7%,
|
var(--zen-branding-bg-reverse) 7%,
|
||||||
transparent 93%
|
transparent 93%
|
||||||
@@ -191,9 +191,9 @@
|
|||||||
--toolbox-textcolor-inactive: var(--toolbox-textcolor) !important;
|
--toolbox-textcolor-inactive: var(--toolbox-textcolor) !important;
|
||||||
|
|
||||||
/* Other colors */
|
/* Other colors */
|
||||||
--urlbar-box-active-bgcolor: var(--toolbarbutton-background-color-hover) !important;
|
--urlbar-box-active-bgcolor: var(--toolbarbutton-hover-background) !important;
|
||||||
--zen-input-border-color: light-dark(rgb(204, 204, 204), rgb(66, 65, 77));
|
--zen-input-border-color: light-dark(rgb(204, 204, 204), rgb(66, 65, 77));
|
||||||
--urlbar-box-hover-bgcolor: var(--toolbarbutton-background-color-hover) !important;
|
--urlbar-box-hover-bgcolor: var(--toolbarbutton-hover-background) !important;
|
||||||
--input-text-background-color: light-dark(rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0.2)) !important;
|
--input-text-background-color: light-dark(rgba(255, 255, 255, 0.2), rgba(0, 0, 0, 0.2)) !important;
|
||||||
--toolbar-field-focus-background-color: light-dark(
|
--toolbar-field-focus-background-color: light-dark(
|
||||||
rgba(255, 255, 255, 0.25),
|
rgba(255, 255, 255, 0.25),
|
||||||
@@ -217,16 +217,6 @@
|
|||||||
--toolbarbutton-border-radius: 6px;
|
--toolbarbutton-border-radius: 6px;
|
||||||
--urlbar-margin-inline: 1px !important;
|
--urlbar-margin-inline: 1px !important;
|
||||||
|
|
||||||
--zen-squircle-value: 1.3;
|
|
||||||
|
|
||||||
@media (-moz-platform: windows) {
|
|
||||||
--zen-squircle-value: 2.1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (-moz-platform: linux) {
|
|
||||||
--zen-squircle-value: 1.2;
|
|
||||||
}
|
|
||||||
|
|
||||||
--tab-icon-overlay-stroke: light-dark(white, black) !important;
|
--tab-icon-overlay-stroke: light-dark(white, black) !important;
|
||||||
--tab-close-button-padding: 4px !important;
|
--tab-close-button-padding: 4px !important;
|
||||||
|
|
||||||
@@ -267,7 +257,7 @@
|
|||||||
--zen-active-tab-scale: 0.985;
|
--zen-active-tab-scale: 0.985;
|
||||||
|
|
||||||
/* Define tab hover background color */
|
/* Define tab hover background color */
|
||||||
--tab-background-color-hover: var(--toolbarbutton-background-color-hover);
|
--tab-background-color-hover: var(--toolbarbutton-hover-background);
|
||||||
|
|
||||||
/* Sidebar Notifications */
|
/* Sidebar Notifications */
|
||||||
--zen-sidebar-notification-bg: color-mix(
|
--zen-sidebar-notification-bg: color-mix(
|
||||||
@@ -286,7 +276,7 @@
|
|||||||
* 1. If the native radius - the separation is less than 4px, use 4px.
|
* 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).
|
* 2. Otherwise, use the the calculated value (inner radius = outer radius - separation).
|
||||||
*/
|
*/
|
||||||
max(5px, calc((var(--zen-border-radius) - var(--zen-element-separation) / 2) * var(--zen-squircle-value)))
|
max(5px, calc(var(--zen-border-radius) - var(--zen-element-separation) / 2))
|
||||||
);
|
);
|
||||||
|
|
||||||
/** Other theme-related styles */
|
/** Other theme-related styles */
|
||||||
@@ -358,11 +348,3 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
%include zen-buttons.css
|
%include zen-buttons.css
|
||||||
|
|
||||||
@media (-moz-pref('layout.css.corner-shape.enabled')) {
|
|
||||||
*:not(.no-squircles),
|
|
||||||
.zen-squircle-before::before,
|
|
||||||
.zen-squircle-after::after {
|
|
||||||
corner-shape: superellipse(var(--zen-squircle-value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ export const ZenCustomizableUI = new (class {
|
|||||||
|
|
||||||
TYPE_TOOLBAR = "toolbar";
|
TYPE_TOOLBAR = "toolbar";
|
||||||
defaultSidebarIcons = [
|
defaultSidebarIcons = [
|
||||||
"downloads-button",
|
Services.prefs.getBoolPref("zen.library.enabled") ? "zen-library-button" : "downloads-button",
|
||||||
"zen-workspaces-button",
|
"zen-workspaces-button",
|
||||||
"zen-create-new-button",
|
"zen-create-new-button",
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -7,11 +7,14 @@ import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs";
|
|||||||
const lazy = {};
|
const lazy = {};
|
||||||
|
|
||||||
ChromeUtils.defineESModuleGetters(lazy, {
|
ChromeUtils.defineESModuleGetters(lazy, {
|
||||||
|
CustomizableUI: "moz-src:///browser/components/customizableui/CustomizableUI.sys.mjs",
|
||||||
SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs",
|
SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs",
|
||||||
});
|
});
|
||||||
|
|
||||||
class nsZenUIMigration {
|
class nsZenUIMigration {
|
||||||
PREF_NAME = "zen.ui.migration.version";
|
PREF_NAME = "zen.ui.migration.version";
|
||||||
|
PREF_LIBRARY_REPLACED_DOWNLOADS =
|
||||||
|
"zen.ui.migration.library-button-replaced-downloads";
|
||||||
MIGRATION_VERSION = 7;
|
MIGRATION_VERSION = 7;
|
||||||
|
|
||||||
init(isNewProfile) {
|
init(isNewProfile) {
|
||||||
@@ -22,6 +25,14 @@ class nsZenUIMigration {
|
|||||||
console.error("ZenUIMigration: Error during migration", e);
|
console.error("ZenUIMigration: Error during migration", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
this.#maybeReplaceDownloadsWithLibrary(isNewProfile);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(
|
||||||
|
"ZenUIMigration: Error replacing downloads with library button",
|
||||||
|
e
|
||||||
|
);
|
||||||
|
}
|
||||||
this.clearVariables();
|
this.clearVariables();
|
||||||
if (this.shouldRestart) {
|
if (this.shouldRestart) {
|
||||||
Services.startup.quit(
|
Services.startup.quit(
|
||||||
@@ -50,6 +61,28 @@ class nsZenUIMigration {
|
|||||||
this._migrationVersion = this.MIGRATION_VERSION;
|
this._migrationVersion = this.MIGRATION_VERSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#maybeReplaceDownloadsWithLibrary(isNewProfile) {
|
||||||
|
if (
|
||||||
|
Services.prefs.getBoolPref(this.PREF_LIBRARY_REPLACED_DOWNLOADS, false)
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!isNewProfile) {
|
||||||
|
const placement =
|
||||||
|
lazy.CustomizableUI.getPlacementOfWidget("downloads-button");
|
||||||
|
if (placement?.area === "zen-sidebar-foot-buttons") {
|
||||||
|
const { position } = placement;
|
||||||
|
lazy.CustomizableUI.removeWidgetFromArea("downloads-button");
|
||||||
|
lazy.CustomizableUI.addWidgetToArea(
|
||||||
|
"zen-library-button",
|
||||||
|
"zen-sidebar-foot-buttons",
|
||||||
|
position
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Services.prefs.setBoolPref(this.PREF_LIBRARY_REPLACED_DOWNLOADS, true);
|
||||||
|
}
|
||||||
|
|
||||||
_migrateV1() {
|
_migrateV1() {
|
||||||
// If there's an userChrome.css or userContent.css existing, we set
|
// If there's an userChrome.css or userContent.css existing, we set
|
||||||
// 'toolkit.legacyUserProfileCustomizations.stylesheets' back to true
|
// 'toolkit.legacyUserProfileCustomizations.stylesheets' back to true
|
||||||
|
|||||||
@@ -138,6 +138,14 @@ document.addEventListener(
|
|||||||
gZenWorkspaces.unloadAllOtherWorkspaces();
|
gZenWorkspaces.unloadAllOtherWorkspaces();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "cmd_zenToggleLibrary": {
|
||||||
|
const { ZenLibrary } = ChromeUtils.importESModule(
|
||||||
|
"moz-src:///zen/library/ZenLibrary.mjs",
|
||||||
|
{ global: "current" }
|
||||||
|
);
|
||||||
|
ZenLibrary.toggle();
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "cmd_zenOpenSpaceRoutingSettings": {
|
case "cmd_zenOpenSpaceRoutingSettings": {
|
||||||
gZenSpaceRoutingManager.openSpaceRoutingDialog(window);
|
gZenSpaceRoutingManager.openSpaceRoutingDialog(window);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -109,7 +109,7 @@
|
|||||||
if (AppConstants.platform == "macosx") {
|
if (AppConstants.platform == "macosx") {
|
||||||
const targetRadius = window.matchMedia("(-moz-mac-tahoe-theme)")
|
const targetRadius = window.matchMedia("(-moz-mac-tahoe-theme)")
|
||||||
.matches
|
.matches
|
||||||
? 12
|
? 14
|
||||||
: 10;
|
: 10;
|
||||||
document.documentElement.style.setProperty(
|
document.documentElement.style.setProperty(
|
||||||
"--zen-border-radius",
|
"--zen-border-radius",
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
:root[zen-no-padding='true'] & {
|
:root[zen-no-padding='true'] & {
|
||||||
--zen-compact-float: 10px;
|
--zen-compact-float: 10px;
|
||||||
--zen-compact-top-toolbar-hidden-fix: var(--zen-compact-float);
|
--zen-compact-top-toolbar-hidden-fix: var(--zen-compact-float);
|
||||||
--zen-compact-mode-no-padding-radius-fix: 6px;
|
--zen-compact-mode-no-padding-radius-fix: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initial padding for when we are animating */
|
/* Initial padding for when we are animating */
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
&,
|
&,
|
||||||
&::before,
|
&::before,
|
||||||
&::after {
|
&::after {
|
||||||
border-radius: calc((var(--zen-native-inner-radius) - var(--zen-compact-mode-no-padding-radius-fix, 0px)) * var(--zen-squircle-value));
|
border-radius: calc(var(--zen-native-inner-radius) - var(--zen-compact-mode-no-padding-radius-fix, 0px));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -147,10 +147,20 @@ class nsZenDownloadAnimationElement extends HTMLElement {
|
|||||||
return Services.prefs.getBoolPref("zen.tabs.vertical.right-side");
|
return Services.prefs.getBoolPref("zen.tabs.vertical.right-side");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get #downloadButton() {
|
||||||
|
const ids = ["zen-library-button", "downloads-button"];
|
||||||
|
for (const id of ids) {
|
||||||
|
const button = document.getElementById(id);
|
||||||
|
if (button && this.#isElementVisible(button)) {
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
#determineEndPosition() {
|
#determineEndPosition() {
|
||||||
const downloadsButton = document.getElementById("downloads-button");
|
const downloadsButton = this.#downloadButton;
|
||||||
const isDownloadButtonVisible =
|
const isDownloadButtonVisible = downloadsButton !== null;
|
||||||
downloadsButton && this.#isElementVisible(downloadsButton);
|
|
||||||
|
|
||||||
let endPosition = { clientX: 0, clientY: 0 };
|
let endPosition = { clientX: 0, clientY: 0 };
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ export class nsZenFolder extends MozTabbrowserTabGroup {
|
|||||||
#initialized = false;
|
#initialized = false;
|
||||||
|
|
||||||
static markup = `
|
static markup = `
|
||||||
<hbox class="tab-group-label-container zen-squircle-before zen-drop-target" pack="center">
|
<hbox class="tab-group-label-container zen-drop-target" pack="center">
|
||||||
<html:div class="tab-group-folder-icon"/>
|
<html:div class="tab-group-folder-icon"/>
|
||||||
<label class="tab-group-label" role="button"/>
|
<label class="tab-group-label" role="button"/>
|
||||||
<image class="tab-reset-button reset-icon" role="button" keyNav="false" data-l10n-id="zen-folders-unload-all-tooltip"/>
|
<image class="tab-reset-button reset-icon" role="button" keyNav="false" data-l10n-id="zen-folders-unload-all-tooltip"/>
|
||||||
|
|||||||
@@ -41,11 +41,11 @@
|
|||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background: light-dark(rgb(41, 41, 41), rgb(204, 204, 204));
|
background: light-dark(rgb(41, 41, 41), rgb(204, 204, 204));
|
||||||
scale: 1.02;
|
scale: 1.05;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover:active {
|
&:hover:active {
|
||||||
scale: 0.98;
|
scale: 0.95;
|
||||||
}
|
}
|
||||||
|
|
||||||
& label {
|
& label {
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
<html:template id="zen-glance-sidebar-template">
|
<html:template id="zen-glance-sidebar-template">
|
||||||
<vbox class="zen-glance-sidebar-container">
|
<vbox class="zen-glance-sidebar-container">
|
||||||
<toolbarbutton class="no-squircles zen-glance-sidebar-close toolbarbutton-1" command="cmd_zenGlanceClose" data-l10n-id="zen-general-confirm" />
|
<toolbarbutton class="zen-glance-sidebar-close toolbarbutton-1" command="cmd_zenGlanceClose" data-l10n-id="zen-general-confirm" />
|
||||||
<toolbarbutton class="no-squircles zen-glance-sidebar-open toolbarbutton-1" command="cmd_zenGlanceExpand" />
|
<toolbarbutton class="zen-glance-sidebar-open toolbarbutton-1" command="cmd_zenGlanceExpand" />
|
||||||
<toolbarbutton class="no-squircles zen-glance-sidebar-split toolbarbutton-1" command="cmd_zenGlanceSplit" />
|
<toolbarbutton class="zen-glance-sidebar-split toolbarbutton-1" command="cmd_zenGlanceSplit" />
|
||||||
</vbox>
|
</vbox>
|
||||||
</html:template>
|
</html:template>
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
-->
|
-->
|
||||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="192" height="192" viewBox="0 0 192 192">
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="192" height="192">
|
||||||
<path d="M0 0 C46.53 0 93.06 0 141 0 C140.31337286 6.17964422 139.55249061 11.27288504 137.70605469 17.05029297 C137.47297387 17.80257864 137.23989305 18.55486431 136.99974918 19.32994652 C136.23144234 21.80315256 135.45168558 24.27258703 134.671875 26.7421875 C134.12437759 28.49738282 133.57765617 30.25282037 133.03166199 32.00848389 C131.87637142 35.71831589 130.71622139 39.42657597 129.55197144 43.13360596 C127.74764855 48.8788063 125.95370897 54.62720979 124.16235352 60.37646484 C123.86778165 61.32180147 123.57320978 62.2671381 123.26971149 63.24112129 C122.67820023 65.13942545 122.08671887 67.03773892 121.49526787 68.93606186 C120.61596105 71.75702774 119.73559404 74.57766091 118.85499573 77.39822388 C113.93371601 93.16794093 109.12231506 108.96839561 104.39160156 124.79638672 C104.15798416 125.57612854 103.92436676 126.35587036 103.68367004 127.15924072 C103.08515835 129.15844483 102.48956633 131.15852242 101.89428711 133.15869141 C101 136 101 136 100 138 C53.47 138 6.94 138 -41 138 C-40.30154873 133.1108411 -39.57595592 129.15411541 -38.15258789 124.53222656 C-37.57916405 122.65642914 -37.57916405 122.65642914 -36.99415588 120.74273682 C-36.57039663 119.37534329 -36.14656076 118.0079735 -35.72265625 116.640625 C-35.27348999 115.1778587 -34.82480765 113.71494372 -34.37657166 112.25189209 C-33.18301778 108.36047716 -31.98331296 104.47098593 -30.78216553 100.58190918 C-29.63602455 96.86810525 -28.49491032 93.15276556 -27.35351562 89.4375 C-24.23585848 79.29161092 -21.11791678 69.14580929 -18 59 C-12.06 39.53 -6.12 20.06 0 0 Z " fill="#C00002" transform="translate(51,54)"/>
|
<path d="M0 0 C46.53 0 93.06 0 141 0 C140.31337286 6.17964422 139.55249061 11.27288504 137.70605469 17.05029297 C137.47297387 17.80257864 137.23989305 18.55486431 136.99974918 19.32994652 C136.23144234 21.80315256 135.45168558 24.27258703 134.671875 26.7421875 C134.12437759 28.49738282 133.57765617 30.25282037 133.03166199 32.00848389 C131.87637142 35.71831589 130.71622139 39.42657597 129.55197144 43.13360596 C127.74764855 48.8788063 125.95370897 54.62720979 124.16235352 60.37646484 C123.86778165 61.32180147 123.57320978 62.2671381 123.26971149 63.24112129 C122.67820023 65.13942545 122.08671887 67.03773892 121.49526787 68.93606186 C120.61596105 71.75702774 119.73559404 74.57766091 118.85499573 77.39822388 C113.93371601 93.16794093 109.12231506 108.96839561 104.39160156 124.79638672 C104.15798416 125.57612854 103.92436676 126.35587036 103.68367004 127.15924072 C103.08515835 129.15844483 102.48956633 131.15852242 101.89428711 133.15869141 C101 136 101 136 100 138 C53.47 138 6.94 138 -41 138 C-40.30154873 133.1108411 -39.57595592 129.15411541 -38.15258789 124.53222656 C-37.57916405 122.65642914 -37.57916405 122.65642914 -36.99415588 120.74273682 C-36.57039663 119.37534329 -36.14656076 118.0079735 -35.72265625 116.640625 C-35.27348999 115.1778587 -34.82480765 113.71494372 -34.37657166 112.25189209 C-33.18301778 108.36047716 -31.98331296 104.47098593 -30.78216553 100.58190918 C-29.63602455 96.86810525 -28.49491032 93.15276556 -27.35351562 89.4375 C-24.23585848 79.29161092 -21.11791678 69.14580929 -18 59 C-12.06 39.53 -6.12 20.06 0 0 Z " fill="#C00002" transform="translate(51,54)"/>
|
||||||
<path d="M0 0 C18.3328319 -0.77792059 36.66127963 -1.35606988 55.00715542 -1.70980167 C63.53040721 -1.87858134 72.04320263 -2.10845198 80.55981445 -2.48950195 C142.46067644 -5.20608208 142.46067644 -5.20608208 159.53827381 9.52021503 C166.76889916 16.3955246 173.28323862 24.18336817 178 33 C178 34.32 178 35.64 178 37 C159.57187597 37.07007601 141.14378652 37.12298126 122.71555805 37.15543652 C114.15904092 37.17090649 105.60260658 37.19199848 97.04614258 37.22631836 C89.58846853 37.25621675 82.13085443 37.27557406 74.67312211 37.28226548 C70.72416302 37.28617701 66.77537545 37.29537225 62.82647133 37.31719017 C59.10909816 37.33756234 55.39196707 37.34383237 51.67454338 37.33932304 C49.66086617 37.34054104 47.64721527 37.35667936 45.63360596 37.3732605 C44.43192276 37.36913651 43.23023956 37.36501251 41.99214172 37.36076355 C40.42831993 37.36491162 40.42831993 37.36491162 38.83290577 37.36914349 C32.93264951 36.60030705 29.62184448 32.77709579 25.875 28.5 C19.58131594 21.47164064 12.89888852 14.86095567 6.14794922 8.2734375 C5.35146973 7.48839844 4.55499023 6.70335937 3.734375 5.89453125 C3.01475586 5.19175049 2.29513672 4.48896973 1.55371094 3.76489258 C0 2 0 2 0 0 Z " fill="#C00002" transform="translate(14,0)"/>
|
<path d="M0 0 C18.3328319 -0.77792059 36.66127963 -1.35606988 55.00715542 -1.70980167 C63.53040721 -1.87858134 72.04320263 -2.10845198 80.55981445 -2.48950195 C142.46067644 -5.20608208 142.46067644 -5.20608208 159.53827381 9.52021503 C166.76889916 16.3955246 173.28323862 24.18336817 178 33 C178 34.32 178 35.64 178 37 C159.57187597 37.07007601 141.14378652 37.12298126 122.71555805 37.15543652 C114.15904092 37.17090649 105.60260658 37.19199848 97.04614258 37.22631836 C89.58846853 37.25621675 82.13085443 37.27557406 74.67312211 37.28226548 C70.72416302 37.28617701 66.77537545 37.29537225 62.82647133 37.31719017 C59.10909816 37.33756234 55.39196707 37.34383237 51.67454338 37.33932304 C49.66086617 37.34054104 47.64721527 37.35667936 45.63360596 37.3732605 C44.43192276 37.36913651 43.23023956 37.36501251 41.99214172 37.36076355 C40.42831993 37.36491162 40.42831993 37.36491162 38.83290577 37.36914349 C32.93264951 36.60030705 29.62184448 32.77709579 25.875 28.5 C19.58131594 21.47164064 12.89888852 14.86095567 6.14794922 8.2734375 C5.35146973 7.48839844 4.55499023 6.70335937 3.734375 5.89453125 C3.01475586 5.19175049 2.29513672 4.48896973 1.55371094 3.76489258 C0 2 0 2 0 0 Z " fill="#C00002" transform="translate(14,0)"/>
|
||||||
<path d="M0 0 C3.791582 0.9478955 4.61038031 1.2276371 7.22387695 3.72460938 C7.82742508 4.29610718 8.43097321 4.86760498 9.05281067 5.4564209 C9.69151596 6.0792395 10.33022125 6.70205811 10.98828125 7.34375 C11.65087448 7.98687134 12.31346771 8.62999268 12.99613953 9.29260254 C14.39307302 10.6568359 15.78562095 12.02557232 17.17407227 13.3984375 C19.30020941 15.4879213 21.45839054 17.54016287 23.61914062 19.59375 C24.97349069 20.92491308 26.32577572 22.25818109 27.67578125 23.59375 C28.64902092 24.50368713 28.64902092 24.50368713 29.641922 25.43200684 C32.90021798 28.73979232 33.96335392 30.20963715 34.18457031 34.98071289 C32.79621492 42.01530122 30.50352034 48.87563397 28.37109375 55.71484375 C27.89774106 57.25373642 27.42510459 58.79284955 26.95314026 60.33216858 C25.70895014 64.38330864 24.4551733 68.43141814 23.19927979 72.47894287 C21.95200374 76.50438366 20.71357304 80.53254149 19.47460938 84.56054688 C18.02569311 89.27038853 16.5746843 93.97953307 15.11288452 98.68539429 C12.90227206 105.80473144 10.71371664 112.92808223 8.60595703 120.07861328 C8.0605703 121.91064049 8.0605703 121.91064049 7.50416565 123.77967834 C6.83459768 126.03485094 6.17462453 128.29290282 5.52598572 130.55418396 C5.23389725 131.5321846 4.94180878 132.51018524 4.64086914 133.51782227 C4.39422012 134.36594986 4.14757111 135.21407745 3.89344788 136.08790588 C3.59861008 136.71889694 3.30377228 137.349888 3 138 C2.01 138.33 1.02 138.66 0 139 C0 93.13 0 47.26 0 0 Z " fill="#C00002" transform="translate(0,15)"/>
|
<path d="M0 0 C3.791582 0.9478955 4.61038031 1.2276371 7.22387695 3.72460938 C7.82742508 4.29610718 8.43097321 4.86760498 9.05281067 5.4564209 C9.69151596 6.0792395 10.33022125 6.70205811 10.98828125 7.34375 C11.65087448 7.98687134 12.31346771 8.62999268 12.99613953 9.29260254 C14.39307302 10.6568359 15.78562095 12.02557232 17.17407227 13.3984375 C19.30020941 15.4879213 21.45839054 17.54016287 23.61914062 19.59375 C24.97349069 20.92491308 26.32577572 22.25818109 27.67578125 23.59375 C28.64902092 24.50368713 28.64902092 24.50368713 29.641922 25.43200684 C32.90021798 28.73979232 33.96335392 30.20963715 34.18457031 34.98071289 C32.79621492 42.01530122 30.50352034 48.87563397 28.37109375 55.71484375 C27.89774106 57.25373642 27.42510459 58.79284955 26.95314026 60.33216858 C25.70895014 64.38330864 24.4551733 68.43141814 23.19927979 72.47894287 C21.95200374 76.50438366 20.71357304 80.53254149 19.47460938 84.56054688 C18.02569311 89.27038853 16.5746843 93.97953307 15.11288452 98.68539429 C12.90227206 105.80473144 10.71371664 112.92808223 8.60595703 120.07861328 C8.0605703 121.91064049 8.0605703 121.91064049 7.50416565 123.77967834 C6.83459768 126.03485094 6.17462453 128.29290282 5.52598572 130.55418396 C5.23389725 131.5321846 4.94180878 132.51018524 4.64086914 133.51782227 C4.39422012 134.36594986 4.14757111 135.21407745 3.89344788 136.08790588 C3.59861008 136.71889694 3.30377228 137.349888 3 138 C2.01 138.33 1.02 138.66 0 139 C0 93.13 0 47.26 0 0 Z " fill="#C00002" transform="translate(0,15)"/>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
580
src/zen/library/ZenLibrary.mjs
Normal file
@@ -0,0 +1,580 @@
|
|||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
import { html } from "chrome://global/content/vendor/lit.all.mjs";
|
||||||
|
import { MozLitElement } from "chrome://global/content/lit-utils.mjs";
|
||||||
|
|
||||||
|
let lazy = {};
|
||||||
|
let gZenLibraryInstance = null;
|
||||||
|
|
||||||
|
const PREVIOUS_TAB_PREF = "zen.library.previous-tab";
|
||||||
|
const DONATE_URL = "https://zen-browser.app/donate/";
|
||||||
|
|
||||||
|
ChromeUtils.defineESModuleGetters(
|
||||||
|
lazy,
|
||||||
|
{
|
||||||
|
ZenLibrarySections: "moz-src:///zen/library/ZenLibrarySections.mjs",
|
||||||
|
},
|
||||||
|
{ global: "current" }
|
||||||
|
);
|
||||||
|
|
||||||
|
ChromeUtils.defineLazyGetter(lazy, "l10n", function () {
|
||||||
|
return new Localization(["browser/zen-library.ftl"], true);
|
||||||
|
});
|
||||||
|
|
||||||
|
ChromeUtils.defineLazyGetter(lazy, "appContentWrapper", function () {
|
||||||
|
return document.getElementById("zen-appcontent-wrapper");
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ZenLibrary class is responsible for managing the UI for the library feature.
|
||||||
|
* This feature allows users to view and manage their browsing history, downloads,
|
||||||
|
* spaces, and other related data in a unified interface.
|
||||||
|
*/
|
||||||
|
export class ZenLibrary extends MozLitElement {
|
||||||
|
static #ANIMATION_DURATION = 280;
|
||||||
|
static #ANIMATION_EASING = "cubic-bezier(0.32, 0.72, 0, 1)";
|
||||||
|
static #TOOLBOX_OPEN_TRANSFORM = "scale(0.96)";
|
||||||
|
static #TOOLBOX_OPEN_OPACITY = "-0.5";
|
||||||
|
|
||||||
|
#initialized = false;
|
||||||
|
#resizeObserver = null;
|
||||||
|
#sections = [];
|
||||||
|
#activeAnimations = new Set();
|
||||||
|
#animating = false;
|
||||||
|
_deletionIdleCallbackId = null;
|
||||||
|
|
||||||
|
static properties = {
|
||||||
|
_activeTab: { type: String },
|
||||||
|
};
|
||||||
|
|
||||||
|
static queries = {
|
||||||
|
_content: "#zen-library-content",
|
||||||
|
_tabs: { all: "#zen-library-sidebar-tabs > .library-tab" },
|
||||||
|
_header: "#zen-library-sidebar-header",
|
||||||
|
_footer: "#zen-library-sidebar-footer",
|
||||||
|
};
|
||||||
|
|
||||||
|
createRenderRoot() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.activeTab = Services.prefs.getStringPref(PREVIOUS_TAB_PREF, "") || "history";
|
||||||
|
}
|
||||||
|
|
||||||
|
set activeTab(value) {
|
||||||
|
if (this.activeTab === value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._activeTab = value;
|
||||||
|
Services.prefs.setStringPref(PREVIOUS_TAB_PREF, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
get activeTab() {
|
||||||
|
return this._activeTab;
|
||||||
|
}
|
||||||
|
|
||||||
|
connectedCallback() {
|
||||||
|
super.connectedCallback();
|
||||||
|
if (this.#initialized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
window.addEventListener("keydown", this);
|
||||||
|
this.addEventListener("animationend", this);
|
||||||
|
// Add connected call back and make `appContentWrapper` transform translate the oposite of this element
|
||||||
|
this.#resizeObserver = new ResizeObserver(() => {
|
||||||
|
if (gZenWorkspaces._swipeManager._swipeState.librarySwiping) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let translateX = this.#computeWrapperTargetPx();
|
||||||
|
lazy.appContentWrapper.style.transform = `translateX(${translateX}px)`;
|
||||||
|
});
|
||||||
|
this.#resizeObserver.observe(this);
|
||||||
|
for (const Section of Object.values(lazy.ZenLibrarySections)) {
|
||||||
|
let section = new Section();
|
||||||
|
this.#sections.push(section);
|
||||||
|
}
|
||||||
|
this.#initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
disconnectedCallback() {
|
||||||
|
super.disconnectedCallback();
|
||||||
|
window.removeEventListener("keydown", this);
|
||||||
|
for (const section of this.#sections) {
|
||||||
|
section.remove();
|
||||||
|
}
|
||||||
|
this.#sections = [];
|
||||||
|
if (this.#resizeObserver) {
|
||||||
|
this.#resizeObserver.disconnect();
|
||||||
|
this.#resizeObserver = null;
|
||||||
|
}
|
||||||
|
this.#initialized = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
firstUpdated() {
|
||||||
|
super.firstUpdated?.();
|
||||||
|
this._header.appendChild(
|
||||||
|
gZenVerticalTabsManager.actualWindowButtons.cloneNode(true)
|
||||||
|
);
|
||||||
|
this.#buildFooterButtons();
|
||||||
|
const activeTabEl = this.querySelector(".zen-library-tab[active]");
|
||||||
|
if (activeTabEl) {
|
||||||
|
this.#animateTabIcon(activeTabEl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#buildFooterButtons() {
|
||||||
|
const buttons = [
|
||||||
|
{
|
||||||
|
l10nId: "library-close-button",
|
||||||
|
image: "chrome://browser/skin/zen-icons/back.svg",
|
||||||
|
command: () => ZenLibrary.toggle(),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
l10nId: "library-donate-button",
|
||||||
|
image: "chrome://browser/skin/zen-icons/heart-circle-fill.svg",
|
||||||
|
command: () => {
|
||||||
|
window.openTrustedLinkIn(DONATE_URL, "tab");
|
||||||
|
ZenLibrary.toggle();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
for (const { l10nId, image, command } of buttons) {
|
||||||
|
const button = document.createXULElement("toolbarbutton");
|
||||||
|
button.className = "toolbarbutton-1";
|
||||||
|
button.setAttribute("image", image);
|
||||||
|
document.l10n.setAttributes(button, l10nId);
|
||||||
|
button.addEventListener("command", command);
|
||||||
|
this._footer.appendChild(button);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plays a tab's icon sprite animation, reload-to-stop style: the [animate]
|
||||||
|
* attribute starts the strip's steps() animation (see zen-library.css) and
|
||||||
|
* the animationend handler removes it again. Restarts if mid-animation.
|
||||||
|
*
|
||||||
|
* @param {Element} tab
|
||||||
|
*/
|
||||||
|
#animateTabIcon(tab) {
|
||||||
|
tab.removeAttribute("animate");
|
||||||
|
// Flush styles so re-adding the attribute restarts the animation.
|
||||||
|
void tab.offsetWidth;
|
||||||
|
tab.setAttribute("animate", "true");
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return html`
|
||||||
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
href="chrome://browser/content/zen-styles/zen-library.css"
|
||||||
|
/>
|
||||||
|
<vbox id="zen-library-sidebar">
|
||||||
|
<vbox id="zen-library-sidebar-header"></vbox>
|
||||||
|
<vbox id="zen-library-sidebar-tabs">
|
||||||
|
${Object.values(lazy.ZenLibrarySections).map(
|
||||||
|
Section => html`
|
||||||
|
<vbox
|
||||||
|
class="zen-library-tab"
|
||||||
|
?active=${this.activeTab === Section.id}
|
||||||
|
data-section=${Section.id}
|
||||||
|
@click=${event => {
|
||||||
|
if (this.activeTab !== Section.id) {
|
||||||
|
this.activeTab = Section.id;
|
||||||
|
this.#animateTabIcon(event.currentTarget);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div class="zen-library-tab-icon">
|
||||||
|
<div class="zen-library-tab-icon-image"></div>
|
||||||
|
</div>
|
||||||
|
<label>${lazy.l10n.formatValueSync(Section.label)}</label>
|
||||||
|
</vbox>
|
||||||
|
`
|
||||||
|
)}
|
||||||
|
</vbox>
|
||||||
|
<toolbar mode="icons"
|
||||||
|
fullscreentoolbar="true"
|
||||||
|
class="browser-toolbar chromeclass-location"
|
||||||
|
id="zen-library-sidebar-footer">
|
||||||
|
</toolbar>
|
||||||
|
</vbox>
|
||||||
|
<vbox
|
||||||
|
id="zen-library-content"
|
||||||
|
flex="1"
|
||||||
|
?large-content=${lazy.ZenLibrarySections[this.activeTab].largeContent}
|
||||||
|
>
|
||||||
|
${this.#sections.find(section => section.constructor.id === this.activeTab)}
|
||||||
|
</vbox>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
handleEvent(event) {
|
||||||
|
switch (event.type) {
|
||||||
|
case "keydown": {
|
||||||
|
if (event.key === "Escape" && this.isOpen) {
|
||||||
|
ZenLibrary.toggle();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "animationend": {
|
||||||
|
if (event.animationName === "zen-library-tab-icon-play") {
|
||||||
|
event.target.closest(".zen-library-tab")?.removeAttribute("animate");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get isOpen() {
|
||||||
|
return this.hasAttribute("open");
|
||||||
|
}
|
||||||
|
|
||||||
|
/** True when a live library instance exists and is in the open state. */
|
||||||
|
static get isOpen() {
|
||||||
|
return gZenLibraryInstance?.isOpen ?? false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static getInstance() {
|
||||||
|
if (!gZenLibraryInstance) {
|
||||||
|
gZenLibraryInstance = new ZenLibrary();
|
||||||
|
gNavToolbox.before(gZenLibraryInstance);
|
||||||
|
}
|
||||||
|
return gZenLibraryInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
static clearInstance() {
|
||||||
|
if (gZenLibraryInstance) {
|
||||||
|
gZenLibraryInstance._deletionIdleCallbackId = null;
|
||||||
|
gZenLibraryInstance.remove();
|
||||||
|
gZenLibraryInstance = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static toggle() {
|
||||||
|
if (gZenLibraryInstance?.#animating) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
window.docShell.treeOwner
|
||||||
|
.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||||
|
.getInterface(Ci.nsIAppWindow)
|
||||||
|
.rollupAllPopups();
|
||||||
|
let instance = this.getInstance();
|
||||||
|
instance.toggleAttribute("open");
|
||||||
|
if (instance.isOpen) {
|
||||||
|
if (instance._deletionIdleCallbackId) {
|
||||||
|
cancelIdleCallback(instance._deletionIdleCallbackId);
|
||||||
|
instance._deletionIdleCallbackId = null;
|
||||||
|
}
|
||||||
|
gNavToolbox.setAttribute("zen-library-open", "true");
|
||||||
|
instance.#animateOpen();
|
||||||
|
} else {
|
||||||
|
gNavToolbox.removeAttribute("zen-library-open");
|
||||||
|
// #animateClose schedules the instance disposal itself once the slide-
|
||||||
|
// out finishes, so we don't queue an idle callback eagerly here — that
|
||||||
|
// would otherwise race the animation and yank the element out of the
|
||||||
|
// DOM mid-slide.
|
||||||
|
instance.#animateClose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#cancelActiveAnimations() {
|
||||||
|
for (const anim of this.#activeAnimations) {
|
||||||
|
try {
|
||||||
|
anim.cancel();
|
||||||
|
} catch {
|
||||||
|
/* already settled */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.#activeAnimations.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
#animate(element, keyframes) {
|
||||||
|
const anim = element.animate(keyframes, {
|
||||||
|
duration: ZenLibrary.#ANIMATION_DURATION,
|
||||||
|
easing: ZenLibrary.#ANIMATION_EASING,
|
||||||
|
fill: "forwards",
|
||||||
|
});
|
||||||
|
this.#activeAnimations.add(anim);
|
||||||
|
anim.finished.then(
|
||||||
|
() => this.#activeAnimations.delete(anim),
|
||||||
|
() => this.#activeAnimations.delete(anim)
|
||||||
|
);
|
||||||
|
return anim;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mirrors the ResizeObserver's math but returns the translateX (px) instead
|
||||||
|
* of writing it inline. Used when the observer hasn't fired yet (re-opens
|
||||||
|
* on the same instance) or when we need a target without side effects.
|
||||||
|
*/
|
||||||
|
#computeWrapperTargetPx() {
|
||||||
|
const isRightSide = gZenVerticalTabsManager._prefsRightSide;
|
||||||
|
let translateX = this.getBoundingClientRect()[
|
||||||
|
isRightSide ? "left" : "right"
|
||||||
|
];
|
||||||
|
const contentPosition = window.windowUtils.getBoundsWithoutFlushing(
|
||||||
|
lazy.appContentWrapper
|
||||||
|
)[isRightSide ? "right" : "left"];
|
||||||
|
const existingTransform = new DOMMatrix(
|
||||||
|
lazy.appContentWrapper.style.transform
|
||||||
|
).m41;
|
||||||
|
translateX = translateX - contentPosition + existingTransform;
|
||||||
|
return isRightSide ? -translateX : translateX;
|
||||||
|
}
|
||||||
|
|
||||||
|
async #animateOpen() {
|
||||||
|
this.#animating = true;
|
||||||
|
try {
|
||||||
|
this.#cancelActiveAnimations();
|
||||||
|
await new Promise(r => requestAnimationFrame(r));
|
||||||
|
if (!this.isOpen || !this.isConnected) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Re-opens on the same instance won't trigger the observer (library
|
||||||
|
// size is unchanged), so fall back to computing the target ourselves.
|
||||||
|
let wrapperTarget = lazy.appContentWrapper.style.transform;
|
||||||
|
if (!wrapperTarget) {
|
||||||
|
wrapperTarget = `translateX(${this.#computeWrapperTargetPx()}px)`;
|
||||||
|
}
|
||||||
|
lazy.appContentWrapper.style.transform = "";
|
||||||
|
|
||||||
|
this.#animate(this, [
|
||||||
|
{ transform: "translateX(-100%)", opacity: 0 },
|
||||||
|
{ transform: "translateX(0)", opacity: 1 },
|
||||||
|
]);
|
||||||
|
this.#animate(gNavToolbox, [
|
||||||
|
{ transform: "scale(1)", opacity: 1 },
|
||||||
|
{
|
||||||
|
transform: ZenLibrary.#TOOLBOX_OPEN_TRANSFORM,
|
||||||
|
opacity: ZenLibrary.#TOOLBOX_OPEN_OPACITY,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
const wrapperAnim = this.#animate(lazy.appContentWrapper, [
|
||||||
|
{ transform: "translateX(0)" },
|
||||||
|
{ transform: wrapperTarget },
|
||||||
|
]);
|
||||||
|
|
||||||
|
try {
|
||||||
|
await wrapperAnim.finished;
|
||||||
|
} catch {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!this.isOpen) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Persist the final transform inline so the resize observer's
|
||||||
|
// diff math keeps working after the animation ends.
|
||||||
|
wrapperAnim.commitStyles();
|
||||||
|
wrapperAnim.cancel();
|
||||||
|
this.#activeAnimations.delete(wrapperAnim);
|
||||||
|
} finally {
|
||||||
|
this.#animating = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare the library for swipe-driven state changes. Works whether the
|
||||||
|
* library is currently open (close swipe) or closed (open swipe). After
|
||||||
|
* this resolves, callers drive `updateSwipeProgress(0..1)` directly until
|
||||||
|
* `finishSwipe(targetOpen)` commits or reverts.
|
||||||
|
*/
|
||||||
|
static async beginSwipe() {
|
||||||
|
// Refuse to enter swipe mode while a non-swipe animation is still
|
||||||
|
// running; let it finish so the start/end states are well-defined.
|
||||||
|
if (gZenLibraryInstance?.#animating) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const instance = this.getInstance();
|
||||||
|
if (instance._deletionIdleCallbackId) {
|
||||||
|
cancelIdleCallback(instance._deletionIdleCallbackId);
|
||||||
|
instance._deletionIdleCallbackId = null;
|
||||||
|
}
|
||||||
|
instance.#cancelActiveAnimations();
|
||||||
|
const wasOpen = instance.hasAttribute("open");
|
||||||
|
if (wasOpen) {
|
||||||
|
// Library is already open; the wrapper's current inline transform IS
|
||||||
|
// the target — no remeasure needed.
|
||||||
|
instance._swipeWrapperTargetPx =
|
||||||
|
new DOMMatrix(lazy.appContentWrapper.style.transform).m41 ||
|
||||||
|
instance.#computeWrapperTargetPx();
|
||||||
|
} else {
|
||||||
|
// Measure the open-state wrapper target without flashing: temporarily
|
||||||
|
// mark [open] so layout reflects the open position, then revert.
|
||||||
|
instance.setAttribute("open", "true");
|
||||||
|
instance.style.visibility = "hidden";
|
||||||
|
await new Promise(r => requestAnimationFrame(r));
|
||||||
|
instance._swipeWrapperTargetPx = instance.#computeWrapperTargetPx();
|
||||||
|
instance.style.visibility = "";
|
||||||
|
instance.removeAttribute("open");
|
||||||
|
lazy.appContentWrapper.style.transform = "";
|
||||||
|
}
|
||||||
|
instance._swipeActive = true;
|
||||||
|
// Initialize visual state to match the current attribute.
|
||||||
|
ZenLibrary.updateSwipeProgress(wasOpen ? 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the library, toolbox, and content-wrapper styles to a fraction
|
||||||
|
* (0..1) of the way to fully open. Must be preceded by `beginSwipe()`.
|
||||||
|
*
|
||||||
|
* @param {number} progress
|
||||||
|
*/
|
||||||
|
static updateSwipeProgress(progress) {
|
||||||
|
const instance = gZenLibraryInstance;
|
||||||
|
if (!instance?._swipeActive) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const p = Math.max(0, Math.min(1, progress));
|
||||||
|
instance.style.transform = `translateX(${(-1 + p) * 100}%)`;
|
||||||
|
instance.style.opacity = String(p);
|
||||||
|
const targetOpacity = Number(ZenLibrary.#TOOLBOX_OPEN_OPACITY);
|
||||||
|
gNavToolbox.style.setProperty(
|
||||||
|
"transform",
|
||||||
|
`scale(${1 - p * 0.04})`,
|
||||||
|
"important"
|
||||||
|
);
|
||||||
|
gNavToolbox.style.setProperty(
|
||||||
|
"opacity",
|
||||||
|
String(1 - p * (1 - targetOpacity)),
|
||||||
|
"important"
|
||||||
|
);
|
||||||
|
lazy.appContentWrapper.style.setProperty(
|
||||||
|
"transform",
|
||||||
|
`translateX(${p * (instance._swipeWrapperTargetPx ?? 0)}px)`,
|
||||||
|
"important"
|
||||||
|
);
|
||||||
|
instance._swipeProgress = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finish a swipe gesture. If `targetOpen` is true, animate the remaining
|
||||||
|
* distance to fully open; otherwise animate to fully closed and dispose
|
||||||
|
* the instance like a normal close.
|
||||||
|
*
|
||||||
|
* @param {boolean} targetOpen
|
||||||
|
*/
|
||||||
|
static async finishSwipe(targetOpen) {
|
||||||
|
const instance = gZenLibraryInstance;
|
||||||
|
if (!instance?._swipeActive) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
instance._swipeActive = false;
|
||||||
|
|
||||||
|
const libFromTransform = instance.style.transform;
|
||||||
|
const libFromOpacity = instance.style.opacity;
|
||||||
|
const tbFromTransform = gNavToolbox.style.transform;
|
||||||
|
const tbFromOpacity = gNavToolbox.style.opacity;
|
||||||
|
const wrapperFromX = new DOMMatrix(lazy.appContentWrapper.style.transform)
|
||||||
|
.m41;
|
||||||
|
|
||||||
|
// Hand off styling to WAAPI by clearing the inline styles we set during
|
||||||
|
// the swipe; the keyframes restore the from-state on their first frame.
|
||||||
|
instance.style.transform = "";
|
||||||
|
instance.style.opacity = "";
|
||||||
|
gNavToolbox.style.transform = "";
|
||||||
|
gNavToolbox.style.opacity = "";
|
||||||
|
lazy.appContentWrapper.style.transform = "";
|
||||||
|
|
||||||
|
if (targetOpen) {
|
||||||
|
instance.setAttribute("open", "true");
|
||||||
|
gNavToolbox.setAttribute("zen-library-open", "true");
|
||||||
|
instance.#animate(instance, [
|
||||||
|
{ transform: libFromTransform, opacity: libFromOpacity },
|
||||||
|
{ transform: "translateX(0)", opacity: 1 },
|
||||||
|
]);
|
||||||
|
instance.#animate(gNavToolbox, [
|
||||||
|
{ transform: tbFromTransform, opacity: tbFromOpacity },
|
||||||
|
{
|
||||||
|
transform: ZenLibrary.#TOOLBOX_OPEN_TRANSFORM,
|
||||||
|
opacity: ZenLibrary.#TOOLBOX_OPEN_OPACITY,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
const wrapperAnim = instance.#animate(lazy.appContentWrapper, [
|
||||||
|
{ transform: `translateX(${wrapperFromX}px)` },
|
||||||
|
{ transform: `translateX(${instance._swipeWrapperTargetPx}px)` },
|
||||||
|
]);
|
||||||
|
try {
|
||||||
|
await wrapperAnim.finished;
|
||||||
|
if (instance.isOpen) {
|
||||||
|
wrapperAnim.commitStyles();
|
||||||
|
wrapperAnim.cancel();
|
||||||
|
instance.#activeAnimations.delete(wrapperAnim);
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
/* cancelled by a follow-up toggle */
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
instance.removeAttribute("open");
|
||||||
|
gNavToolbox.removeAttribute("zen-library-open");
|
||||||
|
instance.#animate(instance, [
|
||||||
|
{ transform: libFromTransform, opacity: libFromOpacity },
|
||||||
|
{ transform: "translateX(-100%)", opacity: 0 },
|
||||||
|
]);
|
||||||
|
instance.#animate(gNavToolbox, [
|
||||||
|
{ transform: tbFromTransform, opacity: tbFromOpacity },
|
||||||
|
{ transform: "scale(1)", opacity: 1 },
|
||||||
|
]);
|
||||||
|
instance.#animate(lazy.appContentWrapper, [
|
||||||
|
{ transform: `translateX(${wrapperFromX}px)` },
|
||||||
|
{ transform: "translateX(0)" },
|
||||||
|
]);
|
||||||
|
if (!instance._deletionIdleCallbackId) {
|
||||||
|
instance._deletionIdleCallbackId = requestIdleCallback(() => {
|
||||||
|
ZenLibrary.clearInstance();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async #animateClose() {
|
||||||
|
this.#animating = true;
|
||||||
|
try {
|
||||||
|
this.#cancelActiveAnimations();
|
||||||
|
const wrapperCurrent =
|
||||||
|
lazy.appContentWrapper.style.transform ||
|
||||||
|
getComputedStyle(lazy.appContentWrapper).transform ||
|
||||||
|
"translateX(0)";
|
||||||
|
lazy.appContentWrapper.style.transform = "";
|
||||||
|
|
||||||
|
const libAnim = this.#animate(this, [
|
||||||
|
{ transform: "translateX(0)", opacity: 1 },
|
||||||
|
{ transform: "translateX(-100%)", opacity: 0 },
|
||||||
|
]);
|
||||||
|
this.#animate(gNavToolbox, [
|
||||||
|
{
|
||||||
|
transform: ZenLibrary.#TOOLBOX_OPEN_TRANSFORM,
|
||||||
|
opacity: ZenLibrary.#TOOLBOX_OPEN_OPACITY,
|
||||||
|
},
|
||||||
|
{ transform: "scale(1)", opacity: 1 },
|
||||||
|
]);
|
||||||
|
this.#animate(lazy.appContentWrapper, [
|
||||||
|
{ transform: wrapperCurrent },
|
||||||
|
{ transform: "translateX(0)" },
|
||||||
|
]);
|
||||||
|
|
||||||
|
try {
|
||||||
|
await libAnim.finished;
|
||||||
|
} catch {
|
||||||
|
// Cancelled by a follow-up open before the slide finished.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// If the user re-opened in the meantime, leave the live instance alone.
|
||||||
|
if (this.isOpen) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!this._deletionIdleCallbackId) {
|
||||||
|
this._deletionIdleCallbackId = requestIdleCallback(() => {
|
||||||
|
ZenLibrary.clearInstance();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
this.#animating = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
customElements.define("zen-library", ZenLibrary);
|
||||||
556
src/zen/library/ZenLibraryButton.mjs
Normal file
@@ -0,0 +1,556 @@
|
|||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
import { nsZenDOMOperatedFeature } from "chrome://browser/content/zen-components/ZenCommonUtils.mjs";
|
||||||
|
|
||||||
|
const lazy = {};
|
||||||
|
ChromeUtils.defineESModuleGetters(lazy, {
|
||||||
|
DownloadsCommon:
|
||||||
|
"moz-src:///browser/components/downloads/DownloadsCommon.sys.mjs",
|
||||||
|
DownloadsViewUI:
|
||||||
|
"moz-src:///browser/components/downloads/DownloadsViewUI.sys.mjs",
|
||||||
|
DownloadUtils: "resource://gre/modules/DownloadUtils.sys.mjs",
|
||||||
|
FileUtils: "resource://gre/modules/FileUtils.sys.mjs",
|
||||||
|
});
|
||||||
|
|
||||||
|
const RECENT_KEEP = 5;
|
||||||
|
// Mouse can stray this far past the panel/button before we dismiss the stack.
|
||||||
|
const HOVER_TOLERANCE_TOP_PX = 100;
|
||||||
|
const HOVER_TOLERANCE_SIDE_PX = 40;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Per-window controller for the toolbar Library button:
|
||||||
|
* - Watches downloads and overlays a progress ring on the button while
|
||||||
|
* anything is in flight (indeterminate spinner when total bytes are
|
||||||
|
* unknown).
|
||||||
|
* - Pops a small panel with the most recent finished/active downloads
|
||||||
|
* when the user hovers the button.
|
||||||
|
*/
|
||||||
|
class nsZenLibraryButton extends nsZenDOMOperatedFeature {
|
||||||
|
#button = null;
|
||||||
|
#downloads = null;
|
||||||
|
#view = null;
|
||||||
|
#active = new Set();
|
||||||
|
#recent = [];
|
||||||
|
#panel = null;
|
||||||
|
#closeAnim = null;
|
||||||
|
#trackingMouse = false;
|
||||||
|
#contextMenuOpen = false;
|
||||||
|
|
||||||
|
init() {
|
||||||
|
this.#button = document.getElementById("zen-library-button");
|
||||||
|
if (!this.#button) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.#setupDownloads();
|
||||||
|
|
||||||
|
this.#button.addEventListener("mouseenter", this);
|
||||||
|
window.addEventListener("unload", this, { once: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
handleEvent(event) {
|
||||||
|
switch (event.type) {
|
||||||
|
case "mouseenter":
|
||||||
|
this.#onEnter();
|
||||||
|
break;
|
||||||
|
case "mousemove":
|
||||||
|
this.#checkMousePosition(event);
|
||||||
|
break;
|
||||||
|
case "unload":
|
||||||
|
this.#button?.removeEventListener("mouseenter", this);
|
||||||
|
this.#detachMouseTracking();
|
||||||
|
if (this.#downloads && this.#view) {
|
||||||
|
this.#downloads.removeView(this.#view);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#setupDownloads() {
|
||||||
|
this.#downloads = lazy.DownloadsCommon.getData(window, true);
|
||||||
|
this.#view = {
|
||||||
|
onDownloadAdded: dl => {
|
||||||
|
if (!dl.stopped) {
|
||||||
|
this.#active.add(dl);
|
||||||
|
} else if (dl.succeeded) {
|
||||||
|
this.#pushRecent(dl);
|
||||||
|
}
|
||||||
|
this.#updateRing();
|
||||||
|
this.#refreshPanel();
|
||||||
|
},
|
||||||
|
onDownloadChanged: dl => {
|
||||||
|
if (dl.stopped) {
|
||||||
|
this.#active.delete(dl);
|
||||||
|
if (dl.succeeded) {
|
||||||
|
this.#pushRecent(dl);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.#active.add(dl);
|
||||||
|
}
|
||||||
|
this.#updateRing();
|
||||||
|
this.#refreshPanel();
|
||||||
|
},
|
||||||
|
onDownloadRemoved: dl => {
|
||||||
|
this.#active.delete(dl);
|
||||||
|
this.#recent = this.#recent.filter(d => d !== dl);
|
||||||
|
this.#updateRing();
|
||||||
|
this.#refreshPanel();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
this.#downloads.addView(this.#view);
|
||||||
|
}
|
||||||
|
|
||||||
|
#pushRecent(dl) {
|
||||||
|
if (!this.#recent.includes(dl)) {
|
||||||
|
this.#recent.unshift(dl);
|
||||||
|
this.#recent = this.#recent.slice(0, RECENT_KEEP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Update the conic-gradient progress + indeterminate state on the button. */
|
||||||
|
#updateRing() {
|
||||||
|
if (!this.#button) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.#active.size === 0) {
|
||||||
|
this.#button.removeAttribute("downloading");
|
||||||
|
this.#button.removeAttribute("downloading-indeterminate");
|
||||||
|
this.#button.style.removeProperty("--zen-library-button-progress");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let total = 0;
|
||||||
|
let current = 0;
|
||||||
|
let hasUnknown = false;
|
||||||
|
for (const dl of this.#active) {
|
||||||
|
if (dl.hasProgress && dl.totalBytes > 0) {
|
||||||
|
total += dl.totalBytes;
|
||||||
|
current += dl.currentBytes;
|
||||||
|
} else {
|
||||||
|
hasUnknown = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.#button.setAttribute("downloading", "true");
|
||||||
|
if (hasUnknown || total === 0) {
|
||||||
|
this.#button.setAttribute("downloading-indeterminate", "true");
|
||||||
|
this.#button.style.removeProperty("--zen-library-button-progress");
|
||||||
|
} else {
|
||||||
|
this.#button.removeAttribute("downloading-indeterminate");
|
||||||
|
const ratio = Math.max(0, Math.min(1, current / total));
|
||||||
|
this.#button.style.setProperty(
|
||||||
|
"--zen-library-button-progress",
|
||||||
|
String(ratio)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ensurePanel() {
|
||||||
|
if (this.#panel) {
|
||||||
|
return this.#panel;
|
||||||
|
}
|
||||||
|
const stack = document.createElement("div");
|
||||||
|
stack.id = "zen-library-button-panel";
|
||||||
|
stack.classList.add("zen-library-button-panel");
|
||||||
|
stack.dataset.state = "closed";
|
||||||
|
|
||||||
|
const list = document.createElement("div");
|
||||||
|
list.className = "zen-library-button-panel-list";
|
||||||
|
stack.appendChild(list);
|
||||||
|
|
||||||
|
const host = document.getElementById("zen-sidebar-foot-buttons");
|
||||||
|
host.before(stack);
|
||||||
|
this.#panel = stack;
|
||||||
|
return stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
#refreshPanel() {
|
||||||
|
if (!this.#panel || this.#panel.dataset.state !== "open") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.#populatePanel();
|
||||||
|
}
|
||||||
|
|
||||||
|
#populatePanel() {
|
||||||
|
const items = [
|
||||||
|
...Array.from(this.#active),
|
||||||
|
...this.#recent.filter(d => !this.#active.has(d)),
|
||||||
|
].slice(0, RECENT_KEEP);
|
||||||
|
|
||||||
|
if (!items.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const panel = this.#ensurePanel();
|
||||||
|
const list = panel.querySelector(".zen-library-button-panel-list");
|
||||||
|
list.replaceChildren();
|
||||||
|
|
||||||
|
for (const dl of items) {
|
||||||
|
list.appendChild(this.#renderRow(dl));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#renderRow(dl) {
|
||||||
|
const row = document.createElement("div");
|
||||||
|
row.className = "zen-library-button-panel-row";
|
||||||
|
if (this.#isFileMissing(dl)) {
|
||||||
|
row.dataset.fileDeleted = "true";
|
||||||
|
}
|
||||||
|
row.addEventListener("click", () => {
|
||||||
|
if (dl.succeeded) {
|
||||||
|
lazy.DownloadsCommon.openDownload(dl).catch(console.error);
|
||||||
|
} else if (dl.source?.url) {
|
||||||
|
window.openTrustedLinkIn(dl.source.url, "tab");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
row.addEventListener("contextmenu", e => this.#showContextMenu(e, dl));
|
||||||
|
|
||||||
|
const icon = document.createElement("img");
|
||||||
|
icon.className = "zen-library-button-panel-icon";
|
||||||
|
icon.alt = "";
|
||||||
|
icon.src = dl.target?.path
|
||||||
|
? `moz-icon://${dl.target.path}?size=16`
|
||||||
|
: "moz-icon://.unknown?size=16";
|
||||||
|
row.appendChild(icon);
|
||||||
|
|
||||||
|
const labels = document.createElement("div");
|
||||||
|
labels.className = "zen-library-button-panel-labels";
|
||||||
|
|
||||||
|
const display = lazy.DownloadsViewUI.getDisplayName(dl);
|
||||||
|
const name = typeof display === "string" ? display : dl.source?.url || "";
|
||||||
|
const label = document.createXULElement("label");
|
||||||
|
label.className = "zen-library-button-panel-name";
|
||||||
|
label.textContent = name;
|
||||||
|
labels.appendChild(label);
|
||||||
|
|
||||||
|
const sublabel = document.createXULElement("label");
|
||||||
|
sublabel.className = "zen-library-button-panel-status";
|
||||||
|
sublabel.textContent = this.#statusFor(dl);
|
||||||
|
labels.appendChild(sublabel);
|
||||||
|
|
||||||
|
row.appendChild(labels);
|
||||||
|
return row;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** True when the on-disk file is gone (deleted / moved). */
|
||||||
|
#isFileMissing(dl) {
|
||||||
|
if (!dl) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (dl.deleted) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return dl.succeeded && dl.target?.exists === false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#statusFor(dl) {
|
||||||
|
const C = lazy.DownloadsCommon;
|
||||||
|
const state = C.stateOfDownload(dl);
|
||||||
|
if (state === C.DOWNLOAD_DOWNLOADING) {
|
||||||
|
const total = dl.hasProgress ? dl.totalBytes : -1;
|
||||||
|
const [status] = lazy.DownloadUtils.getDownloadStatus(
|
||||||
|
dl.currentBytes,
|
||||||
|
total,
|
||||||
|
dl.speed
|
||||||
|
);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
if (state === C.DOWNLOAD_FINISHED) {
|
||||||
|
return (
|
||||||
|
lazy.DownloadsViewUI.getSizeWithUnits(dl) ||
|
||||||
|
C.strings.sizeUnknown ||
|
||||||
|
""
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (state === C.DOWNLOAD_PAUSED) {
|
||||||
|
return C.strings.statePaused || "Paused";
|
||||||
|
}
|
||||||
|
if (state === C.DOWNLOAD_FAILED) {
|
||||||
|
return C.strings.stateFailed || "Failed";
|
||||||
|
}
|
||||||
|
if (state === C.DOWNLOAD_CANCELED) {
|
||||||
|
return C.strings.stateCanceled || "Canceled";
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Right-click → small XUL menupopup mirroring the relevant subset of
|
||||||
|
* Firefox's `downloadsContextMenu` (built dynamically so we can react to
|
||||||
|
* each row's current state). Reuses `browser/downloads.ftl` strings.
|
||||||
|
*/
|
||||||
|
#showContextMenu(event, dl) {
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
const C = lazy.DownloadsCommon;
|
||||||
|
const state = C.stateOfDownload(dl);
|
||||||
|
const isFinished = state === C.DOWNLOAD_FINISHED;
|
||||||
|
const isActive =
|
||||||
|
state === C.DOWNLOAD_DOWNLOADING || state === C.DOWNLOAD_PAUSED;
|
||||||
|
const fileExists = isFinished && dl.target?.exists !== false && !dl.deleted;
|
||||||
|
const sourceUrl = dl.source?.originalUrl || dl.source?.url;
|
||||||
|
const items = [];
|
||||||
|
|
||||||
|
if (state === C.DOWNLOAD_DOWNLOADING) {
|
||||||
|
items.push({
|
||||||
|
l10nId: "downloads-cmd-pause",
|
||||||
|
onClick: () => dl.cancel().catch(() => {}),
|
||||||
|
});
|
||||||
|
} else if (state === C.DOWNLOAD_PAUSED) {
|
||||||
|
items.push({
|
||||||
|
l10nId: "downloads-cmd-resume",
|
||||||
|
onClick: () => dl.start?.().catch(() => {}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileExists) {
|
||||||
|
items.push({
|
||||||
|
l10nId: "downloads-cmd-show-menuitem-2",
|
||||||
|
onClick: () => {
|
||||||
|
try {
|
||||||
|
const file = new lazy.FileUtils.File(dl.target.path);
|
||||||
|
C.showDownloadedFile(file);
|
||||||
|
} catch (ex) {
|
||||||
|
console.error(ex);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sourceUrl) {
|
||||||
|
items.push({
|
||||||
|
l10nId: "downloads-cmd-go-to-download-page",
|
||||||
|
onClick: () => window.openTrustedLinkIn(sourceUrl, "tab"),
|
||||||
|
});
|
||||||
|
items.push({
|
||||||
|
l10nId: "downloads-cmd-copy-download-link",
|
||||||
|
onClick: () => {
|
||||||
|
const helper = Cc[
|
||||||
|
"@mozilla.org/widget/clipboardhelper;1"
|
||||||
|
].getService(Ci.nsIClipboardHelper);
|
||||||
|
helper.copyString(sourceUrl);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
items.push({ separator: true });
|
||||||
|
|
||||||
|
if (fileExists) {
|
||||||
|
items.push({
|
||||||
|
l10nId: "downloads-cmd-delete-file",
|
||||||
|
onClick: () => {
|
||||||
|
C.deleteDownloadFiles(
|
||||||
|
dl,
|
||||||
|
lazy.DownloadsViewUI.clearHistoryOnDelete
|
||||||
|
).catch(console.error);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isActive) {
|
||||||
|
items.push({
|
||||||
|
l10nId: "downloads-cmd-remove-from-history",
|
||||||
|
onClick: () => C.deleteDownload(dl).catch(console.error),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!items.some(i => !i.separator)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const popupSet = document.getElementById("mainPopupSet");
|
||||||
|
const popup = document.createXULElement("menupopup");
|
||||||
|
for (const item of items) {
|
||||||
|
if (item.separator) {
|
||||||
|
if (
|
||||||
|
!popup.lastChild ||
|
||||||
|
popup.lastChild.tagName === "menuseparator"
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
popup.appendChild(document.createXULElement("menuseparator"));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const mi = document.createXULElement("menuitem");
|
||||||
|
mi.setAttribute("data-l10n-id", item.l10nId);
|
||||||
|
mi.addEventListener(
|
||||||
|
"command",
|
||||||
|
() => {
|
||||||
|
try {
|
||||||
|
item.onClick?.();
|
||||||
|
} catch (ex) {
|
||||||
|
console.error(ex);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ once: true }
|
||||||
|
);
|
||||||
|
popup.appendChild(mi);
|
||||||
|
}
|
||||||
|
// Drop a trailing separator if any.
|
||||||
|
while (popup.lastChild?.tagName === "menuseparator") {
|
||||||
|
popup.lastChild.remove();
|
||||||
|
}
|
||||||
|
// Pin the hover panel open for the lifetime of the context menu — the
|
||||||
|
// popup briefly steals focus and would otherwise let the mouse-distance
|
||||||
|
// check dismiss the stack mid-interaction.
|
||||||
|
this.#contextMenuOpen = true;
|
||||||
|
popup.addEventListener(
|
||||||
|
"popuphidden",
|
||||||
|
() => {
|
||||||
|
this.#contextMenuOpen = false;
|
||||||
|
popup.remove();
|
||||||
|
// Re-evaluate distance now that the popup is gone.
|
||||||
|
if (this.#panel?.dataset.state === "open") {
|
||||||
|
this.#checkMousePosition();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ once: true }
|
||||||
|
);
|
||||||
|
popupSet.appendChild(popup);
|
||||||
|
popup.openPopupAtScreen(event.screenX, event.screenY, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
#onEnter() {
|
||||||
|
if (this.#active.size === 0 && this.#recent.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Customize mode can move the button out of the sidebar's foot toolbar —
|
||||||
|
// the inline stack only makes sense when it's still there.
|
||||||
|
if (!this.#button.closest("#zen-sidebar-foot-buttons")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Interrupt a pending close so we reuse the same element instead of
|
||||||
|
// racing a tear-down.
|
||||||
|
this.#closeAnim?.cancel();
|
||||||
|
this.#closeAnim = null;
|
||||||
|
|
||||||
|
const panel = this.#ensurePanel();
|
||||||
|
this.#populatePanel();
|
||||||
|
panel.dataset.state = "open";
|
||||||
|
this.#updateMaskHeight(panel);
|
||||||
|
panel.animate(
|
||||||
|
[
|
||||||
|
{ opacity: 0, transform: "translateY(8px)" },
|
||||||
|
{ opacity: 1, transform: "translateY(0)" },
|
||||||
|
],
|
||||||
|
{
|
||||||
|
duration: 180,
|
||||||
|
easing: "cubic-bezier(0.32, 0.72, 0, 1)",
|
||||||
|
fill: "forwards",
|
||||||
|
id: "zen-library-stack-open",
|
||||||
|
}
|
||||||
|
);
|
||||||
|
this.#attachMouseTracking();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Publish the panel's rendered height as a CSS variable on the tab strip
|
||||||
|
* so the strip's mask gradient fades over exactly the area the stack
|
||||||
|
* occupies (instead of a hardcoded amount).
|
||||||
|
*/
|
||||||
|
#updateMaskHeight(panel) {
|
||||||
|
const tabs = window.gBrowser?.tabContainer;
|
||||||
|
if (!tabs) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
if (!panel.isConnected) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const h = Math.ceil(panel.getBoundingClientRect().height);
|
||||||
|
tabs.style.setProperty("--zen-library-stack-height", `${h}px`);
|
||||||
|
tabs.setAttribute("zen-library-stack-open", "true");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#attachMouseTracking() {
|
||||||
|
if (this.#trackingMouse) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
window.addEventListener("mousemove", this, true);
|
||||||
|
this.#trackingMouse = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#detachMouseTracking() {
|
||||||
|
if (!this.#trackingMouse) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
window.removeEventListener("mousemove", this, true);
|
||||||
|
this.#trackingMouse = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hide the stack when the cursor moves outside a tolerance zone around the
|
||||||
|
* panel + button: HOVER_TOLERANCE_TOP_PX above, HOVER_TOLERANCE_SIDE_PX on
|
||||||
|
* either side (and the same below). Pinned open while a context menu is up.
|
||||||
|
*/
|
||||||
|
#checkMousePosition(event) {
|
||||||
|
if (this.#contextMenuOpen || !this.#panel) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.#panel.dataset.state !== "open") {
|
||||||
|
this.#detachMouseTracking();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const x = event?.clientX ?? -Infinity;
|
||||||
|
const y = event?.clientY ?? -Infinity;
|
||||||
|
const panelRect = this.#panel.getBoundingClientRect();
|
||||||
|
const buttonRect = this.#button?.getBoundingClientRect();
|
||||||
|
const left =
|
||||||
|
Math.min(panelRect.left, buttonRect?.left ?? panelRect.left) -
|
||||||
|
HOVER_TOLERANCE_SIDE_PX;
|
||||||
|
const right =
|
||||||
|
Math.max(panelRect.right, buttonRect?.right ?? panelRect.right) +
|
||||||
|
HOVER_TOLERANCE_SIDE_PX;
|
||||||
|
const top = panelRect.top - HOVER_TOLERANCE_TOP_PX;
|
||||||
|
const bottom =
|
||||||
|
Math.max(panelRect.bottom, buttonRect?.bottom ?? panelRect.bottom) +
|
||||||
|
HOVER_TOLERANCE_SIDE_PX;
|
||||||
|
if (x < left || x > right || y < top || y > bottom) {
|
||||||
|
this.#hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#hide() {
|
||||||
|
if (!this.#panel || this.#closeAnim) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.#detachMouseTracking();
|
||||||
|
const tabs = window.gBrowser?.tabContainer;
|
||||||
|
tabs?.removeAttribute("zen-library-stack-open");
|
||||||
|
const panel = this.#panel;
|
||||||
|
panel.dataset.state = "closed";
|
||||||
|
const anim = panel.animate(
|
||||||
|
[
|
||||||
|
{ opacity: 1, transform: "translateY(0)" },
|
||||||
|
{ opacity: 0, transform: "translateY(8px)" },
|
||||||
|
],
|
||||||
|
{
|
||||||
|
duration: 140,
|
||||||
|
easing: "cubic-bezier(0.32, 0.72, 0, 1)",
|
||||||
|
fill: "forwards",
|
||||||
|
id: "zen-library-stack-close",
|
||||||
|
}
|
||||||
|
);
|
||||||
|
this.#closeAnim = anim;
|
||||||
|
anim.finished.then(
|
||||||
|
() => {
|
||||||
|
if (this.#closeAnim !== anim) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
panel.remove();
|
||||||
|
if (this.#panel === panel) {
|
||||||
|
this.#panel = null;
|
||||||
|
}
|
||||||
|
this.#closeAnim = null;
|
||||||
|
tabs?.style.removeProperty("--zen-library-stack-height");
|
||||||
|
},
|
||||||
|
() => {
|
||||||
|
/* cancelled — re-entered while closing */
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
new nsZenLibraryButton();
|
||||||