Compare commits

...

88 Commits

Author SHA1 Message Date
1f460ccc38 [Eslint] Add support for mjs and cjs, format config 2025-06-06 11:46:57 +02:00
8b7f15eddf [Eslint] Add padding guides 2025-06-06 11:36:04 +02:00
0750c45111 [latexfmt] Finish up latexindent config 2025-06-06 10:59:16 +02:00
0db1815665 [Eslint] Fix spelling error in config 2025-06-06 10:35:04 +02:00
d028b027c5 [Eslint] Add more style options 2025-06-06 10:34:01 +02:00
e91f5aa5d6 [Eslint] Fix end of file newline 2025-06-06 10:27:49 +02:00
6105341234 [Eslint] Finish up config 2025-06-06 09:33:57 +02:00
6a362a963f [Eslint] Fix config 2025-06-05 19:59:45 +02:00
9005bd089a [Hyprland] Increase border size 2025-06-05 17:53:49 +02:00
1921545d08 [Hyprland] Fix keybind for cliphist 2025-06-05 15:40:00 +02:00
05b463699f [Install] Add cliphist 2025-06-05 15:38:19 +02:00
6f33358f4a [Hyprland] Add cliphist 2025-06-05 15:37:44 +02:00
909983d069 [Scripts] Fix indentconfig.yaml 2025-06-05 14:10:04 +02:00
a259206de8 [Scripts] add indentconfig.yaml 2025-06-05 13:33:52 +02:00
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
318fc39b61 [Astal] Fix syntax 2025-05-26 15:05:07 +02:00
6b1c8dec58 [Setup] Fix syntax error 2025-05-22 16:47:46 +02:00
3541ec68e7 [Hyprland] Update binds (remove unnecessary ones) 2025-05-22 16:47:33 +02:00
3a3674670b [Hyprland] Update binds 2025-05-22 16:43:27 +02:00
b2c6d72a2f [Hypridle] Improve idle manager 2025-05-22 11:46:20 +02:00
b9c68535d4 [Hypridle] Remove 100s timout 2025-05-22 11:45:28 +02:00
ae5226202a [Install] Remove TODO 2025-05-22 11:27:07 +02:00
580aee4ad5 [Vimiv] Add notes and alias for fish 2025-05-22 10:12:12 +02:00
a8bf678d45 [Astal] Increase max-width of hyprland active window 2025-05-20 17:04:28 +02:00
73feae1142 [Hyprland] Change to dwindle layout 2025-05-20 15:19:18 +02:00
b26b870bb2 [Hyprland] Resize window keybinds 2025-05-20 14:35:39 +02:00
2d3a6ad33f [Astal] Remove debug code 2025-05-20 14:24:25 +02:00
ef9439b92c [Hyprland] Improve gestures 2025-05-19 14:29:40 +02:00
c635f3bfa9 [Build] Run build 2025-05-19 10:02:44 +02:00
7c3eb71150 [Astal] Update memory icon 2025-05-19 09:47:12 +02:00
4fef18041f [Notes] Add another todo 2025-05-16 07:39:25 +02:00
df3384c667 [Notes] Mark completed items, add new todo 2025-05-16 07:37:49 +02:00
7a97d7425e [Bar] Ellipsize too large text 2025-05-15 17:07:06 +02:00
73ca687358 [Fish] Add more aliases 2025-05-13 17:26:44 +02:00
88441958d9 [Yazi] Add more keybinds 2025-05-13 17:26:36 +02:00
e59af388b1 [Kitty] Finish improved cursor_trail settings 2025-05-12 14:17:24 +02:00
39da9176ad [Build] Run build 2025-05-12 13:49:46 +02:00
e4ee9c9dc8 [Kitty] Improve cursor trail 2025-05-12 13:48:54 +02:00
feef8452f4 [Install] Add new programs, restructure 2025-05-09 11:12:02 +02:00
c3ff5a58d6 [AGS] Improve Battery display 2025-05-08 12:53:53 +02:00
a005189aef [Setup] Make bars restart, will be writing new notifications stuff soon 2025-05-08 10:55:31 +02:00
e98f5c2bd7 [Build] Run build 2025-05-08 10:43:00 +02:00
e7f6be4291 [AGS] QuickView: Use better battery icon 2025-05-08 10:42:55 +02:00
4fa7dc3c1a [Eslint] Update arrow-parens to as-needed 2025-05-05 16:15:19 +02:00
2ccb49f24b [Eslint] Finish config 2025-05-05 15:50:56 +02:00
ec04ebee66 [Player] Fix time display 2025-05-05 12:01:07 +02:00
2b2f1c2b66 [Build] Run build 2025-05-03 16:57:46 +02:00
21f7e53b2b [Build] Fix changeable colours 2025-05-03 16:57:39 +02:00
5f09b7b915 [Install] Add new program 2025-04-29 15:35:19 +02:00
688013a6b8 [Hyprland] Add logging for bar & notifier to temp folder 2025-04-29 14:47:56 +02:00
4e7c3ceee8 [Yazi] Remove plugins from here 2025-04-28 10:16:30 +02:00
390874374e [Hyprland] Hyprlock: Animations 2025-04-28 10:16:30 +02:00
7f7a755e32 [Hyprland] Fix merge error 2025-04-28 08:56:38 +02:00
ac6b47449a [README] Update 2025-04-27 17:11:41 +02:00
ce5f530ed2 Merge V2 complete 2025-04-27 17:07:20 +02:00
62789224a7 Merge 2025-04-27 16:56:43 +02:00
0b849bad4f Fish change alias bt 2025-04-25 08:55:02 +02:00
0022880936 Actually create kitty config 2025-04-21 20:26:45 +02:00
1d5240b7c6 Add terminal file chooser 2025-04-14 16:51:42 +02:00
0b0e83f505 Improve notifications 2025-04-14 15:23:28 +02:00
f4cfa20dea Add fastfetch config 2025-04-10 11:35:39 +02:00
d866102fcc Improve copying in Zathura 2025-04-09 19:20:00 +02:00
921373f049 Update package list 2025-04-09 10:13:54 +02:00
1c39478650 Remove VSCode forced workspace 2025-04-05 15:19:55 +02:00
a845e086fd Change switch workspace keybind 2025-04-03 11:06:32 +02:00
b363438f6a Add zathura launch bind 2025-04-03 08:35:54 +02:00
7d9da82b6c Add restore plugin, improve ouch for yazi 2025-04-02 11:14:00 +02:00
c52c5b5a42 Improve Zathura, move to zoxide, add yazi plugins 2025-04-02 11:08:15 +02:00
97c49f17e6 Add nohlsearch to keybind zathura 2025-04-02 10:40:04 +02:00
134519558a Remove some zathura binds that come by default 2025-04-02 10:31:09 +02:00
9e5ae7db83 Update zathura binds 2025-04-01 17:52:33 +02:00
a31b3481c3 Make zathura open on 2nd workspace 2025-04-01 17:44:07 +02:00
1c757d1173 Add zathura config 2025-04-01 17:40:25 +02:00
89b97c4ba1 Add Zathura config 2025-04-01 17:40:10 +02:00
2ba627a370 Hyprland revert mouse focus change 2025-04-01 15:57:44 +02:00
995de3617c Hyprland change mouse focus 2025-04-01 13:50:28 +02:00
a477078f16 Hyprland fix vivado window rules 2025-03-31 15:33:15 +02:00
f93eeb5d87 Hyprland improve vivado 2025-03-31 15:17:32 +02:00
5b0e3767bd Add yazi keybinds 2025-03-31 10:50:44 +02:00
51962c424b Hyprland fix for V0.48 2025-03-30 08:09:44 +02:00
a6ce7ccdce Fix path for scripts 2025-03-28 13:50:42 +01:00
0f0e0e8671 improve notifications keybinds 2025-03-28 11:45:42 +01:00
c6061e0f12 Remove quit keybind from hyprland. Can be done through wlogout 2025-03-27 16:23:12 +01:00
cac0e41a2e Change shortcuts for fish 2025-03-24 09:12:07 +01:00
c4797dd592 Remove killactive from MainMod + C 2025-03-22 20:41:22 +01:00
8986ad894e Improve keybindings 2025-03-22 11:31:46 +01:00
f127ea8a41 Fix binds for new notification handler 2025-03-21 18:25:36 +01:00
bb75cfabaf Add binds for new notification handler 2025-03-21 18:10:15 +01:00
33 changed files with 1195 additions and 203 deletions

View File

@@ -1,4 +1,36 @@
# 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)
## 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

View File

@@ -30,7 +30,7 @@ const build = ( wallpaper, lockpaper, theme ) => {
name: 'confirm-proceed-build',
message: 'Okay to proceed with these colours?'
} ] ).then( answer => {
if ( answer ) proceedWithBuild( wallpaper, lockpaper, theme, palette );
if ( answer['confirm-proceed-build'] ) proceedWithBuild( wallpaper, lockpaper, theme, palette );
else {
// Have the user pick any other of the extracted colours instead
let counter = -1;

View File

@@ -29,11 +29,13 @@ export const BatteryBox = () => {
cssClasses={["battery-time"]}
visible={bind(battery, "charging").as(c => !c)}
label={bind(battery, "timeToEmpty").as(t => `(${toTime(t)})`)}
tooltipText={bind(battery, 'energyRate').as(er => `Time to empty. Power usage: ${batteryEnergy(er)}`)}
/>
<label
cssClasses={["battery-time"]}
visible={bind(battery, "charging")}
label={bind(battery, "timeToFull").as(t => `(${toTime(t)})`)}
tooltipText={bind(battery, 'energyRate').as(er => `Time to full. Charge rate: ${batteryEnergy(er)}`)}
/>
</box>
);
@@ -43,7 +45,7 @@ const toTime = (time: number) => {
const MINUTE = 60;
const HOUR = MINUTE * 60;
if (time > 24 * HOUR) return "";
if (time > 24 * HOUR) return "24h+";
const hours = Math.round(time / HOUR);
const minutes = Math.round((time - hours * HOUR) / MINUTE);

View File

@@ -4,7 +4,6 @@ import Brightness from "../../../../util/brightness";
const brightness = Brightness.get_default();
const BrightnessModule = () => {
print( brightness.screen * 100 );
const setBrightness = (value: number) => {
brightness.screen = value;
}

View File

@@ -135,8 +135,9 @@ const PlayerItem = ({ player }: { player: AstalMpris.Player }) => {
};
const secondsToFriendlyTime = (time: number) => {
const minutes = Math.floor(time / 60);
const hours = Math.floor(minutes / 60);
const m = Math.floor(time / 60);
const minutes = Math.floor(m % 60);
const hours = Math.floor(m / 60 % 24);
const seconds = Math.floor(time % 60);
if (hours > 0) {
return `${hours}:${expandTime(minutes)}:${expandTime(seconds)}`;

View File

@@ -21,7 +21,7 @@ const Bar = ( { gdkmonitor, name }: { gdkmonitor: Gdk.Monitor, name: string } )
child={
<CenterBox
orientation={Gtk.Orientation.HORIZONTAL}
start_widget={
startWidget={
<box
hexpand
halign={Gtk.Align.START}

View File

@@ -2,6 +2,7 @@ import AstalTray from "gi://AstalTray";
import { bind, GObject } 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 SYNC = GObject.BindingFlags.SYNC_CREATE;
@@ -105,7 +106,10 @@ const ActiveWindow = () => {
focused.as(
client =>
client && (
<label label={bind(client, "title").as(String)} />
<label
maxWidthChars={70}
ellipsize={Pango.EllipsizeMode.END}
label={bind(client, "title").as(String)} />
),
)
}></button>
@@ -128,7 +132,7 @@ const WindowPopoverBox = () => {
<label label={bind(client, 'title')}></label>
</box>
}
onClicked={() => client.focus()}
onClicked={() => client.focus()}
></button>
})
})}

View File

@@ -125,9 +125,9 @@ const BatteryWidget = () => {
if (battery.get_is_present()) {
return (
<image
iconName={bind(battery, "iconName").as(icon => icon)}
iconName={bind(battery, "batteryIconName").as(icon => icon)}
cssClasses={["quick-view-symbol"]}
tooltipText={bind(battery, 'percentage').as(p => `${Math.round(p * 100)}%`)}
tooltipText={bind(battery, 'percentage').as(p => `Battery Level: ${Math.round(p * 100)}%`)}
></image>
);
} else {

View File

@@ -75,7 +75,7 @@ const SystemInfo = () => {
<box
cssClasses={[ 'quick-view-symbol' ]}
>
<image iconName={"histogram-symbolic"}></image>
<image iconName={"memory"}></image>
<label label={sysinfo.ramUtil(util => util)}></label>
</box>
<box

View File

@@ -1,5 +1,5 @@
$fg-color: #E6E6E6;
$bg-color: #141414;
$fg-color: #C8DCFF;
$bg-color: #0A0A0F;
$accent-color: #591641;
$accent-color-2: #97103A;
$shadow-color: rgba(40, 40, 40, 0.3);
$shadow-color: rgba(0, 0, 2, 0.3);

View File

@@ -1,10 +1,12 @@
alias ls='ls -l --color'
alias ll='ls -la --color'
alias v='nvim'
alias i='vimiv'
alias c='clear'
alias zs='zathura-sandbox'
alias z='zathura'
alias bt='bluetui'
alias vicfg='cd ~/.config/nvim/ && nvim'
alias vicfg='nvim ~/projects/active/nvim/'
alias fm='thunar .'
alias gl='git ls-files --others --exclude-standard'
alias gm='gti ls-files -m'
@@ -15,8 +17,7 @@ alias ga='git add ./*'
alias cfh='nvim ~/projects/active/dotfiles/config/hypr/'
alias cfn='nvim ~/projects/active/nvim/'
alias cff='nvim ~/projects/active/dotfiles/config/fish/'
alias cfw='nvim ~/projects/archive/dotfiles-old/pc/configs/waybar/'
alias cfa='nvim ~/projects/active/dotfiles/config/ags/'
alias cfa='nvim ~/projects/active/dotfiles/config/astal/'
alias cf='nvim ~/projects/active/dotfiles/'
alias g='lazygit'
alias open-webui='sudo systemctl start docker && sudo docker start -i open-webui'

View File

@@ -16,23 +16,12 @@ general {
}
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
timeout = 300
on-timeout = hyprlock
}
listener {
timeout = 300
timeout = 360
on-timeout = hyprctl dispatch dpms off
on-resume = hyprctl dispatch dpms on
}

View File

@@ -8,9 +8,7 @@ $mainMod = SUPER
# These key-binds are non-specific, laptop config has a separate file that includes
# extra config for it specifically
bind = $mainMod, Q, killactive
# bind = $mainMod SHIFT, Q, exit
bind = $mainMod, Return, exec, kitty
# bind = $mainMod, E, exec, thunar
bind = $mainMod SHIFT, E, exec, thunar
bind = $mainMod, E, exec, kitty --hold fish -c "y"
bind = $mainMod, V, togglefloating,
@@ -46,13 +44,11 @@ bind = $mainMod SHIFT, L, exec, librewolf
bind = $mainMod SHIFT, D, exec, vesktop
bind = $mainMod SHIFT, V, exec, vscodium
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, 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, 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, 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 SHIFT, O, exec, terminator -e "~/projects/dotfiles/ai.sh"
@@ -70,12 +66,12 @@ bind = SHIFT, PRINT, exec, grimblast --notify save screen
# │ Rofi commands │
# └ ┘
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 │
# └ ┘
bind = $mainMod, escape, exec, wlogout
bind = $mainMod ALT CTRL, L, exec, hyprlock --immediate
# ────────────────────────────────────────────────────────────────────
@@ -160,8 +156,6 @@ bind = $mainMod, mouse_up, workspace, e-1
# │ ALT + Tab / SHIFT + ALT + Tab │
# └ ┘
bind = ALT SHIFT, tab, cyclenext, prev
# bind = ALT, tab, cyclenext, next
# bind = ALT CTRL, tab, focusurgentorlast
bind = ALT, tab, focusurgentorlast
@@ -181,6 +175,12 @@ bind = $mainMod SHIFT CTRL, left, layoutmsg, orientationprev
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
# ┌ ┐
# │ Resize window with keybinds (change split) │
# └ ┘
bind = $mainMod CTRL ALT, H, splitratio, -0.01
bind = $mainMod CTRL ALT, L, splitratio, +0.01
# ┌ ┐
# │ Freeze │
@@ -199,8 +199,8 @@ bind = ,code:121, exec, pamixer -t
# ┌ ┐
# │ Brightness-Control │
# └ ┘
bind = ,code:232, exec, light -U 5 && notify-send 'Display brightness decreased by 5%' --app-name="Brightness"
bind = ,code:233, exec, light -A 5 && notify-send 'Display brightness increased by 5%' --app-name="Brightness"
bind = ,code:232, exec, light -U 5
bind = ,code:233, exec, light -A 5
# ┌ ┐

View File

@@ -13,6 +13,6 @@ general {
decoration {
shadow {
color = rgb(282828)
color = rgb(000002)
}
}

View File

@@ -13,11 +13,14 @@ exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
exec-once = hypridle
exec-once = nm-applet
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/active/dotfiles/config/astal/ --gtk4"
# 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/"
exec-once = sleep 2 && bash -c "ags run -d ~/projects/active/dotfiles/config/astal/ --gtk4 >> /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/active/dotfiles/config/ags/notifications/ >> /tmp/notifier-log 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
@@ -47,13 +50,14 @@ input {
focus_on_close = 1
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
sensitivity = 0
}
gestures {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
workspace_swipe = true
workspace_swipe_distance = 300
workspace_swipe_distance = 200
workspace_swipe_cancel_ratio = 0.3
workspace_swipe_forever = true
}
@@ -63,27 +67,21 @@ gestures {
# ╰────────────────────────────────────────────────╯
# ────────────────────────────────────────────────────────────────────
general {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
gaps_in = 3
gaps_out = 4
border_size = 1
# col.active_border = rgba(cc5c00ff) rgba(cc5c00ff) rgba(ff0000ff) 45deg
# col.inactive_border = rgba(595959aa)
border_size = 2
layout = master
layout = dwindle
no_border_on_floating = false
}
decoration {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
inactive_opacity = 1
rounding = 10
shadow {
enabled = true
range = 4
# color = rgba(1a1a1aee)
}
blur {
@@ -100,8 +98,6 @@ decoration {
animations {
enabled = yes
# Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
animation = windows, 1, 7, myBezier
@@ -119,17 +115,11 @@ misc {
}
dwindle {
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
preserve_split = yes # you probably want this
pseudotile = true
force_split = 2
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

View File

@@ -18,7 +18,7 @@ general {
# └ ┘
background {
monitor =
path = /home/janis/NextCloud/Wallpapers/dark/colour-splash.jpg # Or screenshot
path = /home/janis/NextCloud/Wallpapers/dark/mountains.jpg # Or screenshot
blur_passes = 1
}

View File

@@ -17,6 +17,7 @@ font_size 12.0
# │ Cursor config │
# └ ┘
cursor_trail 1
cursor_trail_start_threshold 0
# ┌ ┐

View File

@@ -0,0 +1,2 @@
paths:
- /home/janis/projects/active/dotfiles/config/lint/latexfmt.yaml

65
config/lint/dump Normal file
View File

@@ -0,0 +1,65 @@
// @ts-check
import eslint from '@eslint/js';
import tseslint from 'typescript-eslint';
import stylistic from '@stylistic/eslint-plugin';
export default tseslint.config(
eslint.configs.recommended,
...tseslint.configs.recommended,
{
'plugins': {
'@stylistic/js': stylistic,
'@stylistic/ts': stylistic,
},
'rules': {
// Formatting
'@stylistic/js/array-bracket-newline': [ 'error', { 'multiline': true, 'minItems': 4 } ],
'@stylistic/js/array-bracket-spacing': [ 'error', 'always' ],
'@stylistic/js/array-element-newline': [ 'error', { 'multiline': true, 'minItems': 4 } ],
'@stylistic/js/arrow-parens': [ 'error', 'always' ],
'@stylistic/js/arrow-spacing': [ 'error', { 'before': true, 'after': true } ],
'@stylistic/js/block-spacing': [ 'error', 'always' ],
'@stylistic/js/brace-style': [ 'error', '1tbs' ],
'@stylistic/js/comma-spacing': [ 'error', { 'before': false, 'after': true } ],
'@stylistic/js/comma-style': [ 'error', 'last' ],
'@stylistic/js/dot-location': [ 'error', 'property' ],
'@stylistic/js/eol-last': [ 'error', 'always' ],
'@stylistic/js/function-call-spacing': [ 'error', 'never' ],
'@stylistic/js/implicit-arrow-linebreak': [ 'error', 'beside' ],
'@stylistic/js/indent': [ 'error', 4 ],
'@stylistic/js/key-spacing': [ 'error', { 'beforeColon': false, 'afterColon': true } ],
'@stylistic/js/keyword-spacing': [ 'error', { 'before': true, 'after': true } ],
'@stylistic/js/lines-between-class-members': [ 'error', 'always' ],
'@stylistic/js/new-parens': [ 'error', 'always' ],
'@stylistic/js/no-extra-parens': [ 'error', 'all' ],
'@stylistic/js/no-extra-semi': 'error',
'@stylistic/js/no-floating-decimal': 'error',
'@stylistic/js/no-mixed-operators': 'error',
'@stylistic/js/no-mixed-spaces-and-tabs': 'error',
'@stylistic/js/no-multi-spaces': 'error',
'@stylistic/js/no-trailing-spaces': 'error',
'@stylistic/js/no-whitespace-before-property': 'error',
'@stylistic/js/object-curly-newline': [ 'error', { 'multiline': true, 'minProperties': 3 } ],
'@stylistic/js/object-curly-spacing': [ 'error', 'always' ],
'@stylistic/js/one-var-declaration-per-line': 'error',
'@stylistic/js/quote-props': [ 'error', 'always' ],
'@stylistic/js/quotes': [ 'error', 'single' ],
'@stylistic/js/rest-spread-spacing': [ 'error', 'never' ],
'@stylistic/js/semi': [ 'error', 'always' ],
'@stylistic/js/semi-spacing': [ 'error', { 'before': false, 'after': true } ],
'@stylistic/js/semi-style': [ 'error', 'last' ],
'@stylistic/js/space-before-blocks': [ 'error', 'always' ],
'@stylistic/js/space-before-function-paren': [ 'error', 'always' ],
'@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',
}
}
);

View File

@@ -1,65 +1,678 @@
// @ts-check
import vue from 'eslint-plugin-vue';
import eslint from '@eslint/js';
import tseslint from 'typescript-eslint';
import globals from 'globals';
import typescript from '@typescript-eslint/eslint-plugin';
import stylistic from '@stylistic/eslint-plugin';
import tseslint from 'typescript-eslint';
const style = {
'plugins': {
'@stylistic': stylistic,
'@stylistic/js': stylistic,
'@stylistic/ts': stylistic,
},
'files': [
'**/*.ts',
'**/*.js',
'**/*.mjs',
'**/*.cjs',
'**/*.tsx',
'**/*.jsx'
],
'rules': {
// Formatting
'@stylistic/array-bracket-newline': [
'error',
{
'multiline': true,
'minItems': 2
}
],
'@stylistic/array-bracket-spacing': [
'error',
'always'
],
'@stylistic/array-element-newline': [
'error',
{
'multiline': true,
'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'
],
'@stylistic/comma-spacing': [
'error',
{
'before': false,
'after': true
}
],
'@stylistic/comma-style': [
'error',
'last'
],
'@stylistic/dot-location': [
'error',
'property'
],
'@stylistic/eol-last': [
'error',
'always'
],
'@stylistic/function-call-spacing': [
'error',
'never'
],
'@stylistic/implicit-arrow-linebreak': [
'error',
'beside'
],
'@stylistic/indent': [
'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/new-parens': [
'error',
'always'
],
'@stylistic/newline-per-chained-call': [
'error',
{ 'ignoreChainWithDepth': 2 }
],
'@stylistic/no-extra-parens': [
'error',
'all'
],
'@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': 1
}
],
'@stylistic/no-tabs': 'error',
'@stylistic/no-trailing-spaces': 'error',
'@stylistic/no-whitespace-before-property': 'error',
'@stylistic/object-curly-newline': [
'error',
{
'multiline': true,
'minProperties': 2
}
],
'@stylistic/object-curly-spacing': [
'error',
'always'
],
'@stylistic/object-property-newline': 'error',
'@stylistic/operator-linebreak': [
'error',
'before'
],
'@stylistic/one-var-declaration-per-line': 'error',
'@stylistic/padded-blocks': [
'error',
{
'blocks': 'never',
'classes': 'always',
'switches': 'never',
}
],
// Padding lines. The most in-depth part of this config
// ['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', 'while', 'with']
'@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/template-curly-spacing': [
'error',
'always'
],
'@stylistic/switch-colon-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,
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': {
// Formatting
'@stylistic/js/array-bracket-newline': [ 'error', { 'multiline': true, 'minItems': 4 } ],
'@stylistic/js/array-bracket-spacing': [ 'error', 'always' ],
'@stylistic/js/array-element-newline': [ 'error', { 'multiline': true, 'minItems': 4 } ],
'@stylistic/js/arrow-parens': [ 'error', 'always' ],
'@stylistic/js/arrow-spacing': [ 'error', { 'before': true, 'after': true } ],
'@stylistic/js/block-spacing': [ 'error', 'always' ],
'@stylistic/js/brace-style': [ 'error', '1tbs' ],
'@stylistic/js/comma-spacing': [ 'error', { 'before': false, 'after': true } ],
'@stylistic/js/comma-style': [ 'error', 'last' ],
'@stylistic/js/dot-location': [ 'error', 'property' ],
'@stylistic/js/eol-last': [ 'error', 'always' ],
'@stylistic/js/function-call-spacing': [ 'error', 'never' ],
'@stylistic/js/implicit-arrow-linebreak': [ 'error', 'beside' ],
'@stylistic/js/indent': [ 'error', 4 ],
'@stylistic/js/key-spacing': [ 'error', { 'beforeColon': false, 'afterColon': true } ],
'@stylistic/js/keyword-spacing': [ 'error', { 'before': true, 'after': true } ],
'@stylistic/js/lines-between-class-members': [ 'error', 'always' ],
'@stylistic/js/new-parens': [ 'error', 'always' ],
'@stylistic/js/no-extra-parens': [ 'error', 'all' ],
'@stylistic/js/no-extra-semi': 'error',
'@stylistic/js/no-floating-decimal': 'error',
'@stylistic/js/no-mixed-operators': 'error',
'@stylistic/js/no-mixed-spaces-and-tabs': 'error',
'@stylistic/js/no-multi-spaces': 'error',
'@stylistic/js/no-trailing-spaces': 'error',
'@stylistic/js/no-whitespace-before-property': 'error',
'@stylistic/js/object-curly-newline': [ 'error', { 'multiline': true, 'minProperties': 3 } ],
'@stylistic/js/object-curly-spacing': [ 'error', 'always' ],
'@stylistic/js/one-var-declaration-per-line': 'error',
'@stylistic/js/quote-props': [ 'error', 'always' ],
'@stylistic/js/quotes': [ 'error', 'single' ],
'@stylistic/js/rest-spread-spacing': [ 'error', 'never' ],
'@stylistic/js/semi': [ 'error', 'always' ],
'@stylistic/js/semi-spacing': [ 'error', { 'before': false, 'after': true } ],
'@stylistic/js/semi-style': [ 'error', 'last' ],
'@stylistic/js/space-before-blocks': [ 'error', 'always' ],
'@stylistic/js/space-before-function-paren': [ 'error', 'always' ],
'@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',
}
}
...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,
}
],
},
},
);

31
config/lint/latexfmt.yaml Normal file
View File

@@ -0,0 +1,31 @@
# Use spaces for indent (because f*k tabs)
defaultIndent: " "
# Limit Number of backups
maxNumberOfBackups: 3
indentRules:
recall: " "
remarks: " "
guides: " "
properties: " "
restrictions: " "
limitations: " "
terms: " "
notation: " "
usage: " "
task: " "
proof: " "
general: " "
simplebox: " "
definition: " "
theorem: " "
lemma: " "
corollary: " "
axiom: " "
fact: " "
proposition: " "
example: " "
formula: " "
conjugation: " "
forms: " "

8
config/lint/package.json Normal file
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"
}
}

View File

@@ -1,7 +1,7 @@
* {
background: #141414;
background-selected: #1E1E1E;
foreground: #E6E6E6;
background: #0A0A0F;
background-selected: #141419;
foreground: #C8DCFF;
accent: #591641;
accent-two: #97103A;
// border-color: #2D2057;

View File

@@ -7,7 +7,7 @@ window {
font-family: monospace;
font-size: 14pt;
color: #ffffff; /* text */
background-color: rgba(20, 20, 20, 0.5);
background-color: rgba(10, 10, 15, 0.5);
}
button {
@@ -27,7 +27,7 @@ button:hover {
button:focus {
background-color: rgb(151, 16, 58);
color: rgb(230, 230, 230);
color: rgb(200, 220, 255);
}
#lock {

View File

@@ -8,22 +8,27 @@ prepend_keymap = [
# Goto
{ on = [ "g", "h" ], run = "cd ~", desc = "Go to ~" },
{ on = [ "g", "c", "c" ], run = "cd ~/.config", desc = "Go to ~/.config" },
{ on = [ "g", "c", "h" ], run = "cd ~/.config/hypr", desc = "Go to Hyprland config" },
{ on = [ "g", "c", "f" ], run = "cd ~/.config/fish", desc = "Go to Fish config" },
{ on = [ "g", "c", "y" ], run = "cd ~/.config/yazi", desc = "Go to Yazi config" },
{ on = [ "g", "c", "w" ], run = "cd ~/.config/waybar", desc = "Go to waybar config" },
{ on = [ "g", "c", "n" ], run = "cd ~/.config/nvim", desc = "Go to NeoVim config" },
{ on = [ "g", "a" ], run = "cd ~/.cache", desc = "Go to ~/.cache" },
{ on = [ "g", "l", "b" ], run = "cd ~/.local/bin", desc = "Go to ~/.local/bin" },
{ on = [ "g", "l", "s" ], run = "cd ~/.local/share", desc = "Go to ~/.local/share" },
{ on = [ "g", "c", "h" ], run = "cd ~/projects/active/dotfiles/config/hypr", desc = "Go to Hyprland config" },
{ on = [ "g", "c", "f" ], run = "cd ~/projects/active/dotfiles/config/fish", desc = "Go to Fish config" },
{ on = [ "g", "c", "y" ], run = "cd ~/projects/active/dotfiles/config/yazi", desc = "Go to Yazi config" },
{ on = [ "g", "c", "a" ], run = "cd ~/projects/active/dotfiles/config/astal", desc = "Go to astal config" },
{ on = [ "g", "c", "l" ], run = "cd ~/projects/active/dotfiles/config/lint", desc = "Go to linter configs" },
{ on = [ "g", "c", "k" ], run = "cd ~/projects/active/dotfiles/config/kitty", desc = "Go to kitty config" },
{ on = [ "g", "c", "r" ], run = "cd ~/projects/active/dotfiles/config/rofi", desc = "Go to rofi config" },
{ on = [ "g", "c", "s" ], run = "cd ~/projects/active/dotfiles/scripts", desc = "Go to script" },
{ on = [ "g", "c", "n" ], run = "cd ~/projects/active/nvim", desc = "Go to NeoVim config" },
{ on = [ "g", "n" ], run = "cd ~/NextCloud/Documents/", desc = "Go to NextCloud Documents" },
{ on = [ "g", "w" ], run = "cd ~/NextCloud/Wallpapers", desc = "Go to Wallpapers" },
{ on = [ "g", "e", "c" ], run = "cd ~/projects/active/eth-gitlab/eth-code-expert/Semester2/", desc = "Go to ETH-Code-Expert" },
{ on = [ "g", "e", "n" ], run = "cd ~/NextCloud/Documents/ETH/Semester2", desc = "Go to ETH Nextcloud" },
{ on = [ "g", "e", "p" ], run = "cd ~/projects/active/eth/semester2/", desc = "Go to ETH notes folder" },
{ on = [ "g", "e", "g" ], run = "cd ~/projects/active/eth-gitlab/pprog25-jahutz/", desc = "Go to ETH Gitlab folder" },
{ on = [ "g", "l", "b" ], run = "cd ~/.local/bin", desc = "Go to ~/.local/bin" },
{ on = [ "g", "l", "s" ], run = "cd ~/.local/share", desc = "Go to ~/.local/share" },
{ on = [ "g", "s", "h" ], run = "cd ~/.steam/steam/steamapps/common", desc = "Go to ~/.steam/steam/steamapps/common" },
{ on = [ "g", "s", "g" ], run = "cd /mnt/games/SteamLibrary", desc = "Go to SteamLibrary on NTFS partition" },
{ on = [ "g", "s", "s" ], run = "cd /mnt/secondary/SteamLibrary", desc = "Go to SteamLibrary on main games drive" },
{ on = [ "g", "s", "h" ], run = "cd ~/.steam/steam/steamapps/common", desc = "Go to ~/.steam/steam/steamapps/common" },
{ on = [ "g", "s", "g" ], run = "cd /mnt/games/SteamLibrary", desc = "Go to SteamLibrary on NTFS partition" },
{ on = [ "g", "s", "s" ], run = "cd /mnt/secondary/SteamLibrary", desc = "Go to SteamLibrary on main games drive" },
{ on = [ "g", "o" ], run = "cd /mnt/janis/Documents", desc = "Go to Documents" },
{ on = [ "g", "d" ], run = "cd ~/Downloads", desc = "Go to ~/Downloads" },
{ on = [ "g", "p", "a" ], run = "cd ~/projects/active", desc = "Go to Active projects" },

View File

@@ -1,2 +1,2 @@
[flavor]
use = "vscode-dark-modern"
use = "tokyo-night"

View File

@@ -19,13 +19,13 @@
/*
* ── Foreground color, main interface text colour ─────────────────────
*/
@define-color fg #E6E6E6;
@define-color fg_rgba_07 rgba(230, 230, 230, 0.7);
@define-color fg_rgba_06 rgba(230, 230, 230, 0.6);
@define-color fg_rgba_05 rgba(230, 230, 230, 0.5);
@define-color fg_rgba_03 rgba(230, 230, 230, 0.3);
@define-color fg_rgba_02 rgba(230, 230, 230, 0.2);
@define-color fg_rgba_01 rgba(230, 230, 230, 0.1);
@define-color fg #C8DCFF;
@define-color fg_rgba_07 rgba(200, 220, 255, 0.7);
@define-color fg_rgba_06 rgba(200, 220, 255, 0.6);
@define-color fg_rgba_05 rgba(200, 220, 255, 0.5);
@define-color fg_rgba_03 rgba(200, 220, 255, 0.3);
@define-color fg_rgba_02 rgba(200, 220, 255, 0.2);
@define-color fg_rgba_01 rgba(200, 220, 255, 0.1);
/*
* ── Foreground accent, usually brighter or darker than default ───────
@@ -51,14 +51,14 @@
/*
* ── Accent Gradient ──────────────────────────────────────────────────
*/
@define-color accent_gradient_1 #390E2A;
@define-color accent_gradient_2 #2E0B21;
@define-color accent_gradient_3 #24091B;
@define-color accent_gradient_4 #1D0715;
@define-color accent_gradient_5 #170611;
@define-color accent_gradient_inverse_1 #8B2266;
@define-color accent_gradient_inverse_2 #8B2266;
@define-color accent_gradient_inverse_3 #8B2266;
@define-color accent_gradient_1 #481235;
@define-color accent_gradient_2 #41102F;
@define-color accent_gradient_3 #3A0E2B;
@define-color accent_gradient_4 #350D26;
@define-color accent_gradient_5 #2F0C23;
@define-color accent_gradient_inverse_1 #6E1B50;
@define-color accent_gradient_inverse_2 #6E1B50;
@define-color accent_gradient_inverse_3 #6E1B50;
/*
* ── Secondary accent colour ──────────────────────────────────────────
@@ -97,33 +97,33 @@
/*
* ── Background color, main interface background ──────────────────────
*/
@define-color bg #141414;
@define-color bg_rgba_07 rgba(20, 20, 20, 0.7);
@define-color bg_rgba_05 rgba(20, 20, 20, 0.5);
@define-color bg_rgba_03 rgba(20, 20, 20, 0.3);
@define-color bg_rgba_02 rgba(20, 20, 20, 0.2);
@define-color bg_rgba_015 rgba(20, 20, 20, 0.15);
@define-color bg_rgba_011 rgba(20, 20, 20, 0.11);
@define-color bg #0A0A0F;
@define-color bg_rgba_07 rgba(10, 10, 15, 0.7);
@define-color bg_rgba_05 rgba(10, 10, 15, 0.5);
@define-color bg_rgba_03 rgba(10, 10, 15, 0.3);
@define-color bg_rgba_02 rgba(10, 10, 15, 0.2);
@define-color bg_rgba_015 rgba(10, 10, 15, 0.15);
@define-color bg_rgba_011 rgba(10, 10, 15, 0.11);
/*
* ── Accent background color ──────────────────────────────────────────
*/
@define-color bg_accent #1E1E1E;
@define-color bg_accent_rgba_07 rgba(30, 30, 30, 0.7);
@define-color bg_accent_rgba_06 rgba(30, 30, 30, 0.6);
@define-color bg_accent_rgba_05 rgba(30, 30, 30, 0.5);
@define-color bg_accent_rgba_04 rgba(30, 30, 30, 0.4);
@define-color bg_accent_rgba_03 rgba(30, 30, 30, 0.3);
@define-color bg_accent_rgba_02 rgba(30, 30, 30, 0.2);
@define-color bg_accent_rgba_015 rgba(30, 30, 30, 0.15);
@define-color bg_accent_rgba_01 rgba(30, 30, 30, 0.1);
@define-color bg_accent #141419;
@define-color bg_accent_rgba_07 rgba(20, 20, 25, 0.7);
@define-color bg_accent_rgba_06 rgba(20, 20, 25, 0.6);
@define-color bg_accent_rgba_05 rgba(20, 20, 25, 0.5);
@define-color bg_accent_rgba_04 rgba(20, 20, 25, 0.4);
@define-color bg_accent_rgba_03 rgba(20, 20, 25, 0.3);
@define-color bg_accent_rgba_02 rgba(20, 20, 25, 0.2);
@define-color bg_accent_rgba_015 rgba(20, 20, 25, 0.15);
@define-color bg_accent_rgba_01 rgba(20, 20, 25, 0.1);
/*
* ── Tertiary background colour ───────────────────────────────────────
*/
@define-color bg_tertiary #2D2D2D;
@define-color bg_tertiary_rgba_05 rgba(45, 45, 45, 0.5);
@define-color bg_tertiary_rgba_02 rgba(45, 45, 45, 0.2);
@define-color bg_tertiary #000000;
@define-color bg_tertiary_rgba_05 rgba(0, 0, 0, 0.5);
@define-color bg_tertiary_rgba_02 rgba(0, 0, 0, 0.2);
/*
* ── Inactive background colour ───────────────────────────────────────
@@ -140,10 +140,10 @@
/*
* ── Shadow colours ───────────────────────────────────────────────────
*/
@define-color shadow #282828;
@define-color shadow_rgba_07 rgba(40, 40, 40, 0.7);
@define-color shadow_rgba_05 rgba(40, 40, 40, 0.5);
@define-color shadow_rgba_03 rgba(40, 40, 40, 0.3);
@define-color shadow_rgba_02 rgba(40, 40, 40, 0.2);
@define-color shadow_rgba_015 rgba(40, 40, 40, 0.15);
@define-color shadow_rgba_011 rgba(40, 40, 40, 0.11);
@define-color shadow #000002;
@define-color shadow_rgba_07 rgba(0, 0, 2, 0.7);
@define-color shadow_rgba_05 rgba(0, 0, 2, 0.5);
@define-color shadow_rgba_03 rgba(0, 0, 2, 0.3);
@define-color shadow_rgba_02 rgba(0, 0, 2, 0.2);
@define-color shadow_rgba_015 rgba(0, 0, 2, 0.15);
@define-color shadow_rgba_011 rgba(0, 0, 2, 0.11);

11
install
View File

@@ -6,9 +6,8 @@ read -p "Choose the configs to install, Laptop or Desktop (l/D): " platform
# Packages to be added to install: aylurs-gtk-shell-git, brightnessctl, zoxide, trash-cli, fzf, ouch
# Install yazi plugins using ya pack -a ndtoan96/ouch and ya pack -a boydaihungst/restore
#
# TODO: get configs from current setup
# Hyprland
yay -S hyprland hypridle hyprfreeze hyprlock plymouth aylurs-gtk-shell-git brightnessctl pulsemixer xdg-desktop-portal-hyprland
yay -S hyprland hypridle hyprfreeze hyprlock plymouth aylurs-gtk-shell-git brightnessctl pulsemixer xdg-desktop-portal-hyprland cliphist
# Audio, drivers, tools
yay -S pipewire pipewire-alsa pipewire-pulse pipewire-jack mesa fish thunar yazi wireplumber grimblast wl-clipboard wget vimiv zoxide trash-cli fzf ouch zathura sensors radeontop lm-sensors
@@ -21,17 +20,17 @@ ya pack -a boydaihungst/restore
yay -S adobe-source-code-pro-fonts gnome-font-viewer gnome-characters gnome-tweaks lxappearance kvantum gnome-keyring smartmontools ffmpeg polkit-gnome swaybg network-manager-applet polkit-kde-agent cpupower-gui ttf-fantasque-nerd ttf-jetbrains-mono-nerd ttf-fluentui-system-icons ttf-comfortaa
# Programming
yay -S meld docker vscodium kitty fish docker terminator ghex nodejs npm python-pip git-credential-manager-core-bin wine kate rustup cargo filezilla typescript-language-server php jdk vscode-css-languageserver vscode-html-languageserver bash-language-server lazygit
sudo npm i -g @vue/typescript-plugin
yay -S meld docker vscodium kitty fish docker terminator ghex nodejs npm python-pip git-credential-manager-core-bin wine kate rustup cargo filezilla php jdk
# nvim
yay -S neovim lua lua-language-server tree-sitter texlab stylua luarocks jdtls perl julia autojump pyright
yay -S neovim lua lua-language-server tree-sitter texlab stylua luarocks jdtls perl julia autojump pyright vscode-css-languageserver vscode-html-languageserver bash-language-server lazygit python-black proselint asmfmt typescript-language-server
sudo npm i -g @vue/typescript-plugin
# Internet
yay -S librewolf-bin webcord-bin thunderbird rustdesk brave-bin
# Utilities
yay -S okular vlc nextcloud-client p7zip zip unzip gnome-keyring noto-fonts thunderbird pamixer pavucontrol light neofetch bashtop hugo sddm uxplay upower
yay -S okular vlc nextcloud-client p7zip zip unzip gnome-keyring noto-fonts thunderbird pamixer pavucontrol light neofetch bashtop hugo sddm uxplay upower gdu
# LaTeX
yay -S texlive biber

View File

@@ -17,12 +17,14 @@
- [ ] AppLauncher (possibly, if anyrun is no good, probably not)
- [ ] OSD (see [here](https://github.com/Aylur/astal/tree/main/examples/gtk3/js))
- [x] Open Window List for bar when hovering over window title and per-workspace when hovering over workspace
- [ ] Keybind to open QuickActions
- [ ] Improve handling of tray items (crashes on update of submenus)
- [ ] Text recognition
- [ ] Theming
- [x] Vivado dark mode
- [x] GTK
- [x] QT (via environment variable)
- [x] ~Librewolf~
- [x] Librewolf
- [x] Astal
- [x] Hyprland
- [x] Rofi
@@ -41,23 +43,26 @@
- [ ] Read docs
- [ ] battery management
- [ ] Programs
- [ ] New image viewer (eog, vimiv)
- [ ] Switch to vimiv (make default and configure)
- [x] Other pdf reader (maybe -> zathura)
- [x] Maybe TUI archive manager (~felix-rs~, ouch in yazi)
- [ ] vimiv
- [ ] Configure
- [ ] Theme
- [ ] Lazygit: Configure
- [ ] Nvim (other repo)
- [x] Replace notification handler (noice)
- [ ] Configure formatters (of Java, Cpp, TS/JS/Vue, Python)
- [ ] Maybe: Add extra configs to commentbox
- [ ] Remove trouble (useless for my purposes)
- [ ] Yazi
- [x] Yazi
- [x] More keybinds
- [ ] Configure
- [ ] Drag and drop support?
- [ ] Check out plugins
- [x] Configure
- [ ] ~Drag and drop support?~
- [x] Check out plugins
- [x] Use as file picker
- [ ] SDDM
- [ ] Replace with LightDM or ensure theming works, but prefer replacing, consider greetd + tuigreet
- [x] SDDM
- [x] Replace with LightDM or ensure theming works, but prefer replacing, consider greetd + tuigreet
- [ ] Scripts
- [ ] Installer (after the basic OS setup is done (= from chroot onwards))
- [x] Theming script

5
scripts/auto-renamer Executable file
View File

@@ -0,0 +1,5 @@
#!/bin/sh
SCRIPT_DIR=$(dirname "$0")
node "$SCRIPT_DIR/util/auto-renamer/index.js" $@

View File

@@ -4,6 +4,5 @@ SCRIPT_DIR=$(dirname "$0")
cp "$SCRIPT_DIR/../config/lint/eslint.config.mjs" .
# TODO: Improve eslint config to include JSX and Vue configs too, read on website
npm i --save-dev @eslint/js typescript-eslint @stylistic/eslint-plugin
npm i --save-dev @eslint/js typescript-eslint @stylistic/eslint-plugin eslint-plugin-vue

View File

@@ -0,0 +1,237 @@
const fs = require('fs');
const path = require('path');
const { argv } = require('process');
const config = {
// replace character of key with value, any character, apart from ['.', '_', '-', ' ']
'replace': {
'ä': 'ae',
'ö': 'oe',
'ü': 'ue',
',': '-',
'&': 'And',
},
'rules': {
'underscore-before-and-after-number': true, // Will not do trailing or leading for filename
'enforce-leading-zero': true, // adds a leading zero to any number below 10
'camel-case-rules': {
'enforce-snake-case-for-filetypes': ['py'], // using underscores
'enforce-kebab-case-for-filetypes': ['css', 'html', 'scss', 'tex'], // using hyphens
},
'file-start-letter': 'lower', // lower, upper, unchanged
'directory-start-letter': 'upper', // lower, upper, unchanged
'replace-dots-with': '', // will not replace as leading character to not break dotfiles
}
}
/**
* Recursively find all files with extension in a directory
* @param {string} dir The directory to search. Either absolute or relative path
* @param {string} extension The file extension to look for
* @param {string[]} ignoreList A list of filenames or directories to ignore
* @returns {{ files: string, directories: string }} returns a list of html files with their full path
*/
const treeWalker = (dir, extension, ignoreList) => {
const ls = fs.readdirSync(dir);
const fileList = [];
const dirList = [];
for (let file in ls) {
if (fs.statSync(path.join(dir, ls[file])).isDirectory()) {
// Filter ignored directories
if (ignoreList === undefined || !ignoreList.includes(ls[file])) {
const newData = treeWalker(path.join(dir, ls[file]), extension, ignoreList);
const newFiles = newData.files;
dirList.push( path.join( dir, ls[ file ] ) );
for (let dir = 0; dir < newData.directories.length; dir++) {
dirList.push( newData.directories[dir] );
}
for (let file = 0; file < newFiles.length; file++) {
fileList.push(newFiles[file]);
}
}
} else if (extension == '*' || ls[file].includes(extension)) {
if (ignoreList === undefined || !ignoreList.includes(ls[file])) {
fileList.push(path.join(dir, ls[file]));
}
}
}
return { 'files': fileList, 'directories': dirList };
}
/**
* @param {string} filename The filename to fix according to the rules
* @returns {string} the fixed filename
*/
const fixName = ( fn, ft ) => {
let out = '';
const enforceSnake = config.rules['camel-case-rules']['enforce-snake-case-for-filetypes'].includes( ft );
const enforceKebab = config.rules['camel-case-rules']['enforce-kebab-case-for-filetypes'].includes( ft );
const isDir = ft === 'directory';
const startLetter = isDir ? config.rules['directory-start-letter'] : config.rules['file-start-letter'];
let nextUpperCase = false;
for ( let i = 0; i < fn.length; i++ ) {
const c = fn[i];
if ( c == '.' ) {
// Rule: Removed after number, allowed elsewhere
if ( i > 0 && /[0-9]/.test( fn[ i - 1 ] ) ) {
out += config.rules[ 'replace-dots-with' ];
} else {
out += '.';
}
} else if ( /[A-Z]/.test( c ) ) {
// If we reach a capital letter and enforce either kebab-case or snake_case, we can assume that this is the start of a CamelCase word
if ( enforceKebab ) {
out += '-' + c.toLowerCase();
} else if ( enforceSnake ) {
out += '_' + c.toLowerCase();
} else {
nextUpperCase = false;
if ( i == 0 && startLetter === 'lower' ) {
out += c.toLowerCase();
} else {
out += c;
}
}
} else if ( c == ' ' ) {
// We always replace spaces, the question is just to what
if ( enforceKebab ) {
out += '-';
} else if ( enforceSnake ) {
out += '_';
} else {
nextUpperCase = true;
}
} else if ( c == '_' ) {
// If we are not enforcing snake_case, then replace it
if ( !enforceSnake ) {
if ( needsUnderscore( i, fn ) ) {
out += '_';
} else if ( enforceKebab ) {
out += '-';
} else {
nextUpperCase = true;
}
} else {
out += '_'
}
} else if ( c == '-' ) {
// If we are not enforcing kebab-case
if ( !enforceKebab ) {
if ( enforceSnake ) {
out += '_';
} else {
nextUpperCase = true;
}
} else {
out += '-'
}
} else {
let curr = config.replace[ c ] === undefined ? c : config.replace[ c ];
if ( config.rules[ 'underscore-before-and-after-number' ] || config.rules['enforce-leading-zero'] ) {
if ( /[0-9]/.test( c ) ) {
if ( i < fn.length - 1 ) {
if ( config.rules['enforce-leading-zero'] ) {
const prevIsNumber = i > 0 && /[0-9]/.test( fn[i - 1] );
const nextIsNumber = /[0-9]/.test( fn[i + 1] );
if ( !nextIsNumber && ( i == 0|| !prevIsNumber ) ) {
curr = '0' + curr;
}
}
if ( config.rules['underscore-before-and-after-number'] ) {
if ( !( /[0-9]/.test( fn[ i + 1 ] ) ) && fn[ i + 1 ] != '_' ) {
curr += '_';
}
}
} else {
if ( config.rules['enforce-leading-zero'] && ( i > 0 && !( /[0-9]/.test( fn[i - 1] ) ) ) ) {
curr = '0' + curr;
}
}
} else {
if ( config.rules['underscore-before-and-after-number'] && /[0-9]/.test( fn[ i + 1 ] ) ) {
curr += '_';
}
}
}
if ( nextUpperCase || ( i == 0 && startLetter === 'upper' ) ) {
nextUpperCase = false;
out += curr.toUpperCase();
} else {
if ( i == 0 && startLetter === 'upper' ) {
out += curr.toUpperCase();
} else {
out += curr.toLowerCase();
}
}
}
}
return out;
}
const needsUnderscore = ( i, fn ) => {
return ( i > 0 && /[0-9]/.test( fn[ i - 1 ] ) ) || ( i < fn - 1 && /[0-9]/.test( fn[ i + 1 ] ) )
}
const separateDirAndFileAndFiletype = ( filename ) => {
const loc = filename.lastIndexOf( '/' ) + 1;
let ftl = filename.lastIndexOf( '.' ) + 1;
let fn = filename.substring( loc, ftl - 1 );
let ft = filename.substring( ftl );
if ( fs.statSync( filename ).isDirectory() ) {
ftl = filename.length;
fn = filename.substring( loc );
ft = 'directory';
}
const dir = filename.slice( 0, loc - 1 );
return { 'filename': fn, 'dir': dir, 'filetype': ft };
}
const fixDirName = ( directory, top ) => {
if ( directory === top ) {
return top;
}
const f = separateDirAndFileAndFiletype( directory );
return fixDirName( f.dir, top ) + '/' + fixName( f.filename, f.filetype );
}
if (argv[2] == '-h') {
console.log('auto-renamer [directory]\n\n=> Recursively rename files in directory');
} else if (argv[2] == '-v') {
console.log('auto-renamer version 1.0.0, developed by Janis Hutz (development@janishutz.com)');
} else {
// Recursively add all files in the directory
const fp = path.resolve( argv[2] );
const list = treeWalker(fp, '*', ['.git', '@girs']);
const files = list.files;
const directories = list.directories;
for (let i = 0; i < files.length; i++) {
const file = files[i];
const f = separateDirAndFileAndFiletype( file );
let fixedFile = fixName( f.filename, f.filetype );
// Rename
const fixedPath = f.dir + '/' + fixedFile + '.' + f.filetype;
console.log( file + ' -> ' + fixedPath );
fs.renameSync( file, fixedPath );
}
// Fix directory names after file names. Sort array by decending length
directories.sort( ( a, b ) => {
return b.length - a.length;
} );
// separate directories up until we reach the path of dir started in
for (let i = 0; i < directories.length; i++) {
const dir = directories[i];
const fixed = fixDirName( dir, fp );
console.log( dir + ' -> ' + fixed );
fs.renameSync( dir, fixDirName( dir, fp ) );
}
}

20
setup
View File

@@ -39,7 +39,7 @@ platform=$(echo "$platform" | tr '[:upper:]' '[:lower:]')
# Get user preference for regenerating the styling
regen=""
read -p "Would you like to regenerate styling? (y/N) " regen
if [ $regen == "y" ]; then
if [[ "$regen" == "y" ]]; then
cd build
node build.js
if [ $? -ne 0 ]; then
@@ -79,6 +79,7 @@ cp -r ./config/Thunar ~/.config/
cp -r ./config/wlogout/ ~/.config/
cp -r ./config/yazi ~/.config/
cp -r ./config/zathura ~/.config/
cp ./config/lint/.indentconfig.yaml ~
echo "
@@ -100,13 +101,16 @@ sudo cp ./system/environment /etc/environment
sudo cp -r ./system/greetd/* /etc/greetd/
hyprctl reload
# echo "
# => Restarting bars, etc
# "
# killall gjs
# sleep 1
# ags run -d ./config/astal --gtk4 & disown 2>&1 > /dev/null
# ags run -d ./config/ags/notifications/ & disown 2>&1 > /dev/null
echo "
=> Restarting bars, etc
-> This will take a couple of seconds to ensure them quitting properly
"
killall gjs
killall ags
sleep 5
ags run -d ~/projects/active/dotfiles/config/astal --gtk4 & disown
sleep 2
ags run -d ~/projects/active/dotfiles/config/ags/notifications & disown
echo "