# TODO: This should not do something depending on whether the host is a laptop or not. It # should instead match on monitor-width or scale factor. <2024-11-29> { lib, laptop ? false, laptopBacklightName ? null, scripts, }: let mkUnderline = color: { underline = { inherit color; size = 3; }; }; shellExec = cmd: ''sh -c "${cmd}"''; values = { foreground = { blue = "99d1dbff"; focus = "e78284ff"; green = "a6e3a1dd"; lavendar = "b4befedd"; mauve = "cba6f7dd"; none = "00000000"; normal = "c6ceefff"; peach = "fab387dd"; sapphire = "74c7ecdd"; teal = "94e2d5dd"; }; font = { main = "Source Code Pro:pixelsize=${ builtins.toString ( if laptop then 22 else 26 ) }"; aws = "Font Awesome 5 Free:style=solid:pixelsize=${ builtins.toString ( if laptop then 20 else 23 ) }"; }; background = { normal = "303446ff"; tag = "585b70ff"; tag2 = "45475aff"; urgent = "e78284ff"; }; backgroundBlock = { normal = {background = {color = values.background.normal;};}; urgent = {background = {color = values.background.urgent;};}; }; underline = { battery = mkUnderline values.foreground.sapphire; clock = mkUnderline values.foreground.teal; focused = mkUnderline values.foreground.focus; resources = mkUnderline values.foreground.green; title = mkUnderline values.background.tag; urgent = mkUnderline values.foreground.blue; utils = mkUnderline values.foreground.peach; weather = mkUnderline values.foreground.lavendar; }; combination = { battery.stack = [ values.backgroundBlock.normal values.underline.battery ]; clock.stack = [ values.backgroundBlock.normal values.underline.clock ]; resources.stack = [ values.backgroundBlock.normal values.underline.resources ]; utils.stack = [ values.backgroundBlock.normal values.underline.utils ]; weather.stack = [ values.backgroundBlock.normal values.underline.weather ]; }; }; in { bar = { background = values.foreground.none; foreground = values.foreground.normal; font = values.font.main; height = if laptop then 25 else 45; margin = if laptop then 5 else 10; location = "top"; layer = "bottom"; spacing = 0; border = { margin = 0; top-margin = 10; }; left = [ { river = let tag_base_setting = { map = let normal = { string = { margin = 10; text = "{id}"; }; }; in { default = normal; conditions = { "state == focused" = { string = { deco = { stack = [ {background = {color = values.background.tag;};} values.underline.focused ]; }; margin = 10; text = "{id}"; }; }; "state == invisible" = { map = { conditions = { occupied = { string = { deco = {background = {color = values.background.tag2;};}; margin = 10; text = "{id}"; }; }; "~occupied" = normal; }; }; }; "state == unfocused" = { string = { deco = {background = {color = values.background.tag2;};}; margin = 10; text = "{id}"; }; }; "state == urgent" = { string = { deco = { stack = [ {background = {color = values.background.urgent;};} values.underline.urgent ]; }; margin = 10; text = "{id}"; }; }; }; }; }; in { content = { map = { conditions = { "id == 1" = tag_base_setting; "id == 2" = tag_base_setting; "id == 3" = tag_base_setting; "id == 4" = tag_base_setting; "id == 5" = tag_base_setting; "id == 6" = tag_base_setting; "id == 7" = tag_base_setting; "id == 8" = tag_base_setting; "id == 9" = tag_base_setting; }; on-click = { left = shellExec "riverctl set-focused-tags $((1 << ({id} - 1)))"; middle = shellExec "riverctl toggle-view-tags $((1 << ({id} -1)))"; right = shellExec "riverctl toggle-focused-tags $((1 << ({id} -1)))"; }; }; }; title = { map = { conditions = {"title == \"\"" = {string = {text = "";};};}; default = { string = { max = 35; deco = values.underline.title; left-margin = 12; right-margin = 12; text = "{title}"; }; }; }; }; }; } ]; center = [ { clock = { date-format = "%d/%m/%y (%a)"; time-format = "%H:%M:%S %Z"; foreground = values.foreground.blue; content = { string = { deco = values.combination.clock; text = " {date} {time} "; }; }; }; } ]; right = [ { script = { path = scripts.mpd_song_name_script; content.map.conditions = { playing = { string = { deco = values.combination.weather; text = "{song} "; }; }; "~playing" = { string = { deco = values.combination.weather; text = ""; }; }; }; }; } { script = { path = scripts.volume_script; content.map = { on-click = shellExec "pavucontrol"; conditions = { muted = { string = { deco = values.backgroundBlock.urgent; text = " 󰝟 "; }; }; "~muted" = { string = { deco = values.combination.utils; text = "  {volume}% "; }; }; }; }; }; } { script = { path = scripts.cpu_script; content.string = { deco = values.combination.resources; text = "  {cpu}% "; }; }; } { script = { path = scripts.memory_script; content.map.conditions = { swapstate = { string = { deco = values.combination.resources; text = "  {memperc}%({swapperc}%) "; }; }; "~swapstate" = { string = { deco = values.combination.resources; text = "  {memperc}% "; }; }; }; }; } { script = { path = scripts.disk_script; content.string = { deco = values.combination.resources; text = " 󰋊 {diskspace}({diskperc})"; }; }; } ] ++ lib.optionals laptop [ { backlight = { name = laptopBacklightName; content.string = { text = "  {percent}% "; deco = values.combination.utils; }; }; } { battery = { name = "BAT0"; poll-interval = 300; content.list.items = [ { ramp = { tag = "capacity"; items = let stack = [ values.backgroundBlock.normal values.underline.battery ]; in [ { string = { text = "  {capacity}%({estimate}) "; deco = values.backgroundBlock.urgent; }; } { string = { text = "  {capacity}%({estimate}) "; deco.stack = stack; }; } { string = { text = "  {capacity}%({estimate}) "; deco.stack = stack; }; } { string = { text = "  {capacity}%({estimate}) "; deco.stack = stack; }; } { string = { text = "  {capacity}%({estimate}) "; deco.stack = stack; }; } ]; }; } ]; }; } ]; }; }