308 Commits
v2 ... v3
Author SHA1 Message Date
janishutz 75a9e6d953 feat: add current gtk config 2026-06-15 09:31:06 +02:00
janishutz 85f3db3616 fix: add libastal meta package to install 2026-06-15 09:19:13 +02:00
janishutz fc51bb593a fix: trailing commas, explicitly installed pkgs list 2026-06-13 18:08:26 +02:00
janishutz 14ef414781 Update README.md 2026-06-13 15:09:31 +02:00
janishutz 205e667343 feat(hypr): New window rules 2026-06-11 13:12:51 +02:00
janishutz b7e431b3fa feat(hypr): improve muting bind 2026-06-07 14:34:10 +02:00
janishutz 9602c673e5 [Hypr] move lua setup to new folder, add bind to toggle muting of default mic 2026-05-30 10:40:54 +02:00
janishutz e73e7b2353 feat: fix eslint config 2026-05-30 10:14:24 +02:00
janishutz 820e4c9982 [Hypr] Start new hyprland config 2026-05-12 11:43:42 +02:00
janishutz 4b9bbde225 [Hyprland] Temporary fix before full config rewrite in lua 2026-05-11 12:31:40 +02:00
janishutz 82f375794b [Yazi] Use package manager for themes 2026-05-11 12:03:06 +02:00
janishutz a87f908b4d [Hyrpland] Improve bind 2026-05-09 14:39:42 +02:00
janishutz e44f8728a8 [Hypridle] Improve memory footprint 2026-04-29 11:50:07 +02:00
janishutz bb737e524e [Build] Change wallpaper 2026-04-23 16:45:28 +02:00
janishutz fe14b2c78f [Astal] Notifications: Delete not working version 2026-04-23 10:45:03 +02:00
janishutz 50012b04bc [Hyprland] Add windowrule for steam games 2026-04-09 15:16:48 +02:00
janishutz 5e8f2e8930 [Hyprland] Speed up animations 2026-03-25 14:49:33 +01:00
janishutz af675c0683 [Hyprland] Improve touchpad binds 2026-03-25 12:24:26 +01:00
janishutz e03eb2ddd9 [Hyprland] Add more dwindle binds 2026-03-18 16:06:05 +01:00
janishutz 9816e79eec [Hyprland] Add binds to disable trackpad 2026-03-18 11:09:58 +01:00
janishutz 3600c5bcd3 [Fish] Add git pull rebase alias 2026-03-12 17:39:25 +01:00
janishutz 42800f5803 [Hyprland] Default to 120hz on laptop 2026-03-12 11:21:16 +01:00
janishutz bd46b4d609 [Fish] Add alias for commonly accidentally run command 2026-03-11 18:08:16 +01:00
janishutz 79e23782cc [Hyprland] Add windowrules for LÖVR 2026-03-11 16:50:01 +01:00
janishutz aec0f4efd1 [Yazi] Add better keymap for eth stuff 2026-03-11 14:16:10 +01:00
janishutz 35cc75ee2e Revert "[Hyprland] Move to qalculate-gtk from qt"
This reverts commit 53d90fc8f5.
2026-02-25 17:37:26 +01:00
janishutz 53d90fc8f5 [Hyprland] Move to qalculate-gtk from qt 2026-02-25 17:35:16 +01:00
janishutz 5f1f69a6db [Build] Use other wallpaper 2026-02-25 09:38:59 +01:00
janishutz c37a641060 [Yazi] Add new keybind 2026-02-23 19:09:46 +01:00
janishutz d6a6d62ad6 [Yazi] Finish new semester update 2026-02-20 16:37:45 +01:00
janishutz 01ed1dbdda [Fish] Update to 4.3 fish 2026-02-20 12:35:33 +01:00
janishutz 2ac5a4af14 [Yazi] Add new semester binds 2026-02-17 15:33:15 +01:00
janishutz e7b418007f [Yazi] Keybinds 2026-02-17 13:58:02 +01:00
janishutz 0b896e404c [Hyprland] Windowrules 2026-02-17 13:57:55 +01:00
janishutz c38907ec39 [Hyprland] add launch command for qutebrowser 2026-02-02 09:07:09 +01:00
janishutz 1721651319 [Hyprland] Add binds for qalculate 2026-01-23 13:41:07 +01:00
janishutz e4692c456c [Hyprland] Make steam not start in floating mode 2026-01-22 19:48:26 +01:00
janishutz 6ee881c7dc [Hyprland] Update for new keyboard having native ability to swap caps and escape 2026-01-19 11:08:22 +01:00
janishutz 2649ee4b56 [Hyprland] Remove hyprpm reload 2026-01-09 17:41:47 +01:00
janishutz 4024b9e830 [Setup] Improve color extraction 2026-01-09 16:23:30 +01:00
janishutz 11767c3009 [Astal] Prepare for reloadable style 2026-01-09 16:04:51 +01:00
janishutz c2cd216dac [Scripts] Another incorrect filename fix 2026-01-09 15:04:45 +01:00
janishutz 5c245f9c35 [Scripts] Fix incorrect filename 2026-01-09 14:46:04 +01:00
janishutz 54fb71eeae [Scripts] Add script to add latexindent 2026-01-09 14:45:09 +01:00
janishutz 44642960ad [Hyprland] Remove vivado shenanigans 2026-01-09 07:45:59 +01:00
janishutz f8b7f00f44 [Hyprland] Flat accel profile 2026-01-06 14:03:59 +01:00
janishutz 069139641f [Yazi] Update to new conf 2026-01-06 13:03:33 +01:00
janishutz 17689ac0e8 [Hyprland] Update config to newest version 2026-01-01 15:10:39 +01:00
janishutz 5581267a73 [Fish] Add alias for flutter via fvm 2026-01-01 12:50:09 +01:00
janishutz e2fd60187a [Hyprland] Improve scrolling 2025-12-19 11:08:09 +01:00
janishutz 37ff1af0ed [Kitty] Improve scrolling 2025-12-19 11:04:12 +01:00
janishutz 37849dee8f [Hyprland] Finish change to us-intl layout 2025-12-14 11:05:19 +01:00
janishutz fe36f97774 [Eslint] More fixes 2025-12-13 14:29:12 +01:00
janishutz e9399cf7bb [Eslint] Fix typing 2025-12-13 14:28:22 +01:00
janishutz c453e7aa90 [Hyprland] improve notifications 2025-12-09 11:26:04 +01:00
janishutz 5c069beb2b [Hyprland] Add notifications to layout change 2025-12-09 11:24:07 +01:00
janishutz 0a555e9e5a [Hyprland] update bind 2025-12-09 11:22:52 +01:00
janishutz c7e82042af [Hyprland] update keyboard layout and add layout change binds 2025-12-09 11:17:07 +01:00
janishutz c421ea2cb3 [Hyprland] Fix binds 2025-12-08 10:29:08 +01:00
janishutz 84b008e29c [Hyprland] Extract gestures into separate file 2025-12-08 10:28:11 +01:00
janishutz 007c3d0bf0 [Eslint] Fix config error 2025-12-04 14:50:46 +01:00
janishutz 8872abecbd [Eslint] Update config 2025-12-04 11:22:01 +01:00
janishutz 841575d4e3 [Fish] Update alias 2025-11-27 16:46:14 +01:00
janishutz befe9696b0 [Fish] Fix alias 2025-11-27 16:45:38 +01:00
janishutz 4b12ae2c12 [Scripts] Fixes for vpn script 2025-11-24 14:25:13 +01:00
janishutz 5227e5f05e [Scripts] Fix vpn script 2025-11-23 13:36:06 +01:00
janishutz b8098eac8b [Scripts] Improve VPN script 2025-11-18 09:38:24 +01:00
janishutz 5b610643c7 [Install] Fix bt 2025-11-17 09:17:27 +01:00
janishutz 4fce8c955c [Hyprland] Fix cursor size 2025-11-12 10:32:15 +01:00
janishutz eabb972cb8 [Binds] Fix swapescape 2025-11-11 09:58:48 +01:00
janishutz 688b94c3ad [Binds] Add binds to dynamically enable and disable caps:swapescape 2025-11-11 09:50:31 +01:00
janishutz d4689d66cd [FMT] Improve latexindent config 2025-11-11 08:05:53 +01:00
janishutz e28e3e6207 [Install] Add usbutils 2025-11-06 17:47:18 +01:00
janishutz b45b3d60d1 [Scripts] Add pdf wordcount script 2025-11-04 15:51:49 +01:00
janishutz 8d2e3cea85 [Hyprland] Move conflicting bind 2025-11-03 17:13:44 +01:00
janishutz 8a42f9bfa2 [Install] Add timesyncd enable 2025-11-03 10:15:00 +01:00
janishutz 09916ae68e [Hyprland] Add more launch commands 2025-11-02 10:49:33 +01:00
janishutz 5b5fa9ad4e [Astal] Fix launch on new astal version 2025-11-01 10:37:30 +01:00
janishutz 814b975533 [Linecount] Add cloc and alias for it 2025-10-30 15:31:47 +01:00
janishutz d0a450d4e8 [Setup] Make cleaner 2025-10-30 10:42:50 +01:00
janishutz 786d5c5fe0 [Yazi] Fix themes 2025-10-30 10:42:42 +01:00
janishutz 5ba2894101 [Hyprland] Improve windowrules 2025-10-30 10:24:08 +01:00
janishutz 499bf793b2 [Hyprland] Add some nice windorules 2025-10-30 10:24:08 +01:00
janishutz f1c57b8ecc [Scripts] Add nvim update script 2025-10-29 15:19:18 +01:00
janishutz 20cc042b64 [Scripts] Add batch video conversion script 2025-10-25 16:26:39 +02:00
janishutz ae9dcaa074 [Hyprland] Windowrules: Add for BeatSaber 2025-10-22 17:01:28 +02:00
janishutz 21b68b1e68 [Hyprland] Fix alvr launch bind typo 2025-10-22 12:55:57 +02:00
janishutz fa4929a94b [Hyprland] Screenshot binds exit submap 2025-10-22 12:53:44 +02:00
janishutz 6b4d0e22b1 [Kitty] Remove default mapping interfering with new nvim bind 2025-10-21 08:44:42 +02:00
janishutz d5615892e7 [Hyprland] Add launch command for alvr and bsm 2025-10-17 17:30:04 +02:00
janishutz 81d0df6023 [Hyprland] Fix notifications submap 2025-10-17 10:58:39 +02:00
janishutz 9cf14d3b55 [Astal] Format 2025-10-17 10:47:05 +02:00
janishutz 06325b09b8 [Hyprland] Update readmes 2025-10-17 10:44:33 +02:00
janishutz 539ec34b4c [Astal] Finish modes, move tray into quickactions menu 2025-10-17 10:44:33 +02:00
janishutz 00d4f101fc [Hyprland] Remove some quick access binds (unnecessary) 2025-10-17 09:55:15 +02:00
janishutz c9a89cf545 [Setup] Fix platform wrong 2025-10-17 09:54:16 +02:00
janishutz 7ba9a65f19 [Build] Add linter 2025-10-17 09:47:40 +02:00
janishutz 52ced69697 [Hyprland] Fix submaps 2025-10-17 09:47:25 +02:00
janishutz 47bbdd9f85 [Astal] Add mode indicator 2025-10-17 09:47:18 +02:00
janishutz 94a57be9f7 [Astal] Add colours 2025-10-17 07:29:18 +02:00
janishutz 9d779269eb [Hyprland] Notifications binds 2025-10-17 06:52:15 +02:00
janishutz da61dc869d [Astal] Add new mode for hyprland 2025-10-17 06:51:05 +02:00
janishutz e44cc65f1f [Astal] Start adding hyprland module 2025-10-16 22:25:48 +02:00
janishutz 0392f8fc0f [Hyprland] Launch submap autoreset 2025-10-16 22:25:35 +02:00
janishutz 3c76f0412a [Setup] Fix hyprmode apply 2025-10-16 17:05:11 +02:00
janishutz 627c005fe3 [Hyprland] Fix submap 2025-10-16 17:05:03 +02:00
janishutz 6540bda07a [Hyprland] Add new bind layout 2025-10-16 16:18:08 +02:00
janishutz a9c73ba9d9 [Scripts] Improve VPN script 2025-10-16 10:44:27 +02:00
janishutz 30488edaed [Fish] Fix latexdocs alias 2025-10-10 15:05:28 +02:00
janishutz 8ed711d300 [Fish] Improve latex doc opening 2025-10-09 21:08:06 +02:00
janishutz a8043a9899 [Hyprland] Speed up animations even more 2025-10-09 11:02:51 +02:00
janishutz aa9ebaf22b [Astal] Battery widget: Show waiting 2025-10-09 09:33:21 +02:00
janishutz 2314a17066 [Install] Add ntp 2025-10-06 13:11:34 +02:00
janishutz 7051688fa5 [Clang] Formatter: Only merge empty functions 2025-10-05 12:13:56 +02:00
janishutz 0f4f601a2d [Clang] Improve formatter config 2025-10-05 12:09:53 +02:00
janishutz f38e2ff94f [Clang] Improve formatter config 2025-10-05 11:58:55 +02:00
janishutz 50c5cf945d [Clang] Improve formatter config 2025-10-05 08:38:26 +02:00
janishutz 903da245ac [Termfilechooser] Fix 2025-10-04 08:53:07 +02:00
janishutz 2d15296597 [Fish] Force pager into pager mode and not cat 2025-10-02 14:39:15 +02:00
janishutz 3a619cbf92 [Hyprland] Add new keybind on laptop 2025-10-02 14:21:32 +02:00
janishutz 530022ee59 [Hyprlock] Update clock 2025-10-02 08:39:03 +02:00
janishutz 5c01a5f806 [LatexIndent] Fix path 2025-10-01 15:34:14 +02:00
janishutz b6f5ad9bcf [Install] Add man 2025-10-01 13:44:15 +02:00
janishutz 92dc644ee2 [Fish] Add alias for gcc with error flags 2025-10-01 12:42:14 +02:00
janishutz ddc39f4928 [Setup] Fix indentconfig copying 2025-10-01 10:48:30 +02:00
janishutz a93d7494d3 [Install] Add sysstat package 2025-10-01 10:47:13 +02:00
janishutz 706cff40b3 [Setup] Fix errors with startup 2025-09-30 14:03:26 +02:00
janishutz e35845099a [Hyprland] Update for new folder structure 2025-09-30 07:41:44 +02:00
janishutz c44ef61cf2 [Fish] Update for new folder structure 2025-09-30 07:41:14 +02:00
janishutz ef65f827a2 [Yazi] Update keymap for new structure 2025-09-29 11:48:29 +02:00
jh04 6b8f415703 [Eslint] Update rules 2025-09-28 17:08:48 +02:00
janishutz f7004d9f25 [All] Remove old files 2025-09-27 08:07:58 +02:00
jh04 58d5b6cf69 [Setup] Add reload to make sure config reload happens properly 2025-09-26 14:04:47 +02:00
jh04 c55f70b852 [Fish] Add alias for latex docs 2025-09-26 14:03:21 +02:00
janishutz 97e02d81af [Clang] Fix config file 2025-09-25 16:42:26 +02:00
janishutz a545bb0066 [Clang] Fix incorrect config 2025-09-25 16:40:53 +02:00
janishutz 35d51f80df [Clang] Finish up config 2025-09-25 15:57:39 +02:00
janishutz d638aa0434 [Clang] Fix setup script 2025-09-25 15:52:55 +02:00
janishutz 258fc61669 [Clang] Add formatter config 2025-09-25 15:52:16 +02:00
janishutz 6dc15047d4 [Eslint] Add sort-imports rule 2025-09-25 15:20:13 +02:00
janishutz 0725763b95 [Hyprland] Configure gestures 2025-09-25 15:04:47 +02:00
jh04 29b8f188e9 [Yazi] Update keymap 2025-09-25 11:04:07 +02:00
jh04 959732ffd1 [Yazi] Update keymap 2025-09-23 15:19:36 +02:00
janishutz be3497de77 [Indent] Add more rules 2025-09-23 11:14:26 +02:00
janishutz 17d83a53b7 [Hyprland] configure gestures 2025-09-23 11:12:53 +02:00
janishutz 122f3ab070 [Hyprland] Add special workspace config 2025-09-22 16:17:22 +02:00
janishutz 46a732e8f7 [Install] Add dep for latexindent 2025-09-22 13:44:53 +02:00
janishutz 3373ae3b8c [Install] Add dep for latexindent 2025-09-22 13:37:50 +02:00
janishutz edd2db313c [Install] Add dep for latexindent 2025-09-22 13:36:37 +02:00
janishutz ecfd517a4a [Hyprland] Tweak animation duration 2025-09-22 13:01:13 +02:00
janishutz 25419067d4 [Install] Add note on using nwg-look 2025-09-22 12:53:46 +02:00
janishutz 36faff6b5f [Install] Add langgerman to install 2025-09-22 08:44:27 +02:00
janishutz ffe516175c [Eslint] Revert EOL decision 2025-09-20 08:12:20 +02:00
janishutz f58f22cadd [Install] Add german latex extras 2025-09-20 07:17:56 +02:00
janishutz 7e9faff6d6 [Astal] Make brightness adjust only in 5% intervals 2025-09-18 07:52:41 +02:00
janishutz ffa25045e5 [zathura] Add poppler to install 2025-09-17 16:17:43 +02:00
jh04 66dcd82952 [Hyprland] Fix bind 2025-09-16 17:31:28 +02:00
jh04 40013a61d1 [Hyprland] Fix some binds 2025-09-16 17:30:37 +02:00
janishutz ee26c0c5c2 [Hyprland] Fix errors 2025-09-16 13:03:25 +02:00
janishutz 02a351768f [Fish] Add pager alias 2025-09-16 12:59:20 +02:00
janishutz 9539f09e83 [Install] Add pager 2025-09-16 12:59:20 +02:00
jh04 25a78f126e [Astal] Add battery low notification 2025-09-15 14:42:05 +02:00
jh04 e0c339785d [Eslint] Update eol-last 2025-09-15 10:32:59 +02:00
jh04 e6f57831b1 [Eslint] Enforce newline 2025-09-15 10:27:26 +02:00
jh04 4e323d932f [Hyprland] Update binds 2025-09-15 09:20:29 +02:00
janishutz 64d8ca7ab4 [Install] Add eslint_d 2025-09-14 07:29:12 +02:00
jh04 7de17aaeb7 [Yazi] Update keymaps for ETH folders 2025-09-13 17:24:37 +02:00
janishutz 4f0c6a45cf [Install] Add http-server 2025-09-13 08:29:42 +02:00
janishutz a2dbdd78d3 [Setup] Don't do autologin (will make optional) 2025-09-13 08:22:11 +02:00
jh04 e4a76c494c [Greetd] Add auto-unlock of keyring 2025-09-12 17:26:53 +02:00
janishutz 1ee3f01883 [Setup] Add note 2025-09-12 13:12:13 +02:00
janishutz a89ed00a17 [Greetd] Add autologin 2025-09-12 12:26:47 +02:00
janishutz 64e671119d [Hyprland] Add dimming around rofi layer 2025-09-12 11:54:55 +02:00
janishutz 7b7955ac29 [Build] Run config build 2025-09-12 11:52:00 +02:00
jh04 823a8d8fbc [Setup] Make it quicker for small changes 2025-09-12 11:49:34 +02:00
jh04 088562cd53 [System] Remove mkinitcpio config 2025-09-12 11:49:26 +02:00
janishutz e9b8c35b52 [Scripts] Rename 2025-09-12 11:42:53 +02:00
janishutz 5a1811979e [Rofi] Fix positioning 2025-09-12 11:41:21 +02:00
janishutz 274890281c [Install] Add ripgrep 2025-09-12 10:40:46 +02:00
janishutz 0606ec06f5 [Hyprland] Add new rules 2025-09-12 10:40:11 +02:00
jh04 f22f8da68c [Install] Add git-credential-manager 2025-09-12 10:19:00 +02:00
jh04 409078edf9 [Install] Add ruby 2025-09-12 10:15:18 +02:00
jh04 2840c9aa70 [Fish] Add fish_variables 2025-09-12 10:13:22 +02:00
jh04 f4aedf7b5e [Install] Fix packages 2025-09-12 10:10:58 +02:00
jh04 f51cc0049a [Fish] Disable greeting 2025-09-12 10:10:48 +02:00
jh04 c01529a599 [Fish] Remove autojump from config 2025-09-12 09:57:40 +02:00
jh04 121f02c785 [Yazi] Fix keymap overlap 2025-09-12 09:57:33 +02:00
jh04 f6cd98e458 [Install] Add more utilities 2025-09-12 09:57:25 +02:00
jh04 cc9f38c71c [Install] Add more features 2025-09-12 09:29:18 +02:00
jh04 606a1fec1b [Install] Add auto-install of arch4edu and yay 2025-09-12 08:46:19 +02:00
janishutz d3bf33a142 [Install] Add seahorse to install 2025-09-12 06:59:29 +02:00
janishutz 91a6566d68 [Install] Finish up 2025-09-11 20:25:42 +02:00
jh04 ce0d951a54 [Install] Reorganize 2025-09-11 09:22:29 +02:00
jh04 106fe9cd9e Restructure bar restart and fix typos in ethz-vpn 2025-09-09 13:28:31 +02:00
jh04 a199569aac [Eslint] Increase max line length 2025-08-28 15:44:56 +02:00
jh04 80d16ab6ff [Install] Properly install yazi plugins 2025-08-22 14:21:19 +02:00
janishutz 1c8b72867e [Yazi] Add new plugin 2025-08-22 12:00:06 +02:00
jh04 9d59b24995 [Scripts] Add script to update open-webui 2025-08-21 12:14:30 +02:00
jh04 e78d07b25b [Base] Remove unnecessary files 2025-08-20 17:25:48 +02:00
jh04 a2c11e5cd1 [Yazi] Add keybind to open in evince 2025-08-05 11:21:27 +02:00
janishutz 70aceee3ca [Build] Build config 2025-07-31 09:08:07 +02:00
janishutz 8e6340e4c7 [Hyprlock] Update to V0.9 2025-07-31 09:07:19 +02:00
janishutz 46a4d7628d [Yazi] Add keybinds, start configuring openers 2025-07-28 11:10:03 +02:00
janishutz 2ec9356aca [Scripts] Prepare for cleanup 2025-07-22 15:52:52 +02:00
janishutz 3c19159c23 [Install] Use bvi instead of ghex 2025-07-16 15:38:45 +02:00
jh04 f6afd785fd [Setup] Fix yazi plugin updates 2025-06-22 15:21:45 +02:00
jh04 e20a33e132 [Setup] Fix 2025-06-22 14:49:58 +02:00
jh04 4683a171b9 [Astal] Finish up audio fix 2025-06-18 11:59:03 +02:00
jh04 4189258def [Astal] Fix audio issues 2025-06-18 11:40:58 +02:00
janishutz 2e8f1ec9ae [Hypr] Add easy docked switching 2025-06-12 10:08:57 +02:00
janishutz 78c97c5d84 [Hypr] Add docked config 2025-06-12 10:05:16 +02:00
jh04 4540dc00e7 [Eslint] Fix newline 2025-06-11 10:56:47 +02:00
jh04 294d7a9a98 [Eslint] Add max-len config 2025-06-11 09:48:34 +02:00
jh04 77dd4b4ca8 [Eslint] Add function-paren-newline option 2025-06-11 09:43:48 +02:00
jh04 7394ab63bf [Eslint] Change a few options 2025-06-10 17:23:43 +02:00
jh04 7f851fac73 [Eslint] Fix errors with single-line interface defintions 2025-06-07 11:18:58 +02:00
jh04 a5a6d9a916 [Eslint] Fix issues with end of file extra line 2025-06-06 15:36:12 +02:00
jh04 3967a4cd5c [latexfmt] Update align delims 2025-06-06 13:27:45 +02:00
jh04 f684f52d8f [latexfmt] Add indents for code 2025-06-06 13:20:52 +02:00
jh04 1079f62c06 [Eslint] Fix no-extra-parens config 2025-06-06 13:20:39 +02:00
jh04 1f460ccc38 [Eslint] Add support for mjs and cjs, format config 2025-06-06 11:46:57 +02:00
jh04 8b7f15eddf [Eslint] Add padding guides 2025-06-06 11:36:04 +02:00
jh04 0750c45111 [latexfmt] Finish up latexindent config 2025-06-06 10:59:16 +02:00
jh04 0db1815665 [Eslint] Fix spelling error in config 2025-06-06 10:35:04 +02:00
jh04 d028b027c5 [Eslint] Add more style options 2025-06-06 10:34:01 +02:00
jh04 e91f5aa5d6 [Eslint] Fix end of file newline 2025-06-06 10:27:49 +02:00
jh04 6105341234 [Eslint] Finish up config 2025-06-06 09:33:57 +02:00
jh04 6a362a963f [Eslint] Fix config 2025-06-05 19:59:45 +02:00
jh04 9005bd089a [Hyprland] Increase border size 2025-06-05 17:53:49 +02:00
jh04 1921545d08 [Hyprland] Fix keybind for cliphist 2025-06-05 15:40:00 +02:00
jh04 05b463699f [Install] Add cliphist 2025-06-05 15:38:19 +02:00
jh04 6f33358f4a [Hyprland] Add cliphist 2025-06-05 15:37:44 +02:00
jh04 909983d069 [Scripts] Fix indentconfig.yaml 2025-06-05 14:10:04 +02:00
jh04 a259206de8 [Scripts] add indentconfig.yaml 2025-06-05 13:33:52 +02:00
jh04 3f058cbfd3 [Scripts] Add a script to automatically rename files
This script automatically fixes any file name errors to ensure all files
are named correctly. Use with caution, as I have not yet tested it much
2025-06-04 14:26:32 +02:00
janishutz 318fc39b61 [Astal] Fix syntax 2025-05-26 15:05:07 +02:00
janishutz 6b1c8dec58 [Setup] Fix syntax error 2025-05-22 16:47:46 +02:00
janishutz 3541ec68e7 [Hyprland] Update binds (remove unnecessary ones) 2025-05-22 16:47:33 +02:00
janishutz 3a3674670b [Hyprland] Update binds 2025-05-22 16:43:27 +02:00
janishutz b2c6d72a2f [Hypridle] Improve idle manager 2025-05-22 11:46:20 +02:00
janishutz b9c68535d4 [Hypridle] Remove 100s timout 2025-05-22 11:45:28 +02:00
janishutz ae5226202a [Install] Remove TODO 2025-05-22 11:27:07 +02:00
janishutz 580aee4ad5 [Vimiv] Add notes and alias for fish 2025-05-22 10:12:12 +02:00
jh04 a8bf678d45 [Astal] Increase max-width of hyprland active window 2025-05-20 17:04:28 +02:00
janishutz 73feae1142 [Hyprland] Change to dwindle layout 2025-05-20 15:19:18 +02:00
janishutz b26b870bb2 [Hyprland] Resize window keybinds 2025-05-20 14:35:39 +02:00
janishutz 2d3a6ad33f [Astal] Remove debug code 2025-05-20 14:24:25 +02:00
janishutz ef9439b92c [Hyprland] Improve gestures 2025-05-19 14:29:40 +02:00
jh04 c635f3bfa9 [Build] Run build 2025-05-19 10:02:44 +02:00
jh04 7c3eb71150 [Astal] Update memory icon 2025-05-19 09:47:12 +02:00
janishutz 4fef18041f [Notes] Add another todo 2025-05-16 07:39:25 +02:00
janishutz df3384c667 [Notes] Mark completed items, add new todo 2025-05-16 07:37:49 +02:00
janishutz 7a97d7425e [Bar] Ellipsize too large text 2025-05-15 17:07:06 +02:00
jh04 73ca687358 [Fish] Add more aliases 2025-05-13 17:26:44 +02:00
jh04 88441958d9 [Yazi] Add more keybinds 2025-05-13 17:26:36 +02:00
janishutz e59af388b1 [Kitty] Finish improved cursor_trail settings 2025-05-12 14:17:24 +02:00
janishutz 39da9176ad [Build] Run build 2025-05-12 13:49:46 +02:00
janishutz e4ee9c9dc8 [Kitty] Improve cursor trail 2025-05-12 13:48:54 +02:00
jh04 feef8452f4 [Install] Add new programs, restructure 2025-05-09 11:12:02 +02:00
janishutz c3ff5a58d6 [AGS] Improve Battery display 2025-05-08 12:53:53 +02:00
janishutz a005189aef [Setup] Make bars restart, will be writing new notifications stuff soon 2025-05-08 10:55:31 +02:00
janishutz e98f5c2bd7 [Build] Run build 2025-05-08 10:43:00 +02:00
janishutz e7f6be4291 [AGS] QuickView: Use better battery icon 2025-05-08 10:42:55 +02:00
janishutz 4fa7dc3c1a [Eslint] Update arrow-parens to as-needed 2025-05-05 16:15:19 +02:00
janishutz 2ccb49f24b [Eslint] Finish config 2025-05-05 15:50:56 +02:00
jh04 ec04ebee66 [Player] Fix time display 2025-05-05 12:01:07 +02:00
jh04 2b2f1c2b66 [Build] Run build 2025-05-03 16:57:46 +02:00
jh04 21f7e53b2b [Build] Fix changeable colours 2025-05-03 16:57:39 +02:00
janishutz 5f09b7b915 [Install] Add new program 2025-04-29 15:35:19 +02:00
janishutz 688013a6b8 [Hyprland] Add logging for bar & notifier to temp folder 2025-04-29 14:47:56 +02:00
jh04 4e7c3ceee8 [Yazi] Remove plugins from here 2025-04-28 10:16:30 +02:00
jh04 390874374e [Hyprland] Hyprlock: Animations 2025-04-28 10:16:30 +02:00
janishutz 7f7a755e32 [Hyprland] Fix merge error 2025-04-28 08:56:38 +02:00
jh04 ac6b47449a [README] Update 2025-04-27 17:11:41 +02:00
jh04 ce5f530ed2 Merge V2 complete 2025-04-27 17:07:20 +02:00
jh04 62789224a7 Merge 2025-04-27 16:56:43 +02:00
jh04 0b849bad4f Fish change alias bt 2025-04-25 08:55:02 +02:00
jh04 0022880936 Actually create kitty config 2025-04-21 20:26:45 +02:00
janishutz 1d5240b7c6 Add terminal file chooser 2025-04-14 16:51:42 +02:00
janishutz 0b0e83f505 Improve notifications 2025-04-14 15:23:28 +02:00
janishutz f4cfa20dea Add fastfetch config 2025-04-10 11:35:39 +02:00
jh04 d866102fcc Improve copying in Zathura 2025-04-09 19:20:00 +02:00
jh04 921373f049 Update package list 2025-04-09 10:13:54 +02:00
jh04 1c39478650 Remove VSCode forced workspace 2025-04-05 15:19:55 +02:00
jh04 a845e086fd Change switch workspace keybind 2025-04-03 11:06:32 +02:00
jh04 b363438f6a Add zathura launch bind 2025-04-03 08:35:54 +02:00
jh04 7d9da82b6c Add restore plugin, improve ouch for yazi 2025-04-02 11:14:00 +02:00
jh04 c52c5b5a42 Improve Zathura, move to zoxide, add yazi plugins 2025-04-02 11:08:15 +02:00
jh04 97c49f17e6 Add nohlsearch to keybind zathura 2025-04-02 10:40:04 +02:00
jh04 134519558a Remove some zathura binds that come by default 2025-04-02 10:31:09 +02:00
jh04 9e5ae7db83 Update zathura binds 2025-04-01 17:52:33 +02:00
jh04 a31b3481c3 Make zathura open on 2nd workspace 2025-04-01 17:44:07 +02:00
jh04 1c757d1173 Add zathura config 2025-04-01 17:40:25 +02:00
jh04 89b97c4ba1 Add Zathura config 2025-04-01 17:40:10 +02:00
jh04 2ba627a370 Hyprland revert mouse focus change 2025-04-01 15:57:44 +02:00
jh04 995de3617c Hyprland change mouse focus 2025-04-01 13:50:28 +02:00
janishutz a477078f16 Hyprland fix vivado window rules 2025-03-31 15:33:15 +02:00
janishutz f93eeb5d87 Hyprland improve vivado 2025-03-31 15:17:32 +02:00
jh04 5b0e3767bd Add yazi keybinds 2025-03-31 10:50:44 +02:00
janishutz 51962c424b Hyprland fix for V0.48 2025-03-30 08:09:44 +02:00
jh04 a6ce7ccdce Fix path for scripts 2025-03-28 13:50:42 +01:00
janishutz 0f0e0e8671 improve notifications keybinds 2025-03-28 11:45:42 +01:00
janishutz c6061e0f12 Remove quit keybind from hyprland. Can be done through wlogout 2025-03-27 16:23:12 +01:00
jh04 cac0e41a2e Change shortcuts for fish 2025-03-24 09:12:07 +01:00
jh04 c4797dd592 Remove killactive from MainMod + C 2025-03-22 20:41:22 +01:00
jh04 8986ad894e Improve keybindings 2025-03-22 11:31:46 +01:00
jh04 f127ea8a41 Fix binds for new notification handler 2025-03-21 18:25:36 +01:00
jh04 bb75cfabaf Add binds for new notification handler 2025-03-21 18:10:15 +01:00
149 changed files with 5564 additions and 7773 deletions

No files matched your search

+10
View File
@@ -0,0 +1,10 @@
{
"workspace": {
"library": [
"/usr/share/hypr/stubs"
]
},
"diagnostics": {
"globals": ["hl"]
}
}
+41 -1
View File
@@ -1,4 +1,44 @@
# janishutz Hyprland <div id="title" align="center">
<img src="https://static.janishutz.com/logo.jpg" width="300">
<h1>janishutz Hyprland</h1>
</div>
Collection of dotfiles for my personal Hyprland setup, running on Arch Linux.
Includes a setup and install script (that one is not complete yet though).
For my neovim config, see [here](https://git.janishutz.com/janishutz/nvim)
![screenshot of desktop with 2 screens](./assets/screenshot.png)
# New Version
This version of the dotfiles (and all branches apart from `new`) are deprecated and in maintenance mode only,
while a new version is developed on the [new branch](https://git.janishutz.com/janishutz/dotfiles/src/branch/new)
## Features
- Astal4 based Status Bar and Quick Actions menu
- System info
- Hyprland info
- Date & Time
- Bluetooth picker
- some networking settings (more coming later)
- Audio and brightness control
- battery monitoring
- Logout, Reboot, Shutdown, etc
- Rofi config for App launcher
- Wlogout config
- Theming script that generates a GTK theme and theming for bar, Hyprland, etc
- Fish config (with some handy aliases, based on one from ohh-my-fish)
- Fastfetch config
- kitty config with cursor trail
- Linter configs (currently only eslint, which is not complete yet)
- mpv config
- zathura configs
- yazi configs with links to various directories I use commonly plus a few plugins and themes that are applied by the script
- Astal3 based Notifications (due to be migrated to Astal4)
## Installing
Clone your repo to any folder and adapt what you need. Some folders are still hard-coded, which I will be changing later on, so you will likely run into issues.
You may then run the `setup` script. That won't install all dependencies though. The `install` script is what serves that purpose, but that is not complete yet
## Setting up to develop ## Setting up to develop
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

+281 -74
View File
@@ -9,7 +9,9 @@ const renderColourAsHex = util.renderColourAsHex;
// │ Theme generator (returns theme as object) │ // │ Theme generator (returns theme as object) │
// ╰───────────────────────────────────────────────╯ // ╰───────────────────────────────────────────────╯
// ─────────────────────────────────────────────────────────────────── // ───────────────────────────────────────────────────────────────────
module.exports.generateTheme = ( theme, wallpaper, lockpaper, palette ) => { module.exports.generateTheme = (
theme, wallpaper, lockpaper, palette
) => {
return { return {
'wallpaper-path': wallpaper, 'wallpaper-path': wallpaper,
'lockpaper-path': lockpaper, 'lockpaper-path': lockpaper,
@@ -49,14 +51,30 @@ module.exports.generateTheme = ( theme, wallpaper, lockpaper, palette ) => {
'colour-accent-rgba-007': renderColourAsRGBA( palette[ 0 ], 0.07 ), 'colour-accent-rgba-007': renderColourAsRGBA( palette[ 0 ], 0.07 ),
'colour-accent-hyprland': util.renderColourAsRGBAHex( palette[ 0 ], 0.8 ), 'colour-accent-hyprland': util.renderColourAsRGBAHex( palette[ 0 ], 0.8 ),
// ─────────────────────────────────────────────────────────────────── // ───────────────────────────────────────────────────────────────────
'colour-accent-gradient-1-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, gradientMultipliers[ theme ] ) ), 'colour-accent-gradient-1-hex': renderColourAsHex( util.getGradientColour(
'colour-accent-gradient-2-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 2, gradientMultipliers[ theme ] ) ), palette[ 0 ], 1, gradientMultipliers[ theme ]
'colour-accent-gradient-3-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 3, gradientMultipliers[ theme ] ) ), ) ),
'colour-accent-gradient-4-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 4, gradientMultipliers[ theme ] ) ), 'colour-accent-gradient-2-hex': renderColourAsHex( util.getGradientColour(
'colour-accent-gradient-5-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 5, gradientMultipliers[ theme ] ) ), palette[ 0 ], 2, gradientMultipliers[ theme ]
'colour-accent-gradient-inverse-1-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, 1 / gradientMultipliers[ theme ] ) ), ) ),
'colour-accent-gradient-inverse-2-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, 1 / gradientMultipliers[ theme ] ) ), 'colour-accent-gradient-3-hex': renderColourAsHex( util.getGradientColour(
'colour-accent-gradient-inverse-3-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, 1 / gradientMultipliers[ theme ] ) ), palette[ 0 ], 3, gradientMultipliers[ theme ]
) ),
'colour-accent-gradient-4-hex': renderColourAsHex( util.getGradientColour(
palette[ 0 ], 4, gradientMultipliers[ theme ]
) ),
'colour-accent-gradient-5-hex': renderColourAsHex( util.getGradientColour(
palette[ 0 ], 5, gradientMultipliers[ theme ]
) ),
'colour-accent-gradient-inverse-1-hex': renderColourAsHex( util.getGradientColour(
palette[ 0 ], 1, 1 / gradientMultipliers[ theme ]
) ),
'colour-accent-gradient-inverse-2-hex': renderColourAsHex( util.getGradientColour(
palette[ 0 ], 1, 1 / gradientMultipliers[ theme ]
) ),
'colour-accent-gradient-inverse-3-hex': renderColourAsHex( util.getGradientColour(
palette[ 0 ], 1, 1 / gradientMultipliers[ theme ]
) ),
// ── Secondary accent ───────────────────────────────────────────── // ── Secondary accent ─────────────────────────────────────────────
'colour-accent-2-hex': renderColourAsHex( palette[ 1 ] ), 'colour-accent-2-hex': renderColourAsHex( palette[ 1 ] ),
@@ -155,8 +173,8 @@ module.exports.generateTheme = ( theme, wallpaper, lockpaper, palette ) => {
// │ Path to this repo on disk │ // │ Path to this repo on disk │
// └ ┘ // └ ┘
'path-to-dotfiles': __dirname.slice( 0, __dirname.length - 5 ), 'path-to-dotfiles': __dirname.slice( 0, __dirname.length - 5 ),
} };
} };
// ─────────────────────────────────────────────────────────────────── // ───────────────────────────────────────────────────────────────────
@@ -171,74 +189,265 @@ const gradientMultipliers = {
'light': 1.1, 'light': 1.1,
'bright': 1.15, 'bright': 1.15,
'test': 0.75 'test': 0.75
} };
const colours = { const colours = {
foreground: { 'foreground': {
'nordic': [ 200, 220, 255 ], 'nordic': [
'deep-dark': [ 230, 230, 230 ], 200,
'material': [ 255, 255, 255 ], // TODO: Will be calculated by material theme generator 220,
'light': [ 40, 40, 40 ], 255
'bright': [ 0, 0, 0 ], ],
'test': [ 0, 0, 0 ], 'deep-dark': [
230,
230,
230
],
'material': [
255,
255,
255
], // TODO: Will be calculated by material theme generator
'light': [
40,
40,
40
],
'bright': [
0,
0,
0
],
'test': [
0,
0,
0
],
}, },
'foreground-accent': { 'foreground-accent': {
'nordic': [ 255, 255, 255 ], 'nordic': [
'deep-dark': [ 255, 255, 255 ], 255,
'material': [ 200, 200, 200 ], // TODO: Will be calculated by material theme generator 255,
'light': [ 0, 0, 0 ], 255
'bright': [ 50, 50, 50 ], ],
'test': [ 0, 0, 0 ], 'deep-dark': [
255,
255,
255
],
'material': [
200,
200,
200
], // TODO: Will be calculated by material theme generator
'light': [
0,
0,
0
],
'bright': [
50,
50,
50
],
'test': [
0,
0,
0
],
}, },
background: { 'background': {
'nordic': [ 10, 10, 15 ], 'nordic': [
'deep-dark': [ 20, 20, 20 ], 10,
'material': [ 30, 30, 30 ], // TODO: Will be calculated by material theme generator 10,
'light': [ 230, 230, 230 ], 15
'bright': [ 255, 255, 255 ], ],
'test': [ 255, 255, 255 ], 'deep-dark': [
20,
20,
20
],
'material': [
30,
30,
30
], // TODO: Will be calculated by material theme generator
'light': [
230,
230,
230
],
'bright': [
255,
255,
255
],
'test': [
255,
255,
255
],
}, },
'background-alternative': { 'background-alternative': {
'nordic': [ 20, 20, 25 ], 'nordic': [
'deep-dark': [ 30, 30, 30 ], 20,
'material': [ 40, 40, 40 ], // TODO: Will be calculated by material theme generator 20,
'light': [ 210, 210, 210 ], 25
'bright': [ 230, 230, 230 ], ],
'test': [ 255, 255, 0 ] // brown 'deep-dark': [
30,
30,
30
],
'material': [
40,
40,
40
], // TODO: Will be calculated by material theme generator
'light': [
210,
210,
210
],
'bright': [
230,
230,
230
],
'test': [
255,
255,
0
] // brown
}, },
'background-tertiary': { 'background-tertiary': {
'nordic': [ 0, 0, 0 ], 'nordic': [
'deep-dark': [ 45, 45, 45 ], 0,
'material': [ 0, 0, 0 ], // TODO: Will be calculated by material theme generator 0,
'light': [ 180, 180, 180 ], 0
'bright': [ 200, 200, 200 ], ],
'test': [ 255, 0, 255 ] // purple 'deep-dark': [
45,
45,
45
],
'material': [
0,
0,
0
], // TODO: Will be calculated by material theme generator
'light': [
180,
180,
180
],
'bright': [
200,
200,
200
],
'test': [
255,
0,
255
] // purple
}, },
shadow: { 'shadow': {
'nordic': [ 0, 0, 2 ], 'nordic': [
'deep-dark': [ 40, 40, 40 ], 0,
'material': [ 30, 30, 30 ], // TODO: Will be calculated by material theme generator 0,
'light': [ 190, 190, 190 ], 2
'bright': [ 150, 150, 150 ], ],
'test': [ 120, 0, 0 ] // dark red 'deep-dark': [
40,
40,
40
],
'material': [
30,
30,
30
], // TODO: Will be calculated by material theme generator
'light': [
190,
190,
190
],
'bright': [
150,
150,
150
],
'test': [
120,
0,
0
] // dark red
}, },
inactive: { 'inactive': {
'nordic': [ 200, 200, 200 ], 'nordic': [
'deep-dark': [ 200, 200, 200 ], 200,
'material': [ 200, 200, 200 ], // TODO: Will be calculated by material theme generator 200,
'light': [ 65, 65, 65 ], 200
'bright': [ 60, 60, 60 ], ],
'test': [ 150, 150, 150 ] 'deep-dark': [
200,
200,
200
],
'material': [
200,
200,
200
], // TODO: Will be calculated by material theme generator
'light': [
65,
65,
65
],
'bright': [
60,
60,
60
],
'test': [
150,
150,
150
]
}, },
'inactive-background': { 'inactive-background': {
'nordic': [ 0, 0, 0 ], 'nordic': [
'deep-dark': [ 0, 0, 0 ], 0,
'material': [ 255, 255, 255 ], // TODO: Will be calculated by material theme generator 0,
'light': [ 80, 80, 80 ], 0
'bright': [ 60, 60, 60 ], ],
'test': [ 60, 60, 60 ] 'deep-dark': [
0,
0,
0
],
'material': [
255,
255,
255
], // TODO: Will be calculated by material theme generator
'light': [
80,
80,
80
],
'bright': [
60,
60,
60
],
'test': [
60,
60,
60
]
} }
} };
const fonts = { const fonts = {
'primary': { 'primary': {
'nordic': 'Comfortaa', 'nordic': 'Comfortaa',
@@ -261,20 +470,18 @@ const fonts = {
'light': 'Jetbrains Mono', 'light': 'Jetbrains Mono',
'bright': 'Jetbrains Mono', 'bright': 'Jetbrains Mono',
} }
} };
const iconTheme = { const iconTheme = {
'nordic': 'Candy', 'nordic': 'Candy',
'deep-dark': 'Candy', 'deep-dark': 'Candy',
'material': 'Candy', 'material': 'Candy',
'light': 'Candy', 'light': 'Candy',
'bright': 'Candy' 'bright': 'Candy'
} };
const yaziThemes = { const yaziThemes = {
'nordic': 'tokyo-night', 'nordic': 'tokyo-night',
'deep-dark': 'vscode-dark-modern', 'deep-dark': 'dracula',
'material': 'dracula', 'material': 'dracula',
'light': 'vscode-light-modern', 'light': 'catppuccin-latte',
'bright': 'vscode-light-modern', 'bright': 'catppuccin-latte',
} };
+2 -2
View File
@@ -10,7 +10,7 @@ const inquirer = require( 'inquirer' ).default;
const build = ( wallpaper, lockpaper, theme ) => { const build = ( wallpaper, lockpaper, theme ) => {
console.log( '\n=> Extracting colours' ); console.log( '\n=> Extracting colours' );
// Extract colour palette from chosen wallpaper using Color-Thief // Extract colour palette from chosen wallpaper using Color-Thief
colorThief.getPalette( wallpaper ).then( palette => { colorThief.getPalette( wallpaper, 20 ).then( palette => {
palette = util.removeUselessColours( palette ); palette = util.removeUselessColours( palette );
// Define view options (for rendering with mustache) // Define view options (for rendering with mustache)
if ( theme === 'test' ) { if ( theme === 'test' ) {
@@ -30,7 +30,7 @@ const build = ( wallpaper, lockpaper, theme ) => {
name: 'confirm-proceed-build', name: 'confirm-proceed-build',
message: 'Okay to proceed with these colours?' message: 'Okay to proceed with these colours?'
} ] ).then( answer => { } ] ).then( answer => {
if ( answer ) proceedWithBuild( wallpaper, lockpaper, theme, palette ); if ( answer['confirm-proceed-build'] ) proceedWithBuild( wallpaper, lockpaper, theme, palette );
else { else {
// Have the user pick any other of the extracted colours instead // Have the user pick any other of the extracted colours instead
let counter = -1; let counter = -1;
+81 -33
View File
@@ -1,5 +1,7 @@
const convert = require( 'color-convert' ); const convert = require( 'color-convert' );
const fs = require( 'fs' ); const fs = require( 'fs' );
const path = require( 'path' ); const path = require( 'path' );
/** /**
@@ -8,14 +10,20 @@ const path = require( 'path' );
* @param {string} extension The file extension to look for * @param {string} extension The file extension to look for
* @returns {string[]} returns a list of html files with their full path * @returns {string[]} returns a list of html files with their full path
*/ */
const treeWalker = ( dir, extension, ignoreList ) => { const treeWalker = (
dir, extension, ignoreList
) => {
const ls = fs.readdirSync( dir ); const ls = fs.readdirSync( dir );
const fileList = []; const fileList = [];
for ( let file in ls ) { for ( let file in ls ) {
if ( fs.statSync( path.join( dir, ls[ file ] ) ).isDirectory() ) { if ( fs.statSync( path.join( dir, ls[ file ] ) ).isDirectory() ) {
// Filter ignored directories // Filter ignored directories
if ( ignoreList === undefined || !ignoreList.includes( ls[ file ] ) ) { if ( ignoreList === undefined || !ignoreList.includes( ls[ file ] ) ) {
const newFiles = treeWalker( path.join( dir, ls[ file ] ), extension, ignoreList ); const newFiles = treeWalker(
path.join( dir, ls[ file ] ), extension, ignoreList
);
for ( let file = 0; file < newFiles.length; file++ ) { for ( let file = 0; file < newFiles.length; file++ ) {
fileList.push( newFiles[ file ] ); fileList.push( newFiles[ file ] );
} }
@@ -28,50 +36,69 @@ const treeWalker = ( dir, extension, ignoreList ) => {
} }
return fileList; return fileList;
} };
const renderColourAsHex = ( colour ) => { const renderColourAsHex = colour => {
return '#' + convert.default.rgb.hex( colour[ 0 ], colour[ 1 ], colour[ 2 ] ); return '#' + convert.default.rgb.hex(
} colour[ 0 ], colour[ 1 ], colour[ 2 ]
);
};
const renderColourAsRGB = ( colour ) => { const renderColourAsRGB = colour => {
return `rgb(${ colour[ 0 ] }, ${ colour[ 1 ] }, ${ colour[ 2 ] })` return `rgb(${ colour[ 0 ] }, ${ colour[ 1 ] }, ${ colour[ 2 ] })`;
} };
const renderColourAsRGBA = ( colour, ambiance ) => { const renderColourAsRGBA = ( colour, ambiance ) => {
return `rgba(${ colour[ 0 ] }, ${ colour[ 1 ] }, ${ colour[ 2 ] }, ${ ambiance })` return `rgba(${ colour[ 0 ] }, ${ colour[ 1 ] }, ${ colour[ 2 ] }, ${ ambiance })`;
} };
const renderColourAsRGBHex = colour => {
const hexCol = convert.default.rgb.hex(
colour[ 0 ], colour[ 1 ], colour[ 2 ]
);
const renderColourAsRGBHex = ( colour ) => {
const hexCol = convert.default.rgb.hex( colour[ 0 ], colour[ 1 ], colour[ 2 ] );
return `rgb(${ hexCol })`.toLowerCase(); return `rgb(${ hexCol })`.toLowerCase();
} };
function decimalToHex ( decimal ) { function decimalToHex ( decimal ) {
const hexValue = Math.round( decimal * 255 ); const hexValue = Math.round( decimal * 255 );
return hexValue.toString( 16 ).padStart( 2, '0' ); return hexValue.toString( 16 ).padStart( 2, '0' );
} }
const renderColourAsRGBAHex = ( colour, ambiance ) => { const renderColourAsRGBAHex = ( colour, ambiance ) => {
const hexCol = convert.default.rgb.hex( colour[ 0 ], colour[ 1 ], colour[ 2 ] ); const hexCol = convert.default.rgb.hex(
colour[ 0 ], colour[ 1 ], colour[ 2 ]
);
return `rgba(${ hexCol }${ decimalToHex( ambiance ) })`.toLowerCase(); return `rgba(${ hexCol }${ decimalToHex( ambiance ) })`.toLowerCase();
};
const removeUselessColours = palette => {
const p = [];
for ( let i = 0; i < palette.length; i++ ) {
const el = palette[ i ];
const luminance = calculateLuminance( palette[ i ] );
if ( luminance < 210 && luminance > 40 ) {
p.push( palette[ i ] );
} }
const removeUselessColours = ( palette ) => { for ( let j = 0; j < el.length; j++ ) {
const p = []; if ( el[j] > 70 ) {
for ( let i = 0; i < palette.length; i++ ) {
const luminance = calculateLuminance( palette[ i ] );
if ( luminance < 215 && luminance > 40 ) {
p.push( palette[ i ] ); p.push( palette[ i ] );
break;
}
} }
} }
return p; return p;
} };
const calculateLuminance = ( colour ) => { const calculateLuminance = colour => {
return colour[ 0 ] + colour[ 1 ] + colour[ 2 ] / 3; return colour[ 0 ] + colour[ 1 ] + colour[ 2 ] / 3;
} };
/* /*
@@ -129,33 +156,54 @@ const replacements = {
'rgba(158, 158, 158, 0.2)': '@fg_rgba_02', 'rgba(158, 158, 158, 0.2)': '@fg_rgba_02',
'rgba(158, 158, 158, 0.1168)': '@fg_rgba_01' 'rgba(158, 158, 158, 0.1168)': '@fg_rgba_01'
}; };
const themePreProcessor = ( file, replacement, out ) => {
const themePreProcessor = (
file, replacement, out
) => {
const colours = Object.keys( replacements ); const colours = Object.keys( replacements );
let data = '' + fs.readFileSync( file ); let data = '' + fs.readFileSync( file );
for ( let index = 0; index < colours.length; index++ ) { for ( let index = 0; index < colours.length; index++ ) {
const colour = colours[index]; const colour = colours[index];
data = data.replaceAll( colour, replacements[ colour ] ); data = data.replaceAll( colour, replacements[ colour ] );
} }
const outPath = file.replace( replacement, out ); const outPath = file.replace( replacement, out );
try { try {
fs.mkdirSync( path.dirname( outPath ), { fs.mkdirSync( path.dirname( outPath ), {
recursive: true, 'recursive': true,
} ); } );
} catch ( e ) { } catch ( e ) {
console.error( e ); console.error( e );
} }
fs.writeFileSync( outPath, data ); fs.writeFileSync( outPath, data );
};
const getGradientColour = (
colour, index, multiplier
) => {
if ( index === 0 ) {
return [
colour[ 0 ] * multiplier,
colour[ 1 ] * multiplier,
colour[ 2 ] * multiplier
];
} }
const getGradientColour = ( colour, index, multiplier ) => { const gradient = getGradientColour(
if ( index === 0 ) { colour, index - 1, multiplier
return [ colour[ 0 ] * multiplier, colour[ 1 ] * multiplier, colour[ 2 ] * multiplier ]; );
}
const gradient = getGradientColour( colour, index - 1, multiplier ); return [
return [ Math.min( 255, gradient[ 0 ] * multiplier ), Math.min( 255, gradient[ 1 ] * multiplier ), Math.min( 255, gradient[ 2 ] * multiplier ) ]; Math.min( 255, gradient[ 0 ] * multiplier ),
} Math.min( 255, gradient[ 1 ] * multiplier ),
Math.min( 255, gradient[ 2 ] * multiplier )
];
};
module.exports = { module.exports = {
treeWalker, treeWalker,
@@ -167,4 +215,4 @@ module.exports = {
themePreProcessor, themePreProcessor,
getGradientColour, getGradientColour,
removeUselessColours removeUselessColours
} };
+9
View File
@@ -1,10 +1,13 @@
const fs = require( 'fs' ); const fs = require( 'fs' );
const path = require( 'path' ); const path = require( 'path' );
const data = '' + fs.readFileSync( '/usr/share/themes/Material-Black-Blueberry/gtk-4.0/gtk.css' ); const data = '' + fs.readFileSync( '/usr/share/themes/Material-Black-Blueberry/gtk-4.0/gtk.css' );
let lineNumber = 1; let lineNumber = 1;
const indexer = {}; const indexer = {};
for ( let i = 0; i < data.length; i++ ) { for ( let i = 0; i < data.length; i++ ) {
const char = data[i]; const char = data[i];
@@ -13,17 +16,22 @@ for (let i = 0; i < data.length; i++) {
} else if ( char === '#' ) { } else if ( char === '#' ) {
const extract = data.substring( i ); const extract = data.substring( i );
const col = extract.slice( 0, extract.indexOf( '\n' ) ); const col = extract.slice( 0, extract.indexOf( '\n' ) );
if ( !indexer[ col ] ) { if ( !indexer[ col ] ) {
indexer[ col ] = []; indexer[ col ] = [];
} }
indexer[ col ].push( lineNumber ); indexer[ col ].push( lineNumber );
} else if ( char === 'r' ) { } else if ( char === 'r' ) {
const extract = data.substring( i ); const extract = data.substring( i );
if ( extract.slice( 0, 3 ) === 'rgb' ) { if ( extract.slice( 0, 3 ) === 'rgb' ) {
const col = extract.slice( 0, extract.indexOf( '\n' ) ); const col = extract.slice( 0, extract.indexOf( '\n' ) );
if ( !indexer[ col ] ) { if ( !indexer[ col ] ) {
indexer[ col ] = []; indexer[ col ] = [];
} }
indexer[ col ].push( lineNumber ); indexer[ col ].push( lineNumber );
} }
} }
@@ -32,6 +40,7 @@ for (let i = 0; i < data.length; i++) {
// Output // Output
const keys = Object.keys( indexer ); const keys = Object.keys( indexer );
for ( let i = 0; i < keys.length; i++ ) { for ( let i = 0; i < keys.length; i++ ) {
const element = keys[i]; const element = keys[i];
-5
View File
@@ -1,5 +0,0 @@
{
"gen": {
"overrides": {}
}
}
+27 -11
View File
@@ -1,24 +1,29 @@
import { App } from "astal/gtk4" import {
import style from "./style.scss" App
import Bar from "./components/bar/Bar"; } from 'astal/gtk4';
import AstalHyprland from "gi://AstalHyprland?version=0.1"; import AstalHyprland from 'gi://AstalHyprland?version=0.1';
import { hyprToGdk } from "./util/hyprland"; import Bar from './components/bar/Bar';
import Brightness from "./util/brightness"; import Brightness from './util/brightness';
import {
hyprToGdk
} from './util/hyprland';
import style from './style.scss';
App.start( { App.start( {
instanceName: "runner", 'instanceName': 'runner',
css: style, 'css': style,
main () { main () {
const hypr = AstalHyprland.get_default(); const hypr = AstalHyprland.get_default();
const bars = new Map<number, string>(); const bars = new Map<number, string>();
const barCreator = ( monitor: AstalHyprland.Monitor ) => { const barCreator = ( monitor: AstalHyprland.Monitor ) => {
const gdkMonitor = hyprToGdk( monitor ); const gdkMonitor = hyprToGdk( monitor );
if ( gdkMonitor ) { if ( gdkMonitor ) {
print( 'Bar added for screen ' + monitor.get_id() ); print( 'Bar added for screen ' + monitor.get_id() );
bars.set( monitor.get_id(), Bar.BarLauncher( gdkMonitor ) ); bars.set( monitor.get_id(), Bar.BarLauncher( gdkMonitor ) );
} }
} };
for ( const monitor of hypr.monitors ) { for ( const monitor of hypr.monitors ) {
barCreator( monitor ); barCreator( monitor );
@@ -30,14 +35,17 @@ App.start({
hypr.connect( 'monitor-removed', ( _, monitor ) => { hypr.connect( 'monitor-removed', ( _, monitor ) => {
const windowName = bars.get( monitor ); const windowName = bars.get( monitor );
if ( windowName ) { if ( windowName ) {
const win = App.get_window( windowName ); const win = App.get_window( windowName );
if ( win ) { if ( win ) {
App.toggle_window( windowName ); App.toggle_window( windowName );
win.set_child( null ); win.set_child( null );
App.remove_window( win ); App.remove_window( win );
print( 'Bar removed for screen', monitor ); print( 'Bar removed for screen', monitor );
} }
bars.delete( monitor ); bars.delete( monitor );
} }
} ); } );
@@ -60,6 +68,7 @@ App.start({
} else if ( args[ 0 ] === 'brightness' ) { } else if ( args[ 0 ] === 'brightness' ) {
try { try {
const brightness = Brightness.get_default(); const brightness = Brightness.get_default();
if ( brightness.screenAvailable ) { if ( brightness.screenAvailable ) {
if ( args[ 1 ] === 'increase' ) { if ( args[ 1 ] === 'increase' ) {
brightness.screen += args.length > 1 ? parseInt( args[ 2 ] ) / 100 : 1; brightness.screen += args.length > 1 ? parseInt( args[ 2 ] ) / 100 : 1;
@@ -70,19 +79,27 @@ App.start({
brightness.screen = parseInt( args[ 2 ] ) / 100; brightness.screen = parseInt( args[ 2 ] ) / 100;
} else { } else {
res( 'Argument <brightness> unspecified' ); res( 'Argument <brightness> unspecified' );
return; return;
} }
} else { } else {
res( 'Unknown command ' + args[ 1 ] ); res( 'Unknown command ' + args[ 1 ] );
return; return;
} }
res( 'Ok' ); res( 'Ok' );
} else { } else {
res( 'No controllable screen available' ); res( 'No controllable screen available' );
} }
} catch ( e ) { } catch ( e ) {
print( e );
res( 'Error running brightness change' ); res( 'Error running brightness change' );
} }
} else if ( args[ 0 ] === 'reload-style' ) {
res( 'Reloading style sheets' );
App.apply_css( '', true );
// TODO: Compile scss and then load it
} }
// } else if ( args[ 0 ] === 'launcher' ) { // } else if ( args[ 0 ] === 'launcher' ) {
// if ( args[ 1 ] === 'show' ) { // if ( args[ 1 ] === 'show' ) {
@@ -99,5 +116,4 @@ App.start({
// } // }
// } // }
}, },
}) } );
@@ -1,44 +1,58 @@
import { Gtk } from "astal/gtk4"; import Audio from './modules/Audio/Audio';
import Power from "./modules/Power"; import {
import Audio from "./modules/Audio/Audio"; BatteryBox
import Bluetooth from "./modules/Bluetooth/Bluetooth"; } from './modules/Battery';
import Brightness from "./modules/Brightness/Brightness"; import Bluetooth from './modules/Bluetooth/Bluetooth';
import Player from "./modules/Player/Player"; import Brightness from './modules/Brightness/Brightness';
import { BatteryBox } from "./modules/Battery"; import {
import { exec } from "astal"; Gtk
import Network from "./modules/Networking/Network"; } from 'astal/gtk4';
import Network from './modules/Networking/Network';
import Player from './modules/Player/Player';
import Power from './modules/Power';
import SysTray from './modules/SysTray';
import {
exec
} from 'astal';
const QuickActions = () => { const QuickActions = () => {
const popover = new Gtk.Popover({ cssClasses: ["quick-actions-wrapper"] }); const popover = new Gtk.Popover( {
'cssClasses': [ 'quick-actions-wrapper' ]
} );
popover.set_child( renderQuickActions() ); popover.set_child( renderQuickActions() );
return popover; return popover;
}; };
const renderQuickActions = () => { const renderQuickActions = () => {
const user = exec("/bin/sh -c whoami"); const user = exec( '/bin/sh -c whoami' );
const profile = exec("/bin/fish -c get-profile-picture"); const profile = exec( '/bin/fish -c get-profile-picture' );
const cwd = exec("pwd"); const cwd = exec( 'pwd' );
const um = Power.UserMenu(); const um = Power.UserMenu();
return ( return (
<box visible cssClasses={["quick-actions", "popover-box"]} vertical> <box visible cssClasses={[
'quick-actions',
'popover-box'
]} vertical>
<centerbox <centerbox
startWidget={ startWidget={
<button <button
onClicked={() => um.popup()} onClicked={() => um.popup()}
cssClasses={["stealthy-button"]} cssClasses={[ 'stealthy-button' ]}
child={ child={
<box> <box>
{um} {um}
<Gtk.Frame <Gtk.Frame
cssClasses={["avatar-icon"]} cssClasses={[ 'avatar-icon' ]}
child={ child={
<image <image
file={ file={
profile !== "" profile !== ''
? profile ? profile
: cwd + : cwd
"/no-avatar-icon.jpg" + '/no-avatar-icon.jpg'
} }
></image> ></image>
} }
@@ -53,6 +67,7 @@ const renderQuickActions = () => {
hexpand={false} hexpand={false}
> >
<BatteryBox></BatteryBox> <BatteryBox></BatteryBox>
<SysTray.SystemTray></SysTray.SystemTray>
<Power.Power></Power.Power> <Power.Power></Power.Power>
</box> </box>
} }
@@ -1,4 +1,4 @@
import { bind, Binding } from "astal"; import { bind } from "astal";
import { Gtk } from "astal/gtk4"; import { Gtk } from "astal/gtk4";
import AstalWp from "gi://AstalWp"; import AstalWp from "gi://AstalWp";
@@ -13,8 +13,8 @@ const AudioModule = () => {
wp.defaultMicrophone.set_volume(volume / 100); wp.defaultMicrophone.set_volume(volume / 100);
}; };
const speakerSelector = SinkSelectPopover(AstalWp.MediaClass.AUDIO_SPEAKER); const speakerSelector = SinkSelectPopover(AstalWp.MediaClass.AUDIO_SINK);
const micSelector = SinkSelectPopover(AstalWp.MediaClass.AUDIO_MICROPHONE); const micSelector = SinkSelectPopover(AstalWp.MediaClass.AUDIO_SOURCE);
return ( return (
<box cssClasses={["audio-box"]} vertical> <box cssClasses={["audio-box"]} vertical>
@@ -107,12 +107,18 @@ const AudioModule = () => {
}; };
const SinkPicker = (type: AstalWp.MediaClass) => { const SinkPicker = (type: AstalWp.MediaClass) => {
const devices = bind(wp, "endpoints"); const devices = bind(wp, "nodes");
wp.connect("ready", () => {
const dev = wp.get_nodes()!
for (let i = 0; i < dev.length; i++) {
const d = dev[i];
}
})
return ( return (
<box vertical> <box vertical>
<label <label
label={`Available Audio ${type === AstalWp.MediaClass.AUDIO_SPEAKER ? "Output" : type === AstalWp.MediaClass.AUDIO_MICROPHONE ? "Input" : ""} Devices`} label={`Available Audio ${type === AstalWp.MediaClass.AUDIO_SINK ? "Output" : type === AstalWp.MediaClass.AUDIO_SOURCE ? "Input" : ""} Devices`}
cssClasses={[ 'title-2' ]} cssClasses={[ 'title-2' ]}
></label> ></label>
<Gtk.Separator marginBottom={5} marginTop={3}></Gtk.Separator> <Gtk.Separator marginBottom={5} marginTop={3}></Gtk.Separator>
@@ -128,11 +134,11 @@ const SinkPicker = (type: AstalWp.MediaClass) => {
if ( if (
id === id ===
(type === (type ===
AstalWp.MediaClass.AUDIO_SPEAKER AstalWp.MediaClass.AUDIO_SINK
? wp.defaultSpeaker.id ? wp.defaultSpeaker.id
: type === : type ===
AstalWp.MediaClass AstalWp.MediaClass
.AUDIO_MICROPHONE .AUDIO_SOURCE
? wp.defaultMicrophone.id ? wp.defaultMicrophone.id
: "") : "")
) { ) {
@@ -0,0 +1,51 @@
{devices.as(d => {
return d.map(device => {
if (device.get_media_class() !== type) {
return <box cssClasses={[ 'empty' ]}></box>;
}
return (
<button
cssClasses={bind(device, "id").as(id => {
if (
id ===
(type ===
AstalWp.MediaClass.AUDIO_SPEAKER
? wp.defaultSpeaker.id
: type ===
AstalWp.MediaClass
.AUDIO_MICROPHONE
? wp.defaultMicrophone.id
: "")
) {
return [
"sink-option",
"currently-selected-sink-option",
];
} else {
return ["sink-option"];
}
})}
child={
<box halign={Gtk.Align.START}>
<image
iconName={bind(device, "icon").as(
icon => icon,
)}
marginEnd={3}
></image>
<label
label={bind(
device,
"description",
).as(t => t ?? "")}
></label>
</box>
}
onClicked={() => {
device.set_is_default(true);
}}
></button>
);
});
})}
@@ -29,21 +29,23 @@ export const BatteryBox = () => {
cssClasses={["battery-time"]} cssClasses={["battery-time"]}
visible={bind(battery, "charging").as(c => !c)} visible={bind(battery, "charging").as(c => !c)}
label={bind(battery, "timeToEmpty").as(t => `(${toTime(t)})`)} label={bind(battery, "timeToEmpty").as(t => `(${toTime(t)})`)}
tooltipText={bind(battery, 'energyRate').as(er => `Time to empty. Power usage: ${batteryEnergy(er)}`)}
/> />
<label <label
cssClasses={["battery-time"]} cssClasses={["battery-time"]}
visible={bind(battery, "charging")} visible={bind(battery, "charging")}
label={bind(battery, "timeToFull").as(t => `(${toTime(t)})`)} label={bind(battery, "timeToFull").as(t => `(${toTime(t)})`)}
tooltipText={bind(battery, 'energyRate').as(er => `Time to full. Charge rate: ${batteryEnergy(er)}`)}
/> />
</box> </box>
); );
}; };
const toTime = (time: number) => {
const MINUTE = 60; const MINUTE = 60;
const HOUR = MINUTE * 60; const HOUR = MINUTE * 60;
const toTime = (time: number) => {
if (time > 24 * HOUR) return ""; if (!time) return "Waiting on BIOS"
if (time > 24 * HOUR) return "24h+";
const hours = Math.round(time / HOUR); const hours = Math.round(time / HOUR);
const minutes = Math.round((time - hours * HOUR) / MINUTE); const minutes = Math.round((time - hours * HOUR) / MINUTE);
@@ -4,10 +4,10 @@ import Brightness from "../../../../util/brightness";
const brightness = Brightness.get_default(); const brightness = Brightness.get_default();
const BrightnessModule = () => { const BrightnessModule = () => {
print( brightness.screen * 100 );
const setBrightness = (value: number) => { const setBrightness = (value: number) => {
brightness.screen = value; brightness.screen = value;
} }
return ( return (
<box visible={bind(brightness, 'screenAvailable')}> <box visible={bind(brightness, 'screenAvailable')}>
<image iconName={"brightness-high-symbolic"}></image> <image iconName={"brightness-high-symbolic"}></image>
@@ -17,7 +17,7 @@ const BrightnessModule = () => {
hexpand hexpand
max={1} max={1}
min={0.01} min={0.01}
step={0.01} step={0.05}
vexpand vexpand
onChangeValue={self => setBrightness(self.value)} onChangeValue={self => setBrightness(self.value)}
></slider> ></slider>
@@ -135,8 +135,9 @@ const PlayerItem = ({ player }: { player: AstalMpris.Player }) => {
}; };
const secondsToFriendlyTime = (time: number) => { const secondsToFriendlyTime = (time: number) => {
const minutes = Math.floor(time / 60); const m = Math.floor(time / 60);
const hours = Math.floor(minutes / 60); const minutes = Math.floor(m % 60);
const hours = Math.floor(m / 60 % 24);
const seconds = Math.floor(time % 60); const seconds = Math.floor(time % 60);
if (hours > 0) { if (hours > 0) {
return `${hours}:${expandTime(minutes)}:${expandTime(seconds)}`; return `${hours}:${expandTime(minutes)}:${expandTime(seconds)}`;
@@ -1,48 +1,56 @@
import { exec } from "astal"; import {
import { Gtk } from "astal/gtk4"; exec
} from 'astal';
import {
Gtk
} from 'astal/gtk4';
const PowerMenu = (): Gtk.Popover => { const PowerMenu = (): Gtk.Popover => {
const popover = new Gtk.Popover({ cssClasses: ["PowerMenu"] }); const popover = new Gtk.Popover( {
'cssClasses': [ 'PowerMenu' ]
} );
const powerMenuBox = () => { const powerMenuBox = () => {
return ( return (
<box> <box>
<button <button
cssClasses={["power-button"]} cssClasses={[ 'power-button' ]}
child={ child={
<image iconName={"system-shutdown-symbolic"}></image> <image iconName={'system-shutdown-symbolic'}></image>
} }
onClicked={() => exec("/bin/sh -c 'shutdown now'")} onClicked={() => exec( '/bin/sh -c \'shutdown now\'' )}
></button> ></button>
<button <button
cssClasses={["power-button"]} cssClasses={[ 'power-button' ]}
child={<image iconName={"system-reboot-symbolic"}></image>} child={<image iconName={'system-reboot-symbolic'}></image>}
onClicked={() => exec("/bin/sh -c 'reboot'")} onClicked={() => exec( '/bin/sh -c \'reboot\'' )}
></button> ></button>
<button <button
cssClasses={["power-button"]} cssClasses={[ 'power-button' ]}
child={<image iconName={"system-suspend-symbolic"}></image>} child={<image iconName={'system-suspend-symbolic'}></image>}
onClicked={() => exec("/bin/sh -c 'systemctl suspend'")} onClicked={() => exec( '/bin/sh -c \'systemctl suspend\'' )}
></button> ></button>
</box> </box>
); );
}; };
popover.set_child( powerMenuBox() ); popover.set_child( powerMenuBox() );
return popover; return popover;
}; };
const Power = () => { const Power = () => {
const pm = PowerMenu(); const pm = PowerMenu();
return ( return (
<button <button
widthRequest={0} widthRequest={0}
hexpand={false} hexpand={false}
vexpand={false} vexpand={false}
cssClasses={["power-menu-button"]} cssClasses={[ 'power-menu-button' ]}
child={ child={
<box> <box>
<image iconName={"system-shutdown-symbolic"}></image> <image iconName={'system-shutdown-symbolic'}></image>
{pm} {pm}
</box> </box>
} }
@@ -58,17 +66,16 @@ const UserMenu = (): Gtk.Popover => {
return ( return (
<box> <box>
<button <button
cssClasses={["power-button"]} cssClasses={[ 'power-button' ]}
child={ child={
<image iconName={"system-lock-screen-symbolic"}></image> <image iconName={'system-lock-screen-symbolic'}></image>
} }
onClicked={() => exec("/bin/sh -c 'hyprlock'")} onClicked={() => exec( '/bin/sh -c \'hyprlock\'' )}
></button> ></button>
<button <button
cssClasses={["power-button"]} cssClasses={[ 'power-button' ]}
child={<image iconName={"system-log-out-symbolic"}></image>} child={<image iconName={'system-log-out-symbolic'}></image>}
onClicked={() => onClicked={() => exec( '/bin/sh -c \'hyprctl dispatch exit 0\'' )
exec("/bin/sh -c 'hyprctl dispatch exit 0'")
} }
></button> ></button>
</box> </box>
@@ -76,6 +83,7 @@ const UserMenu = (): Gtk.Popover => {
}; };
popover.set_child( powerMenuBox() ); popover.set_child( powerMenuBox() );
return popover; return popover;
}; };
@@ -0,0 +1,88 @@
import AstalTray from 'gi://AstalTray';
import {
GObject
} from 'astal';
import {
Gtk
} from 'astal/gtk4';
const SYNC = GObject.BindingFlags.SYNC_CREATE;
const SysTray = () => {
const trayBox = new Gtk.Box( {
'cssClasses': [ '' ]
} );
const tray = AstalTray.get_default();
const trayItems = new Map<string, Gtk.MenuButton>();
const trayAddedHandler = tray.connect( 'item-added', ( _, id ) => {
const item = tray.get_item( id );
const popover = Gtk.PopoverMenu.new_from_model( item.menu_model );
const icon = new Gtk.Image();
const button = new Gtk.MenuButton( {
popover,
'child': icon,
'cssClasses': [ 'tray-item' ],
} );
item.bind_property(
'gicon', icon, 'gicon', SYNC
);
popover.insert_action_group( 'dbusmenu', item.action_group );
item.connect( 'notify::action-group', () => {
popover.insert_action_group( 'dbusmenu', item.action_group );
} );
trayItems.set( id, button );
trayBox.append( button );
} );
const trayRemovedHandler = tray.connect( 'item-removed', ( _, id ) => {
const button = trayItems.get( id );
if ( button ) {
trayBox.remove( button );
button.run_dispose();
trayItems.delete( id );
}
} );
trayBox.connect( 'destroy', () => {
tray.disconnect( trayAddedHandler );
tray.disconnect( trayRemovedHandler );
} );
return trayBox;
};
const TrayPopover = () => {
const popover = new Gtk.Popover( {
'cssClasses': [ 'TrayPopover' ]
} );
popover.set_child( SysTray() );
return popover;
};
const SystemTray = () => {
const systray = TrayPopover();
return (
<button
widthRequest={0}
hexpand={false}
vexpand={false}
cssClasses={[ 'power-menu-button' ]}
child={
<box>
<image iconName={'systemtray'}></image>
{systray}
</box>
}
onClicked={() => systray.popup()}
/>
);
};
export default {
SystemTray
};
+33 -19
View File
@@ -1,19 +1,30 @@
import { App, Astal, Gdk, Gtk } from "astal/gtk4"; import {
import Hyprland from "./modules/Hyprland"; App, Astal, Gdk, Gtk
import Calendar from "./modules/Calendar"; } from 'astal/gtk4';
import QuickView from "./modules/QuickView"; import Calendar from './modules/Calendar';
import SystemInfo from "./modules/SystemInfo"; import {
import { CenterBox } from "astal/gtk4/widget"; CenterBox
} from 'astal/gtk4/widget';
import Hyprland from './modules/Hyprland';
import QuickView from './modules/QuickView';
import SystemInfo from './modules/SystemInfo';
const Bar = ( { gdkmonitor, name }: { gdkmonitor: Gdk.Monitor, name: string } ) => { const Bar = ( {
const { TOP, LEFT, RIGHT } = Astal.WindowAnchor; gdkmonitor, name
}: {
'gdkmonitor': Gdk.Monitor,
'name': string
} ) => {
const {
TOP, LEFT, RIGHT
} = Astal.WindowAnchor;
return ( return (
<window <window
gdkmonitor={gdkmonitor} gdkmonitor={gdkmonitor}
cssClasses={["Bar"]} cssClasses={[ 'Bar' ]}
name={name} name={name}
namespace={"bar"} namespace={'bar'}
exclusivity={Astal.Exclusivity.EXCLUSIVE} exclusivity={Astal.Exclusivity.EXCLUSIVE}
anchor={TOP | LEFT | RIGHT} anchor={TOP | LEFT | RIGHT}
visible visible
@@ -21,13 +32,13 @@ const Bar = ( { gdkmonitor, name }: { gdkmonitor: Gdk.Monitor, name: string } )
child={ child={
<CenterBox <CenterBox
orientation={Gtk.Orientation.HORIZONTAL} orientation={Gtk.Orientation.HORIZONTAL}
start_widget={ startWidget={
<box <box
hexpand hexpand
halign={Gtk.Align.START} halign={Gtk.Align.START}
> >
<Hyprland.ModeStatus />
<Calendar.Time /> <Calendar.Time />
<SystemInfo.SystemInfo />
<Hyprland.Workspace /> <Hyprland.Workspace />
</box> </box>
} }
@@ -36,9 +47,9 @@ const Bar = ( { gdkmonitor, name }: { gdkmonitor: Gdk.Monitor, name: string } )
<box <box
hexpand hexpand
halign={Gtk.Align.END} halign={Gtk.Align.END}
cssClasses={["BarRight"]} cssClasses={[ 'BarRight' ]}
> >
<Hyprland.SysTray /> <SystemInfo.SystemInfo />
<QuickView.QuickView /> <QuickView.QuickView />
</box> </box>
} }
@@ -49,20 +60,23 @@ const Bar = ( { gdkmonitor, name }: { gdkmonitor: Gdk.Monitor, name: string } )
}; };
const cliHandler = ( args: string[] ): string => { const cliHandler = ( args: string[] ): string => {
return "Not implemented"; console.debug( args );
return 'Not implemented';
}; };
const BarLauncher = ( monitor: Gdk.Monitor ) => { const BarLauncher = ( monitor: Gdk.Monitor ) => {
const windowName = `bar-${monitor.get_connector()}` const windowName = `bar-${ monitor.get_connector() }`;
const createBar = () => { const createBar = () => {
return <Bar gdkmonitor={monitor} name={windowName}></Bar> return <Bar gdkmonitor={monitor} name={windowName}></Bar>;
} };
// Actually start the bar // Actually start the bar
createBar(); createBar();
return windowName; return windowName;
} };
export default { export default {
BarLauncher, BarLauncher,
+45
View File
@@ -11,6 +11,50 @@ window.Bar {
/* border-radius: 10px; */ /* border-radius: 10px; */
/* margin: 8px; */ /* margin: 8px; */
/* } */ /* } */
.mode-status {
color: white;
background-color: #00002dff;
padding-left: 10px;
padding-right: 10px;
margin-left: 5px;
border-radius: 20px;
font-family: $monospace-font;
&.command-mode {
background-color: darkslategray;
color: white;
}
&.windowing-mode {
background-color: darkslategray;
color: white;
}
&.workspace-mode {
background-color: darkblue;
color: white;
}
&.launch-mode {
background-color: darkgreen;
color: white;
}
&.device-mode {
background-color: darkred;
color: white;
}
&.screenshotting-mode {
background-color: purple;
color: white;
}
&.notifications-mode {
background-color: darkorange;
color: white;
}
}
.bar-button { .bar-button {
border-radius: 20px; border-radius: 20px;
@@ -54,6 +98,7 @@ window.Bar {
.time { .time {
min-width: 11rem; min-width: 11rem;
padding: 3px; padding: 3px;
& button { & button {
box-shadow: none; box-shadow: none;
padding: 0; padding: 0;
@@ -1,75 +1,34 @@
import AstalTray from "gi://AstalTray"; import {
import { bind, GObject } from "astal"; bind,
import AstalHyprland from "gi://AstalHyprland"; exec,
import { Gtk } from "astal/gtk4"; readFile
} from 'astal';
import AstalHyprland from 'gi://AstalHyprland';
import {
Gtk
} from 'astal/gtk4';
import Pango from 'gi://Pango?version=1.0';
const hypr = AstalHyprland.get_default(); const hypr = AstalHyprland.get_default();
const SYNC = GObject.BindingFlags.SYNC_CREATE;
const SysTray = () => {
const trayBox = new Gtk.Box({ cssClasses: ["bar-button"] });
const tray = AstalTray.get_default();
const trayItems = new Map<string, Gtk.MenuButton>();
const trayAddedHandler = tray.connect("item-added", (_, id) => {
const item = tray.get_item(id);
const popover = Gtk.PopoverMenu.new_from_model(item.menu_model);
const icon = new Gtk.Image();
const button = new Gtk.MenuButton({
popover,
child: icon,
cssClasses: ["tray-item"],
});
item.bind_property("gicon", icon, "gicon", SYNC);
popover.insert_action_group("dbusmenu", item.action_group);
item.connect("notify::action-group", () => {
popover.insert_action_group("dbusmenu", item.action_group);
});
trayItems.set(id, button);
trayBox.append(button);
});
const trayRemovedHandler = tray.connect("item-removed", (_, id) => {
const button = trayItems.get(id);
if (button) {
trayBox.remove(button);
button.run_dispose();
trayItems.delete(id);
}
});
trayBox.connect("destroy", () => {
tray.disconnect(trayAddedHandler);
tray.disconnect(trayRemovedHandler);
});
return trayBox;
};
const Workspace = () => { const Workspace = () => {
return ( return (
<box> <box>
{bind(hypr, "workspaces").as(wss => {bind( hypr, 'workspaces' ).as( wss => wss
wss
.filter( ws => !( ws.id >= -99 && ws.id <= -2 ) ) // filter out special workspaces .filter( ws => !( ws.id >= -99 && ws.id <= -2 ) ) // filter out special workspaces
.sort( ( a, b ) => a.id - b.id ) .sort( ( a, b ) => a.id - b.id )
.map( ws => ( .map( ws => (
<button <button
cssClasses={bind(hypr, "focusedWorkspace").as(fw => cssClasses={bind( hypr, 'focusedWorkspace' ).as( fw => ws === fw
ws === fw
? [ ? [
"focused-workspace-button", 'focused-workspace-button',
"workspace-button", 'workspace-button',
] ]
: ["workspace-button"], : [ 'workspace-button' ], )}
)}
onButtonPressed={() => ws.focus()} onButtonPressed={() => ws.focus()}
child={<label label={String( ws.id )}></label>} child={<label label={String( ws.id )}></label>}
></button> ></button>
)), ) ), )}
)}
</box> </box>
); );
}; };
@@ -79,15 +38,15 @@ const Workspace = () => {
* displaying all available clients * displaying all available clients
*/ */
const ActiveWindow = () => { const ActiveWindow = () => {
const focused = bind(hypr, "focusedClient"); const focused = bind( hypr, 'focusedClient' );
const WindowPopover = (): Gtk.Popover => { const WindowPopover = (): Gtk.Popover => {
// Set up boxes + Popover // Set up boxes + Popover
const popover = new Gtk.Popover(); const popover = new Gtk.Popover();
const popoverBox = WindowPopoverBox(); const popoverBox = WindowPopoverBox();
popover.set_child( popoverBox ); popover.set_child( popoverBox );
return popover; return popover;
}; };
@@ -100,23 +59,67 @@ const ActiveWindow = () => {
<box visible={focused.as( Boolean )}> <box visible={focused.as( Boolean )}>
<button <button
onClicked={() => windowPopover.popup()} onClicked={() => windowPopover.popup()}
cssClasses={["bar-button"]} cssClasses={[ 'bar-button' ]}
child={ child={
focused.as( focused.as( client => client && (
client => <label
client && ( maxWidthChars={70}
<label label={bind(client, "title").as(String)} /> ellipsize={Pango.EllipsizeMode.END}
), label={bind( client, 'title' ).as( String )} />
) ), )
}></button> }></button>
{windowPopover} {windowPopover}
</box > </box >
); );
}; };
type submaps = 'device' | 'launch' | 'workspace' | 'windowing' | 'screenshotting' | 'notifications' | '';
const ModeStatus = () => {
let isUsingHyprvim = false;
try {
const path = exec( 'bash -c "cd ~ && pwd"' ) + '/.config/hyprvim';
isUsingHyprvim = readFile( path ).trim() === 'y';
} catch ( e ) {
printerr( 'Failed to read hyprvim config', e );
}
const label = new Gtk.Label();
if ( !isUsingHyprvim ) return label;
print( '==> Using hyprvim config' );
const map = {
'device': 'DEV',
'launch': 'LNC',
'workspace': 'WSP',
'windowing': 'WIN',
'screenshotting': 'SCS',
'notifications': 'NOT',
'': 'NRM'
};
label.label = map[''];
label.cssClasses = [ 'mode-status' ];
// TODO: Possibly add popover to it that lists binds
hypr.connect( 'submap', ( _, name: submaps ) => {
label.label = map[name];
label.cssClasses = [
'mode-status',
name + '-mode'
];
} );
return label;
};
const WindowPopoverBox = () => { const WindowPopoverBox = () => {
return <box vertical> return <box vertical>
<label label={"Available Windows"} cssClasses={['title-2']}></label> <label label={'Available Windows'} cssClasses={[ 'title-2' ]}></label>
<Gtk.Separator marginTop={5} marginBottom={5}></Gtk.Separator> <Gtk.Separator marginTop={5} marginBottom={5}></Gtk.Separator>
<box vertical> <box vertical>
{bind( hypr, 'clients' ).as( clients => { {bind( hypr, 'clients' ).as( clients => {
@@ -129,15 +132,15 @@ const WindowPopoverBox = () => {
</box> </box>
} }
onClicked={() => client.focus()} onClicked={() => client.focus()}
></button> ></button>;
}) } );
} )} } )}
</box> </box>
</box> </box>;
} };
export default { export default {
Workspace, Workspace,
ActiveWindow, ActiveWindow,
SysTray, ModeStatus
}; };
@@ -1,16 +1,24 @@
import { bind } from "astal"; import AstalBattery from 'gi://AstalBattery';
import AstalBattery from "gi://AstalBattery"; import AstalBluetooth from 'gi://AstalBluetooth';
import AstalBluetooth from "gi://AstalBluetooth"; import AstalNetwork from 'gi://AstalNetwork';
import AstalNetwork from "gi://AstalNetwork"; import AstalWp from 'gi://AstalWp';
import AstalWp from "gi://AstalWp"; import Brightness from '../../../util/brightness';
import { Gtk } from "astal/gtk4"; import {
import Brightness from "../../../util/brightness"; Gtk
import QuickActions from "../../QuickActions/QuickActions"; } from 'astal/gtk4';
import QuickActions from '../../QuickActions/QuickActions';
import {
bind
} from 'astal';
import {
execAsync
} from 'astal';
const STATE = AstalNetwork.DeviceState; const STATE = AstalNetwork.DeviceState;
const QuickView = () => { const QuickView = () => {
const qa = QuickActions.QuickActions(); const qa = QuickActions.QuickActions();
const showQuickActions = () => { const showQuickActions = () => {
qa.popup(); qa.popup();
}; };
@@ -18,14 +26,14 @@ const QuickView = () => {
return ( return (
<button <button
onClicked={() => showQuickActions()} onClicked={() => showQuickActions()}
cssClasses={["quick-action-button"]} cssClasses={[ 'quick-action-button' ]}
child={ child={
<box> <box>
<BatteryWidget></BatteryWidget> <BatteryWidget></BatteryWidget>
<Audio></Audio> <Audio></Audio>
<BluetoothWidget></BluetoothWidget> <BluetoothWidget></BluetoothWidget>
<NetworkWidget></NetworkWidget> <NetworkWidget></NetworkWidget>
<image iconName={"system-shutdown-symbolic"}></image> <image iconName={'system-shutdown-symbolic'}></image>
{qa} {qa}
</box> </box>
} }
@@ -39,37 +47,39 @@ const NetworkWidget = () => {
return ( return (
<box> <box>
<image <image
iconName={bind(network, "state").as(state => { iconName={bind( network, 'state' ).as( state => {
if ( state === AstalNetwork.State.CONNECTING ) { if ( state === AstalNetwork.State.CONNECTING ) {
return "chronometer-reset-symbolic"; return 'chronometer-reset-symbolic';
} else if ( } else if (
state === AstalNetwork.State.CONNECTED_LOCAL || state === AstalNetwork.State.CONNECTED_LOCAL
state === AstalNetwork.State.CONNECTED_SITE || || state === AstalNetwork.State.CONNECTED_SITE
state === AstalNetwork.State.CONNECTED_GLOBAL || state === AstalNetwork.State.CONNECTED_GLOBAL
) { ) {
return "network-wired-activated-symbolic"; return 'network-wired-activated-symbolic';
} else { } else {
return "paint-unknown-symbolic"; return 'paint-unknown-symbolic';
} }
} )} } )}
cssClasses={["network-widget", "quick-view-symbol"]} cssClasses={[
visible={bind(network.wifi, "state").as( 'network-widget',
state => state !== STATE.ACTIVATED, 'quick-view-symbol'
)} ]}
visible={bind( network.wifi, 'state' ).as( state => state !== STATE.ACTIVATED, )}
></image> ></image>
<image <image
iconName={bind(network.wifi, "state").as(state => { iconName={bind( network.wifi, 'state' ).as( state => {
if ( state === STATE.ACTIVATED ) { if ( state === STATE.ACTIVATED ) {
return network.wifi.iconName; return network.wifi.iconName;
} else { } else {
return ""; return '';
} }
} )} } )}
tooltipText={bind( network.wifi, 'ssid' )} tooltipText={bind( network.wifi, 'ssid' )}
cssClasses={["network-widget", "quick-view-symbol"]} cssClasses={[
visible={bind(network.wifi, "state").as( 'network-widget',
state => state === STATE.ACTIVATED, 'quick-view-symbol'
)} ]}
visible={bind( network.wifi, 'state' ).as( state => state === STATE.ACTIVATED, )}
></image> ></image>
</box> </box>
); );
@@ -77,40 +87,36 @@ const NetworkWidget = () => {
const BluetoothWidget = () => { const BluetoothWidget = () => {
const bluetooth = AstalBluetooth.get_default(); const bluetooth = AstalBluetooth.get_default();
const enabled = bind(bluetooth, "isPowered"); const enabled = bind( bluetooth, 'isPowered' );
const connected = bind(bluetooth, "isConnected"); const connected = bind( bluetooth, 'isConnected' );
// For each connected BT device, render status // For each connected BT device, render status
return ( return (
<box> <box>
<box visible={enabled.as( e => e )}> <box visible={enabled.as( e => e )}>
<image <image
iconName={"bluetooth-active-symbolic"} iconName={'bluetooth-active-symbolic'}
visible={connected.as( c => c )} visible={connected.as( c => c )}
></image> ></image>
<image <image
iconName={"bluetooth-disconnected-symbolic"} iconName={'bluetooth-disconnected-symbolic'}
visible={connected.as( c => !c )} visible={connected.as( c => !c )}
></image> ></image>
</box> </box>
<image <image
iconName={"bluetooth-disabled-symbolic"} iconName={'bluetooth-disabled-symbolic'}
visible={enabled.as( e => !e )} visible={enabled.as( e => !e )}
></image> ></image>
<box> <box>
{bind(bluetooth, "devices").as(devices => { {bind( bluetooth, 'devices' ).as( devices => {
return devices.map( device => { return devices.map( device => {
return ( return (
<image <image
iconName={bind(device, "icon").as( iconName={bind( device, 'icon' ).as( icon => icon, )}
icon => icon, visible={bind( device, 'connected' )}
)} tooltipText={bind( device, 'batteryPercentage' ).as( n => {
visible={bind(device, "connected")} return device.get_name() + ': ' + n + '%';
tooltipText={bind(device, "batteryPercentage").as( }, )}
n => {
return device.get_name() + ': ' + n + "%";
},
)}
></image> ></image>
); );
} ); } );
@@ -120,14 +126,27 @@ const BluetoothWidget = () => {
); );
}; };
let hasSentNotification = false;
const BatteryWidget = () => { const BatteryWidget = () => {
const battery = AstalBattery.get_default(); const battery = AstalBattery.get_default();
if ( battery.get_is_present() ) { if ( battery.get_is_present() ) {
return ( return (
<image <image
iconName={bind(battery, "iconName").as(icon => icon)} iconName={bind( battery, 'batteryIconName' ).as( icon => icon )}
cssClasses={["quick-view-symbol"]} cssClasses={[ 'quick-view-symbol' ]}
tooltipText={bind(battery, 'percentage').as(p => `${Math.round(p * 100)}%`)} tooltipText={bind( battery, 'percentage' ).as( p => {
const level = Math.round( p * 100 );
if ( level < 20 && !hasSentNotification ) {
hasSentNotification = true;
execAsync( 'bash -c "notify-send \'Battery level below 20%\'"' );
}
return `Battery Level: ${ level }%`;
} )}
></image> ></image>
); );
} else { } else {
@@ -138,14 +157,14 @@ const BatteryWidget = () => {
const BrightnessWidget = () => { const BrightnessWidget = () => {
const brightness = Brightness.get_default(); const brightness = Brightness.get_default();
const screen_brightness = bind(brightness, "screen"); const screen_brightness = bind( brightness, 'screen' );
return ( return (
<box cssClasses={["quick-view-symbol"]}> <box cssClasses={[ 'quick-view-symbol' ]}>
<image iconName={"brightness-high-symbolic"}></image> <image iconName={'brightness-high-symbolic'}></image>
<label <label
label={screen_brightness.as( b => '' + Math.round( 100 * b ) )} label={screen_brightness.as( b => '' + Math.round( 100 * b ) )}
visible={bind(brightness, "screenAvailable")} visible={bind( brightness, 'screenAvailable' )}
></label> ></label>
</box> </box>
); );
@@ -153,31 +172,27 @@ const BrightnessWidget = () => {
const Audio = () => { const Audio = () => {
const wireplumber = AstalWp.get_default(); const wireplumber = AstalWp.get_default();
if ( wireplumber ) { if ( wireplumber ) {
return ( return (
<box orientation={Gtk.Orientation.HORIZONTAL}> <box orientation={Gtk.Orientation.HORIZONTAL}>
<image <image
iconName={bind(wireplumber.defaultSpeaker, "volumeIcon").as( iconName={bind( wireplumber.defaultSpeaker, 'volumeIcon' ).as( icon => icon, )}
icon => icon, cssClasses={[ 'quick-view-symbol' ]}
)}
cssClasses={["quick-view-symbol"]}
tooltipText={bind( wireplumber.defaultSpeaker, 'volume' ).as( v => Math.round( 100 * v ) + '%' )} tooltipText={bind( wireplumber.defaultSpeaker, 'volume' ).as( v => Math.round( 100 * v ) + '%' )}
></image> ></image>
<image <image
iconName={bind( iconName={bind( wireplumber.defaultMicrophone,
wireplumber.defaultMicrophone, 'volumeIcon', ).as( icon => icon )}
"volumeIcon", cssClasses={[ 'quick-view-symbol' ]}
).as(icon => icon)}
cssClasses={["quick-view-symbol"]}
tooltipText={bind( wireplumber.defaultMicrophone, 'volume' ).as( v => Math.round( 100 * v ) + '%' )} tooltipText={bind( wireplumber.defaultMicrophone, 'volume' ).as( v => Math.round( 100 * v ) + '%' )}
></image> ></image>
</box> </box>
); );
} else { } else {
print( print( '[ WirePlumber ] Could not connect, Audio support in bar will be missing', );
"[ WirePlumber ] Could not connect, Audio support in bar will be missing",
); return <image iconName={'action-unavailable-symbolic'}></image>;
return <image iconName={"action-unavailable-symbolic"}></image>;
} }
}; };
@@ -185,4 +200,5 @@ const Audio = () => {
export default { export default {
QuickView, QuickView,
BrightnessWidget
}; };
@@ -1,13 +1,17 @@
import { execAsync } from "astal"; import {
import { Gtk } from "astal/gtk4"; Gtk
import sysinfo from "../sysinfo"; } from 'astal/gtk4';
import {
execAsync
} from 'astal';
import sysinfo from '../sysinfo';
const info = () => { const info = () => {
return ( return (
<box vertical> <box vertical>
<label <label
label={"System Information"} label={'System Information'}
cssClasses={["title-2"]} cssClasses={[ 'title-2' ]}
></label> ></label>
<Gtk.Separator marginTop={5} marginBottom={10}></Gtk.Separator> <Gtk.Separator marginTop={5} marginBottom={10}></Gtk.Separator>
<label <label
@@ -15,7 +19,7 @@ const info = () => {
halign={Gtk.Align.START} halign={Gtk.Align.START}
hexpand hexpand
label={sysinfo.ramUsed( used => { label={sysinfo.ramUsed( used => {
return "RAM: " + used + ` (${sysinfo.ramUtil.get()}%)`; return 'RAM: ' + used + ` (${ sysinfo.ramUtil.get() }%)`;
} )} } )}
></label> ></label>
<label <label
@@ -27,9 +31,9 @@ Kernel: ${stats.kernel}`;
></label> ></label>
<Gtk.Separator marginTop={10}></Gtk.Separator> <Gtk.Separator marginTop={10}></Gtk.Separator>
<button <button
onClicked={() => execAsync(`/bin/sh -c "kitty --hold fish -c 'fastfetch'"`)} onClicked={() => execAsync( '/bin/sh -c "kitty --hold fish -c \'fastfetch\'"' )}
child={ child={
<label label={"View FastFetch"}></label> <label label={'View FastFetch'}></label>
}></button> }></button>
</box> </box>
); );
@@ -64,7 +68,7 @@ const SystemInfo = () => {
cssClasses={[ 'quick-view-symbol' ]} cssClasses={[ 'quick-view-symbol' ]}
> >
<image <image
iconName={"power-profile-performance-symbolic"} iconName={'power-profile-performance-symbolic'}
marginEnd={1} marginEnd={1}
></image> ></image>
<label <label
@@ -75,23 +79,23 @@ const SystemInfo = () => {
<box <box
cssClasses={[ 'quick-view-symbol' ]} cssClasses={[ 'quick-view-symbol' ]}
> >
<image iconName={"histogram-symbolic"}></image> <image iconName={'memory'}></image>
<label label={sysinfo.ramUtil( util => util )}></label> <label label={sysinfo.ramUtil( util => util )}></label>
</box> </box>
<box <box
cssClasses={[ 'quick-view-symbol' ]} cssClasses={[ 'quick-view-symbol' ]}
> >
<image iconName={"show-gpu-effects-symbolic"}></image> <image iconName={'show-gpu-effects-symbolic'}></image>
<label label={sysinfo.gpuUtil( util => util )}></label> <label label={sysinfo.gpuUtil( util => util )}></label>
</box> </box>
{panel} {panel}
</box> </box>
} }
cssClasses={["bar-button"]} cssClasses={[ 'bar-button' ]}
></button> ></button>
); );
} else { } else {
return <image iconName={"action-unavailable-symbolic"}></image>; return <image iconName={'action-unavailable-symbolic'}></image>;
} }
}; };
@@ -2,7 +2,7 @@ import { bind } from "astal";
import { Gtk } from "astal/gtk4"; import { Gtk } from "astal/gtk4";
import Notifd from "gi://AstalNotifd"; import Notifd from "gi://AstalNotifd";
import { NotificationIcon } from "./Icon"; import { NotificationIcon } from "./Icon";
import { createTimeoutManager } from "../../../util/notifd"; import { createTimeoutManager, time, urgency } from "../../../util/notifd";
export function NotificationWidget({ export function NotificationWidget({
notification, notification,
@@ -81,8 +81,8 @@ export function NotificationWidget({
halign={CENTER} halign={CENTER}
valign={CENTER} valign={CENTER}
vexpand={true} vexpand={true}
child={NotificationIcon(notification)!}
> >
{NotificationIcon(notification)}
</box> </box>
<box <box
vertical vertical
@@ -0,0 +1,6 @@
import AstalNotifd from "gi://AstalNotifd"
const notifd = AstalNotifd.get_default()
const getNotifications = () => {
}
@@ -1,299 +0,0 @@
/*
* dotfiles - handler.ts
*
* Created by Janis Hutz 03/21/2025, Licensed under the GPL V3 License
* https://janishutz.com, development@janishutz.com
*
*
*/
import { App, Astal, Gdk } from "astal/gtk4"
import Notifd from "gi://AstalNotifd";
import Notification from "./notifications";
import { timeout, Variable } from "astal"
// ───────────────────────────────────────────────────────────────────
// Config
// ───────────────────────────────────────────────────────────────────
const TIMEOUT_DELAY = 5000;
let isRunning = false;
let notificationMenuOpen = false;
interface NotificationDetails {
notification: Notifd.Notification;
backendID: number;
notifdID: number;
}
// ───────────────────────────────────────────────────────────────────
// ╭───────────────────────────────────────────────╮
// │ Handler │
// ╰───────────────────────────────────────────────╯
// ───────────────────────────────────────────────────────────────────
let ShownNotifications: Variable<number[]> = Variable( [] );
let Notifications: NotificationDetails[] = [];
const notifd = Notifd.get_default();
notifd.ignoreTimeout = true;
/**
* Delete a notification by its internal ID
* @param index The notifd ID of the notification
*/
const deleteNotification = ( index: number ): void => {
hideNotification( index );
Notifications.splice( index, 1 );
if ( Notifications.length === 0 ) {
notificationMenuOpen = false;
}
}
// ───────────────────────────────────────────────────────────────────
/**
* Delete a notification by notifd id
* @param id The notifd ID of the notification
*/
const deleteNotificationByNotificationID = ( id: number ): void => {
const index = findNotificationByNotificationID( id );
if ( index > -1 ) {
deleteNotification( index );
}
}
// ───────────────────────────────────────────────────────────────────
/**
* Find the internal ID from the notifd id for a notification (helper function)
* @param id The notifd ID of the notification
* @returns The internal ID or -1 if not found
*/
const findNotificationByNotificationID = ( id: number ): number => {
// Find index in Notifications array
for (let index = 0; index < Notifications.length; index++) {
if ( Notifications[ index ].notifdID === id ) {
return index;
}
}
return -1;
}
// ───────────────────────────────────────────────────────────────────
/**
* Add a notification to the notification handler
* @param id The notifd ID of the notification
*/
const addNotification = ( id: number ): void => {
const currIndex = Notifications.length;
Notifications.push( {
notifdID: id,
backendID: currIndex,
notification: notifd.get_notification( id )
} );
showNotification( currIndex );
}
// ───────────────────────────────────────────────────────────────────
/**
* Start the notifd runner and handle notifications.
*/
const hookToNotificationDaemon = (): void => {
if ( isRunning ) {
printerr( '[ Notifications ] Error: Already running' );
return;
}
isRunning = true;
notifd.connect( 'notified', ( _, id ) => {
addNotification( id );
} );
notifd.connect( 'resolved', ( _, id ) => {
deleteNotificationByNotificationID( id );
} );
}
// ───────────────────────────────────────────────────────────────────
/**
* Show a notification. It will stay on screen (regardless of removeAgain passed in), if
* critical urgency
* @param id The internal id (index in Notifications array)
* @param removeAgain = true If to remove the notification from the screen again automatically
*/
const showNotification = ( id: number, removeAgain: boolean = true ) => {
// Add notification to UI for display
const not = [...ShownNotifications.get()].reverse();
not.push( id );
ShownNotifications.set( not.reverse() );
// Set delay to remove the notification again
if ( removeAgain && Notifications[ id ].notification.get_urgency() !== Notifd.Urgency.CRITICAL ) {
timeout( TIMEOUT_DELAY, () => {
hideNotification( id );
} );
}
}
// ───────────────────────────────────────────────────────────────────
/**
* Stop displaying notification
* @param id The internal id (index in the Notifications array)
*/
const hideNotification = ( id: number ) => {
if ( !notificationMenuOpen ) {
const not = [...ShownNotifications.get()];
not.splice( not.indexOf( id ), 1 );
ShownNotifications.set( not );
}
}
// ───────────────────────────────────────────────────────────────────
/**
* Open the notification menu. Called by toggleNotificationMenu too
*/
const openNotificationMenu = () => {
// Simply show all notifications
notificationMenuOpen = true;
const not = [];
for (let index = 0; index < Notifications.length; index++) {
not.push( index );
}
ShownNotifications.set( not.reverse() );
}
// ───────────────────────────────────────────────────────────────────
/**
* Close the notification menu. Called by toggleNotificationMenu too
*/
const closeNotificationMenu = () => {
// Hide all notifications
notificationMenuOpen = true;
ShownNotifications.set( [] );
}
// ───────────────────────────────────────────────────────────────────
/**
* Toggle the notification menu (i.e. show all notifications)
*/
const toggleNotificationMenu = (): string => {
if ( notificationMenuOpen ) {
closeNotificationMenu();
return 'Toggle notification menu closed';
} else {
openNotificationMenu();
return 'Toggled notification menu open';
}
}
// ───────────────────────────────────────────────────────────────────
/**
* Delete all notifications
*/
const clearAllNotifications = () => {
Notifications = [];
ShownNotifications.set( [] );
// TODO: Hiding for each individual deleteNotification
notificationMenuOpen = false;
}
// ───────────────────────────────────────────────────────────────────
/**
* Delete the newest notifications
*/
const clearNewestNotifications = () => {
const not = [...ShownNotifications.get()];
not.splice( 0, 1 );
ShownNotifications.set( not );
Notifications.splice( Notifications.length - 1, 1 );
}
// ───────────────────────────────────────────────────────────────────
// ╭───────────────────────────────────────────────╮
// │ User Interface │
// ╰───────────────────────────────────────────────╯
// ───────────────────────────────────────────────────────────────────
const startNotificationHandler = (gdkmonitor: Gdk.Monitor) => {
const { TOP, RIGHT } = Astal.WindowAnchor
hookToNotificationDaemon();
return <window
cssClasses={["NotificationHandler"]}
gdkmonitor={gdkmonitor}
exclusivity={Astal.Exclusivity.EXCLUSIVE}
anchor={TOP | RIGHT}
visible={ShownNotifications( list => list.length > 0 )}
application={App}>
<box vertical>
{ShownNotifications( list => list.map( i => {
// i is index in ShownNotifications array
return <Notification id={i} delete={deleteNotification} notification={Notifications[ i ].notification}></Notification>
} ) ) }
</box>
</window>
}
const cliHandler = ( args: string[] ): string => {
if ( args[ 1 ] == 'show' ) {
openNotificationMenu();
return 'Showing all open notifications';
} else if ( args[ 1 ] == 'hide' ) {
closeNotificationMenu();
return 'Hid all notifications';
} else if ( args[ 1 ] == 'clear' ) {
clearAllNotifications();
return 'Cleared all notifications';
} else if ( args[ 1 ] == 'clear-newest' ) {
clearNewestNotifications();
return 'Cleared newest notification';
} else if ( args[ 1 ] == 'toggle' ) {
return toggleNotificationMenu();
} else if ( args[ 1 ] == 'list' ){
if ( Notifications.length > 0 ) {
let list = 'Currently unviewed notifications: ';
for (let index = 0; index < Notifications.length; index++) {
const element = Notifications[index];
list += `\n - (${element.notifdID}) ${element.notification.get_app_name()}: ${element.notification.get_summary()}`;
}
return list;
} else {
return 'No currently unviewed notifications'
}
} else {
return 'Unknown command!';
}
}
export default {
startNotificationHandler,
cliHandler
}
@@ -1,12 +0,0 @@
import { Gtk, Gdk } from "astal/gtk4";
import { GLib } from "astal";
export const isIcon = (icon: string) => {
const display = Gdk.Display.get_default();
if (!display) return false;
const iconTheme = Gtk.IconTheme.get_for_display(display);
return iconTheme.has_icon(icon);
};
export const fileExists = (path: string) =>
GLib.file_test(path, GLib.FileTest.EXISTS);
@@ -8,14 +8,16 @@ export function NotificationIcon(notification: Notifd.Notification) {
const icon = notification.image || notification.appIcon || notification.desktopEntry; const icon = notification.image || notification.appIcon || notification.desktopEntry;
if (fileExists(icon)) { if (fileExists(icon)) {
return ( return (
<box expand={false} valign={Gtk.Align.CENTER}> <box hexpand={false} valign={Gtk.Align.CENTER} child={
<image file={icon} /> <image file={icon} />
}>
</box> </box>
); );
} else if (isIcon(icon)) { } else if (isIcon(icon)) {
return ( return (
<box expand={false} valign={Gtk.Align.CENTER}> <box hexpand={false} valign={Gtk.Align.CENTER} child={
<image iconName={icon} /> <image iconName={icon} />
}>
</box> </box>
); );
} }
@@ -0,0 +1,32 @@
import { Astal } from "astal/gtk4";
import Notifd from "gi://AstalNotifd";
import Hyprland from "gi://AstalHyprland";
import { bind } from "astal";
import { NotificationWidget } from "./modules/Notification";
import { hyprToGdk } from "../../util/hyprland";
export default function Notifications() {
const notifd = Notifd.get_default();
const hyprland = Hyprland.get_default();
const { TOP, RIGHT } = Astal.WindowAnchor;
return (
<window
name="notifications"
gdkmonitor={bind(hyprland, "focusedMonitor").as(
(focused: Hyprland.Monitor) => hyprToGdk(focused),
)}
anchor={TOP | RIGHT}
visible={bind(notifd, "notifications").as(
(notifications) => notifications.length > 0,
)}
child={
<box vertical={true} cssClasses={["notifications"]}>
{bind(notifd, "notifications").as((notifications) =>
notifications.map((n) => <NotificationWidget notification={n} />),
)}
</box>
}
/>
);
}
Whitespace-only changes.
@@ -1,113 +0,0 @@
// From astal examples
import { bind, GLib } from "astal";
import { Gtk } from "astal/gtk4";
import Notifd from "gi://AstalNotifd";
import { NotificationIcon } from "./icon";
// import Pango from "gi://Pango?version=1.0"
const fileExists = (path: string) => GLib.file_test(path, GLib.FileTest.EXISTS);
const time = (time: number, format = "%H:%M") =>
GLib.DateTime.new_from_unix_local(time).format(format)!;
const urgency = (n: Notifd.Notification) => {
const { LOW, NORMAL, CRITICAL } = Notifd.Urgency;
// match operator when?
switch (n.urgency) {
case LOW:
return "low";
case CRITICAL:
return "critical";
case NORMAL:
default:
return "normal";
}
};
type Props = {
delete: (id: number) => void;
notification: Notifd.Notification;
id: number;
};
export default function Notification(props: Props) {
const { notification: n, id: id, delete: del } = props;
const { START, CENTER, END } = Gtk.Align;
return (
<box vertical cssClasses={["notification", `${urgency(n)}`]}>
<box cssClasses={["header"]}>
{n.appIcon || n.desktopEntry ? (
<Gtk.Image
cssClasses={["app-icon"]}
visible={Boolean(n.appIcon || n.desktopEntry)}
iconName={n.appIcon || n.desktopEntry}
/>
) : (
<image iconName={"window-close-symbolic"}></image>
)}
<label
cssClasses={["app-name"]}
halign={START}
// ellipsize={Pango.EllipsizeMode.END}
label={n.appName || "Unknown"}
/>
<label
cssClasses={["time"]}
hexpand
halign={END}
label={time(n.time)}
/>
<button
onClicked={() => {
del(id);
}}
child={<image iconName="window-close-symbolic" />}
></button>
</box>
<Gtk.Separator visible />
<box cssClasses={["content"]}>
<box
cssClasses={["image"]}
visible={Boolean(NotificationIcon(n))}
halign={CENTER}
valign={CENTER}
vexpand={true}
>
{NotificationIcon(n)}
</box>
<box vertical>
<label
cssClasses={["summary"]}
halign={START}
xalign={0}
useMarkup
label={bind(n, "summary")}
// ellipsize={Pango.EllipsizeMode.END}
/>
{n.body && (
<label
cssClasses={["body"]}
valign={CENTER}
wrap={true}
maxWidthChars={50}
label={bind(n, "body")}
/>
)}
</box>
</box>
{n.get_actions().length > 0 ? (
<box cssClasses={["actions"]}>
{n.get_actions().map(({ label, id }) => (
<button hexpand onClicked={() => n.invoke(id)}>
<label label={label} halign={CENTER} hexpand />
</button>
))}
</box>
) : (
<box></box>
)}
</box>
);
}
+744
View File
@@ -0,0 +1,744 @@
import eslint from '@eslint/js';
import globals from 'globals';
import stylistic from '@stylistic/eslint-plugin';
import tseslint from 'typescript-eslint';
import typescript from '@typescript-eslint/eslint-plugin';
import vue from 'eslint-plugin-vue';
const style = {
'plugins': {
'@stylistic': stylistic,
'@stylistic/js': stylistic,
'@stylistic/ts': stylistic
},
'files': [
'**/*.ts',
'**/*.js',
'**/*.mjs',
'**/*.cjs',
'**/*.tsx',
'**/*.jsx'
],
'rules': {
'sort-imports': [
'warn',
{
'ignoreCase': false,
'ignoreDeclarationSort': false,
'ignoreMemberSort': false,
'memberSyntaxSortOrder': [
'none',
'all',
'multiple',
'single'
],
'allowSeparatedGroups': false
}
],
// Formatting
'@stylistic/array-bracket-newline': [
'error',
{
'multiline': false,
'minItems': 2
}
],
'@stylistic/array-bracket-spacing': [
'error',
'always'
],
'@stylistic/array-element-newline': [
'error',
{
'consistent': false,
'multiline': false,
'minItems': 2
}
],
'@stylistic/arrow-parens': [
'error',
'as-needed'
],
'@stylistic/arrow-spacing': [
'error',
{
'before': true,
'after': true
}
],
'@stylistic/block-spacing': [
'error',
'always'
],
'@stylistic/brace-style': [
'error',
'1tbs',
{
'allowSingleLine': false
}
],
'@stylistic/comma-dangle': [
'error',
'never'
],
'@stylistic/comma-spacing': [
'error',
{
'before': false,
'after': true
}
],
'@stylistic/comma-style': [
'error',
'last'
],
'@stylistic/dot-location': [
'error',
'property'
],
'@stylistic/function-call-argument-newline': [
'error',
'consistent'
],
'@stylistic/function-call-spacing': [
'error',
'never'
],
'@stylistic/function-paren-newline': [
'error',
'multiline-arguments'
],
'@stylistic/implicit-arrow-linebreak': [
'error',
'beside'
],
'@stylistic/indent': [
'error',
4
],
'@stylistic/indent-binary-ops': [
'error',
4
],
'@stylistic/key-spacing': [
'error',
{
'beforeColon': false,
'afterColon': true
}
],
'@stylistic/keyword-spacing': [
'error',
{
'before': true,
'after': true
}
],
'@stylistic/lines-between-class-members': [
'error',
'always'
],
'@stylistic/max-len': [
'warn',
{
'code': 140,
'comments': 160,
'ignoreComments': false,
'ignoreUrls': true,
'ignoreStrings': true,
'ignoreTemplateLiterals': true,
'ignoreRegExpLiterals': true
}
],
'@stylistic/max-statements-per-line': [
'error',
{
'max': 1
}
],
'@stylistic/multiline-ternary': [
'error',
'always-multiline'
],
'@stylistic/new-parens': [
'error',
'always'
],
'@stylistic/newline-per-chained-call': 'error',
'@stylistic/no-confusing-arrow': 'error',
'@stylistic/no-extra-parens': [
'error',
'all',
{
'nestedBinaryExpressions': false,
'ternaryOperandBinaryExpressions': false,
'ignoreJSX': 'multi-line',
'nestedConditionalExpressions': false
}
],
'@stylistic/no-extra-semi': 'error',
'@stylistic/no-floating-decimal': 'error',
'@stylistic/no-mixed-operators': 'error',
'@stylistic/no-mixed-spaces-and-tabs': 'error',
'@stylistic/no-multi-spaces': 'error',
'@stylistic/no-multiple-empty-lines': [
'error',
{
'max': 3,
'maxEOF': 2
}
],
'@stylistic/no-tabs': 'error',
'@stylistic/no-trailing-spaces': 'error',
'@stylistic/no-whitespace-before-property': 'error',
'@stylistic/object-curly-newline': [
'error',
{
'multiline': true,
'minProperties': 1
}
],
'@stylistic/object-curly-spacing': [
'error',
'always'
],
'@stylistic/object-property-newline': 'error',
'@stylistic/one-var-declaration-per-line': 'error',
'@stylistic/operator-linebreak': [
'error',
'before'
],
'@stylistic/padded-blocks': [
'error',
{
'blocks': 'never',
'classes': 'always',
'switches': 'never'
}
],
// Padding lines. The most in-depth part of this config
'@stylistic/padding-line-between-statements': [
'error',
// Variables, Constants
{
'blankLine': 'never',
'prev': 'var',
'next': 'var'
},
{
'blankLine': 'never',
'prev': 'let',
'next': 'let'
},
{
'blankLine': 'never',
'prev': 'const',
'next': 'const'
},
{
'blankLine': 'always',
'prev': 'var',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'cjs-import',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'import',
'let',
'return',
'switch',
'throw',
'try',
'var',
'with'
]
},
{
'blankLine': 'always',
'prev': 'let',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'cjs-import',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'import',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
{
'blankLine': 'always',
'prev': 'const',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'cjs-import',
'class',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'import',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
// Import
{
'blankLine': 'never',
'prev': 'import',
'next': 'import'
},
{
'blankLine': 'never',
'prev': 'cjs-import',
'next': 'cjs-import'
},
{
'blankLine': 'always',
'prev': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
],
'next': 'cjs-import'
},
{
'blankLine': 'always',
'prev': 'cjs-import',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
{
'blankLine': 'always',
'prev': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
],
'next': 'import'
},
{
'blankLine': 'always',
'prev': 'import',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
// If
{
'blankLine': 'always',
'prev': '*',
'next': 'if'
},
{
'blankLine': 'always',
'prev': 'if',
'next': '*'
},
// For
{
'blankLine': 'always',
'prev': '*',
'next': 'for'
},
{
'blankLine': 'always',
'prev': 'for',
'next': '*'
},
// While
{
'blankLine': 'always',
'prev': '*',
'next': 'while'
},
{
'blankLine': 'always',
'prev': 'while',
'next': '*'
},
// Functions
{
'blankLine': 'always',
'prev': '*',
'next': 'function'
},
{
'blankLine': 'always',
'prev': 'function',
'next': '*'
},
// Block Statements
{
'blankLine': 'always',
'prev': '*',
'next': 'block-like'
},
{
'blankLine': 'always',
'prev': 'block-like',
'next': '*'
},
// Switch
{
'blankLine': 'always',
'prev': '*',
'next': 'switch'
},
{
'blankLine': 'always',
'prev': 'switch',
'next': '*'
},
// Try-Catch
{
'blankLine': 'always',
'prev': '*',
'next': 'try'
},
{
'blankLine': 'always',
'prev': 'try',
'next': '*'
},
// Throw
{
'blankLine': 'always',
'prev': '*',
'next': 'throw'
},
{
'blankLine': 'always',
'prev': 'throw',
'next': '*'
},
// Return
{
'blankLine': 'never',
'prev': 'return',
'next': '*'
},
{
'blankLine': 'always',
'prev': '*',
'next': 'return'
},
// Export
{
'blankLine': 'always',
'prev': '*',
'next': 'export'
},
{
'blankLine': 'always',
'prev': 'export',
'next': '*'
},
{
'blankLine': 'always',
'prev': '*',
'next': 'cjs-export'
},
{
'blankLine': 'always',
'prev': 'cjs-export',
'next': '*'
},
// Classes
{
'blankLine': 'always',
'prev': '*',
'next': 'class'
},
{
'blankLine': 'always',
'prev': 'class',
'next': '*'
}
],
'@stylistic/quote-props': [
'error',
'always'
],
'@stylistic/quotes': [
'error',
'single'
],
'@stylistic/rest-spread-spacing': [
'error',
'never'
],
'@stylistic/semi': [
'error',
'always'
],
'@stylistic/semi-spacing': [
'error',
{
'before': false,
'after': true
}
],
'@stylistic/semi-style': [
'error',
'last'
],
'@stylistic/space-before-blocks': [
'error',
'always'
],
'@stylistic/space-before-function-paren': [
'error',
'always'
],
'@stylistic/space-in-parens': [
'error',
'always'
],
'@stylistic/space-infix-ops': [
'error',
{
'int32Hint': false
}
],
'@stylistic/space-unary-ops': 'error',
'@stylistic/spaced-comment': [
'error',
'always'
],
'@stylistic/switch-colon-spacing': 'error',
'@stylistic/template-curly-spacing': [
'error',
'always'
],
'@stylistic/template-tag-spacing': [
'error',
'always'
],
'@stylistic/type-generic-spacing': 'error',
'@stylistic/type-named-tuple-spacing': 'error',
'@stylistic/wrap-iife': [
'error',
'inside'
],
'@stylistic/wrap-regex': 'error',
'@stylistic/ts/type-annotation-spacing': 'error'
}
};
/** @type {import('eslint').Linter.Config} */
export default tseslint.config(
// Base JavaScript rules
eslint.configs.recommended,
tseslint.configs.recommended,
style,
// Vue support (including TS and JSX inside SFCs)
{
'files': [ '**/*.vue' ],
'languageOptions': {
'sourceType': 'module',
'ecmaVersion': 'latest',
'globals': globals.browser,
'parserOptions': {
'parser': tseslint.parser
}
},
'plugins': {
'vue': vue,
'@stylistic': stylistic,
'@stylistic/js': stylistic,
'@stylistic/ts': stylistic,
'@typescript-eslint': typescript
},
'extends': [
eslint.configs.recommended,
...vue.configs['flat/recommended']
],
'rules': {
...typescript.configs.recommended.rules,
...style.rules,
// Vue specific rules
'@stylistic/indent': 'off',
'vue/html-indent': [
'error',
4
],
'vue/html-comment-indent': [
'error',
4
],
'vue/script-indent': [
'error',
4,
{
'baseIndent': 1,
'switchCase': 1
}
],
'vue/html-self-closing': [
'error',
{
'html': {
'void': 'never',
'normal': 'never',
'component': 'always'
},
'svg': 'always',
'math': 'never'
}
],
'vue/max-attributes-per-line': [
'error',
{
'singleline': 3,
'multiline': 1
}
]
}
}
);
+3 -2
View File
@@ -1,5 +1,6 @@
$fg-color: #E6E6E6; $fg-color: #E6E6E6;
$bg-color: #141414; $bg-color: #141414;
$accent-color: #591641; $accent-color: #5C9B3F;
$accent-color-2: #97103A; $accent-color-2: #1674B9;
$shadow-color: rgba(40, 40, 40, 0.3); $shadow-color: rgba(40, 40, 40, 0.3);
$monospace-font: Source Code Pro
+33 -33
View File
@@ -4,134 +4,134 @@
"padding": { "padding": {
"top": 2, "top": 2,
"left": 1, "left": 1,
"right": 2, "right": 2
}, }
}, },
"display": { "display": {
"separator": " ", "separator": " "
}, },
"modules": [ "modules": [
// Title // Title
{ {
"type": "title", "type": "title",
"format": "{#1}╭───────────── {#}{user-name-colored}", "format": "{#1}╭───────────── {#}{user-name-colored}"
}, },
// System Information // System Information
{ {
"type": "custom", "type": "custom",
"format": "{#1}│ {#}System Information", "format": "{#1}│ {#}System Information"
}, },
{ {
"type": "os", "type": "os",
"key": "{#separator}│ {#keys}󰍹 OS", "key": "{#separator}│ {#keys}󰍹 OS"
}, },
{ {
"type": "kernel", "type": "kernel",
"key": "{#separator}│ {#keys}󰒋 Kernel", "key": "{#separator}│ {#keys}󰒋 Kernel"
}, },
{ {
"type": "uptime", "type": "uptime",
"key": "{#separator}│ {#keys}󰅐 Uptime", "key": "{#separator}│ {#keys}󰅐 Uptime"
}, },
{ {
"type": "packages", "type": "packages",
"key": "{#separator}│ {#keys}󰏖 Packages", "key": "{#separator}│ {#keys}󰏖 Packages",
"format": "{all}", "format": "{all}"
}, },
{ {
"type": "custom", "type": "custom",
"format": "{#1}│", "format": "{#1}│"
}, },
// Desktop Environment // Desktop Environment
{ {
"type": "custom", "type": "custom",
"format": "{#1}│ {#}Desktop Environment", "format": "{#1}│ {#}Desktop Environment"
}, },
{ {
"type": "de", "type": "de",
"key": "{#separator}│ {#keys}󰧨 DE", "key": "{#separator}│ {#keys}󰧨 DE"
}, },
{ {
"type": "wm", "type": "wm",
"key": "{#separator}│ {#keys}󱂬 WM", "key": "{#separator}│ {#keys}󱂬 WM"
}, },
{ {
"type": "wmtheme", "type": "wmtheme",
"key": "{#separator}│ {#keys}󰉼 Theme", "key": "{#separator}│ {#keys}󰉼 Theme"
}, },
{ {
"type": "display", "type": "display",
"key": "{#separator}│ {#keys}󰹑 Resolution", "key": "{#separator}│ {#keys}󰹑 Resolution"
}, },
{ {
"type": "shell", "type": "shell",
"key": "{#separator}│ {#keys}󰞷 Shell", "key": "{#separator}│ {#keys}󰞷 Shell"
}, },
{ {
"type": "terminalfont", "type": "terminalfont",
"key": "{#separator}│ {#keys}󰛖 Font", "key": "{#separator}│ {#keys}󰛖 Font"
}, },
{ {
"type": "custom", "type": "custom",
"format": "{#1}│", "format": "{#1}│"
}, },
// Hardware Information // Hardware Information
{ {
"type": "custom", "type": "custom",
"format": "{#1}│ {#}Hardware Information", "format": "{#1}│ {#}Hardware Information"
}, },
{ {
"type": "cpu", "type": "cpu",
"key": "{#separator}│ {#keys}󰻠 CPU", "key": "{#separator}│ {#keys}󰻠 CPU"
}, },
{ {
"type": "gpu", "type": "gpu",
"key": "{#separator}│ {#keys}󰢮 GPU", "key": "{#separator}│ {#keys}󰢮 GPU"
}, },
{ {
"type": "memory", "type": "memory",
"key": "{#separator}│ {#keys}󰍛 Memory", "key": "{#separator}│ {#keys}󰍛 Memory"
}, },
{ {
"type": "disk", "type": "disk",
"key": "{#separator}│ {#keys}󰋊 Disk (/)", "key": "{#separator}│ {#keys}󰋊 Disk (/)",
"folders": "/", "folders": "/"
}, },
{ {
"type": "custom", "type": "custom",
"format": "{#1}│", "format": "{#1}│"
}, },
// Network // Network
{ {
"type": "custom", "type": "custom",
"format": "{#1}│ {#}Network", "format": "{#1}│ {#}Network"
}, },
{ {
"type": "wifi", "type": "wifi",
"key": "{#separator}│ {#keys}⮃ WiFi", "key": "{#separator}│ {#keys}⮃ WiFi"
}, },
{ {
"type": "dns", "type": "dns",
"key": "{#separator}│ {#keys}🖧 DNS", "key": "{#separator}│ {#keys}🖧 DNS"
}, },
{ {
"type": "localip", "type": "localip",
"key": "{#separator}│ {#keys}⍰ IP", "key": "{#separator}│ {#keys}⍰ IP"
}, },
{ {
"type": "custom", "type": "custom",
"format": "{#1}│", "format": "{#1}│"
}, },
// Colors // Colors
{ {
"type": "colors", "type": "colors",
"key": "{#separator}│", "key": "{#separator}│",
"symbol": "circle", "symbol": "circle"
}, },
// Footer // Footer
{ {
"type": "custom", "type": "custom",
"format": "{#1}╰───────────────────────────────╯", "format": "{#1}╰───────────────────────────────╯"
}, }
], ]
} }
+21 -12
View File
@@ -1,30 +1,38 @@
alias ls='ls -l --color' alias ls='ls -l --color'
alias ll='ls -la --color' alias ll='ls -la --color'
alias v='nvim' alias v='nvim'
alias i='vimiv'
alias c='clear' alias c='clear'
alias cv='clear && nvim'
alias zs='zathura-sandbox' alias zs='zathura-sandbox'
alias bt='bluetui' alias z='zathura'
alias vicfg='cd ~/.config/nvim/ && nvim' alias bt='bashtop'
alias vicfg='nvim ~/projects/nvim/'
alias fm='thunar .' alias fm='thunar .'
alias gl='git ls-files --others --exclude-standard' alias gl='git ls-files --others --exclude-standard'
alias gm='gti ls-files -m' alias gm='git ls-files -m'
alias gpu='git push' alias gpu='git push'
alias gp='git pull' alias gp='git pull'
alias gpr='git pull --rebase'
alias gc='git commit -a -m' alias gc='git commit -a -m'
alias ga='git add ./*' alias ga='git add ./*'
alias cfh='nvim ~/projects/active/dotfiles/config/hypr/' alias cfh='nvim ~/projects/dotfiles/config/hypr/'
alias cfn='nvim ~/projects/active/nvim/' alias cfn='nvim ~/projects/nvim/'
alias cff='nvim ~/projects/active/dotfiles/config/fish/' alias cff='nvim ~/projects/dotfiles/config/fish/'
alias cfw='nvim ~/projects/archive/dotfiles-old/pc/configs/waybar/' alias cfa='nvim ~/projects/dotfiles/config/astal/'
alias cfa='nvim ~/projects/active/dotfiles/config/ags/' alias cf='nvim ~/projects/dotfiles/'
alias cf='nvim ~/projects/active/dotfiles/'
alias g='lazygit' alias g='lazygit'
alias open-webui='sudo systemctl start docker && sudo docker start -i open-webui' alias open-webui='sudo systemctl start docker && sudo docker start -i open-webui'
alias ai='ollama serve' alias ai='ollama serve'
alias ff='fastfetch' alias ff='fastfetch'
alias p='nvimpager -p'
alias latexdocs='zathura ~/projects/latex/docs/docs.pdf &>> /dev/null & disown'
alias gccerr='gcc -Wall -Wextra -Wpedantic -Werror -Wmissing-prototypes -std=c99'
alias linecount='cloc --vcs git .'
alias flutter='fvm flutter'
# Add scripts in ~/projects/active/dotfiles/general/scripts/ to path # Add scripts in ~/projects/dotfiles/scripts/ to path
fish_add_path -P ~/projects/active/dotfiles/scripts/ fish_add_path -P ~/projects/dotfiles/scripts/
function y function y
set tmp (mktemp -t "yazi-cwd.XXXXXX") set tmp (mktemp -t "yazi-cwd.XXXXXX")
@@ -36,7 +44,6 @@ function y
end end
zoxide init --cmd j fish | source zoxide init --cmd j fish | source
# [ -f /usr/share/autojump/autojump.fish ]; and source /usr/share/autojump/autojump.fish
if status is-interactive if status is-interactive
function fish_prompt function fish_prompt
@@ -124,3 +131,5 @@ end
end end
set -g fish_greeting ""
+37
View File
@@ -0,0 +1,37 @@
# This file was created by fish when upgrading to version 4.3, to migrate
# theme variables from universal to global scope.
# Don't edit this file, as it will be written by the web-config tool (`fish_config`).
# To customize your theme, delete this file and see
# help interactive#syntax-highlighting
# or
# man fish-interactive | less +/^SYNTAX.HIGHLIGHTING
# for appropriate commands to add to ~/.config/fish/config.fish instead.
# See also the release notes for fish 4.3.0 (run `help relnotes`).
set --global fish_color_autosuggestion 555 brblack
set --global fish_color_cancel -r
set --global fish_color_command blue
set --global fish_color_comment red
set --global fish_color_cwd green
set --global fish_color_cwd_root red
set --global fish_color_end green
set --global fish_color_error brred
set --global fish_color_escape brcyan
set --global fish_color_history_current --bold
set --global fish_color_host normal
set --global fish_color_host_remote yellow
set --global fish_color_normal normal
set --global fish_color_operator brcyan
set --global fish_color_param cyan
set --global fish_color_quote yellow
set --global fish_color_redirection cyan --bold
set --global fish_color_search_match white --background=brblack
set --global fish_color_selection white --bold --background=brblack
set --global fish_color_status red
set --global fish_color_user brgreen
set --global fish_color_valid_path --underline
set --global fish_pager_color_completion normal
set --global fish_pager_color_description B3A06D yellow -i
set --global fish_pager_color_prefix normal --bold --underline
set --global fish_pager_color_progress brwhite --background=cyan
set --global fish_pager_color_selected_background -r
View File
File renamed without changes.
+7
View File
@@ -0,0 +1,7 @@
file:///mnt/storage/NextCloud/Documents/ETH/Semester4
file:///home/janis/projects/active/eth
file:///mnt/storage/NextCloud
file:///mnt/storage/SORTED
file:///home/janis/projects
file:///mnt
file:///mnt/janis
+17
View File
@@ -0,0 +1,17 @@
[Settings]
gtk-theme-name=Adaptive-Theme
gtk-icon-theme-name=Papirus-Dark
gtk-font-name=Comfortaa 11
gtk-cursor-theme-name=oreo_spark_blue_cursors
gtk-cursor-theme-size=24
gtk-toolbar-style=GTK_TOOLBAR_BOTH
gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
gtk-button-images=1
gtk-menu-images=1
gtk-enable-event-sounds=1
gtk-enable-input-feedback-sounds=0
gtk-xft-antialias=1
gtk-xft-hinting=1
gtk-xft-hintstyle=hintslight
gtk-xft-rgba=rgb
gtk-application-prefer-dark-theme=1
+1
View File
@@ -0,0 +1 @@
/usr/share/themes/Adaptive-Theme/gtk-4.0/assets
+7
View File
@@ -0,0 +1,7 @@
[Settings]
gtk-theme-name=Adaptive-Theme
gtk-icon-theme-name=Papirus-Dark
gtk-font-name=Comfortaa 11
gtk-cursor-theme-name=oreo_spark_blue_cursors
gtk-cursor-theme-size=24
gtk-application-prefer-dark-theme=1
+8 -19
View File
@@ -9,30 +9,19 @@
#██████████████ █████ ████████████████████████████████████████████████████████████████████████████████████████████████ ██ #██████████████ █████ ████████████████████████████████████████████████████████████████████████████████████████████████ ██
general { general {
lock_cmd = hyprlock --immediate lock_cmd = hyprlock
unlock_cmd = loginctl unlock-session unlock_cmd = loginctl unlock-session
before_sleep_cmd = hyprlock --immediate before_sleep_cmd = hyprlock
after_sleep_cmd = hyprlock --immediate inhibit_sleep = 3
}
listener {
timeout = 100
on-timeout = notify-send "Entering idle state... (200s to screen off)"
on-resume = notify-send "Welcome back!"
}
listener {
timeout = 200
on-timeout = notify-send "100s to screen off"
}
listener {
timeout = 210
on-timeout = hyprlock
} }
listener { listener {
timeout = 300 timeout = 300
on-timeout = hyprlock --grace 15
}
listener {
timeout = 360
on-timeout = hyprctl dispatch dpms off on-timeout = hyprctl dispatch dpms off
on-resume = hyprctl dispatch dpms on on-resume = hyprctl dispatch dpms on
} }
+59 -30
View File
@@ -8,9 +8,7 @@ $mainMod = SUPER
# These key-binds are non-specific, laptop config has a separate file that includes # These key-binds are non-specific, laptop config has a separate file that includes
# extra config for it specifically # extra config for it specifically
bind = $mainMod, Q, killactive bind = $mainMod, Q, killactive
# bind = $mainMod SHIFT, Q, exit
bind = $mainMod, Return, exec, kitty bind = $mainMod, Return, exec, kitty
# bind = $mainMod, E, exec, thunar
bind = $mainMod SHIFT, E, exec, thunar bind = $mainMod SHIFT, E, exec, thunar
bind = $mainMod, E, exec, kitty --hold fish -c "y" bind = $mainMod, E, exec, kitty --hold fish -c "y"
bind = $mainMod, V, togglefloating, bind = $mainMod, V, togglefloating,
@@ -46,13 +44,11 @@ bind = $mainMod SHIFT, L, exec, librewolf
bind = $mainMod SHIFT, D, exec, vesktop bind = $mainMod SHIFT, D, exec, vesktop
bind = $mainMod SHIFT, V, exec, vscodium bind = $mainMod SHIFT, V, exec, vscodium
bind = $mainMod SHIFT, T, exec, thunderbird bind = $mainMod SHIFT, T, exec, thunderbird
bind = $mainMod SHIFT, H, exec, heroic bind = $mainMod CTRL, H, exec, heroic
bind = $mainMod SHIFT, Z, exec, zathura bind = $mainMod SHIFT, Z, exec, zathura
bind = $mainMod SHIFT, I, exec, notify-send 'AirPlay video server starting...' --app-name="AirPlay Video" && terminator -e "systemctl start avahi-daemon && sleep 5 && uxplay -n LinuxVideoPlay -nh" bind = $mainMod SHIFT, I, exec, notify-send 'AirPlay video server starting...' --app-name="AirPlay Video" && terminator -e "systemctl start avahi-daemon && sleep 5 && uxplay -n LinuxVideoPlay -nh"
bind = $mainMod SHIFT, A, exec, notify-send 'AirPlay server starting...' --app-name="AirPlay Audio" && terminator -T "hidden-terminator" -e "systemctl start avahi-daemon && shairport-sync -a LinuxPlay" bind = $mainMod SHIFT, A, exec, notify-send 'AirPlay server starting...' --app-name="AirPlay Audio" && terminator -T "hidden-terminator" -e "systemctl start avahi-daemon && shairport-sync -a LinuxPlay"
bind = $mainMod SHIFT, G, exec, notify-send 'Preparing system for gaming...' --app-name="Util" && corectrl
bind = $mainMod SHIFT, P, exec, notify-send 'Steam is launching...' --app-name="Steam" && steam bind = $mainMod SHIFT, P, exec, notify-send 'Steam is launching...' --app-name="Steam" && steam
bind = $mainMod SHIFT, R, exec, notify-send 'Launching in Remoteplay optimised session' --app-name="Steam" && steam -pipewire
bind = $mainMod CTRL, K, exec, notify-send 'Insta-Kill activated' --app-name="Hyprctl" && hyprctl kill bind = $mainMod CTRL, K, exec, notify-send 'Insta-Kill activated' --app-name="Hyprctl" && hyprctl kill
bind = $mainMod SHIFT, O, exec, terminator -e "~/projects/dotfiles/ai.sh" bind = $mainMod SHIFT, O, exec, terminator -e "~/projects/dotfiles/ai.sh"
@@ -70,12 +66,12 @@ bind = SHIFT, PRINT, exec, grimblast --notify save screen
# │ Rofi commands │ # │ Rofi commands │
# └ ┘ # └ ┘
bind = $mainMod, Space, exec, killall rofi || rofi -show combi -modes combi -combi-modes "window,drun,run" bind = $mainMod, Space, exec, killall rofi || rofi -show combi -modes combi -combi-modes "window,drun,run"
bind = $mainMod SHIFT, H, exec, cliphist list | rofi -dmenu | cliphist decode | wl-copy
# ┌ ┐ # ┌ ┐
# │ Logout commands │ # │ Logout commands │
# └ ┘ # └ ┘
bind = $mainMod, escape, exec, wlogout bind = $mainMod, escape, exec, wlogout
bind = $mainMod ALT CTRL, L, exec, hyprlock --immediate
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
@@ -85,14 +81,6 @@ bind = $mainMod ALT CTRL, L, exec, hyprlock --immediate
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
# ┌ ┐
# │ Move focus with mainMod + arrow keys │
# └ ┘
bind = $mainMod, left, movefocus, l
bind = $mainMod, right, movefocus, r
bind = $mainMod, up, movefocus, u
bind = $mainMod, down, movefocus, d
# ┌ ┐ # ┌ ┐
# │ Same with vim-motions │ # │ Same with vim-motions │
# └ ┘ # └ ┘
@@ -140,6 +128,12 @@ bind = $mainMod SHIFT, j, movetoworkspace, e-1
bind = $mainMod SHIFT, k, movetoworkspace, e+1 bind = $mainMod SHIFT, k, movetoworkspace, e+1
# ┌ ┐
# │ Special workspace │
# └ ┘
bind = $mainMod SHIFT, M, movetoworkspace, special
bind = $mainMod, M, togglespecialworkspace
# ┌ ┐ # ┌ ┐
# │ Scroll through existing workspaces with │ # │ Scroll through existing workspaces with │
# │ mainMod + scroll │ # │ mainMod + scroll │
@@ -148,30 +142,18 @@ bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1 bind = $mainMod, mouse_up, workspace, e-1
# ┌ ┐
# │ Tile window to a part of the screen │
# └ ┘
# bind = $mainMod CTRL, left, movewindow, left
# bind = $mainMod CTRL, right, movewindow, right
# ┌ ┐ # ┌ ┐
# │ move to next window / previous window with │ # │ move to next window / previous window with │
# │ ALT + Tab / SHIFT + ALT + Tab │ # │ ALT + Tab / SHIFT + ALT + Tab │
# └ ┘ # └ ┘
bind = ALT SHIFT, tab, cyclenext, prev bind = ALT SHIFT, tab, cyclenext, prev
# bind = ALT, tab, cyclenext, next
# bind = ALT CTRL, tab, focusurgentorlast
bind = ALT, tab, focusurgentorlast bind = ALT, tab, focusurgentorlast
# ┌ ┐ # ┌ ┐
# │ Master layout commands │ # │ Dwindle layout commands │
# └ ┘ # └ ┘
bind = $mainMod CTRL, M, layoutmsg, swapwithmaster bind = $mainMod CTRL, M, layoutmsg, swapsplit
bind = $mainMod SHIFT, A, layoutmsg, addmaster
bind = $mainMod SHIFT CTRL, right, layoutmsg, orientationnext
bind = $mainMod SHIFT CTRL, left, layoutmsg, orientationprev
# ┌ ┐ # ┌ ┐
@@ -182,6 +164,39 @@ bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow bindm = $mainMod, mouse:273, resizewindow
# ┌ ┐
# │ Resize window with keybinds (change split) │
# └ ┘
bind = $mainMod ALT, T, submap, split
# Submap for split
submap = split
binde = , H, splitratio, -0.01
binde = , L, splitratio, +0.01
# Reset bind
bind = , escape, submap, reset
submap = reset
# ┌ ┐
# │ Truly resize window with keybind (submap) │
# └ ┘
bind = $mainMod ALT, R, submap, resize
# Submap for resize
submap = resize
binde = , L, resizeactive, 10 0
binde = , H, resizeactive, -10 0
binde = , K, resizeactive, 0 -10
binde = , J, resizeactive, 0 10
# Reset bind
bind = , escape, submap, reset
submap = reset
# ┌ ┐ # ┌ ┐
# │ Freeze │ # │ Freeze │
# └ ┘ # └ ┘
@@ -199,8 +214,8 @@ bind = ,code:121, exec, pamixer -t
# ┌ ┐ # ┌ ┐
# │ Brightness-Control │ # │ Brightness-Control │
# └ ┘ # └ ┘
bind = ,code:232, exec, light -U 5 && notify-send 'Display brightness decreased by 5%' --app-name="Brightness" bind = ,code:232, exec, light -U 5
bind = ,code:233, exec, light -A 5 && notify-send 'Display brightness increased by 5%' --app-name="Brightness" bind = ,code:233, exec, light -A 5
# ┌ ┐ # ┌ ┐
@@ -208,3 +223,17 @@ bind = ,code:233, exec, light -A 5 && notify-send 'Display brightness increased
# └ ┘ # └ ┘
bind = $mainMod CTRL, D, exec, hyprctl keyword monitor HDMI-A-1, 1280x720@60, 1920x0, 1, mirror, DP-1 && notify-send 'Set FPV goggles to mirror main screen' --app-name="Hyprctl" bind = $mainMod CTRL, D, exec, hyprctl keyword monitor HDMI-A-1, 1280x720@60, 1920x0, 1, mirror, DP-1 && notify-send 'Set FPV goggles to mirror main screen' --app-name="Hyprctl"
bind = $mainMod CTRL, E, exec, hyprctl keyword monitor HDMI-A-1, 1280x720@60, 3840x0, 1 && notify-send 'Set to expand FPV goggles' --app-name="Hyprctl" bind = $mainMod CTRL, E, exec, hyprctl keyword monitor HDMI-A-1, 1280x720@60, 3840x0, 1 && notify-send 'Set to expand FPV goggles' --app-name="Hyprctl"
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Funny windows user trolling binds │
# ╰────────────────────────────────────────────────╯
# ────────────────────────────────────────────────────────────────────
bind = CTRL ALT, Delete, exec, notify-send 'I am not Windows' 'Did ya really think that was gonna do anything? Only an eternally broken OS could need such a stupid keybind'
bind = ALT, F4, exec, notify-send 'I am not Windows' 'That just feels like a way too unergonomic keybind to be used for such a common action'
bind = $mainMod, left, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
bind = $mainMod, right, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
bind = $mainMod, up, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
bind = $mainMod, down, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
Whitespace-only changes.
+2 -2
View File
@@ -4,10 +4,10 @@
# ╰────────────────────────────────────────────────╯ # ╰────────────────────────────────────────────────╯
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
exec = swaybg -m fill -i /home/janis/NextCloud/Wallpapers/dark/colour-explosion.jpg exec = swaybg -m fill -i /home/janis/NextCloud/Wallpapers/nvim/nvim-simple.png
general { general {
col.active_border = rgba(591641cc) rgba(97103acc) rgba(2d2057cc) 45deg col.active_border = rgba(5c9b3fcc) rgba(1674b9cc) rgba(282828cc) 45deg
col.inactive_border = rgb(000000) col.inactive_border = rgb(000000)
} }
+9
View File
@@ -0,0 +1,9 @@
return function()
return {
gaps_in = 3,
gaps_out = 4,
border_size = 2,
layout = "dwindle",
}
end
+27
View File
@@ -0,0 +1,27 @@
--- @param swap_escape boolean
return function(swap_escape)
return {
kb_options = swap_escape and "caps:swapescape" or "",
kb_layout = "us",
kb_variant = "altgr-intl",
natural_scroll = "true",
numlock_by_default = true,
repeat_delay = 400,
follow_mouse = 2,
mouse_refocus = true,
scroll_factor = 2,
accel_profile = "flat",
touchpad = {
disable_while_typing = true,
natural_scroll = true,
scroll_factor = 4,
},
focus_on_close = 1,
sensitivity = 0,
}
end
View File
Whitespace-only changes.
+48 -45
View File
@@ -9,18 +9,18 @@ exec-once = ~/.config/hypr/xdg-portal-hyprland
exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XAUTHORITY DISPLAY exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XAUTHORITY DISPLAY
exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
# exec-once = waybar
exec-once = hypridle exec-once = hypridle
exec-once = nm-applet exec-once = nm-applet
exec-once = nextcloud --background exec-once = nextcloud --background
# exec-once = sleep 2 && bash -c "ags run -d ~/projects/active/dotfiles/config/astal/ --gtk4 >> ~/log 2>&1" exec-once = sleep 2 && bash -c "ags run -d ~/projects/dotfiles/config/astal/ --gtk 4 >> /tmp/runner-log 2>&1"
exec-once = sleep 2 && bash -c "ags run -d ~/projects/active/dotfiles/config/astal/ --gtk4" exec-once = bash -c "ags run -d ~/projects/dotfiles/config/ags/notifications/ --gtk 3 >> /tmp/notifier-log 2>&1"
# exec-once = bash -c "ags run -d ~/projects/active/dotfiles/config/ags/notifications/ >> ~/logn 2>&1"
exec-once = bash -c "ags run -d ~/projects/active/dotfiles/config/ags/notifications/"
# ── wlhist ──────────────────────────────────────────────────────────
exec-once = wl-paste --type text --watch cliphist store # Stores only text data
exec-once = wl-paste --type image --watch cliphist store # Stores only image data
exec = hyprctl setcursor oreo_spark_blue_cursors 24
env = QT_QPA_PLATFORM,wayland env = QT_QPA_PLATFORM,wayland
env = QT_QPA_PLATFORM_THEME,qt6ct env = QT_QPA_PLATFORM_THEME,qt6ct
env = OLLAMA_HOST,0.0.0.0 env = OLLAMA_HOST,0.0.0.0
@@ -31,29 +31,45 @@ env = OLLAMA_HOST,0.0.0.0
# ╰────────────────────────────────────────────────╯ # ╰────────────────────────────────────────────────╯
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
input { input {
kb_layout = ch kb_layout = us
kb_options = caps:swapescape kb_variant = altgr-intl
natural_scroll = true natural_scroll = true
numlock_by_default = true numlock_by_default = true
repeat_delay = 400
follow_mouse = 2 follow_mouse = 2
mouse_refocus = true mouse_refocus = true
scroll_factor = 2
accel_profile = flat
touchpad { touchpad {
disable_while_typing = true disable_while_typing = true
natural_scroll = true natural_scroll = true
scroll_factor = 4
} }
focus_on_close = 1 focus_on_close = 1
sensitivity = 0 # -1.0 - 1.0, 0 means no modification. sensitivity = 0
} }
gestures { device {
# See https://wiki.hyprland.org/Configuring/Variables/ for more name = pnp0c50:00-093a:0255-touchpad
workspace_swipe = true enabled = true
workspace_swipe_distance = 300 }
# ── Cursors ─────────────────────────────────────────────────────────
cursor {
no_warps = false
inactive_timeout = 5
}
# ── Bind config ─────────────────────────────────────────────────────
binds {
workspace_back_and_forth = true
} }
@@ -63,27 +79,26 @@ gestures {
# ╰────────────────────────────────────────────────╯ # ╰────────────────────────────────────────────────╯
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
general { general {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
gaps_in = 3 gaps_in = 3
gaps_out = 4 gaps_out = 4
border_size = 1 border_size = 2
# col.active_border = rgba(cc5c00ff) rgba(cc5c00ff) rgba(ff0000ff) 45deg
# col.inactive_border = rgba(595959aa)
layout = master layout = dwindle
no_border_on_floating = false
} }
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Style │
# ╰────────────────────────────────────────────────╯
# ────────────────────────────────────────────────────────────────────
decoration { decoration {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
inactive_opacity = 1 inactive_opacity = 1
rounding = 10 rounding = 10
shadow { shadow {
enabled = true enabled = true
range = 4 range = 4
# color = rgba(1a1a1aee)
} }
blur { blur {
@@ -100,38 +115,26 @@ decoration {
animations { animations {
enabled = yes enabled = yes
# Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
bezier = myBezier, 0.05, 0.9, 0.1, 1.05 bezier = myBezier, 0.05, 0.9, 0.1, 1.05
animation = windows, 1, 7, myBezier animation = windows, 1, 3, myBezier
animation = windowsOut, 1, 7, default, popin 80% animation = windowsOut, 1, 4, default, popin 80%
animation = border, 1, 10, default animation = border, 1, 8, default
animation = fade, 1, 7, default animation = fade, 1, 3, default
animation = workspaces, 1, 6, default animation = workspaces, 1, 1, default
animation = specialWorkspaceIn, 1, 1, default, fade
animation = specialWorkspaceOut, 1, 1, default, fade
} }
misc { misc {
disable_hyprland_logo = true disable_hyprland_logo = true
disable_splash_rendering = false disable_splash_rendering = false
vrr = 2 vrr = 3
allow_session_lock_restore = true allow_session_lock_restore = true
} }
dwindle { dwindle {
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more # pseudotile = true
pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below force_split = 2
preserve_split = yes # you probably want this preserve_split = true
} }
master {
# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
# no_gaps_when_only = true
}
cursor {
no_warps = false
inactive_timeout = 60
}
+15
View File
@@ -0,0 +1,15 @@
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Gestures │
# ╰────────────────────────────────────────────────╯
# ────────────────────────────────────────────────────────────────────
gestures {
workspace_swipe_distance = 200
workspace_swipe_cancel_ratio = 0.3
workspace_swipe_forever = true
workspace_swipe_direction_lock = false
}
gesture = 3, horizontal, workspace,
gesture = 3, down, close
gesture = 3, up, fullscreen
+3
View File
@@ -0,0 +1,3 @@
-- Custom layout manager
-- Very work in progress, currently, dwindle layout is still in use,
-- but once this is completed, will switch over to this
@@ -0,0 +1,14 @@
# hyprvim
Using Vim Motions and in general vim-style commands is really neat - so why not apply to the Window Manager as well?
## Mapping
- `Super + W`: Manage windows (close windows, resize them, change split)
- `Super + Y`: Workspace management (change workspace, move windows to workspaces)
- `Super + C`: Notification management (dismiss notifications)
- `Super + X`: Launch commands (for software)
- `Super + D`: Device management (brightness, volume, media, etc)
- `Super + S`: Screenshot
There are several quick binds available, such as `Super + [0-9]` to switch workspaces, `Super + Shift + [0-9]` to move windows as well as `Super + [hjkl]` to move focus.
Additionally, there are shortcuts to commonly used apps, such as `Super + Enter` for `kitty`, `Super + Shift + L` for `librewolf` and `Super + Space` for `rofi`
@@ -0,0 +1,62 @@
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ device config │
# ╰────────────────────────────────────────────────╯
# ── Brightness-Control ──────────────────────────────────────────────
bind = ,code:232, exec, light -U 5 && notify-send 'Display brightness decreased by 5%'
bind = ,code:233, exec, light -A 5 && notify-send 'Display brightness increased by 5%'
# ── Volume control ──────────────────────────────────────────────────
bind = ,code:123, exec, pamixer -i 5
bind = ,code:122, exec, pamixer -d 5
bind = ,code:121, exec, pamixer -t
# ── Submap ──────────────────────────────────────────────────────────
bind = $mainMod, D, submap, device
submap = device
# ── Swapescape ──────────────────────────────────────────────────────
bind = , S, exec, fish -c "toggle-swapescape"
bind = , S, submap, reset
# ── FPV goggles binds ───────────────────────────────────────────────
bind = CTRL, D, exec, hyprctl keyword monitor HDMI-A-1, 1280x720@60, 1920x0, 1, mirror, DP-1 && notify-send 'Set FPV goggles to mirror main screen' --app-name="Hyprctl"
bind = CTRL, E, exec, hyprctl keyword monitor HDMI-A-1, 1280x720@60, 3840x0, 1 && notify-send 'Set to expand FPV goggles' --app-name="Hyprctl"
# Touchpad
bind = , T, exec, hyprctl keyword device[pnp0c50:00-093a:0255-touchpad]:enabled true && notify-send 'Enabled Trackpad' --app-name="Hyprctl"
bind = SHIFT, T, exec, hyprctl keyword device[pnp0c50:00-093a:0255-touchpad]:enabled false && notify-send 'Disabled Trackpad' --app-name="Hyprctl"
# ── Monitor config binds ────────────────────────────────────────────
bind = SHIFT, D, exec, hyprctl keyword monitor HDMI-A-1, 1920x1080@60, 1920x0, 1, mirror, eDP-1 && notify-send 'Set to mirror internal display' --app-name="Hyprctl"
bind = SHIFT, E, exec, hyprctl keyword monitor HDMI-A-1, 1920x1080@60, 1920x0, 1 && notify-send 'Set to expand external display' --app-name="Hyprctl"
# ── Internal display controls ───────────────────────────────────────
bind = , E, exec, hyprctl keyword monitor eDP-1, 2880x1800@60, 0x0, 1.5 && cpupower-gui -b && notify-send 'Set to battery optimized settings' --app-name="PowerProfiles"
bind = , B, exec, hyprctl keyword monitor eDP-1, 2880x1800@120, 0x0, 1.5 && cpupower-gui -b && notify-send 'Set to balanced performance settings' --app-name="PowerProfiles"
bind = , P, exec, hyprctl keyword monitor eDP-1, 2880x1800@120, 0x0, 1.5 && cpupower-gui -p && notify-send 'Set to performance optimized settings' --app-name="PowerProfiles"
# ── Using docked ────────────────────────────────────────────────────
bind = , D, exec, hyprctl keyword monitor eDP-1, disable
# Keyboard layout
bind = , U, exec, hyprctl keyword input:kb_layout us && hyprctl keyword input:kb_variant altgr-intl && notify-send 'Set to US keyboard layout' --app-name="Keyboard layout"
bind = , U, submap, reset
bind = , C, exec, hyprctl keyword input:kb_layout ch && hyprctl keyword input:kb_variant '' && notify-send 'Set to CH keyboard layout' --app-name="Keyboard layout"
bind = , C, submap, reset
bind = , M, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
bind = , M, submap, reset
# ── Exit submap ─────────────────────────────────────────────────────
bind = , escape, submap, reset
submap = reset
# ────────────────────────────────────────────────────────────────────
@@ -0,0 +1,86 @@
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ App launching │
# ╰────────────────────────────────────────────────╯
bind = $mainMod, Return, exec, kitty
# ── Rofi ────────────────────────────────────────────────────────────
bind = $mainMod, Space, exec, killall rofi || rofi -show combi -modes combi -combi-modes "window,drun,run"
bind = $mainMod SHIFT, H, exec, cliphist list | rofi -dmenu | cliphist decode | wl-copy
# ── Power / logout ──────────────────────────────────────────────────
bind = $mainMod, escape, exec, wlogout
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Launch submap │
# ╰────────────────────────────────────────────────╯
bind = $mainMod, X, submap, launch
submap = launch
# ── Kitty ───────────────────────────────────────────────────────────
bind = , K, exec, kitty
bind = , K, submap, reset
bind = , Return, exec, kitty
bind = , Return, submap, reset
# ── Others ──────────────────────────────────────────────────────────
bind = , Q, exec, qutebrowser
bind = , Q, submap, reset
bind = , L, exec, librewolf
bind = , L, submap, reset
bind = , E, exec, thunar
bind = , E, submap, reset
bind = , D, exec, vesktop
bind = , D, submap, reset
bind = SHIFT, B, exec, brave
bind = SHIFT, B, submap, reset
bind = , F, exec, filezilla
bind = , F, submap, reset
bind = , V, exec, vscodium
bind = , V, submap, reset
bind = , T, exec, thunderbird
bind = , T, submap, reset
bind = , H, exec, heroic
bind = , H, submap, reset
bind = , Z, exec, zathura
bind = , Z, submap, reset
bind = , B, exec, /opt/bs-manager/bs-manager
bind = , B, submap, reset
bind = , P, exec, alvr_dashboard
bind = , P, submap, reset
bind = , C, exec, qalculate-qt
bind = , C, submap, reset
bind = , A, exec, notify-send 'AirPlay server starting...' --app-name="AirPlay Audio" && terminator -T "hidden-terminator" -e "systemctl start avahi-daemon && shairport-sync -a LinuxPlay"
bind = , A, submap, reset
bind = SHIFT, A, exec, notify-send 'AirPlay video server starting...' --app-name="AirPlay Video" && terminator -T "hidden-terminator" -e "systemctl start avahi-daemon && sleep 5 && uxplay -n LinuxVideoPlay -nh"
bind = SHIFT, A, submap, reset
bind = , S, exec, notify-send 'Steam is launching...' --app-name="Steam" && steam
bind = , S, submap, reset
# ── Exit submap ─────────────────────────────────────────────────────
bind = , escape, submap, reset
submap = reset
# ────────────────────────────────────────────────────────────────────
@@ -0,0 +1,30 @@
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Notifications │
# ╰────────────────────────────────────────────────╯
# ── Submap ──────────────────────────────────────────────────────────
bind = $mainMod, C, submap, notifications
submap = notifications
bind = , T, exec, astal -i notifier toggle
bind = , T, submap, reset
bind = , D, exec, astal -i notifier clear-newest
bind = , D, submap, reset
bind = , C, exec, astal -i notifier clear
bind = , C, submap, reset
bind = , S, exec, astal -i notifier show
bind = , S, submap, reset
bind = , H, exec, astal -i notifier hide
bind = , H, submap, reset
# ── Exit submap ─────────────────────────────────────────────────────
bind = , escape, submap, reset
submap = reset
# ────────────────────────────────────────────────────────────────────
@@ -0,0 +1,25 @@
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Screenshotting binds │
# ╰────────────────────────────────────────────────╯
bind = $mainMod, S, submap, screenshotting
submap = screenshotting
bind = , Y, exec, grimblast --notify copy area
bind = , Y, submap, reset
bind = , C, exec, grimblast --notify copysave area
bind = , C, submap, reset
bind = , S, exec, grimblast --notify save area
bind = , S, submap, reset
bind = SHIFT, Y, exec, grimblast --notify copy screen
bind = SHIFT, Y, submap, reset
bind = SHIFT, C, exec, grimblast --notify copysave screen
bind = SHIFT, C, submap, reset
bind = SHIFT, S, exec, grimblast --notify save screen
bind = SHIFT, S, submap, reset
# ── Exit submap ─────────────────────────────────────────────────────
bind = , escape, submap, reset
submap = reset
# ────────────────────────────────────────────────────────────────────
@@ -0,0 +1,40 @@
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Window management submap │
# ╰────────────────────────────────────────────────╯
bind = $mainMod, Q, killactive
# ── Resize, move using mouse plus mainMod ───────────────────────────
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
# ── Submap ──────────────────────────────────────────────────────────
bind = $mainMod, W, submap, windowing
submap = windowing
# ── Resize windows ──────────────────────────────────────────────────
binde = , L, resizeactive, 10 0
binde = , H, resizeactive, -10 0
binde = , K, resizeactive, 0 -10
binde = , J, resizeactive, 0 10
# ── Change splitratio ───────────────────────────────────────────────
# binde = SHIFT, H, splitratio, -0.01
# binde = SHIFT, L, splitratio, +0.01
# ── Kill, freeze, etc ───────────────────────────────────────────────
bind = SHIFT, f, exec, hyprfreeze -a
bind = , x, killactive
bind = , q, killactive
bind = , f, fullscreen
bind = , v, togglefloating
bind = SHIFT, k, exec, notify-send 'Insta-Kill activated' --app-name="Hyprctl" && hyprctl kill
# ── Exit submap ─────────────────────────────────────────────────────
bind = , escape, submap, reset
submap = reset
# ────────────────────────────────────────────────────────────────────
@@ -0,0 +1,119 @@
# ┌ ┐
# │ Switch workspaces with mainMod + [0-9] │
# └ ┘
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, workspace, 4
bind = $mainMod, 5, workspace, 5
bind = $mainMod, 6, workspace, 6
bind = $mainMod, 7, workspace, 7
bind = $mainMod, 8, workspace, 8
bind = $mainMod, 9, workspace, 9
bind = $mainMod, 0, workspace, 10
# ┌ ┐
# │ Move active window to a workspace with │
# │ mainMod + SHIFT + [0-9] │
# └ ┘
bind = $mainMod SHIFT, 1, movetoworkspace, 1
bind = $mainMod SHIFT, 2, movetoworkspace, 2
bind = $mainMod SHIFT, 3, movetoworkspace, 3
bind = $mainMod SHIFT, 4, movetoworkspace, 4
bind = $mainMod SHIFT, 5, movetoworkspace, 5
bind = $mainMod SHIFT, 6, movetoworkspace, 6
bind = $mainMod SHIFT, 7, movetoworkspace, 7
bind = $mainMod SHIFT, 8, movetoworkspace, 8
bind = $mainMod SHIFT, 9, movetoworkspace, 9
bind = $mainMod SHIFT, 0, movetoworkspace, 10
# ┌ ┐
# │ Move focus with vim motions │
# └ ┘
bind = $mainMod, h, movefocus, l
bind = $mainMod, l, movefocus, r
bind = $mainMod, j, movefocus, d
bind = $mainMod, k, movefocus, u
# ┌ ┐
# │ Special workspace │
# └ ┘
bind = $mainMod SHIFT, M, movetoworkspace, special
bind = $mainMod, M, togglespecialworkspace
# ┌ ┐
# │ Scroll through existing workspaces with │
# │ mainMod + scroll │
# └ ┘
bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1
# ┌ ┐
# │ move to next window / previous window with │
# │ ALT + Tab / SHIFT + ALT + Tab │
# └ ┘
bind = ALT SHIFT, tab, cyclenext, prev
bind = ALT, tab, focusurgentorlast
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Submap for workspace management │
# ╰────────────────────────────────────────────────╯
bind = $mainMod, A, submap, workspace
submap = workspace
# ── Move to workspace ───────────────────────────────────────────────
bind = , 1, workspace, 1
bind = , 2, workspace, 2
bind = , 3, workspace, 3
bind = , 4, workspace, 4
bind = , 5, workspace, 5
bind = , 6, workspace, 6
bind = , 7, workspace, 7
bind = , 8, workspace, 8
bind = , 9, workspace, 9
bind = , 0, workspace, 10
# ── Move active window to workspace ─────────────────────────────────
bind = SHIFT, 1, movetoworkspace, 1
bind = SHIFT, 2, movetoworkspace, 2
bind = SHIFT, 3, movetoworkspace, 3
bind = SHIFT, 4, movetoworkspace, 4
bind = SHIFT, 5, movetoworkspace, 5
bind = SHIFT, 6, movetoworkspace, 6
bind = SHIFT, 7, movetoworkspace, 7
bind = SHIFT, 8, movetoworkspace, 8
bind = SHIFT, 9, movetoworkspace, 9
bind = SHIFT, 0, movetoworkspace, 10
# ── Move workspace with vim motions or mouse scroll ─────────────────
bind = , h, workspace, e-1
bind = , l, workspace, e+1
bind = , mouse_down, workspace, e+1
bind = , mouse_up, workspace, e-1
# ── Move window to workspace with vim motions ───────────────────────
bind = SHIFT, h, movetoworkspace, e-1
bind = SHIFT, l, movetoworkspace, e+1
# ── Special workspace ───────────────────────────────────────────────
bind = , s, togglespecialworkspace
bind = SHIFT, s, movetoworkspace, special
# ── dwindle ─────────────────────────────────────────────────────────
bind = , M, layoutmsg, swapsplit
bind = , N, layoutmsg, togglesplit
# ── Exit submap ─────────────────────────────────────────────────────
bind = , escape, submap, reset
submap = reset
# ────────────────────────────────────────────────────────────────────
+15
View File
@@ -0,0 +1,15 @@
$mainMod = SUPER
source=./modal-binds/workspace.conf
source=./modal-binds/launch.conf
source=./modal-binds/notifications.conf
source=./modal-binds/window-management.conf
source=./modal-binds/screenshot.conf
source=./modal-binds/device.conf
bind = CTRL ALT, Delete, exec, notify-send 'I am not Windows' 'Did ya really think that was gonna do anything? Only an eternally broken OS could need such a stupid keybind'
bind = ALT, F4, exec, notify-send 'I am not Windows' 'That just feels like a way too unergonomic keybind to be used for such a common action'
bind = $mainMod, left, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
bind = $mainMod, right, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
bind = $mainMod, up, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
bind = $mainMod, down, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
+112 -86
View File
@@ -1,17 +1,3 @@
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ WORKSPACE RULES │
# ╰────────────────────────────────────────────────╯
# ────────────────────────────────────────────────────────────────────
# Display full sized (without gaps), if only window on screen
# workspace = w[tv1], gapsout:0, gapsin:0
# workspace = f[1], gapsout:0, gapsin:0
# windowrule = bordersize 0, floating:0, onworkspace:w[tv1]
# windowrule = rounding 0, floating:0, onworkspace:w[tv1]
# windowrule = bordersize 0, floating:0, onworkspace:f[1]
# windowrule = rounding 0, floating:0, onworkspace:f[1]
$mainMod = SUPER $mainMod = SUPER
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
@@ -19,103 +5,143 @@ $mainMod = SUPER
# │ WINDOW RULES │ # │ WINDOW RULES │
# ╰────────────────────────────────────────────────╯ # ╰────────────────────────────────────────────────╯
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
windowrule = float, title:.*(rofi).* windowrule = move 1450 50, match:title (.*)Power menu$
windowrule = animation popin, title:.*(rofi).* windowrule = workspace 2, match:class evince
windowrule = center, title:(rofi)(.*) windowrule = workspace 2, match:title .*Okular.*
windowrule = workspace 2, match:class org.pwmt.zathura
windowrule = fullscreen on, match:title wlogout
windowrule = workspace 2, match:class librewolf
windowrule = workspace 2, match:title LibreWolf
windowrule = workspace 2, match:title BSManager
windowrule = workspace 1, match:title ALVR(.*)
windowrule = workspace 1, match:class (.*)steam_app(.*)
windowrule = fullscreen on, match:class (.*)steam_app(.*)
windowrule = workspace 2, match:title (.*)Beat Saber(.*)
windowrule = fullscreen on, match:title (.*)Beat Saber(.*)
windowrule = workspace 2, match:title (.*)Discord(.*)
windowrule = workspace 3, match:title ^(Steam)(.*)$
windowrule = float off, match:title ^(Steam)(.*)$
windowrule = float on, match:title ^(SteamVR)(.*)$
windowrule = center on, match:title ^(.*)(SteamVR)(.*)$
windowrule = float on, match:title ^(.*)(Android)(.*)(Emulator)(.*)$
windowrule = workspace 2, match:title ^(.*)(Android)(.*)(Emulator)(.*)$
windowrule = center on, match:title ^(.*)(Android)(.*)(Emulator)(.*)$
windowrule = workspace 1, match:title (.*)(VSCodium)$
windowrule = center on, match:title ^(.*)(VSCodium)$
windowrule = workspace 3, match:class minecraft-launcher
windowrule = tile on, match:class minecraft-launcher
windowrule = fullscreen on, match:title ^(.*)(Minecraft)(.*)$
windowrule = workspace 3, match:title ^(.*)(Minecraft)(.*)$
windowrule = move 1450 50, title:^(.*)(Power menu)$ windowrule = workspace 1, match:title ^(.*)hidden-terminator*(.*)$
windowrule = workspace 2, class:evince windowrule = size 0 0, match:title ^(.*)hidden-terminator*(.*)$
windowrule = workspace 2, title:.*(Okular).* windowrule = move 0 0, match:title ^(.*)hidden-terminator*(.*)$
windowrule = workspace 2, class:org.pwmt.zathura windowrule = float on, match:title ^(.*)hidden-terminator*(.*)$
windowrule = fullscreen, title:wlogout
windowrule = workspace 2, class:librewolf
windowrule = workspace 2, title:LibreWolf
windowrule = workspace 2, title:(.*)(Discord)(.*)
windowrule = workspace 3, title:^(Steam)(.*)$
windowrule = workspace 1, title:^(.*)(VSCodium)$
windowrule = center, title:^(.*)(VSCodium)$
windowrule = workspace 3, class:minecraft-launcher
windowrule = tile, class:minecraft-launcher
windowrule = fullscreen, title:^(.*)(Minecraft)(.*)$
windowrule = workspace 3, title:^(.*)(Minecraft)(.*)$
windowrule = workspace 1, title:^(.*)hidden-terminator*(.*)$
windowrule = size 0 0, title:^(.*)hidden-terminator*(.*)$
windowrule = move 0 0, title:^(.*)hidden-terminator*(.*)$
windowrule = float, title:^(.*)hidden-terminator*(.*)$
# ┌ ┐ # ┌ ┐
# │ Set rule for yazi filepicker │ # │ Set rule for yazi filepicker │
# └ ┘ # └ ┘
windowrule = float, title:^(.*)termfilechooser*(.*)$ windowrule = float on, match:title ^(.*)termfilechooser*(.*)$
windowrule = size 1400 800, title:^(.*)termfilechooser*(.*)$ windowrule = size 1400 800, match:title ^(.*)termfilechooser*(.*)$
windowrule = center, title:^(.*)termfilechooser*(.*)$ windowrule = center on, match:title ^(.*)termfilechooser*(.*)$
windowrule = dim_around on, match:title ^(.*)termfilechooser*(.*)$
# ┌ ┐ # ┌ ┐
# │ Set floating windows & position them centered │ # │ Set floating windows & position them centered │
# └ ┘ # └ ┘
windowrule = float, class:file_progress windowrule = float on, match:class file_progress
windowrule = center, class:file_progress windowrule = center on, match:class file_progress
windowrule = float, class:confirm windowrule = float on, match:class confirm
windowrule = center, class:confirm windowrule = center on, match:class confirm
windowrule = float, class:dialog windowrule = float on, match:class dialog
windowrule = center, class:dialog windowrule = center on, match:class dialog
windowrule = float, class:download windowrule = float on, match:class download
windowrule = center, class:download windowrule = center on, match:class download
windowrule = float, class:notification windowrule = float on, match:class notification
windowrule = center, class:notification windowrule = center on, match:class notification
windowrule = float, class:error windowrule = float on, match:class error
windowrule = center, class:error windowrule = center on, match:class error
windowrule = float, class:splash windowrule = float on, match:class splash
windowrule = center, class:splash windowrule = center on, match:class splash
windowrule = float, class:confirmreset windowrule = float on, match:class confirmreset
windowrule = center, class:confirmreset windowrule = center on, match:class confirmreset
windowrule = float, title:Open File windowrule = float on, match:title Open File
windowrule = center, title:Open File windowrule = center on, match:title Open File
windowrule = float, title:branchdialog windowrule = float on, match:title branchdialog
windowrule = center, title:branchdialog windowrule = center on, match:title branchdialog
windowrule = float, class:Lxappearance windowrule = float on, match:class Lxappearance
windowrule = center, class:Lxappearance windowrule = center on, match:class Lxappearance
windowrule = float, title:^(Media viewer)$ windowrule = float on, match:title ^(Media viewer)$
windowrule = center, title:^(Media viewer)$ windowrule = center on, match:title ^(Media viewer)$
windowrule = float, title:^(Volume Control)$ windowrule = float on, match:title ^(Volume Control)$
windowrule = center, title:^(Volume Control)$ windowrule = center on, match:title ^(Volume Control)$
windowrule = float, title:^(Picture-in-Picture)$ windowrule = float on, match:title ^(Picture-in-Picture)$
windowrule = center, title:^(Picture-in-Picture)$ windowrule = center on, match:title ^(Picture-in-Picture)$
windowrule = float, title:^(File Operation Progress)$ windowrule = float on, match:title ^(File Operation Progress)$
windowrule = center, title:^(File Operation Progress)$ windowrule = center on, match:title ^(File Operation Progress)$
windowrule = float, title:^(Loading)(.*)$ windowrule = float on, match:title ^(Loading)(.*)$
windowrule = center, title:^(Loading)(.*)$ windowrule = center on, match:title ^(Loading)(.*)$
windowrule = float, class:pavucontrol-qt windowrule = float on, match:title ^(.*)(Launcher)(.*)$
windowrule = center, class:pavucontrol-qt windowrule = center on, match:title ^(.*)(Launcher)(.*)$
windowrule = float, class:pavucontrol windowrule = float on, match:title ^(AG Controller)(.*)$
windowrule = center, class:pavucontrol windowrule = center on, match:title ^(AG Controller)(.*)$
windowrule = workspace special, match:title ^(AG Controller)(.*)$
windowrule = size 1200 800, match:title ^(AG Controller)(.*)$
windowrule = float, class:file-roller windowrule = float on, match:title ^(Qalculate)(.*)$
windowrule = center, class:file-roller windowrule = center on, match:title ^(Qalculate)(.*)$
windowrule = workspace special, match:title ^(Qalculate)(.*)$
windowrule = size 1200 800, match:title ^(Qalculate)(.*)$
windowrule = idleinhibit focus, title:^(Rocket League)(.*)$ windowrule = float on, match:class pavucontrol-qt
windowrule = fullscreen, title:^(Steam Big Picture)$ windowrule = center on, match:class pavucontrol-qt
windowrule = idleinhibit always, class:steam
windowrule = idleinhibit always, class:lutris windowrule = float on, match:class pavucontrol
windowrule = idleinhibit focus, class:vlc windowrule = center on, match:class pavucontrol
windowrule = idleinhibit focus, class:supertuxkart
windowrule = idleinhibit fullscreen, title:^(.*)(Discord)(.*)$ windowrule = float on, match:class file-roller
windowrule = idleinhibit fullscreen, title:^(.*)(~)(.*)$ windowrule = center on, match:class file-roller
# idleinhibit
windowrule = idle_inhibit focus, match:title ^(Rocket League)(.*)$
windowrule = fullscreen on, match:title ^(Steam Big Picture)$
windowrule = idle_inhibit always, match:class steam
windowrule = idle_inhibit always, match:class lutris
windowrule = idle_inhibit focus, match:class vlc
windowrule = idle_inhibit focus, match:class supertuxkart
windowrule = idle_inhibit fullscreen, match:title ^(.*)(Discord)(.*)$
windowrule = idle_inhibit fullscreen, match:title ^(.*)(~)(.*)$
# Do not screenshare bitwarden windows
windowrule = no_screen_share on, match:title (.*)(Bitwarden)(.*)
windowrule = no_screen_share on, match:class nm-connection-editor
windowrule = no_screen_share on, match:title (.*)(secret)(.*)
windowrule = no_screen_share on, match:class (.*)[aA]uthentication(.*)
# ── LOVR config ─────────────────────────────────────────────────────
windowrule = float on, match:title ^(.*)LÖVR(.*)$
windowrule = size 1400 800, match:title ^(.*)LÖVR(.*)$
windowrule = center on, match:title ^(.*)LÖVR(.*)$
# ┌ ┐
# │ Layer rules │
# └ ┘
layerrule = dim_around on, match:namespace rofi
+1 -6
View File
@@ -17,15 +17,10 @@
# ╰────────────────────────────────────────────────╯ # ╰────────────────────────────────────────────────╯
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
# monitor=DP-1, preferred, 0x0, 1, vrr, 2
monitor=DP-1, 1920x1080@144, 0x0, 1, vrr, 2 monitor=DP-1, 1920x1080@144, 0x0, 1, vrr, 2
monitor=DP-2, 1920x1080@75, 1920x0, 1 monitor=DP-2, 1920x1080@75, 1920x0, 1
# monitor=,highres highrr, auto, 1
# exec = swaybg -m fill -i /mnt/storage/SORTED/Pictures/Wallpapers/wallpaper/arch-bg-matterhorn.jpg
# exec = swaybg -m fill -i /mnt/storage/SORTED/Pictures/Wallpapers/McLaren/main_livery_upscaled.jpg
exec = hyprctl setcursor oreo_spark_blue_cursors 24
source=./hyprland/binds.conf source=./hyprland/binds.conf
source=./hyprland/general.conf source=./hyprland/general.conf
+48
View File
@@ -0,0 +1,48 @@
#░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
#░ ░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░
#▒ ▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒ ▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒
#▒ ▒▒▒▒ ▒ ▒▒▒ ▒ ▒ ▒▒▒ ▒ ▒ ▒▒▒▒ ▒▒▒▒▒ ▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒ ▒ ▒▒▒ ▒ ▒▒▒▒▒▒▒ ▒▒
#▓ ▓▓ ▓ ▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓ ▓▓ ▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓ ▓▓ ▓▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓
#▓ ▓▓▓▓ ▓▓▓▓ ▓▓▓ ▓▓▓ ▓▓ ▓▓▓▓ ▓ ▓▓▓ ▓▓▓ ▓▓ ▓ ▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓▓
#▓ ▓▓▓▓ ▓▓▓▓▓ ▓▓▓ ▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓▓ ▓▓▓ ▓▓ ▓ ▓▓▓ ▓▓▓▓▓▓▓▓▓ ▓▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓
#█ ████ ████ ████ ██████ ████ ███ █ █ ██ ██ █ ███████████ ██████ █████ ██ ███ ████ █████ █
#██████████████ █████ ██████████████████████████████████████████████████████████████████████████████████████████████████████ ██
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ MONITORS │
# ╰────────────────────────────────────────────────╯
# ────────────────────────────────────────────────────────────────────
monitor=eDP-1, disable
monitor=,highres highrr, auto, 1
source=./hyprland/binds.conf
source=./hyprland/general.conf
source=./hyprland/windowrules.conf
# ┌ ┐
# │ LAPTOP │
# └ ┘
exec = hyprctl setcursor oreo_spark_blue_cursors 36
env = HYPRCURSOR_THEME, Oreo_spark_blue_cursor
env = X_CURSOR_THEME, Oreo_spark_blue_cursor
env = XCURSOR_SIZE,24
env = XDG_SESSION_TYPE, wayland
env = QT_QPA_PLATFORM,wayland
env = ELECTRON_OZONE_PLATFORM_HINT,wayland
exec-once = hyprpm reload -nn
xwayland {
force_zero_scaling = true
}
# ── Vivado inversion ────────────────────────────────────────────────
windowrule = plugin:invertwindow, class:Vivado
windowrule = tile, title:(.*)Vivado(.*)
+8 -33
View File
@@ -18,14 +18,12 @@
# ╰────────────────────────────────────────────────╯ # ╰────────────────────────────────────────────────╯
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
monitor=eDP-1, 2880x1800@60, 0x0, 1.5 monitor=eDP-1, 2880x1800@120, 0x0, 1.5
# monitor=,highres highrr, auto, 1 monitor=,highres highrr, auto, 1
# exec = swaybg -m fill -i /home/janis/Pictures/arch-bg.png
source=./hyprland/binds.conf source=./hyprland/binds.conf
source=./hyprland/gestures.conf
source=./hyprland/general.conf source=./hyprland/general.conf
source=./hyprland/windowrules.conf source=./hyprland/windowrules.conf
@@ -35,40 +33,17 @@ source=./hyprland/windowrules.conf
exec = hyprctl setcursor oreo_spark_blue_cursors 36 exec = hyprctl setcursor oreo_spark_blue_cursors 36
env = HYPRCURSOR_THEME, Oreo_spark_blue_cursor env = HYPRCURSOR_THEME, Oreo_spark_blue_cursor
env = X_CURSOR_THEME, Oreo_spark_blue_cursor env = X_CURSOR_THEME, Oreo_spark_blue_cursor
env = XCURSOR_SIZE,24 env = XCURSOR_SIZE, 36
env = ELECTRON_ENABLE_HIGHDPI_SUPPORT, 1 env = ELECTRON_ENABLE_HIGHDPI_SUPPORT, 1
env = XDG_SESSION_TYPE, wayland env = XDG_SESSION_TYPE, wayland
env = QT_QPA_PLATFORM, wayland env = QT_QPA_PLATFORM, wayland
# env = QT_QPA_PLATFORM_THEME,qt6ct
env = ELECTRON_OZONE_PLATFORM_HINT, wayland env = ELECTRON_OZONE_PLATFORM_HINT, wayland
env = GDK_SCALE,2 env = GDK_SCALE,2
exec-once = hyprpm reload -nn
input {
kb_options = caps:swapescape
}
xwayland { xwayland {
force_zero_scaling = true force_zero_scaling = true
} }
# ── Volume control ──────────────────────────────────────────────────
bind = ,code:123, exec, pamixer -i 5
bind = ,code:122, exec, pamixer -d 5
bind = ,code:121, exec, pamixer -t
# ── Brightness-Control ──────────────────────────────────────────────
bind = ,code:232, exec, light -U 5 && notify-send 'Display brightness decreased by 5%'
bind = ,code:233, exec, light -A 5 && notify-send 'Display brightness increased by 5%'
# ── Monitor config binds ────────────────────────────────────────────
bind = $mainMod CTRL, D, exec, hyprctl keyword monitor HDMI-A-1, 1920x1080@60, 1920x0, 1, mirror, eDP-1 && notify-send 'Set to mirror internal display'
bind = $mainMod CTRL, E, exec, hyprctl keyword monitor HDMI-A-1, 1920x1080@60, 1920x0, 1 && notify-send 'Set to expand external display'
# ── Internal display controls ───────────────────────────────────────
bind = $mainMod ALT, E, exec, hyprctl keyword monitor eDP-1, 2880x1800@60, 0x0, 1.5 && cpupower-gui -b && notify-send 'Set to battery optimized settings'
bind = $mainMod ALT, P, exec, hyprctl keyword monitor eDP-1, 2880x1800@120, 0x0, 1.5 && cpupower-gui -p && notify-send 'Set to performance optimized settings'
# ── Vivado inversion ────────────────────────────────────────────────
windowrule = plugin:invertwindow, class:Vivado
windowrule = tile, title:(.*)Vivado(.*)
+3 -7
View File
@@ -9,16 +9,12 @@
#██████████████ █████ ███████████████████████████████████████████████████████████████████████████████████████████████████ ██ #██████████████ █████ ███████████████████████████████████████████████████████████████████████████████████████████████████ ██
general {
grace = 15
}
# ┌ ┐ # ┌ ┐
# │ BACKGROUND │ # │ BACKGROUND │
# └ ┘ # └ ┘
background { background {
monitor = monitor =
path = /home/janis/NextCloud/Wallpapers/dark/colour-splash.jpg # Or screenshot path = /home/janis/NextCloud/Wallpapers/nvim/nvim-simple.png # Or screenshot
blur_passes = 1 blur_passes = 1
} }
@@ -33,7 +29,7 @@ input-field {
dots_size = 0.33 # Scale of input-field height, 0.2 - 0.8 dots_size = 0.33 # Scale of input-field height, 0.2 - 0.8
dots_spacing = 0.15 # Scale of dots' absolute size, 0.0 - 1.0 dots_spacing = 0.15 # Scale of dots' absolute size, 0.0 - 1.0
dots_center = false dots_center = false
outer_color = rgb(89, 22, 65) outer_color = rgb(92, 155, 63)
inner_color = rgb(200, 200, 200) inner_color = rgb(200, 200, 200)
font_color = rgb(10, 10, 10) font_color = rgb(10, 10, 10)
fade_on_empty = true fade_on_empty = true
@@ -49,7 +45,7 @@ label {
monitor = monitor =
text = <b>$TIME</b> text = <b>$TIME</b>
color = color =
font_size = 100 font_size = 150
font_family = Comfortaa font_family = Comfortaa
position = 0, 80 position = 0, 80
+33
View File
@@ -0,0 +1,33 @@
#░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
#░ ░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░ ░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░
#▒ ▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒
#▒ ▒▒▒▒ ▒ ▒▒▒ ▒ ▒ ▒▒▒ ▒ ▒▒▒▒▒▒▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒ ▒ ▒▒▒ ▒ ▒▒▒▒▒▒▒ ▒▒
#▓ ▓▓ ▓ ▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓▓ ▓ ▓▓ ▓▓ ▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓ ▓▓ ▓▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓
#▓ ▓▓▓▓ ▓▓▓▓ ▓▓▓ ▓▓▓ ▓▓ ▓▓▓▓ ▓ ▓▓▓ ▓▓ ▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓▓
#▓ ▓▓▓▓ ▓▓▓▓▓ ▓▓▓ ▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓▓ ▓▓ ▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓
#█ ████ ████ ████ ██████ ████ ██ █ ██ ███ █████████████ ██████ █████ ██ ███ ████ █████ █
#██████████████ █████ ████████████████████████████████████████████████████████████████████████████████████████████████ ██
general {
lock_cmd = hyprlock
unlock_cmd = loginctl unlock-session
before_sleep_cmd = hyprlock
inhibit_sleep = 3
}
listener {
timeout = 300
on-timeout = hyprlock --grace 15
}
listener {
timeout = 360
on-timeout = hyprctl dispatch dpms off
on-resume = hyprctl dispatch dpms on
}
listener {
timeout = 600
on-timeout = systemctl suspend
on-resume = hyprctl dispatch dpms on
}
+25
View File
@@ -0,0 +1,25 @@
-- TODO: Laptop vs desktop vs docked config
local swap_escape = false
hl.config({
general = require("hyprland.core.general")(),
input = require("hyprland.core.input")(swap_escape),
xwayland = {
force_zero_scaling = true,
},
misc = {
disable_hyprland_logo = true,
disable_splash_rendering = false,
vrr = 3,
allow_session_lock_restore = true,
},
dwindle = {
pseudotile = true,
force_split = 2,
preserve_split = true,
},
})
hl.device({
name = "pnp0c50:00-093a:0255-touchpad",
enabled = true,
})
+96
View File
@@ -0,0 +1,96 @@
#░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
#░ ░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░
#▒ ▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒
#▒ ▒▒▒▒ ▒ ▒▒▒ ▒ ▒ ▒▒▒ ▒ ▒ ▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒ ▒▒ ▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒ ▒ ▒▒▒ ▒ ▒▒▒▒▒▒▒ ▒▒
#▓ ▓▓ ▓ ▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓ ▓▓ ▓▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓
#▓ ▓▓▓▓ ▓▓▓▓ ▓▓▓ ▓▓▓ ▓▓ ▓▓▓▓ ▓ ▓▓▓▓ ▓ ▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓▓
#▓ ▓▓▓▓ ▓▓▓▓▓ ▓▓▓ ▓ ▓▓▓ ▓▓▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓▓▓▓▓▓▓▓ ▓▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓
#█ ████ ████ ████ ██████ ████ ████ ████████ █ ██ ██████████ ██████ █████ ██ ███ ████ █████ █
#██████████████ █████ ███████████████████████████████████████████████████████████████████████████████████████████████████ ██
# ┌ ┐
# │ BACKGROUND │
# └ ┘
background {
monitor =
path = /home/janis/NextCloud/Wallpapers/nvim/nvim-simple.png # Or screenshot
blur_passes = 1
}
# ┌ ┐
# │ PASSWORD INPUT │
# └ ┘
input-field {
monitor =
size = 300, 40
outline_thickness = 3
dots_size = 0.33 # Scale of input-field height, 0.2 - 0.8
dots_spacing = 0.15 # Scale of dots' absolute size, 0.0 - 1.0
dots_center = false
outer_color = rgb(92, 155, 63)
inner_color = rgb(200, 200, 200)
font_color = rgb(10, 10, 10)
fade_on_empty = true
placeholder_text = <i>Input Password...</i> # Text rendered in the input box when it's empty.
hide_input = false
position = 0, -80
halign = center
valign = center
}
label {
monitor =
text = <b>$TIME</b>
color =
font_size = 150
font_family = Comfortaa
position = 0, 80
halign = center
valign = center
}
label {
monitor =
text = $LAYOUT
color = rgba(200, 200, 200, 1.0)
font_size = 12
font_family = Comfortaa
position = 0, 0
halign = right
valign = bottom
}
label {
monitor =
text = $USER
color = rgba(200, 200, 200, 1.0)
font_size = 12
font_family = Comfortaa
position = 0, 0
halign = left
valign = bottom
shadow_passes = 3
}
label {
monitor =
text = <i>Failed attempts: $ATTEMPTS</i>
color = rgba(200, 0, 0, 1.0)
font_size = 12
font_family = Adwaita Sans
position = 0, 20
halign = center
valign = bottom
shadow_passes = 3
shadow_size = 5
shadow_boost = 3
shadow_color = rgb(255,255,255)
}
+8
View File
@@ -0,0 +1,8 @@
#!/bin/bash
sleep 1
killall xdg-desktop-portal-hyprland
killall xdg-desktop-portal-wlr
killall xdg-desktop-portal
/usr/libexec/xdg-desktop-portal-hyprland &
sleep 2
/usr/lib/xdg-desktop-portal &
+8
View File
@@ -17,6 +17,7 @@ font_size 12.0
# │ Cursor config │ # │ Cursor config │
# └ ┘ # └ ┘
cursor_trail 1 cursor_trail 1
cursor_trail_start_threshold 0
# ┌ ┐ # ┌ ┐
@@ -28,3 +29,10 @@ url_prefixes file ftp ftps gemini git gopher http https irc ircs kitty mailto ne
detect_urls yes detect_urls yes
show_hyperlink_targets yes show_hyperlink_targets yes
include current-theme.conf include current-theme.conf
wheel_scroll_multiplier 10.0
touch_scroll_multiplier 5.0
# ┌ ┐
# │ Mappings │
# └ ┘
map kitty_mod+e
File diff suppressed because it is too large. Load diff
+276
View File
@@ -0,0 +1,276 @@
# ─────────────────────────────────────────────────────────────────────
# ╭─────────────────────────────────────────────────╮
# │ clang-format config │
# ╰─────────────────────────────────────────────────╯
# ─────────────────────────────────────────────────────────────────────
BasedOnStyle: LLVM
AccessModifierOffset: -2
AlignAfterOpenBracket: BlockIndent
AlignArrayOfStructures: Left
AlignConsecutiveAssignments:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: true
AlignConsecutiveBitFields:
Enabled: true
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveDeclarations:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveMacros:
Enabled: true
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveShortCaseStatements:
Enabled: true
AcrossEmptyLines: false
AcrossComments: false
AlignCaseArrows: false
AlignCaseColons: false
AlignConsecutiveTableGenBreakingDAGArgColons:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveTableGenCondOperatorColons:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveTableGenDefinitionColons:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignEscapedNewlines: Right
AlignOperands: Align
AlignTrailingComments:
Kind: Always
OverEmptyLines: 0
AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowBreakBeforeNoexceptSpecifier: Never
AllowShortBlocksOnASingleLine: Never
AllowShortCaseExpressionOnASingleLine: true
AllowShortCaseLabelsOnASingleLine: false
AllowShortCompoundRequirementOnASingleLine: true
AllowShortEnumsOnASingleLine: true
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AttributeMacros:
- __capability
BinPackArguments: false
BinPackParameters: false
BitFieldColonSpacing: Both
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: true
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakAdjacentStringLiterals: true
BreakAfterAttributes: Always
BreakAfterJavaFieldAnnotations: false
BreakAfterReturnType: None
BreakArrays: true
BreakBeforeBinaryOperators: All
BreakBeforeBraces: Attach
BreakBeforeConceptDeclarations: Always
BreakBeforeInlineASMColon: OnlyMultiline
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
BreakFunctionDefinitionParameters: false
BreakInheritanceList: BeforeColon
BreakStringLiterals: true
BreakTemplateDeclarations: MultiLine
ColumnLimit: 100
CommentPragmas: "^ IWYU pragma:"
CompactNamespaces: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: true
DisableFormat: false
EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: Always
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IfMacros:
- KJ_IF_MAYBE
IncludeBlocks: Preserve
IncludeCategories:
- Regex: ^"(llvm|llvm-c|clang|clang-c)/
Priority: 2
SortPriority: 0
CaseSensitive: false
- Regex: ^(<|"(gtest|gmock|isl|json)/)
Priority: 3
SortPriority: 0
CaseSensitive: false
- Regex: .*
Priority: 1
SortPriority: 0
CaseSensitive: false
IncludeIsMainRegex: (Test)?$
IncludeIsMainSourceRegex: ""
IndentAccessModifiers: true
IndentCaseBlocks: true
IndentCaseLabels: true
IndentExternBlock: AfterExternBlock
IndentGotoLabels: true
IndentPPDirectives: BeforeHash
IndentRequiresClause: true
IndentWidth: 4
IndentWrappedFunctionNames: true
InsertBraces: false
InsertNewlineAtEOF: false
InsertTrailingCommas: None
IntegerLiteralSeparator:
Binary: 0
BinaryMinDigits: 0
Decimal: 0
DecimalMinDigits: 0
Hex: 0
HexMinDigits: 0
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLines:
AtEndOfFile: false
AtStartOfBlock: true
AtStartOfFile: true
LambdaBodyIndentation: Signature
LineEnding: DeriveLF
MacroBlockBegin: ""
MacroBlockEnd: ""
MainIncludeChar: Quote
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 2
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PPIndentWidth: -1
PackConstructorInitializers: BinPack
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakOpenParenthesis: 0
PenaltyBreakScopeResolution: 500
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyIndentedWhitespace: 0
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Right
QualifierAlignment: Left
ReferenceAlignment: Pointer
ReflowComments: true
RemoveBracesLLVM: true
RemoveParentheses: MultipleParentheses
RemoveSemicolon: false
RequiresClausePosition: OwnLine
RequiresExpressionIndentation: OuterScope
SeparateDefinitionBlocks: Always
ShortNamespaceLines: 1
SkipMacroDefinitionBody: false
SortIncludes: CaseSensitive
SortJavaStaticImport: Before
SortUsingDeclarations: LexicographicNumeric
SpaceAfterCStyleCast: true
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: true
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeJsonColon: false
SpaceBeforeParens: ControlStatements
SpaceBeforeParensOptions:
AfterControlStatements: true
AfterForeachMacros: true
AfterFunctionDeclarationName: true
AfterFunctionDefinitionName: true
AfterIfMacros: true
AfterOverloadedOperator: false
AfterPlacementOperator: true
AfterRequiresInClause: false
AfterRequiresInExpression: false
BeforeNonEmptyParentheses: false
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: Never
SpacesInContainerLiterals: true
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParens: Custom
SpacesInParensOptions:
ExceptDoubleParentheses: false
InConditionalStatements: true
InCStyleCasts: false
InEmptyParentheses: false
Other: true
SpacesInSquareBrackets: true
Standard: Latest
StatementAttributeLikeMacros:
- Q_EMIT
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 4
TableGenBreakInsideDAGArg: DontBreak
UseTab: Never
VerilogBreakBetweenInstancePorts: true
WhitespaceSensitiveMacros:
- BOOST_PP_STRINGIZE
- CF_SWIFT_NAME
- NS_SWIFT_NAME
- PP_STRINGIZE
- STRINGIZE
+733 -54
View File
@@ -1,65 +1,744 @@
// @ts-check
import eslint from '@eslint/js'; import eslint from '@eslint/js';
import tseslint from 'typescript-eslint'; import globals from 'globals';
import stylistic from '@stylistic/eslint-plugin'; import stylistic from '@stylistic/eslint-plugin';
import tseslint from 'typescript-eslint';
import typescript from '@typescript-eslint/eslint-plugin';
import vue from 'eslint-plugin-vue';
export default tseslint.config( const style = {
eslint.configs.recommended,
...tseslint.configs.recommended,
{
'plugins': { 'plugins': {
'@stylistic': stylistic,
'@stylistic/js': stylistic,
'@stylistic/ts': stylistic
},
'files': [
'**/*.ts',
'**/*.js',
'**/*.mjs',
'**/*.cjs',
'**/*.tsx',
'**/*.jsx'
],
'rules': {
'sort-imports': [
'warn',
{
'ignoreCase': false,
'ignoreDeclarationSort': false,
'ignoreMemberSort': false,
'memberSyntaxSortOrder': [
'none',
'all',
'multiple',
'single'
],
'allowSeparatedGroups': false
}
],
// Formatting
'@stylistic/array-bracket-newline': [
'error',
{
'multiline': false,
'minItems': 2
}
],
'@stylistic/array-bracket-spacing': [
'error',
'always'
],
'@stylistic/array-element-newline': [
'error',
{
'consistent': false,
'multiline': false,
'minItems': 2
}
],
'@stylistic/arrow-parens': [
'error',
'as-needed'
],
'@stylistic/arrow-spacing': [
'error',
{
'before': true,
'after': true
}
],
'@stylistic/block-spacing': [
'error',
'always'
],
'@stylistic/brace-style': [
'error',
'1tbs',
{
'allowSingleLine': false
}
],
'@stylistic/comma-dangle': [
'error',
'never'
],
'@stylistic/comma-spacing': [
'error',
{
'before': false,
'after': true
}
],
'@stylistic/comma-style': [
'error',
'last'
],
'@stylistic/dot-location': [
'error',
'property'
],
'@stylistic/function-call-argument-newline': [
'error',
'consistent'
],
'@stylistic/function-call-spacing': [
'error',
'never'
],
'@stylistic/function-paren-newline': [
'error',
'multiline-arguments'
],
'@stylistic/implicit-arrow-linebreak': [
'error',
'beside'
],
'@stylistic/indent': [
'error',
4
],
'@stylistic/indent-binary-ops': [
'error',
4
],
'@stylistic/key-spacing': [
'error',
{
'beforeColon': false,
'afterColon': true
}
],
'@stylistic/keyword-spacing': [
'error',
{
'before': true,
'after': true
}
],
'@stylistic/lines-between-class-members': [
'error',
'always'
],
'@stylistic/max-len': [
'warn',
{
'code': 140,
'comments': 160,
'ignoreComments': false,
'ignoreUrls': true,
'ignoreStrings': true,
'ignoreTemplateLiterals': true,
'ignoreRegExpLiterals': true
}
],
'@stylistic/max-statements-per-line': [
'error',
{
'max': 1
}
],
'@stylistic/multiline-ternary': [
'error',
'always-multiline'
],
'@stylistic/new-parens': [
'error',
'always'
],
'@stylistic/newline-per-chained-call': 'error',
'@stylistic/no-confusing-arrow': 'error',
'@stylistic/no-extra-parens': [
'error',
'all',
{
'nestedBinaryExpressions': false,
'ternaryOperandBinaryExpressions': false,
'ignoreJSX': 'multi-line',
'nestedConditionalExpressions': false
}
],
'@stylistic/no-extra-semi': 'error',
'@stylistic/no-floating-decimal': 'error',
'@stylistic/no-mixed-operators': 'error',
'@stylistic/no-mixed-spaces-and-tabs': 'error',
'@stylistic/no-multi-spaces': 'error',
'@stylistic/no-multiple-empty-lines': [
'error',
{
'max': 3,
'maxEOF': 2
}
],
'@stylistic/no-tabs': 'error',
'@stylistic/no-trailing-spaces': 'error',
'@stylistic/no-whitespace-before-property': 'error',
'@stylistic/object-curly-newline': [
'error',
{
'multiline': true,
'minProperties': 1
}
],
'@stylistic/object-curly-spacing': [
'error',
'always'
],
'@stylistic/object-property-newline': 'error',
'@stylistic/one-var-declaration-per-line': 'error',
'@stylistic/operator-linebreak': [
'error',
'before'
],
'@stylistic/padded-blocks': [
'error',
{
'blocks': 'never',
'classes': 'always',
'switches': 'never'
}
],
// Padding lines. The most in-depth part of this config
'@stylistic/padding-line-between-statements': [
'error',
// Variables, Constants
{
'blankLine': 'never',
'prev': 'var',
'next': 'var'
},
{
'blankLine': 'never',
'prev': 'let',
'next': 'let'
},
{
'blankLine': 'never',
'prev': 'const',
'next': 'const'
},
{
'blankLine': 'always',
'prev': 'var',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'cjs-import',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'import',
'let',
'return',
'switch',
'throw',
'try',
'var',
'with'
]
},
{
'blankLine': 'always',
'prev': 'let',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'cjs-import',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'import',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
{
'blankLine': 'always',
'prev': 'const',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'cjs-import',
'class',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'import',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
// Import
{
'blankLine': 'never',
'prev': 'import',
'next': 'import'
},
{
'blankLine': 'never',
'prev': 'cjs-import',
'next': 'cjs-import'
},
{
'blankLine': 'always',
'prev': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
],
'next': 'cjs-import'
},
{
'blankLine': 'always',
'prev': 'cjs-import',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
{
'blankLine': 'always',
'prev': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
],
'next': 'import'
},
{
'blankLine': 'always',
'prev': 'import',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
// If
{
'blankLine': 'always',
'prev': '*',
'next': 'if'
},
{
'blankLine': 'always',
'prev': 'if',
'next': '*'
},
// For
{
'blankLine': 'always',
'prev': '*',
'next': 'for'
},
{
'blankLine': 'always',
'prev': 'for',
'next': '*'
},
// While
{
'blankLine': 'always',
'prev': '*',
'next': 'while'
},
{
'blankLine': 'always',
'prev': 'while',
'next': '*'
},
// Functions
{
'blankLine': 'always',
'prev': '*',
'next': 'function'
},
{
'blankLine': 'always',
'prev': 'function',
'next': '*'
},
// Block Statements
{
'blankLine': 'always',
'prev': '*',
'next': 'block-like'
},
{
'blankLine': 'always',
'prev': 'block-like',
'next': '*'
},
// Switch
{
'blankLine': 'always',
'prev': '*',
'next': 'switch'
},
{
'blankLine': 'always',
'prev': 'switch',
'next': '*'
},
// Try-Catch
{
'blankLine': 'always',
'prev': '*',
'next': 'try'
},
{
'blankLine': 'always',
'prev': 'try',
'next': '*'
},
// Throw
{
'blankLine': 'always',
'prev': '*',
'next': 'throw'
},
{
'blankLine': 'always',
'prev': 'throw',
'next': '*'
},
// Return
{
'blankLine': 'never',
'prev': 'return',
'next': '*'
},
{
'blankLine': 'always',
'prev': '*',
'next': 'return'
},
// Export
{
'blankLine': 'always',
'prev': '*',
'next': 'export'
},
{
'blankLine': 'always',
'prev': 'export',
'next': '*'
},
{
'blankLine': 'always',
'prev': '*',
'next': 'cjs-export'
},
{
'blankLine': 'always',
'prev': 'cjs-export',
'next': '*'
},
// Classes
{
'blankLine': 'always',
'prev': '*',
'next': 'class'
},
{
'blankLine': 'always',
'prev': 'class',
'next': '*'
}
],
'@stylistic/quote-props': [
'error',
'always'
],
'@stylistic/quotes': [
'error',
'single'
],
'@stylistic/rest-spread-spacing': [
'error',
'never'
],
'@stylistic/semi': [
'error',
'always'
],
'@stylistic/semi-spacing': [
'error',
{
'before': false,
'after': true
}
],
'@stylistic/semi-style': [
'error',
'last'
],
'@stylistic/space-before-blocks': [
'error',
'always'
],
'@stylistic/space-before-function-paren': [
'error',
'always'
],
'@stylistic/space-in-parens': [
'error',
'always'
],
'@stylistic/space-infix-ops': [
'error',
{
'int32Hint': false
}
],
'@stylistic/space-unary-ops': 'error',
'@stylistic/spaced-comment': [
'error',
'always'
],
'@stylistic/switch-colon-spacing': 'error',
'@stylistic/template-curly-spacing': [
'error',
'always'
],
'@stylistic/template-tag-spacing': [
'error',
'always'
],
'@stylistic/type-generic-spacing': 'error',
'@stylistic/type-named-tuple-spacing': 'error',
'@stylistic/wrap-iife': [
'error',
'inside'
],
'@stylistic/wrap-regex': 'error',
'@stylistic/ts/type-annotation-spacing': 'error'
}
};
/** @type {import('eslint').Linter.Config} */
export default tseslint.config(
// Base JavaScript rules
eslint.configs.recommended,
tseslint.configs.recommended,
style,
// Vue support (including TS and JSX inside SFCs)
{
'files': [ '**/*.vue' ],
'languageOptions': {
'sourceType': 'module',
'ecmaVersion': 'latest',
'globals': globals.browser,
'parserOptions': {
'parser': tseslint.parser
}
},
'plugins': {
'vue': vue,
'@stylistic': stylistic,
'@stylistic/js': stylistic, '@stylistic/js': stylistic,
'@stylistic/ts': stylistic, '@stylistic/ts': stylistic,
'@typescript-eslint': typescript
}, },
'extends': [
eslint.configs.recommended,
...vue.configs['flat/recommended']
],
'rules': { 'rules': {
// Formatting ...typescript.configs.recommended.rules,
'@stylistic/js/array-bracket-newline': [ 'error', { 'multiline': true, 'minItems': 4 } ], ...style.rules,
'@stylistic/js/array-bracket-spacing': [ 'error', 'always' ],
'@stylistic/js/array-element-newline': [ 'error', { 'multiline': true, 'minItems': 4 } ], // Vue specific rules
'@stylistic/js/arrow-parens': [ 'error', 'always' ], '@stylistic/indent': 'off',
'@stylistic/js/arrow-spacing': [ 'error', { 'before': true, 'after': true } ], 'vue/html-indent': [
'@stylistic/js/block-spacing': [ 'error', 'always' ], 'error',
'@stylistic/js/brace-style': [ 'error', '1tbs' ], 4
'@stylistic/js/comma-spacing': [ 'error', { 'before': false, 'after': true } ], ],
'@stylistic/js/comma-style': [ 'error', 'last' ], 'vue/html-comment-indent': [
'@stylistic/js/dot-location': [ 'error', 'property' ], 'error',
'@stylistic/js/eol-last': [ 'error', 'always' ], 4
'@stylistic/js/function-call-spacing': [ 'error', 'never' ], ],
'@stylistic/js/implicit-arrow-linebreak': [ 'error', 'beside' ], 'vue/script-indent': [
'@stylistic/js/indent': [ 'error', 4 ], 'error',
'@stylistic/js/key-spacing': [ 'error', { 'beforeColon': false, 'afterColon': true } ], 4,
'@stylistic/js/keyword-spacing': [ 'error', { 'before': true, 'after': true } ], {
'@stylistic/js/lines-between-class-members': [ 'error', 'always' ], 'baseIndent': 1,
'@stylistic/js/new-parens': [ 'error', 'always' ], 'switchCase': 1
'@stylistic/js/no-extra-parens': [ 'error', 'all' ], }
'@stylistic/js/no-extra-semi': 'error', ],
'@stylistic/js/no-floating-decimal': 'error', 'vue/html-self-closing': [
'@stylistic/js/no-mixed-operators': 'error', 'error',
'@stylistic/js/no-mixed-spaces-and-tabs': 'error', {
'@stylistic/js/no-multi-spaces': 'error', 'html': {
'@stylistic/js/no-trailing-spaces': 'error', 'void': 'never',
'@stylistic/js/no-whitespace-before-property': 'error', 'normal': 'never',
'@stylistic/js/object-curly-newline': [ 'error', { 'multiline': true, 'minProperties': 3 } ], 'component': 'always'
'@stylistic/js/object-curly-spacing': [ 'error', 'always' ], },
'@stylistic/js/one-var-declaration-per-line': 'error', 'svg': 'always',
'@stylistic/js/quote-props': [ 'error', 'always' ], 'math': 'never'
'@stylistic/js/quotes': [ 'error', 'single' ], }
'@stylistic/js/rest-spread-spacing': [ 'error', 'never' ], ],
'@stylistic/js/semi': [ 'error', 'always' ], 'vue/max-attributes-per-line': [
'@stylistic/js/semi-spacing': [ 'error', { 'before': false, 'after': true } ], 'error',
'@stylistic/js/semi-style': [ 'error', 'last' ], {
'@stylistic/js/space-before-blocks': [ 'error', 'always' ], 'singleline': 3,
'@stylistic/js/space-before-function-paren': [ 'error', 'always' ], 'multiline': 1
'@stylistic/js/space-in-parens': [ 'error', 'always' ], }
'@stylistic/js/space-infix-ops': [ 'error', { 'int32Hint': false } ], ]
'@stylistic/js/space-unary-ops': 'error',
'@stylistic/js/spaced-comment': [ 'error', 'always' ],
'@stylistic/js/switch-colon-spacing': 'error',
'@stylistic/js/template-curly-spacing': [ 'error', 'always' ],
'@stylistic/js/wrap-iife': [ 'error', 'inside' ],
'@stylistic/js/wrap-regex': 'error',
'@stylistic/ts/type-annotation-spacing': 'error',
} }
} }
); );
+2
View File
@@ -0,0 +1,2 @@
paths:
- /home/janis/projects/dotfiles/config/lint/latexfmt.yaml
+82
View File
@@ -0,0 +1,82 @@
# Use spaces for indent (because f*k tabs)
defaultIndent: " "
# Limit Number of backups
maxNumberOfBackups: 3
verbatimEnvironments:
verbatim: 1
lstlisting: 1
minted: 1
code: 1
indentRules:
recall: " "
remarks: " "
remark: " "
guides: " "
properties: " "
restrictions: " "
limitations: " "
terms: " "
notation: " "
usage: " "
task: " "
proof: " "
general: " "
simplebox: " "
definition: " "
theorem: " "
lemma: " "
corollary: " "
axiom: " "
fact: " "
proposition: " "
example: " "
formula: " "
conjugation: " "
forms: " "
lookForAlignDelims:
tables:
delims: 1
alignDoubleBackSlash: 1
spacesBeforeDoubleBackSlash: 1
multiColumnGrouping: 0
alignRowsWithoutMaxDelims: 1
spacesBeforeAmpersand: 1
spacesAfterAmpersand: 1
justification: left
alignFinalDoubleBackSlash: 0
dontMeasure: 0
delimiterRegEx: (?<!\\)(&)
delimiterJustification: left
lookForChildCodeBlocks: 1
alignContentAfterDoubleBackSlash: 0
spacesAfterDoubleBackSlash: 1
specialBeginEnd:
If:
begin: '\\If'
middle:
- '\\ElsIf'
- '\\Else'
end: '\\EndIf'
lookForThis: 1
For:
begin: '\\For'
end: '\\EndFor'
lookForThis: 1
Procedure:
begin: '\\Procedure'
end: '\\EndProcedure'
lookForThis: 1
Function:
begin: '\\Function'
end: '\\EndFunction'
lookForThis: 1
While:
begin: '\\While'
end: '\\EndWhile'
lookForThis: 1
specialBeforeCommand: 1
+8
View File
@@ -0,0 +1,8 @@
{
"devDependencies": {
"@eslint/js": "^9.28.0",
"@stylistic/eslint-plugin": "^4.4.1",
"eslint-plugin-vue": "^10.2.0",
"typescript-eslint": "^8.33.1"
}
}
File renamed without changes.
-13
View File
@@ -1,13 +0,0 @@
/** Basic config file **/
configuration {
show-icons: true;
icon-theme: "Candy";
display-drun: "";
display-run: "🏃🏽‍♂️ ";
display-window: "🗔 ";
display-combi: "🔎 ";
dpi: 160;
}
@theme "style.rasi"
+5 -5
View File
@@ -2,9 +2,9 @@
background: #141414; background: #141414;
background-selected: #1E1E1E; background-selected: #1E1E1E;
foreground: #E6E6E6; foreground: #E6E6E6;
accent: #591641; accent: #5C9B3F;
accent-two: #97103A; accent-two: #1674B9;
// border-color: #2D2057; // border-color: #282828;
inactive: #C8C8C8; inactive: #C8C8C8;
spacing: 2; spacing: 2;
width: 30em; width: 30em;
@@ -18,8 +18,8 @@
border: 1px; border: 1px;
border-radius: 10px; border-radius: 10px;
padding: 0; padding: 0;
location: west; location: center;
anchor: west; anchor: center;
margin: 0; margin: 0;
} }
+2 -2
View File
@@ -22,11 +22,11 @@ button {
} }
button:hover { button:hover {
background-color: rgba(151, 16, 58, 0.5); background-color: rgba(22, 116, 185, 0.5);
} }
button:focus { button:focus {
background-color: rgb(151, 16, 58); background-color: rgb(22, 116, 185);
color: rgb(230, 230, 230); color: rgb(230, 230, 230);
} }
@@ -0,0 +1,11 @@
[filechooser]
cmd=yazi-wrapper.sh
default_dir=$HOME
; Uncomment to skip creating destination save files with instructions in them
; create_help_file=0
; Uncomment and edit the line below to change the terminal emulator command
; env=TERMCMD=foot
; Mode must be one of 'suggested', 'default', or 'last'.
open_mode=suggested
save_mode=suggested
+2
View File
@@ -0,0 +1,2 @@
[preferred]
org.freedesktop.impl.portal.FileChooser=termfilechooser
-21
View File
@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2023 yazi-rs
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -1,21 +0,0 @@
The MIT License (MIT)
Copyright (c) 2013-present Dracula Theme
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -1,36 +0,0 @@
<div align="center">
<img src="https://github.com/sxyazi/yazi/blob/main/assets/logo.png?raw=true" alt="Yazi logo" width="20%">
</div>
<h3 align="center">
Dracula Flavor for <a href="https://github.com/sxyazi/yazi">Yazi</a>
</h3>
## 👀 Preview
<img src="preview.png" width="600" />
## 🎨 Installation
```sh
ya pack -a yazi-rs/flavors:dracula
```
## ⚙️ Usage
Set the content of your `theme.toml` to enable it as your _dark_ flavor:
```toml
[flavor]
dark = "dracula"
```
Make sure your `theme.toml` doesn't contain anything other than `[flavor]`, unless you want to override certain styles of this flavor.
See the [Yazi flavor documentation](https://yazi-rs.github.io/docs/flavors/overview) for more details.
## 📜 License
The flavor is MIT-licensed, and the included tmTheme is also MIT-licensed.
Check the [LICENSE](LICENSE) and [LICENSE-tmtheme](LICENSE-tmtheme) file for more details.
@@ -1,170 +0,0 @@
# vim:fileencoding=utf-8:foldmethod=marker
# : Manager {{{
[manager]
cwd = { fg = "#8be9fd" }
# Hovered
hovered = { reversed = true }
preview_hovered = { underline = true }
# Find
find_keyword = { fg = "#f1fa8c", bold = true, italic = true, underline = true }
find_position = { fg = "#ff79c6", bg = "reset", bold = true, italic = true }
# Marker
marker_copied = { fg = "#50fa7b", bg = "#50fa7b" }
marker_cut = { fg = "#ff5555", bg = "#ff5555" }
marker_marked = { fg = "#8be9fd", bg = "#8be9fd" }
marker_selected = { fg = "#f1fa8c", bg = "#f1fa8c" }
# Tab
tab_active = { reversed = true }
tab_inactive = {}
tab_width = 1
# Count
count_copied = { fg = "#282a36", bg = "#50fa7b" }
count_cut = { fg = "#282a36", bg = "#ff5555" }
count_selected = { fg = "#282a36", bg = "#f1fa8c" }
# Border
border_symbol = "│"
border_style = { fg = "#7282b5" }
# : }}}
# : Mode {{{
[mode]
normal_main = { fg = "#282a36", bg = "#bd93f9", bold = true }
normal_alt = { fg = "#bd93f9", bg = "#44475a" }
# Select mode
select_main = { fg = "#282a36", bg = "#8be9fd", bold = true }
select_alt = { fg = "#8be9fd", bg = "#44475a" }
# Unset mode
unset_main = { fg = "#282a36", bg = "#ffb86c", bold = true }
unset_alt = { fg = "#ffb86c", bg = "#44475a" }
# : }}}
# : Status bar {{{
[status]
# Permissions
perm_sep = { fg = "#7282b5" }
perm_type = { fg = "#bd93f9" }
perm_read = { fg = "#f1fa8c" }
perm_write = { fg = "#ff5555" }
perm_exec = { fg = "#50fa7b" }
# Progress
progress_label = { fg = "#ffffff", bold = true }
progress_normal = { fg = "#bd93f9", bg = "#63667d" }
progress_error = { fg = "#ff5555", bg = "#63667d" }
# : }}}
# : Pick {{{
[pick]
border = { fg = "#bd93f9" }
active = { fg = "#ff79c6", bold = true }
inactive = {}
# : }}}
# : Input {{{
[input]
border = { fg = "#bd93f9" }
title = {}
value = {}
selected = { reversed = true }
# : }}}
# : Completion {{{
[cmp]
border = { fg = "#bd93f9" }
# : }}}
# : Tasks {{{
[tasks]
border = { fg = "#bd93f9" }
title = {}
hovered = { fg = "#ff79c6", underline = true }
# : }}}
# : Which {{{
[which]
mask = { bg = "#44475a" }
cand = { fg = "#8be9fd" }
rest = { fg = "#8998c9" }
desc = { fg = "#ff79c6" }
separator = "  "
separator_style = { fg = "#83869c" }
# : }}}
# : Help {{{
[help]
on = { fg = "#8be9fd" }
run = { fg = "#ff79c6" }
hovered = { reversed = true, bold = true }
footer = { fg = "#44475a", bg = "#f8f8f2" }
# : }}}
# : Notify {{{
[notify]
title_info = { fg = "#50fa7b" }
title_warn = { fg = "#f1fa8c" }
title_error = { fg = "#ff5555" }
# : }}}
# : File-specific styles {{{
[filetype]
rules = [
# Images
{ mime = "image/*", fg = "#8be9fd" },
# Media
{ mime = "{audio,video}/*", fg = "#f1fa8c" },
# Archives
{ mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}", fg = "#ff79c6" },
# Documents
{ mime = "application/{pdf,doc,rtf}", fg = "#50fa7b" },
# Fallback
{ name = "*", fg = "#f8f8f2" },
{ name = "*/", fg = "#bd93f9" }
]
# : }}}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 835 KiB

@@ -1,940 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Dracula Theme v1.4.3
#
# https://github.com/dracula/sublime
#
# Copyright 2013-present, All rights reserved
#
# Code licensed under the MIT license
#
# @author Zeno Rocha <hi@zenorocha.com>
-->
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>name</key>
<string>Dracula</string>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>background</key>
<string>#282a36</string>
<key>caret</key>
<string>#f8f8f0</string>
<key>block_caret</key>
<string>#999a9e</string>
<key>foreground</key>
<string>#f8f8f2</string>
<key>invisibles</key>
<string>#3B3A32</string>
<key>lineHighlight</key>
<string>#44475a</string>
<key>selection</key>
<string>#44475a</string>
<key>findHighlight</key>
<string>#effb7b</string>
<key>findHighlightForeground</key>
<string>#000000</string>
<key>selectionBorder</key>
<string>#222218</string>
<key>activeGuide</key>
<string>#9D550FB0</string>
<key>bracketsForeground</key>
<string>#F8F8F2A5</string>
<key>bracketsOptions</key>
<string>underline</string>
<key>bracketContentsForeground</key>
<string>#F8F8F2A5</string>
<key>bracketContentsOptions</key>
<string>underline</string>
<key>tagsOptions</key>
<string>stippled_underline</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Comment</string>
<key>scope</key>
<string>comment</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#6272a4</string>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String</string>
<key>scope</key>
<string>string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f1fa8c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Number</string>
<key>scope</key>
<string>constant.numeric</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#bd93f9</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Built-in constant</string>
<key>scope</key>
<string>constant.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#bd93f9</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>User-defined constant</string>
<key>scope</key>
<string>constant.character, constant.other</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#bd93f9</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable</string>
<key>scope</key>
<string>variable</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Ruby's @variable</string>
<key>scope</key>
<string>variable.other.readwrite.instance</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#ffb86c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>String interpolation</string>
<key>scope</key>
<string>constant.character.escaped, constant.character.escape, string source, string source.ruby</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#ff79c6</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Ruby Regexp</string>
<key>scope</key>
<string>source.ruby string.regexp.classic.ruby,source.ruby string.regexp.mod-r.ruby</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#ff5555</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Keyword</string>
<key>scope</key>
<string>keyword</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff79c6</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage</string>
<key>scope</key>
<string>storage</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#ff79c6</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage type</string>
<key>scope</key>
<string>storage.type</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#8be9fd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage Type Namespace</string>
<key>scope</key>
<string>storage.type.namespace</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#8be9fd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage Type Class</string>
<key>scope</key>
<string>storage.type.class</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#ff79c6</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Class name</string>
<key>scope</key>
<string>entity.name.class</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>underline</string>
<key>foreground</key>
<string>#8be9fd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Meta Path</string>
<key>scope</key>
<string>meta.path</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>underline</string>
<key>foreground</key>
<string>#66d9ef</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Inherited class</string>
<key>scope</key>
<string>entity.other.inherited-class</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic underline</string>
<key>foreground</key>
<string>#8be9fd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function name</string>
<key>scope</key>
<string>entity.name.function</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#50fa7b</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Function argument</string>
<key>scope</key>
<string>variable.parameter</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#ffb86c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag name</string>
<key>scope</key>
<string>entity.name.tag</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#ff79c6</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Tag attribute</string>
<key>scope</key>
<string>entity.other.attribute-name</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#50fa7b</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library function</string>
<key>scope</key>
<string>support.function</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#8be9fd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library constant</string>
<key>scope</key>
<string>support.constant</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#6be5fd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library class&#x2f;type</string>
<key>scope</key>
<string>support.type, support.class</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#66d9ef</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Library variable</string>
<key>scope</key>
<string>support.other.variable</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string></string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Support Other Namespace</string>
<key>scope</key>
<string>support.other.namespace</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#66d9ef</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid</string>
<key>scope</key>
<string>invalid</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#ff79c6</string>
<key>fontStyle</key>
<string></string>
<key>foreground</key>
<string>#F8F8F0</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Invalid deprecated</string>
<key>scope</key>
<string>invalid.deprecated</string>
<key>settings</key>
<dict>
<key>background</key>
<string>#bd93f9</string>
<key>foreground</key>
<string>#F8F8F0</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON String</string>
<key>scope</key>
<string>meta.structure.dictionary.json string.quoted.double.json</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#CFCFC2</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>diff.header</string>
<key>scope</key>
<string>meta.diff, meta.diff.header</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#6272a4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>diff.deleted</string>
<key>scope</key>
<string>markup.deleted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff79c6</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>diff.inserted</string>
<key>scope</key>
<string>markup.inserted</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#50fa7b</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>diff.changed</string>
<key>scope</key>
<string>markup.changed</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#E6DB74</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>constant.numeric.line-number.find-in-files - match</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#bd93f9</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>entity.name.filename</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#E6DB74</string>
</dict>
</dict>
<dict>
<key>scope</key>
<string>message.error</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#F83333</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON Punctuation</string>
<key>scope</key>
<string>punctuation.definition.string.begin.json - meta.structure.dictionary.value.json, punctuation.definition.string.end.json - meta.structure.dictionary.value.json</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#EEEEEE</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON Structure</string>
<key>scope</key>
<string>meta.structure.dictionary.json string.quoted.double.json</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8be9fd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON String</string>
<key>scope</key>
<string>meta.structure.dictionary.value.json string.quoted.double.json</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#f1fa8c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON: 6 deep</string>
<key>scope</key>
<string>meta meta meta meta meta meta meta.structure.dictionary.value string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#50fa7b</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON: 5 deep</string>
<key>scope</key>
<string>meta meta meta meta meta meta.structure.dictionary.value string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffb86c</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON: 4 deep</string>
<key>scope</key>
<string>meta meta meta meta meta.structure.dictionary.value string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff79c6</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON: 3 deep</string>
<key>scope</key>
<string>meta meta meta meta.structure.dictionary.value string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#bd93f9</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON: 2 deep</string>
<key>scope</key>
<string>meta meta meta.structure.dictionary.value string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#50fa7b</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>JSON: 1 deep</string>
<key>scope</key>
<string>meta meta.structure.dictionary.value string</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffb86c</string>
</dict>
</dict>
<!-- Markdown Tweaks -->
<dict>
<key>name</key>
<string>Markup: strike</string>
<key>scope</key>
<string>markup.strike</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#FFB86C</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markup: bold</string>
<key>scope</key>
<string>markup.bold</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>bold</string>
<key>foreground</key>
<string>#FFB86C</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markup: italic</string>
<key>scope</key>
<string>markup.italic</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#FFB86C</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: heading</string>
<key>scope</key>
<string>markup.heading</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8BE9FD</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: List Items Punctuation</string>
<key>scope</key>
<string>punctuation.definition.list_item.markdown</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#FF79C6</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: Blockquote</string>
<key>scope</key>
<string>markup.quote</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#6272A4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: Blockquote Punctuation</string>
<key>scope</key>
<string>punctuation.definition.blockquote.markdown</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>background</key>
<string>#6272A4</string>
<key>foreground</key>
<string>#6272A4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: Separator</string>
<key>scope</key>
<string>meta.separator</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#6272A4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markup: raw inline</string>
<key>scope</key>
<string>text.html.markdown markup.raw.inline</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#50FA7B</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markup: underline</string>
<key>scope</key>
<string>markup.underline</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>underline</string>
<key>foreground</key>
<string>#BD93F9</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markup: Raw block</string>
<key>scope</key>
<string>markup.raw.block</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#CFCFC2</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: Raw Block fenced source</string>
<key>scope</key>
<string>markup.raw.block.fenced.markdown source</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#F8F8F2</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: Fenced Bode Block</string>
<key>scope</key>
<string>punctuation.definition.fenced.markdown, variable.language.fenced.markdown</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#6272A4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Markdown: Fenced Language</string>
<key>scope</key>
<string>variable.language.fenced.markdown</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
<string>italic</string>
<key>foreground</key>
<string>#6272A4</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation Accessor</string>
<key>scope</key>
<string>punctuation.accessor</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#FF79C6</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Meta Function Return Type</string>
<key>scope</key>
<string>meta.function.return-type</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#FF79C6</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation Section Block Begin</string>
<key>scope</key>
<string>punctuation.section.block.begin</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation Section Block End</string>
<key>scope</key>
<string>punctuation.section.block.end</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation Section Embedded Begin</string>
<key>scope</key>
<string>punctuation.section.embedded.begin</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff79c6</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation Section Embedded End</string>
<key>scope</key>
<string>punctuation.section.embedded.end</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff79c6</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Punctuation Separator Namespace</string>
<key>scope</key>
<string>punctuation.separator.namespace</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff79c6</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable Function</string>
<key>scope</key>
<string>variable.function</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#50fa7b</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable Other</string>
<key>scope</key>
<string>variable.other</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Variable Language</string>
<key>scope</key>
<string>variable.language</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#bd93f9</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Entity Name Module Ruby</string>
<key>scope</key>
<string>entity.name.module.ruby</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8be9fd</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Entity Name Constant Ruby</string>
<key>scope</key>
<string>entity.name.constant.ruby</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#bd93f9</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Support Function Builtin Ruby</string>
<key>scope</key>
<string>support.function.builtin.ruby</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ffffff</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Storage Type Namespace CS</string>
<key>scope</key>
<string>storage.type.namespace.cs</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#ff79c6</string>
</dict>
</dict>
<dict>
<key>name</key>
<string>Entity Name Namespace CS</string>
<key>scope</key>
<string>entity.name.namespace.cs</string>
<key>settings</key>
<dict>
<key>foreground</key>
<string>#8be9fd</string>
</dict>
</dict>
</array>
<key>uuid</key>
<string>83091B89-765E-4F0D-9275-0EC6CB084126</string>
<key>colorSpaceName</key>
<string>sRGB</string>
<key>semanticClass</key>
<string>theme.dracula</string>
<key>author</key>
<string>Zeno Rocha</string>
</dict>
</plist>
@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2023 - sxyazi
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2022 Himanshu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -1,37 +0,0 @@
<div align="center">
<img src="https://github.com/sxyazi/yazi/blob/main/assets/logo.png?raw=true" alt="Yazi logo" width="20%">
</div>
<h3 align="center">
Tokyo Night Flavor for <a href="https://github.com/sxyazi/yazi">Yazi</a>
</h3>
## 👀 Preview
<img src="preview.png" width="600" />
## 🎨 Installation
```bash
# Linux/macOS
git clone https://github.com/BennyOe/tokyo-night.yazi.git ~/.config/yazi/flavors/tokyo-night.yazi
# Windows
git clone https://github.com/BennyOe/tokyo-night.yazi.git %AppData%\yazi\config\flavors\tokyo-night.yazi
```
## ⚙️ Usage
Add the these lines to your `theme.toml` configuration file to use it:
```toml
[flavor]
use = "tokyo-night"
```
## 📜 License
The flavor is MIT-licensed, and the included tmTheme is also MIT-licensed.
Check the [LICENSE](LICENSE) and [LICENSE-tmtheme](LICENSE-tmtheme) file for more details.
@@ -1,167 +0,0 @@
# : Manager {{{
[manager]
cwd = { fg = "#7aa2f7" } # Blue
# Hovered
hovered = { reversed = true }
preview_hovered = { underline = true }
# Find
find_keyword = { fg = "#f7768e", bold = true, italic = true, underline = true } # Red
find_position = { fg = "#bb9af7", bg = "reset", bold = true, italic = true } # Magenta
# Marker
marker_copied = { fg = "#9ece6a", bg = "#9ece6a" } # Green
marker_cut = { fg = "#e0af68", bg = "#f7768e" } # Red
marker_marked = { fg = "#7aa2f7", bg = "#7dcfff" } # Cyan
marker_selected = { fg = "#e0af68", bg = "#e0af68" } # Yellow
# Tab
tab_active = { bg = "#282C34", fg = "#7aa2f7" } # Darkened background, Blue text
tab_inactive = {}
tab_width = 1
# Count
count_copied = { fg = "#414868", bg = "#9ece6a" } # Darkened black on Green
count_cut = { fg = "#414868", bg = "#e0af68" } # Darkened black on Yellow
count_selected = { fg = "#414868", bg = "#7aa2f7" } # Darkened black on Blue
# Border
border_symbol = "│"
border_style = { fg = "#414868" } # Darkened black
# : }}}
# : Status {{{
[status]
separator_open = ""
separator_close = ""
separator_style = { fg = "#7aa2f7", bg = "#414868" } # Blue on Darkened black
# Mode
mode_normal = { fg = "#414868", bg = "#7aa2f7", bold = true } # Darkened black on Blue
mode_select = { fg = "#414868", bg = "#9ece6a", bold = true } # Darkened black on Green
mode_unset = { fg = "#414868", bg = "#bb9af7", bold = true } # Darkened black on Magenta
# Progress
progress_label = { fg = "#a9b1d6", bold = true } # White
progress_normal = { fg = "#7aa2f7", bg = "#414868" } # Blue on Darkened black
progress_error = { fg = "#f7768e", bg = "#414868" } # Red on Darkened black
# Permissions
permissions_t = { fg = "#7aa2f7" } # Blue
permissions_r = { fg = "#9ece6a" } # Green
permissions_w = { fg = "#e0af68" } # Yellow
permissions_x = { fg = "#f7768e" } # Red
permissions_s = { fg = "#bb9af7" } # Magenta
# : }}}
# : Select {{{
[select]
border = { fg = "#7aa2f7" } # Blue
active = { fg = "#bb9af7", bold = true } # Magenta
inactive = {}
# : }}}
# : Input {{{
[input]
border = { fg = "#7aa2f7" } # Blue
title = {}
value = {}
selected = { reversed = true }
# : }}}
# : Completion {{{
[completion]
border = { fg = "#7aa2f7" } # Blue
# : }}}
# : Tasks {{{
[tasks]
border = { fg = "#7aa2f7" } # Blue
title = {}
hovered = { fg = "#bb9af7", underline = true } # Magenta
# : }}}
# : Which {{{
[which]
mask = { bg = "#414868" } # Darkened black
cand = { fg = "#9ece6a" } # Green
rest = { fg = "#a9b1d6" } # White
desc = { fg = "#bb9af7" } # Magenta
separator = "  "
separator_style = { fg = "#626880" } # Darkened gray
# : }}}
# : Help {{{
[help]
on = { fg = "#9ece6a" } # Green
run = { fg = "#bb9af7" } # Magenta
hovered = { reversed = true, bold = true }
footer = { fg = "#a9b1d6", bg = "#c6d0f5" } # White on Light gray
# : }}}
# : Notify {{{
[notify]
title_info = { fg = "#9ece6a" } # Green
title_warn = { fg = "#f7768e" } # Red
title_error = { fg = "#e0af68" } # Yellow
# : }}}
# : File-specific styles {{{
[filetype]
rules = [
# Images
{ mime = "image/*", fg = "#e0af68" }, # Yellow
# Media
{ mime = "video/*", fg = "#f7768e" }, # Red
{ mime = "audio/*", fg = "#f7768e" }, # Red
# Archives
{ mime = "application/zip", fg = "#bb9af7" }, # Magenta
{ mime = "application/x-tar", fg = "#bb9af7" }, # Magenta
{ mime = "application/x-bzip*", fg = "#bb9af7" }, # Magenta
{ mime = "application/x-bzip2", fg = "#bb9af7" }, # Magenta
{ mime = "application/x-7z-compressed", fg = "#bb9af7" }, # Magenta
{ mime = "application/x-rar", fg = "#bb9af7" }, # Magenta
{ mime = "application/x-xz", fg = "#bb9af7" }, # Magenta
# Documents
{ mime = "application/doc", fg = "#9ece6a" }, # Green
{ mime = "application/pdf", fg = "#9ece6a" }, # Green
{ mime = "application/rtf", fg = "#9ece6a" }, # Green
{ mime = "application/vnd.*", fg = "#9ece6a" }, # Green
# Fallback
{ name = "*", fg = "#c6d0f5" }, # Light gray
{ name = "*/", fg = "#7aa2f7" } # Blue
]
# : }}}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 712 KiB

File diff suppressed because it is too large. Load diff
@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2024 Alexander Bays
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2024 Alexander Bays
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -1,13 +0,0 @@
# vscode-dark-modern
[themes/](../) · [vscode-dark-plus](../vscode-dark-plus.yazi/) · [vscode-light-modern](../vscode-light-modern.yazi/) · [vscode-light-plus](../vscode-light-plus.yazi/)
![vscode-dark-modern](./img/1.png)
![vscode-dark-modern](./img/2.png)
![vscode-dark-modern](./img/3.png)
![vscode-dark-modern](./img/4.png)
![vscode-dark-modern](./img/5.png)
@@ -1,186 +0,0 @@
# A TOML linter such as https://taplo.tamasfe.dev/ can use this schema to validate your config.
# If you encounter any issues, please make an issue at https://github.com/yazi-rs/schemas.
"$schema" = "https://yazi-rs.github.io/schemas/theme.json"
# vscode-dark-modern
# https://github.com/956MB/vscode.yazi/blob/main/themes/vscode-dark-modern/
#
# A theme inspired by Visual Studio Code's Dark Modern theme.
[colors]
background = "#1F1F1F"
foreground = "#D4D4D4"
selection = "#264F78"
cursor = "#AEAFAD"
black = "#000000"
red = "#F44747"
green = "#6A9955"
yellow = "#D7BA7D"
blue = "#569CD6"
magenta = "#C586C0"
cyan = "#4EC9B0"
white = "#D4D4D4"
bright_black = "#808080"
bright_red = "#F44747"
bright_green = "#6A9955"
bright_yellow = "#DCDCAA"
bright_blue = "#569CD6"
bright_magenta = "#C586C0"
bright_cyan = "#4EC9B0"
bright_white = "#FFFFFF"
[manager]
cwd = { fg = "cyan" }
# Hovered
hovered = { fg = "#D4D4D4", bg = "#264F78" }
preview_hovered = { underline = true }
# Find
find_keyword = { fg = "#DCDCAA", bold = true, italic = true, underline = true }
find_position = { fg = "#C586C0", bg = "#1F1F1F", bold = true, italic = true }
# Marker
marker_copied = { fg = "#73C991", bg = "#73C991" }
marker_cut = { fg = "#F44747", bg = "#F44747" }
marker_marked = { fg = "#4EC9B0", bg = "#4EC9B0" }
marker_selected = { fg = "#D7BA7D", bg = "#D7BA7D" }
# Tab
tab_active = { fg = "#D4D4D4", bg = "#1F1F1F" }
tab_inactive = { fg = "#D4D4D4", bg = "#2D2D2D" }
tab_width = 1
# Count
count_copied = { fg = "#1F1F1F", bg = "#73C991" }
count_cut = { fg = "#1F1F1F", bg = "#F44747" }
count_selected = { fg = "#1F1F1F", bg = "#D7BA7D" }
# Border
border_symbol = "│"
border_style = { fg = "#444444" }
# Highlighting
syntect_theme = "./tmtheme.xml"
# Cursor
cursor_symbol = "█"
cursor = { fg = "#1F1F1F", bg = "#AEAFAD" }
# Executable
exe_symbol = ""
exe = { fg = "#4EC9B0", bg = "#1F1F1F" }
# Regular
file_symbol = ""
file = { }
# Directory
folder_symbol = ""
folder = { fg = "#569CD6", bg = "#1F1F1F" }
# Hidden
hidden_symbol = ""
hidden = { fg = "#808080" }
# Link
link_symbol = ""
link = { fg = "#4EC9B0", bg = "#1F1F1F" }
# Link (broken)
broken_symbol = ""
broken = { fg = "#F44747", bg = "#3A1212" }
# Selected
selected = { fg = "#FFFFFF", bg = "#264F78" }
[status]
separator_open = ""
separator_close = ""
separator_style = { fg = "#444444", bg = "#444444" }
# Mode
mode_normal = { fg = "#1F1F1F", bg = "#569CD6", bold = true }
mode_select = { fg = "#1F1F1F", bg = "#FFAF00", bold = true }
mode_unset = { fg = "#1F1F1F", bg = "#F44747", bold = true }
# Progress
progress_label = { bold = true }
progress_normal = { fg = "#569CD6", bg = "#1F1F1F" }
progress_error = { fg = "#F44747", bg = "#1F1F1F" }
# Permissions
permissions_t = { fg = "#6A9955" }
permissions_r = { fg = "#D7BA7D" }
permissions_w = { fg = "#F44747" }
permissions_x = { fg = "#4EC9B0" }
permissions_s = { fg = "#808080" }
[select]
border = { fg = "#569CD6" }
active = { fg = "#C586C0", bold = true }
inactive = {}
[input]
border = { fg = "#569CD6" }
title = {}
value = {}
selected = { reversed = true }
[completion]
border = { fg = "#569CD6" }
active = { bg = "#264F78" }
inactive = {}
# Icons
icon_file = ""
icon_folder = ""
icon_command = ""
[tasks]
border = { fg = "#569CD6" }
title = {}
hovered = { underline = true }
[which]
mask = { bg = "#1F1F1F" }
cand = { fg = "#4EC9B0" }
rest = { fg = "#808080" }
desc = { fg = "#C586C0" }
separator = " "
separator_style = { fg = "#808080" }
[help]
on = { fg = "#4EC9B0" }
run = { fg = "#C586C0" }
desc = { fg = "#D4D4D4" }
hovered = { bg = "#264F78", bold = true }
footer = { fg = "#D4D4D4", bg = "#252526" }
[filetype]
rules = [
# Images
{ mime = "image/*", fg = "#D7BA7D" },
# Videos
{ mime = "video/*", fg = "#C586C0" },
# Audio
{ mime = "audio/*", fg = "#C586C0" },
# Archives
{ mime = "application/zip", fg = "#F44747" },
{ mime = "application/gzip", fg = "#F44747" },
{ mime = "application/x-tar", fg = "#F44747" },
{ mime = "application/x-bzip", fg = "#F44747" },
{ mime = "application/x-bzip2", fg = "#F44747" },
{ mime = "application/x-7z-compressed", fg = "#F44747" },
{ mime = "application/x-rar", fg = "#F44747" },
# Documents
{ mime = "application/pdf", fg = "#4EC9B0" },
{ mime = "application/msword", fg = "#4EC9B0" },
{ mime = "application/vnd.openxmlformats-officedocument.*", fg = "#4EC9B0" },
# Fallback
{ name = "*", fg = "#D4D4D4" },
{ name = "*/", fg = "#569CD6" },
# Executable
{ name = "*", category = "executable", fg = "#4EC9B0", bg = "#1F1F1F" },
# Directories
{ name = "*/", fg = "#569CD6", bg = "#1F1F1F" },
# Hidden files
{ name = ".*", fg = "#808080" },
# Symlinks
{ name = "*", category = "link", fg = "#4EC9B0", bg = "#1F1F1F" },
# Broken symlinks
{ name = "*", category = "broken", fg = "#F44747", bg = "#3A1212" },
]
[icon]
rules = [
{ name = "Desktop", text = "" },
{ name = "Documents", text = "" },
{ name = "Downloads", text = "" },
{ name = "Pictures", text = "" },
{ name = "Music", text = "" },
{ name = "Videos", text = "" },
{ name = ".git", text = "" },
{ name = ".config", text = "" },
]
Binary file not shown.

Before

Width:  |  Height:  |  Size: 455 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 463 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 578 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 631 KiB

Loaded 100 of 149 files, more files were not shown because too many files have changed in this diff. Show more