summaryrefslogtreecommitdiff
path: root/.config
diff options
context:
space:
mode:
authorseraphim <18ycm9tx@anonaddy.me>2026-08-23 18:07:29 +0700
committerseraphim <18ycm9tx@anonaddy.me>2026-08-23 18:07:29 +0700
commited3e8f6ec6929327ab19e512ffb0d8ece12ed5a8 (patch)
treef1a783af87d29b8d78ce20df5a485f92b8c32d5d /.config
parent3c71645d355910b6998e97a1efca6f5a7c7608bc (diff)
reorganize directories, so everything in .config
Diffstat (limited to '.config')
-rw-r--r--.config/darkman/config.yaml3
-rw-r--r--.config/doom/config.el102
-rw-r--r--.config/doom/init.el201
-rw-r--r--.config/doom/packages.el57
-rw-r--r--.config/doom/themes/noctalia-theme.el360
-rw-r--r--.config/foot/foot.ini26
-rw-r--r--.config/gtk-3.0/settings-dark.ini2
-rw-r--r--.config/gtk-3.0/settings-light.ini2
l---------.config/gtk-3.0/settings.ini1
-rw-r--r--.config/matugen/config.toml8
-rw-r--r--.config/matugen/templates/niri.kdl6
-rw-r--r--.config/mpv/mpv.conf7
-rwxr-xr-x.config/niri/apply-colors.sh84
-rw-r--r--.config/niri/config.kdl321
-rwxr-xr-x.config/niri/set-backdrop.sh29
-rwxr-xr-x.config/niri/theme-switcher.sh135
-rw-r--r--.config/nvim/init.lua4
-rw-r--r--.config/nvim/lua/caelus/init.lua100
-rwxr-xr-x.config/nvim/lua/config/keymaps.lua13
-rwxr-xr-x.config/nvim/lua/config/options.lua40
-rw-r--r--.config/nvim/lua/config/plugins.lua101
-rw-r--r--.config/nvim/nvim-pack-lock.json116
-rw-r--r--.config/rmpc/config.ron84
-rw-r--r--.config/rmpc/theme.ron47
-rw-r--r--.config/starship.toml91
-rw-r--r--.config/vicinae/settings.json234
-rw-r--r--.config/wallust/templates/dbg.ini4
-rw-r--r--.config/wallust/templates/foot-colors-custom.ini20
-rw-r--r--.config/wallust/templates/nvim.lua306
-rw-r--r--.config/wallust/templates/shell-colors.sh20
-rw-r--r--.config/wallust/templates/vicinae-dark.toml78
-rw-r--r--.config/wallust/templates/vicinae-light.toml78
-rw-r--r--.config/wallust/wallust.toml11
-rw-r--r--.config/waybar/config.jsonc112
-rwxr-xr-x.config/waybar/kbd-layout.sh42
-rw-r--r--.config/waybar/style.css166
-rw-r--r--.config/waybar/theme-dark.css2
-rw-r--r--.config/waybar/theme-light.css2
l---------.config/waybar/theme.css1
-rw-r--r--.config/xdg-desktop-portal/portals.conf5
-rw-r--r--.config/yazi/keymap.toml9
-rw-r--r--.config/yazi/yazi.toml2
42 files changed, 3032 insertions, 0 deletions
diff --git a/.config/darkman/config.yaml b/.config/darkman/config.yaml
new file mode 100644
index 0000000..ef00ec3
--- /dev/null
+++ b/.config/darkman/config.yaml
@@ -0,0 +1,3 @@
+portal: true
+dbusserver: true
+usegeoclue: false \ No newline at end of file
diff --git a/.config/doom/config.el b/.config/doom/config.el
new file mode 100644
index 0000000..ce1b792
--- /dev/null
+++ b/.config/doom/config.el
@@ -0,0 +1,102 @@
+;; Place your private configuration here! Remember, you do not need to run 'doom
+;; sync' after modifying this file!
+
+
+;; Some functionality uses this to identify you, e.g. GPG configuration, email
+;; clients, file templates and snippets. It is optional.
+;; (setq user-full-name "John Doe"
+;; user-mail-address "john@doe.com")
+
+;; Doom exposes five (optional) variables for controlling fonts in Doom:
+;;
+;; - `doom-font' -- the primary font to use
+;; - `doom-variable-pitch-font' -- a non-monospace font (where applicable)
+;; - `doom-big-font' -- used for `doom-big-font-mode'; use this for
+;; presentations or streaming.
+;; - `doom-symbol-font' -- for symbols
+;; - `doom-serif-font' -- for the `fixed-pitch-serif' face
+;;
+;; See 'C-h v doom-font' for documentation and more examples of what they
+;; accept. For example:
+;;
+;;(setq doom-font (font-spec :family "Fira Code" :size 12 :weight 'semi-light)
+;; doom-variable-pitch-font (font-spec :family "Fira Sans" :size 13))
+;;
+;; If you or Emacs can't find your font, use 'M-x describe-font' to look them
+;; up, `M-x eval-region' to execute elisp code, and 'M-x doom/reload-font' to
+;; refresh your font settings. If Emacs still can't find your font, it likely
+;; wasn't installed correctly. Font issues are rarely Doom issues!
+
+;; There are two ways to load a theme. Both assume the theme is installed and
+;; available. You can either set `doom-theme' or manually load a theme with the
+;; `load-theme' function. This is the default:
+;; <----------------------------- Theme -------------------------------->
+(setq doom-theme 'doom-tokyo-night)
+
+;; This determines the style of line numbers in effect. If set to `nil', line
+;; numbers are disabled. For relative line numbers, set this to `relative'.
+(setq display-line-numbers-type t)
+
+;; If you use `org' and don't want your org files in the default location below,
+;; change `org-directory'. It must be set before org loads!
+(setq org-directory "~/org/")
+
+;; Whenever you reconfigure a package, make sure to wrap your config in an
+;; `with-eval-after-load' block, otherwise Doom's defaults may override your
+;; settings. E.g.
+;;
+;; (with-eval-after-load 'PACKAGE
+;; (setq x y))
+;;
+;; The exceptions to this rule:
+;;
+;; - Setting file/directory variables (like `org-directory')
+;; - Setting variables which explicitly tell you to set them before their
+;; package is loaded (see 'C-h v VARIABLE' to look them up).
+;; - Setting doom variables (which start with 'doom-' or '+').
+;;
+;; Here are some additional functions/macros that will help you configure Doom.
+;;
+;; - `load!' for loading external *.el files relative to this one
+;; - `add-load-path!' for adding directories to the `load-path', relative to
+;; this file. Emacs searches the `load-path' when you load packages with
+;; `require' or `use-package'.
+;; - `map!' for binding new keys
+;;
+;; To get information about any of these functions/macros, move the cursor over
+;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k').
+;; This will open documentation for it, including demos of how they are used.
+;; Alternatively, use `C-h o' to look up a symbol (functions, variables, faces,
+;; etc).
+;;
+;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how
+;; Gcal setting
+(setq doom-font (font-spec :family "JetBrains Mono" :size 16 :weight 'medium)
+ doom-variable-pitch-font (font-spec :family "JetBrains Mono" :size 16))
+(setq org-gcal-client-id ""
+ org-gcal-client-secret ""
+ org-gcal-fetch-file-alist '(("" . "~/org/gcal.org")))
+(setq org-agenda-files '("~/org/gcal.org"))
+
+;; Scroll fixing, 'cause it's broken a little bit.
+(setq inhibit-compacting-font-caches t)
+(setq scroll-conservatively 101 ;
+ scroll-margin 0
+ auto-window-vscroll nil)
+
+;; Prevent PGTK 100% CPU core spinning on Wayland
+;; Changed from nil to 0.001 to stop the event loop from going crazy
+(when (boundp 'pgtk-wait-for-event-timeout)
+ (setq pgtk-wait-for-event-timeout 0.01))
+
+;; Scroll settings (Consolidated)
+;; Smooth scrolling is currently disabled to save CPU on your 180Hz monitor.
+;; If you want smooth scrolling back, change -1 to 1 and change nil to t below.
+(pixel-scroll-precision-mode -1)
+(setq pixel-scroll-precision-mode nil)
+
+;; Reduce redraw frequency
+(setq redisplay-dont-pause t
+ fast-but-imprecise-scrolling t)
+;; (setq gc-cons-threshold 100000000)
+(setq read-process-output-max (* 1024 1024)) ; 1MB
diff --git a/.config/doom/init.el b/.config/doom/init.el
new file mode 100644
index 0000000..91a3004
--- /dev/null
+++ b/.config/doom/init.el
@@ -0,0 +1,201 @@
+;;; init.el -*- lexical-binding: t; -*-
+
+;; This file controls what Doom modules are enabled and what order they load
+;; in. Remember to run 'doom sync' after modifying it!
+
+;; NOTE: Press 'SPC h d h' (or 'C-h d h' for non-vim users) to access Doom's
+;; documentation. There you'll find a link to Doom's Module Index where all of
+;; our modules are listed, including what flags they support.
+
+;; NOTE: Move your cursor over a module's name (or its flags) and press 'K' (or
+;; 'C-c c k' for non-vim users) to view its documentation. This works on flags
+;; as well (those symbols that start with a plus).
+;;
+;; Alternatively, press 'gd' (or 'C-c c d') on a module to browse its
+;; directory (for easy access to its source code).
+
+(doom! :input
+ ;;bidi ; (tfel ot) thgir etirw uoy gnipleh
+ ;;chinese
+ ;;japanese
+ ;;layout ; auie,ctsrnm is the superior home row
+
+ :completion
+ ;;company ; the ultimate code completion backend
+ (corfu +orderless) ; complete with cap(f), cape and a flying feather!
+ ;;helm ; the *other* search engine for love and life
+ ;;ido ; the other *other* search engine...
+ ;;ivy ; a search engine for love and life
+ vertico ; the search engine of the future
+
+ :ui
+ ;;deft ; notational velocity for Emacs
+ doom ; what makes DOOM look the way it does
+ dashboard ; a nifty splash screen for Emacs
+ ;;doom-quit ; DOOM quit-message prompts when you quit Emacs
+ ;;(emoji +unicode) ; 🙂
+ hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW
+ ;;indent-guides ; highlighted indent columns
+ ;;ligatures ; ligatures and symbols to make your code pretty again
+ ;;minimap ; show a map of the code on the side
+ modeline ; snazzy, Atom-inspired modeline, plus API
+ ;;nav-flash ; blink cursor line after big motions
+ ;;neotree ; a project drawer, like NERDTree for vim
+ ophints ; highlight the region an operation acts on
+ (popup +defaults) ; tame sudden yet inevitable temporary windows
+ ;;smooth-scroll ; So smooth you won't believe it's not butter
+ ;;tabs ; a tab bar for Emacs
+ ;;treemacs ; a project drawer, like neotree but cooler
+ ;;unicode ; extended unicode support for various languages
+ (vc-gutter +pretty) ; vcs diff in the fringe
+ vi-tilde-fringe ; fringe tildes to mark beyond EOB
+ ;;window-select ; visually switch windows
+ workspaces ; tab emulation, persistence & separate workspaces
+ ;;zen ; distraction-free coding or writing
+
+ :editor
+ (evil +everywhere); come to the dark side, we have cookies
+ file-templates ; auto-snippets for empty files
+ fold ; (nigh) universal code folding
+ ;;(format +onsave) ; automated prettiness
+ ;;god ; run Emacs commands without modifier keys
+ ;;lispy ; vim for lisp, for people who don't like vim
+ ;;multiple-cursors ; editing in many places at once
+ ;;objed ; text object editing for the innocent
+ ;;parinfer ; turn lisp into python, sort of
+ ;;rotate-text ; cycle region at point between text candidates
+ snippets ; my elves. They type so I don't have to
+ (whitespace +guess +trim) ; a butler for your whitespace
+ ;;word-wrap ; soft wrapping with language-aware indent
+
+ :emacs
+ dired ; making dired pretty [functional]
+ electric ; smarter, keyword-based electric-indent
+ ;;eww ; the internet is gross
+ ;;ibuffer ; interactive buffer management
+ tramp ; remote files at your arthritic fingertips
+ undo ; persistent, smarter undo for your inevitable mistakes
+ vc ; version-control and Emacs, sitting in a tree
+
+ :term
+ ;;eshell ; the elisp shell that works everywhere
+ ;;shell ; simple shell REPL for Emacs
+ ;;term ; basic terminal emulator for Emacs
+ vterm ; the best terminal emulation in Emacs
+
+ :checkers
+ syntax ; tasing you for every semicolon you forget
+ (spell +flyspell) ; tasing you for misspelling mispelling
+ grammar ; tasing grammar mistake every you make
+
+ :tools
+ ;;ansible
+ ;;biblio ; Writes a PhD for you (citation needed)
+ ;;collab ; buffers with friends
+ ;;debugger ; stepping through code, to help you add bugs
+ ;;direnv
+ ;;docker
+ ;;editorconfig ; let someone else argue about tabs vs spaces
+ ;;ein ; tame Jupyter notebooks with emacs
+ (eval +overlay) ; run code, run (also, repls)
+ lookup ; navigate your code and its documentation
+ ;;llm ; when I said you needed friends, I didn't mean...
+ ;;(lsp +eglot) ; M-x vscode
+ magit ; a git porcelain for Emacs
+ ;;make ; run make tasks from Emacs
+ ;;pass ; password manager for nerds
+ ;;pdf ; pdf enhancements
+ ;;terraform ; infrastructure as code
+ ;;tmux ; an API for interacting with tmux
+ ;;tree-sitter ; syntax and parsing, sitting in a tree...
+ ;;upload ; map local to remote projects via ssh/ftp
+
+ :os
+ (:if (featurep :system 'macos) macos) ; improve compatibility with macOS
+ tty ; improve the terminal Emacs experience
+
+ :lang
+ ;;ada ; In strong typing we (blindly) trust
+ ;;(agda +local) ; types of types of types of types...
+ ;;beancount ; mind the GAAP
+ (cc +lsp) ; C > C++ == 1
+ ;;clojure ; java with a lisp
+ ;;common-lisp ; if you've seen one lisp, you've seen them all
+ ;;coq ; proofs-as-programs
+ ;;crystal ; ruby at the speed of c
+ ;;csharp ; unity, .NET, and mono shenanigans
+ ;;data ; config/data formats
+ ;;(dart +flutter) ; paint ui and not much else
+ ;;dhall
+ ;;elixir ; erlang done right
+ ;;elm ; care for a cup of TEA?
+ emacs-lisp ; drown in parentheses
+ ;;erlang ; an elegant language for a more civilized age
+ ;;ess ; emacs speaks statistics
+ ;;factor
+ ;;faust ; dsp, but you get to keep your soul
+ ;;fortran ; in FORTRAN, GOD is REAL (unless declared INTEGER)
+ ;;fsharp ; ML stands for Microsoft's Language
+ ;;fstar ; (dependent) types and (monadic) effects and Z3
+ ;;gdscript ; the language you waited for
+ ;;(go +lsp) ; the hipster dialect
+ ;;(graphql +lsp) ; Give queries a REST
+ ;;(haskell +lsp) ; a language that's lazier than I am
+ ;;hy ; readability of scheme w/ speed of python
+ ;;idris ; a language you can depend on
+ ;;json ; At least it ain't XML
+ ;;janet ; Fun fact: Janet is me!
+ ;;(java +lsp) ; the poster child for carpal tunnel syndrome
+ ;;javascript ; all(hope(abandon(ye(who(enter(here))))))
+ ;;julia ; a better, faster MATLAB
+ ;;kotlin ; a better, slicker Java(Script)
+ ;;latex ; writing papers in Emacs has never been so fun
+ ;;lean ; for folks with too much to prove
+ ;;ledger ; be audit you can be
+ ;;lua ; one-based indices? one-based indices
+ markdown ; writing docs for people to ignore
+ ;;nim ; python + lisp at the speed of c
+ ;;nix ; I hereby declare "nix geht mehr!"
+ ;;ocaml ; an objective camel
+ ;;odin ; C, minus its footguns
+ (org +roam@) ; organize your plain life in plain text
+ ;;php ; perl's insecure younger brother
+ ;;plantuml ; diagrams for confusing people more
+ ;;graphviz ; diagrams for confusing yourself even more
+ ;;purescript ; javascript, but functional
+ python ; beautiful is better than ugly
+ ;;qt ; the 'cutest' gui framework ever
+ ;;racket ; a DSL for DSLs
+ ;;raku ; the artist formerly known as perl6
+ ;;rest ; Emacs as a REST client
+ ;;rst ; ReST in peace
+ ;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"}
+ (rust +lsp) ; Fe2O3.unwrap().unwrap().unwrap().unwrap()
+ ;;scad ; trust the preview, regret the render
+ ;;scala ; java, but good
+ ;;(scheme +guile) ; a fully conniving family of lisps
+ sh ; she sells {ba,z,fi}sh shells on the C xor
+ ;;sml
+ ;;solidity ; do you need a blockchain? No.
+ ;;swift ; who asked for emoji variables?
+ ;;terra ; Earth and Moon in alignment for performance.
+ ;;web ; the tubes
+ ;;yaml ; JSON, but readable
+ ;;zig ; C, but simpler
+
+
+ :email
+ ;;(mu4e +org +gmail)
+ ;;notmuch
+ ;;(wanderlust +gmail)
+
+ :app
+ calendar
+ ;;emms
+ ;;everywhere ; *leave* Emacs!? You must be joking
+ ;;irc ; how neckbeards socialize
+ ;;(rss +org) ; emacs as an RSS reader
+
+ :config
+ ;;literate
+ (default +bindings +smartparens))
diff --git a/.config/doom/packages.el b/.config/doom/packages.el
new file mode 100644
index 0000000..e50988d
--- /dev/null
+++ b/.config/doom/packages.el
@@ -0,0 +1,57 @@
+;; -*- no-byte-compile: t; -*-
+;;; $DOOMDIR/packages.el
+
+;; To install a package:
+;;
+;; 1. Declare them here in a `package!' statement,
+;; 2. Run 'doom sync' in the shell,
+;; 3. Restart Emacs.
+;;
+;; Use 'C-h f package\!' to look up documentation for the `package!' macro.
+
+
+;; To install SOME-PACKAGE from MELPA, ELPA or emacsmirror:
+;; (package! some-package)
+
+;; To install a package directly from a remote git repo, you must specify a
+;; `:recipe'. You'll find documentation on what `:recipe' accepts here:
+;; https://github.com/radian-software/straight.el#the-recipe-format
+;; (package! another-package
+;; :recipe (:host github :repo "username/repo"))
+
+;; If the package you are trying to install does not contain a PACKAGENAME.el
+;; file, or is located in a subdirectory of the repo, you'll need to specify
+;; `:files' in the `:recipe':
+;; (package! this-package
+;; :recipe (:host github :repo "username/repo"
+;; :files ("some-file.el" "src/lisp/*.el")))
+
+;; If you'd like to disable a package included with Doom, you can do so here
+;; with the `:disable' property:
+;; (package! builtin-package :disable t)
+
+;; You can override the recipe of a built in package without having to specify
+;; all the properties for `:recipe'. These will inherit the rest of its recipe
+;; from Doom or MELPA/ELPA/Emacsmirror:
+;; (package! builtin-package :recipe (:nonrecursive t))
+;; (package! builtin-package-2 :recipe (:repo "myfork/package"))
+
+;; Specify a `:branch' to install a package from a particular branch or tag.
+;; This is required for some packages whose default branch isn't 'master' (which
+;; our package manager can't deal with; see radian-software/straight.el#279)
+;; (package! builtin-package :recipe (:branch "develop"))
+
+;; Use `:pin' to specify a particular commit to install.
+;; (package! builtin-package :pin "1a2b3c4d5e")
+
+
+;; Doom's packages are pinned to a specific commit and updated from release to
+;; release. The `unpin!' macro allows you to unpin single packages...
+;; (unpin! pinned-package)
+;; ...or multiple packages
+;; (unpin! pinned-package another-pinned-package)
+;; ...Or *all* packages (NOT RECOMMENDED; will likely break things)
+;; (unpin! t)
+(package! org-gcal)
+(package! calfw)
+(package! calfw-org)
diff --git a/.config/doom/themes/noctalia-theme.el b/.config/doom/themes/noctalia-theme.el
new file mode 100644
index 0000000..be14fda
--- /dev/null
+++ b/.config/doom/themes/noctalia-theme.el
@@ -0,0 +1,360 @@
+;;; noctalia-theme.el --- Theme using Template SCSS variables -*- lexical-binding: t -*-
+
+;; Copyright (C) 2025
+
+;; Author: Generated (Improved)
+;; Version: 1.2
+;; Package-Requires: ((emacs "24.1"))
+;; Keywords: faces
+
+;;; Commentary:
+
+;; A theme using Template SCSS variables with quality of life improvements:
+;; - Better source block distinction
+;; - Improved text visibility when selected
+;; - Refined org-mode styling with hidden asterisks
+;; - Enhanced contrast and readability
+;; - Seamless integration of source blocks with consistent styling
+
+;;; Code:
+
+(deftheme noctalia "Theme using Template variables with quality of life improvements.")
+
+;; Define all the color variables (replaced by template processor)
+(let* ((bg "#fef8f4")
+ (err "#ba1a1a")
+ (err-container "#ffdad6")
+ (on-background "#1d1b19")
+ (on-err "#ffffff")
+ (on-err-container "#93000a")
+ (on-primary "#ffffff")
+ (on-primary-container "#fffbff")
+ (on-secondary "#ffffff")
+ (on-secondary-container "#696456")
+ (on-surface "#1d1b19")
+ (on-surface-variant "#4a463d")
+ (on-tertiary "#ffffff")
+ (on-tertiary-container "#f9ffed")
+ (outline-color "#7b776c")
+ (outline-variant "#ccc6b9")
+ (primary "#645c3f")
+ (primary-container "#7e7456")
+ (secondary "#635e50")
+ (secondary-container "#eae2d0")
+ (shadow "#000000")
+ (surface "#fef8f4")
+ (surface-container "#f2ede9")
+ (surface-container-high "#ece7e3")
+ (surface-container-highest "#e6e2dd")
+ (surface-container-low "#f8f3ee")
+ (surface-container-lowest "#ffffff")
+ (surface-variant "#e9e2d4")
+ (tertiary "#54604a")
+ (tertiary-container "#6c7861")
+ ;; Map success colors to tertiary (as used in other templates)
+ (success "#54604a")
+ (on-success "#ffffff")
+ (success-container "#6c7861")
+ (on-success-container "#f9ffed")
+ ;; Map fixed colors to regular colors
+ (primary-fixed "#645c3f")
+ (primary-fixed-dim "#7e7456")
+ (secondary-fixed "#635e50")
+ (secondary-fixed-dim "#eae2d0")
+ (tertiary-fixed "#54604a")
+ (tertiary-fixed-dim "#6c7861")
+ (on-primary-fixed "#ffffff")
+ (on-primary-fixed-variant "#fffbff")
+ (on-secondary-fixed "#ffffff")
+ (on-secondary-fixed-variant "#696456")
+ (on-tertiary-fixed "#ffffff")
+ (on-tertiary-fixed-variant "#f9ffed")
+ ;; Map inverse colors to surface variants
+ (inverse-on-surface "#1d1b19")
+ (inverse-primary "#645c3f")
+ (inverse-surface "#fef8f4")
+ ;; ANSI terminal colors
+ (term0 "#e9e2d4")
+ (term1 "#ba1a1a")
+ (term2 "#645c3f")
+ (term3 "#635e50")
+ (term4 "#54604a")
+ (term5 "#7e7252")
+ (term6 "#797263")
+ (term7 "#1d1b19")
+ (term8 "#7b776c")
+ (term9 "#ba1a1a")
+ (term10 "#645c3f")
+ (term11 "#635e50")
+ (term12 "#54604a")
+ (term13 "#7e7252")
+ (term14 "#797263")
+ (term15 "#1d1b19"))
+
+ (custom-theme-set-faces
+ 'noctalia
+ ;; Basic faces
+ `(default ((t (:background ,bg :foreground ,on-background))))
+ `(cursor ((t (:background ,primary))))
+ `(highlight ((t (:background ,surface-container-high))))
+ `(region ((t (:background ,primary-container :foreground ,on-primary-container :extend t))))
+ `(secondary-selection ((t (:background ,secondary-container :foreground ,on-secondary-container :extend t))))
+ `(isearch ((t (:background ,tertiary-container :foreground ,on-tertiary-container :weight bold))))
+ `(lazy-highlight ((t (:background ,secondary-container :foreground ,on-secondary-container))))
+ `(vertical-border ((t (:foreground ,surface-variant))))
+ `(border ((t (:background ,surface-variant :foreground ,surface-variant))))
+ `(fringe ((t (:background ,surface :foreground ,outline-variant))))
+ `(shadow ((t (:foreground ,outline-variant))))
+ `(link ((t (:foreground ,primary :underline t))))
+ `(link-visited ((t (:foreground ,tertiary :underline t))))
+ `(success ((t (:foreground ,success))))
+ `(warning ((t (:foreground ,secondary))))
+ `(error ((t (:foreground ,err))))
+ `(match ((t (:background ,secondary-container :foreground ,on-secondary-container))))
+
+ ;; Font-lock
+ `(font-lock-builtin-face ((t (:foreground ,primary))))
+ `(font-lock-comment-face ((t (:foreground ,outline-color :slant italic))))
+ `(font-lock-comment-delimiter-face ((t (:foreground ,outline-variant))))
+ `(font-lock-constant-face ((t (:foreground ,tertiary :weight bold))))
+ `(font-lock-doc-face ((t (:foreground ,on-surface-variant :slant italic))))
+ `(font-lock-function-name-face ((t (:foreground ,primary :weight bold))))
+ `(font-lock-keyword-face ((t (:foreground ,secondary :weight bold))))
+ `(font-lock-string-face ((t (:foreground ,tertiary))))
+ `(font-lock-type-face ((t (:foreground ,primary-fixed))))
+ `(font-lock-variable-name-face ((t (:foreground ,on-surface))))
+ `(font-lock-warning-face ((t (:foreground ,err :weight bold))))
+ `(font-lock-preprocessor-face ((t (:foreground ,secondary-fixed-dim))))
+ `(font-lock-negation-char-face ((t (:foreground ,tertiary-fixed))))
+
+ ;; Show paren
+ `(show-paren-match ((t (:background ,primary-container :foreground ,on-primary-container :weight bold))))
+ `(show-paren-mismatch ((t (:background ,err-container :foreground ,on-err-container :weight bold))))
+
+ ;; Mode line - improved status bar styling
+ `(mode-line ((t (:background ,surface-container-high :foreground ,on-surface :box nil))))
+ `(mode-line-inactive ((t (:background ,surface :foreground ,on-surface-variant :box nil))))
+ `(mode-line-buffer-id ((t (:foreground ,primary :weight bold))))
+ `(mode-line-emphasis ((t (:foreground ,primary :weight bold))))
+ `(mode-line-highlight ((t (:foreground ,primary :box nil))))
+
+ ;; Improved Source blocks - make them integrated with the theme
+ `(org-block ((t (:background ,surface-container-low :extend t :inherit fixed-pitch))))
+ `(org-block-begin-line ((t (:background ,surface-container-low :foreground ,primary-fixed-dim :extend t :slant italic :inherit fixed-pitch))))
+ `(org-block-end-line ((t (:background ,surface-container-low :foreground ,primary-fixed-dim :extend t :slant italic :inherit fixed-pitch))))
+ `(org-code ((t (:background ,surface-container-low :foreground ,tertiary-fixed :inherit fixed-pitch))))
+ `(org-verbatim ((t (:background ,surface-container-low :foreground ,primary-fixed :inherit fixed-pitch))))
+ `(org-meta-line ((t (:foreground ,outline-color :slant italic))))
+
+ ;; Org mode with hidden asterisks
+ `(org-level-1 ((t (:foreground ,primary :weight bold :height 1.2))))
+ `(org-level-2 ((t (:foreground ,secondary :weight bold :height 1.1))))
+ `(org-level-3 ((t (:foreground ,tertiary :weight bold))))
+ `(org-level-4 ((t (:foreground ,primary :weight bold))))
+ `(org-level-5 ((t (:foreground ,secondary :weight bold))))
+ `(org-level-6 ((t (:foreground ,tertiary :weight bold))))
+ `(org-level-7 ((t (:foreground ,primary :weight bold))))
+ `(org-level-8 ((t (:foreground ,secondary :weight bold))))
+ `(org-document-title ((t (:foreground ,primary :weight bold :height 1.3))))
+ `(org-document-info ((t (:foreground ,primary-container))))
+ `(org-todo ((t (:foreground ,err :weight bold))))
+ `(org-done ((t (:foreground ,success :weight bold))))
+ `(org-headline-done ((t (:foreground ,on-surface-variant))))
+ `(org-hide ((t (:foreground ,bg)))) ;; Hide leading asterisks
+ `(org-ellipsis ((t (:foreground ,tertiary :underline nil)))) ;; Style for folded content indicator
+ `(org-table ((t (:foreground ,secondary-fixed :inherit fixed-pitch))))
+ `(org-formula ((t (:foreground ,tertiary :inherit fixed-pitch))))
+ `(org-checkbox ((t (:foreground ,primary :weight bold :inherit fixed-pitch))))
+ `(org-date ((t (:foreground ,secondary-fixed :underline t))))
+ `(org-special-keyword ((t (:foreground ,on-surface-variant :slant italic))))
+ `(org-tag ((t (:foreground ,outline-color :weight normal))))
+
+ ;; Magit
+ `(magit-section-highlight ((t (:background ,surface-container-low))))
+ `(magit-diff-hunk-heading ((t (:background ,surface-container :foreground ,on-surface-variant))))
+ `(magit-diff-hunk-heading-highlight ((t (:background ,surface-container-high :foreground ,on-surface))))
+ `(magit-diff-context ((t (:foreground ,on-surface-variant))))
+ `(magit-diff-context-highlight ((t (:background ,surface-container-low :foreground ,on-surface))))
+ `(magit-diff-added ((t (:background ,success-container :foreground ,on-success-container))))
+ `(magit-diff-added-highlight ((t (:background ,success-container :foreground ,on-success-container :weight bold))))
+ `(magit-diff-removed ((t (:background ,err-container :foreground ,on-err-container))))
+ `(magit-diff-removed-highlight ((t (:background ,err-container :foreground ,on-err-container :weight bold))))
+ `(magit-hash ((t (:foreground ,outline-color))))
+ `(magit-branch-local ((t (:foreground ,tertiary :weight bold))))
+ `(magit-branch-remote ((t (:foreground ,primary :weight bold))))
+
+ ;; Company
+ `(company-tooltip ((t (:background ,surface-container :foreground ,on-surface))))
+ `(company-tooltip-selection ((t (:background ,primary-container :foreground ,on-primary-container))))
+ `(company-tooltip-common ((t (:foreground ,primary))))
+ `(company-tooltip-common-selection ((t (:foreground ,on-primary-container :weight bold))))
+ `(company-tooltip-annotation ((t (:foreground ,tertiary))))
+ `(company-scrollbar-fg ((t (:background ,primary))))
+ `(company-scrollbar-bg ((t (:background ,surface-variant))))
+ `(company-preview ((t (:foreground ,on-surface-variant :slant italic))))
+ `(company-preview-common ((t (:foreground ,primary :slant italic))))
+
+ ;; Ido
+ `(ido-first-match ((t (:foreground ,primary :weight bold))))
+ `(ido-only-match ((t (:foreground ,tertiary :weight bold))))
+ `(ido-subdir ((t (:foreground ,secondary))))
+ `(ido-indicator ((t (:foreground ,err))))
+ `(ido-virtual ((t (:foreground ,outline-color))))
+
+ ;; Helm
+ `(helm-selection ((t (:background ,primary-container :foreground ,on-primary-container))))
+ `(helm-match ((t (:foreground ,primary :weight bold))))
+ `(helm-source-header ((t (:background ,surface-container-high :foreground ,primary :weight bold :height 1.1))))
+ `(helm-candidate-number ((t (:foreground ,tertiary :weight bold))))
+ `(helm-ff-directory ((t (:foreground ,primary :weight bold))))
+ `(helm-ff-file ((t (:foreground ,on-surface))))
+ `(helm-ff-executable ((t (:foreground ,tertiary))))
+
+ ;; corfu
+ `(corfu-default ((t (:background ,surface-container :foreground ,on-surface))))
+ `(corfu-current ((t (:background ,primary-container :foreground ,on-primary-container))))
+
+ ;; Which-key
+ `(which-key-key-face ((t (:foreground ,primary :weight bold))))
+ `(which-key-separator-face ((t (:foreground ,outline-variant))))
+ `(which-key-command-description-face ((t (:foreground ,on-surface))))
+ `(which-key-group-description-face ((t (:foreground ,secondary))))
+ `(which-key-special-key-face ((t (:foreground ,tertiary :weight bold))))
+
+ ;; Line numbers
+ `(line-number ((t (:foreground ,outline-variant :inherit fixed-pitch))))
+ `(line-number-current-line ((t (:foreground ,primary :weight bold :inherit fixed-pitch))))
+
+ ;; Parenthesis matching
+ `(sp-show-pair-match-face ((t (:background ,primary-container :foreground ,on-primary-container))))
+ `(sp-show-pair-mismatch-face ((t (:background ,err-container :foreground ,on-err-container))))
+
+ ;; Rainbow delimiters
+ `(rainbow-delimiters-depth-1-face ((t (:foreground ,primary))))
+ `(rainbow-delimiters-depth-2-face ((t (:foreground ,secondary))))
+ `(rainbow-delimiters-depth-3-face ((t (:foreground ,tertiary))))
+ `(rainbow-delimiters-depth-4-face ((t (:foreground ,primary-fixed))))
+ `(rainbow-delimiters-depth-5-face ((t (:foreground ,secondary-fixed))))
+ `(rainbow-delimiters-depth-6-face ((t (:foreground ,tertiary-fixed))))
+ `(rainbow-delimiters-depth-7-face ((t (:foreground ,primary-fixed-dim))))
+ `(rainbow-delimiters-depth-8-face ((t (:foreground ,secondary-fixed-dim))))
+ `(rainbow-delimiters-depth-9-face ((t (:foreground ,tertiary-fixed-dim))))
+ `(rainbow-delimiters-mismatched-face ((t (:foreground ,err :weight bold))))
+ `(rainbow-delimiters-unmatched-face ((t (:foreground ,err :weight bold))))
+
+ ;; Dired
+ `(dired-directory ((t (:foreground ,primary :weight bold))))
+ `(dired-ignored ((t (:foreground ,outline-variant))))
+ `(dired-flagged ((t (:foreground ,err))))
+ `(dired-marked ((t (:foreground ,tertiary :weight bold))))
+ `(dired-symlink ((t (:foreground ,secondary :slant italic))))
+ `(dired-header ((t (:foreground ,primary :weight bold :height 1.1))))
+
+ ;; Terminal colors
+ `(term-color-black ((t (:foreground ,term0 :background ,term0))))
+ `(term-color-red ((t (:foreground ,term1 :background ,term1))))
+ `(term-color-green ((t (:foreground ,term2 :background ,term2))))
+ `(term-color-yellow ((t (:foreground ,term3 :background ,term3))))
+ `(term-color-blue ((t (:foreground ,term4 :background ,term4))))
+ `(term-color-magenta ((t (:foreground ,term5 :background ,term5))))
+ `(term-color-cyan ((t (:foreground ,term6 :background ,term6))))
+ `(term-color-white ((t (:foreground ,term7 :background ,term7))))
+
+ ;; EShell
+ `(eshell-prompt ((t (:foreground ,primary :weight bold))))
+ `(eshell-ls-directory ((t (:foreground ,primary :weight bold))))
+ `(eshell-ls-symlink ((t (:foreground ,secondary :slant italic))))
+ `(eshell-ls-executable ((t (:foreground ,tertiary))))
+ `(eshell-ls-archive ((t (:foreground ,on-tertiary-container))))
+ `(eshell-ls-backup ((t (:foreground ,outline-variant))))
+ `(eshell-ls-clutter ((t (:foreground ,err))))
+ `(eshell-ls-missing ((t (:foreground ,err))))
+ `(eshell-ls-product ((t (:foreground ,on-surface-variant))))
+ `(eshell-ls-readonly ((t (:foreground ,on-surface-variant))))
+ `(eshell-ls-special ((t (:foreground ,secondary-fixed))))
+ `(eshell-ls-unreadable ((t (:foreground ,outline-variant))))
+
+ ;; Improved markdown mode
+ `(markdown-header-face ((t (:foreground ,primary :weight bold))))
+ `(markdown-header-face-1 ((t (:foreground ,primary :weight bold :height 1.2))))
+ `(markdown-header-face-2 ((t (:foreground ,primary-container :weight bold :height 1.1))))
+ `(markdown-header-face-3 ((t (:foreground ,secondary :weight bold))))
+ `(markdown-header-face-4 ((t (:foreground ,secondary-container :weight bold))))
+ `(markdown-inline-code-face ((t (:foreground ,tertiary-fixed :background ,surface-container-low :inherit fixed-pitch))))
+ `(markdown-code-face ((t (:background ,surface-container-low :extend t :inherit fixed-pitch))))
+ `(markdown-pre-face ((t (:background ,surface-container-low :inherit fixed-pitch))))
+ `(markdown-table-face ((t (:foreground ,secondary-fixed :inherit fixed-pitch))))
+
+ ;; Web mode
+ `(web-mode-html-tag-face ((t (:foreground ,primary))))
+ `(web-mode-html-tag-bracket-face ((t (:foreground ,on-surface-variant))))
+ `(web-mode-html-attr-name-face ((t (:foreground ,secondary))))
+ `(web-mode-html-attr-value-face ((t (:foreground ,tertiary))))
+ `(web-mode-css-selector-face ((t (:foreground ,primary))))
+ `(web-mode-css-property-name-face ((t (:foreground ,secondary))))
+ `(web-mode-css-string-face ((t (:foreground ,tertiary))))
+
+ ;; Flycheck
+ `(flycheck-error ((t (:underline (:style wave :color ,err)))))
+ `(flycheck-warning ((t (:underline (:style wave :color ,secondary)))))
+ `(flycheck-info ((t (:underline (:style wave :color ,tertiary)))))
+ `(flycheck-fringe-error ((t (:foreground ,err))))
+ `(flycheck-fringe-warning ((t (:foreground ,secondary))))
+ `(flycheck-fringe-info ((t (:foreground ,tertiary))))
+
+ ;; Mini-buffer customization
+ `(minibuffer-prompt ((t (:foreground ,primary :weight bold))))
+
+ ;; Improved search highlighting
+ `(lsp-face-highlight-textual ((t (:background ,primary-container :foreground ,on-primary-container :weight bold))))
+ `(lsp-face-highlight-read ((t (:background ,secondary-container :foreground ,on-secondary-container :weight bold))))
+ `(lsp-face-highlight-write ((t (:background ,tertiary-container :foreground ,on-tertiary-container :weight bold))))
+
+ ;; Info and help modes
+ `(info-title-1 ((t (:foreground ,primary :weight bold :height 1.3))))
+ `(info-title-2 ((t (:foreground ,primary-container :weight bold :height 1.2))))
+ `(info-title-3 ((t (:foreground ,secondary :weight bold :height 1.1))))
+ `(info-title-4 ((t (:foreground ,secondary-container :weight bold))))
+ `(Info-quoted ((t (:foreground ,tertiary))))
+ `(info-menu-header ((t (:foreground ,primary :weight bold))))
+ `(info-menu-star ((t (:foreground ,primary))))
+ `(info-node ((t (:foreground ,tertiary :weight bold))))
+
+ ;; Tabs
+ `(tab-bar ((t (:background ,surface-container-high :foreground ,on-surface :box nil))))
+ `(tab-bar-tab ((t (:background ,surface-container-high :foreground ,on-surface :weight bold :box nil))))
+ `(tab-bar-tab-inactive ((t (:background ,surface :foreground ,on-surface-variant :box nil))))
+
+ `(tab-line ((t (:background ,surface-container-high :foreground ,on-surface :box nil))))
+ `(tab-line-tab ((t (:background ,surface :foreground ,on-surface-variant :box nil))))
+ `(tab-line-tab-current ((t (:background ,surface-container-high :foreground ,on-surface :weight bold :box nil))))
+ `(tab-line-tab-inactive ((t (:background ,surface :foreground ,on-surface-variant :box nil))))
+ `(tab-line-highlight ((t (:background ,surface-container-highest :foreground ,on-surface))))
+
+ `(centaur-tabs-default ((t (:background ,surface-container-high :foreground ,on-surface))))
+ `(centaur-tabs-selected ((t (:background ,surface-container-high :foreground ,on-surface :weight bold))))
+ `(centaur-tabs-unselected ((t (:background ,surface :foreground ,on-surface-variant))))
+ `(centaur-tabs-selected-modified ((t (:background ,surface-container-high :foreground ,tertiary :weight bold))))
+ `(centaur-tabs-unselected-modified ((t (:background ,surface :foreground ,tertiary))))
+ `(centaur-tabs-active-bar-face ((t (:background ,primary))))
+
+ ;; Fixed-pitch faces
+ `(fixed-pitch ((t (:family "monospace"))))
+ `(fixed-pitch-serif ((t (:family "monospace serif"))))
+
+ ;; Variable-pitch face
+ `(variable-pitch ((t (:family "sans serif"))))
+ ))
+
+;; Add org-mode hooks for hiding leading stars
+(with-eval-after-load 'org
+ (setq org-hide-leading-stars t)
+ (setq org-startup-indented t))
+
+;;;###autoload
+(when load-file-name
+ (add-to-list 'custom-theme-load-path
+ (file-name-as-directory (file-name-directory load-file-name))))
+
+(provide-theme 'noctalia)
+;;; noctalia-theme.el ends here
diff --git a/.config/foot/foot.ini b/.config/foot/foot.ini
new file mode 100644
index 0000000..2a81398
--- /dev/null
+++ b/.config/foot/foot.ini
@@ -0,0 +1,26 @@
+[main]
+include=~/.cache/wallust/foot-theme.ini
+font=JetBrainsMono Nerd Font:size=13
+pad=0x0
+
+# paste the rest of your theme colors here
+
+[cursor]
+style=block
+blink=yes
+
+[mouse]
+hide-when-typing=yes
+
+[scrollback]
+lines=10000
+multiplier=1.5
+
+[key-bindings]
+clipboard-copy=Control+Shift+c Control+Insert
+clipboard-paste=Control+Shift+v Shift+Insert
+primary-paste=none
+
+search-start=Control+Shift+f
+spawn-terminal=Control+Shift+Return
+
diff --git a/.config/gtk-3.0/settings-dark.ini b/.config/gtk-3.0/settings-dark.ini
new file mode 100644
index 0000000..0f580e6
--- /dev/null
+++ b/.config/gtk-3.0/settings-dark.ini
@@ -0,0 +1,2 @@
+[Settings]
+gtk-application-prefer-dark-theme=1 \ No newline at end of file
diff --git a/.config/gtk-3.0/settings-light.ini b/.config/gtk-3.0/settings-light.ini
new file mode 100644
index 0000000..d9938f7
--- /dev/null
+++ b/.config/gtk-3.0/settings-light.ini
@@ -0,0 +1,2 @@
+[Settings]
+gtk-application-prefer-dark-theme=0 \ No newline at end of file
diff --git a/.config/gtk-3.0/settings.ini b/.config/gtk-3.0/settings.ini
new file mode 120000
index 0000000..ef98ebb
--- /dev/null
+++ b/.config/gtk-3.0/settings.ini
@@ -0,0 +1 @@
+settings-dark.ini \ No newline at end of file
diff --git a/.config/matugen/config.toml b/.config/matugen/config.toml
new file mode 100644
index 0000000..9b72eee
--- /dev/null
+++ b/.config/matugen/config.toml
@@ -0,0 +1,8 @@
+[config]
+# Disable caching so the -m light/dark mode flag is always respected.
+caching = false
+version_check = false
+
+[templates.niri]
+input_path = './templates/niri.kdl'
+output_path = '/home/seraphim/.cache/matugen/theme.kdl'
diff --git a/.config/matugen/templates/niri.kdl b/.config/matugen/templates/niri.kdl
new file mode 100644
index 0000000..afc1f04
--- /dev/null
+++ b/.config/matugen/templates/niri.kdl
@@ -0,0 +1,6 @@
+layout {
+ focus-ring {
+ active-color "{{ colors.primary.default.hex }}"
+ inactive-color "{{ colors.outline.default.hex }}"
+ }
+}
diff --git a/.config/mpv/mpv.conf b/.config/mpv/mpv.conf
new file mode 100644
index 0000000..8311c18
--- /dev/null
+++ b/.config/mpv/mpv.conf
@@ -0,0 +1,7 @@
+volume=30
+ytdl-raw-options-append=cookies=/home/seraphim/Documents/yt-dlp-things/cookies.txt
+#ytdl-raw-options-append=cookies-from-browser=chromium+gnomekeyring
+ytdl-raw-options-append=write-subs=
+ytdl-raw-options-append=write-auto-subs=
+ytdl-raw-options-append=sub-langs=en,en-US,en-GB
+slang=en,eng
diff --git a/.config/niri/apply-colors.sh b/.config/niri/apply-colors.sh
new file mode 100755
index 0000000..505578c
--- /dev/null
+++ b/.config/niri/apply-colors.sh
@@ -0,0 +1,84 @@
+#!/bin/bash
+# Apply a wallpaper and generate colors with wallust (16-color palette) + matugen (Material You / M3).
+# Usage: apply-colors.sh <image> [light|dark]
+# Called by theme-switcher.sh and the waybar random-wallpaper click.
+
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "$(realpath "$0")")" && pwd)"
+IMG="${1:-}"
+MODE="${2:-auto}"
+LOG="${THEME_LOG:-/tmp/theme-switcher.log}"
+
+log() {
+ printf '%s %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*" >>"$LOG"
+}
+
+# Record the exact failing command + line on any error.
+trap 'log "apply-colors FAILED (exit $?) in ${BASH_SOURCE[0]}:$LINENO: $BASH_COMMAND"' ERR
+
+if [ -z "$IMG" ] || [ ! -f "$IMG" ]; then
+ echo "usage: $0 <image> [light|dark]" >&2
+ exit 1
+fi
+
+# wait for the awww daemon to be ready (it is spawned next to this script at login)
+log "awww img $IMG"
+for _ in $(seq 1 10); do
+ if awww query >/dev/null 2>&1; then
+ break
+ fi
+ sleep 1
+done
+
+# set the wallpaper FIRST and unconditionally — this is the critical, must-work
+# step. Color generation below is best-effort: a failure there must never block
+# the wallpaper from changing (that coupling is what froze the wallpaper before).
+awww img "$IMG" || { log "awww img FAILED ($IMG)"; exit 1; }
+
+# blurred copy for the Overview backdrop (sibling or on-the-fly generation)
+"$SCRIPT_DIR/set-backdrop.sh" "$IMG" || log "set-backdrop FAILED ($IMG)"
+
+# wallust: classic 16-color palette (foot, btop, ...)
+# fastresize (the config default) is flaky on some images — always use resized.
+# Best-effort: a wallust failure must not prevent the wallpaper from sticking.
+log "wallust palette=$MODE $IMG"
+case "$MODE" in
+light|dark) WALLUST_PALETTE=("--palette" "$MODE") ;;
+*) WALLUST_PALETTE=() ;;
+esac
+# wallust's `resized` backend is intermittently flaky on some images; retry a
+# few times, but ultimately tolerate failure.
+ok=0
+for attempt in 1 2 3; do
+ if wallust run -b resized "${WALLUST_PALETTE[@]}" "$IMG"; then
+ ok=1
+ break
+ fi
+ log "wallust attempt $attempt FAILED ($IMG, mode=$MODE)"
+ [ "$attempt" -lt 3 ] && sleep 2
+done
+if [ "$ok" -ne 1 ]; then
+ log "wallust FAILED after 3 attempts ($IMG, mode=$MODE) — continuing without wallust colors"
+else
+ # foot needs bare RRGGBB, not #RRGGBB — strip the leading '#'
+ sed -i 's/#\([0-9a-fA-F]\)/\1/g' ~/.cache/wallust/foot-theme.ini 2>/dev/null || true
+fi
+
+# matugen: Material You / M3 colors (niri focus ring, ...)
+# --prefer is required for non-interactive runs (multiple source colors).
+# Best-effort: a matugen failure (e.g. bad config after an upgrade) must not
+# block the wallpaper.
+log "matugen mode=$MODE $IMG"
+case "$MODE" in
+light) matugen image "$IMG" -m "light" --prefer saturation ;;
+dark) matugen image "$IMG" -m "dark" --prefer saturation ;;
+*) matugen image "$IMG" --prefer saturation ;;
+esac || log "matugen FAILED ($IMG, mode=$MODE) — continuing without matugen colors"
+
+# reload consumers
+killall -SIGUSR2 waybar 2>/dev/null || true
+killall -USR1 foot 2>/dev/null || true
+niri msg action load-config-file 2>/dev/null || true
+
+log "apply-colors OK ($IMG, $MODE)"
diff --git a/.config/niri/config.kdl b/.config/niri/config.kdl
new file mode 100644
index 0000000..9d7db14
--- /dev/null
+++ b/.config/niri/config.kdl
@@ -0,0 +1,321 @@
+include optional=true "/home/seraphim/.cache/matugen/theme.kdl"
+spawn-at-startup "mako"
+spawn-at-startup "xrdb" "-merge" "/home/seraphim/.Xresources"
+spawn-at-startup "vicinae" "server"
+spawn-at-startup "gentoo-pipewire-launcher"
+spawn-at-startup "telegram-desktop" "-autostart" "--minimized"
+spawn-at-startup "keepassxc" "--minimized"
+spawn-at-startup "awww-daemon"
+spawn-at-startup "awww-daemon" "--namespace" "backdrop"
+spawn-at-startup "/usr/libexec/hyprpolkitagent"
+spawn-at-startup "dbus-update-activation-environment" "WAYLAND_DISPLAY" "DISPLAY" "XDG_CURRENT_DESKTOP"
+spawn-at-startup "darkman" "run"
+spawn-at-startup "/home/seraphim/dotfiles-gentoo/niri/.config/niri/theme-switcher.sh" "night"
+spawn-at-startup "sh" "-c" "NO_AT_BRIDGE=1 waybar"
+spawn-at-startup "/usr/bin/Throne"
+spawn-at-startup "mpd"
+prefer-no-csd
+screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
+
+environment {
+ OZONE_PLATFORM "wayland"
+ ELECTRON_OZONE_PLATFORM_HINT "auto"
+ XDG_CURRENT_DESKTOP "niri"
+}
+blur {
+ passes 4
+ offset 5.0
+ noise 0.02
+ saturation 1.1
+}
+
+// awww-daemon --namespace backdrop: pre-blurred wallpaper shown in the
+// Overview backdrop. niri cannot blur a backdrop surface itself.
+layer-rule {
+ match namespace="^awww-daemonbackdrop$"
+ place-within-backdrop true
+}
+input {
+ focus-follows-mouse max-scroll-amount="100%"
+
+ keyboard {
+ xkb {
+ layout "us,ru"
+ options "grp:lalt_lshift_toggle,compose:ralt,ctrl:nocaps"
+ }
+ repeat-delay 300
+ repeat-rate 60
+ numlock
+ }
+
+ mouse {
+ accel-speed -0.8
+ accel-profile "flat"
+ }
+}
+
+output "DP-2" {
+ mode "2560x1440"
+ scale 1.5
+ position x=0 y=0
+}
+
+output "HDMI-A-1" {
+ mode "1920x1080@71.910"
+ scale 1
+}
+
+layout {
+ gaps 0.5
+ center-focused-column "never"
+
+ preset-column-widths {
+ proportion 0.33333
+ proportion 0.5
+ proportion 0.66667
+ }
+
+ default-column-width { proportion 0.5; }
+
+ focus-ring {
+ width 2
+ }
+
+ border {
+ off //width 0.5
+ //active-color "#ffc87f"
+ //inactive-color "#505050"
+ //urgent-color "#9b0000"
+ }
+
+ shadow {
+ off
+ //softness 30
+ //spread 5
+ //offset x=0 y=5
+ //color "#0007"
+ }
+}
+
+animations {
+ workspace-switch {
+ duration-ms 275
+ curve "ease-out-cubic"
+ }
+ horizontal-view-movement {
+ spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
+ }
+ window-movement {
+ spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
+ }
+// window-open {
+// duration-ms 150
+// curve "ease-out-expo"
+// }
+// window-close {
+// duration-ms 150
+// curve "ease-out-quad"
+// }
+ window-resize {
+ spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
+ }
+ overview-open-close {
+ duration-ms 150
+ curve "ease-out-quad"
+ }
+}
+
+window-rule {
+ match app-id=r#"^org\.wezfurlong\.wezterm$"#
+ geometry-corner-radius 12
+ clip-to-geometry true
+ background-effect {
+ xray false
+ }
+}
+
+// Helium PiP fix
+window-rule {
+ match app-id=r#"helium$"# title="^Picture-in-Picture$"
+ open-floating true
+ geometry-corner-radius 9000
+ clip-to-geometry true
+ shadow {
+ off
+ }
+}
+
+// Steam notifs fix
+window-rule {
+ match app-id="steam" title=r#"^notificationtoasts_\d+_desktop$"#
+ open-floating true
+ open-focused false
+ default-floating-position x=16 y=16 relative-to="bottom-right"
+}
+
+gestures {
+ hot-corners {
+ off
+ }
+}
+
+cursor {
+ xcursor-theme "Bibata-Modern-Classic"
+ xcursor-size 15
+}
+
+overview {
+ zoom 0.5
+ workspace-shadow {
+ off
+ //softness 15
+ //spread 3
+ //offset x=0 y=6
+ //color "#00000080"
+ }
+}
+debug {
+ honor-xdg-activation-with-invalid-serial
+}
+binds {
+ // Application Launchers
+ Mod+Shift+T { spawn "telegram-desktop"; }
+ Mod+Shift+B { spawn "/opt/helium/helium" "--enable-features=UseOzonePlatform" "--ozone-platform=wayland"; }
+ Mod+D { spawn "vicinae" "toggle"; }
+ Mod+Ctrl+V { spawn "vicinae" "deeplink" "vicinae://launch/clipboard/history"; }
+ Mod+T hotkey-overlay-title="File Manager" { spawn "foot" "-e" "yazi"; }
+ Mod+Alt+R { spawn "foot" "-e" "rmpc"; }
+ Mod+S hotkey-overlay-title="Terminal" { spawn "foot"; }
+ Super+Alt+L hotkey-overlay-title="Lock Screen" { spawn "swaylock"; }
+
+ // Audio & Media Controls
+ XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+ -l 1.0"; }
+ XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"; }
+ XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; }
+ XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; }
+
+ XF86AudioPlay allow-when-locked=true { spawn-sh "playerctl play-pause"; }
+ XF86AudioStop allow-when-locked=true { spawn-sh "playerctl stop"; }
+ XF86AudioPrev allow-when-locked=true { spawn-sh "playerctl previous"; }
+ XF86AudioNext allow-when-locked=true { spawn-sh "playerctl next"; }
+
+ // universal clipboard hotkeys (super + c / v / x)
+ mod+c { spawn-sh "sleep 0.001 && wtype -M ctrl -k insert -m ctrl"; }
+ mod+v { spawn-sh "sleep 0.001 && wtype -M shift -k insert -m shift"; }
+ mod+x { spawn-sh "sleep 0.001 && wtype -M shift -k delete -m shift"; }
+
+ // Window Management & Views
+ Mod+Tab repeat=false { toggle-overview; }
+ Mod+Grave repeat=false { toggle-overview; }
+ Mod+W repeat=false { close-window; }
+ Mod+F { maximize-column; }
+ Mod+Shift+F { fullscreen-window; }
+ Mod+Ctrl+F { maximize-window-to-edges; }
+ //Mod+Ctrl+F { expand-column-to-available-width; }
+ Mod+Ctrl+C { center-visible-columns; }
+ Mod+Shift+V { toggle-window-floating; }
+ Mod+Q { toggle-column-tabbed-display; }
+
+ // Focus Navigation
+ Mod+Left { focus-column-left; }
+ Mod+Down { focus-window-down; }
+ Mod+Up { focus-window-up; }
+ Mod+Right { focus-column-right; }
+ Mod+H { focus-column-left; }
+ Mod+J { focus-window-down; }
+ Mod+K { focus-window-up; }
+ Mod+L { focus-column-right; }
+ Mod+Shift+WheelScrollUp { focus-monitor-left; }
+ Mod+Shift+WheelScrollDown { focus-monitor-right; }
+
+ // Window Movement
+ Mod+Ctrl+Left { move-column-left; }
+ Mod+Ctrl+Down { move-window-down; }
+ Mod+Ctrl+Up { move-window-up; }
+ Mod+Ctrl+Right { move-column-right; }
+ Mod+Ctrl+H { move-column-left; }
+ Mod+Ctrl+J { move-window-down; }
+ Mod+Ctrl+K { move-window-up; }
+ Mod+Ctrl+L { move-column-right; }
+
+ Mod+Home { focus-column-first; }
+ Mod+End { focus-column-last; }
+ Mod+Ctrl+Home { move-column-to-first; }
+ Mod+Ctrl+End { move-column-to-last; }
+
+ // Monitor Focus & Movement
+ Mod+Shift+1 { focus-monitor-left; }
+ Mod+Shift+2 { focus-monitor-right; }
+ Mod+Shift+Left { focus-monitor-left; }
+ Mod+Shift+Down { focus-monitor-down; }
+ Mod+Shift+Up { focus-monitor-up; }
+ Mod+Shift+Right { focus-monitor-right; }
+ Mod+Shift+H { focus-monitor-left; }
+ Mod+Shift+J { focus-monitor-down; }
+ Mod+Shift+K { focus-monitor-up; }
+ Mod+Shift+L { focus-monitor-right; }
+
+ Mod+Shift+Ctrl+1 { move-column-to-monitor-left; }
+ Mod+Shift+Ctrl+2 { move-column-to-monitor-right; }
+ Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }
+ Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
+ Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
+ Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
+ Mod+Shift+Ctrl+H { move-column-to-monitor-left; }
+ Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
+ Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
+ Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
+
+ // Workspace Navigation
+ Mod+Shift+Page_Down { move-workspace-down; }
+ Mod+Shift+Page_Up { move-workspace-up; }
+ Mod+Shift+U { move-workspace-down; }
+ Mod+Shift+I { move-workspace-up; }
+
+ // Direct Workspace Switching (1-9)
+ Mod+1 { focus-workspace 1; }
+ Mod+2 { focus-workspace 2; }
+ Mod+3 { focus-workspace 3; }
+ Mod+4 { focus-workspace 4; }
+ Mod+5 { focus-workspace 5; }
+ Mod+6 { focus-workspace 6; }
+ Mod+7 { focus-workspace 7; }
+ Mod+8 { focus-workspace 8; }
+ Mod+9 { focus-workspace 9; }
+
+ Mod+Ctrl+1 { move-column-to-workspace 1; }
+ Mod+Ctrl+2 { move-column-to-workspace 2; }
+ Mod+Ctrl+3 { move-column-to-workspace 3; }
+ Mod+Ctrl+4 { move-column-to-workspace 4; }
+ Mod+Ctrl+5 { move-column-to-workspace 5; }
+ Mod+Ctrl+6 { move-column-to-workspace 6; }
+ Mod+Ctrl+7 { move-column-to-workspace 7; }
+ Mod+Ctrl+8 { move-column-to-workspace 8; }
+ Mod+Ctrl+9 { move-column-to-workspace 9; }
+
+ // Column & Window Sizing
+ Mod+BracketLeft { consume-or-expel-window-left; }
+ Mod+BracketRight { consume-or-expel-window-right; }
+
+ Mod+R { switch-preset-column-width; }
+ Mod+Shift+R { switch-preset-column-width-back; }
+ Mod+Ctrl+Shift+R { switch-preset-window-height; }
+ Mod+Ctrl+R { reset-window-height; }
+
+ Mod+Minus { set-column-width "-10%"; }
+ Mod+Equal { set-column-width "+10%"; }
+ Mod+Shift+Minus { set-window-height "-10%"; }
+ Mod+Shift+Equal { set-window-height "+10%"; }
+
+ // Mouse Wheel Bindings
+ Mod+WheelScrollUp { focus-column-left; }
+ Mod+WheelScrollDown { focus-column-right; }
+
+ // Screenshots
+ Print { screenshot; }
+ Ctrl+Print { screenshot-screen; }
+ Alt+Print { screenshot-window; }
+
+ // System Control
+ Mod+Shift+E { quit; }
+}
diff --git a/.config/niri/set-backdrop.sh b/.config/niri/set-backdrop.sh
new file mode 100755
index 0000000..efd02b3
--- /dev/null
+++ b/.config/niri/set-backdrop.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+# Push a blurred copy of a wallpaper to the awww-daemon backdrop namespace.
+# Prefers a pre-made <name>-blur.<ext> sibling; otherwise generates one into the cache.
+# Used by theme-switcher.sh and apply-colors.sh for the niri Overview backdrop.
+
+set -euo pipefail
+
+IMG="${1:-}"
+if [ -z "$IMG" ] || [ ! -f "$IMG" ]; then
+ echo "usage: $0 <image>" >&2
+ exit 1
+fi
+
+EXT="${IMG##*.}"
+SIBLING="${IMG%.*}-blur.${EXT}"
+if [ -f "$SIBLING" ]; then
+ BLURRED="$SIBLING"
+else
+ CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/niri-backdrop"
+ mkdir -p "$CACHE_DIR"
+ BASE=$(basename "${IMG%.*}")
+ BLURRED="$CACHE_DIR/${BASE}-blur.jpg"
+ if [ ! -f "$BLURRED" ] || [ "$IMG" -nt "$BLURRED" ]; then
+ magick "$IMG" -blur 0x16 -quality 90 "$BLURRED"
+ fi
+fi
+
+awww img "$BLURRED" -n backdrop
+echo "$BLURRED" >/tmp/current_backdrop_state \ No newline at end of file
diff --git a/.config/niri/theme-switcher.sh b/.config/niri/theme-switcher.sh
new file mode 100755
index 0000000..6d1f548
--- /dev/null
+++ b/.config/niri/theme-switcher.sh
@@ -0,0 +1,135 @@
+#!/bin/bash
+
+# Day/night theme switcher + wallpaper/color applier.
+# Two wallpapers: day.jpg (9:00-18:00) and night.jpg (18:00-9:00).
+#
+# Usage:
+# ./theme-switcher.sh one-shot: apply based on current time, then exit
+# ./theme-switcher.sh day|light force light theme, then exit
+# ./theme-switcher.sh night|dark force dark theme, then exit
+# ./theme-switcher.sh --daemon continuous time-based loop (used at login)
+
+WALLPAPERS="$HOME/Pictures/wallpapers"
+STATE_FILE="/tmp/current_theme_state"
+WALLPAPER_STATE_FILE="/tmp/current_wallpaper_state"
+BACKDROP_STATE_FILE="/tmp/current_backdrop_state"
+PID_FILE="/tmp/theme-switcher.daemon.pid"
+LOG="/tmp/theme-switcher.log"
+SCRIPT_DIR="$(cd "$(dirname "$(realpath "$0")")" && pwd)"
+SET_BACKDROP="$SCRIPT_DIR/set-backdrop.sh"
+
+log() {
+ printf '%s %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*" >>"$LOG"
+}
+
+# Resolve TARGET_STATE / MODE / WALLPAPER. Optional $1 forces day|night.
+resolve_target() {
+ local force="${1:-}"
+ if [ "$force" = "day" ] || [ "$force" = "light" ]; then
+ TARGET_STATE="light"
+ MODE="light"
+ WALLPAPER="$WALLPAPERS/day.jpg"
+ elif [ "$force" = "night" ] || [ "$force" = "dark" ]; then
+ TARGET_STATE="dark"
+ MODE="dark"
+ WALLPAPER="$WALLPAPERS/night.jpg"
+ else
+ local HOUR
+ HOUR=$(date +%H)
+ HOUR=$((10#$HOUR))
+ if [ "$HOUR" -ge 9 ] && [ "$HOUR" -lt 18 ]; then
+ TARGET_STATE="light"
+ MODE="light"
+ WALLPAPER="$WALLPAPERS/day.jpg"
+ else
+ TARGET_STATE="dark"
+ MODE="dark"
+ WALLPAPER="$WALLPAPERS/night.jpg"
+ fi
+ fi
+}
+
+# Apply the resolved target once. Returns 0 on success.
+apply_target() {
+ if [ ! -f "$WALLPAPER" ]; then
+ log "wallpaper missing: $WALLPAPER"
+ return 1
+ fi
+
+ local CURRENT_THEME CURRENT_WALLPAPER EXPECTED_BACKDROP ACTUAL_BACKDROP
+
+ CURRENT_THEME=$(cat "$STATE_FILE" 2>/dev/null || true)
+ # Already in the correct theme: don't re-run wallust/matugen every loop tick.
+ # Still self-heal a drifted backdrop below, then bail out.
+ if [ "$CURRENT_THEME" = "$TARGET_STATE" ]; then
+ EXPECTED_BACKDROP=$(cat "$BACKDROP_STATE_FILE" 2>/dev/null || true)
+ ACTUAL_BACKDROP=$(awww query -n backdrop -j 2>/dev/null | jq -r '.["backdrop"][0].displaying.image // empty')
+ if [ -n "$EXPECTED_BACKDROP" ] && [ "$ACTUAL_BACKDROP" != "$EXPECTED_BACKDROP" ]; then
+ "$SET_BACKDROP" "$WALLPAPER"
+ fi
+ return 0
+ fi
+ CURRENT_WALLPAPER=$(cat "$WALLPAPER_STATE_FILE" 2>/dev/null || true)
+
+ # Self-heal the Overview backdrop if it drifted from the expected image.
+ EXPECTED_BACKDROP=$(cat "$BACKDROP_STATE_FILE" 2>/dev/null || true)
+ ACTUAL_BACKDROP=$(awww query -n backdrop -j 2>/dev/null | jq -r '.["backdrop"][0].displaying.image // empty')
+ if [ -n "$EXPECTED_BACKDROP" ] && [ "$ACTUAL_BACKDROP" != "$EXPECTED_BACKDROP" ]; then
+ "$SET_BACKDROP" "$WALLPAPER"
+ fi
+
+ log "switching to $TARGET_STATE ($WALLPAPER)"
+ if sh "$SCRIPT_DIR/apply-colors.sh" "$WALLPAPER" "$MODE"; then
+ if [ "$CURRENT_THEME" != "$TARGET_STATE" ]; then
+ darkman set "$TARGET_STATE"
+ fi
+
+ ln -sf \
+ "theme-${TARGET_STATE}.css" \
+ "$HOME/dotfiles-gentoo/waybar/.config/waybar/theme.css"
+
+ ln -sf \
+ "settings-${TARGET_STATE}.ini" \
+ "$HOME/dotfiles-gentoo/gtk/.config/gtk-3.0/settings.ini"
+
+ echo "$TARGET_STATE" >"$STATE_FILE"
+ echo "$WALLPAPER" >"$WALLPAPER_STATE_FILE"
+ log "switched to $TARGET_STATE ($WALLPAPER)"
+ return 0
+ else
+ log "FAILED to apply $TARGET_STATE ($WALLPAPER)"
+ return 1
+ fi
+}
+
+daemon_loop() {
+ # Refuse to run a second daemon instance (e.g. manual run while one is alive).
+ if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE" 2>/dev/null)" 2>/dev/null; then
+ log "daemon already running (pid $(cat "$PID_FILE")), exiting"
+ exit 0
+ fi
+ echo $$ >"$PID_FILE"
+
+ while true; do
+ resolve_target
+ apply_target || true # failure is retried on the next loop, state is left untouched
+ sleep 60
+ done
+}
+
+case "${1:-}" in
+--daemon | -d) daemon_loop ;;
+"" | day | light | night | dark)
+ resolve_target "${1:-}"
+ apply_target
+ exit $?
+ ;;
+-h | --help)
+ echo "usage: $0 [day|night|--daemon]" >&2
+ exit 0
+ ;;
+*)
+ echo "usage: $0 [day|night|--daemon]" >&2
+ exit 1
+ ;;
+esac
diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua
new file mode 100644
index 0000000..6bf6f8e
--- /dev/null
+++ b/.config/nvim/init.lua
@@ -0,0 +1,4 @@
+require("caelus.init").colorscheme()
+require("config.keymaps")
+require("config.options")
+require("config.plugins")
diff --git a/.config/nvim/lua/caelus/init.lua b/.config/nvim/lua/caelus/init.lua
new file mode 100644
index 0000000..dec0a41
--- /dev/null
+++ b/.config/nvim/lua/caelus/init.lua
@@ -0,0 +1,100 @@
+local M = {};
+
+local colors = {
+ bg = "#0f0f0f",
+ gray0 = "#141514";
+ gray1 = "#1e1f1e";
+ gray2 = "#272a28";
+ gray3 = "#3b403c";
+ gray4 = "#585f5b";
+ gray5 = "#6c756f";
+ gray6 = "#888e7b";
+ gray7 = "#9a9c8b";
+ gray8 = "#b6b69a";
+ gray9 = "#d9cdb5";
+ gray10 = "#e3d6c9";
+ fg = "#f4decd",
+ red = "#f16e65";
+ lred = "#ef968f";
+ orange = "#ef934d";
+ yellow = "#efbf71";
+ green = "#7ec97e";
+ lgreen = "#a4daa4";
+ cyan = "#7ec9a3";
+ lcyan = "#abd4bf";
+ blue = "#71b4d6";
+ lblue = "#b0d4e8";
+ magenta = "#e28dc6";
+ lmagenta = "#ebadd6";
+}
+
+function M.colorscheme()
+ vim.cmd("highlight clear")
+ vim.cmd("syntax reset")
+
+ vim.o.background = "dark";
+ vim.g.colors_name = "caelus";
+
+ local set = vim.api.nvim_set_hl
+
+ -- ui
+ set(0, "Normal", { fg = colors.fg, bg = colors.bg })
+ set(0, "NormalFloat", { fg = colors.fg, bg = colors.bg })
+ set(0, "FloatBorder", { fg = colors.fg, bg = colors.bg })
+ set(0, "CursorLine", { bg = colors.gray2 })
+ set(0, "Visual", { bg = colors.gray3 })
+ set(0, "Search", { fg = colors.bg, bg = colors.orange })
+ set(0, "IncSearch", { fg = colors.bg, bg = colors.orange })
+ set(0, "StatusLine", { bg = colors.gray2 })
+ set(0, "StatusLineNC", { bg = colors.orange })
+ set(0, "VertSplit", { fg = colors.gray8 })
+ set(0, "WinSeparator", { fg = colors.gray8 })
+ set(0, "LineNr", { fg = colors.gray6 })
+ set(0, "CursorLineNr", { fg = colors.orange, bold = true })
+ set(0, "SignColumn", { bg = colors.bg })
+ set(0, "Folded", { fg = colors.gray8, bg = colors.gray3 })
+
+ -- popup
+ set(0, "Pmenu", { fg = colors.fg, bg = colors.gray10 })
+ set(0, "PmenuSel", { fg = colors.bg, bg = colors.orange })
+ set(0, "PmenuSbar", { bg = colors.gray10 })
+ set(0, "PmenuThumb", { bg = colors.orange })
+
+ -- syntax
+ set(0, "Comment", { fg = colors.gray8, italic = true })
+ set(0, "Constant", { fg = colors.magenta })
+ set(0, "String", { fg = colors.green })
+ set(0, "Identifier", { fg = colors.blue })
+ set(0, "Function", { fg = colors.yellow })
+ set(0, "Statement", { fg = colors.red })
+ set(0, "Type", { fg = colors.cyan, bold = true })
+ set(0, "Special", { fg = colors.yellow })
+ set(0, "Error", { fg = colors.red, bold = true })
+ set(0, "Keyword", { fg = colors.red })
+ set(0, "Variable", { fg = colors.fg })
+ set(0, "TSKeyword", { fg = colors.red })
+ set(0, "TSFunction", { fg = colors.yellow })
+ set(0, "TSVariable", { fg = colors.fg })
+ set(0, "TSType", { fg = colors.cyan })
+
+ -- blink
+ set(0, "BlinkCmpMenu", { bg = colors.gray1 })
+ set(0, "BlinkCmpMenuBorder", { fg = colors.gray6, bg = colors.gray1 })
+ set(0, "BlinkCmpMenuSelection", { fg = colors.bg, bg = colors.orange })
+ set(0, "BlinkCmpLabel", { fg = colors.fg })
+ set(0, "BlinkCmpLabelDetail", { fg = colors.gray7 })
+ set(0, "BlinkCmpLabelDescription",{ fg = colors.gray8 })
+ set(0, "BlinkCmpLabelMatch", { fg = colors.orange, bold = true })
+ set(0, "BlinkCmpKind", { fg = colors.cyan })
+ set(0, "BlinkCmpDoc", { fg = colors.fg, bg = colors.gray2 })
+ set(0, "BlinkCmpDocBorder", { fg = colors.gray5, bg = colors.gray2 })
+
+ if package.loaded['lualine'] then
+ require('lualine').setup({
+ options = { theme = 'auto' },
+ })
+ end
+
+end
+
+return M
diff --git a/.config/nvim/lua/config/keymaps.lua b/.config/nvim/lua/config/keymaps.lua
new file mode 100755
index 0000000..e2987bc
--- /dev/null
+++ b/.config/nvim/lua/config/keymaps.lua
@@ -0,0 +1,13 @@
+localopts = { noremap = true, silent = true }
+
+vim.g.mapleader = " "
+vim.g.maplocalleader = " "
+
+vim.keymap.set({"n", "v"}, "y", '"+y', { noremap = true, silent = true })
+
+vim.keymap.set("v", "J", ":m '>+1<CR>gv=gv", { desc = "moves lines down in visual selection" })
+vim.keymap.set("v", "K", ":m '<-2<CR>gv=gv", { desc = "moves lines up in visual selection" })
+
+vim.keymap.set("n", "<leader>al", "<CMD>term<CR>", { desc = "Open terminal" })
+
+vim.keymap.set("n", "<leader>f", vim.lsp.buf.format)
diff --git a/.config/nvim/lua/config/options.lua b/.config/nvim/lua/config/options.lua
new file mode 100755
index 0000000..dac7c76
--- /dev/null
+++ b/.config/nvim/lua/config/options.lua
@@ -0,0 +1,40 @@
+vim.cmd("let g:netrw_banner = 0")
+vim.cmd("set termguicolors")
+
+vim.opt.guicursor = ""
+vim.opt.nu = true
+vim.opt.relativenumber = false
+
+vim.opt.tabstop = 2
+vim.opt.softtabstop = 2
+vim.opt.shiftwidth = 2
+vim.opt.expandtab = true
+vim.opt.autoindent = true
+vim.opt.smartindent = true
+vim.opt.wrap = true
+
+vim.opt.swapfile = false
+vim.opt.backup = false
+vim.opt.undofile = true
+
+vim.opt.incsearch = true
+vim.opt.inccommand = "split"
+vim.opt.ignorecase = true
+vim.opt.smartcase = true
+
+vim.opt.termguicolors = true
+vim.opt.background = "dark"
+vim.opt.scrolloff = 8
+vim.opt.signcolumn = "yes"
+
+vim.opt.backspace = { "start", "eol", "indent" }
+
+vim.opt.splitright = true
+vim.opt.splitbelow = true
+
+vim.opt.hlsearch = true
+
+vim.opt.mouse = "a"
+vim.g.editorconfig = true
+
+vim.g.markdown_folding = 1
diff --git a/.config/nvim/lua/config/plugins.lua b/.config/nvim/lua/config/plugins.lua
new file mode 100644
index 0000000..464a5ae
--- /dev/null
+++ b/.config/nvim/lua/config/plugins.lua
@@ -0,0 +1,101 @@
+vim.pack.add {
+ 'https://github.com/ollykel/v-vim',
+ 'https://github.com/hrsh7th/nvim-cmp',
+ 'https://github.com/saghen/blink.cmp',
+ 'https://github.com/alaviss/nim.nvim',
+ 'https://github.com/stevearc/oil.nvim',
+ 'https://github.com/folke/trouble.nvim',
+ 'https://github.com/nvim-mini/mini.nvim',
+ 'https://github.com/jiaoshijie/undotree',
+ 'https://github.com/thePrimeagen/harpoon',
+ 'https://github.com/hrsh7th/cmp-nvim-lsp',
+ 'https://github.com/mason-org/mason.nvim',
+ 'https://github.com/nvim-orgmode/orgmode',
+ 'https://github.com/windwp/nvim-autopairs',
+ 'https://github.com/neovim/nvim-lspconfig',
+ 'https://github.com/nvim-lua/plenary.nvim',
+ 'https://github.com/mfussenegger/nvim-lint',
+ 'https://github.com/akinsho/org-bullets.nvim',
+ 'https://github.com/nvim-lualine/lualine.nvim',
+ 'https://github.com/norcalli/nvim-colorizer.lua',
+ 'https://github.com/nvim-tree/nvim-web-devicons',
+ 'https://github.com/rafamadriz/friendly-snippets',
+ 'https://github.com/nvim-telescope/telescope.nvim',
+ 'https://github.com/mason-org/mason-lspconfig.nvim',
+ 'https://github.com/nvim-treesitter/nvim-treesitter',
+ 'https://github.com/brenoprata10/nvim-highlight-colors',
+ 'https://github.com/antosha417/nvim-lsp-file-operations',
+ 'https://github.com/nvim-telescope/telescope-ui-select.nvim',
+ 'https://github.com/MeanderingProgrammer/render-markdown.nvim',
+}
+
+-- vlang
+--vim.lsp.config.vlang.setup({})
+
+-- oil
+-- oil
+require("oil").setup({
+ default_file_explorer = true,
+ columns = {},
+ keymaps = {
+ ["q"] = "actions.close",
+ ["l"] = "actions.select", -- Opens the file or enters the directory
+ ["h"] = "actions.parent", -- Goes up to the parent directory
+ },
+ delete_to_trash = true,
+ view_options = {
+ show_hidden = true,
+ },
+ skip_confirm_for_simple_edits = true,
+})
+vim.keymap.set("n", "<leader>fm", "<CMD>Oil<CR>", { desc = "Open parent directory" })
+
+-- harpoon
+vim.keymap.set("n", "<leader>ad", function()
+ harpoon:list():add()
+end, { desc = "Harpoon add file" })
+vim.keymap.set("n", "<C-e>", function()
+ harpoon.ui:toggle_quick_menu(harpoon:list())
+end)
+
+-- mason
+require("mason").setup({
+ opts = {
+ ui = {
+ icons = {
+ package_installed = "*",
+ package_pending = ">",
+ package_uninstalled = "x"
+ }
+ }
+ }
+})
+
+-- autopairs
+require("nvim-autopairs").setup({
+ check_ts = true,
+ ts_config = {
+ lua = { "string" },
+ javascript = { "template_string" },
+ java = false,
+ },
+})
+
+-- lspconfig
+vim.keymap.set("n", "gd", function() vim.lsp.buf.definition() end, opts)
+vim.keymap.set("n", "<leader>vca", function() vim.lsp.buf.code_action() end, opts)
+vim.keymap.set("n", "<leader>vrn", function() vim.lsp.buf.rename() end, opts)
+
+-- lualine
+require('lualine').setup {
+ options = {
+ icons_enabled = true,
+ theme = 'auto',
+ }
+}
+
+-- colorizer
+require("colorizer").setup()
+
+-- mason-lspconfig
+require("mason-lspconfig").setup()
diff --git a/.config/nvim/nvim-pack-lock.json b/.config/nvim/nvim-pack-lock.json
new file mode 100644
index 0000000..dc69b9a
--- /dev/null
+++ b/.config/nvim/nvim-pack-lock.json
@@ -0,0 +1,116 @@
+{
+ "plugins": {
+ "blink.cmp": {
+ "rev": "679a2ffad4bae720bb12e6bcdf57b0dd8b8a80f8",
+ "src": "https://github.com/saghen/blink.cmp"
+ },
+ "cmp-nvim-lsp": {
+ "rev": "cbc7b02bb99fae35cb42f514762b89b5126651ef",
+ "src": "https://github.com/hrsh7th/cmp-nvim-lsp"
+ },
+ "friendly-snippets": {
+ "rev": "6cd7280adead7f586db6fccbd15d2cac7e2188b9",
+ "src": "https://github.com/rafamadriz/friendly-snippets"
+ },
+ "harpoon": {
+ "rev": "1bc17e3e42ea3c46b33c0bbad6a880792692a1b3",
+ "src": "https://github.com/thePrimeagen/harpoon"
+ },
+ "lualine.nvim": {
+ "rev": "47f91c416daef12db467145e16bed5bbfe00add8",
+ "src": "https://github.com/nvim-lualine/lualine.nvim"
+ },
+ "mason-lspconfig.nvim": {
+ "rev": "25f609e7fca78af7cede4f9fa3af8a94b1c4950b",
+ "src": "https://github.com/mason-org/mason-lspconfig.nvim"
+ },
+ "mason.nvim": {
+ "rev": "44d1e90e1f66e077268191e3ee9d2ac97cc18e65",
+ "src": "https://github.com/mason-org/mason.nvim"
+ },
+ "mini.nvim": {
+ "rev": "3923662bf3d6ca49a9503f8d7196ea0450983e6a",
+ "src": "https://github.com/nvim-mini/mini.nvim"
+ },
+ "nim.nvim": {
+ "rev": "9ee8fdc04ad3d7fcbd9679e0be3477543f17b9d9",
+ "src": "https://github.com/alaviss/nim.nvim"
+ },
+ "nvim-autopairs": {
+ "rev": "59bce2eef357189c3305e25bc6dd2d138c1683f5",
+ "src": "https://github.com/windwp/nvim-autopairs"
+ },
+ "nvim-cmp": {
+ "rev": "a1d504892f2bc56c2e79b65c6faded2fd21f3eca",
+ "src": "https://github.com/hrsh7th/nvim-cmp"
+ },
+ "nvim-colorizer.lua": {
+ "rev": "a065833f35a3a7cc3ef137ac88b5381da2ba302e",
+ "src": "https://github.com/norcalli/nvim-colorizer.lua"
+ },
+ "nvim-highlight-colors": {
+ "rev": "e2cb22089cc2358b2b995c09578224f142de6039",
+ "src": "https://github.com/brenoprata10/nvim-highlight-colors"
+ },
+ "nvim-lint": {
+ "rev": "4b03656c09c1561f89b6aa0665c15d292ba9499d",
+ "src": "https://github.com/mfussenegger/nvim-lint"
+ },
+ "nvim-lsp-file-operations": {
+ "rev": "b9c795d3973e8eec22706af14959bc60c579e771",
+ "src": "https://github.com/antosha417/nvim-lsp-file-operations"
+ },
+ "nvim-lspconfig": {
+ "rev": "8e2084bf5e40c79c1f42210a6ef96a0a4793a763",
+ "src": "https://github.com/neovim/nvim-lspconfig"
+ },
+ "nvim-treesitter": {
+ "rev": "539abf6da5ee8702e37b82cc953131dadd570da2",
+ "src": "https://github.com/nvim-treesitter/nvim-treesitter"
+ },
+ "nvim-web-devicons": {
+ "rev": "d7462543c9e366c0d196c7f67a945eaaf5d99414",
+ "src": "https://github.com/nvim-tree/nvim-web-devicons"
+ },
+ "oil.nvim": {
+ "rev": "0fcc83805ad11cf714a949c98c605ed717e0b83e",
+ "src": "https://github.com/stevearc/oil.nvim"
+ },
+ "org-bullets.nvim": {
+ "rev": "503fe053550879cc202086a40454e46a87c41ddb",
+ "src": "https://github.com/akinsho/org-bullets.nvim"
+ },
+ "orgmode": {
+ "rev": "1ab7b456020de8bdaed7d8135b5376a0b4419b11",
+ "src": "https://github.com/nvim-orgmode/orgmode"
+ },
+ "plenary.nvim": {
+ "rev": "b9fd5226c2f76c951fc8ed5923d85e4de065e509",
+ "src": "https://github.com/nvim-lua/plenary.nvim"
+ },
+ "render-markdown.nvim": {
+ "rev": "c7188a8f9d2953696b6303caccbf39c51fa2c1b1",
+ "src": "https://github.com/MeanderingProgrammer/render-markdown.nvim"
+ },
+ "telescope-ui-select.nvim": {
+ "rev": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2",
+ "src": "https://github.com/nvim-telescope/telescope-ui-select.nvim"
+ },
+ "telescope.nvim": {
+ "rev": "cfb85dcf7f822b79224e9e6aef9e8c794211b20b",
+ "src": "https://github.com/nvim-telescope/telescope.nvim"
+ },
+ "trouble.nvim": {
+ "rev": "bd67efe408d4816e25e8491cc5ad4088e708a69a",
+ "src": "https://github.com/folke/trouble.nvim"
+ },
+ "undotree": {
+ "rev": "0e6d41d55ad147407e4ba00a292973de8db0b836",
+ "src": "https://github.com/jiaoshijie/undotree"
+ },
+ "v-vim": {
+ "rev": "1dc1388bafb89072f8349dbd96f9462ae22237cb",
+ "src": "https://github.com/ollykel/v-vim"
+ }
+ }
+}
diff --git a/.config/rmpc/config.ron b/.config/rmpc/config.ron
new file mode 100644
index 0000000..765d13b
--- /dev/null
+++ b/.config/rmpc/config.ron
@@ -0,0 +1,84 @@
+#![enable(implicit_some)]
+#![enable(unwrap_newtypes)]
+#![enable(unwrap_variant_newtypes)]
+
+(
+ address: "127.0.0.1:6600",
+ max_fps: 180,
+
+ music_dir: "/mnt/giga/music",
+ lyrics_dir: "/mnt/giga/music",
+ theme: "~/.config/rmpc/theme.ron",
+
+ album_art: (
+ method: Sixel,
+ max_size_px: (width: 1600, height: 1600),
+ ),
+ lyrics: (
+ fetch: true,
+ ),
+ tabs: [
+ (
+ name: "Player",
+ pane: Split(
+ direction: Horizontal,
+ panes: [
+ (
+ size: "40%",
+ pane: Split(
+ direction: Vertical,
+ panes: [
+ (size: "55%", pane: Pane(AlbumArt)),
+ (size: "45%", pane: Pane(Lyrics)),
+ ]
+ )
+ ),
+ (
+ size: "60%",
+ pane: Split(
+ direction: Vertical,
+ panes: [
+ (size: "1", pane: Pane(QueueHeader())),
+ (size: "100%", pane: Pane(Queue)),
+ ]
+ )
+ ),
+ ],
+ ),
+ ),
+ (name: "Files", pane: Pane(Directories)),
+ (name: "Artists", pane: Pane(Artists)),
+ (name: "Playlists", pane: Pane(Playlists)),
+ (name: "Search", pane: Pane(Search)),
+ ],
+
+ keybinds: (
+ global: {
+ "1": SwitchToTab("Player"),
+ "2": SwitchToTab("Files"),
+ "3": SwitchToTab("Artists"),
+ "4": SwitchToTab("Playlists"),
+ "5": SwitchToTab("Search"),
+ "/": SwitchToTab("Search"),
+
+ "<Space>": TogglePause,
+ "+": VolumeUp,
+ "-": VolumeDown,
+ "n": NextTrack,
+ "b": PreviousTrack,
+
+ "<Right>": SeekForward,
+ "<Left>": SeekBack,
+ ">": SeekForward,
+ "<": SeekBack,
+
+ "r": ToggleRepeat,
+ "s": ToggleSingle,
+ "c": ToggleConsume,
+ "z": ToggleRandom,
+ },
+ navigation: {
+ "Enter": Select,
+ },
+ ),
+)
diff --git a/.config/rmpc/theme.ron b/.config/rmpc/theme.ron
new file mode 100644
index 0000000..f23418a
--- /dev/null
+++ b/.config/rmpc/theme.ron
@@ -0,0 +1,47 @@
+#![enable(implicit_some)]
+#![enable(unwrap_newtypes)]
+#![enable(unwrap_variant_newtypes)]
+
+(
+ show_song_table_header: true,
+
+ song_table_format: [
+ (
+ prop: (kind: Property(Position)),
+ width: "3",
+ alignment: Right,
+ label: "#"
+ ),
+ (
+ prop: (kind: Property(Title), default: (kind: Property(Filename))),
+ width: "45%",
+ alignment: Left,
+ label: "Title"
+ ),
+ (
+ prop: (kind: Property(Artist), default: (kind: Text("Unknown"))),
+ width: "35%",
+ alignment: Left,
+ label: "Artist"
+ ),
+ (
+ prop: (kind: Property(Duration)),
+ width: "15%",
+ alignment: Right,
+ label: "Time"
+ ),
+ ],
+
+ text_color: None,
+ borders_style: (fg: "#4c566a"),
+
+ highlighted_item_style: (fg: "#81a1c1", modifiers: "Bold"),
+ current_item_style: (fg: "#88c0d0", modifiers: "Bold | Reversed"),
+
+ lyrics: (
+ unplayed_style: (fg: "#4c566a"),
+ played_style: (fg: "#88c0d0", modifiers: "Bold"),
+ dir: "/mnt/giga/music/",
+ fetch: true,
+ ),
+)
diff --git a/.config/starship.toml b/.config/starship.toml
new file mode 100644
index 0000000..ab9064a
--- /dev/null
+++ b/.config/starship.toml
@@ -0,0 +1,91 @@
+palette = "noctalia"
+add_newline = true
+command_timeout = 200
+format = "$username$hostname$character [$directory$git_branch$git_status]($style)"
+
+[username]
+show_always = true
+format = "[$user]($style)"
+style_user = "#8C00FF"
+# style_user = "bold #8C00FF"
+[hostname]
+disabled = false
+ssh_only = false
+format = "[@$hostname]($style)"
+style = "#8C00FF"
+
+[character]
+format = "$symbol" # Removes the default trailing space after #
+error_symbol = "[:~✗](bold red)"
+success_symbol = "[:~#](bold #8C00FF)"
+
+[directory]
+style = "#AA40FF"
+truncation_length = 2
+truncation_symbol = "///"
+repo_root_style = "#AA40FF"
+repo_root_format = "[$repo_root]($repo_root_style)[$path]($style)[$read_only]($read_only_style) "
+
+[git_branch]
+symbol = "> "
+format = "[$symbol$branch]($style) "
+style = "italic #AA40FF"
+
+[git_status]
+format = '[$all_status]($style)'
+style = "purple"
+ahead = "⇡${count} "
+diverged = "⇕⇡${ahead_count}⇣${behind_count} "
+behind = "⇣${count} "
+conflicted = " "
+up_to_date = " "
+untracked = "? "
+modified = " "
+stashed = ""
+staged = ""
+renamed = ""
+deleted = ""
+
+# >>> NOCTALIA STARSHIP PALETTE >>>
+# Noctalia Starship Palette
+# Generated by Noctalia - do not edit manually
+
+[palettes.noctalia]
+# Standard colors
+blue = "#54604a"
+red = "#ba1a1a"
+green = "#645c3f"
+yellow = "#635e50"
+cyan = "#797263"
+magenta = "#7e7252"
+white = "#1d1b19"
+black = "#e9e2d4"
+
+# Extended palette (Catppuccin-compatible names)
+rosewater = "#635e50"
+flamingo = "#ba1a1a"
+pink = "#7e7252"
+mauve = "#7e7252"
+maroon = "#ba1a1a"
+peach = "#635e50"
+teal = "#797263"
+sky = "#797263"
+sapphire = "#54604a"
+lavender = "#7e7252"
+
+# Text shades
+text = "#1d1b19"
+subtext1 = "#1d1b19"
+subtext0 = "#7b776c"
+
+# Surface shades
+overlay2 = "#7b776c"
+overlay1 = "#7b776c"
+overlay0 = "#e9e2d4"
+surface2 = "#e9e2d4"
+surface1 = "#e9e2d4"
+surface0 = "#fef8f4"
+base = "#fef8f4"
+mantle = "#fef8f4"
+crust = "#fef8f4"
+# <<< NOCTALIA STARSHIP PALETTE <<<
diff --git a/.config/vicinae/settings.json b/.config/vicinae/settings.json
new file mode 100644
index 0000000..b9a5a02
--- /dev/null
+++ b/.config/vicinae/settings.json
@@ -0,0 +1,234 @@
+// This configuration is merged with the default vicinae configuration file, which you can obtain by running the `vicinae config default` command.
+// Every item defined in this file takes precedence over the values defined in the default config or any other imported file.
+//
+// You can make manual edits to this file, however you should keep in mind that this file may be written to by vicinae when a configuration change is made through the GUI.
+// When that happens, any custom comments or formatting will be lost.
+//
+// If you want to maintain a configuration file with your own comments and formatting, you should create a separate file and add it to the 'imports' array.
+//
+// Learn more about configuration at https://docs.vicinae.com/config
+
+{
+ "$schema": "https://vicinae.com/schemas/config.json",
+ "encrypt_sensitive_data": true,
+ "favicon_service": "google",
+ "font": {
+ "normal": {
+ "family": "JetBrains Mono ExtraBold"
+ }
+ },
+ "theme": {
+ "light": {
+ "name": "vicinae-wallust-light"
+ },
+ "dark": {
+ "name": "vicinae-wallust-dark",
+ "icon_theme": "Hicolor"
+ }
+ },
+ "telemetry": {
+ "system_info": false
+ },
+ "launcher_window": {
+ "rounding": 1,
+ "opacity": 1,
+ "client_side_decorations": {
+ "shadow_size": 0
+ },
+ "compact_mode": {
+ "enabled": true
+ }
+ },
+ "providers": {
+ "applications": {
+ "entrypoints": {
+ "PEAK": {
+ "enabled": false
+ },
+ "assistant": {
+ "enabled": false
+ },
+ "blueman-manager": {
+ "enabled": false
+ },
+ "btop": {
+ "enabled": false
+ },
+ "darkman": {
+ "enabled": false
+ },
+ "foot-server": {
+ "enabled": false
+ },
+ "footclient": {
+ "enabled": false
+ },
+ "linguist": {
+ "enabled": false
+ },
+ "nvidia-settings": {
+ "enabled": false
+ },
+ "qdbusviewer": {
+ "enabled": false
+ },
+ "qphotorec": {
+ "enabled": false
+ },
+ "rmpc": {
+ "enabled": false
+ }
+ }
+ },
+ "clipboard": {
+ "preferences": {
+ "monitoring": true
+ }
+ },
+ "core": {
+ "entrypoints": {
+ "about": {
+ "enabled": false
+ },
+ "documentation": {
+ "enabled": false
+ },
+ "keybind-settings": {
+ "enabled": false
+ },
+ "list-extensions": {
+ "enabled": false
+ },
+ "manage-fallback": {
+ "enabled": false
+ },
+ "oauth-token-store": {
+ "enabled": false
+ },
+ "open-config-file": {
+ "enabled": false
+ },
+ "open-default-config": {
+ "enabled": false
+ },
+ "prune-memory": {
+ "enabled": false
+ },
+ "refresh-apps": {
+ "enabled": false
+ },
+ "reload-scripts": {
+ "enabled": false
+ },
+ "report-bug": {
+ "enabled": false
+ },
+ "search-builtin-icons": {
+ "enabled": false
+ },
+ "search-emojis": {
+ "enabled": true
+ },
+ "settings": {
+ "enabled": false
+ },
+ "show-logs": {
+ "enabled": false
+ },
+ "sponsor": {
+ "enabled": false
+ },
+ "store": {
+ "enabled": true
+ }
+ }
+ },
+ "font": {
+ "enabled": false
+ },
+ "manage-shortcuts": {
+ "enabled": false
+ },
+ "power": {
+ "enabled": true,
+ "entrypoints": {
+ "hibernate": {
+ "enabled": false
+ },
+ "lock": {
+ "enabled": false
+ },
+ "logout": {
+ "enabled": false
+ },
+ "power-off": {
+ "enabled": true
+ },
+ "reboot": {
+ "enabled": true
+ },
+ "sleep": {
+ "enabled": false
+ },
+ "soft-reboot": {
+ "enabled": false
+ },
+ "suspend": {
+ "enabled": false
+ }
+ }
+ },
+ "snippets": {
+ "enabled": false
+ },
+ "system": {
+ "enabled": false,
+ "entrypoints": {
+ "run": {
+ "enabled": false
+ },
+ "toggle-mute": {
+ "enabled": false
+ },
+ "volume-0": {
+ "enabled": false
+ },
+ "volume-100": {
+ "enabled": false
+ },
+ "volume-25": {
+ "enabled": false
+ },
+ "volume-50": {
+ "enabled": false
+ },
+ "volume-75": {
+ "enabled": false
+ },
+ "volume-down": {
+ "enabled": false
+ },
+ "volume-up": {
+ "enabled": false
+ }
+ }
+ },
+ "wm": {
+ "enabled": false,
+ "entrypoints": {
+ "switch-windows": {
+ "enabled": false
+ },
+ "toggle-floating": {
+ "enabled": false
+ },
+ "toggle-fullscreen": {
+ "enabled": false
+ },
+ "toggle-overview": {
+ "enabled": false
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/.config/wallust/templates/dbg.ini b/.config/wallust/templates/dbg.ini
new file mode 100644
index 0000000..edc18bb
--- /dev/null
+++ b/.config/wallust/templates/dbg.ini
@@ -0,0 +1,4 @@
+plain={{background}}
+strip={{background.strip}}
+hex={{background.hex}}
+rgb={{background.rgb}}
diff --git a/.config/wallust/templates/foot-colors-custom.ini b/.config/wallust/templates/foot-colors-custom.ini
new file mode 100644
index 0000000..5fc7983
--- /dev/null
+++ b/.config/wallust/templates/foot-colors-custom.ini
@@ -0,0 +1,20 @@
+# wallust foot template — foot expects colors without '#'
+[colors]
+background={{background}}
+foreground={{foreground}}
+regular0={{color0}}
+regular1={{color1}}
+regular2={{color2}}
+regular3={{color3}}
+regular4={{color4}}
+regular5={{color5}}
+regular6={{color6}}
+regular7={{color7}}
+bright0={{color8}}
+bright1={{color9}}
+bright2={{color10}}
+bright3={{color11}}
+bright4={{color12}}
+bright5={{color13}}
+bright6={{color14}}
+bright7={{color15}}
diff --git a/.config/wallust/templates/nvim.lua b/.config/wallust/templates/nvim.lua
new file mode 100644
index 0000000..be60dd7
--- /dev/null
+++ b/.config/wallust/templates/nvim.lua
@@ -0,0 +1,306 @@
+-- Generated by wallust from your system color scheme. Do not edit by hand.
+-- Source of truth: wallust/.config/wallust/templates/nvim.lua
+local bg = "{{background}}"
+local fg = "{{foreground}}"
+local cursor = "{{cursor}}"
+local c = {
+ "{{color0}}", "{{color1}}", "{{color2}}", "{{color3}}",
+ "{{color4}}", "{{color5}}", "{{color6}}", "{{color7}}",
+ "{{color8}}", "{{color9}}", "{{color10}}", "{{color11}}",
+ "{{color12}}", "{{color13}}", "{{color14}}", "{{color15}}",
+}
+
+-- Pick light/dark from the background luminance so plugins (diff, signs, …) behave.
+local function lum(hex)
+ hex = hex:gsub("#", "")
+ local r = tonumber(hex:sub(1, 2), 16) / 255
+ local g = tonumber(hex:sub(3, 4), 16) / 255
+ local b = tonumber(hex:sub(5, 6), 16) / 255
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b
+end
+
+vim.opt.background = lum(bg) < 0.5 and "dark" or "light"
+vim.g.colors_name = "wallust"
+
+local set = function(name, opts)
+ vim.api.nvim_set_hl(0, name, opts)
+end
+
+-- semantic aliases for the 16-color palette
+local black, red, green, yellow, blue, magenta, cyan, white =
+ c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8]
+local brblack, brred, brgreen, bryellow, brblue, brmagenta, brcyan, brwhite =
+ c[9], c[10], c[11], c[12], c[13], c[14], c[15], c[16]
+
+local panel = c[1] -- floating / panel background (near bg)
+local sel = brblack -- selection / visual background
+local muted = brblack -- dimmed / secondary text
+
+-- ── Editor ──────────────────────────────────────────────────────────────
+set("Normal", { fg = fg, bg = bg })
+set("NormalFloat", { fg = fg, bg = panel })
+set("NormalNC", { fg = fg, bg = bg })
+set("ColorColumn", { bg = panel })
+set("Conceal", { fg = muted })
+set("Cursor", { fg = bg, bg = cursor })
+set("CursorIM", { fg = bg, bg = cursor })
+set("CursorLine", { bg = panel })
+set("CursorColumn", { bg = panel })
+set("CursorLineNr", { fg = fg, bg = panel })
+set("LineNr", { fg = muted })
+set("SignColumn", { fg = muted, bg = bg })
+set("WinSeparator", { fg = muted })
+set("VertSplit", { fg = muted })
+set("Directory", { fg = blue })
+set("DiffAdd", { fg = green, bg = bg })
+set("DiffChange", { fg = yellow, bg = bg })
+set("DiffDelete", { fg = red, bg = bg })
+set("DiffText", { fg = yellow, bg = panel })
+set("ErrorMsg", { fg = red, bold = true })
+set("WarningMsg", { fg = yellow, bold = true })
+set("ModeMsg", { fg = fg })
+set("MsgArea", { fg = fg })
+set("MoreMsg", { fg = green })
+set("Question", { fg = green })
+set("NonText", { fg = muted })
+set("SpecialKey", { fg = muted })
+set("Whitespace", { fg = panel })
+set("Title", { fg = yellow, bold = true })
+set("Folded", { fg = muted, bg = panel })
+set("FoldColumn", { fg = muted, bg = bg })
+set("MatchParen", { fg = yellow, bg = panel, bold = true })
+set("Search", { fg = bg, bg = yellow })
+set("IncSearch", { fg = bg, bg = magenta })
+set("CurSearch", { fg = bg, bg = magenta })
+set("QuickFixLine", { fg = bg, bg = blue })
+set("Visual", { bg = sel })
+set("VisualNOS", { bg = sel })
+set("StatusLine", { fg = fg, bg = panel })
+set("StatusLineNC", { fg = muted, bg = bg })
+set("TabLine", { fg = muted, bg = bg })
+set("TabLineFill", { fg = muted, bg = bg })
+set("TabLineSel", { fg = bg, bg = blue })
+set("WildMenu", { fg = bg, bg = blue })
+set("Winbar", { fg = fg, bg = panel })
+set("WinbarNC", { fg = muted, bg = bg })
+set("Pmenu", { fg = fg, bg = panel })
+set("PmenuSel", { fg = bg, bg = blue })
+set("PmenuSbar", { bg = panel })
+set("PmenuThumb", { bg = muted })
+set("FloatBorder", { fg = muted })
+set("FloatTitle", { fg = yellow, bg = panel })
+set("FloatFooter", { fg = muted, bg = panel })
+set("SpellBad", { undercurl = true, sp = red })
+set("SpellCap", { undercurl = true, sp = yellow })
+set("SpellLocal", { undercurl = true, sp = cyan })
+set("SpellRare", { undercurl = true, sp = magenta })
+
+-- ── Legacy syntax groups ────────────────────────────────────────────────
+set("Comment", { fg = muted, italic = true })
+set("Constant", { fg = cyan })
+set("String", { fg = green })
+set("Character", { fg = green })
+set("Number", { fg = red })
+set("Boolean", { fg = red })
+set("Float", { fg = red })
+set("Identifier", { fg = brcyan })
+set("Function", { fg = blue })
+set("Statement", { fg = magenta })
+set("Conditional", { fg = magenta })
+set("Repeat", { fg = magenta })
+set("Label", { fg = magenta })
+set("Operator", { fg = fg })
+set("Keyword", { fg = magenta })
+set("Exception", { fg = magenta })
+set("PreProc", { fg = brblue })
+set("Include", { fg = brblue })
+set("Define", { fg = brblue })
+set("Macro", { fg = brblue })
+set("PreCondit", { fg = brblue })
+set("Type", { fg = yellow })
+set("StorageClass", { fg = yellow })
+set("Structure", { fg = yellow })
+set("Typedef", { fg = yellow })
+set("Special", { fg = brgreen })
+set("SpecialChar", { fg = brgreen })
+set("Tag", { fg = red })
+set("Delimiter", { fg = muted })
+set("SpecialComment", { fg = muted, italic = true })
+set("Debug", { fg = red })
+set("Underlined", { fg = blue, underline = true })
+set("Ignore", { fg = muted })
+set("Error", { fg = red, bold = true })
+set("Todo", { fg = bg, bg = yellow, bold = true })
+
+-- ── Treesitter ──────────────────────────────────────────────────────────
+set("@comment", { fg = muted, italic = true })
+set("@comment.lua", { fg = muted, italic = true })
+set("@error", { fg = red, undercurl = true, sp = red })
+set("@none", {})
+set("@preproc", { fg = brblue })
+set("@define", { fg = brblue })
+set("@operator", { fg = fg })
+
+set("@string", { fg = green })
+set("@string.escape", { fg = red })
+set("@string.special", { fg = brgreen })
+set("@character", { fg = green })
+set("@character.special", { fg = brgreen })
+
+set("@number", { fg = red })
+set("@float", { fg = red })
+set("@boolean", { fg = red })
+set("@constant", { fg = cyan })
+set("@constant.builtin", { fg = brcyan })
+set("@constant.macro", { fg = brblue })
+
+set("@variable", { fg = fg })
+set("@variable.builtin", { fg = red })
+set("@variable.parameter", { fg = fg })
+set("@variable.parameter.builtin", { fg = fg })
+set("@field", { fg = fg })
+set("@property", { fg = fg })
+
+set("@function", { fg = blue })
+set("@function.builtin", { fg = blue })
+set("@function.macro", { fg = brblue })
+set("@method", { fg = blue })
+set("@constructor", { fg = yellow })
+
+set("@parameter", { fg = fg })
+set("@keyword", { fg = magenta })
+set("@keyword.function", { fg = magenta })
+set("@keyword.operator", { fg = magenta })
+set("@keyword.modifier", { fg = magenta })
+set("@storageclass", { fg = yellow })
+set("@structure", { fg = yellow })
+set("@namespace", { fg = blue })
+
+set("@type", { fg = yellow })
+set("@type.builtin", { fg = bryellow })
+set("@type.definition", { fg = yellow })
+
+set("@punctuation.delimiter", { fg = muted })
+set("@punctuation.bracket", { fg = fg })
+set("@punctuation.special", { fg = magenta })
+
+set("@text", { fg = fg })
+set("@text.strong", { bold = true })
+set("@text.emphasis", { italic = true })
+set("@text.underline", { underline = true })
+set("@text.strike", { strikethrough = true })
+set("@text.title", { fg = blue, bold = true })
+set("@text.title.1", { fg = blue, bold = true })
+set("@text.title.2", { fg = cyan, bold = true })
+set("@text.title.3", { fg = green, bold = true })
+set("@text.title.4", { fg = yellow, bold = true })
+set("@text.title.5", { fg = magenta, bold = true })
+set("@text.title.6", { fg = red, bold = true })
+set("@text.literal", { fg = green })
+set("@text.uri", { fg = cyan, underline = true })
+set("@text.todo", { fg = bg, bg = yellow, bold = true })
+set("@text.note", { fg = bg, bg = blue, bold = true })
+set("@text.warning", { fg = bg, bg = yellow, bold = true })
+set("@text.danger", { fg = bg, bg = red, bold = true })
+
+set("@tag", { fg = red })
+set("@tag.attribute", { fg = yellow })
+set("@tag.delimiter", { fg = muted })
+
+set("@markup.heading", { fg = blue, bold = true })
+set("@markup.strong", { bold = true })
+set("@markup.italic", { italic = true })
+set("@markup.link", { fg = cyan, underline = true })
+set("@markup.link.url", { fg = cyan, underline = true })
+set("@markup.raw", { fg = green })
+set("@markup.list", { fg = magenta })
+set("@markup.quote", { fg = muted, italic = true })
+
+set("@diff.add", { fg = green })
+set("@diff.delete", { fg = red })
+set("@diff.change", { fg = yellow })
+
+set("@conceal", { fg = muted })
+
+-- ── LSP / Diagnostics ───────────────────────────────────────────────────
+set("DiagnosticError", { fg = red })
+set("DiagnosticWarn", { fg = yellow })
+set("DiagnosticInfo", { fg = blue })
+set("DiagnosticHint", { fg = cyan })
+set("DiagnosticOk", { fg = green })
+set("DiagnosticVirtualTextError", { fg = red })
+set("DiagnosticVirtualTextWarn", { fg = yellow })
+set("DiagnosticVirtualTextInfo", { fg = blue })
+set("DiagnosticVirtualTextHint", { fg = cyan })
+set("DiagnosticUnderlineError", { undercurl = true, sp = red })
+set("DiagnosticUnderlineWarn", { undercurl = true, sp = yellow })
+set("DiagnosticUnderlineInfo", { undercurl = true, sp = blue })
+set("DiagnosticUnderlineHint", { undercurl = true, sp = cyan })
+set("DiagnosticSignError", { fg = red })
+set("DiagnosticSignWarn", { fg = yellow })
+set("DiagnosticSignInfo", { fg = blue })
+set("DiagnosticSignHint", { fg = cyan })
+set("DiagnosticFloatingError", { fg = red })
+set("DiagnosticFloatingWarn", { fg = yellow })
+set("DiagnosticFloatingInfo", { fg = blue })
+set("DiagnosticFloatingHint", { fg = cyan })
+set("DiagnosticUnnecessary", { undercurl = true, sp = muted })
+
+set("LspReferenceText", { bg = sel })
+set("LspReferenceRead", { bg = sel })
+set("LspReferenceWrite", { bg = sel })
+set("LspCodeLens", { fg = muted })
+set("LspCodeLensSeparator", { fg = muted })
+set("LspSignatureActiveParameter", { fg = yellow, bold = true })
+set("LspInlayHint", { fg = muted, italic = true })
+
+-- ── Git / signs ─────────────────────────────────────────────────────────
+set("GitSignsAdd", { fg = green })
+set("GitSignsChange", { fg = yellow })
+set("GitSignsDelete", { fg = red })
+set("GitSignsAddLn", { fg = green })
+set("GitSignsChangeLn", { fg = yellow })
+set("GitSignsDeleteLn", { fg = red })
+set("GitSignsCurrentLineBlame", { fg = muted })
+set("SignAdd", { fg = green })
+set("SignChange", { fg = yellow })
+set("SignDelete", { fg = red })
+
+-- ── Misc plugin UI ──────────────────────────────────────────────────────
+set("TelescopeNormal", { fg = fg, bg = panel })
+set("TelescopeBorder", { fg = muted })
+set("TelescopePromptBorder", { fg = muted })
+set("TelescopeResultsBorder", { fg = muted })
+set("TelescopeTitle", { fg = yellow, bold = true })
+set("TelescopeSelection", { fg = bg, bg = blue })
+set("TelescopeMatching", { fg = yellow, bold = true })
+
+set("WhichKey", { fg = fg })
+set("WhichKeyGroup", { fg = blue })
+set("WhichKeyDesc", { fg = fg })
+set("WhichKeySeparator", { fg = muted })
+set("WhichKeyFloat", { bg = panel })
+set("WhichKeyValue", { fg = muted })
+
+set("CmpItemAbbr", { fg = fg })
+set("CmpItemAbbrDeprecated", { fg = muted, strikethrough = true })
+set("CmpItemAbbrMatch", { fg = yellow, bold = true })
+set("CmpItemKind", { fg = blue })
+set("CmpItemMenu", { fg = muted })
+
+set("NvimTreeNormal", { fg = fg, bg = bg })
+set("NvimTreeIndentMarker", { fg = panel })
+set("NvimTreeFolderIcon", { fg = blue })
+set("NvimTreeOpenedFile", { fg = blue })
+set("NvimTreeGitDirty", { fg = yellow })
+set("NvimTreeGitNew", { fg = green })
+set("NvimTreeGitDeleted", { fg = red })
+
+set("BufferLineFill", { bg = bg })
+set("BufferLineBackground", { fg = muted })
+set("BufferLineBufferSelected", { fg = fg, bold = true })
+set("BufferLineIndicatorSelected", { fg = blue })
+set("BufferLineTabSelected", { fg = blue, bold = true })
+set("BufferLineModified", { fg = yellow })
+
+set("NeoTreeNormal", { fg = fg, bg = bg })
diff --git a/.config/wallust/templates/shell-colors.sh b/.config/wallust/templates/shell-colors.sh
new file mode 100644
index 0000000..3cfb24d
--- /dev/null
+++ b/.config/wallust/templates/shell-colors.sh
@@ -0,0 +1,20 @@
+# CUSTOM wallust shell template
+color0={{color0}}
+color1={{color1}}
+color2={{color2}}
+color3={{color3}}
+color4={{color4}}
+color5={{color5}}
+color6={{color6}}
+color7={{color7}}
+color8={{color8}}
+color9={{color9}}
+color10={{color10}}
+color11={{color11}}
+color12={{color12}}
+color13={{color13}}
+color14={{color14}}
+color15={{color15}}
+background={{background}}
+foreground={{foreground}}
+cursor={{cursor}}
diff --git a/.config/wallust/templates/vicinae-dark.toml b/.config/wallust/templates/vicinae-dark.toml
new file mode 100644
index 0000000..5c2c9b3
--- /dev/null
+++ b/.config/wallust/templates/vicinae-dark.toml
@@ -0,0 +1,78 @@
+[meta]
+name = "vicinae-wallust-dark"
+description = "Wallust-generated dark theme for Vicinae"
+variant = "dark"
+inherits = "vicinae-dark"
+
+[colors.core]
+accent = "{{color4}}"
+accent_foreground = "{{background}}"
+background = "{{background}}"
+foreground = "{{foreground}}"
+secondary_background = "{{color0}}"
+border = "{{color8}}"
+
+[colors.main_window]
+border = "{{color8}}"
+footer = { background = "colors.core.secondary_background" }
+
+[colors.settings_window]
+border = "{{color8}}"
+
+[colors.accents]
+blue = "{{color4}}"
+green = "{{color2}}"
+magenta = "{{color5}}"
+orange = "{{color1}}"
+red = "{{color1}}"
+yellow = "{{color3}}"
+cyan = "{{color6}}"
+purple = "{{color5}}"
+
+[colors.shortcut]
+border = "colors.core.border"
+
+[colors.text]
+default = "colors.core.foreground"
+muted = "{{color7}}"
+danger = "{{color1}}"
+success = "{{color2}}"
+placeholder = "{{color8}}"
+selection = { background = "{{color4}}", foreground = "{{background}}" }
+
+[colors.text.links]
+default = "{{color3}}"
+visited = "{{color5}}"
+
+[colors.input]
+border = "{{color8}}"
+border_focus = "{{color4}}"
+border_error = "{{color1}}"
+
+[colors.button.primary]
+background = "{{color0}}"
+foreground = "{{foreground}}"
+hover = { background = "{{color8}}" }
+focus = { outline = "colors.core.accent" }
+
+[colors.list.item.hover]
+foreground = "{{foreground}}"
+secondary_foreground = "{{color7}}"
+
+[colors.list.item.selection]
+background = "{{color0}}"
+foreground = "{{foreground}}"
+secondary_background = "{{color0}}"
+secondary_foreground = "{{color7}}"
+
+[colors.grid.item]
+background = "{{color0}}"
+hover = { outline = "{{foreground}}" }
+selection = { outline = "{{foreground}}" }
+
+[colors.scrollbars]
+background = "{{color8}}"
+
+[colors.loading]
+bar = "{{color4}}"
+spinner = "{{foreground}}"
diff --git a/.config/wallust/templates/vicinae-light.toml b/.config/wallust/templates/vicinae-light.toml
new file mode 100644
index 0000000..92516f8
--- /dev/null
+++ b/.config/wallust/templates/vicinae-light.toml
@@ -0,0 +1,78 @@
+[meta]
+name = "vicinae-wallust-light"
+description = "Wallust-generated light theme for Vicinae"
+variant = "light"
+inherits = "vicinae-light"
+
+[colors.core]
+accent = "{{color4}}"
+accent_foreground = "{{foreground}}"
+background = "{{foreground}}"
+foreground = "{{background}}"
+secondary_background = "{{color7}}"
+border = "{{color8}}"
+
+[colors.main_window]
+border = "{{color8}}"
+footer = { background = "colors.core.secondary_background" }
+
+[colors.settings_window]
+border = "{{color8}}"
+
+[colors.accents]
+blue = "{{color4}}"
+green = "{{color2}}"
+magenta = "{{color5}}"
+orange = "{{color1}}"
+red = "{{color1}}"
+yellow = "{{color3}}"
+cyan = "{{color6}}"
+purple = "{{color5}}"
+
+[colors.shortcut]
+border = "colors.core.border"
+
+[colors.text]
+default = "colors.core.foreground"
+muted = "{{color8}}"
+danger = "{{color1}}"
+success = "{{color2}}"
+placeholder = "{{color7}}"
+selection = { background = "{{color4}}", foreground = "{{foreground}}" }
+
+[colors.text.links]
+default = "{{color3}}"
+visited = "{{color5}}"
+
+[colors.input]
+border = "{{color8}}"
+border_focus = "{{color4}}"
+border_error = "{{color1}}"
+
+[colors.button.primary]
+background = "{{color7}}"
+foreground = "{{background}}"
+hover = { background = "{{color8}}" }
+focus = { outline = "colors.core.accent" }
+
+[colors.list.item.hover]
+foreground = "{{background}}"
+secondary_foreground = "{{color8}}"
+
+[colors.list.item.selection]
+background = "{{color7}}"
+foreground = "{{background}}"
+secondary_background = "{{color7}}"
+secondary_foreground = "{{color8}}"
+
+[colors.grid.item]
+background = "{{color7}}"
+hover = { outline = "{{background}}" }
+selection = { outline = "{{background}}" }
+
+[colors.scrollbars]
+background = "{{color8}}"
+
+[colors.loading]
+bar = "{{color4}}"
+spinner = "{{background}}"
diff --git a/.config/wallust/wallust.toml b/.config/wallust/wallust.toml
new file mode 100644
index 0000000..d1e8925
--- /dev/null
+++ b/.config/wallust/wallust.toml
@@ -0,0 +1,11 @@
+backend = "fastresize"
+
+[templates]
+nvim = { template = "nvim.lua", target = "~/.cache/wallust/colors/wallust.lua" }
+foottheme = { template = "foot-colors-custom.ini", target = "~/.cache/wallust/foot-theme.ini" }
+vicinae_dark = { template = "vicinae-dark.toml", target = "~/.cache/wallust/vicinae-dark.toml" }
+vicinae_light = { template = "vicinae-light.toml", target = "~/.cache/wallust/vicinae-light.toml" }
+
+[hooks]
+strip_foot_hash = "sed -i '/^[^#]/s/#//g' ~/.cache/wallust/foot-theme.ini"
+symlink_vicinae = "mkdir -p ~/.local/share/vicinae/themes && ln -sf ~/.cache/wallust/vicinae-dark.toml ~/.local/share/vicinae/themes/vicinae-wallust-dark.toml && ln -sf ~/.cache/wallust/vicinae-light.toml ~/.local/share/vicinae/themes/vicinae-wallust-light.toml"
diff --git a/.config/waybar/config.jsonc b/.config/waybar/config.jsonc
new file mode 100644
index 0000000..c20a95c
--- /dev/null
+++ b/.config/waybar/config.jsonc
@@ -0,0 +1,112 @@
+{
+ "exclusive": true,
+ "reload_style_on_change": true,
+ "position": "top",
+ "margin-top": 0,
+ "spacing": 0,
+ "height": 0,
+ "margin-bottom": 0,
+ "modules-left": [
+ "niri/workspaces",
+ "custom/separator",
+ "tray",
+ "custom/separator2",
+ "custom/separator5",
+ "custom/media",
+ "custom/separator6"
+ ],
+ "modules-center": ["custom/separator", "custom/clock", "custom/separator2"],
+ "modules-right": [
+ "custom/separator",
+ "custom/separator3",
+ "custom/kbd",
+ "custom/separator3",
+ "pulseaudio",
+ "custom/separator3",
+ "memory",
+ "custom/separator2"
+ ],
+ "niri/workspaces": {
+ "disable-scroll": true,
+ "format": "{index}"
+ },
+ "custom/separator": {
+ "format": "[",
+ "tooltip": false
+ },
+ "custom/separator2": {
+ "format": "]",
+ "tooltip": false
+ },
+ "custom/separator3": {
+ "format": "ó°¿Ÿ",
+ "tooltip": false
+ },
+ "custom/separator5": {
+ "exec": "sh -c 'if pgrep -x cliamp >/dev/null || playerctl status 2>/dev/null | grep -qE \"Playing|Paused\"; then echo \"{\\\"text\\\":\\\"[\\\",\\\"class\\\":\\\"show\\\"}\"; else echo \"{\\\"text\\\":\\\"\\\",\\\"class\\\":\\\"hide\\\"}\"; fi'",
+ "return-type": "json",
+ "interval": 2,
+ "format": "{}"
+ },
+ "custom/separator6": {
+ "exec": "sh -c 'if pgrep -x cliamp >/dev/null || playerctl status 2>/dev/null | grep -qE \"Playing|Paused\"; then echo \"{\\\"text\\\":\\\"]\\\",\\\"class\\\":\\\"show\\\"}\"; else echo \"{\\\"text\\\":\\\"\\\",\\\"class\\\":\\\"hide\\\"}\"; fi'",
+ "return-type": "json",
+ "interval": 2,
+ "format": "{}"
+ },
+
+ "memory": {
+ "interval": 2,
+ "format": "RAM {percentage:02}%",
+ "on-click": "foot btop",
+ "states": {
+ "warning": 50,
+ "critical": 80
+ }
+ },
+ "custom/kbd": {
+ "exec": "/home/seraphim/dotfiles-gentoo/waybar/.config/waybar/kbd-layout.sh",
+ "tooltip": false
+ },
+ "custom/clock": {
+ "exec": "date +'%H:%M %p - %A, %b %d' | tr '[:upper:]' '[:lower:]'",
+ "interval": 1,
+ "tooltip": false
+ },
+ "pulseaudio": {
+ "justify": "center",
+ "format": "vol {volume}%",
+ "on-click": "foot wiremix",
+ "on-click-right": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle",
+ "tooltip-format": "Playing at {volume}%",
+ "scroll-step": 5,
+ "format-muted": "vol <span style='italic' weight='900' color='#999999'>muted</span>",
+ "format-icons": {
+ "headphone": "",
+ "default": ["", "", ""]
+ },
+ "states": {
+ "warning": 50,
+ "critical": 10
+ }
+ },
+ "custom/media": {
+ "format": "{}",
+ "max-length": 30,
+ "interval": 2,
+ "exec": "playerctl metadata --format '{{ artist }} - {{ title }}' 2>/dev/null || echo \"\"",
+ "on-click": "playerctl play-pause"
+ },
+"tray": {
+ "icon-size": 14,
+ "spacing": 3
+ },
+ "custom/analyze-theme": {
+ "exec": "node /home/seraphim/dotfiles-gentoo/waybar/.config/waybar/custom/analyze-theme.js",
+ "interval": 5,
+ "tooltip": true,
+ "format": "{}",
+ "return-type": "json",
+ "on-click": "sh -c '~/.config/niri/apply-colors.sh \"$(find ~/Pictures/wallpapers -type f | shuf -n 1)\"'"
+ }
+}
diff --git a/.config/waybar/kbd-layout.sh b/.config/waybar/kbd-layout.sh
new file mode 100755
index 0000000..e81462a
--- /dev/null
+++ b/.config/waybar/kbd-layout.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+# Kill any leftover instances so reloads don't pile up.
+for p in $(pgrep -f "kbd-layout.sh"); do
+ [ "$p" != "$$" ] && kill "$p" 2>/dev/null
+done
+
+STATE="${XDG_RUNTIME_DIR:-/tmp}/waybar-kbd.state"
+rm -f "$STATE"
+
+# Index of the Russian layout (from configured layouts), so we don't hardcode order.
+RUS_IDX=$(niri msg keyboard-layouts 2>/dev/null | grep -i russian | grep -oE '^[ *]*[0-9]+' | tr -d ' *' | head -1)
+
+kbd_query() {
+ niri msg keyboard-layouts 2>/dev/null | grep -Fm1 '*' | grep -qi russian && echo Ru || echo En
+}
+
+# Parse a "Keyboard layout switched: N" or "...current_idx: N" event line.
+kbd_event() {
+ idx=$(printf '%s' "$1" | grep -oE '[0-9]+' | tail -1)
+ [ "$idx" = "$RUS_IDX" ] && echo Ru || echo En
+}
+
+emit() {
+ v="$1"; src="$2"
+ echo "$v"
+ echo "$v" > "$STATE"
+}
+
+# Instant path: react to niri's layout-change events.
+niri msg event-stream 2>/dev/null | {
+ while true; do
+ if IFS= read -r -t 0.2 line; then
+ case "$line" in
+ *"Keyboard layout switched"*|*"Keyboard layouts changed"*) emit "$(kbd_event "$line")" event ;;
+ esac
+ else
+ v=$(kbd_query)
+ [ "$(cat "$STATE" 2>/dev/null)" != "$v" ] && emit "$v" poll
+ fi
+ done
+}
diff --git a/.config/waybar/style.css b/.config/waybar/style.css
new file mode 100644
index 0000000..cf8dbee
--- /dev/null
+++ b/.config/waybar/style.css
@@ -0,0 +1,166 @@
+@import "/home/seraphim/dotfiles-gentoo/waybar/.config/waybar/theme.css";
+@define-color bg @background;
+@define-color fg @foreground;
+
+* {
+ border: none;
+ padding: 0px;
+ font-family: "JetBrains Mono Nerd Font";
+ transition: background-color .3s ease-out;
+ font-weight: bold;
+ font-size: 12px;
+}
+
+window#waybar {
+ background-color: transparent;
+}
+
+#waybar > box {
+ border-radius: 0px;
+ border-bottom: 1.5px solid alpha(@foreground, 0.12);
+ margin: 0px 0px 2px 0px;
+ background-color: @background;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 1);
+ min-height: 25px;
+ transition-property: background-color;
+ transition-duration: .5s;
+}
+
+.modules-left {
+ margin-left: 4px;
+}
+
+.modules-right {
+ margin-right: 4px;
+}
+
+#workspaces {
+ margin: 0px 0px;
+ transition: 0.1s ease-in-out;
+ padding: 0px 0px;
+}
+
+#workspaces button {
+ all: initial;
+ padding: 0px 4px;
+ margin: 4px 2px;
+ min-width: 10px;
+ color: @foreground;
+ opacity: 1;
+ font-weight: 900;
+}
+
+#workspaces button.active {
+ color: @background;
+ background-color: @foreground;
+ padding: 0px 4px;
+ margin: 4px 2px;
+ opacity: 1.0;
+}
+
+#workspaces button.empty:hover,
+#workspaces button:hover {
+ background: transparent;
+ color: alpha(@foreground, 1);
+ transition: all 150ms ease;
+ opacity: 0.75;
+}
+
+#workspaces button.empty {
+ opacity: 0.4;
+ padding: 0px 4px;
+ margin: 4px 2px;
+ color: alpha(@foreground, 0.45);
+}
+
+#workspaces button.empty.active {
+ opacity: 1;
+ background-color: @foreground;
+ color: @background;
+}
+
+#memory,
+#custom-media,
+#custom-kbd,
+#tray,
+#cpu,
+#custom-clock,
+#bluetooth,
+#pulseaudio {
+ min-width: 12px;
+ padding: 0 4px;
+ margin: 1px 3px 1px 3px;
+ opacity: 1;
+ color: @foreground;
+}
+
+#tray {
+ opacity: 1;
+ padding-top: 2px;
+}
+
+#custom-separator6,
+#custom-separator5,
+#custom-separator4,
+#custom-separator3,
+#custom-separator2,
+#custom-separator {
+ opacity: 0.2;
+ padding-top: 2px;
+ padding-left: 2px;
+ padding-right: 2px;
+ font-size: 14px;
+}
+
+tooltip {
+ padding: 2px;
+}
+
+.hidden {
+ opacity: 0;
+}
+
+tooltip {
+ padding: 4px;
+ background: @background;
+ font-size: 10px;
+ border: 1.5px solid alpha(@foreground, 0.6);
+ border-radius: 8px;
+}
+
+tooltip label {
+ color: alpha(@foreground, 0.65);
+ font-weight: normal;
+}
+
+#custom-media {
+ opacity: 1;
+ color: @foreground;
+ animation: repeat;
+ animation-name: blink;
+ animation-duration: 3s;
+ animation-timing-function: linear;
+ animation-iteration-count: infinite;
+ animation-direction: alternate;
+}
+
+@keyframes blink {
+ to {
+ color: #999999;
+ }
+}
+
+#pulseaudio.warning,
+#memory.warning,
+#cpu.warning {
+ color: alpha(@foreground, 0.65);
+ background-color: @background;
+}
+
+#pulseaudio.critical,
+#memory.critical,
+#cpu.critical {
+ color: @foreground;
+ background-color: @background;
+ font-weight: 900;
+}
diff --git a/.config/waybar/theme-dark.css b/.config/waybar/theme-dark.css
new file mode 100644
index 0000000..d88a91d
--- /dev/null
+++ b/.config/waybar/theme-dark.css
@@ -0,0 +1,2 @@
+@define-color background #111111;
+@define-color foreground #fafafa;
diff --git a/.config/waybar/theme-light.css b/.config/waybar/theme-light.css
new file mode 100644
index 0000000..b757ab6
--- /dev/null
+++ b/.config/waybar/theme-light.css
@@ -0,0 +1,2 @@
+@define-color background #fafafa;
+@define-color foreground #111111;
diff --git a/.config/waybar/theme.css b/.config/waybar/theme.css
new file mode 120000
index 0000000..aea3c67
--- /dev/null
+++ b/.config/waybar/theme.css
@@ -0,0 +1 @@
+theme-dark.css \ No newline at end of file
diff --git a/.config/xdg-desktop-portal/portals.conf b/.config/xdg-desktop-portal/portals.conf
new file mode 100644
index 0000000..c651895
--- /dev/null
+++ b/.config/xdg-desktop-portal/portals.conf
@@ -0,0 +1,5 @@
+[preferred]
+default=gtk
+org.freedesktop.impl.portal.Settings=darkman
+org.freedesktop.impl.portal.Screencast=wlr
+org.freedesktop.impl.portal.Screenshot=wlr
diff --git a/.config/yazi/keymap.toml b/.config/yazi/keymap.toml
new file mode 100644
index 0000000..f275171
--- /dev/null
+++ b/.config/yazi/keymap.toml
@@ -0,0 +1,9 @@
+[[mgr.prepend_keymap]]
+on = [ "<F2>" ]
+run = 'shell -- dragon -i -T %s'
+desc = "Drag and drop (dragon)"
+
+[[mgr.prepend_keymap]]
+on = "y"
+run = [ 'shell -- for path in %s; do echo "file://$path"; done | wl-copy -t text/uri-list', "yank" ]
+desc = "Copy file URIs to clipboard"
diff --git a/.config/yazi/yazi.toml b/.config/yazi/yazi.toml
new file mode 100644
index 0000000..7f1fde1
--- /dev/null
+++ b/.config/yazi/yazi.toml
@@ -0,0 +1,2 @@
+[mgr]
+show_hidden = true