summaryrefslogtreecommitdiff
path: root/modules/firefox
diff options
context:
space:
mode:
authorAzat Bahawi <azat@bahawi.net>2024-04-21 02:15:42 +0300
committerAzat Bahawi <azat@bahawi.net>2024-04-21 02:15:42 +0300
commite6ed60548397627bf10f561f9438201dbba0a36e (patch)
treef9a84c5957d2cc4fcd148065ee9365a0c851ae1c /modules/firefox
parent9ac64328603d44bd272175942d3ea3eaadcabd04 (diff)
2024-04-21
Diffstat (limited to 'modules/firefox')
-rw-r--r--modules/firefox/addons.json44
-rw-r--r--modules/firefox/addons.nix315
-rw-r--r--modules/firefox/default.nix575
-rw-r--r--modules/firefox/userChrome.css172
-rw-r--r--modules/firefox/userContent.css399
5 files changed, 1505 insertions, 0 deletions
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 = [
+ "<all_urls>"
+ "*://*/*"
+ "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"
+ "<all_urls>"
+ ];
+ 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"
+ "<all_urls>"
+ ];
+ 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://*/*"
+ "<all_urls>"
+ "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"
+ "<all_urls>"
+ ];
+ 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 = [
+ "<all_urls>"
+ "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"
+ "<all_urls>"
+ "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"
+ "<all_urls>"
+ "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"
+ "<all_urls>"
+ "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;
+ }
+}