diff --git a/.gitignore b/.gitignore
index cec6613..bf4241e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,6 @@ config/fish/conf.d
config/fish/functions
config/fish/fish_variables
config/nvim/nvim-pack-lock.json
-config/alacritty/dank-theme.toml
-
+config/awesome/bling
scripts/bin/Obsidian
scripts/bin/ols
diff --git a/config/alacritty/alacritty.toml b/config/alacritty/alacritty.toml
index 803b1e0..cc01c91 100644
--- a/config/alacritty/alacritty.toml
+++ b/config/alacritty/alacritty.toml
@@ -20,7 +20,7 @@ background = '#101010'
[colors.normal]
# black is gray0
-black = '#080808'
+black = '#111111'
red = '#C11F1F'
green = '#789978'
yellow = '#ffAA88'
diff --git a/config/awesome/rc.lua b/config/awesome/rc.lua
new file mode 100644
index 0000000..76c5c94
--- /dev/null
+++ b/config/awesome/rc.lua
@@ -0,0 +1,437 @@
+pcall(require, "luarocks.loader")
+
+local gears = require("gears")
+local awful = require("awful")
+require("awful.autofocus")
+local wibox = require("wibox")
+local beautiful = require("beautiful")
+local bling = require("bling")
+local naughty = require("naughty")
+local menubar = require("menubar")
+local hotkeys_popup = require("awful.hotkeys_popup")
+
+-- {{{ Error handling
+if awesome.startup_errors then
+ naughty.notify({ preset = naughty.config.presets.critical,
+ title = "Error during startup",
+ text = awesome.startup_errors })
+end
+do
+ local in_error = false
+ awesome.connect_signal("debug::error", function (err)
+ if in_error then return end
+ in_error = true
+ naughty.notify({ preset = naughty.config.presets.critical,
+ title = "An error happened",
+ text = tostring(err) })
+ in_error = false
+ end)
+end
+-- }}}
+
+-- {{{ Variable definitions
+beautiful.init(gears.filesystem.get_themes_dir() .. "default/theme.lua")
+
+-- Gaps
+beautiful.useless_gap = 8
+beautiful.gap_single_client = true
+
+-- ---- Qogir / polybar-matched palette ------------------------------------
+local colors = {
+ background = "#111111",
+ background_alt = "#1a1a1a",
+ foreground = "#d3dae3",
+ accent = "#616161",
+ accent_alt = "#6ba0e8",
+ red = "#e35b5b",
+ green = "#98c379",
+ yellow = "#e5c07b",
+ disabled = "#707880",
+ white = "#ffffff",
+}
+
+-- Bar font (matches your polybar JetBrainsMono Nerd Font; bump the number to 14
+-- if you want it as large as polybar's size=14).
+beautiful.font = "JetBrainsMono Nerd Font 12"
+
+-- Window borders
+beautiful.border_width = 4
+beautiful.border_normal = colors.background_alt
+beautiful.border_focus = colors.accent
+
+-- Taglist colors to mirror polybar's xworkspaces module
+beautiful.taglist_bg_focus = colors.accent
+beautiful.taglist_fg_focus = colors.background
+beautiful.taglist_fg_occupied = colors.white
+beautiful.taglist_bg_occupied = colors.background
+beautiful.taglist_fg_empty = colors.disabled
+beautiful.taglist_bg_empty = colors.background
+beautiful.taglist_bg_urgent = colors.red
+beautiful.taglist_fg_urgent = colors.background
+
+-- Systray styling
+beautiful.bg_systray = colors.background
+beautiful.systray_icon_spacing = 4
+
+terminal = "alacritty"
+editor = os.getenv("EDITOR") or "nano"
+
+-- THE modkey. "Mod1" = Alt. Use "Mod4" for the Super/Windows key.
+modkey = "Mod1"
+
+-- Layouts: suit.tile = master column LEFT, stack column RIGHT.
+awful.layout.layouts = {
+ awful.layout.suit.tile,
+ awful.layout.suit.max,
+ awful.layout.suit.floating,
+}
+-- }}}
+
+-- {{{ Bar helpers ---------------------------------------------------------
+
+-- "ICON value" with ICON tinted accent, like polybar's *-prefix-foreground.
+local function label(icon, val)
+ return string.format("%s %s",
+ colors.accent, icon, val or "")
+end
+
+-- A slim "|" separator in the disabled color, like polybar's separator.
+local function sep()
+ local w = wibox.widget.textbox()
+ w.markup = string.format(" │ ", colors.disabled)
+ return w
+end
+
+-- Wrap a widget in a small margin so bar modules aren't crammed together.
+local function padded(w, left, right)
+ return wibox.container.margin(w, left or 8, right or 8)
+end
+
+-- Focused window title (polybar xwindow / %title%)
+local function make_title()
+ local t = wibox.widget.textbox()
+ local function update()
+ local c = client.focus
+ t.markup = c and string.format("%s", colors.white, gears.string.xml_escape(c.name or "")) or ""
+ end
+ client.connect_signal("focus", update)
+ client.connect_signal("unfocus", update)
+ client.connect_signal("property::name", update)
+ return t
+end
+
+-- CPU usage % (two top samples so the reading is accurate)
+local function make_cpu()
+ return awful.widget.watch(
+ { "bash", "-c",
+ [[LANG=C top -bn2 -d0.3 | grep -m2 '^%Cpu' | tail -1 | awk '{printf "%.0f", 100 - $8}']] },
+ 3,
+ function(w, out) w.markup = label("CPU", out:gsub("%s+$","") .. "%") end)
+end
+
+-- Volume: click to mute, scroll to adjust, right-click for the mixer.
+-- Keeps its own refresh() so button presses update instantly instead of
+-- waiting on the polling timer.
+local function make_vol()
+ local w = wibox.widget.textbox()
+
+ local vol_script = [[
+ sink=$(LANG=C pactl get-default-sink 2>/dev/null)
+ m=$(LANG=C pactl get-sink-mute "$sink" 2>/dev/null | grep -oE 'yes|no')
+ v=$(LANG=C pactl get-sink-volume "$sink" 2>/dev/null | grep -oE '[0-9]+%' | head -n1)
+ echo "$m $v"
+ ]]
+
+ local function shell_quote(s)
+ return "'" .. s:gsub("'", "'\\''") .. "'"
+ end
+ local vol_cmd = "sh -c " .. shell_quote(vol_script)
+
+ local function refresh()
+ awful.spawn.easy_async_with_shell(vol_cmd, function(out)
+ local muted, pct = out:match("(%a+)%s+(%d+)%%")
+ if muted == nil and pct == nil then
+ -- Command failed entirely (no sink found / pactl error).
+ w.markup = string.format("VOL n/a", colors.disabled)
+ return
+ end
+ muted = muted == "yes"
+ pct = pct or "0"
+ if muted then
+ w.markup = string.format("MUTE", colors.disabled)
+ else
+ w.markup = label("VOL", pct .. "%")
+ end
+ end)
+ end
+
+ w:buttons(gears.table.join(
+ -- left click: toggle mute
+ awful.button({ }, 1, function () awful.spawn.easy_async_with_shell( [[sh -c 'pactl set-sink-mute "$(pactl get-default-sink)" toggle']], function() refresh() end) end),
+ -- right click: open the mixer
+ awful.button({ }, 3, function () awful.spawn("pavucontrol") end),
+ -- scroll up: +2%
+ awful.button({ }, 4, function () awful.spawn.easy_async_with_shell( [[sh -c 'pactl set-sink-volume "$(pactl get-default-sink)" +2%']], function() refresh() end) end),
+ -- scroll down: -2%
+ awful.button({ }, 5, function () awful.spawn.easy_async_with_shell( [[sh -c 'pactl set-sink-volume "$(pactl get-default-sink)" -2%']], function() refresh() end) end)
+ ))
+
+ -- Poll too, in case volume changes elsewhere (media keys, another app).
+ gears.timer {
+ timeout = 2,
+ call_now = true,
+ autostart = true,
+ callback = refresh,
+ }
+
+ return w
+end
+
+-- {{{ Wibar widgets
+local mytextclock = wibox.widget.textclock("%Y-%m-%d %H:%M")
+
+local taglist_buttons = gears.table.join(
+ awful.button({ }, 1, function(t) t:view_only() end),
+ awful.button({ modkey }, 1, function(t)
+ if client.focus then client.focus:move_to_tag(t) end
+ end),
+ awful.button({ }, 3, awful.tag.viewtoggle)
+)
+
+local function set_wallpaper(s)
+ if beautiful.wallpaper then
+ local wp = beautiful.wallpaper
+ if type(wp) == "function" then wp = wp(s) end
+ gears.wallpaper.maximized(wp, s, true)
+ end
+end
+screen.connect_signal("property::geometry", set_wallpaper)
+
+awful.screen.connect_for_each_screen(function(s)
+ set_wallpaper(s)
+
+ -- Workspaces 1..5
+ awful.tag({ "1", "2", "3", "4", "5" }, s, awful.layout.layouts[1])
+
+ s.mypromptbox = awful.widget.prompt()
+ s.mylayoutbox = awful.widget.layoutbox(s)
+ s.mylayoutbox:buttons(gears.table.join(
+ awful.button({ }, 1, function () awful.layout.inc( 1) end),
+ awful.button({ }, 3, function () awful.layout.inc(-1) end)
+ ))
+
+ s.mytaglist = awful.widget.taglist {
+ screen = s,
+ filter = awful.widget.taglist.filter.all,
+ buttons = taglist_buttons,
+ style = {
+ shape = function(cr, w, h) gears.shape.rounded_rect(cr, w, h, 4) end,
+ },
+ layout = {
+ spacing = 4,
+ layout = wibox.layout.fixed.horizontal,
+ },
+ widget_template = {
+ {
+ {
+ id = "text_role",
+ widget = wibox.widget.textbox,
+ },
+ left = 10,
+ right = 10,
+ top = 4,
+ bottom = 4,
+ widget = wibox.container.margin,
+ },
+ id = "background_role",
+ widget = wibox.container.background,
+ },
+ }
+
+ -- Per-screen monitor widgets (created here so multi-monitor stays valid)
+ local title = make_title()
+ local vol = make_vol()
+ local cpu = make_cpu()
+
+ local right = wibox.layout.fixed.horizontal()
+ local function push(w) right:add(padded(w, 4, 4)) end
+ push(vol); right:add(sep())
+ push(cpu); right:add(sep())
+ push(mytextclock)
+ right:add(sep())
+ push(wibox.widget.systray())
+ right:add(sep())
+ push(s.mylayoutbox)
+
+ s.mywibox = awful.wibar({
+ position = "top",
+ screen = s,
+ height = 36,
+ bg = colors.background,
+ fg = colors.foreground,
+ shape = function(cr, w, h) gears.shape.rounded_rect(cr, w, h, 0) end,
+ })
+
+ s.mywibox:setup {
+ layout = wibox.layout.align.horizontal,
+ { -- Left: workspaces + focused window title
+ layout = wibox.layout.fixed.horizontal,
+ padded(s.mytaglist, 8, 4),
+ s.mypromptbox,
+ { title, left = 8, widget = wibox.container.margin },
+ },
+ nil, -- empty center
+ padded(right, 4, 12),
+ }
+end)
+-- }}}
+
+-- {{{ Helper: launcher (prefer rofi, fall back to built-in menubar)
+local function launcher()
+ awful.spawn.easy_async_with_shell("command -v rofi", function(out)
+ if out and out:match("%S") then
+ awful.spawn("rofi -show drun")
+ else
+ menubar.show()
+ end
+ end)
+end
+-- }}}
+
+-- {{{ Global keys
+globalkeys = gears.table.join(
+ awful.key({ modkey }, "s", hotkeys_popup.show_help, {description = "show help", group = "awesome"}),
+
+ -- Directional focus (vim keys)
+ awful.key({ modkey }, "h", function () awful.client.focus.bydirection("left") end, {description = "focus left", group = "client"}),
+ awful.key({ modkey }, "j", function () awful.client.focus.bydirection("down") end, {description = "focus down", group = "client"}),
+ awful.key({ modkey }, "k", function () awful.client.focus.bydirection("up") end, {description = "focus up", group = "client"}),
+ awful.key({ modkey }, "l", function () awful.client.focus.bydirection("right") end, {description = "focus right", group = "client"}),
+
+ -- Directional move (swap clients in the tiling layout)
+ awful.key({ modkey, "Shift" }, "h", function () awful.client.swap.bydirection("left") end, {description = "move left", group = "client"}),
+ awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.bydirection("down") end, {description = "move down", group = "client"}),
+ awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.bydirection("up") end, {description = "move up", group = "client"}),
+ awful.key({ modkey, "Shift" }, "l", function () awful.client.swap.bydirection("right") end, {description = "move right", group = "client"}),
+
+ -- Resize the master/other split
+ awful.key({ modkey, "Control" }, "h", function () awful.tag.incmwfact(-0.05) end, {description = "shrink master", group = "layout"}),
+ awful.key({ modkey, "Control" }, "l", function () awful.tag.incmwfact( 0.05) end, {description = "grow master", group = "layout"}),
+
+ -- Launching / layout
+ awful.key({ modkey }, "Return", function () awful.spawn(terminal) end, {description = "open a terminal", group = "launcher"}),
+ awful.key({ modkey }, "space", launcher, {description = "application launcher", group = "launcher"}),
+ awful.key({ modkey }, "e", function () awful.spawn("thunar") end, {description = "Filemanager", group = "system"}),
+ awful.key({ modkey }, "b", function () awful.spawn("chromium") end, {description = "Browswer", group = "internet"}),
+ awful.key({ modkey }, "t", function () awful.layout.inc(1) end, {description = "next layout", group = "layout"}),
+ awful.key({ modkey }, "p", function () awful.spawn("xfce4-screenshooter") end, {description = "screenshot", group = "system"}),
+
+ -- Alt tab only in max mode
+ awful.key({ "Mod1" }, "Tab", function () if awful.layout.get(mouse.screen) == awful.layout.suit.max then awful.client.focus.byidx(1) if client.focus then client.focus:raise() end end end),
+
+ -- Media keys: volume up/down/mute (works even without a hardware key
+ -- if you bind these in your compositor/DE too)
+ awful.key({ }, "XF86AudioRaiseVolume", function () awful.spawn.easy_async_with_shell([[sh -c 'pactl set-sink-volume "$(pactl get-default-sink)" +2%']]) end, {description = "volume up", group = "media"}),
+ awful.key({ }, "XF86AudioLowerVolume", function () awful.spawn.easy_async_with_shell([[sh -c 'pactl set-sink-volume "$(pactl get-default-sink)" -2%']]) end, {description = "volume down", group = "media"}),
+ awful.key({ }, "XF86AudioMute", function () awful.spawn.easy_async_with_shell([[sh -c 'pactl set-sink-mute "$(pactl get-default-sink)" toggle']]) end, {description = "toggle mute", group = "media"}),
+
+ -- Awesome control
+ awful.key({ modkey, "Shift" }, "r", awesome.restart, {description = "reload awesome", group = "awesome"}),
+ awful.key({ modkey, "Shift" }, "e", awesome.quit, {description = "quit awesome", group = "awesome"})
+)
+
+-- Workspace keys 1..5: Alt+N view, Alt+Shift+N move client to tag
+for i = 1, 5 do
+ globalkeys = gears.table.join(globalkeys,
+ awful.key({ modkey }, "#" .. i + 9, function ()
+ local screen = awful.screen.focused()
+ local tag = screen.tags[i]
+ if tag then tag:view_only() end
+ end,
+ {description = "view tag #" .. i, group = "tag"}),
+ awful.key({ modkey, "Shift" }, "#" .. i + 9, function ()
+ if client.focus then
+ local tag = client.focus.screen.tags[i]
+ if tag then client.focus:move_to_tag(tag) end
+ end
+ end,
+ {description = "move focused client to tag #" .. i, group = "tag"})
+ )
+end
+-- }}}
+
+-- {{{ Per-client keys
+clientkeys = gears.table.join(
+ awful.key({ modkey }, "q", function (c) c:kill() end, {description = "kill window", group = "client"}),
+ awful.key({ modkey }, "f", function (c) c.fullscreen = not c.fullscreen c:raise() end, {description = "toggle fullscreen", group = "client"}),
+ awful.key({ modkey }, "m", function (c) c:swap(awful.client.getmaster()) end, {description = "make master", group = "client"}),
+ awful.key({ modkey, "Shift" }, "space", awful.client.floating.toggle, {description = "toggle floating", group = "client"})
+)
+
+clientbuttons = gears.table.join(
+ awful.button({ }, 1, function (c) c:emit_signal("request::activate", "mouse_click", {raise = true}) end),
+ awful.button({ modkey }, 1, function (c) c:emit_signal("request::activate", "mouse_click", {raise = true}) awful.mouse.client.move(c) end),
+ awful.button({ modkey }, 3, function (c) c:emit_signal("request::activate", "mouse_click", {raise = true}) awful.mouse.client.resize(c) end)
+)
+
+root.keys(globalkeys)
+-- }}}
+
+-- {{{ Rules
+awful.rules.rules = {
+ { rule = { },
+ properties = {
+ border_width = beautiful.border_width,
+ border_color = beautiful.border_normal,
+ focus = awful.client.focus.filter,
+ raise = true,
+ keys = clientkeys,
+ buttons = clientbuttons,
+ screen = awful.screen.preferred,
+ placement = awful.placement.no_overlap + awful.placement.no_offscreen,
+ }
+ },
+
+ { rule_any = {
+ instance = { "pinentry" },
+ class = { "Arandr", "Blueman-manager", "Gpick", "Pavucontrol" },
+ name = { "Event Tester" },
+ role = { "AlarmWindow", "pop-up" },
+ }, properties = { floating = true }},
+}
+-- }}}
+
+-- {{{ Signals
+client.connect_signal("manage", function (c)
+ if awesome.startup
+ and not c.size_hints.user_position
+ and not c.size_hints.program_position then
+ awful.placement.no_offscreen(c)
+ end
+
+ -- New windows open into the stack (to the right); first window becomes master.
+ if not awesome.startup then
+ awful.client.setslave(c)
+ end
+
+ c.shape = function(cr, width, height)
+ -- 8 = corner radius in px
+ gears.shape.rounded_rect(cr, width, height, 13)
+ end
+end)
+
+-- Focus follows mouse (i3-like). Comment out for click-to-focus only.
+client.connect_signal("mouse::enter", function(c)
+ c:emit_signal("request::activate", "mouse_enter", {raise = false})
+end)
+
+client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)
+client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)
+-- }}}
+
+-- Wallpaper
+bling.module.wallpaper.setup {
+ wallpaper = {"/home/jason/Pictures/Wallpapers/farewell.jpg"},
+ position = "fit",
+ background = "#181818"
+}
diff --git a/config/nvim/init.lua b/config/nvim/init.lua
index 9fe632b..0de6bf2 100644
--- a/config/nvim/init.lua
+++ b/config/nvim/init.lua
@@ -48,11 +48,9 @@ vim.pack.add({
{ src = 'https://github.com/lukas-reineke/indent-blankline.nvim' },
{ src = 'https://github.com/slugbyte/lackluster.nvim' },
{ src = 'https://github.com/xiyaowong/transparent.nvim' },
- { src = 'https://github.com/norcalli/nvim-colorizer.lua' }
})
require("terminal")
-require("colorizer").setup()
require("mini.completion").setup()
require('mini.statusline').setup({})
require("tree-sitter-manager").setup()
diff --git a/config/picom/picom.conf b/config/picom/picom.conf
index 3ff4876..a1fb482 100644
--- a/config/picom/picom.conf
+++ b/config/picom/picom.conf
@@ -1,41 +1,220 @@
#################################
# Fading #
#################################
-fading = true;
-fade-in-step = 0.08;
-fade-out-step = 0.08;
-
-#################################
-# Transparency / Opacity #
-#################################
-frame-opacity = 1.0;
-
+fading = false;
+fade-in-step = 0.04;
+fade-out-step = 0.04;
#################################
# Corners #
#################################
-corner-radius = 13;
-
+corner-radius = 12;
#################################
# FAST SNAPPY ANIMATIONS #
#################################
+match = "window_type = 'normal'";
animations = (
- {
- triggers = ["open", "show"];
- preset = "appear";
- duration = 0.20;
- },
- {
- triggers = ["close", "hide"];
- preset = "disappear";
- duration = 0.20;
- },
- {
- triggers = ["geometry"];
- preset = "geometry-change";
- duration = 0.30;
- }
-);
+ {
+
+ triggers = ["close"];
+
+ opacity = {
+
+ curve = "cubic-bezier(0,1,1,1)";
+
+ duration = 0.3;
+
+ start = "window-raw-opacity-before";
+
+ end = 0;
+
+ };
+
+ blur-opacity = "opacity";
+
+ shadow-opacity = "opacity";
+
+
+
+ scale-x = {
+
+ curve = "cubic-bezier(0,1.3,1,1)";
+
+ duration = 0.3;
+
+ start = 1;
+
+ end = 0.6;
+
+ };
+
+ scale-y = "scale-x";
+
+
+
+ offset-x = "(1 - scale-x) / 2 * window-width";
+
+ offset-y = "(1 - scale-y) / 2 * window-height";
+
+
+
+ shadow-scale-x = "scale-x";
+
+ shadow-scale-y = "scale-y";
+
+ shadow-offset-x = "offset-x";
+
+ shadow-offset-y = "offset-y";
+
+ },
+
+
+
+{
+
+ triggers = ["open"];
+
+ opacity = {
+
+ curve = "cubic-bezier(0,1,1,1)";
+
+ duration = 0.5;
+
+ start = 0;
+
+ end = "window-raw-opacity";
+
+ };
+
+ blur-opacity = "opacity";
+
+ shadow-opacity = "opacity";
+
+
+
+ scale-x = {
+
+ curve = "cubic-bezier(0,1.3,1,1)";
+
+ duration = 0.5;
+
+ start = 0.6;
+
+ end = 1;
+
+ };
+
+ scale-y = "scale-x";
+
+
+
+ offset-x = "(1 - scale-x) / 2 * window-width";
+
+ offset-y = "(1 - scale-y) / 2 * window-height";
+
+
+
+ shadow-scale-x = "scale-x";
+
+ shadow-scale-y = "scale-y";
+
+ shadow-offset-x = "offset-x";
+
+ shadow-offset-y = "offset-y";
+
+},
+
+
+
+{
+
+ triggers = ["geometry"];
+
+ scale-x = {
+
+ curve = "cubic-bezier(0,0,0,1.28)";
+
+ duration = 0.5;
+
+ start = "window-width-before / window-width";
+
+ end = 1;
+
+ };
+
+
+
+ scale-x-reverse = {
+
+ curve = "cubic-bezier(0,0,0,1.28)";
+
+ duration = 0.3;
+
+ start = "window-width / window-width-before";
+
+ end = 1;
+
+ };
+
+ scale-y = {
+
+ curve = "cubic-bezier(0,0,0,1.28)";
+
+ duration = 0.5;
+
+ start = "window-height-before / window-height";
+
+ end = 1;
+
+ };
+
+ scale-y-reverse = {
+
+ curve = "cubic-bezier(0,0,0,1.28)";
+
+ duration = 0.5;
+
+ start = "window-height / window-height-before";
+
+ end = 1;
+
+ };
+
+ offset-x = {
+
+ curve = "cubic-bezier(0,0,0,1.28)";
+
+ duration = 0.5;
+
+ start = "window-x-before - window-x";
+
+ end = 0;
+
+ };
+
+ offset-y = {
+
+ curve = "cubic-bezier(0,0,0,1.28)";
+
+ duration = 0.5;
+
+ start = "window-y-before - window-y";
+
+ end = 0;
+
+ };
+
+ shadow-scale-x = "scale-x";
+
+ shadow-scale-y = "scale-y";
+
+ shadow-offset-x = "offset-x";
+
+ shadow-offset-y = "offset-y";
+
+},
+
+)
#################################
# General Settings #
#################################
@@ -47,19 +226,53 @@ detect-client-opacity = true;
detect-transient = true;
use-damage = true;
log-level = "warn";
-
#################################
# Window Rules #
#################################
rules: (
- # No rounded corners on dock and desktop
+# No rounded corners on dock and desktop
+ {
+ match = "window_type = 'dock' || window_type = 'desktop'";
+ corner-radius = 0;
+ },
{
- match = "window_type = 'dock' || window_type = 'desktop'";
- corner-radius = 0;
+ match = "class_g = 'Rofi'";
+ animations = (
+ {
+ triggers = ["open", "show"];
+ opacity = {
+ curve = "cubic-bezier(0, 1, 1, 1)";
+ duration = 0.2;
+ start = 0;
+ end = "window-raw-opacity";
+ };
+ shadow-opacity = "opacity";
+ scale-y = {
+ curve = "cubic-bezier(0.2, 0, 0, 1)";
+ duration = 0.2;
+ start = 0.55;
+ end = 1;
+ };
+ shadow-scale-y = "scale-y";
+ },
+ {
+ triggers = ["close", "hide"];
+ opacity = {
+ curve = "cubic-bezier(0, 1, 1, 1)";
+ duration = 0.15;
+ start = "window-raw-opacity-before";
+ end = 0;
+ };
+ shadow-opacity = "opacity";
+ scale-y = {
+ curve = "cubic-bezier(0.2, 0, 0, 1)";
+ duration = 0.15;
+ start = 1;
+ end = 0.55;
+ };
+ shadow-scale-y = "scale-y";
+ },
+ );
},
- # Dim all app windows besides systems stuff
- {
- match = "focused = 0 && window_type = 'normal' && class_g != 'Rofi'";
- dim = 0.45;
- }
)
+
diff --git a/config/rofi/config.rasi b/config/rofi/config.rasi
index f3d58f7..1b84f28 100644
--- a/config/rofi/config.rasi
+++ b/config/rofi/config.rasi
@@ -1,142 +1,145 @@
-configuration {
- display-run: "# ";
- display-drun: "App ";
- font: "Inter 14";
- auto-select: false;
- terminal: "terminator";
- run-shell-command: "{terminal} -e \"bash -c '{cmd};bash'\"";
- separator-style: "solid";
- show-icons: true;
- kb-row-last: "";
- kb-row-first: "";
- kb-move-front: "Home";
- kb-move-end: "End";
- kb-element-next: "Alt+Tab";
- kb-element-prev: "Alt+Shift+Tab";
- kb-row-select: "Tab";
- kb-row-down: "Control+n";
- kb-row-up: "Control+p";
- kb-clear-line: "Control+a";
- click-to-exit: false;
- disable-history: false;
- run,drun {
- fallback-icon: "exec";
- }
+* {
+ /* -- Palette, matches colors{} in awesome rc.lua -- */
+ bg0: #111111; /* colors.background */
+ bg1: #1a1a1a; /* colors.background_alt */
+ fg0: #d3dae3; /* colors.foreground */
+ fg-selected: #ffffff; /* colors.white */
+ accent: #616161; /* colors.accent */
+ accent-alt: #6ba0e8; /* colors.accent_alt */
+ red: #e35b5b; /* colors.red */
+ disabled: #707880; /* colors.disabled */
+
+ font: "JetBrainsMono Nerd Font 14";
+
+ background-color: transparent;
+ text-color: @fg0;
}
window {
- width: 700px;
- background-color: #212121;
- border: 0;
- padding: 0;
- children: [ vertbox ];
- orientation: vertical;
- children: [ inputbar, listview ];
- spacing: 0;
+ transparency: "real";
+
+ /* Anchor top-center, right below the wibar. */
+ location: north;
+ anchor: north;
+ y-offset: 38px;
+
+ width: 32em;
+ height: 26em; /* fixed — box size no longer changes with result count */
+
+ background-color: @bg0;
+ border: 3px;
+ border-color: @accent;
+ border-radius: 13px; /* matches gears.shape.rounded_rect radius in rc.lua */
+ padding: 14px;
}
-mode-switcher {
- margin: 0;
- expand: true;
-}
-
-button {
- font: "Inter 13";
- expand: false;
- padding: 3px 15px 7px 20px;
- text-color: #707880;
- border: 2px 0 0 0;
- border-color: transparent;
-}
-
-button selected.normal {
- text-color: #d3dae3;
- border-color: #5294e2;
- border: 2px 0 0 0;
- background-color: transparent;
-}
-
-error-message {
- border: 0;
- background-color: #212121;
- padding: 10px 25px;
+mainbox {
+ children: [ inputbar, message, listview, mode-switcher ];
+ spacing: 10px;
+ background-color: transparent;
}
+/* -- Search field -- */
inputbar {
- font: "Inter 15";
- background-color: #212121;
- border-color: #1c1c1c;
- border: 0 0 1px solid 0;
- padding: 10px 15px;
- children: [ prompt, entry, num-filtered-rows, textbox-slash, num-rows ];
-}
-
-textbox-slash {
- padding: 0 5px;
- content: "/";
- expand: false;
- text-color: #707880;
-}
-
-entry {
- placeholder: "";
- text-color: #d3dae3;
+ children: [ prompt, entry ];
+ spacing: 10px;
+ background-color: @bg1;
+ border-radius: 10px;
+ padding: 10px 14px;
}
prompt {
- text-color: #5294e2;
+ text-color: @accent-alt;
}
-num-filtered-rows,
-num-rows {
- text-color: #707880;
+entry {
+ placeholder: "Search";
+ placeholder-color: @disabled;
+ text-color: @fg0;
+ cursor: text;
}
+/* -- List/grid toggle icons, top-right (matches screenshot) -- */
+mode-switcher {
+ enabled: false; /* flip to true if you use rofi's built-in mode tabs */
+}
+
+/* -- Results -- */
listview {
- scrollbar: false;
- expand: true;
- border: 0 0 1px 0;
- border-color: #1c1c1c;
- padding: 0;
- background-color: #212121;
- children: [element-icon, element-text];
-}
-
-scrollbar {
- handle-color: #707880;
- border-radius: 5px;
-}
-
-toolbar {
- orientation: horizontal;
- children: [ mode-switcher ];
- expand: false;
- padding: 0 5px 3px 0;
- background-color: #212121;
+ lines: 8;
+ columns: 1;
+ spacing: 6px;
+ scrollbar: false;
+ background-color: transparent;
+ fixed-height: true; /* box height stays locked, doesn't shrink/grow with result count */
+ dynamic: false; /* don't resize dynamically as you type either */
}
+/*
+ * Rofi tracks row state as a combination of position (normal/alternate,
+ * i.e. even/odd rows for banding) and status (normal/urgent/active/selected).
+ * Each combination needs its own selector or a competing @theme import
+ * (if you have one elsewhere in your rofi config) can still win on states
+ * this file doesn't explicitly cover. Pinning all of them here.
+ */
element {
- padding: 9px 10px;
- cursor: default;
+ padding: 10px 12px;
+ border-radius: 10px;
+ orientation: horizontal;
}
-element.normal.normal,
-element.normal.urgent,
-element.normal.active,
-element.alternate.normal,
-element.alternate.urgent,
-element.alternate.active {
- background-color: #212121;
- text-color: #d3dae3;
+element normal.normal,
+element alternate.normal {
+ background-color: @bg1;
+ text-color: @fg0;
}
-element.selected.normal,
-element.selected.urgent,
-element.selected.active {
- background-color: #424242;
- text-color: #d3dae3;
+element normal.urgent,
+element alternate.urgent {
+ background-color: @bg1;
+ text-color: @red;
+}
+
+element normal.active,
+element alternate.active {
+ background-color: @bg1;
+ text-color: @accent-alt;
+}
+
+element selected.normal {
+ background-color: @accent;
+ text-color: @fg-selected;
+}
+
+element selected.urgent {
+ background-color: @red;
+ text-color: @fg-selected;
+}
+
+element selected.active {
+ background-color: @accent-alt;
+ text-color: @bg0;
}
element-icon {
- padding: 0 7px 0 0;
+ size: 24px;
+ padding: 0 12px 0 0;
+ vertical-align: 0.5;
+ background-color: transparent;
+}
+
+element-text {
+ vertical-align: 0.5;
+ text-color: inherit;
+ background-color: transparent;
+}
+
+message {
+ background-color: @bg1;
+ border-radius: 10px;
+ padding: 8px 12px;
+}
+
+textbox {
+ text-color: @fg0;
}
diff --git a/install.sh b/install.sh
index e5409e5..4ebfae3 100755
--- a/install.sh
+++ b/install.sh
@@ -88,7 +88,7 @@ if [ "$DO_LINKS" = true ]; then
link_file "$DOTFILES_DIR/config/alacritty" "$HOME/.config/alacritty"
link_file "$DOTFILES_DIR/config/lf" "$HOME/.config/lf"
link_file "$DOTFILES_DIR/config/picom" "$HOME/.config/picom"
- link_file "$DOTFILES_DIR/config/polybar" "$HOME/.config/polybar"
+ link_file "$DOTFILES_DIR/config/awesome" "$HOME/.config/awesome"
link_file "$DOTFILES_DIR/config/rofi" "$HOME/.config/rofi"
link_file "$DOTFILES_DIR/config/nvim" "$HOME/.config/nvim"
link_file "$DOTFILES_DIR/scripts/bin" "$HOME/.local/bin"
@@ -153,11 +153,11 @@ if [ "$DO_INSTALL" = true ]; then
# core utilities
git unzip jq fzf tree direnv make
# modern cli replacements
- lf fd ripgrep bat delta
+ lf fd ripgrep bat delta lazygit
# shell & terminal
fish-shell alacritty
# build & dev tools
- base-devel valgrind tree-sitter-cli go
+ base-devel valgrind tree-sitter-cli go
# system
pfetch fuse
# window manager & desktop