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