Compare commits

..

5 commits

218 changed files with 5969 additions and 5882 deletions

1
.envrc Normal file
View file

@ -0,0 +1 @@
use flake .

View file

@ -1,29 +1,36 @@
<h1 id="header" align="center">
<img src="assets/nix-snowflake-colors.svg" width="128px" height="128px" />
<br>
flocon
</h1>
# ❄️ flocon
My NixOS configurations, using flakes.
# </> Software I use
- Wayland compositor: [niri](https://github.com/YaLTeR/niri)
- Text editor: [neovim](https://github.com/neovim/neovim)
- Shell: [fish](https://github.com/fish-shell/fish-shell)
- Colors: [Catppuccin](https://github.com/catppuccin/catppuccin)
- Font: [Intel One Mono](https://github.com/intel/intel-one-mono)
Additionally using a lot of other software you can find in the configuration files.
# 🛠️ Structure
| Name | Description |
| ------------------- | ---------------------------------------------------------------- |
| [assets](assets/) | Resources used throughout the system (images etc.) |
| [hosts](hosts/) | Host-specific |
| [modules](modules/) | Local module system (where the bulk of the configurations lives) |
| [shared](shared/) | Exported components (packages and NixOS modules) |
| Name | Description |
| ------------------- | -------------------------- |
| [home](home/) | Home manager configuration |
| [hosts](hosts/) | Host-specific |
| [lib](lib/) | Helper functions |
| [modules](modules/) | NixOS modules |
| [pkgs](pkgs/) | Custom packages |
| [system](system/) | NixOS configuration |
My configuration is structured based on the following principles:
1. Hosts should be the main entry points and outputs.
2. Abstractions should be avoided as much as possible.
3. Setting up theming should be as simple as changing one or two options.
The main configuration can be found in [modules](modules/), which declares most of my programs and services.
The bulk of the configuration can be found either in [home](home/) or [system](system/), which declares most of my programs, with some extra Nix code in [lib](lib/) and custom [modules](modules/), mostly for convenience and to provide a way to globally set styles and themes for now.
My hosts can then pick and choose the programs and configurations that they need from the local module system, which have its options declared in [modules/options](modules/options/) for easy reference.
My hosts can then pick and choose the programs and configurations that they need from the other directories. If the need arises for a more modular setup for a specific piece of software (ie. having different flavors of Firefox per host), I will write a custom module for it. This helps to avoid unnecessarily abstracting my configuration, as I don't find it necessary for the most part, and I would also like it to remain as simple as possible.
# 👥 Credits
@ -32,7 +39,5 @@ People / repositories I have copied / learned from:
- [fufexan/dotfiles](https://github.com/fufexan/dotfiles) for the configuration structure
- [jacekpoz/nixos](https://git.jacekpoz.pl/poz/niksos) for learning how NixOS modules work
- [sodiboo](https://github.com/sodiboo) for helping me a whole lot with Niri-specific issues
- [llakala](https://github.com/llakala) for being very thorough and helpful when cleaning up my code and general structure.
- [Lunarnovaa](https://github.com/Lunarnovaa) for her [hjem](https://github.com/feel-co/hjem) configuration and functions, that I used when switching away from home-manager.
Some bits have also been borrowed from within the configuration, and credit has been given where its due.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

View file

@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" version="1.1">
<path style="fill:#dfdfdf" d="M 4,6 C 1.7909,6 0,7.79 0,10 0,12.21 1.7909,14 4,14 4.2425,14 4.4843,13.98 4.7227,13.93 5.462,15.48 6.958,16 10,16 16,16 16,14 16,6 Z M 4,8 H 4.0078 C 4.0194,9.6 4.06,10.94 4.2031,11.99 4.1357,11.99 4.0679,12 4,12 2.8954,12 2,11.1 2,10 2,8.9 2.8954,8 4,8 Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 376 B

View file

@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" version="1.1">
<path style="fill:#dfdfdf" d="M 7.1934,0 C 6.0952,1.38 5.766,1.57 6.1621,2.45 6.5212,3.25 7.449,3.15 6.9824,5 7.7488,4.1 8.3577,3.46 7.7559,2.54 7.1437,1.6 6.8084,1.53 7.1934,0 Z M 10.193,0 C 9.0952,1.38 8.766,1.57 9.1621,2.45 9.5212,3.25 10.449,3.15 9.9824,5 10.749,4.1 11.358,3.46 10.756,2.54 10.144,1.6 9.8084,1.53 10.193,0 Z M 13.193,0 C 12.095,1.38 11.766,1.57 12.162,2.45 12.521,3.25 13.449,3.15 12.982,5 13.749,4.1 14.358,3.46 13.756,2.54 13.144,1.6 12.808,1.53 13.193,0 Z M 4,6 C 1.7909,6 0,7.79 0,10 0,12.21 1.7909,14 4,14 4.2425,14 4.4843,13.98 4.7227,13.93 5.462,15.48 6.958,16 10,16 16,16 16,14 16,6 Z M 4,8 H 4.0078 C 4.0194,9.6 4.06,10.94 4.2031,11.99 4.1357,11.99 4.0679,12 4,12 2.8954,12 2,11.1 2,10 2,8.9 2.8954,8 4,8 Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 826 B

View file

@ -1,187 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="535"
height="535"
viewBox="0 0 501.56251 501.56249"
id="svg2"
version="1.1"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
sodipodi:docname="nix-snowflake-colours.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs4">
<linearGradient
inkscape:collect="always"
id="linearGradient5562">
<stop
style="stop-color:#699ad7;stop-opacity:1"
offset="0"
id="stop5564" />
<stop
id="stop5566"
offset="0.24345198"
style="stop-color:#7eb1dd;stop-opacity:1" />
<stop
style="stop-color:#7ebae4;stop-opacity:1"
offset="1"
id="stop5568" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5053">
<stop
style="stop-color:#415e9a;stop-opacity:1"
offset="0"
id="stop5055" />
<stop
id="stop5057"
offset="0.23168644"
style="stop-color:#4a6baf;stop-opacity:1" />
<stop
style="stop-color:#5277c3;stop-opacity:1"
offset="1"
id="stop5059" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5562"
id="linearGradient4328"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(70.650339,-1055.1511)"
x1="200.59668"
y1="351.41116"
x2="290.08701"
y2="506.18814" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5053"
id="linearGradient4330"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(864.69589,-1491.3405)"
x1="-584.19934"
y1="782.33563"
x2="-496.29703"
y2="937.71399" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.70904368"
inkscape:cx="99.429699"
inkscape:cy="195.33352"
inkscape:document-units="px"
inkscape:current-layer="layer3"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1050"
inkscape:window-x="1920"
inkscape:window-y="30"
inkscape:window-maximized="1"
inkscape:snap-global="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="gradient-logo"
style="display:inline;opacity:1"
transform="translate(-156.41121,933.30685)">
<g
id="g2"
transform="matrix(0.99994059,0,0,0.99994059,-0.06321798,33.188377)"
style="stroke-width:1.00006">
<path
sodipodi:nodetypes="cccccccccc"
inkscape:connector-curvature="0"
id="path3336-6"
d="m 309.54892,-710.38827 122.19683,211.67512 -56.15706,0.5268 -32.6236,-56.8692 -32.85645,56.5653 -27.90237,-0.011 -14.29086,-24.6896 46.81047,-80.4901 -33.22946,-57.8257 z"
style="opacity:1;fill:url(#linearGradient4328);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.00018;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<use
height="100%"
width="100%"
transform="rotate(60,407.11155,-715.78724)"
id="use3439-6"
inkscape:transform-center-y="151.59082"
inkscape:transform-center-x="124.43045"
xlink:href="#path3336-6"
y="0"
x="0"
style="stroke-width:1.00006" />
<use
height="100%"
width="100%"
transform="rotate(-60,407.31177,-715.70016)"
id="use3445-0"
inkscape:transform-center-y="75.573958"
inkscape:transform-center-x="-168.20651"
xlink:href="#path3336-6"
y="0"
x="0"
style="stroke-width:1.00006" />
<use
height="100%"
width="100%"
transform="rotate(180,407.41868,-715.7565)"
id="use3449-5"
inkscape:transform-center-y="-139.94592"
inkscape:transform-center-x="59.669705"
xlink:href="#path3336-6"
y="0"
x="0"
style="stroke-width:1.00006" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4330);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.00018;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 309.54892,-710.38827 122.19683,211.67512 -56.15706,0.5268 -32.6236,-56.8692 -32.85645,56.5653 -27.90237,-0.011 -14.29086,-24.6896 46.81047,-80.4901 -33.22946,-57.8256 z"
id="path4260-0"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc" />
<use
height="100%"
width="100%"
transform="rotate(120,407.33916,-716.08356)"
id="use4354-5"
xlink:href="#path4260-0"
y="0"
x="0"
style="display:inline;stroke-width:1.00006" />
<use
height="100%"
width="100%"
transform="rotate(-120,407.28823,-715.86995)"
id="use4362-2"
xlink:href="#path4260-0"
y="0"
x="0"
style="display:inline;stroke-width:1.00006" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 MiB

3278
flake.lock generated

File diff suppressed because it is too large Load diff

174
flake.nix
View file

@ -4,22 +4,16 @@
outputs = {
self,
nixpkgs,
systems,
agenix,
deploy-rs,
treefmt-nix,
...
} @ inputs: let
supportedSystems = nixpkgs.lib.singleton "x86_64-linux";
forAllSystems = function:
nixpkgs.lib.genAttrs
supportedSystems
(system: function nixpkgs.legacyPackages.${system});
treefmtEval = forAllSystems (pkgs: treefmt-nix.lib.evalModule pkgs ./treefmt.nix);
eachSystem = f: nixpkgs.lib.genAttrs (import systems) (system: f nixpkgs.legacyPackages.${system});
treefmtEval = eachSystem (pkgs: treefmt-nix.lib.evalModule pkgs ./treefmt.nix);
in {
checks = builtins.mapAttrs (_: deployLib: deployLib.deployChecks self.deploy) deploy-rs.lib;
deploy.nodes = import ./nodes.nix {inherit inputs;};
devShells = forAllSystems (pkgs: {
devShells = eachSystem (pkgs: {
default = pkgs.mkShell {
packages = [
pkgs.alejandra
@ -29,16 +23,26 @@
];
};
});
formatter = forAllSystems (pkgs: treefmtEval.${pkgs.system}.config.build.wrapper);
nixosConfigurations = import ./hosts {inherit self inputs;};
nixosModules.hjemModules = import ./shared/modules/hjem/nixos.nix {inherit (nixpkgs) lib;};
packages = forAllSystems (pkgs: import ./shared/pkgs {inherit inputs pkgs;});
formatter = eachSystem (pkgs: treefmtEval.${pkgs.system}.config.build.wrapper);
nixosConfigurations = import ./hosts {inherit inputs;};
packages = eachSystem (pkgs: import ./pkgs {inherit inputs pkgs;});
deploy.nodes = import ./nodes {inherit inputs;};
checks = builtins.mapAttrs (_: deployLib: deployLib.deployChecks self.deploy) deploy-rs.lib;
};
inputs = {
# nix related
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
nixpkgs.url = "nixpkgs/nixos-unstable";
systems.url = "github:nix-systems/default-linux";
nixos-hardware.url = "github:NixOS/nixos-hardware";
nix-index-database = {
lanzaboote = {
url = "github:nix-community/lanzaboote/v0.4.1";
inputs.nixpkgs.follows = "nixpkgs";
};
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
nix-index-db = {
url = "github:nix-community/nix-index-database";
inputs.nixpkgs.follows = "nixpkgs";
};
@ -47,133 +51,29 @@
agenix = {
url = "github:ryantm/agenix";
inputs.nixpkgs.follows = "nixpkgs";
inputs.systems.follows = "systems";
};
anyrun = {
url = "github:anyrun-org/anyrun";
inputs = {
nixpkgs.follows = "nixpkgs";
systems.follows = "systems";
flake-parts.follows = "flake-parts";
};
};
basix = {
url = "github:notashelf/basix";
inputs.nixpkgs.follows = "nixpkgs";
inputs.flake-parts.follows = "flake-parts";
};
deploy-rs = {
url = "github:serokell/deploy-rs";
inputs.nixpkgs.follows = "nixpkgs";
inputs.utils.follows = "flake-utils"; # Yes, it's actually called `utils`, not a typo
};
hyprland = {
url = "github:hyprwm/Hyprland";
inputs.systems.follows = "systems";
};
hypridle = {
url = "github:hyprwm/hypridle";
inputs = {
hyprlang.follows = "hyprland/hyprlang";
hyprutils.follows = "hyprland/hyprutils";
hyprwayland-scanner.follows = "hyprland/hyprwayland-scanner";
hyprland-protocols.follows = "hyprland/hyprland-protocols";
nixpkgs.follows = "hyprland/nixpkgs";
systems.follows = "systems";
};
};
hyprlock = {
url = "github:hyprwm/hyprlock";
inputs = {
hyprlang.follows = "hyprland/hyprlang";
hyprutils.follows = "hyprland/hyprutils";
hyprgraphics.follows = "hyprland/hyprgraphics";
hyprwayland-scanner.follows = "hyprland/hyprwayland-scanner";
nixpkgs.follows = "hyprland/nixpkgs";
systems.follows = "systems";
};
};
hyprpaper = {
url = "github:hyprwm/hyprpaper";
inputs = {
hyprlang.follows = "hyprland/hyprlang";
hyprutils.follows = "hyprland/hyprutils";
hyprgraphics.follows = "hyprland/hyprgraphics";
hyprwayland-scanner.follows = "hyprland/hyprwayland-scanner";
nixpkgs.follows = "hyprland/nixpkgs";
systems.follows = "systems";
};
};
hyprwm-contrib = {
url = "github:hyprwm/contrib";
ags.url = "github:Aylur/ags";
basix.url = "github:notashelf/basix";
deploy-rs.url = "github:serokell/deploy-rs";
firefox-addons = {
url = "gitlab:rycee/nur-expressions?dir=pkgs/firefox-addons";
inputs.nixpkgs.follows = "nixpkgs";
};
# TODO: change to upstream once https://github.com/feel-co/hjem/pull/16 gets merged
hjem = {
url = "github:nezia1/hjem/implement-environment-variables";
niri.url = "github:sodiboo/niri-flake";
neovim-flake = {
url = "git+https://git.nezia.dev/nezia/neovim-flake";
inputs.nixpkgs.follows = "nixpkgs";
};
# TODO: change to upstream once https://github.com/snugnug/hjem-rum/pull/14 gets merged
hjem-rum = {
url = "github:nezia1/hjem-rum/add-hyprland";
portfolio.url = "github:nezia1/portfolio";
plasma-manager = {
url = "github:nix-community/plasma-manager";
inputs.nixpkgs.follows = "nixpkgs";
inputs.home-manager.follows = "home-manager";
};
treefmt-nix.url = "github:numtide/treefmt-nix";
wezterm = {
url = "github:wez/wezterm/main?dir=nix";
inputs.nixpkgs.follows = "nixpkgs";
};
morewaita = {
url = "github:somepaulo/MoreWaita";
flake = false;
};
nix-gaming = {
url = "github:fufexan/nix-gaming";
inputs.nixpkgs.follows = "nixpkgs";
inputs.flake-parts.follows = "flake-parts";
};
nvf = {
url = "github:notashelf/nvf";
inputs = {
nixpkgs.follows = "nixpkgs";
systems.follows = "systems";
flake-utils.follows = "flake-utils";
flake-parts.follows = "flake-parts";
};
};
treefmt-nix = {
url = "github:numtide/treefmt-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
nezia_dev = {
url = "github:nezia1/nezia.dev";
inputs.nixpkgs.follows = "nixpkgs";
};
# Dependency pinning to prevent duplicate versions
systems.url = "github:nix-systems/default";
flake-utils = {
url = "github:numtide/flake-utils";
inputs.systems.follows = "systems";
};
flake-parts.url = "github:hercules-ci/flake-parts";
};
nixConfig = {
extra-substituters = [
# use nixos cache first
"https://cache.nixos.org?priority=10"
"https://nix-community.cachix.org"
"https://hyprland.cachix.org"
"https://nix-gaming.cachix.org"
"https://anyrun.cachix.org"
];
extra-trusted-public-keys = [
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
"hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
"nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4="
"anyrun.cachix.org-1:pqBobmOjI7nKlsUMV25u9QHa9btJK65/C8vnO3p346s="
];
};
}

14
home/default.nix Normal file
View file

@ -0,0 +1,14 @@
{
imports = [
./services/udiskie.nix
./terminal
./programs
];
home = {
username = "nezia";
homeDirectory = "/home/nezia";
stateVersion = "24.05";
};
programs.home-manager.enable = true;
}

156
home/programs/ags/config.js Normal file
View file

@ -0,0 +1,156 @@
const mpris = await Service.import("mpris");
const audio = await Service.import("audio");
const battery = await Service.import("battery");
const systemtray = await Service.import("systemtray");
import { NotificationPopups } from "./notificationPopups.js";
const date = Variable("", {
poll: [1000, 'date "+%H:%M %b %e."'],
});
// widgets can be only assigned as a child in one container
// so to make a reuseable widget, make it a function
// then you can simply instantiate one by calling it
function Clock() {
return Widget.Label({
class_name: "clock",
label: date.bind(),
});
}
function Media() {
const label = Utils.watch("", mpris, "player-changed", () => {
if (mpris.players[0]) {
const { track_artists, track_title } = mpris.players[0];
return `${track_artists.join(", ")} - ${track_title}`;
} else {
return "Nothing is playing";
}
});
return Widget.Button({
class_name: "media",
on_primary_click: () => mpris.getPlayer("")?.playPause(),
on_scroll_up: () => mpris.getPlayer("")?.next(),
on_scroll_down: () => mpris.getPlayer("")?.previous(),
child: Widget.Label({ label }),
});
}
function Volume() {
const icons = {
101: "overamplified",
67: "high",
34: "medium",
1: "low",
0: "muted",
};
function getIcon() {
const icon = audio.speaker.is_muted
? 0
: [101, 67, 34, 1, 0].find(
(threshold) => threshold <= audio.speaker.volume * 100,
);
return `audio-volume-${icons[icon]}-symbolic`;
}
const icon = Widget.Icon({
icon: Utils.watch(getIcon(), audio.speaker, getIcon),
});
const slider = Widget.Slider({
hexpand: true,
draw_value: false,
on_change: ({ value }) => (audio.speaker.volume = value),
setup: (self) =>
self.hook(audio.speaker, () => {
self.value = audio.speaker.volume || 0;
}),
});
return Widget.Box({
class_name: "volume",
css: "min-width: 180px",
children: [icon, slider],
});
}
function BatteryLabel() {
const value = battery.bind("percent").as((p) => (p > 0 ? p / 100 : 0));
const icon = battery
.bind("percent")
.as((p) => `battery-level-${Math.floor(p / 10) * 10}-symbolic`);
return Widget.Box({
class_name: "battery",
visible: battery.bind("available"),
children: [
Widget.Icon({ icon }),
Widget.LevelBar({
widthRequest: 140,
vpack: "center",
value,
}),
],
});
}
function SysTray() {
const items = systemtray.bind("items").as((items) =>
items.map((item) =>
Widget.Button({
child: Widget.Icon({ icon: item.bind("icon") }),
on_primary_click: (_, event) => item.activate(event),
on_secondary_click: (_, event) => item.openMenu(event),
tooltip_markup: item.bind("tooltip_markup"),
}),
),
);
return Widget.Box({
children: items,
});
}
// layout of the bar
function Left() {
return Widget.Box({});
}
function Center() {
return Widget.Box({
spacing: 8,
children: [Media()],
});
}
function Right() {
return Widget.Box({
hpack: "end",
spacing: 8,
children: [Volume(), BatteryLabel(), Clock(), SysTray()],
});
}
function Bar() {
return Widget.Window({
name: "bar", // name has to be unique
class_name: "bar",
anchor: ["top", "left", "right"],
exclusivity: "exclusive",
child: Widget.CenterBox({
start_widget: Left(),
center_widget: Center(),
end_widget: Right(),
}),
});
}
App.config({
style: "./style.css",
windows: [Bar(), NotificationPopups()],
});
export {};

View file

@ -0,0 +1,42 @@
{
inputs,
pkgs,
config,
...
}: let
cfg = config.programs.ags;
in {
imports = [inputs.ags.homeManagerModules.default];
home.packages = with pkgs; [
libdbusmenu-gtk3
dart-sass
];
programs.ags = {
enable = true;
# null or path, leave as null if you don't want hm to manage the config
configDir = ./.;
# additional packages to add to gjs's runtime
extraPackages = with pkgs; [
gtksourceview
webkitgtk
accountsservice
];
};
systemd.user.services.ags = {
Unit = {
Description = "Aylur's Gtk Shell";
PartOf = [
"graphical-session.target"
];
};
Service = {
ExecStart = "${cfg.package}/bin/ags";
Restart = "on-failure";
};
Install.WantedBy = ["graphical-session.target"];
};
}

View file

@ -0,0 +1,124 @@
const notifications = await Service.import("notifications");
/** @param {import('resource:///com/github/Aylur/ags/service/notifications.js').Notification} n */
function NotificationIcon({ app_entry, app_icon, image }) {
if (image) {
return Widget.Box({
css:
`background-image: url("${image}");` +
"background-size: contain;" +
"background-repeat: no-repeat;" +
"background-position: center;",
});
}
let icon = "dialog-information-symbolic";
if (Utils.lookUpIcon(app_icon)) icon = app_icon;
if (app_entry && Utils.lookUpIcon(app_entry)) icon = app_entry;
return Widget.Box({
child: Widget.Icon(icon),
});
}
/** @param {import('resource:///com/github/Aylur/ags/service/notifications.js').Notification} n */
function Notification(n) {
const icon = Widget.Box({
vpack: "start",
class_name: "icon",
child: NotificationIcon(n),
});
const title = Widget.Label({
class_name: "title",
xalign: 0,
justification: "left",
hexpand: true,
max_width_chars: 24,
truncate: "end",
wrap: true,
label: n.summary,
use_markup: true,
});
const body = Widget.Label({
class_name: "body",
hexpand: true,
use_markup: true,
xalign: 0,
justification: "left",
label: n.body,
wrap: true,
});
const actions = Widget.Box({
class_name: "actions",
children: n.actions.map(({ id, label }) =>
Widget.Button({
class_name: "action-button",
on_clicked: () => {
n.invoke(id);
n.dismiss();
},
hexpand: true,
child: Widget.Label(label),
}),
),
});
return Widget.EventBox(
{
attribute: { id: n.id },
on_primary_click: n.dismiss,
},
Widget.Box(
{
class_name: `notification ${n.urgency}`,
vertical: true,
},
Widget.Box([icon, Widget.Box({ vertical: true }, title, body)]),
actions,
),
);
}
export function NotificationPopups(monitor = 0) {
const list = Widget.Box({
vertical: true,
children: notifications.popups.map(Notification),
});
function onNotified(_, /** @type {number} */ id) {
const n = notifications.getNotification(id);
if (n) list.children = [Notification(n), ...list.children];
}
function onDismissed(_, /** @type {number} */ id) {
list.children.find((n) => n.attribute.id === id)?.destroy();
}
list
.hook(notifications, onNotified, "notified")
.hook(notifications, onDismissed, "dismissed");
return Widget.Window({
monitor,
name: `notifications${monitor}`,
class_name: "notification-popups",
anchor: ["top", "right"],
child: Widget.Box({
css: "min-width: 2px; min-height: 2px;",
class_name: "notifications",
vertical: true,
child: list,
/** this is a simple one liner that could be used instead of
hooking into the 'notified' and 'dismissed' signals.
but its not very optimized becuase it will recreate
the whole list everytime a notification is added or dismissed */
// children: notifications.bind('popups')
// .as(popups => popups.map(Notification))
}),
});
}

View file

@ -0,0 +1,15 @@
# Starter Config
if suggestions don't work, first make sure
you have TypeScript LSP working in your editor
if you do not want typechecking only suggestions
```json
// tsconfig.json
"checkJs": false
```
types are symlinked to:
/home/nezia/.local/share/com.github.Aylur.ags/types

View file

@ -0,0 +1,57 @@
window.notification-popups box.notifications {
padding: 0.5em;
}
.icon {
min-width: 68px;
min-height: 68px;
margin-right: 1em;
}
.icon image {
font-size: 58px;
/* to center the icon */
margin: 5px;
color: @theme_fg_color;
}
.icon box {
min-width: 68px;
min-height: 68px;
border-radius: 7px;
}
.notification {
min-width: 350px;
border-radius: 11px;
padding: 1em;
margin: 0.5em;
border: 1px solid @wm_borders_edge;
background-color: @theme_bg_color;
}
.notification.critical {
border: 1px solid lightcoral;
}
.title {
color: @theme_fg_color;
font-size: 1.4em;
}
.body {
color: @theme_unfocused_fg_color;
}
.actions .action-button {
margin: 0 0.4em;
margin-top: 0.8em;
}
.actions .action-button:first-child {
margin-left: 0;
}
.actions .action-button:last-child {
margin-right: 0;
}

View file

@ -0,0 +1,18 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "ES2022",
"lib": [
"ES2022"
],
"allowJs": true,
"checkJs": true,
"strict": true,
"noImplicitAny": false,
"baseUrl": ".",
"typeRoots": [
"./types"
],
"skipLibCheck": true
}
}

View file

@ -0,0 +1,3 @@
{
imports = [./firefox.nix];
}

View file

@ -0,0 +1,171 @@
{
inputs,
pkgs,
...
}: let
betterfox = pkgs.fetchFromGitHub {
owner = "yokoffing";
repo = "betterfox";
rev = "e026ed7d3a763c5d3f96c2680d7bc3340831af4f";
hash = "sha256-hpkEO5BhMVtINQG8HN4xqfas/R6q5pYPZiFK8bilIDs=";
};
in {
programs.firefox = {
enable = true;
package = pkgs.wrapFirefox pkgs.firefox-unwrapped {
extraPolicies = {
DisableTelemetry = true;
DisablePocket = true;
DisableFeedbackCommands = true;
DisableFirefoxStudies = true;
OfferToSaveLogins = false;
OffertosaveloginsDefault = false;
PasswordManagerEnabled = false;
SearchSuggestEnabled = true;
# https://github.com/Sly-Harvey/NixOS/blob/f9da2691ea46565256ad757959cfc26ec6cee10d/modules/programs/browser/firefox/default.nix#L58-L163
"3rdparty".Extensions = {
"addon@darkreader.org" = {
permissions = ["internal:privateBrowsingAllowed"];
enabled = true;
automation = {
enabled = true;
behavior = "OnOff";
mode = "system";
};
detectDarkTheme = true;
enabledByDefault = true;
changeBrowserTheme = false;
enableForProtectedPages = true;
fetchNews = false;
previewNewDesign = true;
};
"uBlock0@raymondhill.net" = {
permissions = ["internal:privateBrowsingAllowed"];
advancedSettings = [
[
"userResourcesLocation"
"https://raw.githubusercontent.com/pixeltris/TwitchAdSolutions/master/video-swap-new/video-swap-new-ublock-origin.js"
]
];
adminSettings = {
userSettings = {
uiTheme = "dark";
advancedUserEnabled = true;
userFiltersTrusted = true;
importedLists = [
"https://raw.githubusercontent.com/laylavish/uBlockOrigin-HUGE-AI-Blocklist/main/list.txt"
];
selectedFilterLists = [
"FRA-0"
"adguard-cookies"
"adguard-mobile-app-banners"
"adguard-other-annoyances"
"adguard-popup-overlays"
"adguard-social"
"adguard-spyware-url"
"adguard-widgets"
"easylist"
"easylist-annoyances"
"easylist-chat"
"easylist-newsletters"
"easylist-notifications"
"easyprivacy"
"fanboy-cookiemonster"
"https://filters.adtidy.org/extension/ublock/filters/3.txt"
"https://github.com/DandelionSprout/adfilt/raw/master/LegitimateURLShortener.txt"
"plowe-0"
"ublock-annoyances"
"ublock-badware"
"ublock-cookies-adguard"
"ublock-cookies-easylist"
"ublock-filters"
"ublock-privacy"
"ublock-quick-fixes"
"ublock-unbreak"
"urlhaus-1"
"https://raw.githubusercontent.com/laylavish/uBlockOrigin-HUGE-AI-Blocklist/main/list.txt"
];
};
};
};
};
};
};
profiles = {
nezia = {
settings = {
"browser.search.suggest.enabled" = true;
"ui.key.menuAccessKeyFocuses" = false;
};
extensions = with inputs.firefox-addons.packages.${pkgs.system}; [
darkreader
proton-pass
shinigami-eyes
stylus
ublock-origin
violentmonkey
];
# https://git.jacekpoz.pl/poz/niksos/src/commit/a48647a1c5bc6877a1100a65f4dc169b2fc11ed7/hosts/hape/firefox.nix
search = {
default = "SearxNG";
engines = {
"SearxNG" = {
urls = [
{
rels = ["results"];
template = "https://search.nezia.dev/search";
params = [
{
name = "q";
value = "{searchTerms}";
}
];
}
{
rels = ["suggestions"];
template = "https://search.nezia.dev/autocompleter";
params = [
{
name = "q";
value = "{searchTerms}";
}
];
"type" = "application/x-suggestions+json";
}
];
};
"MyNixOS" = {
urls = [{template = "https://mynixos.com/search?q={searchTerms}";}];
iconUpdateURL = "https://mynixos.com/favicon.ico";
updateInterval = 24 * 60 * 60 * 1000;
definedAliases = ["@nx"];
};
"Noogle" = {
urls = [{template = "https://noogle.dev/q?term={searchTerms}";}];
icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
definedAliases = ["@ng"];
};
"GitHub Nix" = {
# https://github.com/search?q=language%3Anix+NOT+is%3Afork+programs.neovim&type=code
urls = [{template = "https://github.com/search?q=language:nix NOT is:fork {searchTerms}&type=code";}];
iconUpdateURL = "https://github.com/favicon.ico";
updateInterval = 24 * 60 * 60 * 1000;
definedAliases = ["@ghn"];
};
"Google".metaData.alias = "@g"; # builtin engines only support specifying one additional alias
};
};
# https://github.com/oddlama/nix-config/blob/main/users/myuser/graphical/firefox.nix#L53-L57
extraConfig = builtins.concatStringsSep "\n" [
(builtins.readFile "${betterfox}/user.js")
(builtins.readFile "${betterfox}/Securefox.js")
(builtins.readFile "${betterfox}/Fastfox.js")
(builtins.readFile "${betterfox}/Peskyfox.js")
(builtins.readFile "${betterfox}/Smoothfox.js")
];
};
};
};
}

41
home/programs/default.nix Normal file
View file

@ -0,0 +1,41 @@
{
inputs,
pkgs,
...
}: {
imports = [
./browsers
./media
./xdg.nix
./gtk.nix
./editors/helix.nix
];
# idk where to put this
programs = {
fzf.enable = true;
hyfetch.enable = true;
};
# miscellaneous programs that do not need to be configured
home.packages = with pkgs; [
geary
imhex
logisim-evolution
obsidian
proton-pass
vesktop
wl-clipboard
fractal
gnome-control-center
playerctl
nautilus
simple-scan
entr
inputs.neovim-flake.packages.${pkgs.system}.default
# https://nixpkgs-tracker.ocfox.me/?pr=357219
# mission-center
# cinny-desktop
];
}

View file

@ -0,0 +1,61 @@
{
lib,
pkgs,
...
}: {
programs.helix = {
enable = true;
settings = {
theme = "catppuccin_macchiato";
editor = {
line-number = "relative";
lsp.display-messages = true;
auto-format = true;
auto-completion = true;
completion-timeout = 5;
color-modes = true;
completion-trigger-len = 1;
completion-replace = true;
cursorline = true;
cursor-shape = {
insert = "bar";
normal = "block";
select = "underline";
};
indent-guides.render = true;
lsp.display-inlay-hints = true;
statusline.center = ["position-percentage"];
true-color = true;
whitespace.characters = {
newline = "";
tab = "";
};
};
keys.normal = {
space = {
space = "file_picker";
w = ":w";
q = ":q";
};
esc = ["collapse_selection" "keep_primary_selection"];
};
};
languages = {
language = [
{
name = "nix";
auto-format = true;
}
];
language-server = {
nil = {
command = lib.getExe pkgs.nil;
config.nil.formatting.command = ["${lib.getExe pkgs.alejandra}" "-q"];
};
};
};
};
}

31
home/programs/fuzzel.nix Normal file
View file

@ -0,0 +1,31 @@
{
inputs,
osConfig,
lib,
pkgs,
...
}: {
programs.fuzzel = {
enable = true;
settings = {
main = {
terminal = lib.getExe pkgs.foot;
use-bold = true;
dpi-aware = "auto";
font = "monospace:size=14";
};
colors = let
inherit (osConfig.theme.scheme) palette;
in {
background = "${palette.base00}ff";
text = "${palette.base05}ff";
input = "${palette.base05}ff";
selection = "${palette.base02}ff";
selection-text = "${palette.base07}ff";
selection-match = "${palette.base0D}ff";
border = "${palette.base0E}ff";
};
border.width = 5;
};
};
}

View file

@ -0,0 +1,21 @@
{
pkgs,
inputs,
...
}: {
home.packages = [
pkgs.bottles
pkgs.lutris
pkgs.mangohud
pkgs.path-of-building
pkgs.protonplus
pkgs.r2modman
# steamtinkerlaunch dependencies
pkgs.xdotool
pkgs.xorg.xwininfo
pkgs.yad
inputs.self.packages.${pkgs.system}.bolt-launcher
];
}

View file

@ -0,0 +1,67 @@
{
pkgs,
osConfig,
config,
...
}: {
dconf = {
enable = true;
settings = {
"org/gnome/shell" = {
disable-user-extensions = false; # enables user extensions
enabled-extensions = [
pkgs.gnomeExtensions.appindicator.extensionUuid
pkgs.gnomeExtensions.blur-my-shell.extensionUuid
pkgs.gnomeExtensions.emoji-copy.extensionUuid
pkgs.gnomeExtensions.clipboard-history.extensionUuid
];
};
"org/gnome/desktop/input-sources" = {
xkb-options = ["compose:ralt"];
};
"org/gnome/desktop/interface" = {
enable-hot-corners = false;
color-scheme = "prefer-dark";
};
"org/gnome/desktop/background" = {
picture-uri-dark = "file://" + builtins.toString osConfig.theme.wallpaper;
};
"org/gnome/desktop/search-providers" = {
disabled = [
"org.gnome.Terminal.desktop"
"org.gnome.Software.desktop"
"org.gnome.seahorse.Application.desktop"
"org.gnome.clocks.desktop"
"org.gnome.Characters.desktop"
"org.gnome.Calendar.desktop"
"org.gnome.Calculator.desktop"
];
enabled = [
"org.gnome.Nautilus.desktop"
"org.gnome.Settings.desktop"
];
};
"org/freedesktop/tracker/mine/files" = {
index-recursive-directories = [
"&DESKTOP"
"&DOCUMENTS"
"&MUSIC"
"&PICTURES"
"&VIDEOS"
"${config.home.homeDirectory}/Notes"
"${config.home.homeDirectory}/Projects"
];
};
};
};
home.packages = with pkgs.gnomeExtensions; [
appindicator
blur-my-shell
clipboard-history
emoji-copy
];
}

52
home/programs/gtk.nix Normal file
View file

@ -0,0 +1,52 @@
{
pkgs,
config,
osConfig,
lib,
...
}: let
isDark = osConfig.theme.scheme.variant == "dark";
in {
home.pointerCursor = {
inherit (osConfig.theme.cursorTheme) name package size;
gtk.enable = true;
x11.enable = true;
};
gtk = {
enable = true;
font = {
name = "Inter";
package = pkgs.inter;
size = 11;
};
gtk3.extraConfig = {
gtk-decoration-layout = ":menu";
gtk-application-prefer-dark-theme = isDark;
};
gtk4.extraConfig = {
gtk-decoration-layout = ":menu";
};
gtk2.configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc";
iconTheme = {
inherit (osConfig.theme.gtk.iconTheme) name package;
};
theme = lib.mkIf (!osConfig.services.xserver.desktopManager.gnome.enable) {
inherit (osConfig.theme.gtk.theme) name package;
};
};
dconf.settings = {
"org/gnome/desktop/interface" = {
color-scheme =
if isDark
then "prefer-dark"
else "default";
};
};
}

View file

@ -0,0 +1,11 @@
{pkgs, ...}: {
imports = [./zathura.nix];
programs.mpv.enable = true;
home.packages = [
pkgs.gnome-calculator
pkgs.loupe
pkgs.spotify
pkgs.stremio
pkgs.celluloid
];
}

View file

@ -0,0 +1,68 @@
{
osConfig,
lib,
lib',
...
}: let
inherit (osConfig.theme.scheme) palette;
inherit (lib) mkIf mkMerge;
inherit (lib') rgba;
in {
programs.zathura = {
enable = true;
options = mkMerge [
{
font = "Inter 12";
selection-notification = true;
selection-clipboard = "clipboard";
adjust-open = "best-fit";
pages-per-row = "1";
scroll-page-aware = "true";
scroll-full-overlap = "0.01";
scroll-step = "100";
zoom-min = "10";
}
(mkIf osConfig.theme.enable {
default-fg = palette.base05;
default-bg = palette.base00;
completion-bg = palette.base02;
completion-fg = palette.base05;
completion-highlight-bg = palette.base03;
completion-highlight-fg = palette.base05;
completion-group-bg = palette.base02;
completion-group-fg = palette.base0D;
statusbar-fg = palette.base05;
statusbar-bg = palette.base02;
notification-bg = palette.base02;
notification-fg = palette.base05;
notification-error-bg = palette.base02;
notification-error-fg = palette.base08;
notification-warning-bg = palette.base02;
notification-warning-fg = palette.base0A;
inputbar-fg = palette.base05;
inputbar-bg = palette.base02;
recolor = true;
recolor-lightcolor = palette.base00;
recolor-darkcolor = palette.base05;
index-fg = palette.base05;
index-bg = palette.base00;
index-active-fg = palette.base05;
index-active-bg = palette.base02;
render-loading-bg = palette.base00;
render-loading-fg = palette.base05;
highlight-color = rgba lib palette.base03 ".5";
highlight-fg = rgba lib palette.base0E ".5";
highlight-active-color = rgba lib palette.base0E ".5";
})
];
};
}

View file

@ -0,0 +1,168 @@
{
config,
pkgs,
lib,
...
}: let
appLauncher = "fuzzel";
terminal = "foot";
browser = "firefox";
prefix = "Alt";
guiFileManager = "nautilus";
cliFileManager = "yazi";
in {
programs.niri.settings.binds = {
"${prefix}+D".action.spawn = appLauncher;
"${prefix}+Return".action.spawn = terminal;
"${prefix}+W".action.spawn = browser;
"${prefix}+E".action.spawn = guiFileManager;
"${prefix}+Shift+E".action.spawn = [terminal "-e" cliFileManager];
"${prefix}+Shift+Slash".action = config.lib.niri.actions.show-hotkey-overlay;
"${prefix}+Q".action = config.lib.niri.actions.close-window;
"${prefix}+Shift+Q".action.quit.skip-confirmation = true;
"${prefix}+F".action = config.lib.niri.actions.maximize-column;
"${prefix}+Shift+F".action = config.lib.niri.actions.fullscreen-window;
"${prefix}+C".action = config.lib.niri.actions.center-column;
# Focus
"${prefix}+Left".action = config.lib.niri.actions.focus-column-left;
"${prefix}+Down".action = config.lib.niri.actions.focus-window-down;
"${prefix}+Up".action = config.lib.niri.actions.focus-window-up;
"${prefix}+Right".action = config.lib.niri.actions.focus-column-right;
"${prefix}+H".action = config.lib.niri.actions.focus-column-left;
"${prefix}+J".action = config.lib.niri.actions.focus-window-down;
"${prefix}+K".action = config.lib.niri.actions.focus-window-up;
"${prefix}+L".action = config.lib.niri.actions.focus-column-right;
"${prefix}+Home".action = config.lib.niri.actions.focus-column-first;
"${prefix}+End".action = config.lib.niri.actions.focus-column-last;
# Move
"${prefix}+Ctrl+Left".action = config.lib.niri.actions.move-column-left;
"${prefix}+Ctrl+Down".action = config.lib.niri.actions.move-window-down;
"${prefix}+Ctrl+Up".action = config.lib.niri.actions.move-window-up;
"${prefix}+Ctrl+Right".action = config.lib.niri.actions.move-column-right;
"${prefix}+Ctrl+H".action = config.lib.niri.actions.move-column-left;
"${prefix}+Ctrl+J".action = config.lib.niri.actions.move-window-down;
"${prefix}+Ctrl+K".action = config.lib.niri.actions.move-window-up;
"${prefix}+Ctrl+L".action = config.lib.niri.actions.move-column-right;
"${prefix}+Ctrl+Home".action = config.lib.niri.actions.move-column-to-first;
"${prefix}+Ctrl+End".action = config.lib.niri.actions.move-column-to-last;
# Monitor focus
"${prefix}+Shift+Left".action = config.lib.niri.actions.focus-monitor-left;
"${prefix}+Shift+Down".action = config.lib.niri.actions.focus-monitor-down;
"${prefix}+Shift+Up".action = config.lib.niri.actions.focus-monitor-up;
"${prefix}+Shift+Right".action = config.lib.niri.actions.focus-monitor-right;
"${prefix}+Shift+H".action = config.lib.niri.actions.focus-monitor-left;
"${prefix}+Shift+J".action = config.lib.niri.actions.focus-monitor-down;
"${prefix}+Shift+K".action = config.lib.niri.actions.focus-monitor-up;
"${prefix}+Shift+L".action = config.lib.niri.actions.focus-monitor-right;
# Move to monitor
"${prefix}+Shift+Ctrl+Left".action = config.lib.niri.actions.move-column-to-monitor-left;
"${prefix}+Shift+Ctrl+Down".action = config.lib.niri.actions.move-column-to-monitor-down;
"${prefix}+Shift+Ctrl+Up".action = config.lib.niri.actions.move-column-to-monitor-up;
"${prefix}+Shift+Ctrl+Right".action = config.lib.niri.actions.move-column-to-monitor-right;
"${prefix}+Shift+Ctrl+H".action = config.lib.niri.actions.move-column-to-monitor-left;
"${prefix}+Shift+Ctrl+J".action = config.lib.niri.actions.move-column-to-monitor-down;
"${prefix}+Shift+Ctrl+K".action = config.lib.niri.actions.move-column-to-monitor-up;
"${prefix}+Shift+Ctrl+L".action = config.lib.niri.actions.move-column-to-monitor-right;
# Workspace navigation
"${prefix}+Page_Down".action = config.lib.niri.actions.focus-workspace-down;
"${prefix}+Page_Up".action = config.lib.niri.actions.focus-workspace-up;
"${prefix}+U".action = config.lib.niri.actions.focus-workspace-down;
"${prefix}+I".action = config.lib.niri.actions.focus-workspace-up;
"${prefix}+Ctrl+Page_Down".action = config.lib.niri.actions.move-column-to-workspace-down;
"${prefix}+Ctrl+Page_Up".action = config.lib.niri.actions.move-column-to-workspace-up;
"${prefix}+Ctrl+U".action = config.lib.niri.actions.move-column-to-workspace-down;
"${prefix}+Ctrl+I".action = config.lib.niri.actions.move-column-to-workspace-up;
"${prefix}+Shift+Page_Down".action = config.lib.niri.actions.move-workspace-down;
"${prefix}+Shift+Page_Up".action = config.lib.niri.actions.move-workspace-up;
"${prefix}+Shift+U".action = config.lib.niri.actions.move-workspace-down;
# Workspace focus
"${prefix}+1".action.focus-workspace = 1;
"${prefix}+2".action.focus-workspace = 2;
"${prefix}+3".action.focus-workspace = 3;
"${prefix}+4".action.focus-workspace = 4;
"${prefix}+5".action.focus-workspace = 5;
"${prefix}+6".action.focus-workspace = 6;
"${prefix}+7".action.focus-workspace = 7;
"${prefix}+8".action.focus-workspace = 8;
"${prefix}+9".action.focus-workspace = 9;
# Move to workspace
"${prefix}+Ctrl+1".action.move-column-to-workspace = 1;
"${prefix}+Ctrl+2".action.move-column-to-workspace = 2;
"${prefix}+Ctrl+3".action.move-column-to-workspace = 3;
"${prefix}+Ctrl+4".action.move-column-to-workspace = 4;
"${prefix}+Ctrl+5".action.move-column-to-workspace = 5;
"${prefix}+Ctrl+6".action.move-column-to-workspace = 6;
"${prefix}+Ctrl+7".action.move-column-to-workspace = 7;
"${prefix}+Ctrl+8".action.move-column-to-workspace = 8;
"${prefix}+Ctrl+9".action.move-column-to-workspace = 9;
"${prefix}+Shift+I".action = config.lib.niri.actions.move-workspace-up;
# Window management
"${prefix}+Comma".action = config.lib.niri.actions.consume-window-into-column;
"${prefix}+Period".action = config.lib.niri.actions.expel-window-from-column;
"${prefix}+BracketLeft".action = config.lib.niri.actions.consume-or-expel-window-left;
"${prefix}+BracketRight".action = config.lib.niri.actions.consume-or-expel-window-right;
# Column management
"${prefix}+R".action = config.lib.niri.actions.switch-preset-column-width;
"${prefix}+Shift+R".action = config.lib.niri.actions.switch-preset-window-height;
"${prefix}+Ctrl+R".action = config.lib.niri.actions.reset-window-height;
"${prefix}+Minus".action = config.lib.niri.actions.set-column-width "-10%";
"${prefix}+Equal".action = config.lib.niri.actions.set-column-width "+10%";
"${prefix}+Shift+Minus".action = config.lib.niri.actions.set-window-height "-10%";
"${prefix}+Shift+Equal".action = config.lib.niri.actions.set-window-height "+10%";
# Screenshots
"Print".action = config.lib.niri.actions.screenshot-screen;
"Ctrl+Print".action = config.lib.niri.actions.screenshot;
# System
"${prefix}+Mod+L".action.spawn = [
"${lib.getExe' pkgs.systemd "loginctl"}"
"lock-session"
];
# Media keys
"XF86AudioRaiseVolume" = {
action.spawn = ["wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"];
allow-when-locked = true;
};
"XF86AudioLowerVolume" = {
action.spawn = ["wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"];
allow-when-locked = true;
};
"XF86AudioMute" = {
action.spawn = ["wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"];
allow-when-locked = true;
};
"XF86AudioMicMute" = {
action.spawn = ["wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"];
allow-when-locked = true;
};
"XF86AudioPlay" = {
action.spawn = ["playerctl" "play-pause"];
};
"XF86MonBrightnessUp" = {
action.spawn = ["brillo" "-q" "-u 300000" "-A 5"];
allow-when-locked = true;
};
"XF86MonBrightnessDown" = {
action.spawn = ["brillo" "-q" "-u 300000" "-U 5"];
allow-when-locked = true;
};
# set on media key since framework laptops have a gear as the button label
"XF86AudioMedia" = {
action.spawn = ["sh" "-c" "env XDG_CURRENT_DESKTOP=gnome gnome-control-center"];
};
"XF86PowerOff".action.spawn = "wlogout";
};
}

View file

@ -0,0 +1,183 @@
{
lib,
pkgs,
config,
osConfig,
...
}: let
inherit (lib) mkMerge mkIf;
in {
imports = [./binds.nix];
xdg.portal = {
enable = true;
xdgOpenUsePortal = true;
extraPortals = [pkgs.xdg-desktop-portal-gtk pkgs.xdg-desktop-portal-gnome pkgs.gnome-keyring];
config = {
common = {
default = ["gtk"];
"org.freedesktop.impl.portal.ScreenCast" = ["gnome"];
"org.freedesktop.impl.portal.Secret" = ["gnome-keyring"];
};
};
};
programs.niri = mkMerge [
{
settings = {
input = {
power-key-handling.enable = false;
keyboard.xkb = {
layout = "us";
options = "compose:ralt";
};
};
prefer-no-csd = true;
hotkey-overlay.skip-at-startup = true;
layout = {
focus-ring = {
enable = true;
};
always-center-single-column = true;
};
# https://github.com/sodiboo/system/blob/2978f4d79c51a5bd7e38a9cd75e3ec9046aa7e75/niri.mod.nix#L418-L434
outputs = let
cfg = config.programs.niri.settings.outputs;
in {
"HDMI-A-1" = {
mode = {
width = 1920;
height = 1080;
refresh = 60.0;
};
position.x = -cfg."HDMI-A-1".mode.width;
position.y = 0;
};
"DP-1" = {
mode = {
width = 2560;
height = 1440;
refresh = 144.0;
};
position.x = 0;
position.y = 0;
};
};
window-rules = [
{
draw-border-with-background = false;
geometry-corner-radius = let
r = 8.0;
in {
top-left = r;
top-right = r;
bottom-left = r;
bottom-right = r;
};
clip-to-geometry = true;
}
{
matches = [
{app-id = "foot";}
];
default-column-width = {proportion = 0.5;};
}
];
environment = {
"NIXOS_OZONE_WL" = "1";
"DISPLAY" = ":0";
"_JAVA_AWT_WM_NONREPARENTING" = "1"; # https://wiki.archlinux.org/title/Sway#Java_applications
};
};
}
(mkIf osConfig.theme.enable (let
inherit (osConfig.theme.scheme) palette;
in {
settings.layout.focus-ring.active.color = palette.base0E;
}))
];
# copied from https://github.com/linyinfeng/dotfiles/blob/c00fe3b1562ad947672863a43e455bc2f01a56b6/home-manager/profiles/niri/default.nix#L594-L611
systemd.user.services.xwayland-satellite = {
Unit = {
PartOf = ["graphical-session.target"];
After = ["graphical-session.target"];
Requisite = ["graphical-session.target"];
};
Install = {
WantedBy = ["niri.service"];
};
Service = {
Type = "simple";
ExecStart = "${lib.getExe pkgs.xwayland-satellite} :0";
NotifyAccess = "all";
StandardOutput = "journal";
Restart = "on-failure";
};
};
programs.wlogout = {
enable = true;
layout = let
systemd = let
systemd = lib.getExe' pkgs.systemd;
in {
loginctl = systemd "loginctl";
systemctl = systemd "systemctl";
};
in [
{
action = "${systemd.loginctl} lock-session";
keybind = "l";
label = "lock";
text = "Lock";
}
{
action = "${systemd.systemctl} hibernate";
keybind = "h";
label = "hibernate";
text = "Hibernate";
}
{
action = "${
systemd.loginctl
} terminate-user ${
config.home.username
}";
keybind = "q";
label = "logout";
text = "Logout";
}
{
action = "${systemd.systemctl} poweroff";
keybind = "p";
label = "shutdown";
text = "Shutdown";
}
{
action = "${systemd.systemctl} suspend";
keybind = "s";
label = "suspend";
text = "Suspend";
}
{
action = "${systemd.systemctl} reboot";
keybind = "r";
label = "reboot";
text = "Reboot";
}
];
};
}

View file

@ -0,0 +1,37 @@
{
inputs,
config,
pkgs,
...
}: {
imports = [
inputs.plasma-manager.homeManagerModules.plasma-manager
];
rograms.plasma = {
enable = true;
workspace = {
lookAndFeel = "org.kde.breezedark.desktop";
inherit (config.theme) wallpaper;
};
input = {
touchpads = [
{
enable = true;
naturalScroll = true;
vendorId = "093a";
productId = "0274";
name = "PIXA3854:00 093A:0274 Touchpad";
}
];
keyboard = {
options = [
"compose:ralt"
];
};
};
};
home.packages = with pkgs; [
qalculate-qt
];
}

19
home/programs/swaybg.nix Normal file
View file

@ -0,0 +1,19 @@
# stolen from https://raw.githubusercontent.com/carlsvelz/dotfiles/a7a109b2e19f73062b4961e7be75836e6d13408c/home/wayland/swaybg.nix
{
pkgs,
lib,
osConfig,
...
}: {
systemd.user.services.swaybg = {
Unit = {
Description = "Wayland wallpaper daemon";
PartOf = ["graphical-session.target"];
};
Service = {
ExecStart = "${lib.getExe pkgs.swaybg} -i ${osConfig.theme.wallpaper} -m fill";
Restart = "on-failure";
};
Install.WantedBy = ["graphical-session.target"];
};
}

View file

@ -0,0 +1,20 @@
{
lib,
config,
...
}: {
services.swayidle = {
enable = true;
events = [
{
event = "lock";
command = "${lib.getExe config.programs.swaylock.package} --daemonize";
}
{
event = "before-sleep";
command = "${lib.getExe config.programs.swaylock.package} --daemonize";
}
];
};
systemd.user.services.swayidle.Unit.After = lib.mkForce ["graphical-session.target"];
}

View file

@ -0,0 +1,64 @@
{
pkgs,
osConfig,
lib,
...
}: let
inherit (lib) mkMerge mkIf;
in {
# requires `security.pam.services.swaylock = { };` at the system level or else
# unlock will not work.
programs.swaylock = {
enable = true;
package = pkgs.swaylock-effects;
settings = mkMerge [
{
clock = true;
timestr = "%H:%M";
indicator = true;
indicator-radius = 111;
indicator-thickness = 9;
screenshots = true;
effect-blur = "7x5";
effect-vignette = "0.75:0.75";
effect-pixelate = 5;
ignore-empty-password = false; # needed for PAM to work with fprintd / password
}
(mkIf
osConfig.theme.enable
(let
inherit (osConfig.theme.scheme) palette;
in {
inside-color = palette.base01;
inside-clear-color = palette.base0C;
inside-caps-lock-color = palette.base09;
inside-ver-color = palette.base0D;
inside-wrong-color = palette.base08;
key-hl-color = palette.base0B;
layout-bg-color = palette.base00;
layout-border-color = palette.base05;
layout-text-color = palette.base07;
line-color = palette.base00;
line-clear-color = palette.base0C;
line-caps-lock-color = palette.base09;
line-ver-color = palette.base0D;
line-wrong-color = palette.base08;
ring-color = palette.base02;
ring-clear-color = palette.base0C;
ring-caps-lock-color = palette.base09;
ring-ver-color = palette.base0D;
ring-wrong-color = palette.base08;
separator-color = palette.base02;
text-color = palette.base07;
text-clear-color = palette.base04;
text-caps-lock-color = palette.base04;
text-ver-color = palette.base04;
text-wrong-color = palette.base04;
}))
];
};
}

View file

@ -0,0 +1,183 @@
{
pkgs,
lib,
lib',
osConfig,
config,
...
}: let
inherit (lib) getExe mkMerge mkIf optionalString;
inherit (lib') generateGtkColors;
inherit (osConfig.theme.scheme) palette;
inherit (builtins) readFile;
in {
programs.waybar = {
enable = true;
systemd.enable = true;
style =
optionalString osConfig.theme.enable generateGtkColors lib palette
+ readFile ./style.css;
settings = {
mainBar = mkMerge [
{
layer = "top";
position = "top";
height = 30;
margin-top = 6;
margin-left = 6;
margin-right = 6;
margin-bottom = 0;
modules-left = ["niri/workspaces" "niri/window"];
modules-center = ["group/clock"];
modules-right =
["tray" "group/status" "group/power"]
++ lib.optional config.services.swaync.enable "custom/notification";
battery = {
interval = 10;
states = {
warning = 30;
critical = 15;
};
format = "{icon} {capacity}%";
format-charging = " {capacity}% - {time}";
format-full = " {capacity}% - Full";
format-icons = [
""
""
""
""
""
];
max-length = 25;
};
"pulseaudio" = {
format = "{icon} {volume}%";
format-bluetooth = "{icon} {volume}%";
format-muted = " ";
format-icons = {
"alsa_output.pci-0000_00_1f.3.analog-stereo" = "";
"alsa_output.pci-0000_00_1f.3.analog-stereo-muted" = "";
headphone = "";
hands-free = "";
headset = "";
phone = "";
phone-muted = "";
portable = "";
car = "";
default = [
""
""
];
};
scroll-step = 1;
on-click = "pavucontrol";
ignored-sinks = [
"Easy Effects Sink"
];
};
"power-profiles-daemon" = {
format-icons = {
default = "";
performance = "";
balanced = "";
power-saver = "";
};
};
"group/status" = {
orientation = "inherit";
modules = [
"pulseaudio"
"power-profiles-daemon"
"network"
"battery"
];
};
"group/power" = {
orientation = "inherit";
modules = [
"custom/power"
];
};
"group/clock" = {
orientation = "inherit";
modules = [
"clock#time"
"clock#date"
];
};
"custom/power" = {
format = "";
tooltip = false;
on-click = getExe pkgs.wlogout;
};
"clock#date" = {
format = "{:%D}";
tooltip-format = "<tt><big>{calendar}</big></tt>";
};
"clock#time" = {
format = "{:%H:%M}";
tooltip-format = "{tz_list}";
timezones = [
osConfig.time.timeZone
"US/Eastern"
];
};
network = {
interface = "wlp1s0";
format = "{ifname}";
format-wifi = "{icon}";
format-ethernet = "{ipaddr}/{cidr} 󰊗";
format-disconnected = "";
tooltip-format = "{ifname} via {gwaddr} 󰊗";
tooltip-format-wifi = "{essid} ({signalStrength}%)";
tooltip-format-ethernet = "{ifname} ";
tooltip-format-disconnected = "Disconnected";
max-length = 50;
format-icons = [
"󰤟"
"󰤢"
"󰤥"
"󰤨"
];
};
}
(mkIf osConfig.programs.niri.enable {
"niri/window" = {
icon = true;
};
})
(mkIf config.services.swaync.enable {
"custom/notification" = {
tooltip = false;
format = "{icon}";
format-icons = {
notification = "󱅫";
none = "󰂚";
dnd-notification = "󱏧";
dnd-none = "󱏧";
};
return-type = "json";
exec = "swaync-client -swb";
on-click = "swaync-client -t -sw";
};
})
];
};
};
home.packages = [
pkgs.pavucontrol
];
}

View file

@ -0,0 +1,91 @@
* {
/* `otf-font-awesome` is required to be installed for icons */
border: none;
border-radius: 0px;
min-height: 0;
}
window#waybar {
border-radius: 2em;
font-family: "Symbols Nerd Font", Inter, sans-serif;
font-size: 16px;
font-style: normal;
background: alpha(
@base00,
0.9999999
); /* niri issue workaround, thanks https://github.com/oatmealine/nix-config/blob/bfdddd2cb36ef659bcddc28e0dbb542b6db8b3bc/modules/desktop/themes/catppuccin/waybar.css#L14 */
color: @base05;
}
#workspaces,
.modules-right box {
background: @base02;
padding: 0.15em 0.25em;
border-radius: 1em;
margin: 0 0.25em;
}
#workspaces {
padding: 0;
background: @base02;
}
#workspaces button:nth-child(1) {
border-top-left-radius: 1em;
border-bottom-left-radius: 1em;
}
#workspaces button:nth-last-child(1) {
border-top-right-radius: 1em;
border-bottom-right-radius: 1em;
}
#workspaces button {
padding: 0 0.5em;
background-color: transparent;
}
#workspaces button:hover {
background: rgba(255, 255, 255, 0.1);
box-shadow: none;
}
#workspaces button.active {
background: @base0E;
color: @base02;
}
#workspaces button.urgent {
background: @base08;
}
#window {
margin-left: 1em;
}
.modules-left,
.modules-right {
margin: 0.4em 0.5em;
}
#battery,
#clock,
#network,
#pulseaudio,
#tray,
#power-profiles-daemon {
padding: 0 0.5em;
}
.modules-left,
.modules-right {
margin: 0.4em 0.5em;
}
#custom-power {
padding: 0 1.2em;
color: @base08;
}
#custom-notification {
padding: 0 1.2em;
}

35
home/programs/xdg.nix Normal file
View file

@ -0,0 +1,35 @@
{config, ...}: {
xdg = {
enable = true;
cacheHome = config.home.homeDirectory + "/.local/cache";
mimeApps = {
enable = true;
defaultApplications = {
"default-web-browser" = ["firefox.desktop"];
"text/html" = ["firefox.desktop"];
"x-scheme-handler/http" = ["firefox.desktop"];
"x-scheme-handler/https" = ["firefox.desktop"];
"x-scheme-handler/about" = ["firefox.desktop"];
"x-scheme-handler/unknown" = ["firefox.desktop"];
"x-scheme-handler/chrome" = ["chromium-browser.desktop"];
"inode/directory" = ["yazi.desktop"];
"application/pdf" = ["org.pwmt.zathura-pdf-mupdf.desktop"];
"image/png" = ["org.gnome.Loupe.desktop"];
"image/svg" = [" org.gnome.Loupe.desktop"];
"image/jpeg" = ["org.gnome.Loupe.desktop"];
"image/gif" = [" org.gnome.Loupe.desktop"];
"video/mp4" = ["io.github.celluloid_player.Celluloid.desktop"];
"video/avi" = ["io.github.celluloid_player.Celluloid.desktop"];
"video/mkv" = ["io.github.celluloid_player.Celluloid.desktop"];
};
};
userDirs = {
enable = true;
createDirectories = true;
extraConfig = {
XDG_SCREENSHOTS_DIR = "${config.xdg.userDirs.pictures}/Screenshots";
};
};
};
}

View file

@ -0,0 +1,37 @@
{
osConfig,
lib,
lib',
...
}: let
inherit (lib) optionalString;
inherit (lib') generateGtkColors;
inherit (osConfig.theme.scheme) palette;
inherit (builtins) readFile;
in {
services.swaync = {
enable = true;
style =
optionalString osConfig.theme.enable generateGtkColors lib palette
+ readFile ./style.css;
settings = {
positionX = "right";
positionY = "top";
layer = "overlay";
control-center-layer = "top";
layer-shell = true;
cssPriority = "application";
control-center-margin-top = 0;
control-center-margin-bottom = 0;
control-center-margin-right = 0;
control-center-margin-left = 0;
notification-2fa-action = true;
notification-inline-replies = false;
notification-icon-size = 64;
notification-body-image-height = 100;
notification-body-image-width = 200;
};
};
# systemd.user.services.swaync.Service.Environment = "WAYLAND_DISPLAY=wayland-1";
systemd.user.services.swaync.Unit.ConditionEnvironment = lib.mkForce "";
}

View file

@ -0,0 +1,3 @@
{
services.udiskie.enable = true;
}

10
home/terminal/default.nix Normal file
View file

@ -0,0 +1,10 @@
{
imports = [
./programs
./shell
];
home.sessionVariables = {
EDITOR = "nvim";
};
}

View file

@ -0,0 +1,46 @@
{
osConfig,
config,
lib,
...
}: let
inherit (lib) mkIf;
in {
programs.foot = {
enable = true;
settings = {
main = {
term = "xterm-256color";
font = "monospace:size=14";
shell = "${lib.getExe config.programs.fish.package}";
};
colors = mkIf osConfig.theme.enable (let
inherit (lib) mapAttrs;
inherit (lib.strings) removePrefix;
# because someone thought this was a great idea: https://github.com/tinted-theming/schemes/commit/61058a8d2e2bd4482b53d57a68feb56cdb991f0b
palette = mapAttrs (_: color: removePrefix "#" color) osConfig.theme.scheme.palette;
in {
background = palette.base00;
foreground = palette.base05;
regular0 = palette.base01;
regular1 = palette.base08;
regular2 = palette.base0B;
regular3 = palette.base0A;
regular4 = palette.base0D;
regular5 = palette.base0E;
regular6 = palette.base0C;
regular7 = palette.base06;
bright0 = palette.base02;
bright1 = palette.base08;
bright2 = palette.base0B;
bright3 = palette.base0A;
bright4 = palette.base0D;
bright5 = palette.base0E;
bright6 = palette.base0C;
bright7 = palette.base07;
});
};
};
}

View file

@ -0,0 +1,28 @@
{
config,
inputs,
...
}: {
programs.gnome-terminal = {
enable = true;
showMenubar = true;
profile = {
"4621184a-b921-42cf-80a0-7784516606f2" = {
default = true;
audibleBell = false;
allowBold = true;
boldIsBright = true;
visibleName = "default";
font = "Intel One Mono 14";
colors = let
inherit (inputs.basix.schemeData.base16.${config.theme.scheme}) palette;
in {
backgroundColor = "#${palette.base00}";
foregroundColor = builtins.trace "#${palette.base05}" "#${palette.base05}";
palette = builtins.attrValues (builtins.mapAttrs (_: color: "#${color}") palette);
};
};
};
};
}

View file

@ -0,0 +1,37 @@
{
config,
inputs,
pkgs,
...
}: {
programs.konsole = let
inherit (config.theme) scheme;
schemeData = inputs.basix.schemeData.base16.${scheme};
in {
enable = true;
defaultProfile = "default";
profiles = {
default = {
font = {
name = "monospace";
size = 14;
};
colorScheme = schemeData.name;
};
};
extraConfig = {
"MainWindow" = {
"MenuBar" = "Disabled";
"ToolBarsMovable" = "Disabled";
};
"KonsoleWindow" = {
"ShowMenuBarByDefault" = "false";
};
};
customColorSchemes = {
"${schemeData.name}" = pkgs.lib.mkKonsoleColorScheme schemeData;
};
};
}

View file

@ -0,0 +1,71 @@
{
programs.wezterm = {
enable = true;
# package = inputs.wezterm.packages.${pkgs.system}.default;
extraConfig = ''
local w = require('wezterm')
local function is_vim(pane)
return pane:get_user_vars().IS_NVIM == 'true'
end
local direction_keys = {
h = 'Left',
j = 'Down',
k = 'Up',
l = 'Right',
}
local function split_nav(resize_or_move, key)
return {
key = key,
mods = resize_or_move == 'resize' and 'META' or 'CTRL',
action = w.action_callback(function(win, pane)
if is_vim(pane) then
win:perform_action({
SendKey = { key = key, mods = resize_or_move == 'resize' and 'META' or 'CTRL' },
}, pane)
else
if resize_or_move == 'resize' then
win:perform_action({ AdjustPaneSize = { direction_keys[key], 3 } }, pane)
else
win:perform_action({ ActivatePaneDirection = direction_keys[key] }, pane)
end
end
end),
}
end
return {
enable_wayland = false,
front_end = "WebGpu",
hide_tab_bar_if_only_one_tab = true,
show_new_tab_button_in_tab_bar = false,
harfbuzz_features = { "ss01", "ss03" },
leader = { key = " ", mods = "CTRL", timeout_milliseconds = 1000 },
keys = {
{
mods = "LEADER",
key = "-",
action = wezterm.action.SplitVertical { domain = "CurrentPaneDomain" }
},
{
mods = "LEADER",
key = "=",
action = wezterm.action.SplitHorizontal { domain = "CurrentPaneDomain" }
},
split_nav('move', 'h'),
split_nav('move', 'j'),
split_nav('move', 'k'),
split_nav('move', 'l'),
split_nav('resize', 'h'),
split_nav('resize', 'j'),
split_nav('resize', 'k'),
split_nav('resize', 'l'),
},
}
'';
};
}

View file

@ -0,0 +1,22 @@
{pkgs, ...}: {
imports = [
./git.nix
./gnupg.nix
./tmux.nix
./direnv.nix
./nix-index.nix
./yazi.nix
];
home.packages = with pkgs; [
# archives
zip
unzip
unrar
# utils
fd
file
ripgrep
];
}

View file

@ -0,0 +1,8 @@
{
programs = {
direnv = {
enable = true;
nix-direnv.enable = true;
};
};
}

View file

@ -0,0 +1,18 @@
{
programs.git = {
enable = true;
userName = "Anthony Rodriguez";
userEmail = "anthony@nezia.dev";
signing = {
signByDefault = true;
key = "EE3BE97C040A86CE";
};
extraConfig = {
push.autoSetupRemote = true;
};
};
programs.lazygit = {
enable = true;
};
}

View file

@ -0,0 +1,8 @@
{
programs.gpg.enable = true;
services.gpg-agent = {
enable = true;
enableBashIntegration = true;
enableFishIntegration = true;
};
}

View file

@ -0,0 +1,11 @@
{inputs, ...}: {
imports = [inputs.nix-index-db.hmModules.nix-index];
programs = {
nix-index = {
enable = true;
symlinkToCacheHome = true; # needed for comma
};
command-not-found.enable = false;
nix-index-database.comma.enable = true;
};
}

View file

@ -0,0 +1,44 @@
{pkgs, ...}: {
programs.tmux = {
enable = true;
prefix = "C-space";
escapeTime = 10;
clock24 = true;
keyMode = "vi";
mouse = true;
baseIndex = 1;
extraConfig = ''
set-option -a terminal-features "''${TERM}:RGB"
'';
plugins = with pkgs; [
{
plugin = tmuxPlugins.catppuccin;
extraConfig = ''
set -g @catppuccin_window_left_separator ""
set -g @catppuccin_window_right_separator " "
set -g @catppuccin_window_middle_separator " "
set -g @catppuccin_window_number_position "right"
set -g @catppuccin_window_default_fill "number"
set -g @catppuccin_window_default_text "#W"
set -g @catppuccin_window_current_fill "number"
set -g @catppuccin_window_current_text "#W"
set -g @catppuccin_status_modules_right "directory user host session"
set -g @catppuccin_status_left_separator " "
set -g @catppuccin_status_right_separator ""
set -g @catppuccin_status_fill "icon"
set -g @catppuccin_status_connect_separator "no"
set -g @catppuccin_directory_text "#{pane_current_path}"
set -g @catppuccin_flavor 'frappe'
'';
}
tmuxPlugins.vim-tmux-navigator
tmuxPlugins.yank
];
};
programs.fzf.tmux.enableShellIntegration = true;
}

View file

@ -0,0 +1,26 @@
{pkgs, ...}: {
programs.yazi = let
# https://github.com/iynaix/dotfiles/blob/8bb1568019ea26f034ac1af9c499b3ff102391a5/home-manager/shell/yazi.nix#L9-L11
mkYaziPlugin = name: text: {
"${name}" = toString (pkgs.writeTextDir "${name}.yazi/init.lua" text) + "/${name}.yazi";
};
in {
enable = true;
enableFishIntegration = true;
plugins = mkYaziPlugin "smart-enter" ''
return {
entry = function()
local h = cx.active.current.hovered
ya.manager_emit(h and h.cha.is_dir and "enter" or "open", { hovered = true })
end,
}
'';
keymap.manager.prepend_keymap = [
{
on = "l";
run = "plugin --sync smart-enter";
desc = "Enter the child directory, or open the file";
}
];
};
}

View file

@ -0,0 +1,8 @@
{
imports = [
./starship.nix
./zoxide.nix
./nushell.nix
./fish.nix
];
}

View file

@ -0,0 +1,34 @@
{pkgs, ...}: {
programs.fish = {
enable = true;
interactiveShellInit = ''
set fish_greeting # Disable greeting
fish_vi_key_bindings # Enable Vi mode
'';
shellAbbrs = {
cd = "z";
ngc = "sudo nix-collect-garbage -d";
};
plugins = [
{
name = "fzf";
inherit (pkgs.fishPlugins.fzf) src;
}
{
name = "autopair";
inherit (pkgs.fishPlugins.autopair) src;
}
];
};
programs.bash = {
enable = true;
initExtra = ''
if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
then
shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
fi
'';
};
}

View file

@ -0,0 +1,30 @@
{
programs.nushell = {
enable = true;
extraConfig = ''
let carapace_completer = {|spans|
carapace $spans.0 nushell ...$spans | from json
}
$env.config = {
show_banner: false,
completions: {
case_sensitive: false # case-sensitive completions
quick: true # set to false to prevent auto-selecting completions
partial: true # set to false to prevent partial filling of the prompt
algorithm: "fuzzy" # prefix or fuzzy
external: {
# set to false to prevent nushell looking into $env.PATH to find more suggestions
enable: true
# set to lower can improve completion performance at the cost of omitting some options
max_results: 100
completer: $carapace_completer # check 'carapace_completer'
}
}
}
'';
};
programs.carapace = {
enable = true;
};
}

View file

@ -0,0 +1,6 @@
{
programs.starship = {
enable = true;
enableTransience = true;
};
}

View file

@ -0,0 +1,6 @@
{
programs.zoxide = {
enable = true;
enableBashIntegration = false;
};
}

View file

@ -1,26 +1,25 @@
{inputs, ...}: {
{inputs, ...}: let
system = "${inputs.self}/system";
in {
imports = [
./hardware-configuration.nix
./networking.nix # generated at runtime by nixos-infect
inputs.agenix.nixosModules.default
"${system}/services/forgejo.nix"
"${system}/services/searx.nix"
"${system}/services/portfolio.nix"
];
local = {
systemVars = {
hostName = "anastacia";
};
profiles.server.enable = true;
};
boot.tmp.cleanOnBoot = true;
zramSwap.enable = true;
networking.hostName = "anastacia";
networking.domain = "";
services.openssh.enable = true;
users.users.root.openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEzs7SQH0Vjt9JHoXXmWy9fPU1I3rrRWV5magZFrI5al"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHKEPlN/GU9nJZPleA77HH5NA+6vyhhM84fTSjEwnEgq"
];
system.stateVersion = "23.11";
}

View file

@ -1,8 +1,4 @@
{
lib,
modulesPath,
...
}: {
{modulesPath, ...}: {
imports = [(modulesPath + "/profiles/qemu-guest.nix")];
boot = {
loader.grub.device = "/dev/sda";
@ -13,6 +9,4 @@
device = "/dev/sda1";
fsType = "ext4";
};
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
}

View file

@ -1,29 +1,29 @@
{
self,
inputs,
...
}: let
lib' = import ../lib inputs.nixpkgs.lib;
{inputs, ...}: let
lib' = import ../lib;
mkSystem = args:
inputs.nixpkgs.lib.nixosSystem {
specialArgs = {inherit self inputs lib';};
modules =
(args.modules or [])
++ [../modules];
specialArgs = {inherit inputs lib';};
modules = args.modules or [];
};
in {
vamos = mkSystem {
modules = [
./vamos
../modules
inputs.nixos-hardware.nixosModules.framework-13-7040-amd
];
};
solaire = mkSystem {
modules = [./solaire];
modules = [
./solaire
../modules
];
};
anastacia = mkSystem {
modules = [./anastacia];
modules = [
./anastacia
];
};
}

View file

@ -1,6 +0,0 @@
_: {
local.style = {
enable = true;
wallpaper = ../../../assets/wallpapers/lucy-edgerunners-wallpaper.jpg;
};
}

View file

@ -1,25 +1,36 @@
_: {
imports = [./hardware-configuration.nix ./config/theme.nix];
{
inputs,
specialArgs,
...
}: let
system = "${inputs.self}/system";
home = "${inputs.self}/home";
in {
imports = [
./hardware-configuration.nix
./modules
local = {
systemVars = {
hostName = "solaire";
username = "nezia";
};
homeVars = {
fullName = "Anthony Rodriguez";
email = "anthony@nezia.dev";
signingKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEzs7SQH0Vjt9JHoXXmWy9fPU1I3rrRWV5magZFrI5al nezia@solaire";
};
system
"${system}/hardware/uni-sync.nix"
profiles = {
desktop.enable = true;
gaming.enable = true;
};
"${system}/programs/gnome.nix"
"${system}/programs/games.nix"
"${system}/hardware/nvidia.nix"
modules = {
hyprland.enable = true;
nvidia.enable = true;
};
"${system}/services/syncthing.nix"
];
home-manager = {
users.nezia.imports = [
home
"${home}/programs/games"
"${home}/terminal/emulators/foot.nix"
"${home}/programs/gnome"
];
extraSpecialArgs = specialArgs;
};
networking.hostName = "solaire";
environment.variables.FLAKE = "/home/nezia/.dotfiles";
}

View file

@ -0,0 +1,3 @@
{
imports = [./theme.nix];
}

View file

@ -0,0 +1,8 @@
{
theme = {
wallpaper = ../../../wallpapers/lucy-edgerunners-wallpaper.jpg;
schemeName = "catppuccin-macchiato";
enable = true;
gtk.enable = false;
};
}

View file

@ -1,9 +0,0 @@
{pkgs, ...}: {
local.style = {
enable = true;
wallpaper = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/NixOS/nixos-artwork/refs/heads/master/wallpapers/nix-wallpaper-simple-dark-gray.png";
hash = "sha256-JaLHdBxwrphKVherDVe5fgh+3zqUtpcwuNbjwrBlAok=";
};
};
}

View file

@ -1,28 +1,51 @@
_: {
{
inputs,
specialArgs,
...
}: let
system = "${inputs.self}/system";
home = "${inputs.self}/home";
in {
imports = [
./hardware-configuration.nix
./config/theme.nix
./modules
"${system}"
"${system}/core/lanzaboote.nix"
"${system}/hardware/fprintd.nix"
"${system}/services/power.nix"
"${system}/services/brightness.nix"
"${system}/services/logind.nix"
"${system}/services/greetd.nix"
"${system}/services/kanata.nix"
"${system}/programs/niri"
"${system}/services/gnome.nix"
"${system}/services/mail.nix"
"${system}/services/syncthing.nix"
];
local = {
systemVars = {
hostName = "vamos";
username = "nezia";
};
home-manager = {
users.nezia.imports = [
"${home}"
"${home}/services/udiskie.nix"
homeVars = {
fullName = "Anthony Rodriguez";
email = "anthony@nezia.dev";
signingKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHKEPlN/GU9nJZPleA77HH5NA+6vyhhM84fTSjEwnEgq nezia@vamos";
};
"${home}/programs/niri"
"${home}/programs/waybar"
"${home}/services/swaync"
"${home}/programs/fuzzel.nix"
"${home}/programs/swaybg.nix"
"${home}/programs/swaylock.nix"
"${home}/programs/swayidle.nix"
profiles = {
desktop.enable = true;
laptop.enable = true;
};
modules = {
hyprland.enable = true;
};
"${home}/terminal/emulators/foot.nix"
];
extraSpecialArgs = specialArgs;
};
networking.hostName = "vamos";
environment.variables.FLAKE = "/home/nezia/.dotfiles";
}

View file

@ -0,0 +1,3 @@
{
imports = [./theme.nix];
}

View file

@ -0,0 +1,9 @@
{pkgs, ...}: {
theme = {
enable = true;
wallpaper = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/NixOS/nixos-artwork/e0cf0eb237dc5baba86661a3572b20a6183c1876/wallpapers/nix-wallpaper-nineish-catppuccin-frappe.png?raw=true";
hash = "sha256-/HAtpGwLxjNfJvX5/4YZfM8jPNStaM3gisK8+ImRmQ4=";
};
};
}

View file

@ -1,27 +1,13 @@
lib:
with lib; let
# thanks fufexan https://github.com/fufexan/dotfiles/blob/2947f27791e97ea33c48af4ee2d0188fe03f80dd/lib/colors/default.nix#L8-L66
# convert rrggbb hex to rgba(r, g, b, a) css
rgba = c: alpha: let
color = removePrefix "#" c;
r = toString (hexToDec (__substring 0 2 color));
g = toString (hexToDec (__substring 2 2 color));
b = toString (hexToDec (__substring 4 2 color));
a = toString alpha;
res = "rgba(${r}, ${g}, ${b}, ${a})";
in
res;
let
# convert rrggbb hex to rgba(r, g, b, a)
rgba = lib: color: opacity: let
r = toString (hexToDec lib (builtins.substring 0 2 color));
g = toString (hexToDec lib (builtins.substring 2 2 color));
b = toString (hexToDec lib (builtins.substring 4 2 color));
in "rgba(${r}, ${g}, ${b}, ${opacity})";
blurImage = pkgs: path:
pkgs.runCommand "${builtins.baseNameOf path}-blurred" {
buildInputs = [pkgs.imagemagick];
}
''
magick ${path} -gaussian-blur 0x12 "$out"
'';
# functions copied from https://gist.github.com/corpix/f761c82c9d6fdbc1b3846b37e1020e11
# convert a hex value to an integer
hexToDec = v: let
hexToDec = lib: v: let
# Map of hex characters to their decimal values
hexToInt = {
"0" = 0;
"1" = 1;
@ -46,32 +32,29 @@ with lib; let
"E" = 14;
"F" = 15;
};
chars = stringToCharacters v;
charsLen = length chars;
# Remove any leading `#` from the input
cleanHex =
if lib.strings.substring 0 1 v == "#"
then lib.strings.substring 1 (builtins.stringLength v - 1) v
else v;
# Convert the cleaned string into characters
chars = lib.strings.stringToCharacters cleanHex;
in
foldl
(a: v: a + v)
0
(imap0
(k: v: hexToInt."${v}" * (pow 16 (charsLen - k - 1)))
chars);
# Fold over the characters to calculate the decimal value
builtins.foldl' (acc: char: acc * 16 + hexToInt."${char}") 0 chars;
pow = let
pow' = base: exponent: value:
# FIXME: It will silently overflow on values > 2**62 :(
# The value will become negative or zero in this case
if exponent == 0
then 1
else if exponent <= 1
then value
else (pow' base (exponent - 1) (value * base));
in
base: exponent: pow' base exponent base;
generateGtkColors = palette: (concatLines
(mapAttrsToList
blurImage = pkgs: path:
pkgs.runCommand "${builtins.baseNameOf path}-blurred" {
buildInputs = [pkgs.imagemagick];
}
''
magick ${path} -gaussian-blur 0x12 "$out"
'';
generateGtkColors = lib: palette: (lib.concatLines
(lib.mapAttrsToList
(name: color: "@define-color ${name} ${color};")
palette));
in {
inherit blurImage generateGtkColors rgba;
generators = import ./generators lib;
}

View file

@ -1,4 +0,0 @@
lib: {
toHyprConf = import ./tohyprconf.nix lib;
gtk = import ./gtk.nix lib;
}

View file

@ -1,31 +0,0 @@
lib: let
# toGtk3Ini , formatGtk2Option , and finalGtk2Text are all taken from https://github.com/nix-community/home-manager, with some minor modifications to their function.
# All of the gtk generator functions are available under the MIT License.
inherit (lib) generators isBool boolToString mapAttrsToList concatMapStrings isString escape;
formatGtk2Option = n: v: let
v' =
if isBool v
then boolToString v
else if isString v
then ''"${v}"''
else toString v;
in "${escape ["="] n} = ${v'}";
in {
toGtk3Ini = generators.toINI {
mkKeyValue = key: value: let
value' =
if isBool value
then boolToString value
else toString value;
in "${escape ["="] key}=${value'}";
};
formatGtk2Option = n: v: let
v' =
if isBool v
then boolToString v
else if isString v
then ''"${v}"''
else toString v;
in "${escape ["="] n} = ${v'}";
finalGtk2Text = {attrs}: concatMapStrings (l: l + "\n") (mapAttrsToList formatGtk2Option attrs);
}

View file

@ -1,63 +0,0 @@
lib: {
attrs,
indentLevel ? 0,
importantPrefixes ? ["$" "bezier" "name"],
}: let
inherit
(lib)
all
concatMapStringsSep
concatStrings
concatStringsSep
filterAttrs
foldl
generators
hasPrefix
isAttrs
isList
mapAttrsToList
replicate
;
initialIndent = concatStrings (replicate indentLevel " ");
toHyprconf' = indent: attrs: let
sections =
filterAttrs (_: v: isAttrs v || (isList v && all isAttrs v)) attrs;
mkSection = n: attrs:
if lib.isList attrs
then (concatMapStringsSep "\n" (a: mkSection n a) attrs)
else ''
${indent}${n} {
${toHyprconf' " ${indent}" attrs}${indent}}
'';
mkFields = generators.toKeyValue {
listsAsDuplicateKeys = true;
inherit indent;
};
allFields =
filterAttrs (_: v: !(isAttrs v || (isList v && all isAttrs v)))
attrs;
isImportantField = n: _:
foldl (acc: prev:
if hasPrefix prev n
then true
else acc)
false
importantPrefixes;
importantFields = filterAttrs isImportantField allFields;
fields =
builtins.removeAttrs allFields
(mapAttrsToList (n: _: n) importantFields);
in
mkFields importantFields
+ concatStringsSep "\n" (mapAttrsToList mkSection sections)
+ mkFields fields;
in
toHyprconf' initialIndent attrs

View file

@ -1,39 +0,0 @@
{
lib,
config,
...
}: let
inherit (lib.modules) mkIf;
inherit (config.local.profiles) server;
in {
config = mkIf (!server.enable) {
boot = {
loader = {
timeout = 0;
systemd-boot = {
enable = true;
consoleMode = "2";
};
efi.canTouchEfiVariables = true;
};
plymouth = {
enable = true;
extraConfig = ''
[Daemon]
DeviceScale=2
'';
};
consoleLogLevel = 0;
initrd.systemd.enable = true;
initrd.verbose = false;
kernelParams = [
"quiet"
"systemd.show_status=auto"
"rd.udev.log_level=3"
];
};
};
}

View file

@ -1,15 +0,0 @@
{lib, ...}: {
imports = [
./hardware
./boot.nix
./fonts.nix
./locales.nix
./networking.nix
./nix.nix
./users.nix
./security.nix
];
system.stateVersion = lib.mkDefault "24.05";
zramSwap.enable = true;
}

View file

@ -1,31 +0,0 @@
{
lib,
pkgs,
config,
...
}: {
config = lib.mkIf config.local.profiles.desktop.enable {
fonts = {
enableDefaultPackages = false;
packages = [
pkgs._0xproto
pkgs.noto-fonts-color-emoji
pkgs.nerd-fonts.symbols-only
pkgs.noto-fonts
pkgs.noto-fonts-cjk-sans
pkgs.noto-fonts-extra
];
fontconfig = {
enable = true;
defaultFonts = {
serif = ["Noto Serif"];
sansSerif = ["Inter Medium"];
monospace = ["0xProto"];
emoji = ["Noto Color Emoji"];
};
};
};
};
}

View file

@ -1,13 +0,0 @@
{
lib,
config,
...
}: let
inherit (lib.modules) mkIf;
inherit (config.local.profiles) desktop;
in {
config = mkIf desktop.enable {
hardware.bluetooth.enable = true; # enables support for Bluetooth
hardware.bluetooth.powerOnBoot = true; # powers up the default Bluetooth controller on boot
};
}

View file

@ -1,10 +0,0 @@
{
imports = [
./bluetooth.nix
./fprintd.nix
./fwupd.nix
./nvidia.nix
./printing.nix
./via.nix
];
}

View file

@ -1,9 +0,0 @@
{
lib,
config,
...
}: {
config = lib.mkIf config.local.profiles.laptop.enable {
services.fprintd.enable = true;
};
}

View file

@ -1,9 +0,0 @@
{
lib,
config,
...
}: {
config = lib.mkIf config.local.profiles.desktop.enable {
services.fwupd.enable = true;
};
}

View file

@ -1,25 +0,0 @@
{
lib,
config,
...
}: let
inherit (lib) mkIf;
in {
config = mkIf config.local.modules.nvidia.enable {
hardware.graphics.enable = true;
services.xserver.videoDrivers = ["nvidia"];
hardware.nvidia = {
open = false;
modesetting.enable = true;
powerManagement.enable = true;
nvidiaSettings = true;
package = config.boot.kernelPackages.nvidiaPackages.beta;
};
# https://wiki.hyprland.org/Nvidia/#suspendwakeup-issues
boot.kernelParams = [
"nvidia_drm.fbdev=1"
"nvidia.NVreg_PreserveVideoMemoryAllocations=1"
];
};
}

View file

@ -1,36 +0,0 @@
{
lib,
pkgs,
config,
...
}: {
config = lib.mkIf config.local.profiles.desktop.enable {
services = {
# setup printing service
printing.enable = true;
avahi = {
enable = true;
nssmdns4 = true;
openFirewall = true;
};
printing.drivers = [
pkgs.gutenprint
pkgs.hplip
];
udev.packages = [
pkgs.sane-airscan
pkgs.utsushi
];
};
hardware.sane.enable = true; # enables support for SANE scanners
hardware.sane.extraBackends = [
pkgs.sane-airscan # generic
pkgs.hplip # HP
pkgs.utsushi # other printers
];
};
}

View file

@ -1,14 +0,0 @@
{
lib,
pkgs,
config,
...
}: {
config = lib.mkIf config.local.profiles.gaming.enable {
hardware.keyboard.qmk.enable = true;
environment.systemPackages = with pkgs; [
via
];
services.udev.packages = [pkgs.via];
};
}

View file

@ -1,21 +0,0 @@
{
lib,
config,
...
}: {
config = lib.mkIf (!config.local.profiles.server.enable) {
networking = {
inherit (config.local.systemVars) hostName;
nameservers = ["1.1.1.1" "1.0.0.1"];
networkmanager = {
enable = true;
dns = "systemd-resolved";
wifi.powersave = true;
};
};
services.resolved = {
enable = true;
dnsovertls = "opportunistic";
};
};
}

View file

@ -1,32 +0,0 @@
{
inputs,
pkgs,
...
}: {
nix = {
package = pkgs.lix;
settings = {
accept-flake-config = true;
warn-dirty = false;
auto-optimise-store = true;
trusted-users = ["root" "@wheel"];
experimental-features = [
"nix-command"
"flakes"
];
};
nixPath = ["nixpkgs=${inputs.nixpkgs}"];
};
nixpkgs = {
config = {
allowUnfree = true;
permittedInsecurePackages = [
"cinny-4.2.3"
"cinny-unwrapped-4.2.3"
"segger-jlink-qt4-810"
];
segger-jlink.acceptLicense = true;
};
};
}

View file

@ -1,43 +0,0 @@
{
lib,
pkgs,
config,
...
}: {
config = lib.mkIf config.local.profiles.desktop.enable {
security = {
polkit.enable = true;
polkit = {
extraConfig = ''
polkit.addRule(function(action, subject) {
if (
subject.isInGroup("users")
&& (
action.id == "org.freedesktop.login1.reboot" ||
action.id == "org.freedesktop.login1.reboot-multiple-sessions" ||
action.id == "org.freedesktop.login1.power-off" ||
action.id == "org.freedesktop.login1.power-off-multiple-sessions"
)
)
{
return polkit.Result.YES;
}
});
'';
};
};
systemd.user.services.polkit-gnome-authentication-agent-1 = {
description = "polkit-gnome-authentication-agent-1";
wantedBy = ["graphical-session.target"];
wants = ["graphical-session.target"];
after = ["graphical-session.target"];
serviceConfig = {
Type = "simple";
ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1";
Restart = "on-failure";
RestartSec = 1;
TimeoutStopSec = 10;
};
};
};
}

View file

@ -1,38 +0,0 @@
{
self,
inputs,
lib,
config,
...
}: let
inherit (lib.modules) mkIf;
inherit (config.local.systemVars) username;
inherit (config.local.homeVars) fullName;
inherit (config.local.profiles) desktop;
in {
imports = [
inputs.hjem.nixosModules.default
inputs.hjem-rum.nixosModules.default
self.outputs.nixosModules.hjemModules
];
users.users.${username} = {
isNormalUser = true;
description = fullName;
extraGroups = mkIf desktop.enable [
"networkmanager"
"audio"
"video"
"wheel"
"plugdev"
];
};
hjem = mkIf desktop.enable {
clobberByDefault = true;
users.${username} = {
enable = true;
directory = "/home/${username}";
user = "${username}";
};
};
}

View file

@ -1,8 +1,3 @@
{
imports = [
./core
./options
./programs
./services
];
imports = [./theme];
}

View file

@ -1,10 +0,0 @@
{
imports = [
./modules
./profiles
./homeVars.nix
./style.nix
./systemVars.nix
];
}

View file

@ -1,38 +0,0 @@
{
config,
lib,
options,
...
}: let
inherit (lib) mkIf mkOption;
inherit (lib.types) str;
in {
options.local.homeVars = {
fullName = mkOption {
type = str;
description = "your full name (used for git commits and user description)";
default = "User";
};
email = mkOption {
type = str;
description = "your email (used for git commits)";
default = null;
};
signingKey = mkOption {
type = str;
description = "your ssh public key (used for signing git commits)";
};
};
config.assertions = mkIf (!config.local.profiles.server.enable) [
{
assertion = options.local.homeVars.fullName.isDefined;
}
{
assertion = options.local.homeVars.email.isDefined;
}
{
assertion = options.local.homeVars.signingKey.isDefined;
}
];
}

View file

@ -1,6 +0,0 @@
{
imports = [
./hyprland.nix
./nvidia.nix
];
}

View file

@ -1,7 +0,0 @@
{lib, ...}: let
inherit (lib) mkEnableOption;
in {
options.local.modules.hyprland = {
enable = mkEnableOption "Hyprland modules";
};
}

View file

@ -1,7 +0,0 @@
{lib, ...}: let
inherit (lib) mkEnableOption;
in {
options.local.modules.nvidia = {
enable = mkEnableOption "nvidia";
};
}

View file

@ -1,8 +0,0 @@
{
imports = [
./desktop.nix
./gaming.nix
./laptop.nix
./server.nix
];
}

View file

@ -1,18 +0,0 @@
{
lib,
config,
...
}: let
inherit (lib) mkEnableOption;
in {
options = {
local.profiles.desktop.enable = mkEnableOption "the desktop profile";
};
config.assertions = lib.mkIf config.local.profiles.desktop.enable [
{
assertion = !config.local.profiles.server.enable;
message = "The desktop profile cannot be enabled if `local.profiles.server.enable` is set to true.";
}
];
}

View file

@ -1,18 +0,0 @@
{
lib,
config,
...
}: let
inherit (lib) mkEnableOption;
in {
options = {
local.profiles.gaming.enable = mkEnableOption "the gaming profile";
};
config.assertions = lib.mkIf config.local.profiles.gaming.enable [
{
assertion = !config.local.profiles.server.enable;
message = "The gaming profile cannot be enabled if `local.profiles.server.enable` is set to true.";
}
];
}

View file

@ -1,18 +0,0 @@
{
lib,
config,
...
}: let
inherit (lib) mkEnableOption;
in {
options = {
local.profiles.laptop.enable = mkEnableOption "the laptop profile";
};
config.assertions = lib.mkIf config.local.profiles.laptop.enable [
{
assertion = !config.local.profiles.server.enable;
message = "The laptop profile cannot be enabled if `local.profiles.server.enable` is set to true.";
}
];
}

View file

@ -1,23 +0,0 @@
{
lib,
config,
...
}: let
inherit (lib) mkEnableOption;
in {
options = {
local.profiles.server.enable = mkEnableOption "the server profile";
};
config.assertions = lib.mkIf config.local.profiles.server.enable [
{
assertion = !config.local.profiles.desktop.enable;
message = "The server profile cannot be enabled if `local.profiles.desktop.enable` is set to true.";
}
{
assertion = !config.local.profiles.gaming.enable;
message = "The server profile cannot be enabled if `local.profiles.gaming.enable` is set to true.";
}
];
}

View file

@ -1,175 +0,0 @@
{
lib,
pkgs,
config,
options,
inputs,
...
}: let
inherit (lib) attrNames mkEnableOption mkOption pathExists;
inherit (lib.types) attrs bool enum package path str;
inherit (lib.lists) singleton;
cfg = config.local.style;
in {
options.local.style = {
enable = mkEnableOption "style";
schemeName = mkOption {
description = ''
Name of the tinted-theming color scheme to use.
'';
type = enum (attrNames inputs.basix.schemeData.base16);
example = "catppuccin-mocha";
default = "catppuccin-mocha";
};
scheme = mkOption {
description = ''
Computed scheme from `config.local.style.schemeName`.
'';
type = attrs;
readOnly = true;
};
wallpaper = mkOption {
description = ''
Location of the wallpaper that will be used throughout the system.
'';
type = path;
example = lib.literalExpression "./wallpaper.png";
default = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/NixOS/nixos-artwork/e0cf0eb237dc5baba86661a3572b20a6183c1876/wallpapers/nix-wallpaper-nineish-catppuccin-frappe.png?raw=true";
hash = "sha256-/HAtpGwLxjNfJvX5/4YZfM8jPNStaM3gisK8+ImRmQ4=";
};
};
cursorTheme = {
name = mkOption {
description = ''
Name of the cursor theme.
'';
default = "phinger-cursors-dark";
};
package = mkOption {
type = package;
description = ''
Package providing the cursor theme.
'';
default = pkgs.phinger-cursors;
};
size = mkOption {
description = ''
Size of the cursor.
'';
default = 32;
};
};
avatar = mkOption {
description = ''
Path to an avatar image (used for hyprlock).
'';
default = ../../assets/avatar.png; # TODO silly, change this
};
gtk = {
enable = mkOption {
type = bool;
description = "enable GTK theming options";
default = cfg.enable;
};
theme = {
name = mkOption {
type = str;
description = "Name for the GTK theme";
default = "adw-gtk3-dark";
};
package = mkOption {
type = package;
description = "Package providing the GTK theme";
default = pkgs.adw-gtk3;
};
};
iconTheme = {
name = mkOption {
type = str;
description = "The name for the icon theme that will be used for GTK programs";
default = "MoreWaita";
};
package = mkOption {
type = package;
description = "The GTK icon theme to be used";
default = pkgs.morewaita-icon-theme.overrideAttrs {
src = inputs.morewaita;
installPhase = ''
runHook preInstall
install -d $out/share/icons/MoreWaita
cp -r . $out/share/icons/MoreWaita
cp ${../../assets/icons/my-caffeine-on-symbolic.svg} $out/share/icons/MoreWaita/symbolic/status/my-caffeine-on-symbolic.svg
cp ${../../assets/icons/my-caffeine-off-symbolic.svg} $out/share/icons/MoreWaita/symbolic/status/my-caffeine-off-symbolic.svg
gtk-update-icon-cache -f -t $out/share/icons/MoreWaita && xdg-desktop-menu forceupdate
runHook postInstall
'';
/*
a patch is needed because MoreWaita expects a `meson.build` file in the directory, containing the
name of every icon.
*/
patches = singleton (pkgs.writeText "add-caffeine-icons.patch" ''
diff --git a/symbolic/status/meson.build b/symbolic/status/meson.build
index 4e5bfc5..3bbf989 100644
--- a/symbolic/status/meson.build
+++ b/symbolic/status/meson.build
@@ -17,2 +17,4 @@ regular_files = [
'keepassxc-unlocked.svg',
+ 'my-caffeine-off-symbolic.svg',
+ 'my-caffeine-on-symbolic.svg',
'pamac-tray-no-update.svg',
'');
};
};
};
};
};
config = lib.mkIf cfg.enable {
assertions = [
(let
themePath = cfg.gtk.theme.package + /share/themes + "/${cfg.gtk.theme.name}";
in {
assertion = cfg.gtk.enable -> pathExists themePath;
message = ''
${toString themePath} set by the GTK module does not exist!
To suppress this message, make sure that
`config.local.theme.gtk.theme.package` contains
the path `${cfg.gtk.theme.name}`
'';
})
(let
iconPath = cfg.gtk.iconTheme.package + /share/icons + "/${cfg.gtk.iconTheme.name}";
in {
assertion = cfg.gtk.enable -> pathExists iconPath;
message = ''
${toString iconPath} set by the GTK module does not exist!
To suppress this message, make sure that
`config.local.theme.gtk.iconTheme.package` contains
the path `${cfg.gtk.iconTheme.name}`
'';
})
{
assertion = cfg.enable -> options.local.systemVars.username.isDefined;
message = ''
When enabling system-wide theming, a username needs to be set in `config.local.systemVars.username`.
'';
}
];
local.style.scheme = inputs.basix.schemeData.base16.${cfg.schemeName};
};
}

View file

@ -1,30 +0,0 @@
{
lib,
options,
...
}: let
inherit (lib) mkOption;
inherit (lib.types) str;
in {
options.local.systemVars = {
hostName = mkOption {
type = str;
description = "hostname for the current host";
default = null;
};
username = mkOption {
type = str;
description = "username for the home directory";
default = "user";
};
};
config.assertions = [
{
assertion = options.local.systemVars.hostName.isDefined;
}
{
assertion = options.local.systemVars.username.isDefined;
}
];
}

View file

@ -1,32 +0,0 @@
Config(
// Position/size fields use an enum for the value, it can be either:
// Absolute(n): The absolute value in pixels
// Fraction(n): A fraction of the width or height of the full screen (depends on exclusive zones and the settings related to them) window respectively
// The horizontal position, adjusted so that Relative(0.5) always centers the runner
x: Fraction(0.5),
// The vertical position, works the same as `x`
y: Fraction(0.2),
// Hide match and plugin info icons
hide_icons: false,
// ignore exclusive zones, f.e. Waybar
ignore_exclusive_zones: false,
// Layer shell layer: Background, Bottom, Top, Overlay
layer: Overlay,
// Hide the plugin info panel
hide_plugin_info: false,
// Close window when a click outside the main box is received
close_on_click: true,
// Show search results immediately when Anyrun starts
show_results_immediately: true,
// Limit amount of entries shown in total
max_entries: Some(10),
)

View file

@ -1,56 +0,0 @@
{
lib,
inputs,
config,
pkgs,
...
}: let
inherit (lib) mkIf;
inherit (config.local.systemVars) username;
in {
config = mkIf config.local.modules.hyprland.enable {
hjem.users.${username} = {
packages = [inputs.anyrun.packages.${pkgs.system}.anyrun-with-all-plugins];
files = {
".config/anyrun/config.ron".source = ./config.ron;
".config/anyrun/applications.ron".text = ''
Config(
// Also show the Desktop Actions defined in the desktop files, e.g. "New Window" from LibreWolf
desktop_actions: false,
max_entries: 5,
// The terminal used for running terminal based desktop entries, if left as `None` a static list of terminals is used
// to determine what terminal to use.
terminal: Some(Terminal(
// The main terminal command
command: "ghostty -e",
// What arguments should be passed to the terminal process to run the command correctly
// {} is replaced with the command in the desktop entry
args: "uwsm app -- {}",
)),
)
'';
".config/anyrun/symbols.ron".text = ''
Config(
prefix: ":s",
symbols: {
"shrug": "¯\\_()_/¯",
},
max_entries: 5,
)
'';
".config/anyrun/shell.ron".text = ''
Config(
prefix: ">"
)
'';
".config/anyrun/randr.ron".text = ''
Config(
prefi: ":dp",
max_entries: 5,
)
'';
".config/anyrun/style.css".source = ./style.css;
};
};
};
}

View file

@ -1,25 +0,0 @@
#window {
background-color: rgba(0, 0, 0, 0);
}
box#main {
border-radius: 10px;
background-color: @theme_bg_color;
}
list#main {
background-color: rgba(0, 0, 0, 0);
border-radius: 10px;
}
list#plugin {
background-color: rgba(0, 0, 0, 0);
}
label#match-desc {
font-size: 10px;
}
label#plugin {
font-size: 14px;
}

Some files were not shown because too many files have changed in this diff Show more