aboutsummaryrefslogtreecommitdiff
path: root/todo.org
diff options
context:
space:
mode:
Diffstat (limited to 'todo.org')
-rw-r--r--todo.org105
1 files changed, 62 insertions, 43 deletions
diff --git a/todo.org b/todo.org
index 259ed6f..b67f9c0 100644
--- a/todo.org
+++ b/todo.org
@@ -204,6 +204,9 @@ Built and shipped to dotfiles 2026-07-05 in a no-approvals speedrun (4 commits =
From Craig's roam capture 2026-07-02: give the timer a GTK UI/UX like the network panel. Scope expanded via a later cj comment (queue/output-wall auto-sorted by fire time, stopwatch lap/stop + saveable runs, 5/25 configurable defaults, up to 10 timers, widget-gallery elements) — folded into the spec's Build scope and shipped.
+*** 2026-07-05 Sun @ 07:20:20 -0500 Redesign shipped — hero-on-top rebuild
+The UI/UX redesign (decided through the prototype process, final = [[file:docs/prototypes/2026-07-02-timer-panel-prototype-3.html]]) built and shipped to dotfiles in a no-approvals speedrun, 5 commits =c7ac193=..=5a863b5=: Phase 1 wtimer engine (timer repeat; recurring alarms with snooze/ringing/dismiss; =@half=/=@hour=/=+dur= alarm parse; the rebuilt configurable pomodoro cycle — work/rest short+long, long-every-N, auto vs awaiting); Phase 2 PanelModel view-data (=row_view=, ringing-first sort, per-type create options as wtimer flags, locked presets + half-past + named pomodoro cycles); Phase 3 GTK hero-on-top panel (Cairo progress ring + stopwatch analog sweep dial, per-type create strips, one transport row, close ✕/Esc); Phase 4 bar-tooltip parity. wtimer + timer suites 231 green, full =make test= green. Spec re-flipped DOING → IMPLEMENTED. Stopwatch run-save deferred to vNext. Live GTK render is the refreshed manual checklist below.
+
** TODO [#B] Desktop-settings dropdown panel :waybar:
:PROPERTIES:
:LAST_REVIEWED: 2026-06-24
@@ -607,39 +610,67 @@ Parse yay errors and provide specific, actionable fixes instead of generic error
Enhance existing indicators to show what's happening in real-time
** TODO Manual testing and validation
-*** Timer panel: apply the new package + configs, then reboot (precondition for the timer tests)
-What we're verifying: the new =timer/= package, the =timer= / =timer-panel= bin shims, and the waybar + hyprland edits are live. New files need a restow (a plain =git pull= doesn't symlink them). Quit Hyprland or run from a TTY.
+*** Timer redesign: apply the package + wtimer, clear stale timers (precondition)
+What we're verifying: the redesigned =timer/= package + =wtimer= are live. Only a =git pull= is needed — the package .py files and =wtimer= are already stowed, and this build added no new launcher files, so no restow or reboot. Clear any pre-existing timers first so a stale-shape state file (an old pomodoro item lacking the new =cfg=) can't crash =wtimer render=.
#+begin_src sh :results output
-cd ~/.dotfiles && git pull && make restow hyprland
+cd ~/.dotfiles && git pull
+wtimer cancel-all
#+end_src
-Then reboot (picks up the float rule, the 2px border, the Super+P/Shift+P + Control_R keybinds, and the bar rewire).
-*** Timer panel opens from the bar, fuzzel retired
-What we're verifying: the bar module opens the GTK panel, not the old fuzzel menu.
+Expected: the pull succeeds and the bar timer glyph goes idle (no active items).
+*** Panel opens hero-on-top; close via the ✕, Esc, and the bar
+What we're verifying: the redesigned layout renders (header, hero, CONFIGURE, queue) and every close path works.
- Click the timer module on the bar.
-Expected: the instrument-console timer panel opens floating, top-right; the old fuzzel type-menu does not appear.
-- Press q or Escape.
-Expected: the panel closes.
-*** Create a timer (preset + freeform validation)
-- Open the panel, pick the timer type, click the 5m chip, click +.
-Expected: a 5:00 timer appears in the queue and counts down live.
-- Type a bad value (e.g. "xyz") in the freeform entry.
-Expected: an inline reject reason shows and + is blocked; a valid value (e.g. "25m") adds on +.
-*** Queue auto-sorts by fire time
-- Add a 25m timer, then a 5m timer, then an alarm a few minutes out.
-Expected: the queue orders soonest-first (5m above 25m; the alarm placed by its fire time).
-*** Per-item controls: pause / cancel / promote
-- On a running timer: pause then resume; cancel; click the row to promote.
-Expected: pause freezes the value and resume continues; cancel removes it; promote makes it the bar's primary glyph.
-*** Stopwatch lap / stop / save
-- Add a stopwatch, hit Lap two or three times (name one lap via the popover), then Stop.
-Expected: laps record; Stop saves the run. Then:
-#+begin_src sh :results output
-cat ~/org/stopwatch-runs.org
-#+end_src
-Expected: an org heading for the run with a lap table (split / cumulative / optional name).
-*** 10-item cap + live countdown
+Expected: the panel opens floating top-right — a header faceplate, a HERO block for the primary item, the CONFIGURE strip, then a QUEUE well below.
+- Click the ✕ in the header; reopen; press Esc; reopen; click the bar module again.
+Expected: each of ✕, Esc, and the bar click closes the panel.
+*** Timer with repeat
+What we're verifying: the REPEAT toggle re-arms a timer on fire instead of dropping it.
+- Pick TIMER, type =10s= (fast to observe), toggle REPEAT on, click +.
+Expected: the timer appears carrying a "repeat" badge and a "timer · repeats" sub-line.
+- Let it fire.
+Expected: it notifies and immediately re-arms to a fresh full countdown rather than vanishing.
+*** Alarm: recurring day, snooze, ringing, dismiss
+What we're verifying: a recurring alarm rings (not fire-and-vanish), snooze re-arms, and dismiss re-arms a recurring one.
+- Pick ALARM, type a clock time about a minute ahead (HH:MM), select today's weekday in the day picker, set SNOOZE to 1, click +.
+Expected: the row shows the fire clock time and a weekday badge; the hero donut is a countdown ring to the fire time.
+- Let it reach the fire time.
+Expected: the hero shows RING and the bar glyph goes urgent (RING); SNOOZE and DISMISS buttons appear on the hero.
+- Click SNOOZE.
+Expected: ringing stops and the alarm re-arms one minute out.
+- Let it ring again, click DISMISS.
+Expected: ringing stops; because it is recurring it re-arms to its next matching day (a one-shot alarm would be removed instead).
+*** Pomodoro: configurable cycle, auto vs await, cycle dots
+What we're verifying: the config grid drives the cycle and the AUTO toggle switches between auto-advance and awaiting a start.
+- Pick POMODORO, tap a named cycle (e.g. Deep) to fill the grid, set WORK S to 1 (min) for a fast run, toggle AUTO off, click + ADD CYCLE.
+Expected: a pomodoro starts in work; the hero shows cycle dots and "work · cycle 1/N".
+- Let the work phase fire with AUTO off.
+Expected: it enters the rest phase awaiting a start — the hero shows "ready · start break" and a START BREAK button, and it does not count down until pressed.
+- Press START BREAK.
+Expected: the rest phase counts down; the glyph/color shifts to the break (sage) state.
+*** Stopwatch: sweep dial, lap badge, promote, stop
+What we're verifying: the analog sweep dial animates, the last-lap ghost badge shows, promote works, and STOP just stops (run-save deferred).
+- Pick STOPWATCH, click +. If it isn't the hero, promote it (the ▲ on its queue row).
+Expected: the hero donut is an analog second-hand dial sweeping once per minute (not a percentage ring); the elapsed value counts up.
+- Hit LAP a couple of times (name one via the popover).
+Expected: a "LAP m:ss" ghost badge appears beside the elapsed value and the sub-line shows the lap count.
+- Hit STOP.
+Expected: the stopwatch is removed. No =~/org/stopwatch-runs.org= entry is written — run-save is deferred to a later version.
+*** Queue sort, promote/cycle, 10-item cap
+- Add a 25m timer, a 5m timer, and an alarm a few minutes out.
+Expected: the queue orders soonest-first; a ringing alarm jumps above everything.
+- Use ‹ / › on the hero (or ▲ on a queue row) to change the primary.
+Expected: the hero (bar-slot) item changes accordingly and the bar glyph follows.
- Queue items until 10 exist.
-Expected: + disables with a reason at 10; running countdowns advance live in the panel (the wtimer watch subscription).
+Expected: + disables with a "queue is full (10/10)" reason; running countdowns advance live (the =wtimer watch= subscription).
+*** Presets: locked defaults, half-past, custom add/delete
+- On TIMER, note the default chips carry no × (locked); add a custom preset via + preset, then delete it with its ×.
+Expected: locked defaults can't be deleted; a custom preset adds and deletes cleanly.
+- On ALARM, tap the half-past chip, click +.
+Expected: an alarm is created at the next :30.
+*** Bar tooltip parity
+What we're verifying: the bar tooltip mirrors the redesign verbatim.
+- With a pomodoro, a paused timer, and a ringing alarm active, hover the bar module.
+Expected: each item lists on its own line — the pomodoro as "label cycle/iv countdown" (no phase word), the paused one with a "(paused)" suffix, the ringing one as "RING (ringing)".
*** Audio panel: apply the new shims + configs (precondition for the tests below)
What we're verifying: the new =audio=/=audio-panel=/=waybar-audio= bin shims and the hyprland.conf + waybar config edits are live. New files need a restow (a plain =git pull= doesn't symlink them). Quit Hyprland or run from a TTY — restowing live Hyprland writes a stub hyprland.conf.
#+begin_src sh :results output
@@ -685,20 +716,8 @@ Expected: it reads as a sibling of the net and bt panels; nothing overflows the
- Right-click the waybar sound module.
Expected: the panel opens (left-click still mutes, scroll still changes volume).
-*** Timer dialog: Escape cancels at every step
-What we're verifying: Escape in the real fuzzel dialogs aborts the whole flow (the fix rides fuzzel's abort exit code; the unit tests fake it, this is the live confirmation).
-- Left-click the timer module on the bar, pick "timer", then hit Escape at the Duration prompt.
-Expected: no Label prompt appears and no timer is created (bar count unchanged).
-- Left-click again and hit Escape at the very first Timer-type menu, and once more at the Label prompt after entering a duration.
-Expected: each Escape ends the flow with nothing created.
-
-*** Timer alarm: 12-hour time accepted, bad input notifies
-What we're verifying: the alarm prompt takes 12h shapes live and errors are audible instead of silent.
-- Left-click the timer module, pick "alarm", enter 2:30pm (or any 12h form), Enter through the label.
-Expected: an alarm appears on the bar showing 14:30 as its fire time.
-- Repeat with garbage like 99:99.
-Expected: a fail notification names the bad input; nothing is created.
-- Cancel the test alarm (right-click the module, pick it).
+*** SUPERSEDED — Timer fuzzel dialogs (Escape-cancel, 12h alarm entry)
+These two tests exercised the old fuzzel creation dialogs, retired when the bar's =custom/timer= on-click became =timer-panel=. The panel redesign checklist above covers the same ground: alarm entry (12h shapes, bad-input reject) is now the panel's ALARM freeform + inline validation, and the whole-flow abort is the panel's Esc/✕/bar close. Nothing to run here; kept as a pointer so the intent isn't lost.
*** Speed test streams in the panel
What we're verifying: the panel's speed test fills in as phases complete instead of dumping everything at the end (the CLI path is live-verified; this is the GTK rendering).