mirror of
https://github.com/outbackdingo/hyprcosmic.git
synced 2026-09-02 09:39:43 +00:00
The bar had six modules and one dead click: pulseaudio's on-click ran pavucontrol, which is not installed. It now opens `cosmic-settings sound`, with middle-click as a mute toggle. Added: mpris, bluetooth, temperature, idle_inhibitor, privacy, a swaync notification button, and power-profiles- daemon -- and HyDE's pill styling, so each module is its own rounded chip rather than text in a row. No backlight module. This machine's panel has no sysfs backlight interface, so it would render as a permanent error. The rest of this is about the icons, which have now been got wrong enough times to deserve a mechanism. Private Use Area characters do not survive being typed. Writing the previous version I put a comment at the top of the file saying every glyph was an escape, then typed literal glyphs into the same file; the codepoint dump found `format-bluetooth` had picked up a stray U+F293 and another field had two glyphs where I had written one. Nothing errors -- waybar is perfectly happy to render a label that is one space. So the config is generated, not written. config.jsonc.in is pure ASCII with @@TOKEN@@ placeholders, generate-config.py holds the name-to-codepoint table and emits `\uXXXX` escapes, and it asserts its own output `.isascii()` before writing. A hand-typed glyph now cannot reach the file. The delimiter is doubled because single `@NAME@` collided with wpctl's `@DEFAULT_AUDIO_SINK@`, which the generator caught as an unknown token rather than mangling. Every codepoint was checked against the installed font with `fc-list ":charset=..."`. HyDE's own values do not all survive that: its muted glyph U+FA80 is an old Material Design Icons codepoint that Nerd Fonts v3 moved, so copying upstream verbatim would have shipped tofu. Three were replaced. The font stack named "FontAwesome 6 Free" first, which resolves to the Regular face and carries a fraction of the icon set -- the icons that did appear were coming from accidental per-character fontconfig fallback. JetBrainsMono Nerd Font goes first now. One CSS note, because the failure mode is not obvious: GTK has no `:empty` pseudo-class, and an unknown pseudo-class does not skip the rule, it rejects the whole stylesheet and waybar exits 1. `#tray:empty` took the bar down. install-assets.sh grows a third category. The template and the generator live under config/ but must not be installed -- a file full of placeholders sitting next to the real config is a coin toss for whoever opens one first -- and the audit refuses to run until every file is classified, which is exactly what it is for.
147 lines
4.0 KiB
CSS
147 lines
4.0 KiB
CSS
/* Geometry and layout for the HyprCosmic bar.
|
|
*
|
|
* No colour literals: every colour here is a name defined by palette.css and
|
|
* possibly re-pointed by bridge-hyde.css. That separation is what lets a theme
|
|
* change the palette without touching a single rule.
|
|
*
|
|
* The look is HyDE's: a strip carrying rounded pills rather than a flat row of
|
|
* text. HyDE gets its pills to float by making the bar itself transparent and
|
|
* letting the compositor blur the desktop behind them; cosmic-comp has no
|
|
* rule-driven blur, so the bar keeps a background here and the pills lift off
|
|
* it instead. See bridge-hyde.css for the two colours that implements.
|
|
*/
|
|
|
|
* {
|
|
/* JetBrainsMono Nerd Font first, and it has to be first.
|
|
*
|
|
* This previously named "FontAwesome 6 Free", which is not even the
|
|
* installed family's real name ("Font Awesome 6 Free") -- fontconfig's
|
|
* fuzzy matching resolved it anyway, to the Regular face, which carries
|
|
* only a small subset of the icon set. Every glyph outside that subset
|
|
* then came from whatever fallback fontconfig picked per character, so the
|
|
* bar's icons were only accidentally consistent.
|
|
*
|
|
* The Nerd Font carries the whole icon set and the text, so naming it
|
|
* first makes one font answer for both. Every codepoint in config.jsonc
|
|
* was checked against this family specifically. */
|
|
font-family: "JetBrainsMono Nerd Font", "Noto Sans", sans-serif;
|
|
font-size: 13px;
|
|
border: none;
|
|
border-radius: 0;
|
|
min-height: 0;
|
|
}
|
|
|
|
window#waybar {
|
|
background: @bar-bg;
|
|
color: @bar-fg;
|
|
}
|
|
|
|
/* Workspaces: pills, with the active one filled rather than underlined. */
|
|
#workspaces {
|
|
margin: 0 4px;
|
|
}
|
|
|
|
#workspaces button {
|
|
padding: 0 10px;
|
|
margin: 4px 2px;
|
|
border-radius: 10px;
|
|
color: @muted;
|
|
background: transparent;
|
|
}
|
|
|
|
#workspaces button.active {
|
|
color: @wb-act-fg;
|
|
background: @accent;
|
|
}
|
|
|
|
#workspaces button:hover {
|
|
color: @wb-hvr-fg;
|
|
background: @wb-hvr-bg;
|
|
}
|
|
|
|
#taskbar button {
|
|
padding: 0 6px;
|
|
margin: 4px 1px;
|
|
border-radius: 10px;
|
|
background: transparent;
|
|
}
|
|
|
|
#taskbar button.active {
|
|
background: @module-bg;
|
|
}
|
|
|
|
#taskbar button:hover {
|
|
background: @wb-hvr-bg;
|
|
}
|
|
|
|
/* Every status module gets the same pill. Listed one per line because waybar
|
|
* takes the CSS id from the module name with `/` turned into `-`, so these are
|
|
* not guessable from the config and are worth being able to read down. */
|
|
#mpris,
|
|
#clock,
|
|
#privacy,
|
|
#idle_inhibitor,
|
|
#custom-swaync,
|
|
#bluetooth,
|
|
#pulseaudio,
|
|
#network,
|
|
#temperature,
|
|
#cpu,
|
|
#memory,
|
|
#power-profiles-daemon,
|
|
#battery,
|
|
#tray {
|
|
padding: 0 10px;
|
|
margin: 4px 2px;
|
|
border-radius: 10px;
|
|
background: @module-bg;
|
|
}
|
|
|
|
#clock {
|
|
font-weight: bold;
|
|
}
|
|
|
|
/* mpris renders nothing when no player is running. Without this it would still
|
|
* draw an empty pill, so the padding goes away with the content. */
|
|
#mpris {
|
|
padding: 0;
|
|
background: transparent;
|
|
}
|
|
|
|
#mpris.playing,
|
|
#mpris.paused {
|
|
padding: 0 10px;
|
|
background: @module-bg;
|
|
}
|
|
|
|
/* Same reasoning: privacy is only present while something is capturing. */
|
|
#privacy {
|
|
padding: 0;
|
|
background: transparent;
|
|
}
|
|
|
|
#privacy-item {
|
|
padding: 0 8px;
|
|
margin: 4px 2px;
|
|
border-radius: 10px;
|
|
background: @module-bg;
|
|
color: @warning;
|
|
}
|
|
|
|
/* States. These recolour the text inside the pill rather than the pill, so a
|
|
* warning cannot make a module unreadable against its own background. */
|
|
#battery.warning { color: @warning; }
|
|
#battery.critical { color: @critical; }
|
|
#temperature.critical { color: @critical; }
|
|
#network.disconnected { color: @critical; }
|
|
#pulseaudio.muted { color: @muted; }
|
|
#idle_inhibitor.activated { color: @accent; }
|
|
#custom-swaync.notification { color: @accent; }
|
|
#custom-swaync.dnd-none,
|
|
#custom-swaync.dnd-notification { color: @muted; }
|
|
|
|
/* No `#tray:empty` rule to hide the pill when nothing is in the tray: GTK's
|
|
* CSS has no :empty pseudo-class and rejects the whole stylesheet for it,
|
|
* which is fatal rather than cosmetic. waybar exits and the bar never appears.
|
|
*/
|