Compare commits

...

5 Commits

Author SHA1 Message Date
kalle c26b837282 kde package renames 2025-03-29 13:06:40 +01:00
kalle 8cc5e78e22 Fix nvim tsserver lsp 2025-03-29 12:59:42 +01:00
kalle a63893b566 Update dependencies 2025-03-29 12:58:56 +01:00
kalle 9b2b73e865 New bars 2025-03-29 12:56:38 +01:00
kalle 4ecf1e471f Updates, signal, zen, grayjay, and nvim changes 2025-03-28 16:14:45 +01:00
34 changed files with 478 additions and 733 deletions

View File

@ -8,11 +8,11 @@
]
},
"locked": {
"lastModified": 1733743004,
"narHash": "sha256-ZgnLrPOLrDTpGpvdMpX9cPPn7GrisnKhEw/x8M6Vf4Y=",
"lastModified": 1738087375,
"narHash": "sha256-GLyNtU9A2VN22jNRHZ2OXuFfTJLh8uEVVt+ftsKUX0c=",
"owner": "Aylur",
"repo": "ags",
"rev": "ce27d3036f7fbebc3476ccbb5a1c51f0603c2475",
"rev": "a6a7a0adb17740f4c34a59902701870d46fbb6a4",
"type": "github"
},
"original": {
@ -41,11 +41,11 @@
]
},
"locked": {
"lastModified": 1731959031,
"narHash": "sha256-TGcvIjftziC1CjuiHCzrYDwmOoSFYIhdiKmLetzB5L0=",
"lastModified": 1742213273,
"narHash": "sha256-0l0vDb4anfsBu1rOs94bC73Hub+xEivgBAo6QXl2MmU=",
"owner": "hyprwm",
"repo": "aquamarine",
"rev": "4468981c1c50999f315baa1508f0e53c4ee70c52",
"rev": "484b732195cc53f4536ce4bd59a5c6402b1e7ccf",
"type": "github"
},
"original": {
@ -62,11 +62,11 @@
]
},
"locked": {
"lastModified": 1733520119,
"narHash": "sha256-6K07ZJTnFu1xASBCMtVc9cFTbBEauwSc7gGBmjLkLSk=",
"lastModified": 1737670815,
"narHash": "sha256-ZCxxshGN7XooabArcoGkYSNx5yVunqjKJi2aTv6cznI=",
"owner": "aylur",
"repo": "astal",
"rev": "4c19d8d06fa25cc6389f37abe8839b4d8be5c0d6",
"rev": "127e9cdcbf173846a3c40ddc0abfbb038df48042",
"type": "github"
},
"original": {
@ -129,6 +129,24 @@
"type": "github"
}
},
"grayjay": {
"inputs": {
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1743203987,
"narHash": "sha256-fA1qhxuaZsQODGXr+gQETYI0ow6ak8Vp1VSKv/+jsPs=",
"owner": "rishabh5321",
"repo": "grayjay-flake",
"rev": "eb64a22457766aeff5935ed72f91249e387520d3",
"type": "github"
},
"original": {
"owner": "rishabh5321",
"repo": "grayjay-flake",
"type": "github"
}
},
"home-manager": {
"inputs": {
"nixpkgs": [
@ -136,11 +154,11 @@
]
},
"locked": {
"lastModified": 1733873195,
"narHash": "sha256-dTosiZ3sZ/NKoLKQ++v8nZdEHya0eTNEsaizNp+MUPM=",
"lastModified": 1743136572,
"narHash": "sha256-uwaVrKgi6g1TUq56247j6QvvFtYHloCkjCrEpGBvV54=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "f26aa4b76fb7606127032d33ac73d7d507d82758",
"rev": "1efd2503172016a6742c87b47b43ca2c8145607d",
"type": "github"
},
"original": {
@ -166,11 +184,11 @@
]
},
"locked": {
"lastModified": 1728669738,
"narHash": "sha256-EDNAU9AYcx8OupUzbTbWE1d3HYdeG0wO6Msg3iL1muk=",
"lastModified": 1742215578,
"narHash": "sha256-zfs71PXVVPEe56WEyNi2TJQPs0wabU4WAlq0XV7GcdE=",
"owner": "hyprwm",
"repo": "hyprcursor",
"rev": "0264e698149fcb857a66a53018157b41f8d97bb0",
"rev": "2fd36421c21aa87e2fe3bee11067540ae612f719",
"type": "github"
},
"original": {
@ -195,11 +213,11 @@
]
},
"locked": {
"lastModified": 1733248371,
"narHash": "sha256-FFLJzFTyNhS7tBEEECx0B8Ye/bpmxhFVEKlECgMLc6c=",
"lastModified": 1739049071,
"narHash": "sha256-3+7TpXMrbsUXSwgr5VAKAnmkzMb6JO+Rvc9XRb5NMg4=",
"owner": "hyprwm",
"repo": "hyprgraphics",
"rev": "cc95e5babc6065bc3ab4cd195429a9900836ef13",
"rev": "175c6b29b6ff82100539e7c4363a35a02c74dd73",
"type": "github"
},
"original": {
@ -218,17 +236,17 @@
"hyprlang": "hyprlang",
"hyprutils": "hyprutils",
"hyprwayland-scanner": "hyprwayland-scanner",
"nixpkgs": "nixpkgs",
"nixpkgs": "nixpkgs_2",
"pre-commit-hooks": "pre-commit-hooks",
"systems": "systems",
"xdph": "xdph"
},
"locked": {
"lastModified": 1733864105,
"narHash": "sha256-WjyOigIoneQijFAHxpu2xHCRdl4PcVctx0c1miPBBIA=",
"lastModified": 1743207575,
"narHash": "sha256-bNz2WfcZAF6hZkcEcRYFsoh49wNAamphS+NOhSrf5A0=",
"owner": "hyprwm",
"repo": "hyprland",
"rev": "4d05677e8d398b6fa144eae7a98ad4f2a54acb92",
"rev": "7374a023eff964817c9e5fbe75a661540516f798",
"type": "github"
},
"original": {
@ -249,11 +267,11 @@
]
},
"locked": {
"lastModified": 1728345020,
"narHash": "sha256-xGbkc7U/Roe0/Cv3iKlzijIaFBNguasI31ynL2IlEoM=",
"lastModified": 1738422629,
"narHash": "sha256-5v+bv75wJWvahyM2xcMTSNNxmV8a7hb01Eey5zYnBJw=",
"owner": "hyprwm",
"repo": "hyprland-protocols",
"rev": "a7c183800e74f337753de186522b9017a07a8cee",
"rev": "755aef8dab49d0fc4663c715fa4ad221b2aedaed",
"type": "github"
},
"original": {
@ -262,10 +280,49 @@
"type": "github"
}
},
"hyprland-qt-support": {
"inputs": {
"hyprlang": [
"hyprland",
"hyprland-qtutils",
"hyprlang"
],
"nixpkgs": [
"hyprland",
"hyprland-qtutils",
"nixpkgs"
],
"systems": [
"hyprland",
"hyprland-qtutils",
"systems"
]
},
"locked": {
"lastModified": 1737634706,
"narHash": "sha256-nGCibkfsXz7ARx5R+SnisRtMq21IQIhazp6viBU8I/A=",
"owner": "hyprwm",
"repo": "hyprland-qt-support",
"rev": "8810df502cdee755993cb803eba7b23f189db795",
"type": "github"
},
"original": {
"owner": "hyprwm",
"repo": "hyprland-qt-support",
"type": "github"
}
},
"hyprland-qtutils": {
"inputs": {
"hyprland-qt-support": "hyprland-qt-support",
"hyprlang": [
"hyprland",
"hyprlang"
],
"hyprutils": [
"hyprland",
"hyprland-qtutils",
"hyprlang",
"hyprutils"
],
"nixpkgs": [
@ -278,11 +335,11 @@
]
},
"locked": {
"lastModified": 1733472316,
"narHash": "sha256-PvXiFLIExJEJj+goLbIuXLTN5CSDSAUsAfiYSdbbWg0=",
"lastModified": 1739048983,
"narHash": "sha256-REhTcXq4qs3B3cCDtLlYDz0GZvmsBSh947Ub6pQWGTQ=",
"owner": "hyprwm",
"repo": "hyprland-qtutils",
"rev": "969427419276c7ee170301ef1ebe0f68eb6eb2e2",
"rev": "3504a293c8f8db4127cb0f7cfc1a318ffb4316f8",
"type": "github"
},
"original": {
@ -307,11 +364,11 @@
]
},
"locked": {
"lastModified": 1728168612,
"narHash": "sha256-AnB1KfiXINmuiW7BALYrKqcjCnsLZPifhb/7BsfPbns=",
"lastModified": 1741191527,
"narHash": "sha256-kM+11Nch47Xwfgtw2EpRitJuORy4miwoMuRi5tyMBDY=",
"owner": "hyprwm",
"repo": "hyprlang",
"rev": "f054f2e44d6a0b74607a6bc0f52dba337a3db38e",
"rev": "72df3861f1197e41b078faa3e38eedd60e00018d",
"type": "github"
},
"original": {
@ -332,11 +389,11 @@
]
},
"locked": {
"lastModified": 1732288281,
"narHash": "sha256-XTU9B53IjGeJiJ7LstOhuxcRjCOFkQFl01H78sT9Lg4=",
"lastModified": 1741534688,
"narHash": "sha256-EV3945SnjOCuRVbGRghsWx/9D89FyshnSO1Q6/TuQ14=",
"owner": "hyprwm",
"repo": "hyprutils",
"rev": "b26f33cc1c8a7fd5076e19e2cce3f062dca6351c",
"rev": "dd1f720cbc2dbb3c71167c9598045dd3261d27b3",
"type": "github"
},
"original": {
@ -357,11 +414,11 @@
]
},
"locked": {
"lastModified": 1726874836,
"narHash": "sha256-VKR0sf0PSNCB0wPHVKSAn41mCNVCnegWmgkrneKDhHM=",
"lastModified": 1739870480,
"narHash": "sha256-SiDN5BGxa/1hAsqhgJsS03C3t2QrLgBT8u+ENJ0Qzwc=",
"owner": "hyprwm",
"repo": "hyprwayland-scanner",
"rev": "500c81a9e1a76760371049a8d99e008ea77aa59e",
"rev": "206367a08dc5ac4ba7ad31bdca391d098082e64b",
"type": "github"
},
"original": {
@ -376,15 +433,15 @@
"nixpkgs": [
"nixpkgs"
],
"nixpkgs-stable": "nixpkgs-stable_2",
"nixpkgs-stable": "nixpkgs-stable",
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1733708804,
"narHash": "sha256-PiUrztTiR4aVRC2fMdNcOWYWF1ojvqbrSUYmhtp3970=",
"lastModified": 1743246566,
"narHash": "sha256-arEFUDLjADYIZ7T6PZX1yLOnfMoZ1ByebtmPuvV98+s=",
"owner": "lilyinstarlight",
"repo": "nixos-cosmic",
"rev": "1531210f371ecf966ff67e87975f684553bdbbf7",
"rev": "c709db4b95e58f410978bb49c87cb74214d03e78",
"type": "github"
},
"original": {
@ -395,11 +452,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1733392399,
"narHash": "sha256-kEsTJTUQfQFIJOcLYFt/RvNxIK653ZkTBIs4DG+cBns=",
"lastModified": 1743095683,
"narHash": "sha256-gWd4urRoLRe8GLVC/3rYRae1h+xfQzt09xOfb0PaHSk=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "d0797a04b81caeae77bcff10a9dde78bc17f5661",
"rev": "5e5402ecbcb27af32284d4a62553c019a3a49ea6",
"type": "github"
},
"original": {
@ -411,27 +468,11 @@
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1730741070,
"narHash": "sha256-edm8WG19kWozJ/GqyYx2VjW99EdhjKwbY3ZwdlPAAlo=",
"lastModified": 1742937945,
"narHash": "sha256-lWc+79eZRyvHp/SqMhHTMzZVhpxkRvthsP1Qx6UCq0E=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "d063c1dd113c91ab27959ba540c0d9753409edf3",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-24.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-stable_2": {
"locked": {
"lastModified": 1733412085,
"narHash": "sha256-FillH0qdWDt/nlO6ED7h4cmN+G9uXwGjwmCnHs0QVYM=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "4dc2fc4e62dbf62b84132fe526356fbac7b03541",
"rev": "d02d88f8de5b882ccdde0465d8fa2db3aa1169f7",
"type": "github"
},
"original": {
@ -443,11 +484,27 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1733759999,
"narHash": "sha256-463SNPWmz46iLzJKRzO3Q2b0Aurff3U1n0nYItxq7jU=",
"lastModified": 1742669843,
"narHash": "sha256-G5n+FOXLXcRx+3hCJ6Rt6ZQyF1zqQ0DL0sWAMn2Nk0w=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "1e5b653dff12029333a6546c11e108ede13052eb",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_3": {
"locked": {
"lastModified": 1743095683,
"narHash": "sha256-gWd4urRoLRe8GLVC/3rYRae1h+xfQzt09xOfb0PaHSk=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "a73246e2eef4c6ed172979932bc80e1404ba2d56",
"rev": "5e5402ecbcb27af32284d4a62553c019a3a49ea6",
"type": "github"
},
"original": {
@ -457,13 +514,13 @@
"type": "github"
}
},
"nixpkgs_3": {
"nixpkgs_4": {
"locked": {
"lastModified": 1735471104,
"narHash": "sha256-0q9NGQySwDQc7RhAV2ukfnu7Gxa5/ybJ2ANT8DQrQrs=",
"lastModified": 1742288794,
"narHash": "sha256-Txwa5uO+qpQXrNG4eumPSD+hHzzYi/CdaM80M9XRLCo=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "88195a94f390381c6afcdaa933c2f6ff93959cb4",
"rev": "b6eaf97c6960d97350c584de1b6dcff03c9daf42",
"type": "github"
},
"original": {
@ -492,11 +549,11 @@
"plugin-rainbow-delimiters-nvim": {
"flake": false,
"locked": {
"lastModified": 1733870816,
"narHash": "sha256-40NE1+BFG6OPcHKGejfltuTANB/GTIPn1BfvAB55t9Q=",
"lastModified": 1742829650,
"narHash": "sha256-sQAVw+9bKmJzX/MHA/vcmvzL+Q5kyWpDfPJ97efxQxE=",
"owner": "HiPhish",
"repo": "rainbow-delimiters.nvim",
"rev": "dc788723f717bdd3041838b8db34cce53c9aa920",
"rev": "de39919a57e1a40a4c7dc5bae0de276f9c616ef3",
"type": "gitlab"
},
"original": {
@ -528,15 +585,14 @@
"nixpkgs": [
"hyprland",
"nixpkgs"
],
"nixpkgs-stable": "nixpkgs-stable"
]
},
"locked": {
"lastModified": 1733318908,
"narHash": "sha256-SVQVsbafSM1dJ4fpgyBqLZ+Lft+jcQuMtEL3lQWx2Sk=",
"lastModified": 1742649964,
"narHash": "sha256-DwOTp7nvfi8mRfuL1escHDXabVXFGT1VlPD1JHrtrco=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "6f4e2a2112050951a314d2733a994fbab94864c6",
"rev": "dcf5072734cb576d2b0c59b2ac44f5050b5eac82",
"type": "github"
},
"original": {
@ -548,10 +604,11 @@
"root": {
"inputs": {
"ags": "ags",
"grayjay": "grayjay",
"home-manager": "home-manager",
"hyprland": "hyprland",
"nixos-cosmic": "nixos-cosmic",
"nixpkgs": "nixpkgs_2",
"nixpkgs": "nixpkgs_3",
"plugin-harpoon1": "plugin-harpoon1",
"plugin-rainbow-delimiters-nvim": "plugin-rainbow-delimiters-nvim",
"plugin-undotree-nvim": "plugin-undotree-nvim",
@ -566,11 +623,11 @@
]
},
"locked": {
"lastModified": 1733625333,
"narHash": "sha256-tIML2axjm4AnlKP29upVJxzBpj4Cy4ak+PKonqQtXmc=",
"lastModified": 1743215516,
"narHash": "sha256-52qbrkG65U1hyrQWltgHTgH4nm0SJL+9TWv2UDCEPNI=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "430c8b054e45ea44fd2c9521a378306ada507a6c",
"rev": "524463199fdee49338006b049bc376b965a2cfed",
"type": "github"
},
"original": {
@ -622,11 +679,11 @@
]
},
"locked": {
"lastModified": 1733157064,
"narHash": "sha256-NetqJHAN4bbZDQADvpep+wXk2AbMZ2bN6tINz8Kpz6M=",
"lastModified": 1741934139,
"narHash": "sha256-ZhTcTH9FoeAtbPfWGrhkH7RjLJZ7GeF18nygLAMR+WE=",
"owner": "hyprwm",
"repo": "xdg-desktop-portal-hyprland",
"rev": "fd85ef39369f95eed67fdf3f025e86916edeea2f",
"rev": "150b0b6f52bb422a1b232a53698606fe0320dde0",
"type": "github"
},
"original": {
@ -637,14 +694,14 @@
},
"zen-browser": {
"inputs": {
"nixpkgs": "nixpkgs_3"
"nixpkgs": "nixpkgs_4"
},
"locked": {
"lastModified": 1737573247,
"narHash": "sha256-qYr17CTrtmudrwcDXBZjgZM6E8elQ8O7SfMhmZj7x00=",
"lastModified": 1743216975,
"narHash": "sha256-29xgm8F3DCcTNrQZ9V3Pwj6BkjalkKvGyjd+sF9/+3k=",
"owner": "0xc000022070",
"repo": "zen-browser-flake",
"rev": "c3ea41c78e72866919a46116a5231c4e92062327",
"rev": "165ee672e6b17a8bcc0a3fb51fab3f79715cc1f3",
"type": "github"
},
"original": {

View File

@ -12,6 +12,9 @@
# Zen browser
zen-browser.url = "github:0xc000022070/zen-browser-flake";
# Grayjay
grayjay.url = "github:rishabh5321/grayjay-flake";
# AGS
ags.url = "github:Aylur/ags";
ags.inputs.nixpkgs.follows = "nixpkgs";

View File

@ -47,9 +47,9 @@
vesktop
chromium
httpie
kate
dolphin
ark
kdePackages.kate
kdePackages.dolphin
kdePackages.ark
rustup
gcc
pavucontrol

View File

@ -19,8 +19,12 @@
../../modules/git.nix
../../modules/direnv.nix
../../modules/firefox.nix
../../modules/zen-browser.nix
../../modules/steam.nix
../../modules/nvim
../../modules/ags
../../modules/grayjay.nix
../../modules/signal.nix
];
boot.loader.systemd-boot.enable = true;
@ -84,7 +88,7 @@
];
autoStart = [
"${pkgs.ags}/bin/ags"
"uwsm-app -- ags run"
(mkUwsmApp inputs.zen-browser.packages.x86_64-linux.default "zen")
(mkUwsmApp pkgs.discord "discord")
];
@ -134,9 +138,9 @@
vesktop
chromium
httpie
kate
dolphin
ark
kdePackages.kate
kdePackages.dolphin
kdePackages.ark
rustup
gcc
prismlauncher
@ -147,10 +151,25 @@
vlc
feishin
cachix
inputs.zen-browser.packages.x86_64-linux.default
];
};
# NOTE: For debugging staging server configs
networking.extraHosts = ''
192.168.10.99 staging.kallestruik.nl
192.168.10.99 service1.staging.kallestruik.nl
192.168.10.99 service2.staging.kallestruik.nl
192.168.10.99 service3.staging.kallestruik.nl
192.168.10.99 service4.staging.kallestruik.nl
192.168.10.99 service5.staging.kallestruik.nl
192.168.10.99 service6.staging.kallestruik.nl
'';
services.udev.packages = [
# Allow flashing android devices and using ADB
pkgs.android-udev-rules
];
# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions
# on your system were taken. It's perfectly fine and recommended to leave

View File

@ -22,6 +22,10 @@
device = "/dev/disk/by-uuid/0ac05c3f-df12-458e-b145-e912febe1205";
fsType = "ext4";
};
"/mnt/games-nvme" = {
device = "/dev/disk/by-uuid/7ae70244-cf8e-491e-b617-5d2d2ea3e4f1";
fsType = "ext4";
};
"/mnt/external" = {
device = "/dev/disk/by-uuid/13e2dfc3-7b4d-44ac-9417-51b933a36917";
fsType = "ext4";

View File

@ -1,10 +1,15 @@
import { App } from "astal/gtk3"
import style from "./style.scss"
import LeftBar from "./widget/LeftBar"
import RightBar from "./widget/RightBar"
const LEFT_DISPLAY = "HF237"
const RIGHT_DISPLAY = "LCDTV16"
App.start({
css: style,
main() {
App.get_monitors().map(LeftBar)
LeftBar(App.get_monitors().find(it => it.get_model() == LEFT_DISPLAY)!);
RightBar(App.get_monitors().find(it => it.get_model() == RIGHT_DISPLAY)!);
},
})

View File

@ -1,18 +1,97 @@
// https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-3-24/gtk/theme/Adwaita/_colors-public.scss
$fg-color: #{"@theme_fg_color"};
$bg-color: #{"@theme_bg_color"};
@use 'sass:color';
@import "themes/catpuccin.scss";
window.Bar {
background: transparent;
color: $fg-color;
color: $ctp-text;
>centerbox {
background: $bg-color;
background: $ctp-base;
border-radius: 5px;
margin: 8px;
>box {
margin: 4px;
}
padding: 8px;
}
}
.Time {
background: $ctp-surface-0;
border-radius: 5px;
>.icon {
background: $ctp-red;
color: $ctp-surface-0;
padding: 6px 8px;
font-size: 18px;
}
&.icon-left>.icon {
border-radius: 5px 0 0 5px;
}
&.icon-right>.icon {
border-radius: 0 5px 5px 0;
}
>.label {
padding: 0 8px;
font-size: 16px;
}
}
.Workspaces {
background: $ctp-surface-0;
border-radius: 5px;
>.icon {
background: $ctp-blue;
color: $ctp-surface-0;
padding: 6px 8px;
font-size: 18px;
}
&.icon-left>.icon {
border-radius: 5px 0 0 5px;
}
&.icon-right>.icon {
border-radius: 0 5px 5px 0;
}
>.labels {
padding: 0 8px;
font-size: 16px;
button {
all: unset;
&.add {
font-size: 12px;
margin-left: 4px;
}
}
}
}
.Systray {
background: $ctp-surface-0;
border-radius: 5px;
>.icon {
background: $ctp-green;
color: $ctp-surface-0;
padding: 4px 8px 0 8px;
font-size: 20px;
border-radius: 5px 0 0 5px;
}
&.icon-left>.icon {
border-radius: 5px 0 0 5px;
}
&.icon-right>.icon {
border-radius: 0 5px 5px 0;
}
>.item {
all: unset;
padding: 8px 8px;
}
}

View File

@ -0,0 +1,27 @@
$ctp-rosewater: #f5e0dc;
$ctp-flamingo: #f2cdcd;
$ctp-pink: #f5c2e7;
$ctp-mauve: #cba6f7;
$ctp-red: #f38ba8;
$ctp-maroon: #eba0ac;
$ctp-peach: #fab387;
$ctp-yellow: #f9e2af;
$ctp-green: #a6e3a1;
$ctp-teal: #94e2d5;
$ctp-sky: #89dceb;
$ctp-sapphire: #74c7ec;
$ctp-blue: #89b4fa;
$ctp-lavender: #b4befe;
$ctp-text: #cdd6f4;
$ctp-subtext-1: #bac2de;
$ctp-subtext-0: #a6adc8;
$ctp-overlay-2: #9399b2;
$ctp-overlay-1: #7f849c;
$ctp-overlay-0: #6c7086;
$ctp-surface-2: #585b70;
$ctp-surface-1: #45475a;
$ctp-surface-0: #313244;
$ctp-base: #1e1e2e;
$ctp-mantle: #181825;
$ctp-crust: #11111b;

View File

@ -0,0 +1,18 @@
import { GLib, Variable } from "astal"
const TIME_FORMAT = "%H:%M"
export default function Clock(props: { iconSide: "left" | "right" }) {
const time = Variable<string>("").poll(1000, () =>
GLib.DateTime.new_now_local().format(TIME_FORMAT)!)
return <box className={`Time icon-${props.iconSide}`}>
{props.iconSide == "left" && <label className="icon" label="" />}
<label
className="label"
onDestroy={() => time.drop()}
label={time()}
/>
{props.iconSide == "right" && <label className="icon" label="" />}
</box>
}

View File

@ -1,5 +1,6 @@
import { App, Astal, Gdk, Gtk } from "astal/gtk3";
import Systray from "./Systray";
import Clock from "./Clock";
import Workspaces from "./Workspaces";
export default function LeftBar(gdkmonitor: Gdk.Monitor) {
const { TOP, LEFT, RIGHT } = Astal.WindowAnchor;
@ -11,25 +12,14 @@ export default function LeftBar(gdkmonitor: Gdk.Monitor) {
anchor={TOP | LEFT | RIGHT}
application={App}>
<centerbox>
<Left />
<Center />
<Right />
<box halign={Gtk.Align.START}>
</box>
<box halign={Gtk.Align.CENTER}>
<Workspaces monitor="HDMI-A-2" iconSide="right" />
</box>
<box halign={Gtk.Align.END}>
<Clock iconSide="right" />
</box>
</centerbox>
</window>
}
function Left() {
return <box halign={Gtk.Align.START}>
</box>
}
function Center() {
return <box halign={Gtk.Align.CENTER}>
</box>
}
function Right() {
return <box halign={Gtk.Align.END}>
<Systray />
</box>
}

View File

@ -0,0 +1,27 @@
import { App, Astal, Gdk, Gtk } from "astal/gtk3";
import Clock from "./Clock";
import Workspaces from "./Workspaces";
import Systray from "./Systray";
export default function RightBar(gdkmonitor: Gdk.Monitor) {
const { TOP, LEFT, RIGHT } = Astal.WindowAnchor;
return <window
className="RightBar Bar"
gdkmonitor={gdkmonitor}
exclusivity={Astal.Exclusivity.EXCLUSIVE}
anchor={TOP | LEFT | RIGHT}
application={App}>
<centerbox>
<box halign={Gtk.Align.START}>
<Clock iconSide="left" />
</box>
<box halign={Gtk.Align.CENTER}>
<Workspaces monitor="HDMI-A-1" iconSide="left" />
</box>
<box halign={Gtk.Align.END}>
<Systray iconSide="left" />
</box>
</centerbox>
</window>
}

View File

@ -1,23 +1,23 @@
import { bind } from "astal"
import { Button, Icon } from "astal/gtk3/widget"
import Tray from "gi://AstalTray"
const tray = Tray.get_default()
export default function Systray() {
for (const item of tray.get_items()) {
print(item.title)
}
return <box>
{tray.get_items().map(item => <SystrayItem item={item} />)}
export default function Systray(props: { iconSide: "left" | "right" }) {
return <box className={`Systray icon-${props.iconSide}`}>
{props.iconSide == "left" && <label className="icon" label="󱊔" />}
{bind(tray, "items").as(items => items.map(item => <SystrayItem item={item} />))}
{props.iconSide == "right" && <label className="icon" label="󱊔" />}
</box>
}
function SystrayItem({ item }: { item: Tray.TrayItem }) {
return <Button
onClick={() => item.activate(0, 0) /* NOTE: Figure out what these numbers do */}
tooltipMarkup={bind(item, "tooltip_markup")}
>
<Icon gicon={bind(item, "gicon")} />
</Button>
return <menubutton
className="item"
tooltipMarkup={bind(item, "tooltipMarkup")}
usePopover={false}
actionGroup={bind(item, "actionGroup").as(ag => ["dbusmenu", ag])}
menuModel={bind(item, "menuModel")}>
<icon gicon={bind(item, "gicon")} />
</menubutton>
}

View File

@ -0,0 +1,55 @@
import { bind } from "astal"
import Hyprland from "gi://AstalHyprland"
export default function Workspaces(props: { monitor: string, iconSide: "left" | "right" }) {
const hyprland = Hyprland.get_default();
return <box className={`Workspaces icon-${props.iconSide}`}>
{props.iconSide == "left" && <label className="icon" label="󱗼" />}
<box className="labels">
{bind(hyprland, "workspaces").as(wss => wss
.filter(it => it && it.get_monitor && it.get_monitor().name == props.monitor)
.sort((a, b) => a.get_id() - b.get_id())
.map(workspace => <Workspace workspace={workspace} />)
)}
<button
className="add"
onClick={() => {
hyprland.dispatch("workspace", "emptynm");
}}
>
<label label="" />
</button>
</box>
{props.iconSide == "right" && <label className="icon" label="󱗼" />}
</box>
}
function Workspace(props: { workspace: Hyprland.Workspace }) {
const hyprland = Hyprland.get_default();
return <box>
{bind(props.workspace.get_monitor(), "activeWorkspace").as(ws => {
if (ws == props.workspace) {
return <label
label=""
/>
} else {
return <button
onClick={() => {
const name = props.workspace.name
if (name) {
hyprland.dispatch("workspace", `name:${name}`);
} else {
hyprland.dispatch("workspace", `id:${props.workspace.get_id()}`);
}
}}
>
<label
label=""
/>
</button>
}
})}
</box>
}

View File

@ -1,46 +0,0 @@
import { GTK_ALIGN_CENTER, GTK_ALIGN_END, GTK_ALIGN_START } from "../constants.js"
import { Clock } from "./Clock.js"
import { SysTray } from "./Systray.js"
function BarStart() {
return Widget.Box({
halign: GTK_ALIGN_START,
children: [
Widget.Label({ label: "Start" }),
Widget.Button({ label: "Button", onClicked: () => App.ToggleWindow("media2") }),
],
})
}
function BarCenter() {
return Widget.Box({
halign: GTK_ALIGN_CENTER,
children: [
Clock(),
],
})
}
function BarEnd() {
return Widget.Box({
halign: GTK_ALIGN_END,
children: [
SysTray(),
],
})
}
export function Bar(monitor = 0) {
return Widget.Window({
monitor,
exclusivity: "exclusive",
className: "bar",
margins: [5, 5, 0, 5],
name: `bar${monitor}`,
anchor: ["left", "top", "right"],
child: Widget.CenterBox({
vertical: false,
startWidget: BarStart(),
centerWidget: BarCenter(),
endWidget: BarEnd(),
})
})
}

View File

@ -1,24 +0,0 @@
const time = Variable("", {
poll: [1000, 'date "+%H:%M"'],
})
const date = Variable("", {
poll: [1000, 'date "+%Y-%m-%d"'],
})
export function Clock() {
return Widget.Box({
className: "clock",
vertical: true,
children: [
Widget.Label({
className: "time",
label: time.bind(),
}),
Widget.Label({
className: "date",
label: date.bind(),
}),
],
})
}

View File

@ -1,16 +0,0 @@
const systemtray = await Service.import("systemtray")
export 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({
className: "systray",
children: items,
})
}

View File

@ -1,35 +0,0 @@
@define-color ctp-rosewater #f5e0dc;
@define-color ctp-flamingo #f2cdcd;
@define-color ctp-pink #f5c2e7;
@define-color ctp-mauve #cba6f7;
@define-color ctp-red #f38ba8;
@define-color ctp-maroon #eba0ac;
@define-color ctp-peach #fab387;
@define-color ctp-yellow #f9e2af;
@define-color ctp-green #a6e3a1;
@define-color ctp-teal #94e2d5;
@define-color ctp-sky #89dceb;
@define-color ctp-sapphire #74c7ec;
@define-color ctp-blue #89b4fa;
@define-color ctp-lavender #b4befe;
@define-color ctp-text #cdd6f4;
@define-color ctp-subtext1 #bac2de;
@define-color ctp-subtext0 #a6adc8;
@define-color ctp-overlay2 #9399b2;
@define-color ctp-overlay1 #7f849c;
@define-color ctp-overlay0 #6c7086;
@define-color ctp-surface2 #585b70;
@define-color ctp-surface1 #45475a;
@define-color ctp-surface0 #313244;
@define-color ctp-base #1e1e2e;
@define-color ctp-mantle #181825;
@define-color ctp-crust #11111b;
button {
background: @ctp-surface0;
border: none;
}
button:active, button:hover, button:focus {
background: @ctp-surface1;
}

View File

@ -1,14 +0,0 @@
import { Media } from "./media/Media.js";
import { Bar } from "./bar/Bar.js";
import { Notifications } from "./notifications/Notifications.js";
App.config({
style: "./style.css",
windows: [
Bar(2),
Media(2),
Notifications(2),
]
})

View File

@ -1,5 +0,0 @@
export const GTK_ALIGN_FILL = 0;
export const GTK_ALIGN_START = 1;
export const GTK_ALIGN_END = 2;
export const GTK_ALIGN_CENTER = 3;
export const GTK_ALIGN_BASELINE = 4;

View File

@ -1,160 +0,0 @@
import { GTK_ALIGN_CENTER, GTK_ALIGN_FILL } from '../constants.js'
const mpris = await Service.import("mpris")
const players = mpris.bind("players")
const FALLBACK_ICON = "audio-x-generic-symbolic"
const PLAY_ICON = "media-playback-start-symbolic"
const PAUSE_ICON = "media-playback-pause-symbolic"
const PREV_ICON = "media-skip-backward-symbolic"
const NEXT_ICON = "media-skip-forward-symbolic"
/** @param {number} length */
function lengthStr(length) {
const min = Math.floor(length / 60)
const sec = Math.floor(length % 60)
const sec0 = sec < 10 ? "0" : ""
return `${min}:${sec0}${sec}`
}
/** @param {import('types/service/mpris').MprisPlayer} player */
function Player(player) {
const artists = player.bind("track_artists").transform(a => a.join(", "))
const playPause = Widget.Button({
className: "play-pause",
onClicked: () => player.playPause(),
visible: player.bind("can_play"),
child: Widget.Icon({
icon: player.bind("play_back_status").transform(s => {
switch (s) {
case "Playing": return PAUSE_ICON
case "Paused":
case "Stopped": return PLAY_ICON
}
}),
}),
})
const prev = Widget.Button({
onClicked: () => player.previous(),
visible: player.bind("can_go_prev"),
child: Widget.Icon(PREV_ICON),
})
const next = Widget.Button({
onClicked: () => player.next(),
visible: player.bind("can_go_next"),
child: Widget.Icon(NEXT_ICON),
})
const positionSlider = Widget.Slider({
className: "position",
drawValue: false,
onChange: ({ value }) => player.position = value * player.length,
visible: player.bind("length").as(l => l > 0),
setup: self => {
function update() {
const value = player.position / player.length
self.value = value > 0 ? value : 0
}
self.hook(player, update)
self.hook(player, update, "position")
self.poll(1000, update)
},
})
const positionLabel = Widget.Label({
className: "position",
hpack: "start",
setup: self => {
const update = (_, time) => {
self.label = lengthStr(time || player.position)
self.visible = player.length > 0
}
self.hook(player, update, "position")
self.poll(1000, update)
},
})
const lengthLabel = Widget.Label({
className: "length",
hpack: "end",
visible: player.bind("length").transform(l => l > 0),
label: player.bind("length").transform(lengthStr),
})
return Widget.Overlay({
className: "player",
child: Widget.Box({
className: "bg-img",
vpack: "start",
css: player.bind("cover_path").transform(p => `background-image: url('${p}');`),
}),
overlays: [
Widget.Box({
className: "bg-cover"
}),
Widget.Box({
className: "overlay",
vertical: true,
halign: GTK_ALIGN_CENTER,
children: [
Widget.Box({
className: "info",
vertical: true,
children: [
Widget.Label({ className: "title", label: player.bind("track_title") }),
Widget.Label({ className: "album", label: player.bind("track_album") }),
Widget.Label({ className: "artist", label: artists }),
],
}),
Widget.Box({
vexpand: true,
}),
Widget.CenterBox({
className: "controls",
startWidget: positionLabel,
centerWidget: Widget.Box({
halign: GTK_ALIGN_CENTER,
spacing: 20,
children: [
prev,
playPause,
next,
],
}),
endWidget: lengthLabel,
}),
positionSlider,
],
})
],
})
}
function MediaContent() {
const currentIdx = Variable(0);
const currentPlayer = Utils.merge([currentIdx.bind(), players], (currentIdx, players) => {
const idx = Math.min(currentIdx, players.length - 1);
return players[idx];
})
return Widget.Box({
children: currentPlayer.as(p => [Player(p)]),
})
}
export function Media(monitor = 0) {
return Widget.Window({
monitor,
visible: false,
exclusivity: "normal",
className: "media",
margins: [10, 10, 0, 10],
name: `media${monitor}`,
anchor: ["left", "top"],
child: MediaContent(),
})
}

View File

@ -1,59 +0,0 @@
.media > box {
border-radius: 5px;
background-color: transparent;
color: @ctp-text;
}
.media .player .bg-img {
border-radius: 5px;
min-width: 400px;
min-height: 200px;
background-size: cover;
}
.media .player .bg-cover {
background: linear-gradient(alpha(@ctp-base, 0.5), @ctp-base);
}
.media .player .overlay {
border-radius: 5px;
min-width: 400px;
}
.media .player .info {
padding: 10px;
}
.media .player .controls {
padding: 10px;
}
.media .player .info .title {
font-size: 1.2em;
font-weight: bold;
}
.media .player scale.position {
padding: 0;
border-radius: 0;
border: none;
}
.media .player scale.position trough {
min-height: 4px;
border-radius: 0;
border: none;
background-color: @ctp-overlay0;
}
.media .player scale.position highlight {
border-radius: 0;
border: none;
background-color: @ctp-lavender;
}
.media .player scale.position slider {
all: unset;
}

View File

@ -1,129 +0,0 @@
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,
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 content = Widget.Box({
className: "content",
children: [
icon,
Widget.Box({
vertical: true,
children: [
title,
body,
]
}),
],
})
const actions = Widget.Box({
className: "actions",
children: n.actions.map(({ id, label }) => Widget.Button({
className: "action",
on_clicked: () => {
n.invoke(id)
n.dismiss()
},
hexpand: true,
child: Widget.Label(label),
})),
})
return Widget.EventBox({
attribute: { id: n.id },
onPrimaryClick: n.dismiss,
child: Widget.Box({
classNames: ["notification", n.urgency],
vertical: true,
children: [
content,
actions,
],
}),
})
}
function NotificationList() {
const list = Widget.Box({
css: "min-width: 2px; min-height: 2px;",
vertical: true,
spacing: 10,
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 list
}
export function Notifications(monitor = 0) {
return Widget.Window({
monitor,
exclusivity: "normal",
className: "notifications",
margins: [10, 10, 10, 10],
name: `notifications${monitor}`,
anchor: ["left", "top"],
child: NotificationList(),
})
}

View File

@ -1,59 +0,0 @@
.notification {
min-width: 300px;
padding: 10px;
background-color: alpha(@ctp-base, 0.7);
border-radius: 5px;
border: 1px solid;
border-left: 5px solid;
border-color: @ctp-overlay1;
}
.notification.low {
border-color: @ctp-base;
}
.notification.critical {
border-color: @ctp-red;
}
.notification .icon {
min-width: 68px;
min-height: 68px;
margin-right: 1em;
}
.notification .icon image {
font-size: 58px;
/* to center the icon */
margin: 5px;
color: @ctp-text;
}
.notification .icon box {
min-width: 68px;
min-height: 68px;
border-radius: 7px;
}
.notification .actions .action {
margin: 0 .4em;
margin-top: .8em;
}
.notification .actions .action:first-child {
margin-left: 0;
}
.notification .actions .action:last-child {
margin-right: 0;
}
.notification .title {
color: @ctp-text;
font-size: 1.4em;
}
.notification .body {
color: @ctp-subtext0;
}

View File

@ -1,22 +0,0 @@
@import url("colors.css");
@import url("notifications/style.css");
@import url("media/style.css");
.bar > box {
padding: 10px;
border-radius: 5px;
background-color: alpha(@ctp-base, 0.95);
color: @ctp-text;
}
.clock .time {
font-weight: bold;
font-size: 1em;
}
.clock .date {
font-size: 0.8em;
}

View File

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

View File

@ -1 +0,0 @@
/home/kalle/.local/share/com.github.Aylur.ags/types

View File

@ -1,15 +1,20 @@
{
inputs,
pkgs,
...
}:
{
home-manager.users.kalle = {
imports = [ inputs.ags.homeManagerModules.default ];
programs.ags = {
enable = true;
configDir = ./config;
extraPackages = with inputs.ags.packages.${pkgs.system}; [
tray
hyprland
mpris
wireplumber
];
};
};
}

View File

@ -5,7 +5,7 @@
{
home-manager.users.kalle.programs.firefox = {
enable = true;
nativeMessagingHosts = [ pkgs.plasma-browser-integration ];
nativeMessagingHosts = [ pkgs.kdePackages.plasma-browser-integration ];
};
}

10
modules/grayjay.nix Normal file
View File

@ -0,0 +1,10 @@
{
inputs,
pkgs,
...
}:
{
home-manager.users.kalle.home.packages = [
inputs.grayjay.packages.${pkgs.system}.grayjay
];
}

View File

@ -85,6 +85,11 @@
config = "colorscheme catppuccin-mocha";
}
{
plugin = oil-nvim;
config = toLua "require('oil').setup()";
}
cmp-nvim-lsp
cmp-nvim-lsp-signature-help
cmp-buffer

View File

@ -112,7 +112,7 @@ require('lspconfig').nixd.setup {
},
}
require('lspconfig').tsserver.setup {
require('lspconfig').ts_ls.setup {
on_attach = on_attach,
capabilities = capabilities,
init_options = {

9
modules/signal.nix Normal file
View File

@ -0,0 +1,9 @@
{
pkgs,
...
}:
{
home-manager.users.kalle.home.packages = [
pkgs.signal-desktop
];
}

10
modules/zen-browser.nix Normal file
View File

@ -0,0 +1,10 @@
{
inputs,
pkgs,
...
}:
{
home-manager.users.kalle.home.packages = [
inputs.zen-browser.packages.${pkgs.system}.default
];
}

View File

@ -1,5 +1,6 @@
{ inputs
, ...
{
inputs,
...
}:
{
@ -8,16 +9,25 @@
rainbow-delimiters-nvim = prev.vimUtils.buildVimPlugin {
name = "raindow-delimiters.nvim";
src = inputs.plugin-rainbow-delimiters-nvim;
nvimSkipModule = [
"rainbow-delimiters.types"
"rainbow-delimiters._test.highlight"
];
};
undotree-nvim = prev.vimUtils.buildVimPlugin {
name = "undotree.nvim";
src = inputs.plugin-undotree-nvim;
nvimSkipModule = [
"undotree"
"undotree.collector"
];
};
harpoon1 = prev.vimUtils.buildVimPlugin {
name = "harpoon";
src = inputs.plugin-harpoon1;
doCheck = false;
};
};
};