From e996b6626c85f8cefb0f357d128091e350ee0ec0 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Tue, 15 Sep 2026 12:58:31 +0200 Subject: feat: a waybar bar for DP-3, themed by udt and drawn with icons Builds the bar from scratch as a consumer of unified-desktop-theme: the palette comes from there, the layout and the modules live here. No font glyphs anywhere. Every symbol is a real icon from the icon theme GTK already uses, which needs all three of waybar's mechanisms because no single one covers everything: the icon-theme config key for the taskbar and tray, `image` modules driving wb-icon/wb-lang for volume, microphone, presentation mode and the keyboard flag, and CSS background-image for the workspaces, the clock pair and the launcher. The workspace icons have to be CSS because format-icons takes text rather than paths, and faking the strip with eight custom modules would have cost click-to-switch and the active and urgent states. The language flag goes the other way: hyprland/language styles as #language with no per-language class, so the flag could not be selected, and it is an image module. Icons keep their own colours: 2466 of the theme's 5169 panel icons carry a hardcoded gradient and are not recolourable, which is the intended look here. The two icons the theme lacks are shipped instead, and the monochrome Slackware mark takes the udt accent at install time. vms_dots.sh and privacy_dots.sh lived only in ~/bin, in no repository at all. They are versioned here now, symlinked back, and their hardcoded state colours read from the palette. Installs alongside the existing bar rather than over it, so DP-1 keeps working while this one is tried on DP-3. Co-Authored-By: Claude Opus 5 --- SPEC.md | 208 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 SPEC.md (limited to 'SPEC.md') diff --git a/SPEC.md b/SPEC.md new file mode 100644 index 0000000..a4d2341 --- /dev/null +++ b/SPEC.md @@ -0,0 +1,208 @@ +# waybar-theme-udt + +A waybar bar for DP-3, themed by [unified-desktop-theme][udt] and drawn with +icons from the desktop's own icon theme rather than font glyphs. + +[udt]: ../unified-desktop-theme + +## Goal + +Three things at once: + +- **No font glyphs.** Every module that shows a symbol shows a real icon from + `Material-Black-Plum-Suru`, the theme GTK already uses. Icons keep their own + colours, because that is what every other application on this desktop shows. +- **Colours from udt.** Pill backgrounds, text and states resolve from + `palette/roles-.conf`, so switching scheme recolours this bar with + everything else. +- **Pill clusters with transitions.** The grouped-capsule layout of `idea1.png` + with the hover and state transitions of `idea2.png`. + +The current bar on DP-1 is untouched. This one installs alongside it and is +pointed at DP-3. + +## Layout + + ┌ left ──────────────────────────────┐ ┌ center ┐ ┌ right ─────────────────────┐ + [◆] [📅 Wed 15/09] [🕑 14:32] [1..8] [●●] [ open apps ] [🔊 62%] [tray] [⏻] [🇮🇹] + launcher date time workspaces vm taskbar volume tray present lang + +Each bracket is one pill. Neighbouring pills in a cluster share a background +and weld together with asymmetric corner radii; clusters are separated by +transparent gaps, so the bar reads as groups rather than a continuous strip. + +### Modules + +| Position | Module | Icon source | Notes | +| --- | --- | --- | --- | +| left | `custom/launcher` | `slackware.svg`, shipped here | Accent background, the one always-coloured pill. Opens the quickshell drawer. | +| left | `clock#date` | `x-office-calendar` | Icon then text. Calendar tooltip kept. | +| left | `clock#time` | `clock` | Icon then text. | +| left | `hyprland/workspaces` | eight themed icons, via CSS | See below. | +| left | `custom/vmdot` | coloured dots | Dots keep their shape; colours move to roles. | +| center | `wlr/taskbar` | `icon-theme` config key | Per-window application icons. | +| right | `group/wireplumber` | `image` module | Drawer group kept as it is today. | +| right | `tray` | application-provided | | +| right | `idle_inhibitor` | `image` module | Presentation mode. | +| right | `image#lang` | `flag-it.svg` / `flag-gb.svg`, shipped here | An `image` module: `hyprland/language` styles as `#language` only, with no per-language class, so a flag cannot be selected in CSS. | + +Dropped from the current bar: `custom/breaktimer`, `custom/mail`, +`custom/privacy_dots` stays only if you want it on this bar too (it is +currently listed; say if it should follow the others out). No battery, no +temperature, no cpu, no memory, no backlight: this is a desktop. + +Clock is the one module that stays text. An icon cannot say 14:32; the icon +sits before the text, which is what makes it match the rest. + +### Workspace icons + +| WS | Icon | Was | +| --- | --- | --- | +| 1 | `web-browser` | browser glyph | +| 2 | `utilities-terminal` | terminal glyph | +| 3 | `text-editor` | code glyph | +| 4 | `network-server` | matches the quickshell drawer's VM tile (`U+F233`, Font Awesome `server`) | +| 5 | `document-edit` | pen on a document: the alternate text editor lives here | +| 6 | `applications-graphics` | graphics glyph | +| 7 | `internet-chat` | chat glyph | +| 8 | `input-gaming` | joypad: games and media players | + +All eight resolve in `Material-Black-Plum-Suru` today. + +## How icons reach the bar + +Three mechanisms, because waybar offers three and no single one covers +everything. This is the part worth reading before changing anything. + +**1. Native `icon-theme` (taskbar, tray).** `wlr/taskbar` takes `icon-theme` +and `icon-size` outright. Today it asks for `Papirus`, **which is not +installed**, so GTK has been silently falling back. Pointing it at +`Material-Black-Plum-Suru` is a bug fix, not a preference. + +**2. The `image` module (volume, presentation mode).** `image` runs `exec` and +expects `$path\n$tooltip` on stdout, so a small script maps state to an icon +name, resolves it through the GTK icon theme, and prints the path. One `image` +module is one icon, so a five-state volume indicator is one module plus one +script, not five modules. + +**3. CSS `background-image` (workspaces).** Workspace buttons come from a +single `hyprland/workspaces` module and `format-icons` takes text, not paths. +Faking the strip with eight `custom` modules would lose click-to-switch and +the active/urgent states, so instead the real module keeps its behaviour, its +labels are emptied, and each button gets an icon through +`#workspaces button:nth-child(n) { background-image: url(...) }`. + +The consequence, stated plainly: **the eight workspace icon paths live in the +stylesheet, not in the config.** Changing a workspace icon means editing CSS. + +### Why the icons cannot follow the accent + +2466 of the 5169 panel icons in `Material-Black-Plum-Suru` carry a hardcoded +`oomox` gradient (`#a08fbf` to `#5a33a3`) and seven further named gradients +each. They are not monochrome and not recolourable by CSS `color`. So icons +show their own colours and do not track the scheme, which is the intended +behaviour here: they match every other application on the desktop. + +The two icons this repo ships are the exception. `slackware.svg` (from +Simple Icons) and the two flags are single-path monochrome, so `slackware.svg` +is tinted with the udt accent by a one-line `fill` substitution at install +time. The flags keep their national colours. + +## Repository layout + +Modular, one file per module, mirroring the current setup: + + config.jsonc entry point, `include`s every module file + modules/ + clock.jsonc clock#date and clock#time + hyprland/ + workspaces.jsonc + language.jsonc + custom/ + launcher.jsonc + vmdot.jsonc + extras/ + taskbar.jsonc + tray.jsonc + wireplumber.jsonc + image/ + idle_inhibitor.jsonc presentation mode, via `image` + styles/ + style.css entry point, imports the rest in order + theme.css GENERATED by udt-palette, gitignored + fonts.css + global.css #waybar, tooltip, button base rules + pills.css the cluster geometry and transitions + modules.css per-module rules, including workspace icons + icons/ + slackware.svg carries @ACCENT@, substituted on install + flag-it.svg + flag-gb.svg + bin/ + wb-icon state to icon path, for the `image` modules + vms_dots.sh moved here from ~/bin, symlinked back + privacy_dots.sh moved here from ~/bin, symlinked back + install.sh + LICENSE + README.md + +Wildcard `include` is broken in waybar 0.14, so `config.jsonc` lists every +module file explicitly. That is a waybar limitation, not a choice. + +## Palette integration + +This repo is a **consumer** of udt: it holds the bar, udt holds the colours. + +`styles/theme.css` is generated by `udt-palette` and gitignored, exactly like +every other generated file in that repo. Generating it needs two changes on +the udt side: + +**A new `[waybar]` role block.** The current one names `temperature`, +`memory`, `cpu`, `backlight` and `battery`, none of which exist on this bar. +The new roles are `launcher`, `workspaces`, `vmdots`, `taskbar`, `volume`, +`tray`, `present`, `lang`, `date`, `time`, plus the existing `main_*`, +`hover_*` and `outline`. + +**Added to all nine `roles-*.conf`.** `udt-palette --selftest` enforces that +every scheme defines the same role set, so a role added to one file and not +the rest fails the check. That is the check doing its job. + +Dot colours come from the existing `[state]` roles: `success` for a running +VM, `warning` for paused, `critical` for crashed, `info` for saved, and +`fg_faint` for shut off. Both dot scripts currently hardcode `#30D158`, +`#FFD60A`, `#FF9F0A`, `#9B32FA` and `#6E6E73`; they will read a generated +colour block instead. + +## Install + +`install.sh` follows udt's conventions: symlink what this repo owns +canonically, copy what another application owns, guard every reload. + +- Module and style files are **symlinked** into `~/.config/waybar-udt/`, so the + repo cannot drift from what is installed. +- `icons/slackware.svg` is **generated** into place with `@ACCENT@` substituted, + the same way udt generates `launcher.rasi`. +- `bin/vms_dots.sh` and `bin/privacy_dots.sh` are symlinked to `~/bin/`, + replacing the copies that live there now. **The originals are backed up + first**: they are the only copy and are not currently in any repository. +- The bar is **not** started and `~/.config/waybar` is **not** touched. Running + it is one command, printed at the end, so DP-1's bar keeps working until you + choose otherwise. + +Reload is `killall -SIGUSR2 waybar`, and `reload_style_on_change` is already on. + +## Verification + +Per udt's own rule, visual claims are measured, not reasoned about: + + grim -o DP-3 /tmp/shot.png + +`wb-icon` gets one runnable self-check: every icon name the bar asks for must +resolve in the icon theme, so a missing icon fails loudly at install time +rather than rendering as a blank pill. + +## Open questions + +1. `custom/privacy_dots` is in the keep list but was not in the ten modules you + named. On this bar or not? +2. Licence: GPLv2-only unless you say otherwise. -- cgit v1.2.3