aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-07-02 06:00:49 -0400
committerCraig Jennings <c@cjennings.net>2026-07-02 06:00:49 -0400
commit78c4df5a7c6813412447301e6e31ecae2f4e5635 (patch)
tree80243f64383fd0ff7348bcb31a570f5ed1574e91
parenta1f1099b93c51b06c4af89fd365cf797537dee4e (diff)
downloadarchsetup-78c4df5a7c6813412447301e6e31ecae2f4e5635.tar.gz
archsetup-78c4df5a7c6813412447301e6e31ecae2f4e5635.zip
docs: timer-panel spec (DRAFT); log tonight's roam-driven waybar fixes
-rw-r--r--docs/design/2026-07-02-timer-panel-spec.org113
-rw-r--r--todo.org17
2 files changed, 130 insertions, 0 deletions
diff --git a/docs/design/2026-07-02-timer-panel-spec.org b/docs/design/2026-07-02-timer-panel-spec.org
new file mode 100644
index 0000000..2c9f7d4
--- /dev/null
+++ b/docs/design/2026-07-02-timer-panel-spec.org
@@ -0,0 +1,113 @@
+#+TITLE: Timer GTK Panel
+#+AUTHOR: Craig Jennings
+#+DATE: 2026-07-02
+#+TODO: TODO | DONE
+#+TODO: DRAFT READY DOING | IMPLEMENTED SUPERSEDED CANCELLED
+
+* DRAFT Status
+:PROPERTIES:
+:ID: 1770af2e-b093-4024-a512-ae4324a2869f
+:END:
+- [2026-07-02 Thu] DRAFT — initial spec from Craig's roam capture "give the
+ timer a gtk UI/UX like the network panel. spec this out."
+
+* Metadata
+
+| Field | Value |
+|--------+---------------------------------------------------|
+| Status | draft |
+|--------+---------------------------------------------------|
+| Owner | Craig Jennings |
+|--------+---------------------------------------------------|
+| Repo | dotfiles |
+|--------+---------------------------------------------------|
+| Kin | net panel (architecture donor), wtimer (backing), |
+| | desktop-settings panel spec (sibling) |
+|--------+---------------------------------------------------|
+
+* Problem
+
+The timer's whole UI is a chain of three fuzzel prompts (type, value, label)
+plus a fourth for cancel. That flow can't show what's already running while
+you create, can't offer one-tap presets, gives no feedback on a typo until
+the add silently fails, and pomodoro state (phase, cycle) is only visible in
+a tooltip. The 2026-07-02 styling pass made the dialogs presentable, but the
+shape is still four blind modals for what is really one small control
+surface.
+
+* Goals
+
+1. One panel, opened from the bar's timer module, that shows everything
+ running (live countdowns, pomodoro phase/cycle, paused state) and creates
+ new items without leaving it.
+2. One-tap presets for the common cases (tea, pomodoro, quick alarm) next to
+ freeform entry, with inline validation before the add.
+3. Per-item controls: pause/resume, cancel, promote to primary (the bar
+ glyph slot).
+4. wtimer stays the single owner of timer state and the notification path;
+ the panel is a view over it, never a second engine.
+
+* Design sketch
+
+** Architecture — clone the net panel's proven stack
+
+- GTK4 + gtk4-layer-shell dropdown anchored under the timer module, Blueprint
+ .blp compiled to committed .ui (=make ui=; compiler is dev-only).
+- Humble-object split: GTK-free PanelModel presenter, unit-tested to 100%,
+ with thin widget bindings; one gated AT-SPI smoke via the
+ run-panel-smoke.sh pattern.
+- Backing: shell out to the existing wtimer CLI (=add=, =toggle=, =cancel=,
+ =cycle=, =render=). =render= already emits a JSON payload; the panel polls
+ it (or subscribes to the same RTMIN+14 refresh signal) for live state.
+ wtimer's 89-case suite keeps owning the logic; panel tests fake the CLI
+ like every dotfiles suite fakes binaries.
+- Dupre WIP palette CSS shared with the net panel (same factoring the
+ desktop-settings spec calls for — one palette asset, three panels).
+
+** Layout sketch
+
+- Header row: running-item count + a Clear All button (maps to cancel-all).
+- Item list: one row per item — type glyph, label, live countdown / clock
+ time / phase+cycle for pomodoro, pause and cancel buttons, click-to-promote.
+- Create strip: four type buttons (the wtimer glyphs), preset chips per type
+ (e.g. 5m / 15m / 25m / 60m for timers), a freeform entry validated with
+ wtimer's own parsers, an optional label field.
+- Empty state: the create strip alone, centered.
+
+** What happens to the fuzzel flow
+
+The keybind/fuzzel path stays as the keyboard-fast lane (it's now styled and
+tested); the panel replaces the click-driven path on the bar module. Whether
+the fuzzel chain eventually retires is a decision below.
+
+* Decisions (Craig)
+
+** TODO Panel scope: standalone timer panel, or a page in the desktop-settings panel?
+The desktop-settings spec (sibling DRAFT) could host timers as a page.
+Standalone matches the net panel's one-domain-one-panel shape and keeps the
+timer dropdown small; folding in means one panel binary fewer. Recommend
+standalone, sharing the palette/css asset.
+
+** TODO Fuzzel flow: keep as keyboard fast lane, or retire once the panel lands?
+Keeping both costs two creation paths to maintain (though the fuzzel chain is
+small and freshly tested). Recommend keep until the panel proves itself, then
+revisit.
+
+** TODO Presets: which chips per type?
+Strawman: timer 5m/15m/25m/60m; alarm +30m/top-of-hour/07:00; pomodoro
+default cycle only; stopwatch needs none. Adjust to taste.
+
+** TODO Live updates: poll render (1s, like the bar) or a wtimer "watch" mode?
+Polling reuses what exists and matches the bar's cadence; a watch/subscribe
+mode is cleaner but grows wtimer. Recommend polling first.
+
+* Implementation phases
+
+1. PanelModel presenter + CLI-backing seam (TDD, GTK-free, 100% like the net
+ PanelModel).
+2. Blueprint UI: item list + create strip, wired to the presenter; palette
+ css factored to the shared asset.
+3. Bar integration: timer module left-click opens the panel (replacing the
+ fuzzel menu binding there), RTMIN+14 refresh keeps bar and panel in step.
+4. AT-SPI smoke + manual-testing checklist; decide the fuzzel flow's future
+ after a week of real use.
diff --git a/todo.org b/todo.org
index 37162ba..82317f0 100644
--- a/todo.org
+++ b/todo.org
@@ -497,6 +497,23 @@ Fold the existing archsetup wireguard tooling into the panel + CLI (=net vpn ...
Out of the v1 milestone; spec separately when picked up. (v1 only detects +
classifies a VPN-routed failure, it doesn't repair it.)
+** TODO [#B] Timer GTK panel :feature:waybar:
+Initial spec written 2026-07-02: [[file:docs/design/2026-07-02-timer-panel-spec.org]] (DRAFT — four decisions await Craig's review before build; net-panel Blueprint/GTK4 stack, wtimer stays the state owner).
+
+From Craig's roam capture 2026-07-02: give the timer a GTK UI/UX like the network panel.
+
+** DONE [#C] Waybar timer dialog styling :waybar:
+CLOSED: [2026-07-02 Thu]
+From Craig's roam capture 2026-07-02: style the timer module dialogs like the screenshot dialog — tighter window, icons on the selections, colon+space after the prompt.
+
+Shipped 2026-07-02 (dotfiles 9ffcba7): dialogs size to content, type menu carries the kind glyphs, prompts end ": ". Three new tests; screenshot-verified live.
+
+** DONE [#B] Waybar collapse jumps client windows :bug:waybar:hyprland:
+CLOSED: [2026-07-02 Thu]
+From Craig's roam capture 2026-07-02: collapsing/expanding (and any waybar teardown) snapped every tiled window up and back down; hold the clients still and let only the bar change.
+
+Shipped 2026-07-02 (dotfiles 4b1a4ec): waybar now runs exclusive:false and the new waybar-reserve script statically reserves the bar strip per monitor (wired as exec so config reloads re-apply it). Verified live: client geometry held constant through bar kill, relaunch, and a collapse round-trip. Eight new tests (script + pairing).
+
** TODO [#B] Desktop-settings dropdown panel :waybar:
:PROPERTIES:
:LAST_REVIEWED: 2026-06-24