Merge branch 'dev'

This commit is contained in:
alstjr7375 2021-07-29 10:14:03 +09:00
commit 7757238c47
8 changed files with 2228 additions and 141 deletions

View file

@ -27,7 +27,7 @@ jobs:
BRANCH=${{ matrix.branch }}
TAGVER=${GITHUB_REF#refs/*/}
echo -e "Ver=${TAGVER}\nBranch=${BRANCH}" > LEPTON
echo -e "\[Info\]\nVer=${TAGVER}\nBranch=${BRANCH}" > LEPTON
- name: Release Structure
run: |

15
CREDITS
View file

@ -38,10 +38,22 @@ N: Multi-Account-Containers
W: https://github.com/mozilla/multi-account-containers
L: MPL 2.0
N: PS-Menu
W: https://github.com/chrisseroka/ps-menu
L: MIT
N: Quantum Nox Firefox Dark Full Theme
W: https://github.com/Izheil/Quantum-Nox-Firefox-Dark-Full-Theme
L: MPL 2.0
N: quietfox
W: https://github.com/coekuss/quietfox
L: MIT
N: ShadowFox
W: https://github.com/overdodactyl/ShadowFox
L: MIT
N: SVG Repo
E: info@svgrepo.com
W: https://www.svgrepo.com
@ -84,6 +96,9 @@ N: Burak Yigit Kaya
E: ben@byk.im
W: https://byk.im/
N: James Upjohn
E: jammehcow@jammehcow.co.nz
N: mamen
W: https://www.mamen.at

1
LEPTON
View file

@ -1 +1,2 @@
[Info]
Branch=master

View file

@ -32,6 +32,10 @@
(Lepton's design :arrow_up:)
- *Color*
- Default light/dark theme constrast enhancement
- Colorful context menu
- More dark mode support
- GTK system theme support
- Windows system theme support
- Windows7 compatibility
- *Icons*
@ -42,6 +46,7 @@
- Panel
- Menu
- Density
- Others...
- *Tab Design*
- General:
- Connect with toolbar(Buttons like tabs)
@ -75,10 +80,15 @@
*Script Installation(experimental)*
Linux, mac users:
#+BEGIN_SRC
#+BEGIN_SRC bash
bash -c "$(curl -fsSL https://raw.githubusercontent.com/black7375/Firefox-UI-Fix/master/install.sh)"
#+END_SRC
Windows users: Run powershell as administrator
#+BEGIN_SRC powershell
Powershell -c "iwr https://raw.githubusercontent.com/black7375/Firefox-UI-Fix/master/install.ps1 -useb | iex"
#+END_SRC
*Menual Inatallation*
You can see the [[https://github.com/black7375/Firefox-UI-Fix/wiki/Installation-Guide][installation guide]] with screenshots on the wiki.

794
install.ps1 Normal file
View file

@ -0,0 +1,794 @@
<#
.SYNOPSIS
Installer for Lepton
.DESCRIPTION
Installs Lepton onto selected Firefox profiles
.INPUTS
TODO: input directories for installation?
Would need to discuss a non-interactive install system
.OUTPUTS
TODO: output directories that Lepton has been installed to?
.PARAMETER u
Specifies whether to update a current installation
Defaults to false
.PARAMETER f
Specifies a custom path to look for Firefox profiles in
.PARAMETER p
Specifies a custom name to use when creating a profile
.PARAMETER h
Shows this help message
.PARAMETER ?
Shows this help message
.PARAMETER WhatIf
Runs the installer without actioning any file copies/moves
Equivelant to a dry-run
.EXAMPLE
PS> .\Install.ps1 -u -f C:\Users\someone\ff-profiles
Updates current installations in the profile directory 'C:\Users\someone\ff-profiles'
.LINK
https://github.com/black7375/Firefox-UI-Fix#readme
#>
[CmdletBinding(
SupportsShouldProcess = $true,
PositionalBinding = $false
)]
param(
[Alias("u")]
[Switch]$updateMode,
[Alias("f")]
[string]$profileDir,
[Alias("p")]
[string]$profileName,
[Alias("h")]
[Switch]$help = $false
)
#** Helper Utils ***************************************************************
#== Message ====================================================================
function Lepton-ErrorMessage() {
Write-Error "FAILED: ${args}"
exit -1
}
function Lepton-OKMessage() {
$local:SIZE = 50
$local:FILLED = ""
for ($i = 0; $i -le ($SIZE - 2); $i++) {
$FILLED += "."
}
$FILLED += "OK"
$local:message = "${args}"
Write-Host ${message}(${FILLED}.Substring(${message}.Length))
}
$PSMinSupportedVersion = 2
function Verify-PowerShellVersion {
Write-Host -NoNewline "Checking PowerShell version... "
$PSVersion = [int](Select-Object -Property Major -First 1 -ExpandProperty Major -InputObject $PSVersionTable.PSVersion)
Write-Host "[$PSVersion]"
if ($PSVersion -lt $PSMinSupportedVersion) {
Write-Error -Category NotInstalled "You need a minimum PowerShell version of [$PSMinSupportedVersion] to use this installer"
exit -1
}
}
#== Required Tools =============================================================
function Install-Choco() {
# https://chocolatey.org/install
Set-ExecutionPolicy Bypass -Scope Process -Force
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
}
function Check-Git() {
if( -Not (Get-Command git) ) {
if ( -Not (Get-Command choco)) {
Install-Choco
}
choco install git -y
}
Lepton-OKMessage "Required - git"
}
#== PATH / File ================================================================
$currentDir = (Get-Location).path
function Filter-Path() {
Param (
[Parameter(Mandatory=$true, Position=0)]
[string[]] $pathList,
[Parameter(Position=1)]
[string] $option = "Any"
)
return $pathList.Where({ Test-Path -Path "$_" -PathType "${option}" })
}
function Copy-Auto() {
Param (
[Parameter(Mandatory=$true, Position=0)]
[string] $file,
[Parameter(Mandatory=$true, Position=1)]
[string] $target
)
if ( "${file}" -eq "${target}" ) {
Write-Host "'${file}' and ${target} are same file"
return 0
}
if ( Test-Path -Path "${target}" ) {
Write-Host "${target} alreay exist."
Write-Host "Now Backup.."
Copy-Auto "${target}" "${target}.bak"
Write-Host ""
}
Copy-Item -Path "${file}" -Destination "${target}" -Force
}
function Move-Auto() {
Param (
[Parameter(Mandatory=$true, Position=0)]
[string] $file,
[Parameter(Mandatory=$true, Position=1)]
[string] $target
)
if ( "${file}" -eq "${target}" ) {
Write-Host "'${file}' and ${target} are same file"
return 0
}
if ( Test-Path -Path "${target}" ) {
Write-Host "${target} alreay exist."
Write-Host "Now Backup.."
Move-Auto "${target}" "${target}.bak"
Write-Host ""
}
Move-Item -Path "${file}" -Destination "${target}" -Force
}
function Restore-Auto() {
Param (
[Parameter(Mandatory=$true, Position=0)]
[string] $file
)
$local:target = "${file}.bak"
if ( Test-Path -Path "${file}" ) {
Remove-Item "${file}" -Recurse -Force
}
Move-Item -Path "${target}" -Destination "${file}" -Force
$local:loopupTarget = "${target}.bak"
if ( Test-Path -Path "${lookupTarget}" ) {
Restore-Auto "${target}"
}
}
function Write-File() {
Param (
[Parameter(Mandatory=$true, Position=0)]
[string] $filePath,
[Parameter(Position=1)]
[string] $fileContent = ""
)
if ( "${fileContent}" -eq "" ) {
New-Item -Path "${filePath}" -Force
}
else {
Out-File -FilePath "${filePath}" -InputObject "${fileContent}" -Force
}
}
#== INI File ================================================================
# https://devblogs.microsoft.com/scripting/use-powershell-to-work-with-any-ini-file/
function Get-IniContent () {
Param (
[Parameter(Mandatory=$true, Position=0)]
[string] $filePath
)
$ini = @{}
switch -regex -file $filePath {
"^\[(.+)\]" {
# Section
$section = $matches[1]
$ini[$section] = @{}
$CommentCount = 0
}
"^(;.*)$" {
# Comment
$value = $matches[1]
$CommentCount = $CommentCount + 1
$name = Comment + $CommentCount
$ini[$section][$name] = $value
}
"(.+?)\s*=(.*)" {
# For compatibility
if ( $section -eq $null ) {
$section = "Info"
$ini[$section] = @{}
}
# Key
$name,$value = $matches[1..2]
$ini[$section][$name] = $value
}
}
return $ini
}
function Out-IniFile() {
Param (
[Parameter(Mandatory=$true, Position=0)]
[string] $filePath,
[Parameter(Position=1)]
[hashtable] $iniObject = @{}
)
# Create new file
$local:outFile = New-Item -ItemType file -Path "${filepath}" -Force
foreach ($i in $iniObject.keys) {
if (!($($iniObject[$i].GetType().Name) -eq "Hashtable")) {
#No Sections
Add-Content -Path $outFile -Value "$i=$($iniObject[$i])"
}
else {
#Sections
Add-Content -Path $outFile -Value "[$i]"
Foreach ($j in ($iniObject[$i].keys | Sort-Object)) {
if ($j -match "^Comment[\d]+") {
Add-Content -Path $outFile -Value "$($iniObject[$i][$j])"
}
else {
Add-Content -Path $outFile -Value "$j=$($iniObject[$i][$j])"
}
}
Add-Content -Path $outFile -Value ""
}
}
}
#** Select Menu ****************************************************************
# https://github.com/chrisseroka/ps-menu
function Check-PsMenu() {
if(-Not (Get-InstalledModule ps-menu -ErrorAction silentlycontinue)) {
Set-PSRepository PSGallery -InstallationPolicy Trusted
Install-Module -Name ps-menu -Confirm:$False -Force
}
}
function DrawMenu {
param ($menuItems, $menuPosition, $Multiselect, $selection)
$l = $menuItems.length
for ($i = 0; $i -le $l; $i++) {
if ($menuItems[$i] -ne $null){
$item = $menuItems[$i]
if ($Multiselect) {
if ($selection -contains $i){
$item = '[x] ' + $item
}
else {
$item = '[ ] ' + $item
}
}
if ($i -eq $menuPosition) {
Write-Host "> $($item)" -ForegroundColor Green
}
else {
Write-Host " $($item)"
}
}
}
}
function Toggle-Selection {
param ($pos, [array]$selection)
if ($selection -contains $pos){
$result = $selection | where {$_ -ne $pos}
}
else {
$selection += $pos
$result = $selection
}
$result
}
function Menu {
param ([array]$menuItems, [switch]$ReturnIndex=$false, [switch]$Multiselect)
$vkeycode = 0
$pos = 0
$selection = @()
if ($menuItems.Length -gt 0) {
try {
[console]::CursorVisible=$false #prevents cursor flickering
DrawMenu $menuItems $pos $Multiselect $selection
While ($vkeycode -ne 13 -and $vkeycode -ne 27) {
$press = $host.ui.rawui.readkey("NoEcho,IncludeKeyDown")
$vkeycode = $press.virtualkeycode
If ($vkeycode -eq 38 -or $press.Character -eq 'k') {$pos--}
If ($vkeycode -eq 40 -or $press.Character -eq 'j') {$pos++}
If ($vkeycode -eq 36) { $pos = 0 }
If ($vkeycode -eq 35) { $pos = $menuItems.length - 1 }
If ($press.Character -eq ' ') { $selection = Toggle-Selection $pos $selection }
if ($pos -lt 0) {$pos = 0}
If ($vkeycode -eq 27) {$pos = $null }
if ($pos -ge $menuItems.length) {$pos = $menuItems.length -1}
if ($vkeycode -ne 27) {
$startPos = [System.Console]::CursorTop - $menuItems.Length
[System.Console]::SetCursorPosition(0, $startPos)
DrawMenu $menuItems $pos $Multiselect $selection
}
}
}
finally {
[System.Console]::SetCursorPosition(0, $startPos + $menuItems.Length)
[console]::CursorVisible = $true
}
}
else {
$pos = $null
}
if ($ReturnIndex -eq $false -and $pos -ne $null) {
if ($Multiselect){
return $menuItems[$selection]
}
else {
return $menuItems[$pos]
}
}
else {
if ($Multiselect) {
return $selection
}
else {
return $pos
}
}
}
#** Profile ********************************************************************
#== Profile Dir ================================================================
# $HOME = (get-psprovider 'FileSystem').Home
$firefoxProfileDirPaths = @(
"${HOME}\AppData\Roaming\Mozilla\Firefox",
"${HOME}\AppData\Roaming\LibreWolf"
)
function Check-ProfileDir() {
Param (
[Parameter(Position=0)]
[string] $profileDir = ""
)
if ( "${profileDir}" -ne "" ) {
$global:firefoxProfileDirPaths = @("${profileDir}")
}
$global:firefoxProfileDirPaths = Filter-Path $global:firefoxProfileDirPaths "Container"
if ( $firefoxProfileDirPaths.Length -eq 0 ) {
Lepton-ErrorMessage "Unable to find firefox profile dir."
}
Lepton-OKMessage "Profiles dir found"
}
#== Profile Info ===============================================================
$PROFILEINFOFILE="profiles.ini"
function Check-ProfileIni() {
foreach ( $profileDir in $global:firefoxProfileDirPaths ) {
if ( -Not (Test-Path -Path "${profileDir}\${PROFILEINFOFILE}" -PathType "Leaf") ) {
Lepton-ErrorMessage "Unable to find ${PROFILEINFOFILE} at ${profileDir}"
}
}
Lepton-OKMessage "Profiles info file found"
}
#== Profile PATH ===============================================================
$firefoxProfilePaths = @()
function Update-ProfilePaths() {
foreach ( $profileDir in $global:firefoxProfileDirPaths ) {
$local:iniContent = Get-IniContent "${profileDir}\${PROFILEINFOFILE}"
$global:firefoxProfilePaths += $iniContent.Values.Path | ForEach-Object { "${profileDir}\${PSItem}" }
}
if ( $firefoxProfilePaths.Length -ne 0 ) {
Lepton-OkMessage "Profile paths updated"
}
else {
Lepton-ErrorMessage "Doesn't exist profiles"
}
}
# TODO: Multi select support
function Select-Profile() {
Param (
[Parameter(Position=0)]
[string] $profileName = ""
)
if ( "${profileName}" -ne "" ) {
$local:targetPath = ""
foreach ( $global:profilePath in $firefoxProfilePaths ) {
if ( "${profilePath}" -like "*${profileName}" ) {
$targetPath = "${profilePath}"
break
}
}
if ( "${targetPath}" -ne "" ) {
Lepton-OkMessage "Profile, `"${profileName}`" found"
$global:firefoxProfilePaths = @("${targetPath}")
}
else {
Lepton-ErrorMessage "Unable to find ${profileName}"
}
else
if ( $firefoxProfilePaths.Length -eq 1 ) {
Lepton-OkMessage "Auto detected profile"
}
else {
$global:firefoxProfilePaths = Menu $firefoxProfilePaths
if ( $firefoxProfilePaths.Length -eq 0 ) {
Lepton-ErrorMessage "Please select profiles"
}
Lepton-OkMessage "Selected profile"
}
}
}
#** Lepton Info File ***********************************************************
# If you interst RFC, see install.sh
#== Lepton Info ================================================================
$LEPTONINFOFILE ="lepton.ini"
function Check-LeptonIni() {
foreach ( $profileDir in $global:firefoxProfileDirPaths ) {
if ( -Not (Test-Path -Path "${profileDir}\${LEPTONINFOFILE}") ) {
Lepton-ErrorMessage "Unable to find ${LEPTONINFOFILE} at ${profileDir}"
}
}
Lepton-OkMessage "Lepton info file found"
}
#== Create info file ===========================================================
# We should always create a new one, as it also takes into account the possibility of setting it manually.
# Updates happen infrequently, so the creation overhead is less significant.
function Get-ProfileDir() {
Param (
[Parameter(Mandatory=$true, Position=0)]
[string] $profilePath
)
foreach ( $profileDir in $firefoxProfileDirPaths ) {
if ( "$profilePath" -like "${profileDir}*" ) {
return "$profileDir"
}
}
}
$CHROMEINFOFILE="LEPTON"
function Write-LeptonInfo() {
# Init info
$local:output = @{}
$local:prevDir = $firefoxProfileDirPaths[0]
$local:latestPath = ( $firefoxProfilePaths | Select-Object -Last 1 )
foreach ( $profilePath in $global:firefoxProfilePaths ) {
$local:LEPTONINFOPATH = "${profilePath}\chrome\${CHROMEINFOFILE}"
$local:LEPTONGITPATH = "${profilePath}\chrome\.git"
# Profile info
$local:Type = ""
$local:Ver = ""
$local:Branch = ""
$local:Path = ""
if ( Test-Path -Path "${LEPTONINFOPATH}" ) {
if ( Test-Path -Path "${LEPTONGITPATH}" -PathType "Container" ) {
$Type = "Git"
$Ver = $(git --git-dir "${LEPTONGITPATH}" rev-parse HEAD)
$Branch = $(git --git-dir "${LEPTONGITPATH}" rev-parse --abbrev-ref HEAD)
}
else {
$local:iniContent = Get-IniContent "${LEPTONINFOPATH}"
$Type = $iniContent["Info"]["Type"]
$Ver = $iniContent["Info"]["Ver"]
$Branch = $iniContent["Info"]["Branch"]
if ( "${Type}" -eq "" ) {
$Type = "Local"
}
}
$Path = "${profilePath}"
}
# Flushing
$local:profileDir = Get-ProfileDir "${profilePath}"
$local:profileName = Split-Path "${profilePath}" -Leaf
if ( "${prevDir}" -ne "${profileDir}" ) {
Out-IniFile "${prevDir}\${LEPTONINFOFILE}" $output
$output = @{}
}
# Make output contents
foreach ( $key in @("Type", "Branch", "Ver", "Path") ) {
$local:value = (Get-Variable -Name "${key}").Value
if ( "$value" -ne "" ) {
$output["${profileName}"] += @{"${key}" = "${value}"}
}
}
# Latest element flushing
if ( "${profilePath}" -eq "${latestPath}" ) {
Out-IniFile "${profileDir}\${LEPTONINFOFILE}" $output
}
$prevDir = "${profileDir}"
}
# Verify
Check-LeptonIni
Lepton-OkMessage "Lepton info file created"
}
#** Install ********************************************************************
#== Install Types ==============================================================
$updateMode = $false
$leptonBranch = "master"
function Select-Distribution() {
while ( $true ) {
$local:selected = $false
$local:selectedDistribution = Menu @("Original(default)", "Photon-Style", "Proton-Style", "Update")
switch ( $selectedDistribution ) {
"Original(default)" { $global:leptonBranch = "master" ; $selected = $true }
"Photon-Style" { $global:leptonBranch = "photon-style"; $selected = $true }
"Proton-Style" { $global:leptonBranch = "proton-style"; $selected = $true }
"Update" { $global:updateMode = $true ; $selected = $true }
default { Write-Host "Invalid option, reselect please." }
}
if ( $selected -eq $true ) {
break
}
}
Lepton-OkMessage "Selected ${selectedDistribution}"
}
$leptonInstallType = "Network" # Other types: Local, Release
function Check-InstallType() {
Param (
[Parameter(Mandatory=$true, Position=0)]
[string[]] $targetList,
[Parameter(Mandatory=$true, Position=1)]
[string] $installType
)
$local:targetCount = $targetList.Length
$local:foundCount = (Filter-Path $targetList ).Length
if ( "${targetCount}" -eq "${foundCount}" ) {
$global:leptonInstallType="${installType}"
}
}
$checkLocalFiles = @(
"userChrome.css",
"userContent.css",
"icons"
)
$checkReleaseFiles = @(
"user.js"
"chrome\userChrome.css"
"chrome\userContent.css"
"chrome\icons"
)
function Check-InstallTypes() {
Check-InstallType $checkLocalFiles "Local"
Check-InstallType $checkReleaseFiles "Release"
Lepton-OkMessage "Checked install type: ${leptonInstallType}"
if ( "${leptonInstallType}" -eq "Network" ) {
Select-Distribution
}
if ( "${leptonInstallType}" -eq "Local" ) {
if ( Test-Path -Path ".git" -PathType "Container" ) {
Select-Distribution
git checkout "${leptonBranch}"
}
}
}
#== Install Helpers ============================================================
$chromeDuplicate = $false
function Check-ChromeExist() {
if ( Test-Path -Path "chrome" -and -Not (Test-Path -Path "chrome\${LEPTONINFOFILE}") ) {
$global:chromeDuplicate = $true
Move-Auto "chrome" "chrome.bak"
Lepton-OkMessage "Backup files"
}
}
function Check-ChromeRestore() {
if ( "${chromeDuplicate}" -eq $true ) {
Restore-Auto "chrome"
Lepton-OkMessage "End restore files"
}
Lepton-OkMessage "End check restore files"
}
function Clean-Lepton() {
if ( $chromeDuplicate -ne $true ) {
Remove-Item "chrome" -Recurse -Force
}
Lepton-OkMessage "End clean files"
}
function Clone-Lepton() {
Param (
[Parameter(Position=0)]
[string] $branch = ""
)
local branch="$1"
if ( "${branch}" -eq "" ) {
$branch = "${leptonBranch}"
}
git clone -b "${branch}" https://github.com/black7375/Firefox-UI-Fix.git chrome
if ( -Not (Test-Path -Path "chrome" -PathType "Container") ) {
Lepton-ErrorMessage "Unable to find downloaded files"
}
}
function Copy-Lepton() {
Param (
[Parameter(Position=0)]
[string] $chromeDir = "chrome",
[Parameter(Position=0)]
[string] $userJSPath = "${chromeDir}\user.js"
)
foreach ( $profilePath in $global:firefoxProfilePaths ) {
Copy-Auto "${userJSPath}" "${profilePath}\user.js"
Copy-Auto "${chromeDir}" "${profilePath}\chrome"
}
Lepton-OkMessage "End profile copy"
}
#== Each Install ===============================================================
function Install-Local() {
Copy-Lepton "${currentDir}" "user.js"
}
function Install-Release() {
Copy-Lepton "chrome" "user.js"
}
function Install-Network() {
Check-ChromeExist
Check-Git
Clone-Lepton
Copy-Lepton
Clean-Lepton
Check-ChromeRestore
}
function Install-Profile() {
Lepton-OkMessage "Started install"
switch ( "${leptonInstallType}" ) {
"Local" { Install-Local }
"Release" { Install-Release }
"Network" { Install-Network }
}
Lepton-OkMessage "End install"
}
#** Update *********************************************************************
function Update-Profile() {
Check-Git
foreach ( $profileDir in $global:firefoxProfileDirPaths ) {
$local:LEPTONINFOPATH = "${profileDir}\${LEPTONINFOFILE}"
$local:LEPTONINFO = Get-IniContent "${LEPTONINFOPATH}"
$local:sections = $LEPTONINFO.Keys
if ( $sections.Length -ne 0 ) {
foreach ( $section in $sections ) {
$local:Type = $LEPTONINFO["${section}"]["Type"]
$local:Branch = $LEPTONINFO["${section}"]["Branch"]
$local:Path = $LEPTONINFO["${section}"]["Path"]
$local:LEPTONGITPATH="${Path}\chrome\.git"
if ( "${Type}" -eq "Git" ){
git --git-dir "${LEPTONGITPATH}" checkout "${Branch}"
git --git-dir "${LEPTONGITPATH}" pull --no-edit
}
elseif ( "${Type}" -eq "Local" -or "${Type}" -eq "Release" ) {
Check-ChromeExist
Clone-Lepton
$firefoxProfilePaths = @("${Path}")
Copy-Lepton
if ( "${Branch}" -eq $null ) {
$Branch = "${leptonBranch}"
}
git --git-dir "${LEPTONGITPATH}" checkout "${Branch}"
if ( "${Type}" -eq "Release" ) {
$local:Ver=$(git --git-dir "${LEPTONINFOFILE}" describe --tags --abbrev=0)
git --git-dir "${LEPTONGITPATH}" checkout "tags/${Ver}"
}
}
else {
Lepton-ErrorMessage "Unable to find update type, ${Type} at ${section}"
}
}
}
}
Clean-Lepton
Check-ChromeRestore
}
#** Main ***********************************************************************
function Check-Help {
# Cheap and dirty way of getting the same output as '-?' for '-h' and '-Help'
if ($help) {
Get-Help "$PSCommandPath"
exit 0
}
}
function Install-Lepton {
Verify-PowerShellVersion # Check installed version meets minimum
Check-InstallTypes
Check-ProfileDir $profileDir
Check-ProfileIni
Update-ProfilePaths
Write-LeptonInfo
if ( $updateMode ) {
Update-Profile
}
else {
Select-Profile $profileName
Install-Profile
}
Write-LeptonInfo
}
Check-Help
Install-Lepton

View file

@ -336,7 +336,9 @@ multiselect() {
firefoxProfileDirPaths=(
"${HOME}/.mozilla/firefox"
"${HOME}/.var/app/org.mozilla.firefox/.mozilla/firefox"
"${HOME}/.librewolf/"
"${HOME}/Library/Application Support/Firefox"
"${HOME}/Library/Application Support/LibreWolf"
)
check_profile_dir() {
@ -435,18 +437,133 @@ select_profile() {
fi
}
#** Lepton Info File ***********************************************************
#== Info File format & update policy ===========================================
## `LEPTON` file format
# If this file exist in same directory as the `userChrome.css` file,
# it is recognized as the "Lepton" installation directory.
# [Info]
# Branch=master | photon-style | proton-style
# Ver=<git tag> | <git hash> | [NULL]
## `lepton.ini` file Format
# [Profile Name]
# Type=Local | Release | Git
# Branch=master | photon-style | proton-style
# Ver=<git tag> | <git hash> | [NULL]
# Path=<Full PATH>
## Update Policy
# Type
# - Local(unknown): force latest commit update
# - Release(<git tag>): force latest tag update
# - Git<git hash>: latest commit update
#== Lepton Info ================================================================
LEPTONINFOFILE="lepton.ini"
check_lepton_ini() {
for profileDir in "${firefoxProfileDirPaths[@]}"; do
if [ ! -f "${profileDir}/${LEPTONINFOFILE}" ]; then
lepton_error_message "Unable to find ${LEPTONINFOFILE} at ${profileDir}"
fi
done
lepton_ok_message "Lepton info file found"
}
#== Create info file ===========================================================
# We should always create a new one, as it also takes into account the possibility of setting it manually.
# Updates happen infrequently, so the creation overhead is less significant.
get_profile_dir() {
local profilePath="$1"
for profileDir in "${firefoxProfileDirPaths[@]}"; do
if [[ "${profilePath}" == "${profileDir}"* ]]; then
echo "${profileDir}"
return 0
fi
done
}
CHROMEINFOFILE="LEPTON"
write_lepton_info() {
# Init info
local output=""
local prevDir="$firefoxProfileDirPaths[0]"
local latestPath="${firefoxProfilePaths[${#firefoxProfilePaths[@]} - 1]}"
for profilePath in "${firefoxProfilePaths[@]}"; do
local LEPTONINFOPATH="${profilePath}/chrome/${CHROMEINFOFILE}"
local LEPTONGITPATH="${profilePath}/chrome/.git"
# Profile info
local Type=""
local Ver=""
local Branch=""
local Path=""
if [ -f "${LEPTONINFOPATH}" ]; then
if [ -d "${LEPTONGITPATH}" ]; then
Type="Git"
Ver=$( git --git-dir "${LEPTONGITPATH}" rev-parse HEAD)
Branch=$(git --git-dir "${LEPTONGITPATH}" rev-parse --abbrev-ref HEAD)
else
Type=$( get_ini_value "${LEPTONINFOPATH}" "TYPE" )
Ver=$( get_ini_value "${LEPTONINFOPATH}" "Ver" )
Branch=$(get_ini_value "${LEPTONINFOPATH}" "Branch")
if [ "${Type}" == "" ]; then
Type="Local"
fi
fi
Path="${profilePath}"
fi
# Flushing
local profileDir=$(get_profile_dir "${profilePath}")
local profileName=$(basename "${profilePath}")
if [ "${prevDir}" != "${profileDir}" ]; then
write_file "${prevDir}/${LEPTONINFOFILE}" "${output}"
output=""
fi
# Make output contents
if [ -f "${LEPTONINFOPATH}" ]; then
output="${output}$(set_ini_section ${profileName})"
fi
for key in "Type" "Branch" "Ver" "Path"; do
eval "local value=\${${key}}"
output="${output}$(set_ini_value ${key} ${value})"
done
# Latest element flushing
if [ "${profilePath}" == "${latestPath}" ]; then
write_file "${profileDir}/${LEPTONINFOFILE}" "${output}"
fi
prevDir="${profileDir}"
done
# Verify
check_lepton_ini
lepton_ok_message "Lepton info file created"
}
#** Install ********************************************************************
#== Install Types ==============================================================
updateMode=""
leptonBranch="master"
select_distribution() {
select distribution in "Original(default)" "Photon-Style"; do
local selectedDistribution=""
select distribution in "Original(default)" "Photon-Style" "Proton-Style" "Update"; do
selectedDistribution="${distribution}"
case "${distribution}" in
"Original") leptonBranch="master" ;;
"Photon-Style") leptonBranch="photon-style" ;;
"Original") leptonBranch="master"; break;;
"Photon-Style") leptonBranch="photon-style"; break;;
"Proton-Style") leptonBranch="proton-style"; break;;
"Update") updateMode="true"; break;;
*) echo "Invalid option, reselect please.";;
esac
lepton_ok_message "Selected ${distribution}"
break
done
lepton_ok_message "Selected ${selectedDistribution}"
}
leptonInstallType="Network" # Other types: Local, Release
@ -576,111 +693,12 @@ install_profile() {
lepton_ok_message "End install"
}
#** Lepton Info File ***********************************************************
#== Info File format & update policy ===========================================
## `LEPTON` file format
# If this file exist in same directory as the `userChrome.css` file,
# it is recognized as the "Lepton" installation directory.
# Branch=master | photon-style
# Ver=<git tag> | <git hash> | [NULL]
## `lepton.ini` file Format
# [Profile Name]
# Type=Local | Release | Git
# Branch=master | photon-style
# Ver=<git tag> | <git hash> | [NULL]
# Path=<Full PATH>
## Update Policy
# Type
# - Local(unknown): force latest commit update
# - Release(<git tag>): force latest tag update
# - Git<git hash>: latest commit update
#== Lepton Info ================================================================
LEPTONINFOFILE="lepton.ini"
check_lepton_ini() {
for profileDir in "${firefoxProfileDirPaths[@]}"; do
if [ ! -f "${profileDir}/${LEPTONINFOFILE}" ]; then
lepton_error_message "Unable to find ${LEPTONINFOFILE} at ${profileDir}"
fi
done
lepton_ok_message "Lepton info file found"
}
#== Create info file ===========================================================
# We should always create a new one, as it also takes into account the possibility of setting it manually.
# Updates happen infrequently, so the creation overhead is less significant.
CHROMEINFOFILE="LEPTON"
write_lepton_info() {
# Init info
local output=""
local prevDir=$(dirname "${firefoxProfilePaths[0]}")
local latestPath="${firefoxProfilePaths[${#firefoxProfilePaths[@]} - 1]}"
for profilePath in "${firefoxProfilePaths[@]}"; do
local LEPTONINFOPATH="${profilePath}/chrome/${CHROMEINFOFILE}"
local LEPTONGITPATH="${profilePath}/chrome/.git"
# Profile info
local Type=""
local Ver=""
local Branch=""
local Path=""
if [ -f "${LEPTONINFOPATH}" ]; then
if [ -d "${LEPTONGITPATH}" ]; then
Type="Git"
Ver=$( git --git-dir "${LEPTONGITPATH}" rev-parse HEAD)
Branch=$(git --git-dir "${LEPTONGITPATH}" rev-parse --abbrev-ref HEAD)
else
Type=$( get_ini_value "${LEPTONINFOPATH}" "TYPE" )
Ver=$( get_ini_value "${LEPTONINFOPATH}" "Ver" )
Branch=$(get_ini_value "${LEPTONINFOPATH}" "Branch")
if [ "${Type}" == "" ]; then
Type="Local"
fi
fi
Path="${profilePath}"
fi
# Flushing
local profileDir=$(dirname "${profilePath}")
local profileName=$(basename "${profilePath}")
if [ "${prevDir}" != "${profileDir}" ]; then
write_file "${prevDir}/${LEPTONINFOFILE}" "${output}"
output=""
fi
# Make output contents
if [ -f "${LEPTONINFOPATH}" ]; then
output="${output}$(set_ini_section ${profileName})"
fi
for key in "Type" "Branch" "Ver" "Path"; do
eval "local value=\${${key}}"
output="${output}$(set_ini_value ${key} ${value})"
done
# Latest element flushing
if [ "${profilePath}" == "${latestPath}" ]; then
write_file "${profileDir}/${LEPTONINFOFILE}" "${output}"
fi
prevDir="${profileDir}"
done
# Verify
check_lepton_ini
lepton_ok_message "Lepton info file created"
}
#** Update *********************************************************************
update_profile() {
check_git
for profileDir in "${firefoxProfileDirPaths[@]}"; do
local LEPTONINFOPATH="${profileDir}/${LEPTONINFOFILE}"
local sections=$(get_ini_section "${LEPTONINFOPATH}")
local sections=($(get_ini_section "${LEPTONINFOPATH}"))
if [ ! -z "${sections}" ]; then
for section in "${sections[@]}"; do
local Type=$( get_ini_value "${LEPTONINFOPATH}" "Type" "${section}")
@ -693,9 +711,7 @@ update_profile() {
git --git-dir "${LEPTONGITPATH}" pull --no-edit
elif [ "${Type}" == "Local" ] || [ "${Type}" == "Release" ]; then
check_chrome_exist
if [ ! -d "chrome" ]; then
clone_lepton
fi
clone_lepton
firefoxProfilePaths=("${Path}")
copy_lepton
@ -710,7 +726,7 @@ update_profile() {
git --git-dir "${LEPTONGITPATH}" checkout "tags/${Ver}"
fi
else
lepton_error_message "Unable to find update type, ${Type}"
lepton_error_message "Unable to find update type, ${Type} at ${section}"
fi
done
fi
@ -721,7 +737,6 @@ update_profile() {
#** Main ***********************************************************************
install_lepton() {
local updateMode=""
local profileDir=""
local profileName=""
@ -747,20 +762,17 @@ install_lepton() {
check_profile_dir "${profileDir}"
check_profile_ini
update_profile_paths
write_lepton_info
# Install Mode
if [ ! "${updateMode}" == true ]; then
if [ "${updateMode}" == true ]; then
update_profile
else # Install Mode
select_profile "${profileName}"
install_profile
fi
# write_lepton_info
## Update Mode
# if [ ! "${updateMode}" == true ]; then
# update_profile
# write_lepton_info
# fi
write_lepton_info
}
install_lepton "$@"

View file

@ -1,10 +1,24 @@
@media (-moz-proton) {
/** Darkmode - Color lighter ************************************************/
/** Default Thme - Contrast *************************************************/
/*= Lightmode - Color darker ===============================================*/
:root[lwtheme-mozlightdark][lwthemetextcolor="dark"] {
--lwt-accent-color: rgb(229, 229, 235) !important; /* Original: rgb(240, 240, 244) */
}
/*= Darkmode - Color lighter ===============================================*/
:root[lwtheme-mozlightdark][lwthemetextcolor="bright"] {
--toolbar-bgcolor: rgba(43, 42, 51, 5) !important; /* Original: rgba(43, 42, 51, 1) */
}
/* Theme - Compatibility ****************************************************/
/** Theme - Compatibility ***************************************************/
/*= Hotfix #98 =============================================================*/
/* Hidden Tab Panel Padding */
#allTabsMenu-hiddenTabsView .all-tabs-item {
margin-inline: 8px;
border-radius: 4px;
}
/*= Light Weight Theme =====================================================*/
/* Header Image */
:root[lwtheme-image] {
background-image: var(--lwt-header-image) !important; /* Original: var(--lwt-header-image) */
@ -23,13 +37,7 @@
--tabs-border-color: rgba(0,0,0,.3);
}
/* Hidden Tab Panel Padding */
#allTabsMenu-hiddenTabsView .all-tabs-item {
margin-inline: 8px;
border-radius: 4px;
}
/** Windows 7 - Compatibility ***********************************************/
/*= Windows 7 ==============================================================*/
@media (-moz-os-version: windows-win7) {
/* Header Color */
:root:not([lwtheme-image]) #navigator-toolbox:-moz-lwtheme {
@ -44,7 +52,23 @@
}
}
/** Windows System Default Theme - Use acccent color ************************/
/** System Default Theme ****************************************************/
/*= Common - URL Bar focus color ===========================================*/
@media (-moz-windows-accent-color-in-titlebar),
(-moz-gtk-csd-available) {
/* URL Bar */
:root[tabsintitlebar]:not(:-moz-window-inactive, :-moz-lwtheme),
:root[tabsintitlebar][lwt-default-theme-in-dark-mode]:not(:-moz-window-inactive) {
--focus-outline-color: -moz-accent-color !important;
}
:root[tabsintitlebar]:not(:-moz-window-inactive, :-moz-lwtheme) #urlbar[open] > #urlbar-background,
:root[tabsintitlebar][lwt-default-theme-in-dark-mode]:not(:-moz-window-inactive) #urlbar[open] > #urlbar-background {
border-color: color-mix(in srgb, -moz-accent-color 50%, transparent) !important; /* Like: --toolbar-field-focus-border-color */
}
}
/*= Windows10 - Titlebar accent color ======================================*/
@media (-moz-windows-accent-color-in-titlebar) {
/* Tab Bar */
:root[tabsintitlebar]:not(:-moz-window-inactive, :-moz-lwtheme) .titlebar-color,
@ -59,16 +83,318 @@
--toolbarbutton-hover-background: color-mix(in srgb, -moz-accent-color-foreground 10%, transparent);
--toolbarbutton-active-background: color-mix(in srgb, -moz-accent-color-foreground 15%, transparent);
}
}
/* URL Bar */
:root[tabsintitlebar]:not(:-moz-window-inactive, :-moz-lwtheme),
:root[tabsintitlebar][lwt-default-theme-in-dark-mode]:not(:-moz-window-inactive) {
--focus-outline-color: -moz-accent-color !important;
/*= GTK - URL View url accent color ========================================*/
@media (-moz-gtk-csd-available) {
:root:not(:-moz-lwtheme) .urlbarView-url {
--urlbar-popup-url-color: -moz-accent-color;
}
}
/** Fully Theme Mode ********************************************************/
/* Default Themes
https://github.com/mozilla/gecko-dev/blob/master/toolkit/mozapps/extensions/default-theme/manifest.json
https://github.com/mozilla/gecko-dev/blob/master/browser/themes/addons/light/manifest.json
https://github.com/mozilla/gecko-dev/blob/master/browser/themes/addons/dark/manifest.json
*/
/*= Default Colors - Hardcorded ============================================*/
/* Based on chrome://global/skin/in-content/common.css */
:host,
:root {
--in-content-page-color: rgb(21, 20, 26);
--in-content-page-background: #fff;
--in-content-text-color: var(--in-content-page-color);
--in-content-deemphasized-text: rgb(91, 91, 102);
--in-content-box-background: #fff;
--in-content-box-background-odd: rgba(12, 12, 13, 0.05); /* grey 90 a05 */
--in-content-box-border-color: color-mix(in srgb, currentColor 41%, transparent);
--in-content-box-info-background: #f0f0f4;
--in-content-item-hover: color-mix(in srgb, var(--in-content-primary-button-background) 20%, transparent);
--in-content-item-hover-text: var(--in-content-page-color);
--in-content-item-selected: var(--in-content-primary-button-background);
--in-content-item-selected-text: var(--in-content-primary-button-text-color);
--in-content-icon-color: rgb(91,91,102);
--in-content-accent-color: #0a84ff;
--in-content-accent-color-active: #0060df;
--in-content-border-hover: var(--grey-90-a50);
--in-content-border-invalid: var(--red-50);
--in-content-border-color: #d7d7db;
--in-content-error-text-color: #c50042;
--in-content-link-color: var(--blue-60);
--in-content-link-color-hover: var(--blue-70);
--in-content-link-color-active: var(--blue-80);
--in-content-link-color-visited: var(--blue-60);
/* button background states are also used for checkboxes and radiobuttons */
--in-content-button-text-color: var(--in-content-text-color);
--in-content-button-text-color-hover: var(--in-content-text-color);
--in-content-button-background: rgba(207,207,216,.33);
--in-content-button-background-hover: rgba(207,207,216,.66);
--in-content-button-background-active: rgb(207,207,216);
--in-content-primary-button-text-color: rgb(251,251,254);
--in-content-primary-button-text-color-hover: var(--in-content-primary-button-text-color);
--in-content-primary-button-background: #0061e0;
--in-content-primary-button-background-hover: #0250bb;
--in-content-primary-button-background-active: #053e94;
--in-content-danger-button-background: #e22850;
--in-content-danger-button-background-hover: #c50042;
--in-content-danger-button-background-active: #810220;
--in-content-focus-outline-color: var(--in-content-primary-button-background);
/* Note: 1px smaller than we want because we have a 1px transparent border. */
/* Once proton ships, these can probably stop being variables. */
--in-content-button-border-radius: 4px;
--in-content-button-horizontal-padding: 15px;
--in-content-button-vertical-padding: 7px;
--in-content-table-background: #f8f8fa;
--in-content-table-border-dark-color: #d1d1d1;
--in-content-table-header-background: #0a84ff;
--in-content-table-header-color: #ffffff;
--in-content-sidebar-width: 240px;
--dialog-warning-text-color: var(--red-60);
--checkbox-border-color: var(--in-content-box-border-color);
--checkbox-unchecked-bgcolor: var(--in-content-button-background);
--checkbox-unchecked-hover-bgcolor: var(--in-content-button-background-hover);
--checkbox-unchecked-active-bgcolor: var(--in-content-button-background-active);
--checkbox-checked-bgcolor: var(--in-content-primary-button-background);
--checkbox-checked-color: var(--in-content-primary-button-text-color);
--checkbox-checked-border-color: transparent;
--checkbox-checked-hover-bgcolor: var(--in-content-primary-button-background-hover);
--checkbox-checked-active-bgcolor: var(--in-content-primary-button-background-active);
--blue-40: #45a1ff;
--blue-50: #0a84ff;
--blue-60: #0060df;
--blue-70: #003eaa;
--blue-80: #002275;
--grey-30: #d7d7db;
--grey-60: #4a4a4f;
--grey-90-a10: rgba(12, 12, 13, 0.1);
--grey-90-a20: rgba(12, 12, 13, 0.2);
--grey-90-a30: rgba(12, 12, 13, 0.3);
--grey-90-a50: rgba(12, 12, 13, 0.5);
--grey-90-a60: rgba(12, 12, 13, 0.6);
--green-50: #30e60b;
--green-60: #12bc00;
--green-70: #058b00;
--green-80: #006504;
--green-90: #003706;
--orange-50: #ff9400;
--red-40: #ff4f5e;
--red-50: #ff0039;
--red-60: #d70022;
--red-70: #a4000f;
--red-80: #5a0002;
--red-90: #3e0200;
--yellow-50: #ffe900;
--yellow-60: #d7b600;
--yellow-60-a30: rgba(215, 182, 0, 0.3);
--yellow-70: #a47f00;
--yellow-80: #715100;
--yellow-90: #3e2800;
--shadow-10: 0 1px 4px var(--grey-90-a10);
--shadow-30: 0 4px 16px var(--grey-90-a10);
--card-padding: 16px;
--card-shadow: var(--shadow-10);
--card-outline-color: var(--grey-30);
--card-shadow-hover: var(--card-shadow), 0 0 0 5px var(--card-outline-color);
}
@media (-moz-toolbar-prefers-color-scheme: dark) {
:host,
:root {
/* Keep these in sync with layout/base/PresShell.cpp, and plaintext.css */
--in-content-page-background: rgb(28,27,34);
--in-content-page-color: rgb(251,251,254);
--in-content-deemphasized-text: rgb(191,191,201);
--in-content-box-background: rgb(35, 34, 43);
--in-content-box-background-odd: rgba(249,249,250,0.05);
--in-content-box-info-background: rgba(249,249,250,0.15);
--in-content-border-color: rgba(249,249,250,0.2);
--in-content-border-hover: rgba(249,249,250,0.3);
--in-content-border-invalid: rgb(255,132,139);
--in-content-error-text-color: #FF9AA2;
--in-content-button-background: rgb(43,42,51);
--in-content-button-background-hover: rgb(82,82,94);
--in-content-button-background-active: rgb(91,91,102);
--in-content-icon-color: rgb(251,251,254);
--in-content-primary-button-text-color: rgb(43,42,51);
--in-content-primary-button-background: rgb(0,221,255);
--in-content-primary-button-background-hover: rgb(128,235,255);
--in-content-primary-button-background-active: rgb(170,242,255);
--in-content-danger-button-background: #ff848b;
--in-content-danger-button-background-hover: #ffbdc5;
--in-content-danger-button-background-active: #ffdfe7;
--in-content-table-background: rgb(35, 34, 43);
--in-content-table-border-dark-color: rgba(249,249,250,0.2);
--in-content-table-header-background: rgb(5, 64, 150);
--in-content-table-header-color: var(--in-content-page-color);
--in-content-accent-color: var(--in-content-primary-button-background);
--in-content-accent-color-active: var(--in-content-primary-button-background-hover);
--in-content-link-color: var(--in-content-primary-button-background);
--in-content-link-color-hover: var(--in-content-primary-button-background-hover);
--in-content-link-color-active: var(--in-content-primary-button-background-active);
--in-content-link-color-visited: var(--in-content-link-color);
--card-outline-color: var(--grey-60);
--dialog-warning-text-color: var(--red-40);
scrollbar-color: rgba(249,249,250,.4) rgba(20,20,25,.3);
}
}
/*== Menu color ===========================================================*/
:root,
menupopup {
/* is same as toolbar color https://github.com/mozilla/gecko-dev/blob/master/toolkit/themes/windows/global/global.css#L17-L67 */
--menu-color: var(--toolbar-color, var(--in-content-page-color)) !important;
--menu-background-color: var(--toolbar-bgcolor, var(--in-content-button-background)) !important;
--menu-border-color: var(--toolbarbutton-active-background, var(--button-active-bgcolor, var(--card-outline-color))) !important;
--menuitem-hover-background-color: var(--toolbarbutton-hover-background, var(--button-hover-bgcolor, var(--in-content-button-background-hover))) !important;
--menu-disabled-color: color-mix(in srgb, var(--menu-color) 40%, transparent) !important;
--menuitem-disabled-hover-background-color: color-mix(in srgb, var(--menuitem-hover-background-color) 40%, transparent) !important;
}
/* Fallback background */
menupopup {
background-color: var(--lwt-accent-color, var(--in-content-page-background)) !important;
}
/* Fully Dark Mode **********************************************************/
/*= Remove White Flash =====================================================*/
#tabbrowser-tabbox,
#tabbrowser-tabpanels,
browser[type=content-primary],
browser[type=content] > html {
background: var(--in-content-page-background) !important;
}
/*= Notification ===========================================================*/
@-moz-document url("chrome://global/content/alerts/alert.xhtml") {
/* line below removes background from the notification "window" on linux */
#alertNotification{ background: transparent !important; }
#alertBox {
color: var(--menu-color, #15141a) !important;
background-color: var(--menu-background-color, #f9f9fb) !important;
border-color: var(--menu-border-color, #cfcfd8) !important;
border-radius: 6px !important;
-moz-window-shadow: cliprounded !important;
}
#alertSettings {
fill: currentColor !important;
color: inherit !important;
border-radius: 0 !important;
margin-inline: 0 !important;
margin-bottom: -4px !important;
}
:root[tabsintitlebar]:not(:-moz-window-inactive, :-moz-lwtheme) #urlbar[open] > #urlbar-background,
:root[tabsintitlebar][lwt-default-theme-in-dark-mode]:not(:-moz-window-inactive) #urlbar[open] > #urlbar-background {
border-color: color-mix(in srgb, -moz-accent-color 50%, transparent) !important; /* Like: --toolbar-field-focus-border-color */
/* Shape */
.close-icon > .toolbarbutton-icon,
#alertSettings > .button-box > .box-inherit {
border-radius: 4px !important;
padding: 2px !important;
margin: 2px 2px -2px 0 !important;
}
#alertSettings > .button-box > .box-inherit {
margin: -4px 4px 3px 0 !important;
}
#alertSettings > .button-box > .box-inherit > .button-icon {
padding: 1px;
}
/* Color */
.close-icon,
#alertSettings {
background: transparent !important
}
.close-icon:hover > .toolbarbutton-icon,
#alertSettings:is(:hover,[open]) > .button-box > .box-inherit {
background-color: var(--menuitem-hover-background-color, #e0e0e6) !important;
}
@media (-moz-toolbar-prefers-color-scheme:dark) {
:root {
--menu-border-color: rgba(107,107,107,.3) !important;
}
#alertBox {
color: var(--menu-color, #fbfbfe) !important;
background-color: var(--menu-background-color, #2b2a33) !important;
}
.close-icon:hover > .toolbarbutton-icon,
#alertSettings:is(:hover, [open]) > .button-box > .box-inherit {
background-color: var(--menuitem-hover-background-color, #52525e) !important;
}
#alertSourceLabel {
color: rgb(5,209,241) !important;
}
}
}
/*= Downloads ==============================================================*/
@-moz-document url("chrome://mozapps/content/downloads/unknownContentType.xhtml") {
@media (-moz-toolbar-prefers-color-scheme:dark) {
:root {
--in-content-page-background: #42414d;
}
}
#unknownContentType {
color: var(--in-content-page-color) !important;
background-color: var(--in-content-page-background) !important;
}
button {
-moz-appearance: none !important;
color: var(--in-content-button-text-color) !important;
background-color: var(--in-content-button-background) !important;
font: inherit;
font-size: 1em !important;
font-weight: 600 !important;
min-height: 32px !important;
border: 1px solid transparent !important; /* shows up in high-contrast mode */
border-radius: var(--in-content-button-border-radius) !important;
padding: var(--in-content-button-vertical-padding) var(--in-content-button-horizontal-padding) !important;
min-height: 32px !important;
/* Use the same margin of other elements for the alignment */
margin-inline: 4px !important;
min-width: 6.3em !important;
}
button:-moz-focusring {
box-shadow: none !important;
outline: 2px solid var(--in-content-focus-outline-color) !important;
outline-offset: 2px !important;
}
button:not([disabled="true"]):hover {
background-color: var(--in-content-button-background-hover) !important;
color: var(--in-content-button-text-color-hover) !important;
border-color: transparent !important;
}
button[open],
button[open]:hover {
background-color: var(--in-content-button-background-active);
}
button[disabled="true"],
menulist[disabled="true"] {
opacity: 0.4;
}
}
@ -221,11 +547,18 @@
}
/* spread menu */
:root[uidensity=compact] .urlbarView-row:not([type=tip], [type=dynamic]) {
padding-block: 1px; /* [Compact, General]: 2px, Touch: 11px */
:root:not([uidensity]) .urlbarView-row {
padding-block: 1px; /* Original: 2px */
}
:root[uidensity=compact] .urlbarView-row {
padding-block: 0px;
}
:root:not([uidensity]) #urlbar .search-one-offs:not([hidden]) {
padding-block: 8px; /* Original: 10px */
}
:root[uidensity=compact] #urlbar .search-one-offs:not([hidden]) {
padding-block: 2px; /* [Compact, General]: 4px, Touch 11px */
padding-block: 2px;
}
/*= BookMark Bar - Reduce Height ===========================================*/
@ -233,6 +566,52 @@
margin-top: 0px; /* Original: 2px */
}
/*= Info Bar - Reduce Padding ==============================================*/
:root:not([uidensity]) #tab-notification-deck {
--infobar-message-margin: 0 4px 3px;
}
:root[uidensity=compact] #tab-notification-deck {
--infobar-message-margin: 0 4px 2px;
}
#tab-notification-deck notification-message[message-bar-type="infobar"] {
margin: var(--infobar-message-margin, 0 4px 4px) !important;
}
:root:not([uidensity]) notification-message[message-bar-type="infobar"] {
--infobar-vertical-margin: 7px;
--infobar-button-vertical-margin: 3px;
}
:root[uidensity=compact] notification-message[message-bar-type="infobar"] {
--infobar-vertical-margin: 6px;
--infobar-button-vertical-margin: 2px;
}
.infobar > .icon {
margin-block: var(--infobar-vertical-margin, 8px) !important; /* Original: 8px */
}
.notification-message {
padding-block: var(--infobar-vertical-margin, 8px) !important; /* Original: 8px */
}
.notification-button-container > .notification-button {
margin-block: var(--infobar-button-vertical-margin, 4px) !important; /* Original: 4px */
}
.notification-close {
margin: var(--infobar-button-vertical-margin, 4px) 8px !important; /* Original: 4px 8px */
}
/* Hard coded for compatibility - Disappearing phenomenon */
.container.infobar::before {
content: "";
display: block;
width: 2px;
position: absolute;
background-image: linear-gradient(0, #9059ff 0%, #ff4aa2 52.08%, #ffbd4f 100%);
top: 0;
inset-inline-start: 0;
height: 100%;
border-start-start-radius: 4px;
border-end-start-radius: 4px;
}
/*= Menu - Reduce Padding ==================================================*/
:root {
--menu-padding: 0.35em;
@ -643,7 +1022,7 @@
display: none;
}
.tab-icon-image {
.tab-icon-image, .tab-sharing-icon-overlay {
box-sizing: content-box;
padding: 3px 0;

View file

@ -117,4 +117,880 @@
}
}
}
/** Fully Dark Mode *********************************************************/
/*= Fully Dark Mode - Dark Mode Colors =====================================*/
/* Based on chrome://global/skin/in-content/common.css */
:host,
:root {
--in-content-page-color: rgb(21, 20, 26);
--in-content-page-background: #fff;
--in-content-text-color: var(--in-content-page-color);
--in-content-deemphasized-text: rgb(91, 91, 102);
--in-content-box-background: #fff;
--in-content-box-background-odd: rgba(12, 12, 13, 0.05); /* grey 90 a05 */
--in-content-box-border-color: color-mix(in srgb, currentColor 41%, transparent);
--in-content-box-info-background: #f0f0f4;
--in-content-item-hover: color-mix(in srgb, var(--in-content-primary-button-background) 20%, transparent);
--in-content-item-hover-text: var(--in-content-page-color);
--in-content-item-selected: var(--in-content-primary-button-background);
--in-content-item-selected-text: var(--in-content-primary-button-text-color);
--in-content-icon-color: rgb(91,91,102);
--in-content-accent-color: #0a84ff;
--in-content-accent-color-active: #0060df;
--in-content-border-hover: var(--grey-90-a50);
--in-content-border-invalid: var(--red-50);
--in-content-border-color: #d7d7db;
--in-content-error-text-color: #c50042;
--in-content-link-color: var(--blue-60);
--in-content-link-color-hover: var(--blue-70);
--in-content-link-color-active: var(--blue-80);
--in-content-link-color-visited: var(--blue-60);
/* button background states are also used for checkboxes and radiobuttons */
--in-content-button-text-color: var(--in-content-text-color);
--in-content-button-text-color-hover: var(--in-content-text-color);
--in-content-button-background: rgba(207,207,216,.33);
--in-content-button-background-hover: rgba(207,207,216,.66);
--in-content-button-background-active: rgb(207,207,216);
--in-content-primary-button-text-color: rgb(251,251,254);
--in-content-primary-button-text-color-hover: var(--in-content-primary-button-text-color);
--in-content-primary-button-background: #0061e0;
--in-content-primary-button-background-hover: #0250bb;
--in-content-primary-button-background-active: #053e94;
--in-content-danger-button-background: #e22850;
--in-content-danger-button-background-hover: #c50042;
--in-content-danger-button-background-active: #810220;
--in-content-focus-outline-color: var(--in-content-primary-button-background);
/* Note: 1px smaller than we want because we have a 1px transparent border. */
/* Once proton ships, these can probably stop being variables. */
--in-content-button-border-radius: 4px;
--in-content-button-horizontal-padding: 15px;
--in-content-button-vertical-padding: 7px;
--in-content-table-background: #f8f8fa;
--in-content-table-border-dark-color: #d1d1d1;
--in-content-table-header-background: #0a84ff;
--in-content-table-header-color: #ffffff;
--in-content-sidebar-width: 240px;
--dialog-warning-text-color: var(--red-60);
--checkbox-border-color: var(--in-content-box-border-color);
--checkbox-unchecked-bgcolor: var(--in-content-button-background);
--checkbox-unchecked-hover-bgcolor: var(--in-content-button-background-hover);
--checkbox-unchecked-active-bgcolor: var(--in-content-button-background-active);
--checkbox-checked-bgcolor: var(--in-content-primary-button-background);
--checkbox-checked-color: var(--in-content-primary-button-text-color);
--checkbox-checked-border-color: transparent;
--checkbox-checked-hover-bgcolor: var(--in-content-primary-button-background-hover);
--checkbox-checked-active-bgcolor: var(--in-content-primary-button-background-active);
--blue-40: #45a1ff;
--blue-50: #0a84ff;
--blue-60: #0060df;
--blue-70: #003eaa;
--blue-80: #002275;
--grey-30: #d7d7db;
--grey-60: #4a4a4f;
--grey-90-a10: rgba(12, 12, 13, 0.1);
--grey-90-a20: rgba(12, 12, 13, 0.2);
--grey-90-a30: rgba(12, 12, 13, 0.3);
--grey-90-a50: rgba(12, 12, 13, 0.5);
--grey-90-a60: rgba(12, 12, 13, 0.6);
--green-50: #30e60b;
--green-60: #12bc00;
--green-70: #058b00;
--green-80: #006504;
--green-90: #003706;
--orange-50: #ff9400;
--red-40: #ff4f5e;
--red-50: #ff0039;
--red-60: #d70022;
--red-70: #a4000f;
--red-80: #5a0002;
--red-90: #3e0200;
--yellow-50: #ffe900;
--yellow-60: #d7b600;
--yellow-60-a30: rgba(215, 182, 0, 0.3);
--yellow-70: #a47f00;
--yellow-80: #715100;
--yellow-90: #3e2800;
--shadow-10: 0 1px 4px var(--grey-90-a10);
--shadow-30: 0 4px 16px var(--grey-90-a10);
--card-padding: 16px;
--card-shadow: var(--shadow-10);
--card-outline-color: var(--grey-30);
--card-shadow-hover: var(--card-shadow), 0 0 0 5px var(--card-outline-color);
}
@media (-moz-toolbar-prefers-color-scheme: dark) {
:host,
:root {
/* Keep these in sync with layout/base/PresShell.cpp, and plaintext.css */
--in-content-page-background: rgb(28,27,34);
--in-content-page-color: rgb(251,251,254);
--in-content-deemphasized-text: rgb(191,191,201);
--in-content-box-background: rgb(35, 34, 43);
--in-content-box-background-odd: rgba(249,249,250,0.05);
--in-content-box-info-background: rgba(249,249,250,0.15);
--in-content-border-color: rgba(249,249,250,0.2);
--in-content-border-hover: rgba(249,249,250,0.3);
--in-content-border-invalid: rgb(255,132,139);
--in-content-error-text-color: #FF9AA2;
--in-content-button-background: rgb(43,42,51);
--in-content-button-background-hover: rgb(82,82,94);
--in-content-button-background-active: rgb(91,91,102);
--in-content-icon-color: rgb(251,251,254);
--in-content-primary-button-text-color: rgb(43,42,51);
--in-content-primary-button-background: rgb(0,221,255);
--in-content-primary-button-background-hover: rgb(128,235,255);
--in-content-primary-button-background-active: rgb(170,242,255);
--in-content-danger-button-background: #ff848b;
--in-content-danger-button-background-hover: #ffbdc5;
--in-content-danger-button-background-active: #ffdfe7;
--in-content-table-background: rgb(35, 34, 43);
--in-content-table-border-dark-color: rgba(249,249,250,0.2);
--in-content-table-header-background: rgb(5, 64, 150);
--in-content-table-header-color: var(--in-content-page-color);
--in-content-accent-color: var(--in-content-primary-button-background);
--in-content-accent-color-active: var(--in-content-primary-button-background-hover);
--in-content-link-color: var(--in-content-primary-button-background);
--in-content-link-color-hover: var(--in-content-primary-button-background-hover);
--in-content-link-color-active: var(--in-content-primary-button-background-active);
--in-content-link-color-visited: var(--in-content-link-color);
--card-outline-color: var(--grey-60);
--dialog-warning-text-color: var(--red-40);
scrollbar-color: rgba(249,249,250,.4) rgba(20,20,25,.3);
}
/*= Addons.org =============================================================*/
@-moz-document url-prefix("https://addons.mozilla.org") {
/* Basic */
.Page-content,
.SecondaryHero,
main[aria-label="Content"] {
color: var(--in-content-page-color) !important;
background: var(--in-content-page-background) !important;
}
/* Text */
.AutoSearchInput-query,
.AutoSearchInput-suggestions-list,
.Page-content h1,
.Page-content h2,
.SearchResult-link,
.Home-SubjectShelf-link:link,
.Home-SubjectShelf-link:visited,
.DropdownMenuItem-link a,
.Select,
.Badge,
.Paginate .Button.Paginate-item:first-child,
.Paginate .Button.Paginate-item:last-child,
.Paginate .Button.Paginate-item--current-page,
.Button--neutral,
.blog-entry-title,
.blogpost-nav * {
color: var(--in-content-text-color) !important;
}
.AutoSearchInput-suggestions-item:is(:active, :focus, :hover),
.SecondaryHero-message-link,
.SecondaryHero-module-link,
.Card-footer-link a,
.SearchResult-link:is(:active, :focus, :hover),
.SearchResult:hover .SearchResult-link,
.Home-SubjectShelf-link:is(:active, :focus, :hover),
.DropdownMenuItem-link a:is(:active, :focus, :hover),
.AddonMeta .MetadataCard-title a:is(:active, :hover),
.AddonMeta .MetadataCard-title a.AddonMeta-reviews-content-link:is(:active, :hover),
.AddonMeta .MetadataCard-content a:is(:active, :hover),
.AddonMeta .MetadataCard-content a.AddonMeta-reviews-content-link:is(:active, :hover),
.RatingsByStar-count a:hover,
.RatingsByStar-star a:hover,
.Paginate .Button.Paginate-item:not(:first-child, :last-child, .Paginate-item--current-page),
.AddonTitle-author a,
.PermissionsCard-learn-more,
.DefinitionList a,
.ShowMoreCard-contents a,
.AddonDescription-contents a,
.AddonTitle a,
.TooltipMenu-opener,
.LanguageTools .Card-contents a,
.blog-entry-read-more-link,
.blogpost-nav-next.blogpost-nav-no-prev:hover p,
.blogpost-content-wrapper p a,
.blogpost-nav-prev:hover p,
.blogpost-nav-next:hover p {
color: var(--in-content-link-color) !important;
}
.SearchResult--meta-section,
.MetadataCard-title,
.MetadataCard-title a,
.MetadataCard-content a,
.CollectionSort-label,
.SearchResult-summary,
.AddonMeta .MetadataCard-content a.AddonMeta-reviews-content-link,
.AddonMeta .MetadataCard-title a.AddonMeta-reviews-content-link,
.PermissionsCard-subhead--optional,
.PermissionsCard-subhead--required,
.Definition-dt,
.RatingsByStar-count a,
.RatingsByStar-star a,
.Paginate-page-number,
.AddonSummaryCard-addonAverage,
.AddonReviewCard-authorByLine,
.Home-heroHeader-subtitle,
.blog-entry-date,
.blogpost-breadcrumb *,
.AddonTitle-author,
.ExpandableCard-ToggleLink,
.SearchFilters-label,
.PromotedBadge-label--line {
color: var(--in-content-deemphasized-text) !important;
}
.PromotedBadge-label--recommended {
color: color-mix(in srgb, #712b00 15%, #ff9400) !important;
}
/* Background */
.Button--action {
color: var(--in-content-primary-button-text-color) !important;
background: var(--in-content-primary-button-background) !important;
}
.Select,
.Button--neutral, .Button--neutral:link {
background-color: var(--in-content-button-background) !important;
}
.Button--neutral.Button--micro:not(.Button--disabled):hover,
.Button--neutral:not(.Button--disabled):hover {
background: var(--in-content-button-background-hover) !important;
}
.Button--action.Button--micro:not(.Button--disabled):hover,
.Button--action:not(.Button--disabled):hover {
background: var(--in-content-primary-button-background-hover) !important;
}
.ShowMoreCard-contents::after {
background: linear-gradient(hsla(0,0%,100%,0), var(--in-content-table-background)) !important;
}
.AutoSearchInput-query,
.AutoSearchInput-suggestions-list,
.SecondaryHero-module,
.Card-header,
.Card-contents,
.CardList ul > li,
.AddonsCard--horizontal ul.AddonsCard-list .SearchResult-wrapper:is(:focus, :hover),
.Paginate,
.LandingPage-header,
.DropdownMenu-items,
.DropdownMenu-items::after,
.MetadataCard,
.AddonsCard-list,
.Card-footer,
.StaticAddonCard,
.blogpost-nav * {
background: var(--in-content-table-background) !important;
}
.Paginate .Button.Paginate-item:is(:active, :hover) {
background: var(--in-content-button-background-hover) !important;
}
.LanguageTools-header-row {
color: var(--in-content-table-header-color) !important;
background: var(--in-content-table-header-background) !important;
}
.LanguageTools-table.responsiveTable tbody tr:nth-child(2n) {
background-color: var(--in-content-box-background-odd) !important;
}
/* Fill */
.Icon-arrow-blue.SearchSuggestion-icon-arrow {
filter: hue-rotate(330deg) brightness(1.3) !important;
}
.SecondaryHero-module-icon {
-moz-context-properties: fill, fill-opacity !important;
fill: currentColor !important;
}
.Icon-magnifying-glass {
filter: invert(65%) !important;
}
.Icon-heart {
filter: brightness(0) !important;
}
.Permission .Icon {
filter: grayscale(100%) brightness(30) !important;
}
/* Others */
.DropdownMenu-items {
box-shadow: 0 0 2px var(--in-content-border-color) !important;
}
.AutoSearchInput-query {
border: 1px solid var(--in-content-table-background) !important;
}
.AutoSearchInput-query:is(:hover, :focus) {
border-color: var(--in-content-primary-button-background) !important;
}
.PromotedBadge-link--line {
border-color: var(--in-content-deemphasized-text) !important;
}
.PromotedBadge-link--line:hover {
border-color: var(--in-content-button-background-hover) !important;
}
.blog-entry-read-more-link {
border-color: var(--in-content-link-color) !important;
}
.blogpost-nav-arrow-left .cls-1,
.blogpost-nav-arrow-right .cls-1 {
stroke: var(--in-content-text-color) !important;
}
}
/*= Support.org ============================================================*/
@-moz-document url-prefix("https://support.mozilla.org") {
/* Basic */
:root {
--color-blue-06: var(--in-content-link-color) !important;
--color-blue-07: var(--in-content-link-color-hover) !important;
--page-bg: var(--in-content-page-background) !important;
--color-white: var(--in-content-page-background) !important;
--color-shade-bg: var(--in-content-page-background) !important;
--color-marketing-gray-02: var(--card-outline-color) !important;
--color-inverse-bg: var(--in-content-page-color) !important;
--color-inverse: var(--in-content-page-background) !important;
--color-text: var(--in-content-page-color) !important;
--color-text-light: var(--in-content-deemphasized-text) !important;
--color-link: var(--in-content-link-color) !important;
--color-success: var(--green-60) !important;
--color-warning: var(--yellow-60) !important;
--color-error: var(--red-60) !important;
--color-error-hover: var(--red-50) !important;
--color-moz-heading: #fff;
--color-moz-inverse-bg: var(red) !important;
--focus-shadow: 0 0 0 4px color-mix(in srgb, var(--in-content-primary-button-background) 30%, transparent),0 0 0 2px var(--in-content-primary-button-background-active);
}
body,
#main-content,
#instant-search-content,
#mzp-c-menu-panel-help,
.mzp-c-navigation {
color: var(--in-content-page-color) !important;
background: var(--in-content-page-background) !important;
}
/* Text */
.mzp-c-menu-category .mzp-c-menu-title,
.mzp-c-menu-item .mzp-c-menu-item-link,
.mzp-c-menu-item .mzp-c-menu-item-link > *,
.mzp-c-menu-item .mzp-c-menu-item-list a,
#doc-content .menu,
.document--content .menu,
.forum--entry-content .menu{
color: var(--in-content-page-color) !important;
}
.ts-select-trigger,
input[type="date"],
input[type="email"],
input[type="number"],
input[type="password"],
input[type="search"],
input[type="tel"],
input[type="text"],
input[type="time"],
input[type="url"],
select,
textarea,
#doc-content .button,
#doc-content .key,
.document--content .button,
.document--content .key,
.forum--entry-content .button,
.forum--entry-content .key{
color: var(--in-content-deemphasized-text) !important;
}
/* Background */
.sidebar-nav.topics, .sidebar-nav.topics > li {
background: var(--in-content-page-background) !important;
}
/* Fill */
.sumo-nav--logo,
.sumo-nav--search-button,
.sumo-nav--toggle-button,
.card--icon-sm,
.mzp-c-menu-item-icon,
.mzp-c-menu-button-close,
.topic-article--icon,
.card--topic > .card--icon {
filter: invert(95%) !important;
}
/* Others */
.sumo-button.secondary-button {
border-color: none !important;
}
.mzp-c-menu-panel {
border-color: var(--in-content-button-background-hover) !important;
}
.mzp-c-menu-item:is(:focus, :hover, :active) .mzp-c-menu-item-link .mzp-c-menu-item-title {
border-color: var(--in-content-page-color) !important;
}
@media screen and (min-width: 768px) {
.mzp-c-menu-panel {
box-shadow: box-shadow: 0 16px 16px -16px rgba(255,255,255,.3) !important;
}
}
.card--product,
.card--topic,
.card--article {
box-shadow: 0 5px 10px -3px rgba(249, 249, 250, .12),
0 3px 16px 2px rgba(91, 91, 102, .12),
0 8px 12px 1px rgba(82, 82, 94, .04) !important;
}
}
/*= Accounts.com ===========================================================*/
@-moz-document url-prefix("https://accounts.firefox.com") {
/* Basic */
body {
color: var(--in-content-page-color) !important;
background: var(--in-content-page-background) !important;
}
.button.primary-button,
.button[type="submit"]:not(.secondary-button),
.settings-button.primary-button,
.settings-button[type="submit"]:not(.secondary-button),
button.primary-button, button[type="submit"]:not(.secondary-button) {
color: var(--in-content-primary-button-text-color) !important;
background: var(--in-content-primary-button-background) !important;
}
/* Text */
header h1,
.info,
.info a,
.faint a:hover,
.cta-neutral:hover {
color: var(--in-content-page-color) !important;
}
.links a,
.link-blue,
.text-blue-500 {
color: var(--in-content-link-color) !important;
}
.link-blue:hover {
color: var(--in-content-link-color-hover) !important;
}
.input-row input[type="email"],
.input-row input[type="number"],
.input-row input[type="password"],
.input-row input[type="tel"],
.input-row input[type="text"],
.input-row input::placeholder,
.firefox-family-services > ul > .firefox-service,
.faint,
.faint a,
.text-grey-400 {
color: var(--in-content-deemphasized-text) !important;
}
/* Background */
.password-row .show-password-label {
background-color: unset !important;
}
#main-content,
.firefox-family-services,
.input-row input[type="email"],
.input-row input[type="number"],
.input-row input[type="password"],
.input-row input[type="tel"],
.input-row input[type="text"],
.password-row .show-password-label,
header,
.bg-white:not(nav) {
background: var(--in-content-box-background) !important;
}
#suggest-sync,
.cta-neutral {
background: var(--in-content-button-background) !important;
}
.cta-neutral:hover,
.bg-grey-50:hover,
.hover\:bg-grey-100:hover {
background: var(--in-content-button-background-hover) !important;
}
.hover\:bg-grey-200:hover {
background: var(--in-content-button-background-active) !important;
}
.button.primary-button:hover:enabled,
.button[type="submit"]:not(.secondary-button):hover:enabled,
.settings-button.primary-button:hover:enabled,
.settings-button[type="submit"]:not(.secondary-button):hover:enabled,
button.primary-button:hover:enabled,
button[type="submit"]:not(.secondary-button):hover:enabled {
background: var(--in-content-primary-button-background-hover) !important;
}
.tooltip,
.tooltip::before {
background: var(--in-content-danger-button-background) !important;
}
/* Fill */
.dismiss,
#about-mozilla,
.show-password-label,
footer a[data-testid="link-mozilla"] {
filter: invert(95%) !important;
}
header button svg,
header .rounded svg,
#service svg {
filter: brightness(15) !important;
}
button.relative,
#fxa-settings nav svg{
filter: brightness(2) !important;
}
/* Others */
.input-row input[type="email"],
.input-row input[type="number"],
.input-row input[type="password"],
.input-row input[type="tel"],
.input-row input[type="text"],
.unit-row-hr
.border-grey-100 {
border-color: var(--in-content-border-color) !important;
}
.input-row input[type="email"]:hover,
.input-row input[type="number"]:hover,
.input-row input[type="password"]:hover,
.input-row input[type="tel"]:hover,
.input-row input[type="text"]:hover {
border-color: var(--in-content-border-hover) !important;
}
#main-content {
box-shadow: 0 12px 18px 2px rgba(249, 249, 250, .12) ,
0 6px 22px 4px rgba(91, 91, 102, .12),
0 6px 10px -4px rgba(82, 82, 94, .04) !important;
}
.input-row input[type="email"]:focus,
.input-row input[type="number"]:focus,
.input-row input[type="password"]:focus,
.input-row input[type="tel"]:focus,
.input-row input[type="text"]:focus {
box-shadow: 0 0 0 3px color-mix(in srgb, var(--in-content-primary-button-background-hover) 80%, transparent) !important;
}
}
}
/** Fully Proton Mode *******************************************************/
/*= abouts' common =========================================================*/
@-moz-document url-prefix("about:plugins"),
url-prefix("about:cache"),
url-prefix("about:checkerboard"),
url-prefix("about:sync-log"),
url-prefix("about:memory"),
url-prefix("file://") {
/* Base */
html,
body {
font: message-box !important;
appearance: none !important;
background-color: var(--in-content-page-background) !important;
color: var(--in-content-page-color) !important;
}
body {
font-size: 15px !important;
font-weight: normal !important;
margin: 0 !important;
}
h1 {
line-height: 1.2 !important;
}
h2 {
line-height: 1.4em !important;
}
/* Link */
a {
color: var(--in-content-link-color) !important;
}
a:hover,
.text-link:hover {
color: var(--in-content-link-color-hover) !important;
text-decoration: underline !important;
}
a:visited {
color: var(--in-content-link-color-visited) !important;
}
a:hover:active,
.text-link:hover:active {
color: var(--in-content-link-color-active) !important;
}
a:-moz-focusring,
.text-link:-moz-focusring {
outline: 2px solid var(--in-content-focus-outline-color) !important;
outline-offset: 1px !important;
border-radius: 4px !important;
}
/* Button */
button {
font: inherit;
}
button,
select,
input[type="color"] {
appearance: none !important;
min-height: 32px !important;
color: var(--in-content-button-text-color, inherit) !important;
border: 1px solid transparent !important; /* shows up in high-contrast mode */
border-radius: var(--in-content-button-border-radius) !important;
background-color: var(--in-content-button-background) !important;
font-weight: 400 !important;
padding: var(--in-content-button-vertical-padding) var(--in-content-button-horizontal-padding) !important;
text-decoration: none !important;
margin: 4px 8px !important;
/* Ensure font-size isn't overridden by widget styling (e.g. in forms.css) */
font-size: 1em !important;
}
button {
font-weight: 600 !important;
/* Use the same margin of other elements for the alignment */
margin-inline: 4px !important;
min-width: 6.3em !important;
}
/* Medium and small buttons get sized to 7/14 and 6/12px padding (when adding
* the 1px border): */
button.medium {
--in-content-button-vertical-padding: 6px;
--in-content-button-horizontal-padding: 13px;
min-height: 28px !important;
font-size: 0.95em !important;
}
button.small {
--in-content-button-vertical-padding: 5px;
--in-content-button-horizontal-padding: 11px;
min-height: 24px !important;
font-size: 0.9em !important;
}
::-moz-focus-inner {
border: none !important;
}
button:-moz-focusring {
box-shadow: none !important;
outline: 2px solid var(--in-content-focus-outline-color) !important;
outline-offset: 2px !important;
}
button:enabled:hover,
input[type="color"]:hover {
background-color: var(--in-content-button-background-hover) !important;
color: var(--in-content-button-text-color-hover) !important;
border-color: transparent !important;
}
button:enabled:hover:active,
input[type="color"]:enabled:hover:active {
background-color: var(--in-content-button-background-active) !important;
}
button:disabled,
input[type="color"]:disabled {
opacity: 0.4 !important;
}
button[autofocus],
button[type="submit"],
button.primary {
background-color: var(--in-content-primary-button-background) !important;
color: var(--in-content-primary-button-text-color) !important;
}
button[autofocus]:enabled:hover,
button[type="submit"]:enabled:hover,
button.primary:enabled:hover {
background-color: var(--in-content-primary-button-background-hover) !important;
color: var(--in-content-primary-button-text-color-hover) !important;
}
button[autofocus]:enabled:hover:active,
button[type="submit"]:enabled:hover:active,
button.primary:enabled:hover:active {
background-color: var(--in-content-primary-button-background-active) !important;
}
/* Checkbox */
input[type="checkbox"] {
margin-block: 2px !important;
}
input[type="checkbox"] {
appearance: none !important;
height: 16px !important;
width: 16px !important;
border: 1px solid var(--checkbox-border-color) !important;
background-color: var(--checkbox-unchecked-bgcolor) !important;
border-radius: 2px !important;
margin-inline: 0 6px !important;
flex-shrink: 0 !important; /* avoid shrinking inside flex container */
}
input[type="checkbox"]:enabled:hover {
background-color: var(--checkbox-unchecked-hover-bgcolor) !important;
}
input[type="checkbox"]:enabled:hover:active {
background-color: var(--checkbox-unchecked-active-bgcolor) !important;
}
input[type="checkbox"]:checked {
border-color: var(--checkbox-checked-border-color) !important;
background-color: var(--checkbox-checked-bgcolor) !important;
background-image: url("chrome://global/skin/icons/check.svg") !important;
background-position: center !important;
background-repeat: no-repeat !important;
-moz-context-properties: fill !important;
fill: currentColor !important;
color: var(--checkbox-checked-color) !important;
/* Style the button also when printing with "Print Backgrounds" unchecked */
color-adjust: exact !important;
}
input[type="checkbox"]:enabled:checked:hover {
background-color: var(--checkbox-checked-hover-bgcolor) !important;
}
input[type="checkbox"]:enabled:checked:hover:active {
background-color: var(--checkbox-checked-active-bgcolor) !important;
}
/* Textarea */
input:is([type="email"], [type="tel"], [type="text"], [type="password"], [type="url"], [type="number"]),
textarea {
appearance: none !important;
border: 1px solid var(--in-content-box-border-color) !important;
border-radius: 4px !important;
color: inherit !important;
background-color: var(--in-content-box-background) !important;
}
input:is([type="email"], [type="tel"], [type="text"], [type="password"], [type="url"], [type="number"]),
textarea {
font-family: inherit !important;
font-size: inherit !important;
padding: 8px !important;
margin: 2px 4px !important;
}
input:is([type="email"], [type="tel"], [type="text"], [type="password"], [type="url"], [type="number"]):focus,
textarea:focus,
search-textbox[focused],
tree:focus-visible,
richlistbox:focus-visible {
border-color: transparent !important;
outline: 2px solid var(--in-content-focus-outline-color) !important;
outline-offset: -1px !important; /* Prevents antialising around the corners */
}
input:is([type="email"], [type="tel"], [type="text"], [type="password"], [type="url"], [type="number"]):-moz-ui-invalid,
textarea:-moz-ui-invalid {
border-color: transparent !important;
outline: 2px solid var(--in-content-border-invalid) !important;
outline-offset: -1px !important; /* Prevents antialising around the corners */
}
input:is([type="email"], [type="tel"], [type="text"], [type="password"], [type="url"], [type="number"]):disabled,
textarea:disabled,
search-textbox[disabled="true"] {
opacity: 0.4 !important;
}
/* Table */
table {
width: 100% !important;
}
}
@-moz-document url-prefix("about:plugins"),
url-prefix("about:cache"),
url-prefix("about:checkerboard") {
table {
border: 1px solid var(--in-content-border-color) !important;
border-radius: 0 !important;
}
}
@-moz-document url-prefix("about:cache"),
url-prefix("about:checkerboard") {
th, td {
border: 1px solid var(--in-content-border-color) !important;
}
th {
background-color: var(--in-content-table-header-background) !important;
color: var(--in-content-table-header-color) !important;
}
}
/*= Directory View =========================================================*/
@-moz-document url-prefix("about:sync-log"),
url-prefix("file://") {
body {
background-color: var(--in-content-box-background) !important;
}
thead a {
color: var(--in-content-page-color) !important;
}
td ::before {
vertical-align: top !important;
}
}
/*= about:plugins ==========================================================*/
@-moz-document url-prefix("about:plugins") {
.notice {
background: var(--in-content-box-background) !important;
border: 1px solid var(--in-content-border-color) !important;
}
}
/*= about:cache ============================================================*/
@-moz-document url-prefix("about:cache") {
table {
padding: 0 !important;
}
th, td {
padding: 4px !important;
text-align: match-parent !important;
}
}
/*= about:checkerboard =====================================================*/
@-moz-document url-prefix("about:checkerboard") {
#canvas {
border: 1px solid var(--in-content-border-color) !important;
}
#excludePageFromZoom {
vertical-align: bottom !important;
}
}
/*= about:memory ===========================================================*/
@-moz-document url-prefix("about:memory") {
.opsRow,
.section {
background-color: var(--in-content-box-background) !important;
color: var(--in-content-page-color) !important;
}
.opsRowLabel input {
vertical-align: bottom !important;
}
}
}