Compare commits

...
14 Commits
21 changed files with 2083 additions and 130 deletions

No files matched your search

Generated
+90 -81
View File
@@ -9,11 +9,11 @@
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1789138122,
"narHash": "sha256-mh+ZiGCtHAo0xIi1yaNjHsftfnlWz9JiYwHCyT16yIE=",
"lastModified": 1792853286,
"narHash": "sha256-l/Oh5k1NQqQuwh4gBF3VcmCF0WGiCT/LqfvY5huhOq4=",
"owner": "ezKEa",
"repo": "aagl-gtk-on-nix",
"rev": "d82d6d6f66caf4b63fb154e62fad83c627874127",
"rev": "e9a3b8fdb50a7d77a90c02c84e298c286310385b",
"type": "github"
},
"original": {
@@ -64,11 +64,11 @@
]
},
"locked": {
"lastModified": 1786464219,
"narHash": "sha256-WKqWL8r7CyTDYueTr2ffJ9ya50dellv6IR1JX5PghDY=",
"lastModified": 1791041429,
"narHash": "sha256-Y/Q4JtMo6nHB6XS1LPSfK7Y4AnuNl9jci/5sCps1MRc=",
"owner": "hyprwm",
"repo": "aquamarine",
"rev": "f3d1804205e8158c15595cdda1b566f93349ffae",
"rev": "52ea11f06dd492f34b3cc0b39a9c805beecafcff",
"type": "github"
},
"original": {
@@ -173,11 +173,11 @@
]
},
"locked": {
"lastModified": 1789770686,
"narHash": "sha256-uZkBR7yHdIKUFB5SZdfgh1qkGfI3XmYmI/lTiquxbck=",
"lastModified": 1792526520,
"narHash": "sha256-3hSJlv8mUVnZPMWK2+CM7a9O+nR6Z4mCh27NfLCmTPc=",
"owner": "nix-community",
"repo": "disko",
"rev": "725ea35e410ad83be4931d1bff7e090eacaf3563",
"rev": "cedd626e11b635470fa6f9fdb8ad79b0075dd7f9",
"type": "github"
},
"original": {
@@ -332,11 +332,11 @@
"rust-overlay": "rust-overlay_2"
},
"locked": {
"lastModified": 1790052168,
"narHash": "sha256-cfZ9EL0rRfoB7KnZRgRmk36YJhjfutqDjzew1lJYwEg=",
"lastModified": 1792684031,
"narHash": "sha256-wBjRHntxoxT+fo85i0rct/NWN/OG/Z6nVky/Efb2gjE=",
"owner": "mattwparas",
"repo": "helix",
"rev": "7915ec19939d8ae3ab4cfff278eaf23ae3784351",
"rev": "424add100eac9ca258d969b985a8ac370469ec05",
"type": "github"
},
"original": {
@@ -353,11 +353,11 @@
]
},
"locked": {
"lastModified": 1790292277,
"narHash": "sha256-z+knvdMItRrMonmG4RIsqKYIa/hwYUzKjotDTfC5DDc=",
"lastModified": 1793193205,
"narHash": "sha256-X6xa6sGA7RnJQuZGbFMC+K+KToWAlBDCCjJXfTwEPsw=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "4b9add8645d5e2b0f7de18f7a442d08fe2bdcc91",
"rev": "095fef2f265c3c0da4fe315efba8f8a04495ab34",
"type": "github"
},
"original": {
@@ -411,11 +411,11 @@
]
},
"locked": {
"lastModified": 1786464367,
"narHash": "sha256-k58p4wbzIXWyRWrW84pP8tD+iaZSSYiiM+fr0Auk4oU=",
"lastModified": 1791066858,
"narHash": "sha256-hLh6ALHrGpgYm8viWCo1pO+ErC22YDGdAvVPcfYsXA8=",
"owner": "hyprwm",
"repo": "hyprgraphics",
"rev": "7c895c44e3ca6d28ed68ddd80ec02b02b925e7fc",
"rev": "80c7d00f2236732853e390019ff8d79d17fa3612",
"type": "github"
},
"original": {
@@ -432,6 +432,7 @@
"hyprland-guiutils": "hyprland-guiutils",
"hyprland-protocols": "hyprland-protocols",
"hyprlang": "hyprlang",
"hyprtoolkit": "hyprtoolkit",
"hyprutils": "hyprutils",
"hyprwayland-scanner": "hyprwayland-scanner",
"hyprwire": "hyprwire",
@@ -441,16 +442,16 @@
"xdph": "xdph"
},
"locked": {
"lastModified": 1786555543,
"narHash": "sha256-sZWUA497m3OuyZqt1KUa5cPR43Zk1X/L3qZa64mIxDs=",
"lastModified": 1793183825,
"narHash": "sha256-MMn1clKPz3FyrFEq39OqXZ2SO3QBaOOFtAFVIcO+VvU=",
"owner": "hyprwm",
"repo": "Hyprland",
"rev": "1256bd180e7677aadd715e59351c09fb16e48efc",
"rev": "0aa6745f705f2c4b0a5004eb019ef76e5bbdb426",
"type": "github"
},
"original": {
"owner": "hyprwm",
"ref": "1256bd1",
"ref": "v0.57.0",
"repo": "Hyprland",
"type": "github"
}
@@ -469,7 +470,10 @@
"hyprland",
"hyprlang"
],
"hyprtoolkit": "hyprtoolkit",
"hyprtoolkit": [
"hyprland",
"hyprtoolkit"
],
"hyprutils": [
"hyprland",
"hyprutils"
@@ -488,11 +492,11 @@
]
},
"locked": {
"lastModified": 1786464504,
"narHash": "sha256-7sHwM86KILQyHDHDuE2SDBlQ2jvZ0EW3hY7sW009/cg=",
"lastModified": 1791805511,
"narHash": "sha256-p7R3xnbJf6MqvgWAmR86PkHUba97Fotm8RR16tYDF9I=",
"owner": "hyprwm",
"repo": "hyprland-guiutils",
"rev": "4c30cf3097ea963c0e250749ee0c59f8b08816d6",
"rev": "204f39d6c7a4aca7042587d4638e19cdeccf63bc",
"type": "github"
},
"original": {
@@ -518,11 +522,11 @@
]
},
"locked": {
"lastModified": 1790062321,
"narHash": "sha256-MKb+sbGuRyd+As1fNoxPNJRC6B+hLahvSPGuwPskOXw=",
"lastModified": 1792508453,
"narHash": "sha256-y+V5RFJcjnV1+ZzImkfiSJ97iDIflanjP2OR9lemvTs=",
"owner": "hyprwm",
"repo": "hyprland-plugins",
"rev": "b29b8293039490d0361e9f15289d361653d8aabf",
"rev": "d2427d4d15b36df40468f5a58bbd67cdba19835d",
"type": "github"
},
"original": {
@@ -543,11 +547,11 @@
]
},
"locked": {
"lastModified": 1772460177,
"narHash": "sha256-/6G/MsPvtn7bc4Y32pserBT/Z4SUUdBd4XYJpOEKVR4=",
"lastModified": 1792149240,
"narHash": "sha256-g09dB6NCTzD4F6YgYrGXRhUfG52xwxUtlMAbHvv/1gE=",
"owner": "hyprwm",
"repo": "hyprland-protocols",
"rev": "1cb6db5fd6bb8aee419f4457402fa18293ace917",
"rev": "044a434ec371f985655389bcef09286b1af3d77c",
"type": "github"
},
"original": {
@@ -589,46 +593,39 @@
"inputs": {
"aquamarine": [
"hyprland",
"hyprland-guiutils",
"aquamarine"
],
"hyprgraphics": [
"hyprland",
"hyprland-guiutils",
"hyprgraphics"
],
"hyprlang": [
"hyprland",
"hyprland-guiutils",
"hyprlang"
],
"hyprutils": [
"hyprland",
"hyprland-guiutils",
"hyprutils"
],
"hyprwayland-scanner": [
"hyprland",
"hyprland-guiutils",
"hyprwayland-scanner"
],
"nixpkgs": [
"hyprland",
"hyprland-guiutils",
"nixpkgs"
],
"systems": [
"hyprland",
"hyprland-guiutils",
"systems"
]
},
"locked": {
"lastModified": 1785930473,
"narHash": "sha256-DitTu625BhEYpZjtjxtGpjrEJwPwW+X/+jJvhSZNSJM=",
"lastModified": 1791849226,
"narHash": "sha256-q9Kgz/ZSo6ftVliPGQuRZYWYp3eK4vggO0IR6LcsWl0=",
"owner": "hyprwm",
"repo": "hyprtoolkit",
"rev": "af515b69dfbe366dc7873aa1475cb2f4db3ebad7",
"rev": "2907e0d1f8a3a540737a0e738acc40d48ad7ba0d",
"type": "github"
},
"original": {
@@ -649,11 +646,11 @@
]
},
"locked": {
"lastModified": 1786464080,
"narHash": "sha256-W1hxvumEM57yV+QwsZ4QdAHEqOkr7e4S8VAkLX60qDE=",
"lastModified": 1792673440,
"narHash": "sha256-7l2+xIZ7IU9r4h9ngSrGH7oQs8XZj0NR0V+96wkN8zk=",
"owner": "hyprwm",
"repo": "hyprutils",
"rev": "c157fe1e3092b980cc69315a6631f89aff09dcce",
"rev": "0d13d5a624eb093b600d1b2cbe448fb613c86424",
"type": "github"
},
"original": {
@@ -703,11 +700,11 @@
]
},
"locked": {
"lastModified": 1786464294,
"narHash": "sha256-ZQsZ2WvBdkboCIyh8LStDPdAIARmxzn0XMNxxoOhjPE=",
"lastModified": 1792081530,
"narHash": "sha256-SRs96bR3VbViiQ1vOhZOqy/HxczIWCoHaGKhncwr1js=",
"owner": "hyprwm",
"repo": "hyprwire",
"rev": "4ce7cd6b6128c1ac41caf23c58a30a26b327f9dd",
"rev": "a546e42d45e161682f729ebf52375bd4800d7041",
"type": "github"
},
"original": {
@@ -718,11 +715,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1786247143,
"narHash": "sha256-8S3Kcxs7D4UtxJxSJZz0m14CGhuW0MxfrIwJxeGWGnQ=",
"lastModified": 1792210252,
"narHash": "sha256-Mh0PUaIv4nFY+8wAGonaEh8iBzwsmdNlwjVHmFg1Biw=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "279b4a8275f032c566576b3f181fa0f27197f588",
"rev": "09063bd1f2b36fd9fd793c36dfade7bd40a93dfc",
"type": "github"
},
"original": {
@@ -750,11 +747,11 @@
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1790218706,
"narHash": "sha256-6e4Na3z008XpdVyOXgfasXIn1aN+z8AXFG+jXdQSyuI=",
"lastModified": 1793183032,
"narHash": "sha256-56mFMf8heLNfYhcgbrh4GpN5x+G9JOfTFXZC3n6w0qM=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "c508844df6c28fa6dabc1b6af70f3ccbd65c5201",
"rev": "08d3a97586f6b6343b3b5e799980773629432610",
"type": "github"
},
"original": {
@@ -766,11 +763,11 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1790185690,
"narHash": "sha256-xJ+X4hBtOcAFGBOe5nAMyMUeF9foJBmIOu3NjBqBycU=",
"lastModified": 1793110635,
"narHash": "sha256-dhoW6VgFWlaodSY5jrBn+CF2FLmaUvDVgM7+C7T2+NM=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "4975466d324710c576dc11ad614684e6bd8cad8e",
"rev": "31ecbaca1bdefa45dffc409f0250bd8039ea0010",
"type": "github"
},
"original": {
@@ -814,11 +811,11 @@
]
},
"locked": {
"lastModified": 1784288435,
"narHash": "sha256-ReRHaLgr/uVqdD8afFSn+myXIfpHeOhP0yYe0TJqAA8=",
"lastModified": 1791909798,
"narHash": "sha256-VAhpCOmrun/KXimYfR8NM88bciKCui7CqHHhThSzgag=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "43b3c1ab9d40fb1dbb008f451988a91e375825e9",
"rev": "1ba1dbfe28738c9a71c266be6efa5b89e75491a9",
"type": "github"
},
"original": {
@@ -896,11 +893,11 @@
]
},
"locked": {
"lastModified": 1789543870,
"narHash": "sha256-45ikFmtfgBZgMePIm4GevJ9VjDSWO3PGQgOuuwHDpes=",
"lastModified": 1791013993,
"narHash": "sha256-BiFPwFsbFnZH5GfWbQFKYuQNg+67aNQCoRSRNTeJFQc=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "35ca0490d13a3d38c4602d0eb9600a30fa63a367",
"rev": "7470661ba2b51156048af08464b82020223dc942",
"type": "github"
},
"original": {
@@ -916,11 +913,11 @@
]
},
"locked": {
"lastModified": 1790247521,
"narHash": "sha256-TNfgoHsqsYYvaJImlWctfRkh4PseTagzegU1Dgdbehw=",
"lastModified": 1793052255,
"narHash": "sha256-Y/JIHTnMlOabDfyaSBubWGLDIVGihLEUuoMhFvQKaDo=",
"owner": "Mic92",
"repo": "sops-nix",
"rev": "2bd00bd9bb35fe6d114888c8f1c2e946c541dd8f",
"rev": "60182817ee048ac94b4c68ea76d5ef2e8aac730d",
"type": "github"
},
"original": {
@@ -949,11 +946,11 @@
"tinted-zed": "tinted-zed"
},
"locked": {
"lastModified": 1789937675,
"narHash": "sha256-/F9gQpAlPCxheQ9ht/5Fka2JEr/FfuOh9R7ySa9SAGc=",
"lastModified": 1792920263,
"narHash": "sha256-2pkE97wOXAYIn2/Nhs9y+iR0qVT+g/3UtukXdkywxXc=",
"owner": "danth",
"repo": "stylix",
"rev": "abff36bfab11cbdcd0723f41c1b0921e211be6ac",
"rev": "3e27b6c499e507df6e3bb8eca3614f5c95e28140",
"type": "github"
},
"original": {
@@ -1080,11 +1077,11 @@
]
},
"locked": {
"lastModified": 1790276835,
"narHash": "sha256-Y/bf7OmtwrEhdRDTkh4OVAEZX5ixL+io0W/UPJuto+g=",
"lastModified": 1793198875,
"narHash": "sha256-CZR26099bnlOWgLpMOPwdpmocSAGetbepjkP661qml4=",
"owner": "Alexays",
"repo": "Waybar",
"rev": "16843896794a9c595139318420f81f40e84f8c78",
"rev": "f6f73c81818b0a6753c1efb68e0fae2149eac028",
"type": "github"
},
"original": {
@@ -1095,6 +1092,14 @@
},
"xdph": {
"inputs": {
"aquamarine": [
"hyprland",
"aquamarine"
],
"hyprgraphics": [
"hyprland",
"hyprgraphics"
],
"hyprland-protocols": [
"hyprland",
"hyprland-protocols"
@@ -1103,6 +1108,10 @@
"hyprland",
"hyprlang"
],
"hyprtoolkit": [
"hyprland",
"hyprtoolkit"
],
"hyprutils": [
"hyprland",
"hyprutils"
@@ -1121,11 +1130,11 @@
]
},
"locked": {
"lastModified": 1786464334,
"narHash": "sha256-/TBQT5rhBB2Dm4HoZzhGDaCwYmRTs3W3DPhMXFWc/BU=",
"lastModified": 1791822904,
"narHash": "sha256-gsxPblA9YV+By4SxXWkj2HGGk7MKGxiNj/T9bU4q31U=",
"owner": "hyprwm",
"repo": "xdg-desktop-portal-hyprland",
"rev": "9f0e9ff02739cd538d39bd706422dc50e9ca60dd",
"rev": "0121b2e3f85c7ebf6280173f1054f7e5606262d1",
"type": "github"
},
"original": {
@@ -1143,11 +1152,11 @@
"rust-overlay": "rust-overlay_3"
},
"locked": {
"lastModified": 1790032246,
"narHash": "sha256-njp/fLXNAru7mTWbs0p/iHZDMRZE7jLxjsnQei10rNY=",
"lastModified": 1793195788,
"narHash": "sha256-S+4LGf9l8RDFqAJ87HUorHPVasfnnMTE/ysaj3SWIk8=",
"owner": "sxyazi",
"repo": "yazi",
"rev": "0ea4c5d9ef75d7165c2e3b4eb8d713fc11f26c96",
"rev": "ec4ce8f27d7a34045791606ebe83b0795defe4b6",
"type": "github"
},
"original": {
@@ -1159,11 +1168,11 @@
"yazi-plugins": {
"flake": false,
"locked": {
"lastModified": 1789736971,
"narHash": "sha256-O1yYAhsf7xMqUrTTSLac06WSxCvUQqedH3DWqGwn/Ok=",
"lastModified": 1793196370,
"narHash": "sha256-0nD3jSkUt7mcsfPnJ3yBwdJYRY6JVSxVAj4eXEgBWus=",
"owner": "yazi-rs",
"repo": "plugins",
"rev": "f703392df78b5fba5e8f9f1ad0b1cb6d3def9736",
"rev": "896fa5aec1db0163e2f65d07a130d064de53b0b2",
"type": "github"
},
"original": {
+1 -1
View File
@@ -45,7 +45,7 @@
};
hyprland = {
url = "github:hyprwm/Hyprland/1256bd1";
url = "github:hyprwm/Hyprland/v0.57.0";
# inputs.nixpkgs.follows = "nixpkgs";
};
+1
View File
@@ -24,6 +24,7 @@
];
nixpkgs.config.allowBroken = true;
time.timeZone = "Europe/Berlin";
programs.gamemode.enable = true;
services.printing.enable = true;
virtualisation.virtualbox.host.enable = true;
+18 -1
View File
@@ -8,10 +8,27 @@ let
};
in {
wayland.windowManager.hyprland.settings = {
# Keep the animated wallpaper visible through the panel's translucent surface.
layer_rule = [
{
match.namespace = "^waybar$";
blur = true;
# Blur the glass, but exclude its low-alpha CSS shadow from the mask.
ignore_alpha = 0.2;
xray = true;
}
{
match.namespace = "^walker$";
blur = true;
ignore_alpha = 0.08;
xray = true;
}
];
monitor = [
{
output = "DP-3";
mode = "1920x1080@165";
mode = "2560x1440@100";
position = "0x0";
scale = 1;
}
+1
View File
@@ -23,6 +23,7 @@
nix.settings.cores = 3;
nixpkgs.config.allowBroken = true;
time.timeZone = "Europe/Berlin";
programs.gamemode.enable = true;
hardware.bluetooth.enable = true;
host.laptop = true;
+8 -1
View File
@@ -1,4 +1,4 @@
{ pkgs, inputs, ... }: {
{ pkgs, inputs, lib, config, ... }: {
imports = [
./host/bluetooth.nix
./host/bootloader.nix
@@ -24,6 +24,13 @@
hyprland.package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
};
environment.systemPackages = [
inputs.hyprland.inputs.hyprland-guiutils.packages.${pkgs.stdenv.hostPlatform.system}.default
];
security.wrappers.Hyprland.source = lib.mkForce
"${config.programs.hyprland.package}/bin/.Hyprland-wrapped";
xdg.portal = {
enable = true;
xdgOpenUsePortal = true;
+2 -2
View File
@@ -1,7 +1,7 @@
{ pkgs-pinned, lib, ... }: {
{ pkgs, lib, ... }: {
programs.clash-verge = {
enable = true;
package = pkgs-pinned.clash-verge-rev;
package = pkgs.clash-verge-rev;
serviceMode = true;
tunMode = true;
autoStart = true;
+1
View File
@@ -5,6 +5,7 @@
./user/helix.nix
./user/hyprland.nix
./user/hyprlock.nix
../user/sweetbread/modules/lucid.nix
./user/mako.nix
./user/neofetch.nix
./user/qt.nix
File diff suppressed because it is too large. Load diff
+12 -1
View File
@@ -1,6 +1,17 @@
{ inputs, pkgs, lib, config, ... }: let
helixSteel =
inputs.helix-steel.packages.${pkgs.system}.default.overrideAttrs (old: {
(inputs.helix-steel.packages.${pkgs.system}.default.override {
grammarOverlays = [
(_: prev: {
perl = prev.perl.overrideAttrs (old: {
postPatch = (old.postPatch or "") + ''
substituteInPlace src/bsearch.c --replace-fail 'void *bsearch(' 'void *tsp_bsearch('
substituteInPlace src/tsp_unicode.h --replace-fail 'return bsearch(' 'return tsp_bsearch('
'';
});
})
];
}).overrideAttrs (old: {
cargoBuildFlags = (old.cargoBuildFlags or []) ++ [
"--features"
"steel,git"
+6
View File
@@ -32,6 +32,7 @@ in {
ghostty
pamixer
clipse
cliphist
wl-clipboard
wl-clip-persist
xclip
@@ -152,6 +153,11 @@ in {
bind = [
(bind "SUPER + V" (exec "ghostty --title=clipse -e clipse"))
(bind "SUPER + SHIFT + V" (exec "qs ipc call launcher clipboard"))
(bind "Print" (exec "qs ipc call snap toggle"))
(bind "SUPER + Print" (exec "qs ipc call screenshot full"))
(bind "CTRL + Print" (exec "qs ipc call snap region"))
(bind "ALT + Print" (exec "qs ipc call snap window"))
(bind "SUPER + RETURN" (exec "ghostty"))
(bind "SUPER + Q" "hl.dsp.window.close()")
(bind "SUPER + M" "hl.dsp.exit()")
+3
View File
@@ -0,0 +1,3 @@
{
"pinnedApps": []
}
+12
View File
@@ -0,0 +1,12 @@
{
"barEnabled": true,
"dockEnabled": true,
"widgetsEnabled": true,
"widgetOnTop": false,
"widgetHideFullscreen": true,
"desktopIcons": false,
"toastEnabled": true,
"liveWallpapers": true,
"wallpaperFolder": "/home/sweetbread/Wallpapers",
"fontFamily": "Pixeloid Sans"
}
+138
View File
@@ -0,0 +1,138 @@
import "./luciddocks"
import "./lucidedit"
import "./lucidosd"
import "./lucidprefs"
import "./lucidshot"
import "./lucidwidgets"
import QtQuick
import Quickshell
import qs
ShellRoot {
id: root
Component.onCompleted: {
void Clip.probed;
void Capture.state;
}
function announceShot(entry) {
if (Prefs.shotPreview === "preview") {
shotCards.show(entry);
return;
}
if (Prefs.shotPreview !== "notify")
return;
const where = String(entry.file).replace(Quickshell.env("HOME"), "~");
if (entry.kind === "video")
Quickshell.execDetached(["notify-send", "-a", "LucidShot", "-i", "media-record", "Recording saved", where]);
else
Quickshell.execDetached(["sh", "-c", "a=$(notify-send -a LucidShot -i \"$1\" -A 'edit=Mark up' -A 'open=Open' --wait \"$2\" \"$3\"); case \"$a\" in edit) qs ipc call snap edit \"$1\" ;; open) xdg-open \"$1\" ;; esac; true", "sh", entry.file, entry.temp ? "Screenshot copied" : "Screenshot saved", entry.temp ? "It is on the clipboard only" : where]);
}
ShotEngine {
id: shotEngine
cards: shotCards
onReady: (entry) => {
if (entry.owner === "overlay") {
shotCards.update(entry);
return;
}
if (entry.owner === "pin")
return;
root.announceShot(entry);
}
onFailed: (id, why) => toastMod.popup("warning", why, true)
onTextRead: (r) => {
if (!shotEngine.claim(r.id))
return;
if (r.status === "ok") {
if (Prefs.shotPreview === "preview")
shotCards.show({ "id": r.id, "kind": "text", "text": r.text, "codes": r.codes, "screen": Monitors.focusedScreen ? Monitors.focusedScreen.name : "" });
else
toastMod.popup("copy", "Text copied", false);
} else if (r.status === "notool") {
toastMod.popup("alert", "Install tesseract to copy text", true);
} else {
toastMod.popup("alert", "No text found", true);
}
}
}
ShotOverlay {
id: shotOverlay
engine: shotEngine
cards: shotCards
pins: shotPins
onNotify: (icon, text, warn) => toastMod.popup(icon, text, warn)
onSwatch: (hex, text) => toastMod.popupSwatch(hex, text)
onFreezeFailed: (why) => toastMod.popup("alert", "Couldn't capture the screen", true)
}
ShotCards {
id: shotCards
engine: shotEngine
pins: shotPins
overlay: shotOverlay
}
PinBoard {
id: shotPins
engine: shotEngine
}
RecordHud {}
Connections {
target: Capture
function onSaved(file, seconds) {
root.announceShot({ "id": "rec-" + Date.now(), "kind": "video", "file": file, "duration": seconds, "screen": Capture.output });
}
function onFailed(why) {
toastMod.popup("warning", why, true);
}
}
LucidBar {
id: barRoot
dock: dockRoot
toastMod: toastMod
}
Dock {
id: dockRoot
}
Toast {
id: toastMod
}
ToastEvents {
toast: toastMod
}
Binding {
target: toastMod
property: "screen"
value: Monitors.shellPlacement
when: Monitors.shellPlacement !== null
}
WidgetLayer {
}
WidgetIpc {
}
EditLayer {
}
SettingsHost {
}
Binding {
target: Monitors
property: "barWindows"
value: barRoot.instances
}
}
+20
View File
@@ -0,0 +1,20 @@
{
"nextId": 3,
"boardFull": true,
"instances": [
{
"uid": "w1",
"type": "clock",
"variant": "digital",
"wx": 40,
"wy": 70
},
{
"uid": "w2",
"type": "system",
"variant": "rings",
"wx": 40,
"wy": 250
}
]
}
+179 -2
View File
@@ -1,16 +1,193 @@
{ lib, ... }:
let
{ config, lib, osConfig, ... }: let
hyprLua = import ./hyprland/lua.nix { inherit lib; };
colors = config.lib.stylix.colors.withHashtag;
accent = colors.${config.stylix.accent};
in {
services = {
walker = {
enable = true;
systemd.enable = true;
theme = {
name = "stylix";
# Follow Walker's default CSS structure so provider layouts keep their styling.
# https://github.com/abenz1267/walker/blob/master/resources/themes/default/style.css
style = ''
@define-color window_bg_color ${colors.base00};
@define-color surface_color ${colors.base01};
@define-color border_color ${colors.base03};
@define-color accent_bg_color ${accent};
@define-color theme_fg_color ${colors.base05};
@define-color error_bg_color ${colors.base08};
@define-color error_fg_color ${colors.base00};
* {
all: unset;
}
popover {
background: @surface_color;
border: 1px solid @border_color;
border-radius: 18px;
padding: 10px;
font-family: "${config.stylix.fonts.sansSerif.name}";
font-size: ${toString config.stylix.fonts.sizes.applications}pt;
}
.box-wrapper {
box-shadow:
0 19px 38px rgba(0, 0, 0, 0.3),
0 15px 12px rgba(0, 0, 0, 0.22);
background: @window_bg_color;
border: 1px solid @border_color;
border-radius: 20px;
padding: 20px;
font-family: "${config.stylix.fonts.sansSerif.name}";
font-size: ${toString config.stylix.fonts.sizes.applications}pt;
}
.normal-icons { -gtk-icon-size: 16px; }
.large-icons { -gtk-icon-size: 32px; }
scrollbar { opacity: 0; }
.search-container { border-radius: 10px; }
.input {
caret-color: @theme_fg_color;
background: @surface_color;
padding: 10px;
color: @theme_fg_color;
}
.input placeholder { opacity: 0.5; }
.input selection { background: ${colors.base02}; }
.preview-box,
.elephant-hint,
.placeholder,
.list { color: @theme_fg_color; }
.item-box {
border-radius: 10px;
padding: 10px;
}
.item-quick-activation {
background: alpha(@accent_bg_color, 0.25);
border-radius: 5px;
padding: 10px;
}
child:selected .item-box,
row:selected .item-box { background: alpha(@accent_bg_color, 0.25); }
.item-subtext {
font-size: 12px;
opacity: 0.5;
}
.providerlist .item-subtext {
font-size: unset;
opacity: 0.75;
}
.item-image-text { font-size: 28px; }
.preview {
border: 1px solid alpha(@accent_bg_color, 0.25);
border-radius: 10px;
color: @theme_fg_color;
}
.calc .item-text,
.symbols .item-image,
.todo.urgent { font-size: 24px; }
.todo.done .item-text-box { opacity: 0.25; }
.todo.active { font-weight: bold; }
.bluetooth.disconnected { opacity: 0.5; }
.preview .large-icons { -gtk-icon-size: 64px; }
.keybinds {
padding-top: 10px;
border-top: 1px solid @border_color;
font-size: 12px;
color: @theme_fg_color;
}
.keybind-button { opacity: 0.5; }
.keybind-button:hover { opacity: 0.75; }
.keybind-bind {
text-transform: lowercase;
opacity: 0.35;
}
.keybind-label {
padding: 2px 4px;
border-radius: 4px;
border: 1px solid @theme_fg_color;
}
.error {
padding: 10px;
background: @error_bg_color;
color: @error_fg_color;
}
:not(.calc).current { font-style: italic; }
.preview-content.archlinuxpkgs,
.preview-content.dnfpackages,
.preview-content.aptpackages {
font-family: "${config.stylix.fonts.monospace.name}";
}
'' + lib.optionalString (config.home.username == "chest" && osConfig.networking.hostName == "Eclipse") ''
/* Keep the existing layout; let the compositor blur the wallpaper. */
window { background: transparent; }
.box-wrapper {
background: alpha(@surface_color, 0.62);
border: 2px solid alpha(@accent_bg_color, 0.38);
padding: 19px;
box-shadow: none;
}
.input {
background: alpha(${colors.base02}, 0.42);
border-radius: 10px;
}
popover {
background: alpha(@surface_color, 0.86);
border: 2px solid alpha(@accent_bg_color, 0.38);
padding: 9px;
}
/* Paint only the rounded item, never both its row and child. */
child, row,
child:hover, row:hover,
child:selected, row:selected {
background: transparent;
border-radius: 10px;
}
child:hover .item-box,
row:hover .item-box {
background: alpha(@accent_bg_color, 0.12);
}
child:selected .item-box,
row:selected .item-box {
background: alpha(@accent_bg_color, 0.25);
}
'';
};
};
elephant.enable = true;
};
xdg.configFile = lib.optionalAttrs (config.home.username == "chest") {
"elephant/desktopapplications.toml".text = ''
history_when_empty = true
'';
};
wayland.windowManager.hyprland.settings.bind = [
(hyprLua.bind "SUPER + D" (hyprLua.exec "walker"))
];
+117 -3
View File
@@ -1,4 +1,29 @@
{ pkgs, config, lib, ... }: let
{ pkgs, config, lib, osConfig, inputs, ... }: let
mikuFrost = osConfig.networking.hostName == "Eclipse";
colors = config.lib.stylix.colors.withHashtag;
accent = colors.${config.stylix.accent};
# Render the same Stylix templates, changing only native translucency and accent.
kvantumConfig = config.lib.stylix.colors {
template = builtins.readFile "${inputs.stylix}/modules/qt/kvconfig.mustache";
extension = ".kvconfig";
};
kvantumSvg = config.lib.stylix.colors {
template = builtins.readFile "${inputs.stylix}/modules/qt/kvantum.svg.mustache";
extension = ".svg";
};
frostKvantum = pkgs.runCommandLocal "miku-frost-kvantum" {} ''
directory="$out/share/Kvantum/Base16Kvantum"
mkdir -p "$directory"
cp ${kvantumConfig} "$directory/Base16Kvantum.kvconfig"
cp ${kvantumSvg} "$directory/Base16Kvantum.svg"
substituteInPlace "$directory/Base16Kvantum.kvconfig" \
--replace-fail 'translucent_windows=false' 'translucent_windows=true' \
--replace-fail 'blurring=false' 'blurring=true' \
--replace-fail 'reduce_window_opacity=10' 'reduce_window_opacity=18' \
--replace-fail 'highlight.color=${colors.base0E}' 'highlight.color=${accent}'
substituteInPlace "$directory/Base16Kvantum.svg" \
--replace-fail '${colors.base0D}' '${accent}'
'';
miku-cursor = pkgs.stdenv.mkDerivation {
name = "Miku cursor";
@@ -86,10 +111,46 @@ in {
hyprland.enable = false;
waybar.enable = false;
kitty.variant256Colors = true;
gtk.extraCss = lib.mkIf mikuFrost ''
/* Native background alpha keeps text and controls fully opaque. */
@define-color accent_color ${accent};
@define-color accent_bg_color ${accent};
@define-color theme_selected_bg_color ${accent};
@define-color window_bg_color alpha(${colors.base01}, 0.78);
@define-color view_bg_color alpha(${colors.base00}, 0.48);
@define-color headerbar_bg_color alpha(${colors.base01}, 0.76);
@define-color headerbar_backdrop_color @window_bg_color;
@define-color sidebar_bg_color alpha(${colors.base01}, 0.72);
@define-color sidebar_backdrop_color @window_bg_color;
@define-color dialog_bg_color alpha(${colors.base01}, 0.84);
@define-color popover_bg_color alpha(${colors.base01}, 0.90);
@define-color theme_bg_color @window_bg_color;
@define-color theme_base_color @view_bg_color;
'';
};
base16Scheme = "${pkgs.base16-schemes}/share/themes/eris.yaml";
accent = "base0E";
# Keep a file-backed scheme for consumers such as Neofetch.
base16Scheme = if mikuFrost then toString (pkgs.writeText "miku-frost.yaml" ''
scheme: "Miku Frost"
author: "chest"
base00: "101724"
base01: "192534"
base02: "253247"
base03: "47586B"
base04: "93A8BA"
base05: "E1EFF2"
base06: "F1F8F8"
base07: "F9FFFF"
base08: "EF829A"
base09: "F5AB82"
base0A: "EED69A"
base0B: "69DCC7"
base0C: "43D6CD"
base0D: "7BB9E8"
base0E: "B29DF4"
base0F: "E3A8D8"
'') else "${pkgs.base16-schemes}/share/themes/eris.yaml";
accent = if mikuFrost then "base0C" else "base0E";
polarity = "dark";
image = pkgs.fetchurl {
@@ -132,6 +193,59 @@ in {
};
};
qt.kvantum.themes = lib.mkIf mikuFrost (lib.mkForce [ frostKvantum ]);
# Notifications share the island's surface and rounded, borderless silhouette.
services.mako.settings = lib.mkIf mikuFrost {
background-color = lib.mkForce "${colors.base01}D9";
text-color = lib.mkForce colors.base05;
border-size = lib.mkForce 0;
border-radius = 22;
padding = "12";
progress-color = lib.mkForce "over ${accent}33";
"urgency=low".background-color = lib.mkForce "${colors.base01}D9";
"urgency=critical" = {
background-color = lib.mkForce "${colors.base01}F0";
text-color = lib.mkForce colors.base08;
};
};
# Yazi uses its own true-colour theme rather than the terminal ANSI palette.
programs.yazi.theme = lib.mkIf mikuFrost {
filetype.rules = lib.mkBefore [
{ url = "*/"; fg = colors.base05; bold = false; }
];
icon.conds = lib.mkBefore [
{ "if" = "dir"; text = ""; fg = accent; }
];
mgr.border_style.fg = lib.mkForce colors.base03;
indicator = {
current = { fg = colors.base05; bg = lib.mkForce colors.base02; };
preview = { fg = colors.base05; bg = lib.mkForce colors.base02; };
};
tabs = {
active = { fg = lib.mkForce colors.base00; bg = lib.mkForce accent; };
inactive = { fg = lib.mkForce colors.base04; bg = lib.mkForce colors.base01; };
};
mode = {
normal_main = { fg = lib.mkForce colors.base00; bg = lib.mkForce accent; };
normal_alt = { fg = lib.mkForce accent; bg = lib.mkForce colors.base01; };
};
input = {
border.fg = lib.mkForce accent;
selected.bg = lib.mkForce colors.base02;
};
pick.border.fg = lib.mkForce accent;
completion.border.fg = lib.mkForce accent;
tasks.border.fg = lib.mkForce accent;
};
# Keep the original terminal glass, with colours inherited from Stylix.
programs.ghostty.themes.stylix = lib.mkIf mikuFrost {
background = lib.mkForce config.lib.stylix.colors.base00;
cursor-color = lib.mkForce config.lib.stylix.colors.base0C;
};
dconf.settings = {
"org/gnome/desktop/interface".color-scheme = "prefer-dark";
};
+132 -26
View File
@@ -5,7 +5,9 @@
pkgs,
lib,
...
}: {
}: let
mikuFrost = osConfig.networking.hostName == "Eclipse";
in {
home.packages = with pkgs; [
font-awesome
nerd-fonts.symbols-only
@@ -17,7 +19,11 @@
programs.waybar = {
enable = true;
systemd.enable = true;
package = inputs.waybar.packages.${pkgs.stdenv.hostPlatform.system}.default;
package = inputs.waybar.packages.${pkgs.stdenv.hostPlatform.system}.default.overrideAttrs (old: {
postPatch = (old.postPatch or "") + ''
mv subprojects/cava-1.0.0 subprojects/libcava
'';
});
settings.mainBar = {
modules-center = [
@@ -55,11 +61,20 @@
"pulseaudio"
"custom/sep-left"
"battery"
] ++ lib.optional mikuFrost "custom/sep-battery" ++ [
"clock"
];
};
"hyprland/workspaces" = lib.optionalAttrs mikuFrost {
tooltip = false;
};
tray = lib.optionalAttrs mikuFrost {
tooltip = false;
};
cava = {
bars = 9;
bar_delimiter = 0;
@@ -75,6 +90,7 @@
};
pulseaudio = {
tooltip = !mikuFrost;
format = "{icon} {volume}%";
format-icons = {
headphone = "";
@@ -90,18 +106,20 @@
};
mpris = {
tooltip = !mikuFrost;
format = "{dynamic}";
dynamic-len = if osConfig.host.laptop then 16 else 32;
dynamic-order = [ "title" "artist" "album" ];
};
battery = {
tooltip = !mikuFrost;
interval = 5;
states = {
warning = 30;
critical = 15;
};
format = "{icon} {capacity}% | ";
format = if mikuFrost then "{icon} {capacity}%" else "{icon} {capacity}% | ";
format-icons = {
default = ["󰂎" "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹"];
charging = ["󰢟" "󰢜" "󰂆" "󰂇" "󰂈" "󰢝" "󰂉" "󰢞" "󰂊" "󰂋" "󰂅"];
@@ -113,7 +131,17 @@
tooltip = false;
};
# Follow battery visibility; the divider has no hover or click target.
"custom/sep-battery" = {
format = " {} ";
exec = "printf '|'";
tooltip = false;
exec-if = "for battery in /sys/class/power_supply/*; do test \"$(cat \"$battery/type\" 2>/dev/null)\" = Battery && exit 0; done; exit 1";
interval = 5;
};
"keyboard-state" = {
tooltip = !mikuFrost;
capslock = true;
format = "{icon}";
format-icons = {
@@ -123,6 +151,7 @@
};
"hyprland/language" = {
tooltip = !mikuFrost;
format-en = "en";
format-ru = "ru";
};
@@ -142,6 +171,7 @@
};
network = {
tooltip = !mikuFrost;
format = "{ifname}";
format-wifi = " {essid} ({signalStrength}%)";
format-ethernet = "{ifname}";
@@ -167,6 +197,7 @@
};
cpu = {
tooltip = !mikuFrost;
interval = 2;
format = "{usage}% ";
min-length = 6;
@@ -184,47 +215,97 @@
style = let
colors = config.lib.stylix.colors.withHashtag;
accent = colors.${config.stylix.accent};
themed = frost: original: if mikuFrost then frost else original;
scssFile = pkgs.writeText "waybar.scss" /*scss*/ ''
window#waybar {
background: transparent;
color: ${colors.base05};
font-weight: bold;
font-size: .85em;
& > * { padding: 0 0 6px 0; }
& > * { padding: ${themed "0 12px 14px" "0 0 6px 0"}; }
}
${lib.optionalString mikuFrost /*scss*/ ''
// Only the centered island paints a surface or a shadow.
window#waybar,
window#waybar > box {
background: transparent;
background-image: none;
border: none;
box-shadow: none;
}
''}
.modules-center {
background: ${colors.base01}CC;
border-radius: 12px;
background: ${themed "rgba(${colors.base01}, 0.58)" "${colors.base01}CC"};
border: none;
border-radius: ${themed "22px" "12px"};
padding: 10px;
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.4);
box-shadow: ${themed "0 3px 8px rgba(0, 0, 0, 0.18)" "5px 5px 10px rgba(0, 0, 0, 0.4)"};
}
#left,
#right,
#center {
background: ${colors.base02};
background: ${themed "rgba(40, 59, 79, 0.68)" colors.base02};
padding: 0 2px;
margin: 0 8px;
border-radius: 8px;
border-radius: ${themed "12px" "8px"};
}
#left { margin-left: 0; }
#right { margin-right: 0; }
#clock { padding-right: 10px; }
${lib.optionalString mikuFrost /*scss*/ ''
// Keep hover surfaces inside the rounded groups.
#language, #keyboard-state, #keyboard-state label,
#cava, #mpris, #tray widget, #tray widget > image,
#network, #custom-mem, #cpu, #temperature,
#pulseaudio, #battery, #clock {
border-radius: 10px;
}
#cava { padding: 0 10px; }
#network, #custom-mem, #cpu, #temperature,
#pulseaudio, #battery, #clock {
padding-left: 6px;
padding-right: 6px;
}
// Reserve the same width in active, inactive and hover states.
#workspaces button {
box-shadow: none;
text-shadow: none;
background-image: none;
}
tooltip {
color: ${colors.base05};
background: rgba(25, 37, 52, 0.94);
border: 2px solid rgba(67, 214, 205, 0.38);
border-radius: ${themed "12px" "8px"};
}
tooltip label { padding: 6px; }
''}
#clock { padding-right: ${themed "6px" "10px"}; }
#cava { padding: 0 10px; color: ${themed accent colors.base05}; }
#custom-sep-left,
#custom-sep-battery {
color: ${themed "rgba(147, 168, 186, 0.38)" colors.base05};
background: transparent;
}
#language { padding: 8px; }
#workspaces button {
color: ${colors.base05};
color: ${themed colors.base04 colors.base05};
padding: 0 2px;
border-radius: 999px;
border: 1pt solid transparent;
min-width: 20px;
min-width: ${themed "25px" "20px"};
&:hover { background: ${colors.base03}; }
&:hover { background: ${themed "rgba(67, 214, 205, 0.12)" colors.base03}; }
&.active {
background: ${accent};
@@ -232,27 +313,50 @@
min-width: 25px;
&:hover {
border-color: ${accent};
background: ${colors.base03};
border-color: ${themed "transparent" accent};
background: ${themed "rgba(67, 214, 205, 0.12)" colors.base03};
color: ${accent};
}
}
}
#mpris {
border-radius: 8px;
padding: 4px;
&:hover { background: ${colors.base03}; }
border-radius: ${themed "10px" "8px"};
// Do not leave a styled placeholder when the player has no text.
padding: ${themed "0" "4px"};
border: none;
&:hover { background: ${themed "rgba(67, 214, 205, 0.12)" colors.base03}; }
&.playing {
border: 2px solid ${accent};
padding: 2px;
border: ${themed "none" "2px solid ${accent}"};
padding: ${themed "0" "2px"};
color: ${themed colors.base0E colors.base05};
}
}
${if mikuFrost then /*scss*/ ''
// Each SNI item is one event box containing one image. Paint it once.
#tray > widget {
border: none;
border-radius: 10px;
padding: 0;
background: transparent;
}
#tray > widget:hover {
background: rgba(67, 214, 205, 0.12);
}
#tray > widget > image {
padding: 8px;
margin: 0;
background: transparent;
}
#tray > widget.needs-attention {
background: rgba(245, 171, 130, 0.16);
}
'' else /*scss*/ ''
#tray {
widget {
border: 1pt solid transparent;
&:hover { background: ${colors.base03}; }
&:hover { background: ${themed "rgba(67, 214, 205, 0.12)" colors.base03}; }
& > image { padding: 8px; }
}
@@ -260,21 +364,23 @@
& > .needs-attention { border-color: ${colors.base09}; }
}
''}
#pulseaudio {
&:hover { background: ${colors.base03}; }
&:hover { background: ${themed "rgba(67, 214, 205, 0.12)" colors.base03}; }
&.muted {
background: ${colors.base08};
color: ${colors.base01};
&:hover {
color: ${colors.base08};
background: ${colors.base03};
background: ${themed "rgba(67, 214, 205, 0.12)" colors.base03};
}
}
}
#network {
&:hover { background: ${colors.base02}; }
&:hover { background: ${themed "rgba(67, 214, 205, 0.12)" colors.base02}; }
&.disconnected {
color: ${colors.base00};
background: ${colors.base08};
@@ -282,7 +388,7 @@
}
#system .drawer-child > * {
margin-right: 4px
margin-right: 4px;
}
#keyboard-state label.locked {
+8 -11
View File
@@ -1,4 +1,4 @@
{ pkgs, lib, config, osConfig, inputs, ... }: {
{ pkgs, lib, config, osConfig, ... }: {
wayland.windowManager.hyprland = let
colors = config.lib.stylix.colors;
accent = colors.${config.stylix.accent};
@@ -10,7 +10,7 @@
} /*py*/ ''
import requests as requests
from random import choice
from os import listdir, makedirs, remove, replace, system
from os import listdir, makedirs, remove, replace
from os.path import exists
from subprocess import run
@@ -123,7 +123,10 @@
finally:
if filename is not None:
notify("Applying wallpaper", 100)
system(f"awww img {folder}/{filename} --transition-type center")
run([
"${config.home.homeDirectory}/.config/hypr/scripts/wallpaper/set-wallpaper.sh",
f"{folder}/{filename}",
], check=False)
'';
in {
settings = {
@@ -188,10 +191,6 @@
{ leaf = "workspaces"; enabled = true; speed = 6; bezier = "default"; }
];
on = [
(hyprLua.onStart [ "${lib.getExe wallpaper_changer}" ])
];
workspace_rule = [
{
workspace = "2";
@@ -200,10 +199,8 @@
];
bind = [
(hyprLua.bind "Print" (hyprLua.exec "${lib.getExe pkgs.hyprshot} -z -o ~/Screenshots -m active -m output"))
(hyprLua.bind "CTRL + Print" (hyprLua.exec "${lib.getExe pkgs.hyprshot} -z -o ~/Screenshots -m region"))
(hyprLua.bind "ALT + Print" (hyprLua.exec "${lib.getExe pkgs.hyprshot} -z -o ~/Screenshots -m active -m window"))
(hyprLua.bind "SUPER + W" (hyprLua.exec "${lib.getExe wallpaper_changer}"))
(hyprLua.bind "SUPER + W" (hyprLua.exec "qs ipc call launcher wallpaper"))
(hyprLua.bind "SUPER + SHIFT + W" (hyprLua.exec "${lib.getExe wallpaper_changer}"))
];
};
};
+238
View File
@@ -0,0 +1,238 @@
{ config, lib, osConfig, pkgs, ... }:
let
liveDecoder = if builtins.elem osConfig.networking.hostName [ "Rias" "Eclipse" ] then "cuda" else "vaapi";
source = pkgs.fetchgit {
url = "https://github.com/Sn3akyy1/lucid.git";
rev = "bdd7f79da18efd837f79dcecbe5d2ec178abc10c";
hash = "sha256-b6qylKjCGYy2Yo64i1w9g4oGrYgcXf502jY9qNNWhSI=";
sparseCheckout = [
"/*"
"!/wallpapers/*"
"!/assets/*.webp"
];
nonConeMode = true;
};
wallpapers = pkgs.fetchgit {
url = "https://github.com/Sn3akyy1/lucid.git";
rev = "bdd7f79da18efd837f79dcecbe5d2ec178abc10c";
hash = "sha256-rXEYlr2bSe6EP6vxyayK7iXHk+Mmqs7duiE0pweIozI=";
sparseCheckout = [ "/wallpapers/catppuccin-mocha/*" ];
nonConeMode = true;
};
wallpaperDir = "${config.home.homeDirectory}/Pictures/wallpapers/stylix";
wallpaperScript = "${config.home.homeDirectory}/.config/hypr/scripts/wallpaper/set-wallpaper.sh";
defaultWallpaper = "${wallpaperDir}/bluehour.jpg";
hyprLua = import ../../../modules/user/hyprland/lua.nix { inherit lib; };
colors = config.lib.stylix.colors.withHashtag;
paletteFile = pkgs.runCommand "lucid-stylix-palette.json" {
nativeBuildInputs = [ pkgs.python3 ];
} ''
python3 - "$out" ${lib.escapeShellArg config.stylix.base16Scheme} \
${lib.escapeShellArg "${source}/support/lucid"} \
${lib.escapeShellArg config.stylix.accent} <<'PY'
import json
import runpy
import sys
from pathlib import Path
output, scheme_path, scripts, accent_key = sys.argv[1:]
sys.path.insert(0, scripts)
from lucid_palette import at_tone
importer = runpy.run_path(str(Path(scripts) / "add-theme.py"))
scheme = importer["parse_base16"](scheme_path, Path(scheme_path).read_text())
if scheme is None:
raise SystemExit("Stylix scheme is not valid Base16")
bg, fg, accents, hints = importer["to_palette"](scheme)
accent_key = accent_key.lower()
hints["primary"] = scheme["colors"][accent_key]
hints["secondary"] = scheme["colors"]["base0d" if accent_key != "base0d" else "base0e"]
hints["tertiary"] = scheme["colors"]["base0c" if accent_key == "base0b" else "base0b"]
palette = importer["build_palette"](
bg, fg, accents, hints, mode="dark" if importer["is_dark"](bg) else "light"
)
if importer["is_dark"](bg):
colors = scheme["colors"]
# Keep the Base16 dark surface ladder. Lucid's built-in Mocha uses base00
# for its main panels, with base01/base02 as the raised surfaces; the
# generic Material builder starts at base02 and makes the whole shell pale.
background_tone = importer["tone"](bg)
darkest = importer["hx"](at_tone(bg, background_tone - 4))
near_background = importer["hx"](at_tone(bg, background_tone - 2))
palette.update({
"surface": colors["base00"],
"surface_dim": darkest,
"surface_bright": importer["hx"](at_tone(bg, background_tone + 8)),
"surface_container_lowest": darkest,
"surface_container_low": near_background,
"surface_container": colors["base00"],
"surface_container_high": colors["base01"],
"surface_container_highest": colors["base02"],
"surface_variant": colors["base01"],
"on_surface_variant": colors["base04"],
"outline": colors["base03"],
"outline_variant": colors["base01"],
})
Path(output).write_text(json.dumps(palette, indent=2) + "\n")
PY
'';
themeMeta = pkgs.writeText "lucid-stylix-meta.json" (builtins.toJSON {
id = "stylix";
name = "Stylix";
desc = "Active Stylix palette";
swatchBg = colors.base00;
swatchAccent = colors.${config.stylix.accent};
source = "Home Manager";
detected = "base16";
user = true;
});
themeName = pkgs.writeText "lucid-current-theme" "stylix\n";
applyTheme = pkgs.writeShellScript "lucid-apply-theme" ''
exec "$HOME/.config/lucid/apply-theme-upstream.sh" --shell-only "$@"
'';
qmlPackages = with pkgs.qt6; [ qt5compat qtmultimedia ];
tesseract = pkgs.tesseract4.override { enableLanguages = [ "eng" "rus" ]; };
lucid = pkgs.writeShellScript "lucid" ''
export NIXPKGS_QT6_QML_IMPORT_PATH="${lib.makeSearchPath "lib/qt-6/qml" qmlPackages}:''${NIXPKGS_QT6_QML_IMPORT_PATH:-}"
export QT_PLUGIN_PATH="${lib.makeSearchPath "lib/qt-6/plugins" qmlPackages}:''${QT_PLUGIN_PATH:-}"
export PATH="${lib.makeBinPath (with pkgs; [ bash cliphist coreutils curl ffmpeg grim imagemagick jq libnotify pulseaudio python3 wf-recorder wl-clipboard xdg-utils ])}:${tesseract}/bin:$PATH"
exec ${pkgs.quickshell}/bin/qs --no-duplicate --path "${config.home.homeDirectory}/.config/quickshell"
'';
startWallpaper = pkgs.writeShellScript "lucid-wallpaper-start" ''
export PATH="${lib.makeBinPath (with pkgs; [ awww bash coreutils ffmpeg imagemagick jq util-linux ])}:$PATH"
selected="${defaultWallpaper}"
if [ -s "${config.home.homeDirectory}/.cache/current_live_wallpaper" ]; then
saved=$(${pkgs.coreutils}/bin/head -n1 "${config.home.homeDirectory}/.cache/current_live_wallpaper")
if [ -f "$saved" ]; then
selected="$saved"
fi
fi
if [ -s "${config.home.homeDirectory}/.cache/current_wallpaper" ]; then
saved=$(${pkgs.coreutils}/bin/cat "${config.home.homeDirectory}/.cache/current_wallpaper")
if [ "$selected" = "${defaultWallpaper}" ] && [ -f "$saved" ]; then
selected="$saved"
fi
fi
exec "${wallpaperScript}" "$selected"
'';
in {
programs.waybar.enable = lib.mkForce false;
services.mako.enable = lib.mkForce false;
home.packages = with pkgs; [ cliphist ffmpeg grim imagemagick libnotify wf-recorder tesseract ];
home.activation.installLucid = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
target="${config.home.homeDirectory}/.config/quickshell"
$DRY_RUN_CMD mkdir -p "$target"
$DRY_RUN_CMD ${pkgs.rsync}/bin/rsync -rltp --chmod=Du+rwx,Fu+rw \
--exclude='/shell.qml' \
--exclude='/LucidBar.qml' \
--exclude='/lucidprefs/prefs.json' \
--exclude='/lucidbar/blur.json' \
--exclude='/lucidbar/clock_reminders.json' \
--exclude='/lucidbar/mpris_shazam.json' \
--exclude='/luciddocks/pinned.json' \
--exclude='/luciddocks/usage.json' \
--exclude='/luciddocks/wallpaper.json' \
--exclude='/lucidmoji/config.json' \
--exclude='/lucidmoji/state.json' \
--exclude='/lucidkeys/state.json' \
--exclude='/lucidwidgets/widgets.json' \
"${source}/" "$target/"
$DRY_RUN_CMD install -m644 ${../../../modules/user/lucid-shell.qml} "$target/shell.qml"
$DRY_RUN_CMD install -m644 ${../../../modules/user/LucidBar.qml} "$target/LucidBar.qml"
$DRY_RUN_CMD mkdir -p "${wallpaperDir}" \
"${config.home.homeDirectory}/.config/hypr/scripts/wallpaper"
$DRY_RUN_CMD ${pkgs.rsync}/bin/rsync -rltp --chmod=Du+rwx,Fu+rw --ignore-existing \
"${wallpapers}/wallpapers/catppuccin-mocha/" "${wallpaperDir}/"
$DRY_RUN_CMD install -m755 "${source}/support/wallpaper/set-wallpaper.sh" \
"${wallpaperScript}"
lucid_dir="${config.home.homeDirectory}/.config/lucid"
$DRY_RUN_CMD mkdir -p "$lucid_dir/themes"
$DRY_RUN_CMD ${pkgs.rsync}/bin/rsync -rltp --chmod=Du+rwx,Fu+rw --ignore-existing \
"${source}/support/lucid/themes/" "$lucid_dir/themes/"
for script in palette-edit.py lucid_palette.py add-theme.py scheme-gallery.py gen-light-palette.py; do
$DRY_RUN_CMD install -m644 "${source}/support/lucid/$script" "$lucid_dir/$script"
done
$DRY_RUN_CMD install -m755 "${source}/support/lucid/apply-theme.sh" \
"$lucid_dir/apply-theme-upstream.sh"
$DRY_RUN_CMD install -m755 ${applyTheme} \
"$lucid_dir/apply-theme.sh"
if [ ! -e "$target/lucidprefs/prefs.json" ]; then
$DRY_RUN_CMD install -m644 ${../../../modules/user/lucid-prefs.json} "$target/lucidprefs/prefs.json"
fi
if [ -z "''${DRY_RUN_CMD:-}" ] && [ -f "$target/lucidprefs/prefs.json" ]; then
prefs_tmp=$(${pkgs.coreutils}/bin/mktemp "$target/lucidprefs/prefs.json.XXXXXX")
if ${pkgs.jq}/bin/jq --arg font ${lib.escapeShellArg config.stylix.fonts.sansSerif.name} \
--arg wallpaperDir ${lib.escapeShellArg wallpaperDir} \
--arg decoder ${lib.escapeShellArg liveDecoder} \
'.barEnabled = true | .widgetOnTop = false | .widgetHideFullscreen = true | .fontFamily = $font | .wallpaperFolder = $wallpaperDir | .liveDecoder = $decoder' \
"$target/lucidprefs/prefs.json" > "$prefs_tmp"; then
${pkgs.coreutils}/bin/chmod 644 "$prefs_tmp"
${pkgs.coreutils}/bin/mv "$prefs_tmp" "$target/lucidprefs/prefs.json"
else
${pkgs.coreutils}/bin/rm -f "$prefs_tmp"
exit 1
fi
fi
if [ ! -e "$target/luciddocks/pinned.json" ]; then
$DRY_RUN_CMD install -m644 ${../../../modules/user/lucid-pinned.json} "$target/luciddocks/pinned.json"
fi
if [ ! -e "$target/lucidwidgets/widgets.json" ]; then
$DRY_RUN_CMD install -m644 ${../../../modules/user/lucid-widgets.json} "$target/lucidwidgets/widgets.json"
fi
for pair in \
'blur.json lucidbar/blur.json' \
'clock_reminders.json lucidbar/clock_reminders.json' \
'mpris_shazam.json lucidbar/mpris_shazam.json' \
'usage.json luciddocks/usage.json' \
'wallpaper.json luciddocks/wallpaper.json' \
'moji-config.json lucidmoji/config.json' \
'moji-state.json lucidmoji/state.json' \
'keys-state.json lucidkeys/state.json'; do
set -- $pair
if [ ! -e "$target/$2" ]; then
$DRY_RUN_CMD install -m644 "${source}/defaults/$1" "$target/$2"
fi
done
$DRY_RUN_CMD mkdir -p "${config.home.homeDirectory}/.config/lucid/themes/stylix" \
"${config.home.homeDirectory}/.cache/quickshell"
$DRY_RUN_CMD install -m644 ${paletteFile} \
"${config.home.homeDirectory}/.config/lucid/themes/stylix/quickshell.json"
$DRY_RUN_CMD install -m644 ${themeMeta} \
"${config.home.homeDirectory}/.config/lucid/themes/stylix/meta.json"
if [ ! -e "${config.home.homeDirectory}/.cache/current_theme" ]; then
$DRY_RUN_CMD install -m644 ${themeName} \
"${config.home.homeDirectory}/.cache/current_theme"
fi
if [ ! -e "${config.home.homeDirectory}/.cache/current_theme" ] || \
[ "$(${pkgs.coreutils}/bin/cat "${config.home.homeDirectory}/.cache/current_theme")" = stylix ]; then
$DRY_RUN_CMD install -m644 ${paletteFile} \
"${config.home.homeDirectory}/.cache/quickshell/matugen.json"
fi
'';
systemd.user.services.lucid = {
Unit = {
Description = "Lucid bar, dock and desktop widgets";
After = [ "graphical-session.target" ];
PartOf = [ "graphical-session.target" ];
};
Service = {
ExecStartPre = "${startWallpaper}";
ExecStart = "${lucid}";
Restart = "on-failure";
RestartSec = 2;
};
Install.WantedBy = [ "hyprland-session.target" ];
};
wayland.windowManager.hyprland.settings = {
on = [ (hyprLua.onStart [ "systemctl --user start lucid.service" ]) ];
bind = [
(hyprLua.bind "SUPER + SHIFT + G" (hyprLua.exec "qs ipc call widgets panel"))
];
};
}
+5 -1
View File
@@ -22,7 +22,11 @@
in {
enable = true;
systemd.enable = true;
package = inputs.waybar.packages.${pkgs.stdenv.hostPlatform.system}.default;
package = inputs.waybar.packages.${pkgs.stdenv.hostPlatform.system}.default.overrideAttrs (old: {
postPatch = (old.postPatch or "") + ''
mv subprojects/cava-1.0.0 subprojects/libcava
'';
});
settings.mainBar = {
spacing = 8;