Skip to content

Bump version#8

Merged
nbucic merged 10 commits intomasterfrom
bump-version
Apr 13, 2026
Merged

Bump version#8
nbucic merged 10 commits intomasterfrom
bump-version

Conversation

@nbucic
Copy link
Copy Markdown
Owner

@nbucic nbucic commented Apr 13, 2026

No description provided.

nbucic and others added 10 commits April 13, 2026 16:36
Runs the Pest suite on every pull request (opened, synchronize, reopened)
using PHP 8.5, SQLite in-memory, and a Composer cache for fast reruns.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Four bugs prevented the HIIT timer from functioning:

1. $runner->start() was commented out in TimerScreen::start(), so tapping
   Start (or wire:init auto-start) never transitioned the cursor from idle
   to running — the JS ticker never fired and totalRemaining stayed at 0.

2. segmentLabel() used string literals ('pause', 'cooldown', etc.) in a
   match against a StateMachine enum, so the match never hit and always
   fell through to the default (phaseLabel).

3. resumeAs() in TimerCursor used clone(\$this, [...]) — not valid PHP —
   causing a fatal error whenever the user resumed from pause.

4. repLabel() called in_array(\$this->state->value, ['pause', ...]) with
   lowercase strings, but StateMachine values are uppercase ('PAUSE', etc.),
   so the rep label rendered in states where it should be hidden.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The original clone($this, [...]) was valid PHP 8.5 (RFC clone_with_v2,
voted 16-4, merged). My previous fix replacing it with new self() was
unnecessary. Restore the idiomatic form, simplified to only override
the one property that actually changes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Run history:
- HistoryEntry readonly value object + HistoryLog JSON persistence (capped at 20)
- WriteHistoryEntry queued job dispatched on program completion
- config/queue.php with background driver (sync in tests via phpunit.xml)
- TimerScreen shows last 20 runs on idle tab; greyed out for deleted programs

Timer screen restyle:
- SVG circular ring (5 px stroke, ~92 vw) as total-time visual countdown
- Ring color follows phase/state (phase color → gray pause → orange cooldown → green complete)
- Ring stays full and static during IDLE and PREPARE
- Program name pushed to the top bar on program load (not only on Start)
- Phase name, countdown digit, and rep counter stacked inside the ring
- Phase strip kept at top for structural context

PREPARE state (5-second "Get Ready" before first rep):
- New StateMachine::prepare case; added to TimerCursor::isActive()
- TimerRunner::start() enters prepare; tick() transitions to running after 5 s
- Pause blocked during prepare (discard only)
- Custom triple beep every second of the countdown; JS ticker extended to PREPARE

Long-press pause gesture:
- Hold anywhere in the ring area for 1.5 s to pause (RUNNING/PAUSE/COOLDOWN only)
- LONG_PRESS_PAUSE=all|android env flag controls platform scope
- Subtle ring dim on hold; ambient "Hold to pause" hint text

Other:
- Program editor last-phase cooldown field greyed with tooltip
- TimerProgram::all() sorts by last_used_at (was created_at)
- PHP 8.5 pipe operator in TimerProgram::load() and TimerScreen::syncCursor()
- array_first() used in TimerRunner::currentPhase()
- 81 tests, all passing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Run history:
- HistoryEntry readonly value object + HistoryLog JSON persistence (capped at 20)
- WriteHistoryEntry queued job dispatched on program completion
- config/queue.php with background driver (sync in tests via phpunit.xml)
- TimerScreen shows last 20 runs on idle tab; greyed out for deleted programs

Timer screen restyle:
- SVG circular ring (5 px stroke, ~92 vw) as total-time visual countdown
- Ring color follows phase/state (phase color → gray pause → orange cooldown → green complete)
- Ring stays full and static during IDLE and PREPARE
- Program name pushed to the top bar on program load (not only on Start)
- Phase name, countdown digit, and rep counter stacked inside the ring
- Phase strip kept at top for structural context

PREPARE state (5-second "Get Ready" before first rep):
- New StateMachine::prepare case; added to TimerCursor::isActive()
- TimerRunner::start() enters prepare; tick() transitions to running after 5 s
- Pause blocked during prepare (discard only)
- Custom triple beep every second of the countdown; JS ticker extended to PREPARE

Long-press pause gesture:
- Hold anywhere in the ring area for 1.5 s to pause (RUNNING/PAUSE/COOLDOWN only)
- LONG_PRESS_PAUSE=all|android env flag controls platform scope
- Subtle ring dim on hold; ambient "Hold to pause" hint text

Other:
- Program editor last-phase cooldown field greyed with tooltip
- TimerProgram::all() sorts by last_used_at (was created_at)
- PHP 8.5 pipe operator in TimerProgram::load() and TimerScreen::syncCursor()
- array_first() used in TimerRunner::currentPhase()
- 81 tests, all passing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pest could not resolve Tests\TestCase because the namespace was missing
from composer.json autoload-dev mappings.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@nbucic nbucic merged commit d69b329 into master Apr 13, 2026
1 check passed
@nbucic nbucic deleted the bump-version branch April 13, 2026 14:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant