aboutsummaryrefslogtreecommitdiffstats
path: root/SPEC.md
diff options
context:
space:
mode:
Diffstat (limited to 'SPEC.md')
-rw-r--r--SPEC.md208
1 files changed, 208 insertions, 0 deletions
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-<scheme>.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.