Compare commits

...

37 Commits

Author SHA1 Message Date
f7620ab2c7 feat(mako): improves notifications 2026-05-04 20:14:54 -04:00
bd25cc4efc feat(mako): notifications now on bottom and colorful 2026-05-04 19:41:29 -04:00
a2abffad09 fix(hyprland): remove second monitor 2026-05-04 19:39:06 -04:00
92c5eb2d18 feat: add some lsp for markdown 2026-05-04 19:37:59 -04:00
ec8f9cf14d feat: improve alacritty readability 2026-05-04 19:27:21 -04:00
63dccc0025 feat: add resize-pane to tmux.conf 2026-04-29 14:38:00 -04:00
ffe45b43c5 feat: add printer cups in bar 2026-04-03 15:34:26 -04:00
1ebcd3ae46 feat: made split equally same a nvim 2026-04-03 01:38:05 -04:00
1d7835bf4c feat: tighter modules icons 2026-04-02 23:54:29 -04:00
13e0add1c2 feat: simplified workspaces 2026-04-02 21:30:41 -04:00
b783b25d32 feat: perfect waybar 2026-04-02 20:58:03 -04:00
373c9fe4aa feat: more like omarchy 2026-04-02 17:40:53 -04:00
10c5d8f9b3 feat: more like omarchy 2026-04-02 16:38:08 -04:00
ffd1dd19bb feat(waybar): improving styling 2026-03-31 21:07:49 -04:00
f9a20c0717 bug: fix waybar after merge 2026-03-31 19:00:14 -04:00
332ed27869 Merge branch 'main' of sobina-git:jbourdon/dotfiles 2026-03-31 18:58:48 -04:00
3762c33a8d feat: shared hyprpaper 2026-03-31 18:55:17 -04:00
9854dc9ea4 feat: now smarter linebreak 2026-03-25 01:00:56 -04:00
054730ba26 fix(waybar/hyprland): made all margins the same 2026-03-24 00:30:34 -04:00
d5cc0a1de1 fix(tmux): make selection the same as in bash and nvim 2026-03-24 00:21:47 -04:00
8e31d1bb5a fix(alacritty): decrease font to a more common standard 2026-03-24 00:18:08 -04:00
10de18f327 fix(hyprland): increase margin to match new waybar 2026-03-24 00:17:03 -04:00
231f72704c fix(bash/zsh): different color for folder and configs files 2026-03-24 00:15:56 -04:00
19e76149a0 feat(tmux): styling complete 2026-03-23 22:51:16 -04:00
a88508e5f9 fix(waybar): was using wrong format for minutes 2026-03-23 20:40:43 -04:00
641d06a8d5 feat(waybar): increase the power button size to match the bar appearance 2026-03-23 15:10:51 -04:00
7c7b0dbb47 feat(waybar): add battery module and styles 2026-03-23 14:25:53 -04:00
1f7ed68ce7 fix: vertical waybar alignment 2026-03-23 14:03:39 -04:00
aac9378d71 feat: ls_colors using palette 2026-03-23 03:27:13 -04:00
6bc4e3e870 fix: use wofi instead of walker 2026-03-23 02:18:07 -04:00
b6d7d77191 fix: center date on waybar, remove unused launcher icon 2026-03-23 02:17:03 -04:00
d8880a303e fix: selection in tmux.conf 2026-03-23 01:51:50 -04:00
2eabf8290a fix: colors and waybar 2026-03-22 12:46:37 -04:00
445e3b78d2 migrate alacrity 2026-03-22 11:52:18 -04:00
73e2ea9e9a feat: all new colors 2026-03-22 04:01:03 -04:00
2082904cd1 Remove generated Python cache from palette repo 2026-03-21 22:50:13 -04:00
fc69fc8cd9 Unify desktop theming around Rider palette 2026-03-21 22:50:13 -04:00
34 changed files with 2012 additions and 221 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.codex

View File

@@ -1,40 +1,27 @@
[font]
size = 16
size = 13
[font.offset]
y = 0
x = 0
[font.normal]
family = "JetBrainsMono Nerd Font"
family = "ComicShannsMono Nerd Font"
style = "Regular"
[font.bold]
family = "JetBrainsMono Nerd Font"
style = "Bold"
[font.italic]
family = "JetBrainsMono Nerd Font"
style = "Italic"
[font.bold_italic]
family = "JetBrainsMono Nerd Font"
style = "Bold Italic"
[window]
opacity = 0.95
padding = { x = 5, y = 5 }
[colors.primary]
background = "#1a1b26"
foreground = "#c0caf5"
[colors.normal]
black = "#1e1e2e"
red = "#f38ba8"
green = "#a6e3a1"
yellow = "#f9e2af"
blue = "#61afef"
magenta = "#f5c2e7"
cyan = "#94e2d5"
white = "#cdd6f4"
[colors.cursor]
text = "CellBackground"
cursor = "CellForeground"
[general]
import = ["~/.config/rider-palette/alacritty.toml"]

View File

@@ -1,4 +1,4 @@
#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
stow -t ~ zsh tmux nvim hypr waybar alacritty
stow -t ~ bash zsh tmux nvim hypr waybar mako alacritty rider-palette walker

119
bash/.bashrc Normal file
View File

@@ -0,0 +1,119 @@
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
export PATH="$HOME/.cargo/bin:$PATH"
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth
# append to the history file, don't overwrite it
shopt -s histappend
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize
# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar
# make less more friendly for non-text input files, see lesspipe(1)
#[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac
# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes
if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# We have color support; assume it's compliant with Ecma-48
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fi
fi
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'
#alias grep='grep --color=auto'
#alias fgrep='fgrep --color=auto'
#alias egrep='egrep --color=auto'
fi
# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
# some more ls aliases
#alias ll='ls -l'
#alias la='ls -A'
#alias l='ls -CF'
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
# Shared Rider palette prompt
if [ -r ~/.config/rider-palette/bash-prompt.sh ]; then
. ~/.config/rider-palette/bash-prompt.sh
fi

View File

@@ -4,7 +4,7 @@ set -euo pipefail
# ====== CONFIG ======
DOTFILES_DIR="${DOTFILES_DIR:-$HOME/repos/dotfiles}"
DOTFILES_GIT_URL="${DOTFILES_GIT_URL:-}" # ex: git@github.com:TON_USER/dotfiles.git
STOW_PACKAGES_DEFAULT=("zsh" "tmux" "nvim" "hypr" "hypridle" "waybar" "alacritty")
STOW_PACKAGES_DEFAULT=("zsh" "tmux" "nvim" "hypr" "waybar" "mako" "alacritty")
INSTALL_FONTS="${INSTALL_FONTS:-1}" # 1 = install nerd font, 0 = skip
SET_DEFAULT_SHELL="${SET_DEFAULT_SHELL:-1}" # 1 = chsh to zsh, 0 = skip
@@ -61,7 +61,7 @@ sudo_run apt install -y build-essential || true
# Hypr ecosystem (availability depends on distro/repo)
# We try, but do not fail if packages aren't found.
log "Trying to install Hyprland ecosystem packages (best effort)"
sudo_run apt install -y hyprland hypridle waybar alacritty 2>/dev/null || true
sudo_run apt install -y hyprland hyprpaper hypridle waybar mako-notifier alacritty 2>/dev/null || true
# ====== DOTFILES CLONE (OPTIONAL) ======
if [ ! -d "$DOTFILES_DIR/.git" ]; then

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

View File

@@ -25,7 +25,7 @@
# See https://wiki.hyprland.org/Configuring/Monitors/
monitor=DP-1,3440x1440@165, 0x0,1
monitor=DP-3,1920x1080@60, 3440x1200,1
###################
### MY PROGRAMS ###
###################
@@ -73,8 +73,8 @@ env = QT_QPA_PLATFORMTHEME,qt5ct
# https://wiki.hyprland.org/Configuring/Variables/#general
general {
gaps_in = 2
gaps_out = 4
gaps_in = 4
gaps_out = 8
border_size = 1
# https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors
@@ -88,11 +88,18 @@ general {
allow_tearing = false
layout = dwindle
# layout = master
}
master {
new_status = inherit
mfact = 0.33
orientation = center
}
# https://wiki.hyprland.org/Configuring/Variables/#decoration
decoration {
rounding = 3
rounding = 0
inactive_opacity = 1.00
active_opacity = 1.00
fullscreen_opacity = 1.00
@@ -131,8 +138,8 @@ animations {
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
dwindle {
pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
preserve_split = true # You probably want this
pseudotile = false # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
preserve_split = false # You probably want this
}
# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
@@ -172,11 +179,6 @@ cursor {
inactive_timeout = 1
}
# https://wiki.hyprland.org/Configuring/Variables/#gestures
# gestures {
# workspace_swipe = false
#}
####################
### KEYBINDINGSS ###
####################
@@ -187,7 +189,7 @@ $mainMod = SUPER # Sets "Windows" key as main modifier
# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
bind = $mainMod, Z, exec, $terminal
bind = $mainMod, C, killactive,
bind = $mainMod, M, exit,
# bind = $mainMod, M, exit,
bind = $mainMod, E, exec, $fileManager bind = $mainMod, N, exec, $navigator
bind = $mainMod, V, togglefloating
bind = $mainMod, F, fullscreen
@@ -197,16 +199,30 @@ bind = $mainMod, S, togglesplit, # dwindle
bind = $mainMod, Q, exec, hyprlock
bind = $mainMod, Y, exec, ~/scripts/screenshot-to-clipboard.sh
# Switch to layouts
bind = $mainMod, M, exec, ~/scripts/toggle_layout.sh
bind = $mainMod, Return, layoutmsg, swapwithmaster
bind = $mainMod, B, layoutmsg, mfact +0.05
bind = $mainMod, N, layoutmsg, mfact -0.05
# Move focus with mainMod + arrow keys
bind = $mainMod, H, movefocus, l
bind = $mainMod, J, movefocus, d
bind = $mainMod, K, movefocus, u
bind = $mainMod, L, movefocus, r
bind = $mainMod, left, movefocus, l
bind = $mainMod, down, movefocus, d
bind = $mainMod, up, movefocus, u
bind = $mainMod, right, movefocus, r
bind = $mainMod SHIFT, H, swapwindow, l
bind = $mainMod SHIFT, J, swapwindow, d
bind = $mainMod SHIFT, K, swapwindow, u
bind = $mainMod SHIFT, L, swapwindow, r
bind = $mainMod SHIFT, left, swapwindow, l
bind = $mainMod SHIFT, down, swapwindow, d
bind = $mainMod SHIFT, up, swapwindow, u
bind = $mainMod SHIFT, right, swapwindow, r
# Switch workspaces with mainMod + [0-9]
bind = $mainMod, 1, workspace, 1
@@ -239,16 +255,3 @@ bind = $mainMod, mouse_up, workspace, e-1
# Move/resize windows with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
##############################
### WINDOWS AND WORKSPACES ###
##############################
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules
# Example windowrule v1
# windowrule = float, ^(kitty)$
# Example windowrule v2
# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$

View File

@@ -1,7 +1,7 @@
source = $HOME/.config/hypr/mocha.conf
source = ~/.config/rider-palette/palette.hyprland.conf
$accent = $mauve
$accentAlpha = $mauveAlpha
$accent = $func
$accentAlpha = $funcAlpha
$font = JetBrainsMono Nerd Font
# GENERAL
@@ -14,14 +14,14 @@ background {
monitor =
path = $HOME/.config/hypr/hyprlock-background.png
blur_passes = 0
color = $base
color = $bg
}
# LAYOUT
label {
monitor =
text = Layout: $LAYOUT
color = $text
color = $fg_bright
font_size = 25
font_family = $font
position = 30, -30
@@ -33,7 +33,7 @@ label {
label {
monitor =
text = $TIME
color = $text
color = $fg_bright
font_size = 90
font_family = $font
position = -30, 0
@@ -45,7 +45,7 @@ label {
label {
monitor =
text = cmd[update:43200000] date +"%A, %d %B %Y"
color = $text
color = $fg_bright
font_size = 25
font_family = $font
position = -30, -150
@@ -57,7 +57,7 @@ label {
{
monitor = "";
text = "$FPRINTPROMPT";
color = "$text";
color = "$fg_bright";
font_size = 14;
font_family = font;
position = "0, -107";
@@ -85,15 +85,15 @@ input-field {
dots_spacing = 0.2
dots_center = true
outer_color = $accent
inner_color = $surface0
font_color = $text
inner_color = $cursor_line
font_color = $fg_bright
fade_on_empty = false
placeholder_text = <span foreground="##$textAlpha"><i>󰌾 Logged in as </i><span foreground="##$accentAlpha">$USER</span></span>
placeholder_text = <span foreground="##$fgBrightAlpha"><i>󰌾 Logged in as </i><span foreground="##$accentAlpha">$USER</span></span>
hide_input = false
check_color = $accent
fail_color = $red
fail_color = $error
fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i>
capslock_color = $yellow
capslock_color = $string
position = 0, -47
halign = center
valign = center

View File

@@ -1,14 +1,13 @@
preload = ~/Pictures/background.png
preload = ~/repos/dotfiles/hypr/.config/hypr/assets/background.png
splash = false
#set the default wallpaper(s) seen on initial workspace(s) --depending on the number of monitors used
wallpaper = DP-1,~/Pictures/background.png
wallpaper = DP-2,~/Pictures/background.png
wallpaper = DP-3,~/Pictures/background.png
wallpaper {
monitor =
path = ~/repos/dotfiles/hypr/.config/hypr/assets/background.png
}
#enable splash text rendering over the wallpaper
#splash = true
#fully disable ipc
# ipc = off

30
mako/.config/mako/config Normal file
View File

@@ -0,0 +1,30 @@
font=JetBrainsMono Nerd Font 12
background-color=#191A1C
text-color=#BDBDBD
border-color=#39CC9B
progress-color=over #39CC9B
width=420
height=160
outer-margin=16
margin=12
padding=14
border-size=1
border-radius=7
icons=1
max-icon-size=48
markup=1
actions=1
max-visible=5
max-history=50
default-timeout=8000
ignore-timeout=0
anchor=bottom-right
layer=overlay
sort=-time
[urgency=high]
border-color=#FF5647
default-timeout=0
[mode=do-not-disturb]
invisible=1

View File

@@ -100,6 +100,10 @@ vim.g.have_nerd_font = true
-- Make line numbers default
vim.o.number = true
vim.o.wrap = true
vim.o.linebreak = true
vim.o.breakindent = true
-- You can also add relative line numbers, to help with jumping.
-- Experiment for yourself to see if you like it!
vim.o.relativenumber = true
@@ -172,6 +176,12 @@ vim.o.scrolloff = 10
-- See `:help 'confirm'`
vim.o.confirm = true
-- Folding via treesitter
vim.o.foldmethod = 'expr'
vim.o.foldexpr = 'v:lua.vim.treesitter.foldexpr()'
vim.o.foldlevel = 99
vim.o.foldlevelstart = 99
-- [[ Basic Keymaps ]]
-- See `:help vim.keymap.set()`
@@ -216,6 +226,18 @@ vim.keymap.set('n', '<C-k>', '<C-w><C-k>', { desc = 'Move focus to the upper win
-- [[ Basic Autocommands ]]
-- See `:help lua-guide-autocommands`
vim.opt.autoread = true
vim.opt.updatetime = 200
vim.api.nvim_create_autocmd({ 'FocusGained', 'BufEnter', 'CursorHold', 'CursorHoldI' }, {
command = 'checktime',
})
vim.api.nvim_create_autocmd('FileChangedShellPost', {
callback = function()
vim.notify 'File changed on disk. Buffer reloaded.'
end,
})
-- Highlight when yanking (copying) text
-- Try it with `yap` in normal mode
@@ -491,7 +513,15 @@ require('lazy').setup({
-- Automatically install LSPs and related tools to stdpath for Neovim
-- Mason must be loaded before its dependents so we need to set it up here.
-- NOTE: `opts = {}` is the same as calling `require('mason').setup({})`
{ 'mason-org/mason.nvim', opts = {} },
{
'mason-org/mason.nvim',
opts = {
registries = {
'github:mason-org/mason-registry',
'github:Crashdummyy/mason-registry',
},
},
},
'mason-org/mason-lspconfig.nvim',
'WhoIsSethDaniel/mason-tool-installer.nvim',
@@ -693,6 +723,10 @@ require('lazy').setup({
-- ts_ls = {},
--
marksman = {},
dockerls = {},
docker_compose_language_service = {},
lua_ls = {
-- cmd = { ... },
-- filetypes = { ... },
@@ -724,6 +758,8 @@ require('lazy').setup({
-- for you, so that they are available from within Neovim.
local ensure_installed = vim.tbl_keys(servers or {})
vim.list_extend(ensure_installed, {
'hadolint', -- Used to lint Dockerfiles
'markdownlint', -- Used to lint Markdown files
'stylua', -- Used to format Lua code
})
require('mason-tool-installer').setup { ensure_installed = ensure_installed }
@@ -895,8 +931,12 @@ require('lazy').setup({
'folke/tokyonight.nvim',
priority = 1000, -- Make sure to load this before all the other start plugins.
config = function()
local rider_black = require 'custom.rider_black'
---@diagnostic disable-next-line: missing-fields
require('tokyonight').setup {
on_colors = rider_black.on_colors,
on_highlights = rider_black.on_highlights,
styles = {
comments = { italic = false }, -- Disable italics in comments
},
@@ -955,7 +995,7 @@ require('lazy').setup({
main = 'nvim-treesitter', -- Current releases expose `setup()` from the top-level module
-- [[ Configure Treesitter ]] See `:help nvim-treesitter`
opts = {
ensure_installed = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' },
ensure_installed = { 'bash', 'c', 'c_sharp', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' },
-- Autoinstall languages that are not installed
auto_install = true,
highlight = {
@@ -991,6 +1031,12 @@ require('lazy').setup({
require 'kickstart.plugins.neo-tree',
require 'kickstart.plugins.gitsigns', -- adds gitsigns recommend keymaps
{ -- C# / .NET LSP via Roslyn
'seblyng/roslyn.nvim',
ft = 'cs',
opts = {},
},
-- NOTE: The import below can automatically add your own plugins, configuration, etc from `lua/custom/plugins/*.lua`
-- This is the easiest way to modularize your config.
--

View File

@@ -0,0 +1,278 @@
local M = {}
local fallback_palette = {
bg = '#191A1C',
gutter = '#191A1C',
cursor_line = '#202424',
selection = '#08335E',
border = '#404040',
fg = '#BDBDBD',
fg_bright = '#F0F0F0',
fg_gutter = '#808080',
comment = '#85C46C',
keyword = '#6C95EB',
type = '#C191FF',
type_alt = '#E1BFFF',
func = '#39CC9B',
field = '#66C3CC',
string = '#C9A26D',
number = '#ED94C0',
escape = '#D688D4',
error = '#FF5647',
}
local function load_palette()
local palette_file = vim.fn.expand '~/.config/rider-palette/palette.json'
if vim.fn.filereadable(palette_file) == 0 then
return fallback_palette
end
local ok, data = pcall(vim.json.decode, table.concat(vim.fn.readfile(palette_file), '\n'))
if not ok or type(data) ~= 'table' or type(data.colors) ~= 'table' then
return fallback_palette
end
return vim.tbl_extend('force', fallback_palette, data.colors)
end
local palette = load_palette()
M.palette = palette
function M.on_colors(colors)
colors.bg = palette.bg
colors.bg_dark = palette.bg
colors.bg_float = palette.bg
colors.bg_popup = palette.bg
colors.bg_sidebar = palette.bg
colors.bg_statusline = palette.bg
colors.bg_highlight = palette.cursor_line
colors.bg_search = palette.selection
colors.bg_visual = palette.selection
colors.border = palette.border
colors.fg = palette.fg
colors.fg_dark = palette.fg_gutter
colors.fg_float = palette.fg
colors.fg_gutter = palette.fg_gutter
colors.comment = palette.comment
colors.blue = palette.keyword
colors.cyan = palette.field
colors.green = palette.func
colors.magenta = palette.type
colors.orange = palette.string
colors.purple = palette.type
colors.red = palette.error
colors.teal = palette.func
colors.yellow = palette.string
colors.terminal_black = palette.bg
end
local function set_many(hl, groups, spec)
for _, group in ipairs(groups) do
hl[group] = spec
end
end
function M.on_highlights(hl)
set_many(hl, {
'Normal',
'NormalNC',
'SignColumn',
'FoldColumn',
}, { fg = palette.fg, bg = palette.bg })
hl.EndOfBuffer = { fg = palette.bg, bg = palette.bg }
hl.NormalFloat = { fg = palette.fg, bg = palette.bg }
hl.FloatBorder = { fg = palette.border, bg = palette.bg }
hl.CursorLine = { bg = palette.cursor_line }
hl.CursorLineNr = { fg = palette.fg_bright, bg = palette.cursor_line, bold = true }
hl.LineNr = { fg = palette.fg_gutter, bg = palette.gutter }
hl.Folded = { fg = palette.fg_gutter, bg = palette.bg }
hl.FoldColumn = { fg = palette.fg_gutter, bg = palette.bg }
hl.ColorColumn = { bg = palette.cursor_line }
hl.Visual = { bg = palette.selection }
hl.Search = { bg = palette.selection, fg = palette.fg_bright }
hl.IncSearch = { bg = palette.keyword, fg = palette.bg }
hl.Pmenu = { fg = palette.fg, bg = palette.bg }
hl.PmenuSel = { fg = palette.fg_bright, bg = palette.cursor_line }
hl.WinSeparator = { fg = palette.border }
set_many(hl, {
'Comment',
'@comment',
'@comment.documentation',
'@comment.todo',
'@comment.note',
'@comment.warning',
}, { fg = palette.comment, italic = false })
set_many(hl, {
'Keyword',
'Conditional',
'Repeat',
'Exception',
'Include',
'PreProc',
'@keyword',
'@keyword.function',
'@keyword.return',
'@keyword.repeat',
'@keyword.conditional',
'@keyword.exception',
'@keyword.import',
'@keyword.directive',
'@keyword.operator',
'@conditional',
'@repeat',
'@exception',
'@include',
'@module',
'@namespace',
}, { fg = palette.keyword })
set_many(hl, {
'Type',
'StorageClass',
'Structure',
'Typedef',
'@type',
'@type.builtin',
'@type.definition',
'@type.qualifier',
'@module',
'@namespace',
'@attribute',
'@tag.attribute',
'@lsp.type.type',
'@lsp.type.class',
'@lsp.type.interface',
'@lsp.type.namespace',
'@lsp.type.typeParameter',
}, { fg = palette.type })
set_many(hl, {
'@constructor',
'@lsp.type.enum',
'@lsp.type.struct',
}, { fg = palette.type_alt })
set_many(hl, {
'Function',
'@function',
'@function.call',
'@function.method',
'@function.method.call',
'@method',
'@constructor.lua',
'@lsp.type.function',
'@lsp.type.method',
}, { fg = palette.func })
set_many(hl, {
'Identifier',
'@variable',
'@variable.member',
'@lsp.type.variable',
}, { fg = palette.fg_bright })
set_many(hl, {
'Constant',
'@constant',
'@field',
'@property',
'@lsp.type.property',
'@lsp.type.enumMember',
}, { fg = palette.field })
set_many(hl, {
'String',
'Character',
'@string',
'@string.documentation',
'@string.regex',
'@string.special.url',
'@lsp.type.string',
}, { fg = palette.string })
set_many(hl, {
'SpecialChar',
'@string.escape',
'@string.special',
}, { fg = palette.escape })
set_many(hl, {
'Number',
'Float',
'@number',
'@number.float',
'@lsp.type.number',
}, { fg = palette.number })
set_many(hl, {
'Boolean',
'@boolean',
'@constant.builtin.boolean',
}, { fg = palette.keyword })
set_many(hl, {
'@parameter',
'@lsp.type.parameter',
}, { fg = palette.fg_bright })
set_many(hl, {
'@variable.builtin',
'@constant.builtin',
'@function.builtin',
}, { fg = palette.fg_bright })
set_many(hl, {
'@lsp.typemod.function.defaultLibrary',
'@lsp.typemod.function.defaultLibrary.cs',
'@lsp.typemod.method.defaultLibrary',
'@lsp.typemod.method.defaultLibrary.cs',
'@lsp.type.extensionMethod',
'@lsp.type.extensionMethod.cs',
'@lsp.typemod.extensionMethod.defaultLibrary',
'@lsp.typemod.extensionMethod.defaultLibrary.cs',
}, { fg = palette.func })
set_many(hl, {
'@lsp.typemod.class.defaultLibrary',
'@lsp.typemod.class.defaultLibrary.cs',
'@lsp.typemod.interface.defaultLibrary',
'@lsp.typemod.interface.defaultLibrary.cs',
'@lsp.typemod.enum.defaultLibrary',
'@lsp.typemod.enum.defaultLibrary.cs',
'@lsp.typemod.type.defaultLibrary',
'@lsp.typemod.type.defaultLibrary.cs',
'@lsp.typemod.typeParameter.defaultLibrary',
'@lsp.typemod.typeParameter.defaultLibrary.cs',
'@lsp.typemod.namespace.defaultLibrary',
'@lsp.typemod.namespace.defaultLibrary.cs',
}, { fg = palette.type })
set_many(hl, {
'@lsp.typemod.struct.defaultLibrary',
'@lsp.typemod.struct.defaultLibrary.cs',
}, { fg = palette.type_alt })
set_many(hl, {
'@lsp.typemod.property.defaultLibrary',
'@lsp.typemod.property.defaultLibrary.cs',
'@lsp.typemod.variable.defaultLibrary',
'@lsp.typemod.variable.defaultLibrary.cs',
'@lsp.typemod.enumMember.defaultLibrary',
'@lsp.typemod.enumMember.defaultLibrary.cs',
}, { fg = palette.field })
set_many(hl, {
'Operator',
'Delimiter',
'@operator',
'@punctuation.delimiter',
'@punctuation.bracket',
'@punctuation.special',
}, { fg = palette.fg })
end
return M

View File

@@ -0,0 +1 @@
__pycache__/

View File

@@ -0,0 +1,23 @@
# Rider Palette Reuse
`palette.json` is the single source of truth for your shared Rider palette.
Regenerate all derived files with:
```bash
python3 ~/.config/rider-palette/generate.py
```
Generated outputs:
- `palette.sh`: shell env vars plus shared `LS_COLORS` for prompts and scripts
- `palette.css`: CSS variables for Waybar and Wofi
- `palette.hyprland.conf`: Hyprlang variables for Hyprland and Hyprlock
- `palette.rasi`: Rasi variables for Rofi
- `tmux.conf`: tmux status and pane colors
- `alacritty.toml`: Alacritty color theme
- `bash-prompt.sh`: bash prompt using the shared palette
- `p10k.zsh`: Powerlevel10k overrides using the shared palette
This package is meant to be stowed from the dotfiles repo so that
`~/.config/rider-palette/*` becomes available to the rest of the system.

View File

@@ -0,0 +1,73 @@
# Generated from palette.json by generate.py. Do not edit directly.
[colors.primary]
background = "#191A1C"
foreground = "#BDBDBD"
dim_foreground = "#808080"
bright_foreground = "#F0F0F0"
[colors.cursor]
text = "#191A1C"
cursor = "#F0F0F0"
[colors.vi_mode_cursor]
text = "#191A1C"
cursor = "#6C95EB"
[colors.selection]
text = "#F0F0F0"
background = "#08335E"
[colors.search.matches]
foreground = "#F0F0F0"
background = "#404040"
[colors.search.focused_match]
foreground = "#191A1C"
background = "#39CC9B"
[colors.hints.start]
foreground = "#191A1C"
background = "#C9A26D"
[colors.hints.end]
foreground = "#F0F0F0"
background = "#202424"
[colors.line_indicator]
foreground = "None"
background = "None"
[colors.footer_bar]
foreground = "#F0F0F0"
background = "#191A1C"
[colors.normal]
black = "#191A1C"
red = "#FF5647"
green = "#39CC9B"
yellow = "#C9A26D"
blue = "#6C95EB"
magenta = "#C191FF"
cyan = "#66C3CC"
white = "#BDBDBD"
[colors.bright]
black = "#404040"
red = "#FF5647"
green = "#85C46C"
yellow = "#C9A26D"
blue = "#6C95EB"
magenta = "#E1BFFF"
cyan = "#66C3CC"
white = "#F0F0F0"
[colors.dim]
black = "#202424"
red = "#FF5647"
green = "#85C46C"
yellow = "#C9A26D"
blue = "#6C95EB"
magenta = "#C191FF"
cyan = "#66C3CC"
white = "#808080"

View File

@@ -0,0 +1,32 @@
# Generated from palette.json by generate.py. Do not edit directly.
# Rider-colored bash prompt using the shared palette.
# shellcheck shell=bash
if [ -r "$HOME/.config/rider-palette/palette.sh" ]; then
. "$HOME/.config/rider-palette/palette.sh"
fi
rider_fg() {
local hex="${1#\#}"
printf '\[\033[38;2;%d;%d;%dm\]' "$((16#${hex:0:2}))" "$((16#${hex:2:2}))" "$((16#${hex:4:2}))"
}
RIDER_RESET='\[\033[0m\]'
__rider_git_branch() {
command -v git >/dev/null 2>&1 || return 0
git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0
local branch
branch="$(git symbolic-ref --quiet --short HEAD 2>/dev/null || git rev-parse --short HEAD 2>/dev/null)" || return 0
[ -n "$branch" ] || return 0
printf ' %sgit:%s%s' "$(rider_fg "$RIDER_FUNC")" "$branch" "$RIDER_RESET"
}
__rider_set_bash_prompt() {
PS1="${debian_chroot:+($debian_chroot)}$(rider_fg "$RIDER_FG_BRIGHT")\u@\h${RIDER_RESET}$(rider_fg "$RIDER_BORDER"):$(rider_fg "$RIDER_KEYWORD")\w${RIDER_RESET}$(__rider_git_branch)$(rider_fg "$RIDER_BORDER") \\$ ${RIDER_RESET}"
}
PROMPT_COMMAND=__rider_set_bash_prompt

View File

@@ -0,0 +1,406 @@
#!/usr/bin/env python3
from __future__ import annotations
import json
from pathlib import Path
from textwrap import dedent
ROOT = Path(__file__).resolve().parent
PALETTE_FILE = ROOT / "palette.json"
def load_palette() -> dict[str, str]:
data = json.loads(PALETTE_FILE.read_text())
return data["colors"]
def hex_no_hash(value: str) -> str:
return value.lstrip("#")
def hex_to_rgb(value: str) -> tuple[int, int, int]:
value = hex_no_hash(value)
return tuple(int(value[index:index + 2], 16) for index in (0, 2, 4))
def camel_from_snake(name: str) -> str:
head, *tail = name.split("_")
return head + "".join(part.capitalize() for part in tail)
def write(path: Path, content: str) -> None:
path.write_text(content.rstrip() + "\n")
def sgr_fg(value: str, *, bold: bool = False) -> str:
red, green, blue = hex_to_rgb(value)
parts = []
if bold:
parts.append("1")
parts.append(f"38;2;{red};{green};{blue}")
return ";".join(parts)
def build_ls_colors(colors: dict[str, str]) -> str:
entries = {
"no": "0",
"fi": "0",
"di": sgr_fg(colors["keyword"], bold=True),
"ln": sgr_fg(colors["field"], bold=True),
"or": sgr_fg(colors["error"]),
"mi": "0",
"so": sgr_fg(colors["field"]),
"pi": sgr_fg(colors["string"]),
"do": sgr_fg(colors["func"], bold=True),
"bd": sgr_fg(colors["number"]),
"cd": sgr_fg(colors["number"]),
"su": sgr_fg(colors["error"], bold=True),
"sg": sgr_fg(colors["escape"], bold=True),
"ex": sgr_fg(colors["func"], bold=True),
"*.tar": sgr_fg(colors["type_alt"]),
"*.tgz": sgr_fg(colors["type_alt"]),
"*.gz": sgr_fg(colors["type_alt"]),
"*.bz2": sgr_fg(colors["type_alt"]),
"*.xz": sgr_fg(colors["type_alt"]),
"*.zip": sgr_fg(colors["type_alt"]),
"*.7z": sgr_fg(colors["type_alt"]),
"*.zst": sgr_fg(colors["type_alt"]),
"*.rar": sgr_fg(colors["type_alt"]),
"*.jpg": sgr_fg(colors["type"]),
"*.jpeg": sgr_fg(colors["type"]),
"*.png": sgr_fg(colors["type"]),
"*.gif": sgr_fg(colors["type"]),
"*.svg": sgr_fg(colors["type"]),
"*.webp": sgr_fg(colors["type"]),
"*.mp3": sgr_fg(colors["type"]),
"*.flac": sgr_fg(colors["type"]),
"*.wav": sgr_fg(colors["type"]),
"*.mp4": sgr_fg(colors["type"]),
"*.mkv": sgr_fg(colors["type"]),
"*.mov": sgr_fg(colors["type"]),
"*.pdf": sgr_fg(colors["comment"]),
"*.md": sgr_fg(colors["comment"]),
"*.txt": sgr_fg(colors["comment"]),
"*.log": sgr_fg(colors["comment"]),
"*.conf": sgr_fg(colors["string"]),
"*.json": sgr_fg(colors["string"]),
"*.yaml": sgr_fg(colors["string"]),
"*.yml": sgr_fg(colors["string"]),
"*.toml": sgr_fg(colors["string"]),
"*.ini": sgr_fg(colors["string"]),
"*.sh": sgr_fg(colors["func"]),
"*.bash": sgr_fg(colors["func"]),
"*.zsh": sgr_fg(colors["func"]),
"*.py": sgr_fg(colors["field"]),
"*.js": sgr_fg(colors["field"]),
"*.ts": sgr_fg(colors["field"]),
"*.tsx": sgr_fg(colors["field"]),
"*.jsx": sgr_fg(colors["field"]),
"*.lua": sgr_fg(colors["field"]),
"*.rs": sgr_fg(colors["field"]),
"*.go": sgr_fg(colors["field"]),
"*.c": sgr_fg(colors["field"]),
"*.h": sgr_fg(colors["field"]),
"*.cpp": sgr_fg(colors["field"]),
"*.hpp": sgr_fg(colors["field"]),
"*.cs": sgr_fg(colors["field"]),
}
return ":".join(f"{key}={value}" for key, value in entries.items())
def render_palette_sh(colors: dict[str, str]) -> str:
lines = [
"# Generated from palette.json by generate.py. Do not edit directly.",
"",
]
for name, value in colors.items():
lines.append(f'export RIDER_{name.upper()}="{value}"')
lines.append("")
lines.append("# Shared Rider palette for GNU ls and compatible tools.")
lines.append(f'export LS_COLORS="{build_ls_colors(colors)}"')
return "\n".join(lines)
def render_palette_css(colors: dict[str, str]) -> str:
lines = [
"/* Generated from palette.json by generate.py. Do not edit directly. */",
]
for name, value in colors.items():
lines.append(f"@define-color rider-{name.replace('_', '-')} {value};")
return "\n".join(lines)
def render_palette_hypr(colors: dict[str, str]) -> str:
lines = [
"# Generated from palette.json by generate.py. Do not edit directly.",
"# Usage:",
"# source = ~/.config/rider-palette/palette.hyprland.conf",
"",
]
for name, value in colors.items():
lines.append(f"${name} = rgb({hex_no_hash(value)})")
lines.append(f"${camel_from_snake(name)}Alpha = {hex_no_hash(value)}")
return "\n".join(lines)
def render_palette_rasi(colors: dict[str, str]) -> str:
lines = [
"/* Generated from palette.json by generate.py. Do not edit directly. */",
"* {",
]
for name, value in colors.items():
lines.append(f" rider-{name.replace('_', '-')}: {value};")
lines.append("}")
return "\n".join(lines)
def render_tmux_conf(colors: dict[str, str]) -> str:
return dedent(
f"""
# Generated from palette.json by generate.py. Do not edit directly.
# Source this near the end of ~/.tmux.conf.
set -g status-style "bg={colors['bg']},fg={colors['fg_bright']}"
set -g status-left-style "bg={colors['bg']},fg={colors['fg_bright']}"
set -g status-right-style "bg={colors['bg']},fg={colors['fg_bright']}"
set -g status-left-length 48
set -g status-right-length 80
set -g status-justify centre
set -g window-status-separator " "
set -g status-left "#[fg={colors['bg']},bg={colors['func']},bold] #S #[fg={colors['func']},bg={colors['bg']}]"
set -g status-right "#[fg={colors['field']},bg={colors['bg']}]#[fg={colors['bg']},bg={colors['field']}] %Y-%m-%d #[fg={colors['string']},bg={colors['field']}]#[fg={colors['bg']},bg={colors['string']}] %H:%M#[fg={colors['string']},bg={colors['bg']}]"
set -g message-style "bg={colors['cursor_line']},fg={colors['fg_bright']}"
set -g message-command-style "bg={colors['cursor_line']},fg={colors['fg_bright']}"
set -g mode-style "bg={colors['selection']},fg={colors['fg_bright']}"
set -g pane-border-style "fg={colors['border']}"
set -g pane-active-border-style "fg={colors['keyword']}"
set -g clock-mode-colour "{colors['keyword']}"
set -g window-status-style "bg={colors['bg']},fg={colors['fg_gutter']}"
set -g window-status-current-style "bg={colors['bg']},fg={colors['fg_bright']}"
set -g window-status-current-format "#[fg={colors['func']},bg={colors['bg']}]#[fg={colors['bg']},bg={colors['func']},bold] #I #[fg={colors['func']},bg={colors['border']}]#[fg={colors['fg_bright']},bg={colors['border']}] #W #[fg={colors['border']},bg={colors['bg']}]"
set -g window-status-format "#[fg={colors['cursor_line']},bg={colors['bg']}]#[fg={colors['fg_gutter']},bg={colors['cursor_line']}] #I #[fg={colors['cursor_line']},bg={colors['border']}]#[fg={colors['fg_bright']},bg={colors['border']}] #W #[fg={colors['border']},bg={colors['bg']}]"
"""
).strip()
def render_alacritty_toml(colors: dict[str, str]) -> str:
return dedent(
f"""
# Generated from palette.json by generate.py. Do not edit directly.
[colors.primary]
background = "{colors['bg']}"
foreground = "{colors['fg']}"
dim_foreground = "{colors['fg_gutter']}"
bright_foreground = "{colors['fg_bright']}"
[colors.cursor]
text = "{colors['bg']}"
cursor = "{colors['fg_bright']}"
[colors.vi_mode_cursor]
text = "{colors['bg']}"
cursor = "{colors['keyword']}"
[colors.selection]
text = "{colors['fg_bright']}"
background = "{colors['selection']}"
[colors.search.matches]
foreground = "{colors['fg_bright']}"
background = "{colors['border']}"
[colors.search.focused_match]
foreground = "{colors['bg']}"
background = "{colors['func']}"
[colors.hints.start]
foreground = "{colors['bg']}"
background = "{colors['string']}"
[colors.hints.end]
foreground = "{colors['fg_bright']}"
background = "{colors['cursor_line']}"
[colors.line_indicator]
foreground = "None"
background = "None"
[colors.footer_bar]
foreground = "{colors['fg_bright']}"
background = "{colors['bg']}"
[colors.normal]
black = "{colors['bg']}"
red = "{colors['error']}"
green = "{colors['func']}"
yellow = "{colors['string']}"
blue = "{colors['keyword']}"
magenta = "{colors['type']}"
cyan = "{colors['field']}"
white = "{colors['fg']}"
[colors.bright]
black = "{colors['border']}"
red = "{colors['error']}"
green = "{colors['comment']}"
yellow = "{colors['string']}"
blue = "{colors['keyword']}"
magenta = "{colors['type_alt']}"
cyan = "{colors['field']}"
white = "{colors['fg_bright']}"
[colors.dim]
black = "{colors['cursor_line']}"
red = "{colors['error']}"
green = "{colors['comment']}"
yellow = "{colors['string']}"
blue = "{colors['keyword']}"
magenta = "{colors['type']}"
cyan = "{colors['field']}"
white = "{colors['fg_gutter']}"
"""
).strip()
def render_bash_prompt() -> str:
return dedent(
"""
# Generated from palette.json by generate.py. Do not edit directly.
# Rider-colored bash prompt using the shared palette.
# shellcheck shell=bash
if [ -r "$HOME/.config/rider-palette/palette.sh" ]; then
. "$HOME/.config/rider-palette/palette.sh"
fi
rider_fg() {
local hex="${1#\\#}"
printf '\\[\\033[38;2;%d;%d;%dm\\]' "$((16#${hex:0:2}))" "$((16#${hex:2:2}))" "$((16#${hex:4:2}))"
}
RIDER_RESET='\\[\\033[0m\\]'
__rider_git_branch() {
command -v git >/dev/null 2>&1 || return 0
git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0
local branch
branch="$(git symbolic-ref --quiet --short HEAD 2>/dev/null || git rev-parse --short HEAD 2>/dev/null)" || return 0
[ -n "$branch" ] || return 0
printf ' %sgit:%s%s' "$(rider_fg "$RIDER_FUNC")" "$branch" "$RIDER_RESET"
}
__rider_set_bash_prompt() {
PS1="${debian_chroot:+($debian_chroot)}$(rider_fg "$RIDER_FG_BRIGHT")\\u@\\h${RIDER_RESET}$(rider_fg "$RIDER_BORDER"):$(rider_fg "$RIDER_KEYWORD")\\w${RIDER_RESET}$(__rider_git_branch)$(rider_fg "$RIDER_BORDER") \\\\$ ${RIDER_RESET}"
}
PROMPT_COMMAND=__rider_set_bash_prompt
"""
).strip()
def render_p10k_zsh() -> str:
return dedent(
"""
# Generated from palette.json by generate.py. Do not edit directly.
# Rider-colored Powerlevel10k overrides using the shared palette.
[[ -r "$HOME/.config/rider-palette/palette.sh" ]] && source "$HOME/.config/rider-palette/palette.sh"
typeset -g POWERLEVEL9K_BACKGROUND="$RIDER_BG"
typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX="%F{$RIDER_BORDER}╭─%f"
typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX="%F{$RIDER_BORDER}├─%f"
typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX="%F{$RIDER_BORDER}╰─%f"
typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX="%F{$RIDER_BORDER}─╮%f"
typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX="%F{$RIDER_BORDER}─┤%f"
typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX="%F{$RIDER_BORDER}─╯%f"
typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR="%F{$RIDER_BORDER}\\uE0B1%f"
typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR="%F{$RIDER_BORDER}\\uE0B3%f"
typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND="$RIDER_FG_BRIGHT"
typeset -g POWERLEVEL9K_DIR_FOREGROUND="$RIDER_KEYWORD"
typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND="$RIDER_TYPE"
typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND="$RIDER_FUNC"
typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_COLOR="$RIDER_FUNC"
typeset -g POWERLEVEL9K_VCS_LOADING_VISUAL_IDENTIFIER_COLOR="$RIDER_BORDER"
typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND="$RIDER_FUNC"
typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND="$RIDER_FIELD"
typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND="$RIDER_NUMBER"
typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND="$RIDER_FUNC"
typeset -g POWERLEVEL9K_STATUS_OK_PIPE_FOREGROUND="$RIDER_FUNC"
typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND="$RIDER_ERROR"
typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND="$RIDER_ERROR"
typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_FOREGROUND="$RIDER_ERROR"
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND="$RIDER_STRING"
typeset -g POWERLEVEL9K_TIME_FOREGROUND="$RIDER_FIELD"
typeset -g POWERLEVEL9K_DOTNET_VERSION_FOREGROUND="$RIDER_TYPE"
typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND="$RIDER_FG_BRIGHT"
"""
).strip()
def render_readme() -> str:
return dedent(
"""
# Rider Palette Reuse
`palette.json` is the single source of truth for your shared Rider palette.
Regenerate all derived files with:
```bash
python3 ~/.config/rider-palette/generate.py
```
Generated outputs:
- `palette.sh`: shell env vars plus shared `LS_COLORS` for prompts and scripts
- `palette.css`: CSS variables for Waybar and Wofi
- `palette.hyprland.conf`: Hyprlang variables for Hyprland and Hyprlock
- `palette.rasi`: Rasi variables for Rofi
- `tmux.conf`: tmux status and pane colors
- `alacritty.toml`: Alacritty color theme
- `bash-prompt.sh`: bash prompt using the shared palette
- `p10k.zsh`: Powerlevel10k overrides using the shared palette
This package is meant to be stowed from the dotfiles repo so that
`~/.config/rider-palette/*` becomes available to the rest of the system.
"""
).strip()
def main() -> None:
colors = load_palette()
outputs = {
ROOT / "palette.sh": render_palette_sh(colors),
ROOT / "palette.css": render_palette_css(colors),
ROOT / "palette.hyprland.conf": render_palette_hypr(colors),
ROOT / "palette.rasi": render_palette_rasi(colors),
ROOT / "tmux.conf": render_tmux_conf(colors),
ROOT / "alacritty.toml": render_alacritty_toml(colors),
ROOT / "bash-prompt.sh": render_bash_prompt(),
ROOT / "p10k.zsh": render_p10k_zsh(),
ROOT / "README.md": render_readme(),
}
for path, content in outputs.items():
write(path, content)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,39 @@
# Generated from palette.json by generate.py. Do not edit directly.
# Rider-colored Powerlevel10k overrides using the shared palette.
[[ -r "$HOME/.config/rider-palette/palette.sh" ]] && source "$HOME/.config/rider-palette/palette.sh"
typeset -g POWERLEVEL9K_BACKGROUND="$RIDER_BG"
typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX="%F{$RIDER_BORDER}╭─%f"
typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX="%F{$RIDER_BORDER}├─%f"
typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX="%F{$RIDER_BORDER}╰─%f"
typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX="%F{$RIDER_BORDER}─╮%f"
typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX="%F{$RIDER_BORDER}─┤%f"
typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX="%F{$RIDER_BORDER}─╯%f"
typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR="%F{$RIDER_BORDER}\uE0B1%f"
typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR="%F{$RIDER_BORDER}\uE0B3%f"
typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND="$RIDER_FG_BRIGHT"
typeset -g POWERLEVEL9K_DIR_FOREGROUND="$RIDER_KEYWORD"
typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND="$RIDER_TYPE"
typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND="$RIDER_FUNC"
typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_COLOR="$RIDER_FUNC"
typeset -g POWERLEVEL9K_VCS_LOADING_VISUAL_IDENTIFIER_COLOR="$RIDER_BORDER"
typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND="$RIDER_FUNC"
typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND="$RIDER_FIELD"
typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND="$RIDER_NUMBER"
typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND="$RIDER_FUNC"
typeset -g POWERLEVEL9K_STATUS_OK_PIPE_FOREGROUND="$RIDER_FUNC"
typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND="$RIDER_ERROR"
typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND="$RIDER_ERROR"
typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_FOREGROUND="$RIDER_ERROR"
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND="$RIDER_STRING"
typeset -g POWERLEVEL9K_TIME_FOREGROUND="$RIDER_FIELD"
typeset -g POWERLEVEL9K_DOTNET_VERSION_FOREGROUND="$RIDER_TYPE"
typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND="$RIDER_FG_BRIGHT"

View File

@@ -0,0 +1,19 @@
/* Generated from palette.json by generate.py. Do not edit directly. */
@define-color rider-bg #191A1C;
@define-color rider-gutter #191A1C;
@define-color rider-cursor-line #202424;
@define-color rider-selection #08335E;
@define-color rider-border #404040;
@define-color rider-fg #BDBDBD;
@define-color rider-fg-bright #F0F0F0;
@define-color rider-fg-gutter #808080;
@define-color rider-comment #85C46C;
@define-color rider-keyword #6C95EB;
@define-color rider-type #C191FF;
@define-color rider-type-alt #E1BFFF;
@define-color rider-func #39CC9B;
@define-color rider-field #66C3CC;
@define-color rider-string #C9A26D;
@define-color rider-number #ED94C0;
@define-color rider-escape #D688D4;
@define-color rider-error #FF5647;

View File

@@ -0,0 +1,40 @@
# Generated from palette.json by generate.py. Do not edit directly.
# Usage:
# source = ~/.config/rider-palette/palette.hyprland.conf
$bg = rgb(191A1C)
$bgAlpha = 191A1C
$gutter = rgb(191A1C)
$gutterAlpha = 191A1C
$cursor_line = rgb(202424)
$cursorLineAlpha = 202424
$selection = rgb(08335E)
$selectionAlpha = 08335E
$border = rgb(404040)
$borderAlpha = 404040
$fg = rgb(BDBDBD)
$fgAlpha = BDBDBD
$fg_bright = rgb(F0F0F0)
$fgBrightAlpha = F0F0F0
$fg_gutter = rgb(808080)
$fgGutterAlpha = 808080
$comment = rgb(85C46C)
$commentAlpha = 85C46C
$keyword = rgb(6C95EB)
$keywordAlpha = 6C95EB
$type = rgb(C191FF)
$typeAlpha = C191FF
$type_alt = rgb(E1BFFF)
$typeAltAlpha = E1BFFF
$func = rgb(39CC9B)
$funcAlpha = 39CC9B
$field = rgb(66C3CC)
$fieldAlpha = 66C3CC
$string = rgb(C9A26D)
$stringAlpha = C9A26D
$number = rgb(ED94C0)
$numberAlpha = ED94C0
$escape = rgb(D688D4)
$escapeAlpha = D688D4
$error = rgb(FF5647)
$errorAlpha = FF5647

View File

@@ -0,0 +1,23 @@
{
"name": "rider-black",
"colors": {
"bg": "#191A1C",
"gutter": "#191A1C",
"cursor_line": "#202424",
"selection": "#08335E",
"border": "#404040",
"fg": "#BDBDBD",
"fg_bright": "#F0F0F0",
"fg_gutter": "#808080",
"comment": "#85C46C",
"keyword": "#6C95EB",
"type": "#C191FF",
"type_alt": "#E1BFFF",
"func": "#39CC9B",
"field": "#66C3CC",
"string": "#C9A26D",
"number": "#ED94C0",
"escape": "#D688D4",
"error": "#FF5647"
}
}

View File

@@ -0,0 +1,21 @@
/* Generated from palette.json by generate.py. Do not edit directly. */
* {
rider-bg: #191A1C;
rider-gutter: #191A1C;
rider-cursor-line: #202424;
rider-selection: #08335E;
rider-border: #404040;
rider-fg: #BDBDBD;
rider-fg-bright: #F0F0F0;
rider-fg-gutter: #808080;
rider-comment: #85C46C;
rider-keyword: #6C95EB;
rider-type: #C191FF;
rider-type-alt: #E1BFFF;
rider-func: #39CC9B;
rider-field: #66C3CC;
rider-string: #C9A26D;
rider-number: #ED94C0;
rider-escape: #D688D4;
rider-error: #FF5647;
}

View File

@@ -0,0 +1,23 @@
# Generated from palette.json by generate.py. Do not edit directly.
export RIDER_BG="#191A1C"
export RIDER_GUTTER="#191A1C"
export RIDER_CURSOR_LINE="#202424"
export RIDER_SELECTION="#08335E"
export RIDER_BORDER="#404040"
export RIDER_FG="#BDBDBD"
export RIDER_FG_BRIGHT="#F0F0F0"
export RIDER_FG_GUTTER="#808080"
export RIDER_COMMENT="#85C46C"
export RIDER_KEYWORD="#6C95EB"
export RIDER_TYPE="#C191FF"
export RIDER_TYPE_ALT="#E1BFFF"
export RIDER_FUNC="#39CC9B"
export RIDER_FIELD="#66C3CC"
export RIDER_STRING="#C9A26D"
export RIDER_NUMBER="#ED94C0"
export RIDER_ESCAPE="#D688D4"
export RIDER_ERROR="#FF5647"
# Shared Rider palette for GNU ls and compatible tools.
export LS_COLORS="no=0:fi=0:di=1;38;2;108;149;235:ln=1;38;2;102;195;204:or=38;2;255;86;71:mi=0:so=38;2;102;195;204:pi=38;2;201;162;109:do=1;38;2;57;204;155:bd=38;2;237;148;192:cd=38;2;237;148;192:su=1;38;2;255;86;71:sg=1;38;2;214;136;212:ex=1;38;2;57;204;155:*.tar=38;2;225;191;255:*.tgz=38;2;225;191;255:*.gz=38;2;225;191;255:*.bz2=38;2;225;191;255:*.xz=38;2;225;191;255:*.zip=38;2;225;191;255:*.7z=38;2;225;191;255:*.zst=38;2;225;191;255:*.rar=38;2;225;191;255:*.jpg=38;2;193;145;255:*.jpeg=38;2;193;145;255:*.png=38;2;193;145;255:*.gif=38;2;193;145;255:*.svg=38;2;193;145;255:*.webp=38;2;193;145;255:*.mp3=38;2;193;145;255:*.flac=38;2;193;145;255:*.wav=38;2;193;145;255:*.mp4=38;2;193;145;255:*.mkv=38;2;193;145;255:*.mov=38;2;193;145;255:*.pdf=38;2;133;196;108:*.md=38;2;133;196;108:*.txt=38;2;133;196;108:*.log=38;2;133;196;108:*.conf=38;2;201;162;109:*.json=38;2;201;162;109:*.yaml=38;2;201;162;109:*.yml=38;2;201;162;109:*.toml=38;2;201;162;109:*.ini=38;2;201;162;109:*.sh=38;2;57;204;155:*.bash=38;2;57;204;155:*.zsh=38;2;57;204;155:*.py=38;2;102;195;204:*.js=38;2;102;195;204:*.ts=38;2;102;195;204:*.tsx=38;2;102;195;204:*.jsx=38;2;102;195;204:*.lua=38;2;102;195;204:*.rs=38;2;102;195;204:*.go=38;2;102;195;204:*.c=38;2;102;195;204:*.h=38;2;102;195;204:*.cpp=38;2;102;195;204:*.hpp=38;2;102;195;204:*.cs=38;2;102;195;204"

View File

@@ -0,0 +1,23 @@
# Generated from palette.json by generate.py. Do not edit directly.
# Source this near the end of ~/.tmux.conf.
set -g status-style "bg=#191A1C,fg=#F0F0F0"
set -g status-left-length 80
set -g status-right-length 80
set -g status-justify centre
set -g window-status-separator " "
set -g status-left "#[fg=#191A1C,bg=#39CC9B,bold] #S #[fg=#39CC9B,bg=#191A1C]"
set -g status-right "#[fg=#66C3CC,bg=#191A1C]#[fg=#191A1C,bg=#66C3CC] %Y-%m-%d #[fg=#C9A26D,bg=#66C3CC]#[fg=#191A1C,bg=#C9A26D] %H:%M#[fg=#C9A26D,bg=#191A1C]"
set -g message-style "bg=#202424,fg=#F0F0F0"
set -g message-command-style "bg=#202424,fg=#F0F0F0"
set -g mode-style "bg=#08335E"
set -g pane-border-style "fg=#404040"
set -g pane-active-border-style "fg=#6C95EB"
set -g clock-mode-colour "#6C95EB"
set -g window-status-style "bg=#191A1C,fg=#808080"
set -g window-status-current-style "bg=#191A1C,fg=#F0F0F0"
set -g window-status-current-format "#[fg=#39CC9B,bg=#191A1C]#[fg=#191A1C,bg=#39CC9B,bold] #I #[fg=#39CC9B,bg=#404040]#[fg=#F0F0F0,bg=#404040] #W #[fg=#404040,bg=#191A1C]"
set -g window-status-format "#[fg=#202424,bg=#191A1C]#[fg=#808080,bg=#202424] #I #[fg=#202424,bg=#404040]#[fg=#F0F0F0,bg=#404040] #W #[fg=#404040,bg=#191A1C]"

View File

@@ -11,6 +11,10 @@ set -g default-terminal "tmux-256color"
set -g base-index 1
set -g pane-base-index 1
set -g renumber-windows on
set -g status-position top
unbind =
bind = select-layout -E
# using vim motions
bind-key h select-pane -L
@@ -18,23 +22,18 @@ bind-key j select-pane -D
bind-key k select-pane -U
bind-key l select-pane -R
# list of plugins
set -g @plugin 'tmux-plugins/tpm'
# set -g @plugin '2kabhishek/tmux2k'
set -g @plugin 'catppuccin/tmux'
# resize panes
bind -r H resize-pane -L
bind -r J resize-pane -D
bind -r K resize-pane -U
bind -r L resize-pane -R
set-option -g status-position top
set -g @catppuccin_flavor 'mocha' # latte, frappe, macchiato or mocha
set -g @catppuccin_window_status_style "rounded"
# Split panes in the same directory
bind '"' split-window -v -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"
# configure theme
# set -g @tmux2k-theme 'catppuccin'
# set -g @tmux2k-theme 'onedark'
# set -g @tmux2k-icons-only true
# New window in same directory
bind c new-window -c "#{pane_current_path}"
# Use window name instead of pane title
set -g @catppuccin_window_text "#W"
set -g @catppuccin_window_current_text "#W"
# initialize TMUX plugin manager
run '~/.tmux/plugins/tpm/tpm'
# Shared Rider palette overrides
source-file ~/.config/rider-palette/tmux.conf

View File

@@ -0,0 +1,68 @@
force_keyboard_focus = true
close_when_open = true
click_to_close = true
single_click_activation = true
selection_wrap = true
resume_last_query = true
hide_quick_activation = true
hide_action_hints = true
hide_action_hints_dmenu = true
hide_return_action = true
theme = "rider-omarchy"
[shell]
exclusive_zone = -1
layer = "overlay"
anchor_top = true
anchor_bottom = true
anchor_left = true
anchor_right = true
[placeholders]
"default" = { input = "Search apps, files, commands", list = "No matches" }
[keybinds]
close = ["Escape"]
next = ["Down", "ctrl j"]
previous = ["Up", "ctrl k"]
left = ["Left"]
right = ["Right"]
down = ["Down"]
up = ["Up"]
toggle_exact = ["ctrl e"]
show_actions = ["alt Return"]
page_down = ["Page_Down"]
page_up = ["Page_Up"]
[providers]
default = ["desktopapplications", "calc", "websearch"]
empty = ["desktopapplications"]
max_results = 12
[[providers.prefixes]]
prefix = ";"
provider = "providerlist"
[[providers.prefixes]]
prefix = ">"
provider = "runner"
[[providers.prefixes]]
prefix = "/"
provider = "files"
[[providers.prefixes]]
prefix = "="
provider = "calc"
[[providers.prefixes]]
prefix = "$"
provider = "windows"
[[providers.prefixes]]
prefix = ":"
provider = "clipboard"
[[providers.prefixes]]
prefix = "@"
provider = "websearch"

View File

@@ -0,0 +1,99 @@
@import url("../../../rider-palette/palette.css");
* {
all: unset;
font-family: "JetBrainsMono Nerd Font", "JetBrains Mono", monospace;
font-size: 16px;
color: @rider-fg-bright;
}
window,
#window,
.background {
background: transparent;
}
box,
listview,
scrolledwindow {
background: transparent;
}
entry,
#input,
searchentry {
background: rgba(32, 36, 36, 0.96);
color: @rider-fg-bright;
border: 1px solid rgba(108, 149, 235, 0.35);
border-radius: 18px;
padding: 16px 18px;
margin: 0 0 16px 0;
min-height: 30px;
caret-color: @rider-func;
}
entry selection,
#input selection,
searchentry selection {
background: @rider-selection;
color: @rider-fg-bright;
}
listview,
#list,
.list {
background: rgba(38, 38, 38, 0.94);
border: 1px solid rgba(64, 64, 64, 0.95);
border-radius: 24px;
padding: 12px;
}
child,
.item,
row {
background: transparent;
border-radius: 18px;
padding: 10px 12px;
margin: 4px 0;
}
child:selected,
child:focus,
child:hover,
.item:selected,
.item:hover,
row:selected,
row:hover {
background: rgba(8, 51, 94, 0.92);
}
label,
.label,
#label {
color: @rider-fg-bright;
}
#sub,
.sub,
.dim-label,
.description {
color: @rider-fg-gutter;
}
#icon {
color: @rider-func;
margin-right: 14px;
}
#activationlabel,
.activationlabel,
.quick-activation {
color: @rider-string;
font-weight: 700;
}
#typeahead,
#placeholder,
.placeholder {
color: @rider-fg-gutter;
}

View File

@@ -1,7 +1,6 @@
// --// waybar config generated by wbarconfgen.sh //-- //
{
"layer": "top",
"position": "top",
"layer": "bottom",
"position": "bottom",
"mod": "dock",
"margin-left": 0,
"margin-right": 0,
@@ -15,66 +14,49 @@
"hyprland/workspaces"
],
"modules-center": [
"group/center"
"clock"
],
"modules-right": [
"group/right"
"tray",
"custom/print-queue",
"network",
"bluetooth",
"pulseaudio",
"battery",
"custom/mako",
"custom/power"
],
"custom/flexspace": {
"format": "",
"tooltip": false,
"expand": true
},
"memory": {
"interval": 1,
"rotate": 270,
"format": "{icon}",
"battery": {
"states": {
"warning": 30,
"critical": 15
},
"format": "{icon} {capacity}%",
"format-charging": "󰂄 {capacity}%",
"format-plugged": " {capacity}%",
"format-full": "󰁹 100%",
"format-icons": [
"󰝦",
"󰪞",
"󰪟",
"󰪠",
"󰪡",
"󰪢",
"󰪣",
"󰪤",
"󰪥"
]
},
"cpu": {
"interval": 1,
"format": "{icon}",
"rotate": 270,
"format-icons": [
"󰝦",
"󰪞",
"󰪟",
"󰪠",
"󰪡",
"󰪢",
"󰪣",
"󰪤",
"󰪥"
]
"󰂎",
"󰁺",
"󰁼",
"󰁾",
"󰂀",
"󰂂",
"󰁹"
],
"interval": 10,
"tooltip": true
},
"tray": {
"icon-size": 18,
"spacing": 6,
"icon-size": 22,
"spacing": 14,
"rotate": 0
},
"group/system": {
"orientation": "horizontal",
"modules": [
"memory",
"cpu",
"pulseaudio"
]
},
"custom/power": {
"format": "",
"format": "",
"tooltip": false,
"menu": "on-click",
"menu-file": "$HOME/.config/waybar/power_menu.xml", // Menu file in resources folder
"menu-file": "$HOME/.config/waybar/power_menu.xml",
"menu-actions": {
"shutdown": "systemctl poweroff",
"reboot": "systemctl reboot",
@@ -84,28 +66,39 @@
"lock": "hyprlock"
}
},
"group/center": {
"orientation": "horizontal",
"modules": [
"clock"
]
"custom/print-queue": {
"exec": "$HOME/.config/waybar/scripts/print-queue.sh",
"return-type": "json",
"interval": 10,
"format": "{}",
"tooltip": true,
"on-click": "$HOME/.config/waybar/scripts/print-queue-view.sh"
},
"group/right": {
"orientation": "horizontal",
"modules": [
"tray",
"group/system",
"custom/power"
]
"custom/mako": {
"exec": "$HOME/.config/waybar/scripts/mako-notifications.sh status",
"return-type": "json",
"interval": 5,
"signal": 8,
"format": "{}",
"tooltip": true,
"on-click": "$HOME/.config/waybar/scripts/mako-notifications.sh toggle",
"on-click-right": "$HOME/.config/waybar/scripts/mako-notifications.sh list"
},
"hyprland/workspaces": {
"all-outputs": false,
"format": "{name}"
"sort-by-number": true
},
"hyprland/window": {
"separate-outputs": true,
"icon": true,
"max-length": 56,
"rewrite": {
"": "Desktop"
}
},
"clock": {
"format": "{:%R %a %d %b}",
"format": "{:%A %R}",
"rotate": 0,
"on-click": "/usr/local/bin/ags -t ActivityCenter",
"tooltip-format": "<tt>{calendar}</tt>",
"calendar": {
"mode": "year",
@@ -114,10 +107,10 @@
"on-scroll": 1,
"on-click-right": "mode",
"format": {
"months": "<span color='#ffead3'><b>{}</b></span>",
"weeks": "<span color='#99ffdd'><b>{}</b></span>",
"weekdays": "<span color='#ffcc66'><b>{}</b></span>",
"today": "<span color='#ff6699'><b>{}</b></span>"
"months": "<span color='#C191FF'><b>{}</b></span>",
"weeks": "<span color='#66C3CC'><b>{}</b></span>",
"weekdays": "<span color='#C9A26D'><b>{}</b></span>",
"today": "<span color='#39CC9B'><b>{}</b></span>"
}
},
"actions": {
@@ -129,18 +122,45 @@
}
},
"pulseaudio": {
"format": "{icon}",
"format-muted": "",
"format": "{icon} {volume}%",
"format-muted": "󰖁 muted",
"format-icons": {
"default": [
"",
""
]
"󰕿",
"󰖀",
"󰕾"
],
"headphone": "󰋋",
"hands-free": "󰋎",
"headset": "󰋎",
"phone": "󰏲",
"portable": "󰄝",
"car": "󰄋"
},
"scroll-step": 5,
"on-click": "pavucontrol", // Open PulseAudio control GUI
"on-click-right": "pamixer -t", // Toggle mute
"on-scroll-up": "pamixer -i 5", // Increase volume
"on-scroll-down": "pamixer -d 5" // Decrease volume
"on-click": "pavucontrol",
"on-click-right": "pamixer -t",
"on-scroll-up": "pamixer -i 5",
"on-scroll-down": "pamixer -d 5"
},
"network": {
"interval": 5,
"format-wifi": "󰖩 {signalStrength}%",
"format-ethernet": "󰈀 ethernet",
"format-linked": "󰈀 linked",
"format-disconnected": "󰖪 offline",
"tooltip-format-wifi": "{essid} ({signalStrength}%)",
"tooltip-format-ethernet": "{ifname}",
"tooltip-format-disconnected": "Disconnected",
"on-click": "nm-connection-editor"
},
"bluetooth": {
"format": "󰂯 {status}",
"format-disabled": "󰂲 off",
"format-off": "󰂲 off",
"format-no-controller": "󰂲 n/a",
"format-on": "󰂯 on",
"format-connected": "󰂱 on",
"tooltip-format": "{controller_alias}\t{controller_address}"
}
}

View File

@@ -1,51 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<object class="GtkMenu" id="menu">
<child>
<object class="GtkMenuItem" id="section-session">
<property name="label">Session</property>
<property name="sensitive">False</property>
<property name="can-focus">False</property>
<style>
<class name="section-header"/>
</style>
</object>
</child>
<!-- Session controls -->
<child>
<object class="GtkMenuItem" id="lock">
<property name="label"> Lock</property>
<property name="label">󰌾 Lock</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="logout">
<property name="label">󰍃 Logout</property>
<property name="label">󰍃 Log Out</property>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="sep1" />
<object class="GtkSeparatorMenuItem" id="sep1"/>
</child>
<child>
<object class="GtkMenuItem" id="section-sleep">
<property name="label">Sleep</property>
<property name="sensitive">False</property>
<property name="can-focus">False</property>
<style>
<class name="section-header"/>
</style>
</object>
</child>
<!-- Power controls -->
<child>
<object class="GtkMenuItem" id="suspend">
<property name="label"> Suspend</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="hibernate">
<property name="label">⏾ Hibernate</property>
<property name="label">󰤄 Suspend</property>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="sep2" />
<object class="GtkMenuItem" id="hibernate">
<property name="label">󰒲 Hibernate</property>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="sep2"/>
</child>
<child>
<object class="GtkMenuItem" id="section-power">
<property name="label">Power</property>
<property name="sensitive">False</property>
<property name="can-focus">False</property>
<style>
<class name="section-header"/>
</style>
</object>
</child>
<child>
<object class="GtkMenuItem" id="reboot">
<property name="label">󰜉 Reboot</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="shutdown">
<property name="label"> Shutdown</property>
<property name="label">󰐥 Shut Down</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="reboot">
<property name="label"> Reboot</property>
</object>
</child>
</object>
</interface>

View File

@@ -0,0 +1,135 @@
#!/usr/bin/env sh
set -eu
dnd_mode="do-not-disturb"
json_string() {
if command -v jq >/dev/null 2>&1; then
printf '%s' "$1" | jq -Rs .
return
fi
printf '%s' "$1" | awk '
BEGIN { ORS = "" }
{
gsub(/\\/, "\\\\")
gsub(/"/, "\\\"")
gsub(/\t/, "\\t")
if (NR > 1) {
printf "\\n"
}
printf "%s", $0
}
END { printf "\n" }
'
}
refresh_waybar() {
pkill -RTMIN+8 waybar >/dev/null 2>&1 || true
}
notification_count() {
if ! command -v jq >/dev/null 2>&1; then
printf '0'
return
fi
makoctl list -j 2>/dev/null \
| jq '[.. | objects | select(has("id"))] | length' 2>/dev/null \
|| printf '0'
}
is_dnd() {
makoctl mode 2>/dev/null | grep -qx "$dnd_mode"
}
status() {
if ! modes="$(makoctl mode 2>/dev/null)"; then
text="$(json_string " n/a")"
class="$(json_string "disabled")"
tooltip="$(json_string "Mako is unavailable")"
printf '{"text":%s,"class":%s,"tooltip":%s}\n' "$text" "$class" "$tooltip"
return
fi
count="$(notification_count)"
count="${count:-0}"
if printf '%s\n' "$modes" | grep -qx "$dnd_mode"; then
state="dnd"
icon=""
label="Do Not Disturb is on"
elif [ "$count" -gt 0 ] 2>/dev/null; then
state="active"
icon=""
label="Do Not Disturb is off"
else
state="normal"
icon=""
label="Do Not Disturb is off"
fi
text="$(json_string "$icon $count")"
class="$(json_string "$state")"
tooltip="$(json_string "$label
$count pending notifications
Left click toggles DND
Right click opens the notification list")"
printf '{"text":%s,"class":%s,"tooltip":%s}\n' "$text" "$class" "$tooltip"
}
toggle() {
makoctl mode -t "$dnd_mode" >/dev/null 2>&1 || true
refresh_waybar
}
list_notifications() {
title="Notifications"
if command -v jq >/dev/null 2>&1; then
list="$(
makoctl list -j 2>/dev/null \
| jq -r '
[.. | objects | select(has("id"))]
| if length == 0 then
"No pending notifications"
else
.[]
| [
(."app-name" // .app_name // "app"),
(.summary // ""),
(.body // "")
]
| map(select(. != ""))
| join(" - ")
end
' 2>/dev/null
)"
else
list="$(makoctl list 2>/dev/null || printf 'No pending notifications')"
fi
if [ -z "$list" ]; then
list="No pending notifications"
fi
if command -v wofi >/dev/null 2>&1; then
printf '%s\n' "$list" | wofi --dmenu --prompt "$title" >/dev/null 2>&1 || true
elif command -v alacritty >/dev/null 2>&1; then
tmp="${TMPDIR:-/tmp}/mako-notifications.$$"
printf '%s\n' "$list" > "$tmp"
alacritty -e sh -c 'printf "%s\n\n" "$1"; cat "$2"; printf "\nPress Enter to close."; read -r _' sh "$title" "$tmp"
rm -f "$tmp"
else
printf '%s\n' "$list"
fi
}
case "${1:-status}" in
status) status ;;
toggle) toggle ;;
list) list_notifications ;;
*) status ;;
esac

View File

@@ -0,0 +1,30 @@
#!/usr/bin/env sh
if command -v system-config-printer >/dev/null 2>&1; then
exec system-config-printer
fi
if command -v alacritty >/dev/null 2>&1; then
exec alacritty -e sh -lc '
while :; do
clear
printf "Print Queue\n"
printf "===========\n\n"
if ! lpstat -r >/dev/null 2>&1; then
printf "CUPS scheduler is not running.\n"
else
if ! lpstat -o 2>/dev/null | sed "/^[[:space:]]*$/d" | grep . >/dev/null 2>&1; then
printf "No print jobs queued.\n"
else
lpstat -o
fi
fi
printf "\nRefreshing every 3 seconds. Press Ctrl+C to close."
sleep 3
done
'
fi
exec xdg-open http://localhost:631/jobs/

View File

@@ -0,0 +1,24 @@
#!/usr/bin/env sh
jobs_output="$(lpstat -o 2>/dev/null)"
status=$?
if [ "$status" -ne 0 ]; then
printf '%s\n' '{"text":"󰐪 n/a","class":"disabled","tooltip":"CUPS is unavailable"}'
exit 0
fi
if [ -z "$jobs_output" ]; then
printf '%s\n' '{"text":"","class":"idle","tooltip":"No print jobs queued"}'
exit 0
fi
job_count="$(printf '%s\n' "$jobs_output" | sed '/^[[:space:]]*$/d' | wc -l | tr -d ' ')"
if [ "$job_count" = "1" ]; then
tooltip="1 print job queued"
else
tooltip="$job_count print jobs queued"
fi
printf '{"text":"󰐪 %s","class":"active","tooltip":"%s"}\n' "$job_count" "$tooltip"

View File

@@ -1,57 +1,242 @@
@define-color foreground #d8dee9;
@define-color background #1a1b26;
@import url("../rider-palette/palette.css");
@define-color foreground @rider-fg;
@define-color foreground-muted @rider-fg-gutter;
@define-color background @rider-bg;
@define-color background-alt @rider-cursor-line;
@define-color accent @rider-func;
@define-color accent-alt @rider-keyword;
@define-color accent-soft @rider-field;
@define-color type @rider-type;
@define-color warning @rider-string;
@define-color danger @rider-error;
/* font-family: 'JetBrainsMono Nerd Font Mono';*/
* {
background-color: @background;
color: @foreground;
font-family: 'JetBrainsMono Nerd Font Mono';
font-size: 20px;
font-family: 'JetBrainsMono Nerd Font';
font-size: 17px;
}
.modules-left {
margin-left: 8px;
window#waybar {
background: @background;
border-top: 1px solid alpha(@foreground, 0.28);
border-radius: 0px;
box-shadow: none;
color: @foreground;
}
.modules-right {}
window#waybar>box {
padding: 4px 2px;
}
tooltip {
background: @background;
border: 1px solid @accent-alt;
border-radius: 14px;
}
.modules-left,
.modules-center,
.modules-right {
margin: 0;
}
#custom-launcher,
#workspaces,
#window,
#clock,
#custom-print-queue,
#network,
#bluetooth,
#pulseaudio,
#battery,
#custom-mako,
#tray,
#custom-power {
background: transparent;
border: none;
border-left: 1px solid alpha(@foreground, 0.18);
border-radius: 0;
box-shadow: none;
margin: 0;
padding: 0 12px;
}
#custom-launcher,
#workspaces,
#clock,
#custom-print-queue,
#tray {
border-left: none;
}
#bluetooth,
#pulseaudio {
border-left: none;
}
#custom-print-queue {
padding: 0 12px;
}
#network {
padding: 0 7px 0 12px;
}
#bluetooth {
padding: 0 7px;
}
#pulseaudio {
padding: 0 12px 0 7px;
}
#workspaces {
padding: 0 6px;
}
#workspaces button {
all: initial;
padding: 0 6px;
margin: 0 1.5px;
min-width: 9px;
opacity: 0.5;
min-width: 29px;
padding: 0 5px;
margin: 2px 2px;
border-radius: 7px;
opacity: 0.9;
}
#workspaces button label {
color: inherit;
margin: 0;
padding: 0;
}
#workspaces button.empty {
opacity: 0.25;
color: @foreground-muted;
opacity: 0.45;
}
#workspaces button.visible {
opacity: 0.8;
color: @accent-alt;
background: alpha(@accent-alt, 0.12);
}
#workspaces button.active {
opacity: 1.0;
color: @accent;
background: alpha(@accent, 0.16);
}
#cpu,
#memory,
#battery,
#pulseaudio,
#custom-omarchy,
#custom-screenrecording-indicator,
#custom-update,
#tray,
#bluetooth,
#network,
#custom-power,
#custom-expand-icon {
min-width: 24px;
font-size: 20px;
margin: 0px 2px;
#workspaces button.active label {
color: @accent;
}
#workspaces button.urgent {
color: @foreground;
background: alpha(@danger, 0.26);
}
#workspaces button.urgent label {
color: @foreground;
}
#window {
color: @foreground-muted;
padding: 0 17px;
}
#clock {
padding: 0 18px;
box-shadow: none;
border: none;
}
#tray {
padding: 0 14px;
}
#custom-power {
padding: 0px 19px 0px 14px;
}
#custom-mako {
min-width: 42px;
}
#custom-mako.active {
color: @accent;
}
#custom-launcher:hover,
#workspaces button:hover,
#network:hover,
#custom-print-queue:hover,
#bluetooth:hover,
#pulseaudio:hover,
#battery:hover,
#custom-mako:hover,
#tray:hover,
#custom-power:hover,
#clock:hover {
box-shadow: none;
background: alpha(@background-alt, 0.68);
}
#custom-launcher:hover,
#workspaces button.active:hover {
background: alpha(@accent, 0.28);
}
.hidden {
opacity: 0;
}
menu#menu {
background: @background;
border: 1px solid alpha(@accent-alt, 0.24);
border-radius: 17px;
padding: 10px;
}
menu#menu menuitem {
border-radius: 12px;
margin: 12px;
padding: 10px 14px;
}
menu#menu menuitem:hover {
background: @background-alt;
}
menu#menu menuitem.section-header {
color: @foreground-muted;
font-size: 17px;
margin-top: 4px;
padding: 5px 14px;
}
menu#menu menuitem#lock {
color: @accent;
}
menu#menu menuitem#logout {
color: @accent-soft;
}
menu#menu menuitem#suspend,
menu#menu menuitem#hibernate {
color: @type;
}
menu#menu menuitem#reboot {
color: @warning;
}
menu#menu menuitem#shutdown {
color: @danger;
font-weight: 700;
}
menu#menu separator {
background: alpha(@accent-alt, 0.24);
margin: 7px 12px;
}

View File

@@ -8,6 +8,9 @@ fi
# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/bin:$PATH
# Export path to include Cargo
export PATH="$HOME/.cargo/bin:$PATH"
# Path to your Oh My Zsh installation.
export ZSH="$HOME/.oh-my-zsh"
@@ -118,4 +121,16 @@ source $ZSH/oh-my-zsh.sh
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
export PATH="$HOME/.local/bin:$PATH"
[[ -r ~/.config/rider-palette/p10k.zsh ]] && source ~/.config/rider-palette/p10k.zsh
export PATH="$HOME/.dotnet/tools:$HOME/.local/bin:$PATH"
# Apply the shared Rider palette last so it wins over OMZ defaults.
if [[ -r ~/.config/rider-palette/palette.sh ]]; then
source ~/.config/rider-palette/palette.sh
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
fi
if ls --color=auto -d . >/dev/null 2>&1; then
alias ls='ls --color=auto'
fi
export PATH="$HOME/go/bin:$HOME/.cargo/bin:$PATH"