waybar: add waybar module
This commit is contained in:
		
							parent
							
								
									b424cc1c1c
								
							
						
					
					
						commit
						23758a11c1
					
				
					 3 changed files with 243 additions and 0 deletions
				
			
		
							
								
								
									
										13
									
								
								modules/waybar/default.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								modules/waybar/default.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | |||
| { | ||||
|   config, | ||||
|   lib, | ||||
|   pkgs, | ||||
|   doctrine, | ||||
|   ... | ||||
| }: | ||||
| doctrine.lib.mkModule { | ||||
|   inherit config; | ||||
|   name = "waybar"; | ||||
|   hm = ./hm.nix; | ||||
|   options = ./options.nix; | ||||
| } | ||||
							
								
								
									
										207
									
								
								modules/waybar/hm.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										207
									
								
								modules/waybar/hm.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,207 @@ | |||
| { | ||||
|   lib, | ||||
|   pkgs, | ||||
|   cfg, | ||||
|   doctrine, | ||||
|   ... | ||||
| }: | ||||
| with lib; { | ||||
|   programs.waybar = { | ||||
|     enable = true; | ||||
|     settings = { | ||||
|       mainBar = { | ||||
|         layer = "top"; | ||||
|         position = "top"; | ||||
|         height = 20; | ||||
|         spacing = 0; | ||||
| 
 | ||||
|         modules-left = [ | ||||
|           "sway/workspaces" | ||||
|           "sway/mode" | ||||
|         ]; | ||||
|         modules-center = [ | ||||
|           "clock" | ||||
|         ]; | ||||
| 
 | ||||
|         modules-right = | ||||
|           [ | ||||
|             "keyboard-state" | ||||
|             "privacy" | ||||
|             "idle_inhibitor" | ||||
|             "cpu" | ||||
|             "memory" | ||||
|             "disk" | ||||
|             "temperature" | ||||
|             "tray" | ||||
|           ] | ||||
|           ++ lists.optionals cfg.battery [ | ||||
|             "battery" | ||||
|           ]; | ||||
|         battery = mkIf cfg.battery { | ||||
|           format = "{capacity}% {icon}"; | ||||
|           format-plugged = "{capacity}% {icon}"; | ||||
|           format-icons = ["" "" "" "" "" "" "" "" "" "" ""]; | ||||
|           states = { | ||||
|             warning = 20; | ||||
|             critical = 10; | ||||
|           }; | ||||
|         }; | ||||
|         keyboard-state = { | ||||
|           capslock = true; | ||||
|           format.capslock = "{icon}"; | ||||
|           format-icons = { | ||||
|             locked = " "; | ||||
|             unlocked = ""; | ||||
|           }; | ||||
|         }; | ||||
|         idle_inhibitor = { | ||||
|           format = "{icon}"; | ||||
|           format-icons = { | ||||
|             activated = " "; | ||||
|             deactivated = " "; | ||||
|           }; | ||||
|         }; | ||||
|         tray = { | ||||
|           icon-size = 13; | ||||
|           spacing = 8; | ||||
|         }; | ||||
|         clock = { | ||||
|           interval = 60; | ||||
|           format = "{:%A %B %d %Y %H:%M}"; | ||||
|           tooltip = false; | ||||
|         }; | ||||
|         cpu = { | ||||
|           format = " {usage}%"; | ||||
|           tooltip = false; | ||||
|         }; | ||||
|         memory = { | ||||
|           format = " {percentage}% "; | ||||
|           tooltip = true; | ||||
|           tooltip-format = "{used}/{total}"; | ||||
|         }; | ||||
|         disk = { | ||||
|           format = " {specific_used:0.0f}/{specific_total:0.0f}"; | ||||
|           unit = "GiB"; | ||||
|           tooltip = false; | ||||
|         }; | ||||
|         temperature = { | ||||
|           format = " {temperatureC}°C"; | ||||
|         }; | ||||
|         privacy = { | ||||
|           icon-size = 12; | ||||
|         }; | ||||
|       }; | ||||
|     }; | ||||
|     style = '' | ||||
|       * { | ||||
|         font-family: "${cfg.fontFamily}", monospace; | ||||
|         font-size: ${cfg.fontSize}; | ||||
|         font-weight: 500; | ||||
|         border: none; | ||||
|         box-shadow: none; | ||||
|       } | ||||
| 
 | ||||
|       /* Entire bar: fully transparent, no border */ | ||||
|       window#waybar { | ||||
|         background: transparent; | ||||
|         color: #eaeaea; | ||||
|         margin: 0; | ||||
|         padding: 0; | ||||
|       } | ||||
| 
 | ||||
|       /* Optional: small edge breathing room (comment out if you want edge-to-edge) */ | ||||
|       /* window#waybar { margin: 3px 6px 0 6px; } */ | ||||
| 
 | ||||
|       /* Module containers */ | ||||
|       .modules-left, .modules-center, .modules-right { | ||||
|         padding: 0; | ||||
|         margin: 0 6px; | ||||
|       } | ||||
| 
 | ||||
|       /* Subtle separators between modules (no boxes) */ | ||||
|       .modules-left > widget:not(:first-child), | ||||
|       .modules-center > widget:not(:first-child), | ||||
|       .modules-right > widget:not(:first-child) { | ||||
|         margin-left: 12px; | ||||
|         padding-left: 12px; | ||||
|         border-left: 1px solid rgba(255, 255, 255, 0.08); | ||||
|       } | ||||
| 
 | ||||
|       /* Tightest possible workspaces */ | ||||
|       #workspaces { padding: 0; margin: 0; } | ||||
|       #workspaces button { | ||||
|         margin: 0; | ||||
|         padding: 0 3px; | ||||
|         min-width: 0; | ||||
|         border-radius: 0; | ||||
|         background: transparent; | ||||
|         color: #cfcfcf; | ||||
|       } | ||||
|       #workspaces button:hover { | ||||
|         background: rgba(255, 255, 255, 0.06); | ||||
|       } | ||||
|       #workspaces button.active, | ||||
|       #workspaces button.focused { | ||||
|         background: rgba(255, 255, 255, 0.10); | ||||
|         color: #ffffff; | ||||
|         box-shadow: inset 0 -2px #ffffff; | ||||
|       } | ||||
|       #workspaces button.urgent { | ||||
|         background: rgba(255, 80, 80, 0.25); | ||||
|         box-shadow: inset 0 -2px #ff5050; | ||||
|       } | ||||
| 
 | ||||
|       /* Focused window title: single line, no glow */ | ||||
|       #window { | ||||
|         padding: 0 6px; | ||||
|         margin: 0; | ||||
|         color: #dedede; | ||||
|       } | ||||
| 
 | ||||
|       /* Sway mode indicator: visible only when active, no bloat */ | ||||
|       #mode { | ||||
|         padding: 0 6px; | ||||
|         margin: 0; | ||||
|         background: rgba(255, 255, 255, 0.10); | ||||
|         color: #ffffff; | ||||
|         box-shadow: inset 0 -2px #ffffff; | ||||
|       } | ||||
| 
 | ||||
|       /* Status modules — keep them flat and compact */ | ||||
|       #clock, #battery, #network, #pulseaudio, #backlight, #cpu, #memory, #temperature, #tray { | ||||
|         padding: 0 6px; | ||||
|         margin: 0; | ||||
|         background: transparent; | ||||
|         color: #eaeaea; | ||||
|       } | ||||
| 
 | ||||
|       /* States (battery, network, audio) */ | ||||
|       #battery.charging { color: #27f902; } | ||||
|       #battery.warning:not(.charging) { color: #fc8b02; } | ||||
|       #battery.critical:not(.charging) { color: #fc0000; } | ||||
| 
 | ||||
|       #network.disconnected { color: #ffb4b4; } | ||||
|       #pulseaudio.muted    { color: #9aa0a6; } | ||||
| 
 | ||||
|       /* Tray: compress icons */ | ||||
|       #tray > .passive { opacity: 0.6; } | ||||
|       #tray > .needs-attention { opacity: 1; } | ||||
| 
 | ||||
|       /* Tooltips: clean and readable */ | ||||
|       tooltip { | ||||
|         background: rgba(30, 30, 30, 0.95); | ||||
|         border: 1px solid rgba(255, 255, 255, 0.08); | ||||
|         color: #eaeaea; | ||||
|         padding: 6px 8px; | ||||
|       } | ||||
| 
 | ||||
|       /* Remove any leftover borders around everything */ | ||||
|       #custom-*, #idle_inhibitor, #privacy, #bluetooth { | ||||
|         border: none; | ||||
|         background: transparent; | ||||
|         margin: 0; | ||||
|         padding: 0 6px; | ||||
|       } | ||||
|     ''; | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										23
									
								
								modules/waybar/options.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								modules/waybar/options.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | |||
| {lib, ...}: | ||||
| with lib.types; { | ||||
|   hm = { | ||||
|     battery = lib.mkOption { | ||||
|       type = bool; | ||||
|       default = false; | ||||
|       description = '' | ||||
|         `true` to display battery info | ||||
|       ''; | ||||
|     }; | ||||
|     fontFamily = lib.mkOption { | ||||
|       type = str; | ||||
|       example = "JetBrainsMono Nerd Font"; | ||||
|       description = '' | ||||
|         needs to be a nerdfont | ||||
|       ''; | ||||
|     }; | ||||
|     fontSize = lib.mkOption { | ||||
|       type = str; | ||||
|       default = "12px"; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue