From 0ce886b20210ac0c0fc18cc1d7cb029c55eb7a60 Mon Sep 17 00:00:00 2001 From: Ivan Malison Date: Sat, 11 Apr 2026 12:30:37 -0700 Subject: [PATCH] Fix taffybar host CSS composition --- .../config/taffybar/end-widget-colors.css | 64 +++++++++--------- dotfiles/config/taffybar/end-widget-solid.css | 50 ++++++++++++++ dotfiles/config/taffybar/ryzen-shine.css | 50 +------------- dotfiles/config/taffybar/taffybar.css | 39 ++++++----- dotfiles/config/taffybar/taffybar.hs | 10 +-- nixos/secrets/gws-client-secret.json.age | Bin 3401 -> 3467 bytes 6 files changed, 113 insertions(+), 100 deletions(-) create mode 100644 dotfiles/config/taffybar/end-widget-solid.css diff --git a/dotfiles/config/taffybar/end-widget-colors.css b/dotfiles/config/taffybar/end-widget-colors.css index 25e826a9..0476e336 100644 --- a/dotfiles/config/taffybar/end-widget-colors.css +++ b/dotfiles/config/taffybar/end-widget-colors.css @@ -1,82 +1,83 @@ /* End-widget color rotation. * - * Defines a 5-color palette and cycles through it using :nth-child(). - * End widgets are children of their own container box in taffybar's layout, - * so nth-child counts only among siblings in that box. - * - * NOTE: These rules also match workspace .outer-pad elements. - * taffybar.css resets workspace pills via `.workspaces .outer-pad` which - * has equal specificity but comes later in the cascade, so it wins. + * End widgets get semantic palette classes from Haskell (`.end-widget` plus + * `.end-slot-N`) when they are packed into the bar. That keeps the CSS simple + * and avoids relying on GTK's `:nth-child(...)` matching behavior. * * To change the palette, edit the @define-color values below. - * To add more colors to the rotation, add end-color-6-* etc. and a - * corresponding :nth-child(Nn+6) rule block (updating N in all selectors). + * To add more colors to the rotation, add end-color-6-* etc. and a matching + * `.end-slot-6` rule. */ /* --- Rotation palette (5 colors) --- */ /* 1 — indigo */ -@define-color end-color-1-bg rgba(50, 60, 160, 0.92); +@define-color end-color-1-bg rgb(50, 60, 160); @define-color end-color-1-fg #d5d8f8; -@define-color end-color-1-border rgba(90, 100, 210, 0.60); +@define-color end-color-1-border rgb(90, 100, 210); /* 2 — purple */ -@define-color end-color-2-bg rgba(110, 45, 160, 0.92); +@define-color end-color-2-bg rgb(110, 45, 160); @define-color end-color-2-fg #e8d5f8; -@define-color end-color-2-border rgba(155, 85, 210, 0.60); +@define-color end-color-2-border rgb(155, 85, 210); /* 3 — emerald */ -@define-color end-color-3-bg rgba(25, 130, 75, 0.92); +@define-color end-color-3-bg rgb(25, 130, 75); @define-color end-color-3-fg #c8f5e0; -@define-color end-color-3-border rgba(55, 190, 115, 0.60); +@define-color end-color-3-border rgb(55, 190, 115); /* 4 — teal */ -@define-color end-color-4-bg rgba(20, 120, 140, 0.92); +@define-color end-color-4-bg rgb(20, 120, 140); @define-color end-color-4-fg #d0f2f8; -@define-color end-color-4-border rgba(50, 175, 200, 0.60); +@define-color end-color-4-border rgb(50, 175, 200); /* 5 — rose */ -@define-color end-color-5-bg rgba(160, 40, 70, 0.92); +@define-color end-color-5-bg rgb(160, 40, 70); @define-color end-color-5-fg #f8d5e0; -@define-color end-color-5-border rgba(210, 80, 115, 0.60); +@define-color end-color-5-border rgb(210, 80, 115); /* --- Color rotation rules --- */ -/* Slot 1: indigo (child 1, 6, 11, ...) */ -.outer-pad:nth-child(5n+1) { +/* Slot 1: indigo */ +.outer-pad.end-widget.end-slot-1 { background-color: @end-color-1-bg; + background-image: none; border-color: @end-color-1-border; color: @end-color-1-fg; box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30); } -/* Slot 2: purple (child 2, 7, 12, ...) */ -.outer-pad:nth-child(5n+2) { +/* Slot 2: purple */ +.outer-pad.end-widget.end-slot-2 { background-color: @end-color-2-bg; + background-image: none; border-color: @end-color-2-border; color: @end-color-2-fg; box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30); } -/* Slot 3: emerald (child 3, 8, 13, ...) */ -.outer-pad:nth-child(5n+3) { +/* Slot 3: emerald */ +.outer-pad.end-widget.end-slot-3 { background-color: @end-color-3-bg; + background-image: none; border-color: @end-color-3-border; color: @end-color-3-fg; box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30); } -/* Slot 4: teal (child 4, 9, 14, ...) */ -.outer-pad:nth-child(5n+4) { +/* Slot 4: teal */ +.outer-pad.end-widget.end-slot-4 { background-color: @end-color-4-bg; + background-image: none; border-color: @end-color-4-border; color: @end-color-4-fg; box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30); } -/* Slot 5: rose (child 5, 10, 15, ...) */ -.outer-pad:nth-child(5n+5) { +/* Slot 5: rose */ +.outer-pad.end-widget.end-slot-5 { background-color: @end-color-5-bg; + background-image: none; border-color: @end-color-5-border; color: @end-color-5-fg; box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30); @@ -85,7 +86,8 @@ /* --- SNI tray (center widget, not part of the rotation) --- */ .outer-pad.sni-tray { - background-color: @widget-tray-bg; - border-color: @widget-tray-border; + background-color: rgb(65, 70, 100); + background-image: none; + border-color: rgb(110, 115, 160); box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30); } diff --git a/dotfiles/config/taffybar/end-widget-solid.css b/dotfiles/config/taffybar/end-widget-solid.css new file mode 100644 index 00000000..eda2dbb0 --- /dev/null +++ b/dotfiles/config/taffybar/end-widget-solid.css @@ -0,0 +1,50 @@ +/* Final pass overrides for end-widget pill chrome. + * + * This is loaded after the main bar/theme CSS so the end-widget palette stays + * vivid even if earlier rules or theme rendering make the pills read too + * transparent on some hosts. + */ + +.outer-pad.end-widget.end-slot-1 { + background-color: rgb(50, 60, 160); + background-image: none; + border-color: rgb(90, 100, 210); +} + +.outer-pad.end-widget.end-slot-2 { + background-color: rgb(110, 45, 160); + background-image: none; + border-color: rgb(155, 85, 210); +} + +.outer-pad.end-widget.end-slot-3 { + background-color: rgb(25, 130, 75); + background-image: none; + border-color: rgb(55, 190, 115); +} + +.outer-pad.end-widget.end-slot-4 { + background-color: rgb(20, 120, 140); + background-image: none; + border-color: rgb(50, 175, 200); +} + +.outer-pad.end-widget.end-slot-5 { + background-color: rgb(160, 40, 70); + background-image: none; + border-color: rgb(210, 80, 115); +} + +.outer-pad.sni-tray { + background-color: rgb(65, 70, 100); + background-image: none; + border-color: rgb(110, 115, 160); +} + +.outer-pad.end-widget, +.outer-pad.sni-tray { + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.10), + inset 0 0 0 1px rgba(255, 255, 255, 0.10), + 0 10px 24px rgba(0, 0, 0, 0.30); +} diff --git a/dotfiles/config/taffybar/ryzen-shine.css b/dotfiles/config/taffybar/ryzen-shine.css index d6014fd6..3a9133db 100644 --- a/dotfiles/config/taffybar/ryzen-shine.css +++ b/dotfiles/config/taffybar/ryzen-shine.css @@ -1,3 +1,5 @@ +@import url("taffybar.css"); + /* Host-specific density tweaks for ryzen-shine. Keep the same visual style, * but shrink the bar back down after the upstream sizing change. */ @@ -5,51 +7,3 @@ .taffy-box { font-size: 10pt; } - -.outer-pad { - margin: 2px 3px; -} - -.inner-pad { - padding: 1px 8px; -} - -.icon-label > .icon { - padding-right: 8px; -} - -.ram-swap .icon-label > .icon { - min-width: 18px; - padding-right: 6px; -} - -.workspaces .outer-pad { - margin: 2px 2px; -} - -.workspaces .inner-pad { - padding: 1px 2px 1px 8px; -} - -.workspace-label { - font-size: 9pt; -} - -.workspaces .overlay-box .workspace-label { - padding: 1px 4px 3px 10px; -} - -.window-icon-container { - padding: 0px 3px; -} - -.auto-size-image, .sni-tray { - padding: 0px 3px; -} - -.sni-tray-expand-toggle, -.sni-tray-edit-toggle, -.sni-tray-settings-toggle { - padding: 0px 3px; - margin-left: 2px; -} diff --git a/dotfiles/config/taffybar/taffybar.css b/dotfiles/config/taffybar/taffybar.css index dd15edbb..f552fbbf 100644 --- a/dotfiles/config/taffybar/taffybar.css +++ b/dotfiles/config/taffybar/taffybar.css @@ -1,8 +1,12 @@ +@import url("theme.css"); +@import url("end-widget-colors.css"); +@import url("end-widget-solid.css"); + /* Widget/layout styling for taffybar. * - * Colors live in `theme.css`, and the end-widget palette lives in - * `end-widget-colors.css`. Both are loaded explicitly from `cssPaths` so they - * hot-reload reliably and do not depend on GTK's `@import` handling. + * This file is the single CSS entrypoint for the shared bar theme. Supporting + * stylesheets are pulled in via `@import` so GTK sees one user stylesheet per + * host rather than several separately loaded files with fragile precedence. */ /* Base typography + foreground color for the bar itself. @@ -15,7 +19,7 @@ /* Most text should come from Iosevka Aile; icon glyphs (Font Awesome / Nerd Font PUA) should come from a Nerd Font family to avoid tiny fallback glyphs. */ font-family: "Iosevka Aile", "Iosevka Nerd Font", "Iosevka NF", "Noto Sans", sans-serif; - font-size: 11pt; + font-size: 10.5pt; font-weight: 600; color: @font-color; text-shadow: none; @@ -48,13 +52,14 @@ padding: 0px 4px; } -/* The main bar container. border-radius matches the widget squircles (6px) - so the bar itself has softly rounded corners. */ +/* The main bar container. Keep the bar and widget pills aligned so the whole + surface reads as one rounded system rather than a mix of sharp and round + shapes. */ .taffy-box { border-width: 0px; padding: 0px; margin: 0px; - border-radius: 6px; + border-radius: 10px; box-shadow: none; background-color: @bar-background; background-image: none; @@ -62,12 +67,12 @@ /* Each widget is wrapped in outer-pad > inner-pad > contents by buildContentsBox (Haskell). The outer-pad draws the squircle - background pill. border-radius kept low (6px) for a more squared - "squircle" shape rather than a fully rounded pill. */ + background pill. Use a clearly rounded radius so the pill silhouette stays + visible even on the denser desktop monitor. */ .outer-pad { background-color: @pill-background; border: 0px; - border-radius: 6px; + border-radius: 10px; margin: 4px 4px; /* No white outline; define shape with subtle inner highlight + dark stroke. */ box-shadow: @@ -78,7 +83,7 @@ .inner-pad { padding: 2px 10px; - border-radius: 4px; + border-radius: 8px; } .contents { @@ -142,7 +147,7 @@ .workspaces .contents { box-shadow: none; - border-radius: 5px; + border-radius: 8px; border-width: 0px; border-style: solid; border-color: @transparent; @@ -153,7 +158,7 @@ /* Overlay label (workspace number) that sits inside the icon "squircle". */ padding: 1px 3px; margin: 0px; - font-size: 10pt; + font-size: 9.5pt; opacity: 0.92; font-weight: 700; transition: color .2s; @@ -231,7 +236,7 @@ .workspaces .window-icon-container.active { background-color: rgba(255, 255, 255, 0.10); border: 1px solid rgba(255, 255, 255, 0.5); - border-radius: 4px; + border-radius: 7px; padding: 2px 4px; } @@ -247,7 +252,7 @@ .window-icon-container { transition: opacity .2s, box-shadow .2s; opacity: 1; - border-radius: 5px; + border-radius: 8px; transition: background-color .2s; background-color: rgba(255, 255, 255, 0.04); padding: 1px 4px; @@ -266,7 +271,7 @@ .sni-tray-settings-toggle { background-color: rgba(255, 255, 255, 0.08); border: 1px solid rgba(255, 255, 255, 0.18); - border-radius: 6px; + border-radius: 8px; padding: 0px 4px; margin-left: 3px; } @@ -343,7 +348,7 @@ .wakeup-debug-hit { background-color: rgba(255, 255, 255, 0.22); - border-radius: 5px; + border-radius: 8px; } diff --git a/dotfiles/config/taffybar/taffybar.hs b/dotfiles/config/taffybar/taffybar.hs index 54165062..af2d07ea 100644 --- a/dotfiles/config/taffybar/taffybar.hs +++ b/dotfiles/config/taffybar/taffybar.hs @@ -246,13 +246,13 @@ workspaceWindowIconGetter = -- ** Host Overrides defaultCssFiles :: [FilePath] -defaultCssFiles = ["theme.css", "end-widget-colors.css", "taffybar.css"] +defaultCssFiles = ["taffybar.css"] cssFilesByHostname :: [(String, [FilePath])] cssFilesByHostname = - [ ("imalison-home", ["theme.css", "end-widget-colors.css", "taffybar.css"]), - ("ryzen-shine", ["theme.css", "end-widget-colors.css", "taffybar.css", "ryzen-shine.css"]), - ("stevie-nixos", ["theme.css", "end-widget-colors.css", "taffybar.css"]) + [ ("imalison-home", ["taffybar.css"]), + ("ryzen-shine", ["ryzen-shine.css"]), + ("stevie-nixos", ["taffybar.css"]) ] laptopHosts :: [String] @@ -509,6 +509,8 @@ cpuWidget = cpuMonitorNew defaultGraphConfig { graphDataColors = [(0, 1, 0.5, 0.8), (1, 0, 0, 0.5)], + graphBackgroundColor = (0, 0, 0, 0), + graphBorderWidth = 0, graphLabel = Just "CPU", graphWidth = 50, graphDirection = LEFT_TO_RIGHT diff --git a/nixos/secrets/gws-client-secret.json.age b/nixos/secrets/gws-client-secret.json.age index d0dae6ae7e08c7ddcc7d53391ffc0e5da6b614f0..51fd17b5e669b01c5af3d50203dca033a0a200cf 100644 GIT binary patch literal 3467 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 exN{-SoPGJs%jaKCo_*(a_jdJ@_r+I!>`_4@< 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