From e6ed60548397627bf10f561f9438201dbba0a36e Mon Sep 17 00:00:00 2001 From: Azat Bahawi Date: Sun, 21 Apr 2024 02:15:42 +0300 Subject: 2024-04-21 --- modules/firefox/addons.json | 44 +++ modules/firefox/addons.nix | 315 ++++++++++++++++++++++ modules/firefox/default.nix | 575 ++++++++++++++++++++++++++++++++++++++++ modules/firefox/userChrome.css | 172 ++++++++++++ modules/firefox/userContent.css | 399 ++++++++++++++++++++++++++++ 5 files changed, 1505 insertions(+) create mode 100644 modules/firefox/addons.json create mode 100644 modules/firefox/addons.nix create mode 100644 modules/firefox/default.nix create mode 100644 modules/firefox/userChrome.css create mode 100644 modules/firefox/userContent.css (limited to 'modules/firefox') diff --git a/modules/firefox/addons.json b/modules/firefox/addons.json new file mode 100644 index 0000000..c1ea3fa --- /dev/null +++ b/modules/firefox/addons.json @@ -0,0 +1,44 @@ +[ + { + "pname": "bitwarden", + "slug": "bitwarden-password-manager" + }, + { + "slug": "consent-o-matic" + }, + { + "slug": "darkreader" + }, + { + "slug": "furiganaize" + }, + { + "slug": "ipfs-companion" + }, + { + "slug": "languagetool" + }, + { + "slug": "no-pdf-download" + }, + { + "pname": "rikaichamp", + "slug": "10ten-ja-reader" + }, + { + "slug": "redirector" + }, + { + "slug": "skip-redirect" + }, + { + "slug": "ublock-origin" + }, + { + "pname": "user-agent-switcher", + "slug": "user-agent-string-switcher" + }, + { + "slug": "violentmonkey" + } +] diff --git a/modules/firefox/addons.nix b/modules/firefox/addons.nix new file mode 100644 index 0000000..54e67ee --- /dev/null +++ b/modules/firefox/addons.nix @@ -0,0 +1,315 @@ +{ buildFirefoxXpiAddon, lib }: +{ + "bitwarden" = buildFirefoxXpiAddon { + pname = "bitwarden"; + version = "2024.4.1"; + addonId = "{446900e4-71c2-419f-a6a7-df9c091e268b}"; + url = "https://addons.mozilla.org/firefox/downloads/file/4263752/bitwarden_password_manager-2024.4.1.xpi"; + sha256 = "1ba1e66cb9a4ee3bf80a81fc31348b04162385455d2b02f9902473e3931d9693"; + meta = with lib; { + homepage = "https://bitwarden.com"; + description = "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information."; + license = licenses.gpl3; + mozPermissions = [ + "" + "*://*/*" + "tabs" + "contextMenus" + "storage" + "unlimitedStorage" + "clipboardRead" + "clipboardWrite" + "idle" + "webRequest" + "webRequestBlocking" + "file:///*" + "https://*/*" + "https://lastpass.com/export.php" + ]; + platforms = platforms.all; + }; + }; + "consent-o-matic" = buildFirefoxXpiAddon { + pname = "consent-o-matic"; + version = "1.0.13"; + addonId = "gdpr@cavi.au.dk"; + url = "https://addons.mozilla.org/firefox/downloads/file/4246350/consent_o_matic-1.0.13.xpi"; + sha256 = "ee577eaedebd9fef65f77218b86c59972818442c9af551d551a7015a4a246e9a"; + meta = with lib; { + homepage = "https://consentomatic.au.dk/"; + description = "Automatic handling of GDPR consent forms"; + license = licenses.mit; + mozPermissions = [ + "activeTab" + "tabs" + "storage" + "" + ]; + platforms = platforms.all; + }; + }; + "darkreader" = buildFirefoxXpiAddon { + pname = "darkreader"; + version = "4.9.83"; + addonId = "addon@darkreader.org"; + url = "https://addons.mozilla.org/firefox/downloads/file/4262984/darkreader-4.9.83.xpi"; + sha256 = "a43cca2449de202d17040b0d91b2fb3ed4dd58ac81ec5d3fde4c9940d326c822"; + meta = with lib; { + homepage = "https://darkreader.org/"; + description = "Dark mode for every website. Take care of your eyes, use dark theme for night and daily browsing."; + license = licenses.mit; + mozPermissions = [ + "alarms" + "contextMenus" + "storage" + "tabs" + "theme" + "" + ]; + platforms = platforms.all; + }; + }; + "furiganaize" = buildFirefoxXpiAddon { + pname = "furiganaize"; + version = "0.7.2"; + addonId = "{a2503cd4-4083-4c2f-bef2-37767a569867}"; + url = "https://addons.mozilla.org/firefox/downloads/file/4032306/furiganaize-0.7.2.xpi"; + sha256 = "7545bc418f2afbc576b0e762f2b2fa0545d5d94f3f80737e5356d087a5951c0b"; + meta = with lib; { + homepage = "https://github.com/kuanyui/Furiganaize"; + description = "Auto insert furigana (振り仮名) on Japanese kanji."; + license = licenses.mit; + mozPermissions = [ + "http://*/*" + "https://*/*" + "file://*/*" + "" + "activeTab" + "tabs" + "storage" + ]; + platforms = platforms.all; + }; + }; + "ipfs-companion" = buildFirefoxXpiAddon { + pname = "ipfs-companion"; + version = "3.1.0"; + addonId = "ipfs-firefox-addon@lidel.org"; + url = "https://addons.mozilla.org/firefox/downloads/file/4172699/ipfs_companion-3.1.0.xpi"; + sha256 = "784f6d1e0497d86f1e42cfe7de8548b5cc28fabe80e50771d90f59ddf1b9d3c1"; + meta = with lib; { + homepage = "https://github.com/ipfs/ipfs-companion"; + description = "Harness the power of IPFS in your browser"; + license = licenses.cc0; + mozPermissions = [ + "idle" + "tabs" + "notifications" + "proxy" + "storage" + "unlimitedStorage" + "contextMenus" + "clipboardWrite" + "webNavigation" + "webRequest" + "webRequestBlocking" + ]; + platforms = platforms.all; + }; + }; + "languagetool" = buildFirefoxXpiAddon { + pname = "languagetool"; + version = "8.6.0"; + addonId = "languagetool-webextension@languagetool.org"; + url = "https://addons.mozilla.org/firefox/downloads/file/4249956/languagetool-8.6.0.xpi"; + sha256 = "d9db9aac9fdd53eb39179c153161762cd9e9eb1f6d7da8e8b8a32238b4847094"; + meta = with lib; { + homepage = "https://languagetool.org"; + description = "With this extension you can check text with the free style and grammar checker LanguageTool. It finds many errors that a simple spell checker cannot detect, like mixing up there/their, a/an, or repeating a word."; + mozPermissions = [ + "activeTab" + "storage" + "contextMenus" + "alarms" + "http://*/*" + "https://*/*" + "file:///*" + "*://docs.google.com/document/*" + "*://languagetool.org/*" + ]; + platforms = platforms.all; + }; + }; + "no-pdf-download" = buildFirefoxXpiAddon { + pname = "no-pdf-download"; + version = "1.0.6"; + addonId = "{b9b25e4a-bdf4-4270-868c-3f619eaf437d}"; + url = "https://addons.mozilla.org/firefox/downloads/file/3020560/no_pdf_download-1.0.6.xpi"; + sha256 = "fa27b6729178a23ccf2eee07cd7650d841fc6040f2e5adfb919931b671ed79e6"; + meta = with lib; { + homepage = "https://github.com/MorbZ/no-pdf-download"; + description = "Opens all PDF files directly in the browser."; + license = licenses.mit; + mozPermissions = [ + "webRequest" + "webRequestBlocking" + "" + ]; + platforms = platforms.all; + }; + }; + "redirector" = buildFirefoxXpiAddon { + pname = "redirector"; + version = "3.5.3"; + addonId = "redirector@einaregilsson.com"; + url = "https://addons.mozilla.org/firefox/downloads/file/3535009/redirector-3.5.3.xpi"; + sha256 = "eddbd3d5944e748d0bd6ecb6d9e9cf0e0c02dced6f42db21aab64190e71c0f71"; + meta = with lib; { + homepage = "http://einaregilsson.com/redirector/"; + description = "Automatically redirects to user-defined urls on certain pages"; + license = licenses.mit; + mozPermissions = [ + "webRequest" + "webRequestBlocking" + "webNavigation" + "storage" + "tabs" + "http://*/*" + "https://*/*" + "notifications" + ]; + platforms = platforms.all; + }; + }; + "rikaichamp" = buildFirefoxXpiAddon { + pname = "rikaichamp"; + version = "1.18.0"; + addonId = "{59812185-ea92-4cca-8ab7-cfcacee81281}"; + url = "https://addons.mozilla.org/firefox/downloads/file/4241410/10ten_ja_reader-1.18.0.xpi"; + sha256 = "5433bcfec5a327bf1fa198b3f0645a9cdcdc44232465ad940fa8a5858b6996f8"; + meta = with lib; { + homepage = "https://github.com/birchill/10ten-ja-reader/"; + description = "Quickly translate Japanese by hovering over words. Formerly released as Rikaichamp."; + license = licenses.gpl3; + mozPermissions = [ + "alarms" + "clipboardWrite" + "contextMenus" + "storage" + "unlimitedStorage" + "http://*/*" + "https://*/*" + "file:///*" + "https://docs.google.com/*" + ]; + platforms = platforms.all; + }; + }; + "skip-redirect" = buildFirefoxXpiAddon { + pname = "skip-redirect"; + version = "2.3.6"; + addonId = "skipredirect@sblask"; + url = "https://addons.mozilla.org/firefox/downloads/file/3920533/skip_redirect-2.3.6.xpi"; + sha256 = "dbe8950245c1f475c5c1c6daab89c79b83ba4680621c91e80f15be7b09b618ae"; + meta = with lib; { + description = "Some web pages use intermediary pages before redirecting to a final page. This add-on tries to extract the final url from the intermediary url and goes there straight away if successful."; + license = licenses.mit; + mozPermissions = [ + "" + "clipboardWrite" + "contextMenus" + "notifications" + "storage" + "webRequest" + "webRequestBlocking" + ]; + platforms = platforms.all; + }; + }; + "ublock-origin" = buildFirefoxXpiAddon { + pname = "ublock-origin"; + version = "1.57.2"; + addonId = "uBlock0@raymondhill.net"; + url = "https://addons.mozilla.org/firefox/downloads/file/4261710/ublock_origin-1.57.2.xpi"; + sha256 = "9928e79a52cecf7cfa231fdb0699c7d7a427660d94eb10d711ed5a2f10d2eb89"; + meta = with lib; { + homepage = "https://github.com/gorhill/uBlock#ublock-origin"; + description = "Finally, an efficient wide-spectrum content blocker. Easy on CPU and memory."; + license = licenses.gpl3; + mozPermissions = [ + "alarms" + "dns" + "menus" + "privacy" + "storage" + "tabs" + "unlimitedStorage" + "webNavigation" + "webRequest" + "webRequestBlocking" + "" + "http://*/*" + "https://*/*" + "file://*/*" + "https://easylist.to/*" + "https://*.fanboy.co.nz/*" + "https://filterlists.com/*" + "https://forums.lanik.us/*" + "https://github.com/*" + "https://*.github.io/*" + "https://*.letsblock.it/*" + "https://github.com/uBlockOrigin/*" + "https://ublockorigin.github.io/*" + "https://*.reddit.com/r/uBlockOrigin/*" + ]; + platforms = platforms.all; + }; + }; + "user-agent-switcher" = buildFirefoxXpiAddon { + pname = "user-agent-switcher"; + version = "0.5.0"; + addonId = "{a6c4a591-f1b2-4f03-b3ff-767e5bedf4e7}"; + url = "https://addons.mozilla.org/firefox/downloads/file/4098688/user_agent_string_switcher-0.5.0.xpi"; + sha256 = "9dc8da3c8c46d4f04d12fd789c63501fa6a2f502f859b286939a090db63eae33"; + meta = with lib; { + homepage = "http://add0n.com/useragent-switcher.html"; + description = "Spoof websites trying to gather information about your web navigation—like your browser type and operating system—to deliver distinct content you may not want."; + license = licenses.mpl20; + mozPermissions = [ + "storage" + "" + "webNavigation" + "webRequest" + "webRequestBlocking" + "contextMenus" + "*://*/*" + ]; + platforms = platforms.all; + }; + }; + "violentmonkey" = buildFirefoxXpiAddon { + pname = "violentmonkey"; + version = "2.18.0"; + addonId = "{aecec67f-0d10-4fa7-b7c7-609a2db280cf}"; + url = "https://addons.mozilla.org/firefox/downloads/file/4220396/violentmonkey-2.18.0.xpi"; + sha256 = "4abbeea842b82965379c6011dec6a435dfff0f69c20749118a8ba2f7d14cb0f1"; + meta = with lib; { + homepage = "https://violentmonkey.github.io/"; + description = "Userscript support for browsers, open source."; + license = licenses.mit; + mozPermissions = [ + "tabs" + "" + "webRequest" + "webRequestBlocking" + "notifications" + "storage" + "unlimitedStorage" + "clipboardWrite" + "contextMenus" + "cookies" + ]; + platforms = platforms.all; + }; + }; +} diff --git a/modules/firefox/default.nix b/modules/firefox/default.nix new file mode 100644 index 0000000..ce2cecc --- /dev/null +++ b/modules/firefox/default.nix @@ -0,0 +1,575 @@ +{ + config, + inputs, + lib, + pkgs, + ... +}: +with lib; +let + cfg = config.nixfiles.modules.firefox; +in +{ + options.nixfiles.modules.firefox.enable = mkEnableOption "Firefox"; + + config = mkIf cfg.enable { + nixfiles.modules.common.xdg.defaultApplications.firefox = [ + "text/html" + "x-scheme-handler/http" + "x-scheme-handler/https" + ]; + + hm = { + imports = [ inputs.arkenfox.hmModules.arkenfox ]; + + home.packages = with pkgs; [ profile-cleaner ]; + + stylix.targets.firefox = { + enable = true; + profileNames = [ "default" ]; + }; + + programs.firefox = { + enable = true; + + package = pkgs.firefox; + + arkenfox.enable = true; + + profiles.default = + let + mkCssWithRoot = + css: + mkMerge [ + # https://github.com/tinted-theming/base24/blob/master/styling.md + (with config.colors.withHashtag; '' + :root { + --black: ${base01}; + --red: ${base08}; + --green: ${base0B}; + --yellow: ${base09}; + --blue: ${base0D}; + --magenta: ${base0E}; + --cyan: ${base0C}; + --white: ${base06}; + --bright-black: ${base02}; + --bright-red: ${base12}; + --bright-green: ${base14}; + --bright-yellow: ${base13}; + --bright-blue: ${base16}; + --bright-magenta: ${base17}; + --bright-cyan: ${base15}; + --bright-white: ${base07}; + --background: ${base00}; + --foreground: ${base05}; + '') + ( + let + mapFonts = concatMapStringsSep ", " (font: ''"${font}"''); + size = toString config.stylix.fonts.sizes.applications; + in + with config.fonts.fontconfig.defaultFonts; + '' + --serif-font-family: ${mapFonts serif}, serif; + --serif-font-size: ${size}; + --sans-serif-font-family: ${mapFonts sansSerif}, sans-serif; + --sans-serif-font-size: ${size}; + --monospace-font-family: ${mapFonts monospace}, monospace; + --monospace-font-size: ${size}; + } + '' + ) + (builtins.readFile css) + ]; + in + { + id = 0; + + isDefault = true; + + userChrome = mkCssWithRoot ./userChrome.css; + + userContent = mkCssWithRoot ./userContent.css; + + extensions = + let + # This was done using the incredible addon generator[1]. All credit + # goes to Robert Helgesson. + # + # [1]: https://sr.ht/~rycee/mozilla-addons-to-nix/ + buildFirefoxXpiAddon = makeOverridable ( + { + stdenv ? pkgs.stdenv, + fetchurl ? pkgs.fetchurl, + pname, + version, + addonId, + url, + sha256, + meta, + ... + }: + stdenv.mkDerivation { + name = "${pname}-${version}"; + inherit meta; + src = fetchurl { inherit url sha256; }; + preferLocalBuild = true; + allowSubstitutes = true; + buildCommand = '' + dst="$out/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}" + mkdir -p "$dst" + install -v -m644 "$src" "$dst/${addonId}.xpi" + ''; + } + ); + + addons = import ./addons.nix { inherit buildFirefoxXpiAddon lib; }; + in + with addons; + [ + consent-o-matic + darkreader + furiganaize + languagetool + no-pdf-download + redirector + rikaichamp + skip-redirect + ublock-origin + user-agent-switcher + violentmonkey + ] + ++ optional config.nixfiles.modules.ipfs.enable ipfs-companion; + + search = { + force = true; + + default = "DuckDuckGo"; + order = [ + "DuckDuckGo" + "Yahoo" + "Google" + ]; + + engines = + let + getIcon = url: sha256: pkgs.fetchurl { inherit url sha256; }; + in + { + "Amazon.com".metaData.hidden = true; + "Bing".metaData.hidden = true; + "Ebay".metaData.hidden = true; + + "2GIS" = { + urls = [ { template = "https://2gis.ru/kazan/search/{searchTerms}"; } ]; + icon = getIcon "https://d-assets.2gis.ru/favicon.png" "sha256-BlSaYRcUx9zhfJnVK5V7rsyft4qaueIEOONiCg+6aLE="; + definedAliases = [ "@2gis" ]; + }; + + "AliExpress" = { + urls = [ { template = "https://aliexpress.ru/wholesale?SearchText={searchTerms}"; } ]; + icon = getIcon "https://ae01.alicdn.com/images/eng/wholesale/icon/aliexpress.ico" "sha256-7xgem2pY2PNuv8as1YnS+U03GvDLLGjhcDLt69rtmaA="; + definedAliases = [ + "@aliexpress" + "@ali" + ]; + }; + + "Ansible Galaxy" = { + urls = [ { template = "https://galaxy.ansible.com/search?keywords={searchTerms}"; } ]; + icon = getIcon "https://galaxy.ansible.com/assets/favicon.ico" "sha256-oAolpZhdKbVTraes6dDlafpvq/Vypu264vgKN4jzJk8="; + definedAliases = [ + "@ansible" + "@galaxy" + "@ag" + ]; + }; + + "Arch Wiki" = { + urls = [ { template = "https://wiki.archlinux.org/index.php?search={searchTerms}"; } ]; + icon = getIcon "https://wiki.archlinux.org/favicon.ico" "sha256-0uxMtT8myzTT7p9k6v5UxsguPKu+vHPlglNTMbnN1T0="; + definedAliases = [ + "@archwiki" + "@aw" + ]; + }; + + "crates.io" = { + urls = [ { template = "https://crates.io/search?q={searchTerms}"; } ]; + icon = getIcon "https://crates.io/favicon.ico" "sha256-upooA/+m5KMUD1t4WFY3EOmytdpUFgNqUj12Auta1mM="; + definedAliases = [ "@crates" ]; + }; + + "Discogs" = { + urls = [ { template = "https://www.discogs.com/search?q={searchTerms}"; } ]; + icon = getIcon "https://st.discogs.com/d56dcb7367720ea20f1b11a4385705517c7e7702/images/favicon.ico" "sha256-zEDrbmcUf8XHUyYzNc6JsWzBioX8sm8tjScGHim5VTk="; + definedAliases = [ "@discogs" ]; + }; + + "Docker Hub" = { + urls = [ { template = "https://hub.docker.com/search?q={searchTerms}"; } ]; + icon = getIcon "https://www.docker.com/wp-content/uploads/2023/04/cropped-Docker-favicon-32x32.png" "sha256-4NmHGMaq31qoIvdlmy7fI3qTbkcp1/tJhqQu/9Ci4/c="; + definedAliases = [ + "@dockerhub" + "@docker" + ]; + }; + + "Ecosia" = { + urls = [ { template = "https://www.ecosia.org/search?q={searchTerms}"; } ]; + icon = getIcon "https://cdn-static.ecosia.org/static/icons/favicon.ico" "sha256-uvPShG1yVh4C4zaJmGuhhr96V/NredB1Wte9O3U6QxA="; + definedAliases = [ "@ecosia" ]; + }; + + "Genius" = { + urls = [ { template = "https://genius.com/search?q={searchTerms}"; } ]; + icon = getIcon "https://assets.genius.com/images/apple-touch-icon.png" "sha256-M9YQEVg3T7hMO/xPfihR1aXfG+/pNiVOBCOtzx3GrkE="; + definedAliases = [ "@genius" ]; + }; + + "GitHub" = { + urls = [ { template = "https://github.com/search?q={searchTerms}"; } ]; + icon = getIcon "https://github.githubassets.com/favicons/favicon-dark.svg" "sha256-qu/d9ftvsntplFuxw9RFL8BpI9b2g5b6xfeGw6Ekh6w="; + definedAliases = [ + "@github" + "@gh" + ]; + }; + + "godocs.io" = { + urls = [ { template = "https://godocs.io/?q={searchTerms}"; } ]; + icon = getIcon "https://go.dev/images/favicon-gopher.svg" "sha256-OlKpUUeYF8TtMoX4e0ERK1ocIb53OJ8ZDxvwJaQVM/0="; + definedAliases = [ "@godocs" ]; + }; + + "pkgs.go.dev" = { + urls = [ { template = "https://pkg.go.dev/search?q={searchTerms}"; } ]; + icon = getIcon "https://go.dev/images/favicon-gopher.svg" "sha256-OlKpUUeYF8TtMoX4e0ERK1ocIb53OJ8ZDxvwJaQVM/0="; + definedAliases = [ "@gopkgs" ]; + }; + + "Hackage" = { + urls = [ { template = "https://hackage.haskell.org/packages/search?terms={searchTerms}"; } ]; + icon = getIcon "https://hackage.haskell.org/static/favicon.png" "sha256-+6WAv93yaA3L2eheGKxklY/uRAvbKD1q/WcmufmhKxY="; + definedAliases = [ "@hackage" ]; + }; + + "Hoogle" = { + urls = [ { template = "https://hoogle.haskell.org/?hoogle={searchTerms}"; } ]; + icon = getIcon "https://hoogle.haskell.org/favicon.png" "sha256-6qmjRYDDRUwm6EdLoZB6o9XtoujsfDEQJ9xOu3Knei8="; + definedAliases = [ "@hoogle" ]; + }; + + "Jisho" = { + urls = [ { template = "https://jisho.org/search/{searchTerms}"; } ]; + icon = getIcon "https://assets.jisho.org/assets/favicon-062c4a0240e1e6d72c38aa524742c2d558ee6234497d91dd6b75a182ea823d65.ico" "sha256-BixKAkDh5tcsOKpSR0LC1VjuYjRJfZHda3WhguqCPWU="; + definedAliases = [ "@jisho" ]; + }; + + "コトバンク" = { + urls = [ { template = "https://kotobank.jp/gs/?q={searchTerms}"; } ]; + icon = getIcon "https://kotobank.jp/favicon.ico" "sha256-t+EzqURlQwznuBqa0GcBbqumvZqtU7HrEAjGUlqp1tg="; + definedAliases = [ "@kotobank" ]; + }; + + "Kubernetes" = { + urls = [ { template = "https://kubernetes.io/search/?q={searchTerms}"; } ]; + icon = getIcon "https://kubernetes.io/images/favicon.png" "sha256-YI5QvGQXoaTG3uUGQ/R99Xl2r+VqBAA1qqthzPbf8nQ="; + definedAliases = [ + "@kubernetes" + "@k8s" + ]; + }; + + "Last.fm" = { + urls = [ { template = "https://www.last.fm/search?q={searchTerms}"; } ]; + icon = getIcon "https://www.last.fm/static/images/favicon.702b239b6194.ico" "sha256-ID+DfF+dZ5CzKiBp/psQPRD6r/06PZ0rVYiELWUt5Mw="; + definedAliases = [ "@lastfm" ]; + }; + + "MDN" = { + urls = [ { template = "https://developer.mozilla.org/en-US/search?q={searchTerms}"; } ]; + icon = getIcon "https://developer.mozilla.org/favicon-48x48.cbbd161b.png" "sha256-Wnd0BqQIKgroGmV+R8vqV9uNBwDvcxBrQ8hXOLOFeKY="; + definedAliases = [ "@mdn" ]; + }; + + "MELPA" = { + urls = [ { template = "https://melpa.org/#/?q={searchTerms}"; } ]; + icon = getIcon "https://melpa.org/favicon.ico" "sha256-bmlydqXBM8MUMC6cOTGSHPx6zN8tZFqmQ+srbXkSCA4="; + definedAliases = [ "@melpa" ]; + }; + + "MusicBrainz" = { + urls = [ { template = "https://musicbrainz.org/search?type=artist&query={searchTerms}"; } ]; + icon = getIcon "https://musicbrainz.org/static/images/favicons/favicon-16x16.png" "sha256-M5mKQurmO9AP0gfC+5OLwi8k4XWQy759eQrrKAeytl0="; + definedAliases = [ + "@musicbrainz" + "@mb" + ]; + }; + + "NixOS Packages" = { + urls = [ { template = "https://search.nixos.org/packages?channel=unstable&query={searchTerms}"; } ]; + icon = getIcon "https://nixos.org/favicon.png" "sha256-awcsDbbpRcDJnJpRavj/IcKMReEektRcqKbE35IJTKQ="; + definedAliases = [ + "@nixpkgs" + "@np" + ]; + }; + + "NixOS Options" = { + urls = [ { template = "https://search.nixos.org/options?channel=unstable&query={searchTerms}"; } ]; + icon = getIcon "https://nixos.org/favicon.png" "sha256-awcsDbbpRcDJnJpRavj/IcKMReEektRcqKbE35IJTKQ="; + definedAliases = [ + "@nixopts" + "@no" + ]; + }; + + "NixOS Wiki" = { + urls = [ { template = "https://nixos.wiki/index.php?search={searchTerms}"; } ]; + icon = getIcon "https://nixos.wiki/favicon.png" "sha256-DE8IgVninF6Aq3iNMgerhvF1dpoXqDUSibtWSpf/dN4="; + definedAliases = [ + "@nixoswiki" + "@nw" + ]; + }; + + "OpenStreetMap" = { + urls = [ { template = "https://www.openstreetmap.org/search?query={searchTerms}"; } ]; + icon = getIcon "https://www.openstreetmap.org/assets/favicon-32x32-99b88fcadeef736889823c8a886b89d8cada9d4423a49a27de29bacc0a6bebd1.png" "sha256-dt4QVbQPdb4neS/fwH3yOWOSbEdkjMZtAYnIeCfr7qI="; + definedAliases = [ + "@openstreetmap" + "@osm" + "@maps" + ]; + }; + + "ProtonDB" = { + urls = [ { template = "https://www.protondb.com/search?q={searchTerms}"; } ]; + icon = getIcon "https://www.protondb.com/sites/protondb/images/favicon.ico" "sha256-oauOp0EASNjMcThfzYJ2TfbaOYHBPL8LOp+9lmp4pmc="; + definedAliases = [ "@protondb" ]; + }; + + "PyPI" = { + urls = [ { template = "https://pypi.org/search/?q={searchTerms}"; } ]; + icon = getIcon "https://pypi.org/static/images/logo-small.2a411bc6.svg" "sha256-+fcSfcNxAMLIFkp+gh52c48lQORoyhcegUIFtuq/zYs="; + definedAliases = [ "@pypi" ]; + }; + + "Python Docs" = { + urls = [ { template = "https://docs.python.org/3/search.html?q={searchTerms}"; } ]; + icon = getIcon "https://docs.python.org/3/_static/py.svg" "sha256-WGW+i8wK+IhZSQPqARL2yNkjxXJsQIHoyFYRDMcznO8="; + definedAliases = [ "@pydocs" ]; + }; + + "Rate Your Music" = { + urls = [ { template = "https://rateyourmusic.com/search?searchterm={searchTerms}"; } ]; + icon = getIcon "https://e.snmc.io/3.0/img/logo/sonemic-32.png" "sha256-JpTt1tjBkUvDMTGrG7Hg2EiE8PR3RL7McodeZk1EpZA="; + definedAliases = [ "@rym" ]; + }; + + "Rust Std" = { + urls = [ { template = "https://doc.rust-lang.org/std/?search={searchTerms}"; } ]; + icon = getIcon "https://www.rust-lang.org/static/images/favicon-32x32.png" "sha256-l2y4jpnODbua4dyLvXTMBlHVkoDPM9y00l6L61so7eA="; + definedAliases = [ + "@ruststd" + "@rust" + ]; + }; + + "SourceHut" = { + urls = [ { template = "https://sr.ht/projects?search={searchTerms}"; } ]; + icon = getIcon "https://sr.ht/static/logo.png" "sha256-NBzKZhqE9//zVJlOwYiwyW/jRFh8+nS2YvC3zMCQ1fU="; + definedAliases = [ + "@sourcehut" + "@srht" + ]; + }; + + "SteamDB" = { + urls = [ { template = "https://steamdb.info/search/?a=app&q={searchTerms}"; } ]; + icon = getIcon "https://steamdb.info/static/logos/32px.png" "sha256-IUBiB5JUSvyDa+m/wecmHB8s3Wfu0JK98bJ+ZRZ5ybQ="; + definedAliases = [ "@steamdb" ]; + }; + + "WolframAlpha" = { + urls = [ { template = "https://www.wolframalpha.com/input?i={searchTerms}"; } ]; + icon = getIcon "https://www.wolframalpha.com/_next/static/images/favicon_1zbE9hjk.ico" "sha256-S9k7AlBQiDElBCGopJ8xfBD6dIhGU+EBh8t1QYbP2S4="; + definedAliases = [ + "@wolframalpha" + "@wa" + ]; + }; + + "Yahoo" = { + urls = [ { template = "https://yahoo.com/search/?text={searchTerms}"; } ]; + icon = getIcon "https://yahoostatic.net/s3/web4static/_/v2/oxjfXL1EO-B5Arm80ZrL00p0al4.png" "sha256-gvYh4oCZEO7BL2QZ6QvQFlmFiP2L4SLJrxAsKFcG6G4="; + definedAliases = [ + "@yahoo" + "@ya" + ]; + }; + + "YouTube" = { + urls = [ { template = "https://yewtu.be/search?q={}"; } ]; + icon = getIcon "https://www.youtube.com/s/desktop/280a3f09/img/favicon.ico" "sha256-i7HQ+kOhdDbVndVG9vdMdtxEc13vdSLCLYAxFm24kR0="; + definedAliases = [ + "@youtube" + "@yt" + ]; + }; + }; + }; + + # NOTE This silently overrides all other bookmarks. + bookmarks = [ + { + name = "Bookmarks Toolbar"; + toolbar = true; + bookmarks = with config.nixfiles.modules; [ + (mkIf syncthing.enable { + name = "Syncthing"; + url = "http://${config.services.syncthing.guiAddress}"; + }) + (mkIf ipfs.enable { + name = "IPFS"; + url = "http://127.0.0.1:${toString ipfs.apiPort}/webui"; + }) + ]; + } + ]; + + # https://github.com/arkenfox/user.js/blob/master/user.js + arkenfox = { + enable = true; + "0000".enable = true; + "0100" = { + enable = true; + "0103"."browser.startup.homepage".value = "about:blank"; + }; + "0200".enable = true; + "0300".enable = true; + "0400" = { + enable = true; + "0401"."browser.safebrowsing.phishing.enabled".enable = true; + "0402"."browser.safebrowsing.downloads.enabled".enable = true; + "0404" = { + "browser.safebrowsing.downloads.remote.block_potentially_unwanted".enable = true; + "browser.safebrowsing.downloads.remote.block_uncommon".enable = true; + }; + "0405"."browser.safebrowsing.allowOverride".enable = true; + }; + "0600".enable = true; + "0700" = { + enable = true; + "0710"."network.trr.mode" = { + enable = true; + value = 5; + }; + }; + "0800" = { + enable = true; + "0830" = { + "browser.search.separatePrivateDefault" = { + enable = true; + value = false; + }; + "browser.search.separatePrivateDefault.ui.enabled" = { + enable = true; + value = false; + }; + }; + }; + "0900".enable = true; + "1000" = { + enable = true; + "1001".enable = false; + }; + "1200".enable = true; + "1600".enable = true; + "1700".enable = true; + "2000".enable = true; + "2400".enable = true; + "2600" = { + enable = true; + "2615"."permissions.default.shortcuts".enable = true; + }; + "2700".enable = true; + "2800" = { + enable = true; + "2811"."privacy.clearOnShutdown.history".value = false; + }; + "4500" = { + enable = true; + "4502".enable = false; + "4504".enable = false; + }; + "5000" = { + enable = true; + "5003"."signon.rememberSignons".enable = true; + "5017" = { + "extensions.formautofill.addresses.enabled".enable = true; + "extensions.formautofill.creditCards.enabled".enable = true; + }; + "5019"."browser.pagethumbnails.capturing_disabled".enable = true; + }; + "5500" = { + enable = true; + "5508"."media.eme.enabled".enable = true; + "5508"."browser.eme.ui.enabled".enable = true; + }; + "6000".enable = true; + "7000".enable = true; + "8000".enable = true; + "9000".enable = true; + }; + + settings = { + "app.update.auto" = false; + "browser.backspace_action" = 0; + "browser.disableResetPrompt" = true; + "browser.download.autohideButton" = false; + "browser.newtabpage.introShown" = true; + "browser.newtabpage.pinned" = ""; + "browser.onboarding.enabled" = false; + "browser.open.lastDir" = config.my.home; + "browser.protections_panel.infoMessage.seen" = true; + "browser.region.update.region" = "US"; + "browser.search.region" = "US"; + "browser.search.update" = false; + "browser.shell.checkDefaultBrowser" = false; + "browser.tabs.closeWindowWithLastTab" = true; + "browser.tabs.firefox-view" = false; + "browser.tabs.firefox-view-next" = false; + "browser.tabs.inTitlebar" = 0; + "browser.tabs.tabmanager.enabled" = false; + "browser.tabs.warnOnClose" = false; + "browser.tabs.warnOnCloseOtherTabs" = false; + "browser.tabs.warnOnOpen" = false; + "browser.toolbars.bookmarks.visibility" = "newtab"; + "browser.translations.enable" = false; + "browser.urlbar.decodeURLsOnCopy" = true; + "browser.urlbar.suggest.engines" = false; + "browser.warnOnQuitShortcut" = false; + "devtools.everOpened" = true; + "doh-rollout.home-region" = "US"; + "extensions.pocket.enabled" = false; + "extensions.update.autoUpdateDefault" = false; + "extensions.update.enabled" = false; + "full-screen-api.warning.delay" = 0; + "full-screen-api.warning.timeout" = 0; + "general.autoScroll" = true; + "general.smoothScroll" = true; + "identity.fxaccounts.enabled" = false; + "media.autoplay.blocking_policy" = 2; + "media.autoplay.default" = 5; + "media.hardwaremediakeys.enabled" = false; + "reader.parse-on-load.enabled" = false; + "toolkit.legacyUserProfileCustomizations.stylesheets" = true; + }; + }; + }; + }; + }; +} diff --git a/modules/firefox/userChrome.css b/modules/firefox/userChrome.css new file mode 100644 index 0000000..80d1f7a --- /dev/null +++ b/modules/firefox/userChrome.css @@ -0,0 +1,172 @@ +@-moz-document url(chrome://browser/content/browser.xhtml) +{ + /* + *** + * Tabbar + *** + */ + + /* + * Apply colours and fonts. + */ + .tabbrowser-tab { + color: var(--background-alt) !important; + font-family: var(--sans-serif-font-family) !important; + font-size: var(--sans-serif-font-size) !important; + } + .tabbrowser-tab[visuallyselected="true"] { + background: var(--background) !important; + color: var(--foreground) !important; + } + + /* + * Not sure why is this shit even exists... + */ + .titlebar-spacer { + display: none !important; + } + + /* + * Disable the Firefox View button. + */ + #firefox-view-button { + display: none !important; + } + + /* + * Disable borders and margins. + */ + #tabbrowser-tabs { + border-inline-start: 0 !important; + /* padding-inline-start: 0 !important; */ + margin-inline-start: 0 !important; + } + #tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs]) + > #tabbrowser-arrowscrollbox + > .tabbrowser-tab[first-visible-unpinned-tab] { + margin-inline-start: none !important; + } + .tabbrowser-tab::after, + .tabbrowser-tab::before { + border: none !important; + } + + /* + * Make tabs backgroundless. + */ + /* .tab-background, */ + /* .tab-line { */ + /* display: none !important; */ + /* } */ + + /* + * Stretch tabs to the max by default. + */ + .tabbrowser-tab[fadein]:not([pinned="true"]) { + max-width: 100% !important; + } + + /* + * Fix favicon location. + */ + .tab-icon-image { + margin-inline-end: 10px !important; + margin-top: 0px !important; + } + + /* + * "C-t" exists. + */ + #tabs-newtab-button, + #TabsToolbar #new-tab-button { + display: none !important; + } + + /* + * "C-w" exists. + */ + .tab-close-button { + display: none !important; + } + + /* + *** + * Navbar & urlbar. + *** + */ + + /* + * Remove padding between urlbar and side elements. + */ + #customizableui-special-spring1, + #customizableui-special-spring2 { + display: none !important; + } + + #urlbar { + background: var(--background) !important; + color: var(--foreground) !important; + font-family: var(--sans-serif-font-family) !important; + font-size: var(--sans-serif-font-size) !important; + border-color: transparent !important; + } + + /* #urlbar:not(:-moz-lwtheme):not([focused="true"]) > #urlbar-background, */ + /* #searchbar:not(:-moz-lwtheme):not(:focus-within) { */ + /* border: none !important; */ + /* } */ + + /* #urlbar *|*.textbox-input::-moz-placeholder { */ + /* color: transparent !important; */ + /* } */ + + /* .urlbar-icon:hover:not([disabled]), */ + /* .urlbar-icon-wrapper:hover:not([disabled]) { */ + /* background-color: var(--background-alt) !important; */ + /* } */ + + /* #urlbar-background { */ + /* background: transparent !important; */ + /* } */ + + /* .urlbarView-tags, */ + /* .urlbarView-url, */ + /* .urlbarView-title:not(:empty) ~ .urlbarView-action { */ + /* font-size: var(--sans-serif-font-size) !important; */ + /* } */ + + .urlbarView-row[label="Firefox Suggest"] { + margin-block-start: 0 !important; + } + .urlbarView-row[label="Firefox Suggest"]::before { + display: none !important; + } + + /* + *** + * Misc. + *** + */ + + /* + * Call indicator that some "designer" decided to make floating and impossible + * to hide. + */ + #webrtcIndicator { + display: none !important; + } + + /* + * Disable some context menu entries. + */ + #context-navigation { + display: none !important; + } + + /* + * Remove dumb websites that Mozilla is forced to include. + */ + .search-one-offs { + display: none !important; + } +} diff --git a/modules/firefox/userContent.css b/modules/firefox/userContent.css new file mode 100644 index 0000000..cf7b659 --- /dev/null +++ b/modules/firefox/userContent.css @@ -0,0 +1,399 @@ +@-moz-document media-document(all) { + body { + background-image: none !important; + background-color: var(--background) !important; + } +} + +@-moz-document regexp("about:(blank|home|newtab|privatebrowsing|welcome)") { + html, + body { + background: var(--background) !important; + } + + body { + display: none !important; + } +} + +@-moz-document regexp("https?://.*") +{ + iframe[src^="https://accounts.google.com/gsi/iframe"] + { + display: none !important; + } +} + +@-moz-document regexp("https?://(www)?yandex\.(com|ru)/search/.*") +{ + #search-result-aside, + .RelatedAbove { + display: none !important; + } +} + +@-moz-document regexp("https?://music\.yandex\.ru.*") +{ + .bar-below.bar-below_plus, + .footer, + .notify, + .teaser { + display: none !important; + } +} + +@-moz-document regexp("https?://(.*.)?gitlab(\..*)?\.(com|org).*") +{ + body { + font-family: var(--sans-serif-font-family) !important; + font-size: var(--sans-serif-font-size) !important; + } + + code { + font-family: var(--monospace-font-family) !important; + font-size: var(--monospace-font-size) !important; + } +} + +@-moz-document regexp("https?://(.*\.)?github.com.*") +{ + .color-fg-muted.f6.mt-4, /* GitHub profile guide. */ + .flex-order-1.flex-md-order-none, /* Follow button. */ + .js-user-status-item, + .protip, + .pt-3.mt-3.d-none.d-md-block, /* Profile achievements. */ + .user-status-circle-badge-container, + .user-status-container, + a[href^="/account/choose?action=upgrade"], + a[href^="/collections"], + a[href^="/contact/report-content"], + a[href^="/events"], + a[href^="/explore"], + a[href^="/github-copilot"], + a[href^="/organizations/enterprise"], + a[href^="/settings/enterprises"], + a[href^="/sponsors"], + a[href^="/topics"], + a[href^="/trending"], + a[href^="https://github.com/codespaces"], /* Absolute cringe... */ + button[data-testid="copilot-popover-button"], + details[id^="funding-links-modal"], + footer { + display: none !important; + } + + .application-main { + padding-bottom: 20px !important; + } + + .blob-num, + .blob-code-inner { + font-family: var(--monospace-font-family) !important; + font-size: var(--monospace-font-size) !important; + } +} + +@-moz-document regexp("https?://github.com/?") +{ + .application-main { + display: none !important; + } +} + +@-moz-document regexp("https?://.*(stack(exchange|overflow)|askubuntu|superuser|serverfault)\.com/questions/.*") +{ + html, + body { + --ff-mono: var(--monospace-font-family) !important; + --ff-sans: var(--sans-serif-font-family) !important; + --ff-serif: var(--serif-font-family) !important; + } + + #announcement-banner, + #footer, + #left-sidebar, + #noscript-warning, + #notify-container, + #post-form, + #sidebar, + .ai-start, + .bottom-notice, + .d-flex.g4, + .d-flex.s-btn-group, + .js-add-link.comments-link, + .js-consent-banner, + .js-dismissable-hero, + .js-post-issue, + .js-saves-btn, + .js-show-link.comments-link, + .js-vote-down-btn, + .js-vote-up-btn, + .post-taglist, + .s-notice, + .s-topbar, + .site-header, + a.ws-nowrap { + display: none !important; + } + + #mainbar { + width: 100% !important; + } + + #content { + margin-top: -50px !important; + border-width: 0 0 0 0 !important; + } +} + +@-moz-document regexp("https?://kubernetes\.io/docs/.*") +{ + .announcement, + .announcement-main, + .d-none { + display: none !important; + } +} + +@-moz-document regexp("https?://min\.io/docs/.*") +{ + #cookie { + display: none !important; + } +} + +@-moz-document regexp("https?://werf\.io/documentation/.*") +{ + .guides-banner { + display: none !important; + } +} + +@-moz-document regexp("https?://grafana\.com/docs/.*") +{ + .ads__content, + .scroll, + .sticky-footer { + display: none !important; + } +} + +@-moz-document regexp("https?://habr\.com/(ru|en)/(articles|company/.*/news|news|companies|blog|post)/.*") +{ + .Vue-Toastification__container, + .tm-article-labels, + .tm-article-presenter__banner, + .tm-article-presenter__footer, + .tm-article-presenter__meta, + .tm-article-snippet__labels, + .tm-base-layout__header, + .tm-block.tm-block_spacing-bottom, + .tm-comment-footer, + .tm-comment__header, + .tm-editoral-subscription, + .tm-footer, + .tm-footer-menu, + .tm-header, + .tm-notice, + .tm-page__header, + .tm-page__sidebar, + .tm-placeholder-inset, + .tm-placeholder-promo, + .tm-user-info, + vue-portal-target { + display: none !important; + } + + * { + transition: none !important; + } + + html, + body { + font-family: var(--sans-serif-font-family) !important; + font-size: var(--sans-serif-font-size) !important; + } + + #app { + height: auto !important; + } + + .tm-article-presenter__footer, + .tm-page__main_has-sidebar { + margin-left: auto !important; + margin-right: auto !important; + max-width: 100% !important; + } + + .tm-page { + padding: 0 !important; + } + + .tm-comment__buttons { + margin: 0 !important; + } + + html, + body { + font-family: var(--sans-serif-font-family) !important; + font-size: var(--sans-serif-font-size) !important; + } + + code { + font-family: var(--monospace-font-family) !important; + font-size: var(--monospace-font-size) !important; + } +} + +@-moz-document regexp("https?://jisho\.org.*") +{ + header, + footer { + display: none !important; + } +} + +@-moz-document regexp("https?://.*\.fandom\.com/wiki/.*") +{ + #WikiaBar, + #highlight__main-container, + .global-footer, + .global-navigation, + .global-registration-buttons { + display: none !important; + } + + .main-container, + body { + background-image: none !important; + backgrounde: none !important; + } + + .main-container { + margin-left: none !important; + width: auto !important; + } + + .fandom-sticky-header { + left: 0px !important; + } +} + +@-moz-document regexp("https?:\/\/gog\.com.*") { + .galaxy-section-wrapper, + footer { + display: none !important; + } +} + +@-moz-document regexp("https?://steamdb\.info.*") +{ + #steamdb-extension-protip { + display: none !important; + } +} + +@-moz-document regexp("https?://(.*\.)?hh\.ru.*") +{ + .HH-Supernova-Footer, + .index-dashboard-applicant__banners, + .notification-manager, + .resume-sidebar-background, + .supernova-overlay { + display: none !important; + } +} + +@-moz-document regexp("https?://www\.songsterr\.com.*") +{ + #favorite, + #fullscreen, + #logo, + #menu-favorites, + #menu-help, + #menu-plus, + #menu-signin, + #menu-submit, + #promo, + #revisions, + #showroom, + #showroom_sidebar, + #text-showroom, + footer { + display: none !important; + } +} + +@-moz-document regexp("https?://developer\.mozilla\.org.*") +{ + #nav-footer, + .main-document-header-container.top-navigation, + .mdn-cta-container, + .top-banner.fallback { + display: none !important; + } + + .sidebar { + --offset: default !important; + } + + html, + body { + font-family: var(--sans-serif-font-family) !important; + font-size: var(--sans-serif-font-size) !important; + } +} + +@-moz-document regexp("https?://(.*\.)?wikipedia\.org/wiki/.*") +{ + #footer, + #mp-topbanner, + #siteNotice, + #siteSub, + #wmde-banner-app, + .mw-footer-container, + .mw-header, + .vector-page-toolbar { + display: none !important; + } + + html, + body { + font-family: var(--sans-serif-font-family) !important; + font-size: var(--sans-serif-font-size) !important; + } + + .k-player, + body.mediawiki, + #dialogEngineContainer #dialogEngineDialog { + background: inherit !important; + } +} + +@-moz-document regexp("https?://open-vsx\.org.*") +{ + MuiCollapse-container, + cc-window.cc-banner, + footer { + display: none !important; + } +} + +@-moz-document regexp("https?://duckduckgo\.com.*") +{ + .badge-link, /* Annoying DuckDuckGo extension ads. */ + .footer { + display: none !important; + } +} + +@-moz-document regexp("https?://ecosia\.org.*") +{ + .cookie-wrapper, + .main-header__install-cta, + .meta-results, + .notifications, + .personal-counter { + display: none !important; + } +} -- cgit 1.4.1