mirror of
https://github.com/anotherhadi/nixy.git
synced 2026-07-06 16:12:33 +02:00
from qutebrowser to helium..
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
This commit is contained in:
Generated
+66
-31
@@ -565,6 +565,24 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"helium-browser": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs_5"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1779362613,
|
||||||
|
"narHash": "sha256-gYJQTjBYuYOB/yii5bd9xGkxph+eL+mq4kj4F8PC/aA=",
|
||||||
|
"owner": "oxcl",
|
||||||
|
"repo": "nix-flake-helium-browser",
|
||||||
|
"rev": "c1db1cc295118e95923a95fbcd2346a619fbe159",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "oxcl",
|
||||||
|
"repo": "nix-flake-helium-browser",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"home-manager": {
|
"home-manager": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
@@ -654,7 +672,7 @@
|
|||||||
"hyprutils": "hyprutils",
|
"hyprutils": "hyprutils",
|
||||||
"hyprwayland-scanner": "hyprwayland-scanner",
|
"hyprwayland-scanner": "hyprwayland-scanner",
|
||||||
"hyprwire": "hyprwire",
|
"hyprwire": "hyprwire",
|
||||||
"nixpkgs": "nixpkgs_5",
|
"nixpkgs": "nixpkgs_6",
|
||||||
"pre-commit-hooks": "pre-commit-hooks",
|
"pre-commit-hooks": "pre-commit-hooks",
|
||||||
"systems": "systems_4",
|
"systems": "systems_4",
|
||||||
"xdph": "xdph"
|
"xdph": "xdph"
|
||||||
@@ -909,7 +927,7 @@
|
|||||||
"iknowyou": {
|
"iknowyou": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"bun2nix": "bun2nix_4",
|
"bun2nix": "bun2nix_4",
|
||||||
"nixpkgs": "nixpkgs_6",
|
"nixpkgs": "nixpkgs_7",
|
||||||
"nur-osint": "nur-osint"
|
"nur-osint": "nur-osint"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
@@ -1030,7 +1048,7 @@
|
|||||||
},
|
},
|
||||||
"nixarr": {
|
"nixarr": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": "nixpkgs_7",
|
"nixpkgs": "nixpkgs_8",
|
||||||
"treefmt-nix": "treefmt-nix_5",
|
"treefmt-nix": "treefmt-nix_5",
|
||||||
"vpnconfinement": "vpnconfinement",
|
"vpnconfinement": "vpnconfinement",
|
||||||
"website-builder": "website-builder"
|
"website-builder": "website-builder"
|
||||||
@@ -1143,6 +1161,22 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs_10": {
|
"nixpkgs_10": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1774386573,
|
||||||
|
"narHash": "sha256-4hAV26quOxdC6iyG7kYaZcM3VOskcPUrdCQd/nx8obc=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "46db2e09e1d3f113a13c0d7b81e2f221c63b8ce9",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_11": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1775888245,
|
"lastModified": 1775888245,
|
||||||
"narHash": "sha256-nwASzrRDD1JBEu/o8ekKYEXm/oJW6EMCzCRdrwcLe90=",
|
"narHash": "sha256-nwASzrRDD1JBEu/o8ekKYEXm/oJW6EMCzCRdrwcLe90=",
|
||||||
@@ -1158,7 +1192,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs_11": {
|
"nixpkgs_12": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1777954456,
|
"lastModified": 1777954456,
|
||||||
"narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=",
|
"narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=",
|
||||||
@@ -1174,7 +1208,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs_12": {
|
"nixpkgs_13": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1777268161,
|
"lastModified": 1777268161,
|
||||||
"narHash": "sha256-bxrdOn8SCOv8tN4JbTF/TXq7kjo9ag4M+C8yzzIRYbE=",
|
"narHash": "sha256-bxrdOn8SCOv8tN4JbTF/TXq7kjo9ag4M+C8yzzIRYbE=",
|
||||||
@@ -1190,7 +1224,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs_13": {
|
"nixpkgs_14": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1777268161,
|
"lastModified": 1777268161,
|
||||||
"narHash": "sha256-bxrdOn8SCOv8tN4JbTF/TXq7kjo9ag4M+C8yzzIRYbE=",
|
"narHash": "sha256-bxrdOn8SCOv8tN4JbTF/TXq7kjo9ag4M+C8yzzIRYbE=",
|
||||||
@@ -1255,6 +1289,22 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs_5": {
|
"nixpkgs_5": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1777578337,
|
||||||
|
"narHash": "sha256-Ad49moKWeXtKBJNy2ebiTQUEgdLyvGmTeykAQ9xM+Z4=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "15f4ee454b1dce334612fa6843b3e05cf546efab",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_6": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1777954456,
|
"lastModified": 1777954456,
|
||||||
"narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=",
|
"narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=",
|
||||||
@@ -1270,7 +1320,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs_6": {
|
"nixpkgs_7": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1775710090,
|
"lastModified": 1775710090,
|
||||||
"narHash": "sha256-ar3rofg+awPB8QXDaFJhJ2jJhu+KqN/PRCXeyuXR76E=",
|
"narHash": "sha256-ar3rofg+awPB8QXDaFJhJ2jJhu+KqN/PRCXeyuXR76E=",
|
||||||
@@ -1286,7 +1336,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs_7": {
|
"nixpkgs_8": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1775595990,
|
"lastModified": 1775595990,
|
||||||
"narHash": "sha256-OEf7YqhF9IjJFYZJyuhAypgU+VsRB5lD4DuiMws5Ltc=",
|
"narHash": "sha256-OEf7YqhF9IjJFYZJyuhAypgU+VsRB5lD4DuiMws5Ltc=",
|
||||||
@@ -1302,7 +1352,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs_8": {
|
"nixpkgs_9": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1777954456,
|
"lastModified": 1777954456,
|
||||||
"narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=",
|
"narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=",
|
||||||
@@ -1318,22 +1368,6 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs_9": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1774386573,
|
|
||||||
"narHash": "sha256-4hAV26quOxdC6iyG7kYaZcM3VOskcPUrdCQd/nx8obc=",
|
|
||||||
"owner": "nixos",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"rev": "46db2e09e1d3f113a13c0d7b81e2f221c63b8ce9",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nixos",
|
|
||||||
"ref": "nixos-unstable",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nur": {
|
"nur": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-parts": [
|
"flake-parts": [
|
||||||
@@ -1386,7 +1420,7 @@
|
|||||||
"flake-parts": "flake-parts_5",
|
"flake-parts": "flake-parts_5",
|
||||||
"mnw": "mnw",
|
"mnw": "mnw",
|
||||||
"ndg": "ndg",
|
"ndg": "ndg",
|
||||||
"nixpkgs": "nixpkgs_9",
|
"nixpkgs": "nixpkgs_10",
|
||||||
"systems": "systems_6"
|
"systems": "systems_6"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
@@ -1477,13 +1511,14 @@
|
|||||||
"caelestia-cli": "caelestia-cli",
|
"caelestia-cli": "caelestia-cli",
|
||||||
"caelestia-shell": "caelestia-shell_2",
|
"caelestia-shell": "caelestia-shell_2",
|
||||||
"default-creds": "default-creds",
|
"default-creds": "default-creds",
|
||||||
|
"helium-browser": "helium-browser",
|
||||||
"home-manager": "home-manager",
|
"home-manager": "home-manager",
|
||||||
"hyprland": "hyprland",
|
"hyprland": "hyprland",
|
||||||
"iknowyou": "iknowyou",
|
"iknowyou": "iknowyou",
|
||||||
"nix-index-database": "nix-index-database",
|
"nix-index-database": "nix-index-database",
|
||||||
"nixarr": "nixarr",
|
"nixarr": "nixarr",
|
||||||
"nixos-hardware": "nixos-hardware",
|
"nixos-hardware": "nixos-hardware",
|
||||||
"nixpkgs": "nixpkgs_8",
|
"nixpkgs": "nixpkgs_9",
|
||||||
"nixpkgs-stable": "nixpkgs-stable",
|
"nixpkgs-stable": "nixpkgs-stable",
|
||||||
"nvf": "nvf",
|
"nvf": "nvf",
|
||||||
"sops-nix": "sops-nix",
|
"sops-nix": "sops-nix",
|
||||||
@@ -1495,7 +1530,7 @@
|
|||||||
},
|
},
|
||||||
"sops-nix": {
|
"sops-nix": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": "nixpkgs_10"
|
"nixpkgs": "nixpkgs_11"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1777944972,
|
"lastModified": 1777944972,
|
||||||
@@ -1534,7 +1569,7 @@
|
|||||||
},
|
},
|
||||||
"spilltea": {
|
"spilltea": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": "nixpkgs_11"
|
"nixpkgs": "nixpkgs_12"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1778703986,
|
"lastModified": 1778703986,
|
||||||
@@ -1559,7 +1594,7 @@
|
|||||||
"firefox-gnome-theme": "firefox-gnome-theme",
|
"firefox-gnome-theme": "firefox-gnome-theme",
|
||||||
"flake-parts": "flake-parts_6",
|
"flake-parts": "flake-parts_6",
|
||||||
"gnome-shell": "gnome-shell",
|
"gnome-shell": "gnome-shell",
|
||||||
"nixpkgs": "nixpkgs_12",
|
"nixpkgs": "nixpkgs_13",
|
||||||
"nur": "nur",
|
"nur": "nur",
|
||||||
"systems": "systems_8",
|
"systems": "systems_8",
|
||||||
"tinted-kitty": "tinted-kitty",
|
"tinted-kitty": "tinted-kitty",
|
||||||
@@ -1875,7 +1910,7 @@
|
|||||||
},
|
},
|
||||||
"usbguard-tui": {
|
"usbguard-tui": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": "nixpkgs_13"
|
"nixpkgs": "nixpkgs_14"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1778071322,
|
"lastModified": 1778071322,
|
||||||
|
|||||||
@@ -45,6 +45,7 @@
|
|||||||
awesome-wallpapers.url = "github:anotherhadi/awesome-wallpapers";
|
awesome-wallpapers.url = "github:anotherhadi/awesome-wallpapers";
|
||||||
iknowyou.url = "github:anotherhadi/iknowyou";
|
iknowyou.url = "github:anotherhadi/iknowyou";
|
||||||
spilltea.url = "github:anotherhadi/spilltea";
|
spilltea.url = "github:anotherhadi/spilltea";
|
||||||
|
helium-browser.url = "github:oxcl/nix-flake-helium-browser";
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = inputs @ {
|
outputs = inputs @ {
|
||||||
|
|||||||
@@ -1,87 +0,0 @@
|
|||||||
{
|
|
||||||
programs.brave = {
|
|
||||||
enable = true;
|
|
||||||
commandLineArgs = [
|
|
||||||
# Wayland Native
|
|
||||||
"--enable-features=UseOzonePlatform"
|
|
||||||
"--ozone-platform=wayland"
|
|
||||||
|
|
||||||
# Hardware Acceleration (NVIDIA optimized)
|
|
||||||
"--enable-accelerated-video-decode"
|
|
||||||
"--enable-gpu-rasterization"
|
|
||||||
"--enable-zero-copy"
|
|
||||||
"--ignore-gpu-blocklist"
|
|
||||||
|
|
||||||
# Performance
|
|
||||||
"--enable-features=VaapiVideoDecoder"
|
|
||||||
"--enable-features=VaapiVideoEncoder"
|
|
||||||
"--enable-features=CanvasOopRasterization"
|
|
||||||
"--disable-features=UseChromeOSDirectVideoDecoder"
|
|
||||||
|
|
||||||
# Privacy & Security
|
|
||||||
"--disable-features=MediaRouter" # Disable Chromecast
|
|
||||||
"--disable-features=OptimizationHints" # No Google suggestions
|
|
||||||
"--disable-features=AutofillSavePaymentMethods"
|
|
||||||
"--disable-background-networking" # No telemetry
|
|
||||||
"--disable-sync" # Manual sync control
|
|
||||||
|
|
||||||
# Wayland-specific fixes
|
|
||||||
"--disable-features=WaylandWpColorManagerV1" # Color management fix
|
|
||||||
|
|
||||||
# UI/UX
|
|
||||||
"--force-dark-mode" # Match Stylix theme
|
|
||||||
"--enable-features=WebUIDarkMode"
|
|
||||||
"--no-default-browser-check"
|
|
||||||
];
|
|
||||||
extensions = let
|
|
||||||
ids = [
|
|
||||||
];
|
|
||||||
in
|
|
||||||
map (id: {inherit id;}) ids;
|
|
||||||
};
|
|
||||||
|
|
||||||
xdg.configFile."BraveSoftware/Brave-Browser/Policies/managed/policy.json".text = builtins.toJSON {
|
|
||||||
BraveShieldsAdControl = 2;
|
|
||||||
BraveShieldsTrackersBlocked = 1;
|
|
||||||
BraveShieldsHttpsEverywhere = 1;
|
|
||||||
BraveRewardsDisabled = 1;
|
|
||||||
BraveWalletDisabled = 1;
|
|
||||||
BraveVPNDisabled = 1;
|
|
||||||
BraveAIChatEnabled = 0;
|
|
||||||
PasswordManagerEnabled = 0;
|
|
||||||
BravePlaylistEnabled = 0;
|
|
||||||
BraveWebDiscoveryEnabled = 0;
|
|
||||||
BraveStatsPingEnabled = 0;
|
|
||||||
DnsOverHttpsMode = "automatic";
|
|
||||||
BraveDarkMode = 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
xdg.desktopEntries = {
|
|
||||||
brave-incognito = {
|
|
||||||
name = "Brave (Private window)";
|
|
||||||
genericName = "Navigateur Web";
|
|
||||||
exec = "brave --incognito";
|
|
||||||
icon = "brave-browser";
|
|
||||||
terminal = false;
|
|
||||||
categories = [
|
|
||||||
"Network"
|
|
||||||
"WebBrowser"
|
|
||||||
];
|
|
||||||
mimeType = [
|
|
||||||
"text/html"
|
|
||||||
"text/xml"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
brave-tor = {
|
|
||||||
name = "Brave (Private window w/Tor)";
|
|
||||||
genericName = "Navigateur Web";
|
|
||||||
exec = "brave --tor";
|
|
||||||
icon = "brave-browser";
|
|
||||||
terminal = false;
|
|
||||||
categories = [
|
|
||||||
"Network"
|
|
||||||
"WebBrowser"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,459 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
bookmarkList =
|
||||||
|
(import ./general.nix)
|
||||||
|
++ (import ./tools.nix)
|
||||||
|
++ (import ./entertainment.nix)
|
||||||
|
++ (import ./infosec.nix)
|
||||||
|
++ (import ./other.nix)
|
||||||
|
++ (import ./jack.nix);
|
||||||
|
|
||||||
|
c = config.lib.stylix.colors;
|
||||||
|
|
||||||
|
stripProtocol = url: lib.removePrefix "https://" (lib.removePrefix "http://" url);
|
||||||
|
stripDomain = url: builtins.head (lib.splitString "/" (stripProtocol url));
|
||||||
|
|
||||||
|
mkCard = item: let
|
||||||
|
domain = stripDomain item.url;
|
||||||
|
initial = builtins.substring 0 1 item.name;
|
||||||
|
in ''
|
||||||
|
<a href="${item.url}" class="card">
|
||||||
|
<div class="favicon-wrapper">
|
||||||
|
<img class="favicon" src="https://icons.duckduckgo.com/ip3/${domain}.ico" alt="" aria-hidden="true" loading="lazy" onerror="this.style.display='none';this.nextElementSibling.style.display='flex'">
|
||||||
|
<span class="favicon-fallback" style="display:none">${initial}</span>
|
||||||
|
</div>
|
||||||
|
<div class="card-info">
|
||||||
|
<span class="card-name">${item.name}</span>
|
||||||
|
<span class="card-url">${stripProtocol item.url}</span>
|
||||||
|
</div>
|
||||||
|
</a>'';
|
||||||
|
|
||||||
|
mkFolderContent = items: let
|
||||||
|
step = acc: item:
|
||||||
|
if item ? url
|
||||||
|
then acc // {pending = acc.pending ++ [item];}
|
||||||
|
else {
|
||||||
|
chunks =
|
||||||
|
acc.chunks
|
||||||
|
++ lib.optional (acc.pending != []) {
|
||||||
|
isCards = true;
|
||||||
|
items = acc.pending;
|
||||||
|
}
|
||||||
|
++ [
|
||||||
|
{
|
||||||
|
isCards = false;
|
||||||
|
folder = item;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
pending = [];
|
||||||
|
};
|
||||||
|
result =
|
||||||
|
lib.foldl' step {
|
||||||
|
chunks = [];
|
||||||
|
pending = [];
|
||||||
|
}
|
||||||
|
items;
|
||||||
|
chunks =
|
||||||
|
result.chunks
|
||||||
|
++ lib.optional (result.pending != []) {
|
||||||
|
isCards = true;
|
||||||
|
items = result.pending;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.concatMapStrings (
|
||||||
|
chunk:
|
||||||
|
if chunk.isCards
|
||||||
|
then ''
|
||||||
|
<div class="cards">
|
||||||
|
${lib.concatMapStrings mkCard chunk.items}
|
||||||
|
</div>''
|
||||||
|
else mkFolder chunk.folder
|
||||||
|
)
|
||||||
|
chunks;
|
||||||
|
|
||||||
|
mkFolder = folder: let
|
||||||
|
iconHtml =
|
||||||
|
if folder ? icon
|
||||||
|
then ''<span class="material-symbols-outlined folder-icon" aria-hidden="true">${folder.icon}</span>''
|
||||||
|
else "";
|
||||||
|
in ''
|
||||||
|
<details class="folder-section" open>
|
||||||
|
<summary class="folder-title">
|
||||||
|
${iconHtml}<span class="folder-name">${folder.name}</span>
|
||||||
|
<svg class="chevron" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
|
||||||
|
</summary>
|
||||||
|
<div class="folder-content">
|
||||||
|
${mkFolderContent folder.bookmarks}
|
||||||
|
</div>
|
||||||
|
</details>'';
|
||||||
|
|
||||||
|
grouped = let
|
||||||
|
step = acc: item:
|
||||||
|
if item ? url
|
||||||
|
then acc // {pending = acc.pending ++ [item];}
|
||||||
|
else {
|
||||||
|
groups =
|
||||||
|
acc.groups
|
||||||
|
++ lib.optional (acc.pending != []) {
|
||||||
|
isRoot = true;
|
||||||
|
items = acc.pending;
|
||||||
|
}
|
||||||
|
++ [
|
||||||
|
{
|
||||||
|
isRoot = false;
|
||||||
|
inherit item;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
pending = [];
|
||||||
|
};
|
||||||
|
result =
|
||||||
|
lib.foldl' step {
|
||||||
|
groups = [];
|
||||||
|
pending = [];
|
||||||
|
}
|
||||||
|
bookmarkList;
|
||||||
|
in
|
||||||
|
result.groups
|
||||||
|
++ lib.optional (result.pending != []) {
|
||||||
|
isRoot = true;
|
||||||
|
items = result.pending;
|
||||||
|
};
|
||||||
|
|
||||||
|
mkSection = group:
|
||||||
|
if group.isRoot
|
||||||
|
then ''
|
||||||
|
<div class="root-section">
|
||||||
|
<div class="cards">
|
||||||
|
${lib.concatMapStrings mkCard group.items}
|
||||||
|
</div>
|
||||||
|
</div>''
|
||||||
|
else mkFolder group.item;
|
||||||
|
in {
|
||||||
|
home.file.".local/share/helium-startpage/index.html".text = ''
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Bookmarks</title>
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20,300,0,0">
|
||||||
|
<style>
|
||||||
|
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: #${c.base00};
|
||||||
|
color: #${c.base05};
|
||||||
|
font-family: 'Source Sans Pro', sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
min-height: 100vh;
|
||||||
|
padding: 2.5rem 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
max-width: 1100px;
|
||||||
|
margin: 0 auto 2rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-title {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #${c.base0D};
|
||||||
|
letter-spacing: -0.01em;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-bar {
|
||||||
|
flex: 1;
|
||||||
|
background-color: #${c.base01};
|
||||||
|
border: 1px solid #${c.base02};
|
||||||
|
border-radius: 8px;
|
||||||
|
color: #${c.base05};
|
||||||
|
font-family: 'Source Sans Pro', sans-serif;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
padding: 0.5rem 0.9rem;
|
||||||
|
outline: none;
|
||||||
|
transition: border-color 0.15s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-bar::placeholder { color: #${c.base03}; }
|
||||||
|
.search-bar:focus { border-color: #${c.base0D}; }
|
||||||
|
|
||||||
|
.collapse-btn {
|
||||||
|
flex-shrink: 0;
|
||||||
|
background: none;
|
||||||
|
border: 1px solid #${c.base02};
|
||||||
|
border-radius: 8px;
|
||||||
|
color: #${c.base03};
|
||||||
|
cursor: pointer;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 0.47rem;
|
||||||
|
transition: color 0.15s ease, border-color 0.15s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.collapse-btn:hover {
|
||||||
|
color: #${c.base0D};
|
||||||
|
border-color: #${c.base0D};
|
||||||
|
}
|
||||||
|
|
||||||
|
.collapse-btn svg { width: 16px; height: 16px; }
|
||||||
|
|
||||||
|
.bookmarks-container {
|
||||||
|
max-width: 1100px;
|
||||||
|
margin: 0 auto;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root-section { margin-bottom: 1rem; }
|
||||||
|
|
||||||
|
details.folder-section { border-radius: 8px; }
|
||||||
|
|
||||||
|
details.folder-section > summary {
|
||||||
|
list-style: none;
|
||||||
|
cursor: pointer;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
padding: 0.45rem 0.5rem;
|
||||||
|
border-radius: 8px;
|
||||||
|
user-select: none;
|
||||||
|
transition: background-color 0.12s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
details.folder-section > summary::-webkit-details-marker { display: none; }
|
||||||
|
|
||||||
|
details.folder-section > summary:hover {
|
||||||
|
background-color: #${c.base01};
|
||||||
|
color: #${c.base0D};
|
||||||
|
}
|
||||||
|
|
||||||
|
details.folder-section > summary:hover .folder-name { color: #${c.base0D}; }
|
||||||
|
details.folder-section > summary:hover .folder-icon { color: #${c.base0D}; }
|
||||||
|
|
||||||
|
.folder-icon {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1;
|
||||||
|
flex-shrink: 0;
|
||||||
|
color: #${c.base04};
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.folder-name {
|
||||||
|
font-size: 0.72rem;
|
||||||
|
font-weight: 700;
|
||||||
|
letter-spacing: 0.12em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: #${c.base03};
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chevron {
|
||||||
|
width: 13px;
|
||||||
|
height: 13px;
|
||||||
|
color: #${c.base03};
|
||||||
|
transition: transform 0.2s ease;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
details[open] > summary > .chevron { transform: rotate(180deg); }
|
||||||
|
|
||||||
|
.folder-content {
|
||||||
|
padding: 0.4rem 0 0.5rem 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.folder-content > details.folder-section > summary { padding-left: 1.2rem; }
|
||||||
|
.folder-content > details.folder-section > .folder-content { padding-left: 1rem; }
|
||||||
|
|
||||||
|
.cards {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
|
||||||
|
gap: 0.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.7rem;
|
||||||
|
padding: 0.6rem 0.8rem;
|
||||||
|
background-color: #${c.base01};
|
||||||
|
border: 1px solid #${c.base02};
|
||||||
|
border-radius: 10px;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: background-color 0.12s ease, border-color 0.12s ease;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card:hover {
|
||||||
|
background-color: #${c.base02};
|
||||||
|
border-color: #${c.base0D};
|
||||||
|
}
|
||||||
|
|
||||||
|
.favicon-wrapper { position: relative; width: 18px; height: 18px; flex-shrink: 0; }
|
||||||
|
|
||||||
|
.favicon {
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
object-fit: contain;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.favicon-fallback {
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background-color: #${c.base02};
|
||||||
|
border-radius: 4px;
|
||||||
|
color: #${c.base04};
|
||||||
|
font-size: 10px;
|
||||||
|
font-weight: 700;
|
||||||
|
text-transform: uppercase;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-info {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.05rem;
|
||||||
|
overflow: hidden;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-name {
|
||||||
|
color: #${c.base05};
|
||||||
|
font-size: 0.86rem;
|
||||||
|
font-weight: 500;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
transition: color 0.12s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card:hover .card-name { color: #${c.base0D}; }
|
||||||
|
|
||||||
|
.card-url {
|
||||||
|
color: #${c.base03};
|
||||||
|
font-family: 'Maple Mono NF', monospace;
|
||||||
|
font-size: 0.7rem;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-results {
|
||||||
|
color: #${c.base03};
|
||||||
|
font-size: 0.9rem;
|
||||||
|
padding: 0.5rem 0.2rem;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="header">
|
||||||
|
<h1 class="page-title">Bookmarks</h1>
|
||||||
|
<input id="search" class="search-bar" type="text" placeholder="Search…" autocomplete="off" spellcheck="false">
|
||||||
|
<button id="collapse-btn" class="collapse-btn" title="Collapse all folders" aria-label="Collapse all folders">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<polyline points="4 14 10 14 10 20"/><polyline points="20 10 14 10 14 4"/><line x1="10" y1="14" x2="3" y2="21"/><line x1="21" y1="3" x2="14" y2="10"/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="bookmarks-container">
|
||||||
|
<p id="no-results" class="no-results">No results</p>
|
||||||
|
${lib.concatMapStrings mkSection grouped}
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
window.addEventListener('DOMContentLoaded', function () {
|
||||||
|
const input = document.getElementById('search');
|
||||||
|
const noResults = document.getElementById('no-results');
|
||||||
|
const collapseBtn = document.getElementById('collapse-btn');
|
||||||
|
|
||||||
|
input.focus();
|
||||||
|
|
||||||
|
collapseBtn.addEventListener('click', function () {
|
||||||
|
document.querySelectorAll('details.folder-section').forEach(function (d) {
|
||||||
|
d.open = false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
input.addEventListener('input', function () {
|
||||||
|
const query = this.value.toLowerCase().trim();
|
||||||
|
let anyVisible = false;
|
||||||
|
|
||||||
|
if (query) {
|
||||||
|
document.querySelectorAll('details.folder-section').forEach(function (d) {
|
||||||
|
d.open = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
document.querySelectorAll('.folder-section, .root-section').forEach(function (section) {
|
||||||
|
let sectionVisible = false;
|
||||||
|
section.querySelectorAll('.card').forEach(function (card) {
|
||||||
|
const name = card.querySelector('.card-name').textContent.toLowerCase();
|
||||||
|
const url = card.querySelector('.card-url').textContent.toLowerCase();
|
||||||
|
const match = !query || name.includes(query) || url.includes(query);
|
||||||
|
card.style.display = match ? ''' : 'none';
|
||||||
|
if (match) { sectionVisible = true; anyVisible = true; }
|
||||||
|
});
|
||||||
|
section.style.display = sectionVisible ? ''' : 'none';
|
||||||
|
});
|
||||||
|
|
||||||
|
noResults.style.display = anyVisible || !query ? 'none' : 'block';
|
||||||
|
});
|
||||||
|
|
||||||
|
input.addEventListener('keydown', function (e) {
|
||||||
|
if (e.key === 'Enter') {
|
||||||
|
const val = this.value.trim();
|
||||||
|
const isUrl = /^https?:\/\//i.test(val) || /^[a-zA-Z0-9-]+(\.[a-zA-Z]{2,})(\/.*)?$/.test(val);
|
||||||
|
if (isUrl) {
|
||||||
|
location.href = /^https?:\/\//i.test(val) ? val : 'https://' + val;
|
||||||
|
} else {
|
||||||
|
const first = document.querySelector('.card:not([style*="none"])');
|
||||||
|
if (first) {
|
||||||
|
location.href = first.href;
|
||||||
|
} else {
|
||||||
|
const q = encodeURIComponent(val);
|
||||||
|
if (q) location.href = 'https://duckduckgo.com/?q=' + q;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (e.key === 'Escape') {
|
||||||
|
this.value = ''';
|
||||||
|
this.dispatchEvent(new Event('input'));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
'';
|
||||||
|
|
||||||
|
systemd.user.services.helium-startpage = {
|
||||||
|
Unit = {
|
||||||
|
Description = "Helium startpage HTTP server";
|
||||||
|
After = ["network.target"];
|
||||||
|
};
|
||||||
|
Service = {
|
||||||
|
Type = "simple";
|
||||||
|
ExecStart = "${pkgs.darkhttpd}/bin/darkhttpd %h/.local/share/helium-startpage --port 8888 --addr 127.0.0.1 --no-listing";
|
||||||
|
Restart = "on-failure";
|
||||||
|
};
|
||||||
|
Install.WantedBy = ["default.target"];
|
||||||
|
};
|
||||||
|
}
|
||||||
-8
@@ -7,14 +7,6 @@
|
|||||||
name = "Proton Drive";
|
name = "Proton Drive";
|
||||||
url = "https://drive.proton.me";
|
url = "https://drive.proton.me";
|
||||||
}
|
}
|
||||||
{
|
|
||||||
name = "Proton Lumo";
|
|
||||||
url = "https://lumo.proton.me";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "Proton Calendar";
|
|
||||||
url = "https://calendar.proton.me";
|
|
||||||
}
|
|
||||||
{
|
{
|
||||||
name = "Github";
|
name = "Github";
|
||||||
url = "https://github.com";
|
url = "https://github.com";
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
{
|
||||||
|
inputs,
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
c = config.lib.stylix.colors;
|
||||||
|
rgb = base: map lib.strings.toInt [c."${base}-rgb-r" c."${base}-rgb-g" c."${base}-rgb-b"];
|
||||||
|
|
||||||
|
themeId = "abcadngacjlikcpkhleafekcdjmddegk";
|
||||||
|
themeKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6t46VoE3mdV1QNMgybpmQLi5PtYHejnNrSj4DkBZyiTzMzs7Yyvg64f78w3QubZA5cTXSQ7FVhVHvv30I8ym/jNzsSN6reh1t4PtKsFjFRugAty8bfKJGD404HZLOFN2z3G9UPVLBBgzDH3DWbb/kcOq60Mlo/QDCIjsieZg0G3EYMl4efoThzYPWoyv0UEoiliwrE/AChxbgipQetUZ48bFhTCsmnYzCze7clssfTobzWtJJG0qFx76LauHKymRS5OTFfgsovKqHUSFJ202Q53vFdUPP/j8PjSPr1kZeg1NYc7Ba3MoA49EwtJf5ol9oYu05EEnSQ5+1AoYVmdE8QIDAQAB";
|
||||||
|
|
||||||
|
themeManifest = builtins.toJSON {
|
||||||
|
manifest_version = 2;
|
||||||
|
name = "Stylix Theme";
|
||||||
|
version = "1.0";
|
||||||
|
key = themeKey;
|
||||||
|
theme.colors = {
|
||||||
|
frame = rgb "base00";
|
||||||
|
frame_inactive = rgb "base00";
|
||||||
|
frame_incognito = rgb "base00";
|
||||||
|
frame_incognito_inactive = rgb "base00";
|
||||||
|
toolbar = rgb "base00";
|
||||||
|
toolbar_button_icon = rgb "base05";
|
||||||
|
control_background = rgb "base00";
|
||||||
|
tab_text = rgb "base0D";
|
||||||
|
background_tab = rgb "base00";
|
||||||
|
tab_background_text = rgb "base04";
|
||||||
|
tab_background_text_inactive = rgb "base04";
|
||||||
|
ntp_background = rgb "base00";
|
||||||
|
ntp_text = rgb "base05";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
heliumFlags = [
|
||||||
|
"--enable-features=UseOzonePlatform"
|
||||||
|
"--ozone-platform=wayland"
|
||||||
|
"--enable-accelerated-video-decode"
|
||||||
|
"--enable-gpu-rasterization"
|
||||||
|
"--enable-zero-copy"
|
||||||
|
"--ignore-gpu-blocklist"
|
||||||
|
"--enable-features=VaapiVideoDecoder"
|
||||||
|
"--enable-features=VaapiVideoEncoder"
|
||||||
|
"--enable-features=CanvasOopRasterization"
|
||||||
|
"--disable-features=UseChromeOSDirectVideoDecoder"
|
||||||
|
"--no-default-browser-check"
|
||||||
|
"--show-avatar-button=never"
|
||||||
|
"--disable-features=WaylandWpColorManagerV1"
|
||||||
|
];
|
||||||
|
|
||||||
|
originalPkg = (inputs.helium-browser.packages.${pkgs.stdenv.hostPlatform.system}.helium).override {
|
||||||
|
flags = heliumFlags;
|
||||||
|
};
|
||||||
|
|
||||||
|
patchScript = pkgs.writeShellScript "helium-patch-prefs" ''
|
||||||
|
PROFILE="$HOME/.config/net.imput.helium/Default"
|
||||||
|
THEME_DIR="$PROFILE/Extensions/${themeId}/1.0_0"
|
||||||
|
PREFS="$PROFILE/Preferences"
|
||||||
|
|
||||||
|
mkdir -p "$THEME_DIR"
|
||||||
|
rm -f "$THEME_DIR/Cached Theme.pak"
|
||||||
|
printf '%s' '${themeManifest}' > "$THEME_DIR/manifest.json"
|
||||||
|
|
||||||
|
if [ -f "$PREFS" ]; then
|
||||||
|
tmp=$(mktemp)
|
||||||
|
${lib.getExe pkgs.jq} \
|
||||||
|
--arg id "${themeId}" \
|
||||||
|
--slurpfile manifest "$THEME_DIR/manifest.json" \
|
||||||
|
'
|
||||||
|
.helium.browser.layout = 3 |
|
||||||
|
.helium.browser.minimal_location_bar = true |
|
||||||
|
.helium.browser.show_dynamic_new_tab_button = false |
|
||||||
|
.bookmark_bar.show_tab_groups = false |
|
||||||
|
.extensions.settings[$id] = {
|
||||||
|
"active_permissions": {"api": [], "explicit_host": [], "manifest_permissions": [], "scriptable_host": []},
|
||||||
|
"creation_flags": 0,
|
||||||
|
"from_webstore": false,
|
||||||
|
"install_time": "13300000000000000",
|
||||||
|
"location": 1,
|
||||||
|
"manifest": $manifest[0],
|
||||||
|
"path": ($id + "/1.0_0"),
|
||||||
|
"state": 1,
|
||||||
|
"was_installed_by_default": false,
|
||||||
|
"was_installed_by_oem": false
|
||||||
|
} |
|
||||||
|
.extensions.theme = {"id": $id, "use_system": false}
|
||||||
|
' "$PREFS" > "$tmp" && mv "$tmp" "$PREFS"
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
|
||||||
|
baseWrapped = pkgs.symlinkJoin {
|
||||||
|
name = "helium-wrapped";
|
||||||
|
paths = [originalPkg];
|
||||||
|
nativeBuildInputs = [pkgs.makeWrapper];
|
||||||
|
postBuild = ''
|
||||||
|
wrapProgram $out/bin/helium \
|
||||||
|
--run ${lib.escapeShellArg (toString patchScript)}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
wrappedPkg = baseWrapped // {override = _: baseWrapped;};
|
||||||
|
in {
|
||||||
|
imports = [
|
||||||
|
inputs.helium-browser.homeModules.default
|
||||||
|
./bookmarks
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.helium = {
|
||||||
|
enable = true;
|
||||||
|
package = lib.mkForce wrappedPkg;
|
||||||
|
};
|
||||||
|
|
||||||
|
home.sessionVariables.BROWSER = "${config.programs.helium.package}/bin/helium";
|
||||||
|
|
||||||
|
xdg.desktopEntries.helium = {
|
||||||
|
name = "Helium";
|
||||||
|
genericName = "Navigateur Web";
|
||||||
|
exec = "${config.programs.helium.package}/bin/helium %U";
|
||||||
|
icon = "${config.programs.helium.package}/share/icons/hicolor/256x256/apps/helium.png";
|
||||||
|
terminal = false;
|
||||||
|
categories = ["Network" "WebBrowser"];
|
||||||
|
mimeType = [
|
||||||
|
"text/html"
|
||||||
|
"text/xml"
|
||||||
|
"application/xhtml+xml"
|
||||||
|
"x-scheme-handler/http"
|
||||||
|
"x-scheme-handler/https"
|
||||||
|
"x-scheme-handler/ftp"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.desktopEntries.helium-private = {
|
||||||
|
name = "Helium (Private window)";
|
||||||
|
genericName = "Navigateur Web";
|
||||||
|
exec = "${config.programs.helium.package}/bin/helium --incognito %U";
|
||||||
|
icon = "${config.programs.helium.package}/share/icons/hicolor/256x256/apps/helium.png";
|
||||||
|
terminal = false;
|
||||||
|
categories = ["Network" "WebBrowser"];
|
||||||
|
mimeType = ["text/html" "text/xml" "application/xhtml+xml"];
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
{...}: let
|
||||||
|
bookmarkList =
|
||||||
|
(import ./bookmarks/general.nix)
|
||||||
|
++ (import ./bookmarks/tools.nix)
|
||||||
|
++ (import ./bookmarks/entertainment.nix)
|
||||||
|
++ (import ./bookmarks/infosec.nix)
|
||||||
|
++ (import ./bookmarks/other.nix)
|
||||||
|
++ (import ./bookmarks/jack.nix);
|
||||||
|
|
||||||
|
toChromium = items:
|
||||||
|
map (item:
|
||||||
|
if item ? url
|
||||||
|
then {inherit (item) name url;}
|
||||||
|
else {
|
||||||
|
name = item.name;
|
||||||
|
children = toChromium item.bookmarks;
|
||||||
|
})
|
||||||
|
items;
|
||||||
|
in {
|
||||||
|
stylix.targets.chromium.enable = false;
|
||||||
|
|
||||||
|
programs.helium = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
policies = {
|
||||||
|
BrowserSignin = 0;
|
||||||
|
SyncDisabled = true;
|
||||||
|
SigninAllowed = false;
|
||||||
|
|
||||||
|
PasswordManagerEnabled = false;
|
||||||
|
AutofillAddressEnabled = false;
|
||||||
|
AutofillCreditCardEnabled = false;
|
||||||
|
SafeBrowsingEnabled = false;
|
||||||
|
MetricsReportingEnabled = false;
|
||||||
|
SpellCheckServiceEnabled = false;
|
||||||
|
DefaultCookiesSetting = 4;
|
||||||
|
DefaultGeolocationSetting = 2;
|
||||||
|
DefaultNotificationsSetting = 2;
|
||||||
|
DefaultPopupsSetting = 2;
|
||||||
|
|
||||||
|
DefaultBrowserSettingEnabled = false;
|
||||||
|
DeveloperToolsAvailability = 1;
|
||||||
|
|
||||||
|
DnsOverHttpsMode = "secure";
|
||||||
|
DnsOverHttpsTemplates = "https://dns.quad9.net/dns-query";
|
||||||
|
|
||||||
|
DefaultSearchProviderEnabled = true;
|
||||||
|
DefaultSearchProviderName = "Startpage";
|
||||||
|
DefaultSearchProviderSearchURL = "https://www.startpage.com/do/search?q={searchTerms}";
|
||||||
|
DefaultSearchProviderSuggestURL = "https://www.startpage.com/do/suggest?q={searchTerms}";
|
||||||
|
|
||||||
|
NewTabPageLocation = "http://127.0.0.1:8888";
|
||||||
|
HomepageIsNewTabPage = false;
|
||||||
|
HomepageLocation = "http://127.0.0.1:8888";
|
||||||
|
ShowHomeButton = false;
|
||||||
|
RestoreOnStartup = 4;
|
||||||
|
|
||||||
|
BookmarkBarEnabled = false;
|
||||||
|
ManagedBookmarks = toChromium bookmarkList;
|
||||||
|
|
||||||
|
ExtensionInstallForcelist = [
|
||||||
|
"dbepggeogbaibhgnhhndojpepiihcmeb" # Vimiu
|
||||||
|
"gcknhkkoolaabfmlnjonogaaifnjlfnp" # FoxyProxy
|
||||||
|
"ghmbeldphafepmbegfdlkpapadhbakde" # Proton Pass
|
||||||
|
"mdjildafknihdffpkfmmpnpoiajfjnjd" # Consent-O-Matic
|
||||||
|
"pkehgijcmpdhfbdbbnkijodmdjhbjlgp" # Privacy Badger
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,4 +1,8 @@
|
|||||||
{pkgs, ...}: {
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
proton-vpn
|
proton-vpn
|
||||||
proton-pass
|
proton-pass
|
||||||
@@ -17,7 +21,7 @@
|
|||||||
};
|
};
|
||||||
"Proton Calendar" = {
|
"Proton Calendar" = {
|
||||||
name = "Proton Calendar";
|
name = "Proton Calendar";
|
||||||
exec = "${pkgs.qutebrowser}/bin/qutebrowser \"https://calendar.proton.me\"";
|
exec = ''${config.programs.helium.package}/bin/helium "https://calendar.proton.me"'';
|
||||||
icon = "proton-calendar";
|
icon = "proton-calendar";
|
||||||
type = "Application";
|
type = "Application";
|
||||||
categories = ["Utility"];
|
categories = ["Utility"];
|
||||||
@@ -25,7 +29,7 @@
|
|||||||
};
|
};
|
||||||
"Proton Mail" = {
|
"Proton Mail" = {
|
||||||
name = "Proton Mail";
|
name = "Proton Mail";
|
||||||
exec = "${pkgs.qutebrowser}/bin/qutebrowser \"https://mail.proton.me/\"";
|
exec = ''${config.programs.helium.package}/bin/helium "https://mail.proton.me/"'';
|
||||||
icon = "proton-mail";
|
icon = "proton-mail";
|
||||||
type = "Application";
|
type = "Application";
|
||||||
categories = ["Utility"];
|
categories = ["Utility"];
|
||||||
|
|||||||
@@ -1,484 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}: let
|
|
||||||
bookmarkList =
|
|
||||||
(import ./general.nix)
|
|
||||||
++ (import ./tools.nix)
|
|
||||||
++ (import ./social.nix)
|
|
||||||
++ (import ./infosec.nix)
|
|
||||||
++ (import ./other.nix)
|
|
||||||
++ (import ./jack.nix);
|
|
||||||
|
|
||||||
c = config.lib.stylix.colors;
|
|
||||||
|
|
||||||
stripProtocol = url: lib.removePrefix "https://" (lib.removePrefix "http://" url);
|
|
||||||
|
|
||||||
stripDomain = url: builtins.head (lib.splitString "/" (stripProtocol url));
|
|
||||||
|
|
||||||
mkCard = item: let
|
|
||||||
domain = stripDomain item.url;
|
|
||||||
initial = builtins.substring 0 1 item.name;
|
|
||||||
in ''
|
|
||||||
<a href="${item.url}" class="card">
|
|
||||||
<div class="favicon-wrapper">
|
|
||||||
<img class="favicon" src="https://icons.duckduckgo.com/ip3/${domain}.ico" alt="" aria-hidden="true" loading="lazy" onerror="this.style.display='none';this.nextElementSibling.style.display='flex'">
|
|
||||||
<span class="favicon-fallback" style="display:none">${initial}</span>
|
|
||||||
</div>
|
|
||||||
<div class="card-info">
|
|
||||||
<span class="card-name">${item.name}</span>
|
|
||||||
<span class="card-url">${stripProtocol item.url}</span>
|
|
||||||
</div>
|
|
||||||
</a>'';
|
|
||||||
|
|
||||||
mkFolderContent = items: let
|
|
||||||
step = acc: item:
|
|
||||||
if item ? url
|
|
||||||
then acc // {pending = acc.pending ++ [item];}
|
|
||||||
else {
|
|
||||||
chunks =
|
|
||||||
acc.chunks
|
|
||||||
++ lib.optional (acc.pending != []) {
|
|
||||||
isCards = true;
|
|
||||||
items = acc.pending;
|
|
||||||
}
|
|
||||||
++ [
|
|
||||||
{
|
|
||||||
isCards = false;
|
|
||||||
folder = item;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
pending = [];
|
|
||||||
};
|
|
||||||
result =
|
|
||||||
lib.foldl' step {
|
|
||||||
chunks = [];
|
|
||||||
pending = [];
|
|
||||||
}
|
|
||||||
items;
|
|
||||||
chunks =
|
|
||||||
result.chunks
|
|
||||||
++ lib.optional (result.pending != []) {
|
|
||||||
isCards = true;
|
|
||||||
items = result.pending;
|
|
||||||
};
|
|
||||||
in
|
|
||||||
lib.concatMapStrings (
|
|
||||||
chunk:
|
|
||||||
if chunk.isCards
|
|
||||||
then ''
|
|
||||||
<div class="cards">
|
|
||||||
${lib.concatMapStrings mkCard chunk.items}
|
|
||||||
</div>''
|
|
||||||
else mkFolder chunk.folder
|
|
||||||
)
|
|
||||||
chunks;
|
|
||||||
|
|
||||||
mkFolder = folder: let
|
|
||||||
iconHtml =
|
|
||||||
if folder ? icon
|
|
||||||
then ''<span class="material-symbols-outlined folder-icon" aria-hidden="true">${folder.icon}</span>''
|
|
||||||
else "";
|
|
||||||
in ''
|
|
||||||
<details class="folder-section" open>
|
|
||||||
<summary class="folder-title">
|
|
||||||
${iconHtml}<span class="folder-name">${folder.name}</span>
|
|
||||||
<svg class="chevron" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
|
|
||||||
</summary>
|
|
||||||
<div class="folder-content">
|
|
||||||
${mkFolderContent folder.bookmarks}
|
|
||||||
</div>
|
|
||||||
</details>'';
|
|
||||||
|
|
||||||
grouped = let
|
|
||||||
step = acc: item:
|
|
||||||
if item ? url
|
|
||||||
then acc // {pending = acc.pending ++ [item];}
|
|
||||||
else {
|
|
||||||
groups =
|
|
||||||
acc.groups
|
|
||||||
++ lib.optional (acc.pending != []) {
|
|
||||||
isRoot = true;
|
|
||||||
items = acc.pending;
|
|
||||||
}
|
|
||||||
++ [
|
|
||||||
{
|
|
||||||
isRoot = false;
|
|
||||||
inherit item;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
pending = [];
|
|
||||||
};
|
|
||||||
result =
|
|
||||||
lib.foldl' step {
|
|
||||||
groups = [];
|
|
||||||
pending = [];
|
|
||||||
}
|
|
||||||
bookmarkList;
|
|
||||||
in
|
|
||||||
result.groups
|
|
||||||
++ lib.optional (result.pending != []) {
|
|
||||||
isRoot = true;
|
|
||||||
items = result.pending;
|
|
||||||
};
|
|
||||||
|
|
||||||
mkSection = group:
|
|
||||||
if group.isRoot
|
|
||||||
then ''
|
|
||||||
<div class="root-section">
|
|
||||||
<div class="cards">
|
|
||||||
${lib.concatMapStrings mkCard group.items}
|
|
||||||
</div>
|
|
||||||
</div>''
|
|
||||||
else mkFolder group.item;
|
|
||||||
|
|
||||||
collectBookmarks = prefix: items:
|
|
||||||
lib.concatMapStrings (
|
|
||||||
item:
|
|
||||||
if item ? url
|
|
||||||
then "${item.url} ${prefix}${item.name}\n"
|
|
||||||
else collectBookmarks "${prefix}${item.name}/" item.bookmarks
|
|
||||||
)
|
|
||||||
items;
|
|
||||||
|
|
||||||
publicBookmarks = pkgs.writeText "qutebrowser-public-bookmarks" (collectBookmarks "" bookmarkList);
|
|
||||||
in {
|
|
||||||
config = {
|
|
||||||
xdg.dataFile."qutebrowser/bookmarks.html".text = ''
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>Bookmarks</title>
|
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20,300,0,0">
|
|
||||||
<style>
|
|
||||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
||||||
|
|
||||||
body {
|
|
||||||
background-color: #${c.base00};
|
|
||||||
color: #${c.base05};
|
|
||||||
font-family: 'Source Sans Pro', sans-serif;
|
|
||||||
font-size: 14px;
|
|
||||||
min-height: 100vh;
|
|
||||||
padding: 2.5rem 2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header {
|
|
||||||
max-width: 1100px;
|
|
||||||
margin: 0 auto 2rem;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 1.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-title {
|
|
||||||
font-size: 1.3rem;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #${c.base0D};
|
|
||||||
letter-spacing: -0.01em;
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.search-bar {
|
|
||||||
flex: 1;
|
|
||||||
background-color: #${c.base01};
|
|
||||||
border: 1px solid #${c.base02};
|
|
||||||
border-radius: 8px;
|
|
||||||
color: #${c.base05};
|
|
||||||
font-family: 'Source Sans Pro', sans-serif;
|
|
||||||
font-size: 0.9rem;
|
|
||||||
padding: 0.5rem 0.9rem;
|
|
||||||
outline: none;
|
|
||||||
transition: border-color 0.15s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.search-bar::placeholder { color: #${c.base03}; }
|
|
||||||
.search-bar:focus { border-color: #${c.base0D}; }
|
|
||||||
|
|
||||||
.collapse-btn {
|
|
||||||
flex-shrink: 0;
|
|
||||||
background: none;
|
|
||||||
border: 1px solid #${c.base02};
|
|
||||||
border-radius: 8px;
|
|
||||||
color: #${c.base03};
|
|
||||||
cursor: pointer;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
padding: 0.47rem;
|
|
||||||
transition: color 0.15s ease, border-color 0.15s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.collapse-btn:hover {
|
|
||||||
color: #${c.base0D};
|
|
||||||
border-color: #${c.base0D};
|
|
||||||
}
|
|
||||||
|
|
||||||
.collapse-btn svg {
|
|
||||||
width: 16px;
|
|
||||||
height: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bookmarks-container {
|
|
||||||
max-width: 1100px;
|
|
||||||
margin: 0 auto;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 0.75rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.root-section {
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
details.folder-section {
|
|
||||||
border-radius: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
details.folder-section > summary {
|
|
||||||
list-style: none;
|
|
||||||
cursor: pointer;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.5rem;
|
|
||||||
padding: 0.45rem 0.5rem;
|
|
||||||
border-radius: 8px;
|
|
||||||
user-select: none;
|
|
||||||
transition: background-color 0.12s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
details.folder-section > summary::-webkit-details-marker { display: none; }
|
|
||||||
|
|
||||||
details.folder-section > summary:hover {
|
|
||||||
background-color: #${c.base01};
|
|
||||||
color: #${c.base0D};
|
|
||||||
}
|
|
||||||
|
|
||||||
details.folder-section > summary:hover .folder-name {
|
|
||||||
color: #${c.base0D};
|
|
||||||
}
|
|
||||||
|
|
||||||
details.folder-section > summary:hover .folder-icon {
|
|
||||||
color: #${c.base0D};
|
|
||||||
}
|
|
||||||
|
|
||||||
.folder-icon {
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 1;
|
|
||||||
flex-shrink: 0;
|
|
||||||
color: #${c.base04};
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.folder-name {
|
|
||||||
font-size: 0.72rem;
|
|
||||||
font-weight: 700;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: #${c.base03};
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chevron {
|
|
||||||
width: 13px;
|
|
||||||
height: 13px;
|
|
||||||
color: #${c.base03};
|
|
||||||
transition: transform 0.2s ease;
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
details[open] > summary > .chevron {
|
|
||||||
transform: rotate(180deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.folder-content {
|
|
||||||
padding: 0.4rem 0 0.5rem 0;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 0.25rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.folder-content > details.folder-section > summary {
|
|
||||||
padding-left: 1.2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.folder-content > details.folder-section > .folder-content {
|
|
||||||
padding-left: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cards {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
|
|
||||||
gap: 0.4rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.7rem;
|
|
||||||
padding: 0.6rem 0.8rem;
|
|
||||||
background-color: #${c.base01};
|
|
||||||
border: 1px solid #${c.base02};
|
|
||||||
border-radius: 10px;
|
|
||||||
text-decoration: none;
|
|
||||||
transition: background-color 0.12s ease, border-color 0.12s ease;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card:hover {
|
|
||||||
background-color: #${c.base02};
|
|
||||||
border-color: #${c.base0D};
|
|
||||||
}
|
|
||||||
|
|
||||||
.favicon-wrapper { position: relative; width: 18px; height: 18px; flex-shrink: 0; }
|
|
||||||
|
|
||||||
.favicon {
|
|
||||||
position: absolute;
|
|
||||||
inset: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
object-fit: contain;
|
|
||||||
border-radius: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.favicon-fallback {
|
|
||||||
position: absolute;
|
|
||||||
inset: 0;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
background-color: #${c.base02};
|
|
||||||
border-radius: 4px;
|
|
||||||
color: #${c.base04};
|
|
||||||
font-size: 10px;
|
|
||||||
font-weight: 700;
|
|
||||||
text-transform: uppercase;
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-info {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 0.05rem;
|
|
||||||
overflow: hidden;
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-name {
|
|
||||||
color: #${c.base05};
|
|
||||||
font-size: 0.86rem;
|
|
||||||
font-weight: 500;
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
transition: color 0.12s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card:hover .card-name { color: #${c.base0D}; }
|
|
||||||
|
|
||||||
.card-url {
|
|
||||||
color: #${c.base03};
|
|
||||||
font-family: 'Maple Mono NF', monospace;
|
|
||||||
font-size: 0.7rem;
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
|
|
||||||
.no-results {
|
|
||||||
color: #${c.base03};
|
|
||||||
font-size: 0.9rem;
|
|
||||||
padding: 0.5rem 0.2rem;
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="header">
|
|
||||||
<h1 class="page-title">Bookmarks</h1>
|
|
||||||
<input id="search" class="search-bar" type="text" placeholder="Search…" autocomplete="off" spellcheck="false">
|
|
||||||
<button id="collapse-btn" class="collapse-btn" title="Collapse all folders" aria-label="Collapse all folders">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<polyline points="4 14 10 14 10 20"/><polyline points="20 10 14 10 14 4"/><line x1="10" y1="14" x2="3" y2="21"/><line x1="21" y1="3" x2="14" y2="10"/>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<div class="bookmarks-container">
|
|
||||||
<p id="no-results" class="no-results">No results</p>
|
|
||||||
${lib.concatMapStrings mkSection grouped}
|
|
||||||
</div>
|
|
||||||
<script>
|
|
||||||
window.addEventListener('DOMContentLoaded', function () {
|
|
||||||
const input = document.getElementById('search');
|
|
||||||
const noResults = document.getElementById('no-results');
|
|
||||||
const collapseBtn = document.getElementById('collapse-btn');
|
|
||||||
|
|
||||||
input.focus();
|
|
||||||
|
|
||||||
collapseBtn.addEventListener('click', function () {
|
|
||||||
document.querySelectorAll('details.folder-section').forEach(function (d) {
|
|
||||||
d.open = false;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
input.addEventListener('input', function () {
|
|
||||||
const query = this.value.toLowerCase().trim();
|
|
||||||
let anyVisible = false;
|
|
||||||
|
|
||||||
if (query) {
|
|
||||||
document.querySelectorAll('details.folder-section').forEach(function (d) {
|
|
||||||
d.open = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
document.querySelectorAll('.folder-section, .root-section').forEach(function (section) {
|
|
||||||
let sectionVisible = false;
|
|
||||||
section.querySelectorAll('.card').forEach(function (card) {
|
|
||||||
const name = card.querySelector('.card-name').textContent.toLowerCase();
|
|
||||||
const url = card.querySelector('.card-url').textContent.toLowerCase();
|
|
||||||
const match = !query || name.includes(query) || url.includes(query);
|
|
||||||
card.style.display = match ? ''' : 'none';
|
|
||||||
if (match) { sectionVisible = true; anyVisible = true; }
|
|
||||||
});
|
|
||||||
section.style.display = sectionVisible ? ''' : 'none';
|
|
||||||
});
|
|
||||||
|
|
||||||
noResults.style.display = anyVisible || !query ? 'none' : 'block';
|
|
||||||
});
|
|
||||||
|
|
||||||
input.addEventListener('keydown', function (e) {
|
|
||||||
if (e.key === 'Enter') {
|
|
||||||
const val = this.value.trim();
|
|
||||||
const isUrl = /^https?:\/\//i.test(val) || /^[a-zA-Z0-9-]+(\.[a-zA-Z]{2,})(\/.*)?$/.test(val);
|
|
||||||
if (isUrl) {
|
|
||||||
location.href = /^https?:\/\//i.test(val) ? val : 'https://' + val;
|
|
||||||
} else {
|
|
||||||
const first = document.querySelector('.card:not([style*="none"])');
|
|
||||||
if (first) {
|
|
||||||
location.href = first.href;
|
|
||||||
} else {
|
|
||||||
const q = encodeURIComponent(val);
|
|
||||||
if (q) location.href = 'https://www.startpage.com/sp/search?q=' + q;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (e.key === 'Escape') {
|
|
||||||
this.value = ''';
|
|
||||||
this.dispatchEvent(new Event('input'));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
'';
|
|
||||||
|
|
||||||
home.activation.qutebrowserBookmarks = lib.hm.dag.entryAfter ["writeBoundary"] ''
|
|
||||||
mkdir -p ${config.home.homeDirectory}/.config/qutebrowser/bookmarks
|
|
||||||
cat ${publicBookmarks} > ${config.home.homeDirectory}/.config/qutebrowser/bookmarks/urls
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
{...}: {
|
|
||||||
imports = [
|
|
||||||
./bookmarks
|
|
||||||
./search.nix
|
|
||||||
./keybindings.nix
|
|
||||||
./settings.nix
|
|
||||||
./userscripts.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
home.sessionVariables = {
|
|
||||||
DEFAULT_BROWSER = "qutebrowser";
|
|
||||||
BROWSER = "qutebrowser";
|
|
||||||
};
|
|
||||||
|
|
||||||
xdg.mimeApps.defaultApplications = {
|
|
||||||
"text/html" = ["org.qutebrowser.qutebrowser.desktop"];
|
|
||||||
"text/xml" = ["org.qutebrowser.qutebrowser.desktop"];
|
|
||||||
"x-scheme-handler/http" = ["org.qutebrowser.qutebrowser.desktop"];
|
|
||||||
"x-scheme-handler/https" = ["org.qutebrowser.qutebrowser.desktop"];
|
|
||||||
"x-scheme-handler/unknown" = ["org.qutebrowser.qutebrowser.desktop"];
|
|
||||||
"x-scheme-handler/about" = ["org.qutebrowser.qutebrowser.desktop"];
|
|
||||||
"x-scheme-handler/qute" = ["org.qutebrowser.qutebrowser.desktop"];
|
|
||||||
};
|
|
||||||
|
|
||||||
xdg.desktopEntries.qutebrowser-private = {
|
|
||||||
name = "Qutebrowser (Temp session)";
|
|
||||||
genericName = "Web Browser";
|
|
||||||
exec = "qutebrowser --temp-basedir %U";
|
|
||||||
icon = "qutebrowser";
|
|
||||||
categories = [
|
|
||||||
"Network"
|
|
||||||
"WebBrowser"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.qutebrowser = {
|
|
||||||
enable = true;
|
|
||||||
loadAutoconfig = true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
{config, ...}: {
|
|
||||||
programs.qutebrowser.keyBindings = {
|
|
||||||
normal."<Ctrl-w>" = "tab-close";
|
|
||||||
normal."<Ctrl-Tab>" = "tab-next";
|
|
||||||
normal."<Ctrl-Shift-Tab>" = "tab-prev";
|
|
||||||
normal."<Ctrl-b>" = "open file://${config.xdg.dataHome}/qutebrowser/bookmarks.html";
|
|
||||||
|
|
||||||
# Ctrl+c is used to leave the current mode and return to normal mode.
|
|
||||||
insert."<Ctrl-c>" = "mode-leave";
|
|
||||||
hint."<Ctrl-c>" = "mode-leave";
|
|
||||||
caret."<Ctrl-c>" = "mode-leave";
|
|
||||||
command."<Ctrl-c>" = "mode-leave";
|
|
||||||
prompt."<Ctrl-c>" = "mode-leave";
|
|
||||||
yesno."<Ctrl-c>" = "mode-leave";
|
|
||||||
register."<Ctrl-c>" = "mode-leave";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
{
|
|
||||||
programs.qutebrowser.searchEngines = rec {
|
|
||||||
startpage = "https://www.startpage.com/sp/search?q={}";
|
|
||||||
|
|
||||||
mynixos = "https://mynixos.com/search?q={}";
|
|
||||||
duckduckgo = "https://duckduckgo.com/?q={}";
|
|
||||||
google = "https://google.com/search?hl=en&q={}";
|
|
||||||
yandex = "https://yandex.com/search/?text={}";
|
|
||||||
bing = "https://bing.com/search?q={}";
|
|
||||||
youtube = "https://youtube.com/results?search_query={}";
|
|
||||||
google-images = "https://google.com/search?hl=en&tbm=isch&q={}";
|
|
||||||
|
|
||||||
# AI
|
|
||||||
chatgpt = "https://chatgpt.com/?q={}";
|
|
||||||
claude = "https://claude.ai/new?q={}";
|
|
||||||
gemini = "https://gemini.google.com/app?q={}";
|
|
||||||
|
|
||||||
# Maps
|
|
||||||
amap = "https://maps.apple.com/?q={}";
|
|
||||||
gmap = "https://www.google.com/maps/search/{}";
|
|
||||||
|
|
||||||
# shortcuts
|
|
||||||
g = google;
|
|
||||||
n = mynixos;
|
|
||||||
gpt = chatgpt;
|
|
||||||
gem = gemini;
|
|
||||||
cla = claude;
|
|
||||||
DEFAULT = startpage;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
{config, ...}: {
|
|
||||||
programs.qutebrowser = {
|
|
||||||
settings = {
|
|
||||||
url = rec {
|
|
||||||
default_page = "file://${config.xdg.dataHome}/qutebrowser/bookmarks.html";
|
|
||||||
start_pages = [default_page];
|
|
||||||
};
|
|
||||||
new_instance_open_target = "window";
|
|
||||||
"tabs.last_close" = "close";
|
|
||||||
"statusbar.widgets" = [
|
|
||||||
"keypress"
|
|
||||||
"url"
|
|
||||||
"progress"
|
|
||||||
];
|
|
||||||
|
|
||||||
# Adblock
|
|
||||||
"content.blocking.enabled" = true;
|
|
||||||
"content.blocking.method" = "adblock";
|
|
||||||
"content.blocking.adblock.lists" = [
|
|
||||||
"https://easylist.to/easylist/easylist.txt"
|
|
||||||
"https://easylist.to/easylist/easyprivacy.txt"
|
|
||||||
"https://secure.fanboy.co.nz/fanboy-cookiemonster.txt"
|
|
||||||
];
|
|
||||||
|
|
||||||
# Clipboard access (needed for Excalidraw, Cyberchef, etc.)
|
|
||||||
"content.javascript.clipboard" = "access";
|
|
||||||
|
|
||||||
# Downloads
|
|
||||||
"downloads.location.directory" = "~/Downloads";
|
|
||||||
"downloads.location.prompt" = false;
|
|
||||||
|
|
||||||
# Editor (Ctrl+e in text fields)
|
|
||||||
"editor.command" = [
|
|
||||||
"ghostty"
|
|
||||||
"-e"
|
|
||||||
"nvim"
|
|
||||||
"{}"
|
|
||||||
];
|
|
||||||
|
|
||||||
# Tabs
|
|
||||||
# "tabs.show" = "switching";
|
|
||||||
# "tabs.show_switching_delay" = 3000;
|
|
||||||
|
|
||||||
# Scrollbar
|
|
||||||
"scrolling.bar" = "never";
|
|
||||||
|
|
||||||
# Statusbar
|
|
||||||
"statusbar.show" = "in-mode";
|
|
||||||
|
|
||||||
# Privacy
|
|
||||||
"content.geolocation" = false;
|
|
||||||
"content.cookies.accept" = "no-3rdparty";
|
|
||||||
};
|
|
||||||
|
|
||||||
extraConfig = ''
|
|
||||||
c.statusbar.padding = {'top': 6, 'bottom': 6, 'left': 8, 'right': 8}
|
|
||||||
c.tabs.padding = {'top': 6, 'bottom': 6, 'left': 8, 'right': 8}
|
|
||||||
config.set('content.local_content_can_access_remote_urls', True, 'file://*')
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
xdg.dataFile."qutebrowser/greasemonkey/startpage-no-ads.user.js".text = ''
|
|
||||||
// ==UserScript==
|
|
||||||
// @name Startpage - Hide Ads
|
|
||||||
// @match https://www.startpage.com/*
|
|
||||||
// @run-at document-start
|
|
||||||
// ==/UserScript==
|
|
||||||
|
|
||||||
new MutationObserver(function(mutations) {
|
|
||||||
mutations.forEach((mutation) => {
|
|
||||||
if (mutation.type === 'childList') {
|
|
||||||
mutation.addedNodes.forEach((node) => {
|
|
||||||
if (node.nodeType === 1 && node.nodeName === 'DIV' && node.id === 'gcsa-top') {
|
|
||||||
node.remove();
|
|
||||||
this.disconnect();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}).observe(document, { childList: true, subtree: true });
|
|
||||||
'';
|
|
||||||
|
|
||||||
home.activation.downloadUserscripts = lib.hm.dag.entryAfter ["writeBoundary"] ''
|
|
||||||
scripts_dir="${config.home.homeDirectory}/.local/share/qutebrowser/greasemonkey"
|
|
||||||
$DRY_RUN_CMD mkdir -p "$scripts_dir"
|
|
||||||
|
|
||||||
download() {
|
|
||||||
local name="$1" url="$2"
|
|
||||||
if [[ ! -f "$scripts_dir/$name" ]]; then
|
|
||||||
$DRY_RUN_CMD ${pkgs.curl}/bin/curl -sSL -o "$scripts_dir/$name" "$url" || true
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
download "return-youtube-dislike.user.js" "https://update.greasyfork.org/scripts/436115/Return%20YouTube%20Dislike.user.js"
|
|
||||||
download "sponsorblock-lite.user.js" "https://update.greasyfork.org/scripts/560869/SponsorBlock%20Lite.user.js"
|
|
||||||
download "dont-track-me-google.user.js" "https://update.greasyfork.org/scripts/428243/Don%27t%20track%20me%20Google.user.js"
|
|
||||||
download "i-dont-care-about-cookies.user.js" "https://update.greasyfork.org/scripts/522645/I%20don%27t%20care%20about%20cookies.user.js"
|
|
||||||
download "tracking-token-stripper.user.js" "https://github.com/doggy8088/TrackingTokenStripper/raw/refs/heads/master/TrackingTokenStripper.user.js"
|
|
||||||
download "bypass-paywalls-clean.user.js" "https://gitflic.ru/project/magnolia1234/bypass-paywalls-clean-filters/blob/raw?file=userscript/bpc.en.user.js"
|
|
||||||
download "anti-adblock-fuckoff.user.js" "https://update.greasyfork.org/scripts/397070/Anti-AdBlocker%20Fuckoff.user.js"
|
|
||||||
'';
|
|
||||||
}
|
|
||||||
@@ -53,12 +53,12 @@ in {
|
|||||||
{
|
{
|
||||||
key = "c";
|
key = "c";
|
||||||
desc = "Proton Calendar";
|
desc = "Proton Calendar";
|
||||||
cmd = "${pkgs.qutebrowser}/bin/qutebrowser 'https://calendar.proton.me/'";
|
cmd = "${config.programs.helium.package}/bin/helium 'https://calendar.proton.me/'";
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
key = "m";
|
key = "m";
|
||||||
desc = "Proton Mail";
|
desc = "Proton Mail";
|
||||||
cmd = "${pkgs.qutebrowser}/bin/qutebrowser 'https://mail.proton.me/'";
|
cmd = "${config.programs.helium.package}/bin/helium 'https://mail.proton.me/'";
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
key = "o";
|
key = "o";
|
||||||
@@ -77,19 +77,18 @@ in {
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
key = "b";
|
key = "b";
|
||||||
desc = "Qutebrowser";
|
desc = "Helium";
|
||||||
cmd = "${pkgs.qutebrowser}/bin/qutebrowser";
|
cmd = "${config.programs.helium.package}/bin/helium";
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
key = "i";
|
key = "i";
|
||||||
desc = "Qutebrowser (Temp session)";
|
desc = "Helium (Incognito)";
|
||||||
cmd = "${pkgs.qutebrowser}/bin/qutebrowser --temp-basedir";
|
cmd = "${config.programs.helium.package}/bin/helium --incognito";
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
)
|
)
|
||||||
|
|
||||||
# Web links
|
"$mod,B, exec, uwsm app -- ${config.programs.helium.package}/bin/helium" # Browser
|
||||||
"$mod,B, exec, uwsm app -- ${pkgs.qutebrowser}/bin/qutebrowser" # Browser (Qutebrowser)
|
|
||||||
|
|
||||||
# Power
|
# Power
|
||||||
"$mod, X, global, caelestia:session" # Powermenu
|
"$mod, X, global, caelestia:session" # Powermenu
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ with lib; let
|
|||||||
pdf = ["zathura.desktop"];
|
pdf = ["zathura.desktop"];
|
||||||
terminal = ["ghostty.desktop"];
|
terminal = ["ghostty.desktop"];
|
||||||
archive = ["xarchiver.desktop"];
|
archive = ["xarchiver.desktop"];
|
||||||
|
browser = ["helium.desktop"];
|
||||||
};
|
};
|
||||||
|
|
||||||
mimeMap = {
|
mimeMap = {
|
||||||
@@ -110,6 +111,13 @@ with lib; let
|
|||||||
"application/7z"
|
"application/7z"
|
||||||
"application/*tar"
|
"application/*tar"
|
||||||
];
|
];
|
||||||
|
browser = [
|
||||||
|
"text/html"
|
||||||
|
"application/xhtml+xml"
|
||||||
|
"x-scheme-handler/http"
|
||||||
|
"x-scheme-handler/https"
|
||||||
|
"x-scheme-handler/ftp"
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
nvim-ghostty = pkgs.makeDesktopItem {
|
nvim-ghostty = pkgs.makeDesktopItem {
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
../../nixos/utils.nix
|
../../nixos/utils.nix
|
||||||
../../nixos/hyprland.nix
|
../../nixos/hyprland.nix
|
||||||
../../nixos/usbguard.nix
|
../../nixos/usbguard.nix
|
||||||
|
../../home/programs/helium/system.nix # I hate browser's configuration..
|
||||||
|
|
||||||
../../nixos/omen.nix # CHANGEME: For my laptop only, remove this (OMEN 16)
|
../../nixos/omen.nix # CHANGEME: For my laptop only, remove this (OMEN 16)
|
||||||
|
|
||||||
|
|||||||
+1
-12
@@ -7,18 +7,6 @@ nixpkgs.lib.nixosSystem {
|
|||||||
modules = [
|
modules = [
|
||||||
{
|
{
|
||||||
nixpkgs.overlays = [
|
nixpkgs.overlays = [
|
||||||
(final: prev: {
|
|
||||||
# FIXME: Workaround: Mesa crash with AMD GPU + Wayland + Qt 6.11.0
|
|
||||||
qutebrowser = prev.symlinkJoin {
|
|
||||||
name = "qutebrowser";
|
|
||||||
paths = [prev.qutebrowser];
|
|
||||||
buildInputs = [prev.makeWrapper];
|
|
||||||
postBuild = ''
|
|
||||||
wrapProgram $out/bin/qutebrowser \
|
|
||||||
--set LIBGL_ALWAYS_SOFTWARE 1
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
})
|
|
||||||
];
|
];
|
||||||
_module.args = {inherit inputs;};
|
_module.args = {inherit inputs;};
|
||||||
}
|
}
|
||||||
@@ -26,6 +14,7 @@ nixpkgs.lib.nixosSystem {
|
|||||||
inputs.home-manager.nixosModules.home-manager
|
inputs.home-manager.nixosModules.home-manager
|
||||||
inputs.stylix.nixosModules.stylix
|
inputs.stylix.nixosModules.stylix
|
||||||
inputs.nix-index-database.nixosModules.default
|
inputs.nix-index-database.nixosModules.default
|
||||||
|
inputs.helium-browser.nixosModules.default
|
||||||
./configuration.nix
|
./configuration.nix
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{config, ...}: {
|
{config, ...}: {
|
||||||
imports = [
|
imports = [
|
||||||
# Programs
|
# Programs
|
||||||
../../home/programs/brave
|
../../home/programs/helium
|
||||||
../../home/programs/proton
|
../../home/programs/proton
|
||||||
../../home/programs/proton/auto-start-vpn.nix
|
../../home/programs/proton/auto-start-vpn.nix
|
||||||
../../home/programs/ghostty
|
../../home/programs/ghostty
|
||||||
@@ -14,7 +14,6 @@
|
|||||||
../../home/programs/thunar
|
../../home/programs/thunar
|
||||||
../../home/programs/nixy
|
../../home/programs/nixy
|
||||||
../../home/programs/nightshift
|
../../home/programs/nightshift
|
||||||
../../home/programs/qutebrowser
|
|
||||||
../../home/programs/nix-utils
|
../../home/programs/nix-utils
|
||||||
|
|
||||||
../../home/programs/group/basic-apps.nix
|
../../home/programs/group/basic-apps.nix
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
../../nixos/users.nix
|
../../nixos/users.nix
|
||||||
../../nixos/utils.nix
|
../../nixos/utils.nix
|
||||||
../../nixos/hyprland.nix
|
../../nixos/hyprland.nix
|
||||||
|
../../home/programs/helium/system.nix # I hate browser's configuration..
|
||||||
|
|
||||||
# You should let those lines as is
|
# You should let those lines as is
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
|
|||||||
+1
-2
@@ -1,8 +1,8 @@
|
|||||||
{config, ...}: {
|
{config, ...}: {
|
||||||
imports = [
|
imports = [
|
||||||
# Programs
|
# Programs
|
||||||
../../home/programs/brave
|
|
||||||
../../home/programs/proton
|
../../home/programs/proton
|
||||||
|
../../home/programs/helium
|
||||||
../../home/programs/ghostty
|
../../home/programs/ghostty
|
||||||
../../home/programs/nvf
|
../../home/programs/nvf
|
||||||
../../home/programs/shell
|
../../home/programs/shell
|
||||||
@@ -12,7 +12,6 @@
|
|||||||
../../home/programs/thunar
|
../../home/programs/thunar
|
||||||
../../home/programs/nixy
|
../../home/programs/nixy
|
||||||
../../home/programs/nightshift
|
../../home/programs/nightshift
|
||||||
../../home/programs/qutebrowser
|
|
||||||
../../home/programs/nix-utils
|
../../home/programs/nix-utils
|
||||||
|
|
||||||
../../home/programs/group/basic-apps.nix
|
../../home/programs/group/basic-apps.nix
|
||||||
|
|||||||
Reference in New Issue
Block a user