Compare commits

...

5 commits
v0.1.5 ... main

Author SHA1 Message Date
Breadway
aa34aa1319 Bump bread-theme to v0.2.8 (live-reload fix)
Some checks failed
Build and publish package / package (push) Failing after 3m57s
Mirror to GitHub / mirror (push) Successful in 56s
2026-06-17 12:55:47 +08:00
Breadway
0893724e5f Fix illegible text on light pywal palettes + hot-reload
Use bread-theme 0.2.7's luminance-picked ink (@on-*) for text on coloured
backgrounds: the active workspace pill and notification cards previously kept the
pywal foreground, which vanished when those slots came out light. Drop the
blanket label colour rule (it overrode the per-surface ink on child labels).

Switch to bread_theme::gtk::apply_app_css so the bar recolours live on
`bread-theme reload` instead of only at startup.
2026-06-17 12:40:52 +08:00
Breadway
37b9a342e1 Release 0.1.7: shared bread-theme stylesheet
Some checks failed
Mirror to GitHub / mirror (push) Successful in 27s
Build and publish package / package (push) Failing after 4m7s
Pin bread-theme v0.2.6 and load the shared ecosystem stylesheet.
2026-06-16 18:31:18 +08:00
Breadway
0cb27ec1c4 theme: load the shared bread-theme stylesheet
Call bread_theme::gtk::apply_shared() before breadbar's own rules so fonts,
palette, and generic widgets come from the one ecosystem stylesheet (and
recolour live). Keep only breadbar-specific CSS (bar window, workspace
buttons, stats, notifications, OSD). Bump bread-theme dep to v0.2.6.
2026-06-16 16:56:52 +08:00
Breadway
1959a86157 Default workspace-button rounding to 0
Some checks failed
Mirror to GitHub / mirror (push) Successful in 31s
Build and publish package / package (push) Failing after 3m55s
2026-06-15 18:51:42 +08:00
3 changed files with 42 additions and 31 deletions

6
Cargo.lock generated
View file

@ -108,8 +108,8 @@ checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
[[package]] [[package]]
name = "bread-theme" name = "bread-theme"
version = "0.1.0" version = "0.2.3"
source = "git+https://github.com/Breadway/bread-ecosystem?tag=v0.1.0#6b5f4f475f66a645b08cb865e6dda8228d23679b" source = "git+https://github.com/Breadway/bread-ecosystem?tag=v0.2.8#77417d552130281ff787e07d52541eb25e9d533b"
dependencies = [ dependencies = [
"dirs", "dirs",
"gtk4", "gtk4",
@ -119,7 +119,7 @@ dependencies = [
[[package]] [[package]]
name = "breadbar" name = "breadbar"
version = "0.1.5" version = "0.1.7"
dependencies = [ dependencies = [
"bread-theme", "bread-theme",
"futures-lite", "futures-lite",

View file

@ -1,6 +1,6 @@
[package] [package]
name = "breadbar" name = "breadbar"
version = "0.1.5" version = "0.1.7"
edition = "2021" edition = "2021"
description = "Minimal status bar and notification daemon for Hyprland on Wayland" description = "Minimal status bar and notification daemon for Hyprland on Wayland"
license = "MIT" license = "MIT"
@ -10,7 +10,7 @@ keywords = ["wayland", "hyprland", "bar", "status-bar", "gtk4"]
categories = ["gui"] categories = ["gui"]
[dependencies] [dependencies]
bread-theme = { git = "https://github.com/Breadway/bread-ecosystem", tag = "v0.1.0", features = ["gtk"] } bread-theme = { git = "https://github.com/Breadway/bread-ecosystem", tag = "v0.2.8", features = ["gtk"] }
gtk4 = { version = "0.11", features = ["v4_12"] } gtk4 = { version = "0.11", features = ["v4_12"] }
gtk4-layer-shell = "0.8" gtk4-layer-shell = "0.8"
relm4 = { version = "0.11", features = ["macros"] } relm4 = { version = "0.11", features = ["macros"] }

View file

@ -1,57 +1,68 @@
use bread_theme::{gtk as bgtk, hex_to_rgba, load_palette}; use bread_theme::{gtk as bgtk, hex_to_rgba, ink_on, load_palette};
use gtk4::CssProvider; use gtk4::CssProvider;
use std::cell::RefCell; use std::cell::RefCell;
thread_local! { thread_local! {
static PROVIDER: RefCell<Option<CssProvider>> = const { RefCell::new(None) };
static USER_PROVIDER: RefCell<Option<CssProvider>> = const { RefCell::new(None) }; static USER_PROVIDER: RefCell<Option<CssProvider>> = const { RefCell::new(None) };
} }
fn load_css() -> String { fn load_css() -> String {
let p = load_palette(); let p = load_palette();
// breadbar-specific rules only — fonts, base colours, and generic widgets
// come from the shared ecosystem stylesheet (applied first in `apply()`).
// Colour is set on each surface (bar, active workspace pill, notification
// card) and child labels inherit it, so text stays legible whatever lightness
// pywal hands a given slot. `on_*` are luminance-picked ink (black/white) for
// that background — the pywal hues themselves are untouched.
format!( format!(
"* {{ font-family: 'Varela Round', sans-serif; font-size: 14px; }}\ "window.breadbar {{ background-color: {bg_rgba}; color: {on_bg}; border-radius: 0; }}\
window.breadbar {{ background-color: {bg_rgba}; border-radius: 0; }}\ .workspace-btn {{ background: transparent; opacity: 0.45;\
label {{ color: {fg}; }}\ border-radius: 0; border: none; outline: none; box-shadow: none;\
.workspace-btn {{ background: transparent; color: {fg}; opacity: 0.45;\
border-radius: 0 0 8px 8px; border: none; outline: none; box-shadow: none;\
min-width: 24px; padding: 4px 8px; }}\ min-width: 24px; padding: 4px 8px; }}\
.workspace-btn:hover {{ opacity: 0.8; }}\ .workspace-btn:hover {{ opacity: 0.8; }}\
.workspace-btn.active {{ background: {accent}; opacity: 1; }}\ .workspace-btn.active {{ background: {accent}; color: {on_accent}; opacity: 1; }}\
.stats-box {{ margin-right: 8px; }}\ .stats-box {{ margin-right: 8px; }}\
.stat-pair {{ margin-right: 12px; }}\ .stat-pair {{ margin-right: 12px; }}\
.stat-icon {{ margin-right: 5px; }}\ .stat-icon {{ margin-right: 5px; }}\
.bt-icon {{ margin-right: 12px; }}\ .bt-icon {{ margin-right: 12px; }}\
window.breadbar-notification {{ background-color: alpha({bg_plain}, 0.95); }}\ window.breadbar-notification {{ background-color: alpha({bg_plain}, 0.95); color: {on_bg}; }}\
.notification-card {{ background: {surface}; border-radius: 8px;\ .notification-card {{ background: {surface}; color: {on_surface}; border-radius: 8px;\
padding: 12px; margin-bottom: 8px; }}\ padding: 12px; margin-bottom: 8px; }}\
.notification-summary {{ font-weight: bold; color: {fg}; }}\ .notification-summary {{ font-weight: bold; }}\
.notification-app {{ color: {fg}; opacity: 0.6; }}\ .notification-app {{ opacity: 0.6; }}\
.notification-body {{ color: {fg}; }}\ window.breadbar-osd {{ background-color: alpha({bg_plain}, 0.95); color: {on_bg}; border-radius: 8px; }}\
window.breadbar-osd {{ background-color: alpha({bg_plain}, 0.95); border-radius: 8px; }}\ .osd-kind {{ opacity: 0.75; font-size: 12px; }}\
.osd-kind {{ color: {fg}; opacity: 0.75; font-size: 12px; }}\ .osd-pct {{ font-weight: bold; font-size: 12px; }}\
.osd-pct {{ color: {fg}; font-weight: bold; font-size: 12px; }}\
progressbar.osd-bar {{ min-height: 8px; }}\ progressbar.osd-bar {{ min-height: 8px; }}\
progressbar.osd-bar trough {{ background-image: none; background-color: {trough}; border-radius: 4px; min-height: 8px; }}\ progressbar.osd-bar trough {{ background-image: none; background-color: {trough}; border-radius: 4px; min-height: 8px; }}\
progressbar.osd-bar trough progress {{ background-image: none; background-color: {accent}; border-radius: 4px; min-height: 8px; }}", progressbar.osd-bar trough progress {{ background-image: none; background-color: {accent}; border-radius: 4px; min-height: 8px; }}",
bg_plain = p.background, bg_plain = p.background,
bg_rgba = hex_to_rgba(&p.background, 0.92), bg_rgba = hex_to_rgba(&p.background, 0.92),
surface = p.color0, surface = p.color0,
fg = p.foreground, accent = p.color4,
accent = p.color4, on_bg = ink_on(&p.background),
trough = hex_to_rgba(&p.color4, 0.25), on_surface = ink_on(&p.color0),
on_accent = ink_on(&p.color4),
trough = hex_to_rgba(&p.color4, 0.25),
) )
} }
/// Returns the current foreground colour (used for icon tinting in the stats bar). /// Returns the ink colour for icon tinting in the stats bar — the same
/// luminance-picked colour the bar's text uses, so icons stay legible on the bar
/// whatever lightness pywal gives the background.
pub fn fg_color() -> String { pub fn fg_color() -> String {
load_palette().foreground ink_on(&load_palette().background).to_string()
} }
/// Apply (or reload) the theme CSS. Safe to call from `glib::MainContext::invoke`. /// Apply (or reload) the theme CSS. Safe to call from `glib::MainContext::invoke`.
pub fn apply() { pub fn apply() {
let css = load_css(); // Shared ecosystem base (fonts, palette, generic widgets) — applied first
PROVIDER.with(|cell| bgtk::apply_css(&css, cell)); // (and self-reloading) so breadbar's own rules below layer on top.
bgtk::apply_shared();
// breadbar's own rules, hot-reloaded on `bread-theme reload`: the closure
// re-reads the pywal palette each time so the bar recolours without restart.
bgtk::apply_app_css(load_css);
let home = std::env::var("HOME").unwrap_or_default(); let home = std::env::var("HOME").unwrap_or_default();
let user_path = std::path::PathBuf::from(format!("{home}/.config/breadbar/style.css")); let user_path = std::path::PathBuf::from(format!("{home}/.config/breadbar/style.css"));