Skip to content

feat(tasks): остаток времени, прогресс и состояние таймера в виджете «Идёт сейчас» - #24

Merged
MegaBadCoder merged 2 commits into
mainfrom
feat/current-task-widget-polish
Aug 13, 2026
Merged

feat(tasks): остаток времени, прогресс и состояние таймера в виджете «Идёт сейчас»#24
MegaBadCoder merged 2 commits into
mainfrom
feat/current-task-widget-polish

Conversation

@MegaBadCoder

Copy link
Copy Markdown
Owner

Продолжение #22. Виджет там уже работал, но выглядел бедно и не показывал, что помодоро запущен.

ИДЁТ СЕЙЧАС
▌ Рабочая сессия ● идёт ← таймер тикает по этой задаче
▌ осталось 3 ч 2 мин · 0/4
▌ ━━━━╸────────────────
▌ Математика ▷ ← можно запустить
▌ осталось 45 мин · 0/2
▌ ━━━╸─────────────────

Остаток времени и прогресс

Раньше строка говорила только название. Но смотрят на «текущую задачу» ради ответа «сколько ещё» — за ним всё равно приходилось идти в календарь. Теперь строка несёт остаток, долю пройденного окна и счётчик помидоров, а левая полоса делает блок похожим на линию текущего времени в календаре, а не на ещё один список.

Заголовок сменил число: «Текущая задача» врало, когда активных задач несколько.

Окно задачи переехало в приватный getWindow(), на котором построены и фильтр активных задач, и расчёт прогресса — разойтись они теперь не могут.

Состояние таймера в строке

СостояниеЧто видноКнопка
тикает по этой задачекрасная пульсирующая «идёт»нет
взведён, но не тикаетприглушённая «пауза»продолжает через toggleTimer
не запущен или идёт по другой задачезапускает через startTask

Кнопка убрана в «идёт» не ради вида.startTask начинает сессию с первой фазы, поэтому случайный клик по идущей задаче стирал бы уже отработанные помидоры. Такая возможность существовала до этого PR.

А в «паузе» кнопка обязана остаться. Это вскрылось на упавшем тесте: startTask только взводит сессию, тикать она начинает отдельно — так же ведут себя обе существующие кнопки в приложении. Значит сразу после клика по кнопке виджета строка попадает именно в «паузу», и если бы кнопка там пропадала, запустить таймер из виджета стало бы невозможно.

timer-store начал отдавать activeTaskId: без него строка не отличает «идёт» от «идёт по другой задаче».

Контраст в светлой теме

Строки были почти невидимы: bg-sidebar-accent/40 давал oklch(0.968) против фона сайдбара oklch(0.985) — разница меньше двух процентов. Замерено в браузере, добавлен бордер. Вторичный текст проверен отдельно: контраст ≈5:1, порог проходит.

Кнопка визуально осталась 32px, но тач-таргет расширен до 44×44 через ::before, чтобы не разрежать плотный сайдбар. Прогресс-бар и пульсация уважают prefers-reduced-motion; прогресс скрыт от скринридеров, потому что текст рядом говорит то же самое.

Проверено

Заметка про ветку

Коммиты изначально ушли в feat/sidebar-current-task-widget уже после того, как #22 был смержен, поэтому в main не попали. Здесь они вынесены в отдельную ветку и перебазированы на актуальный main.

i.seliverstov added 2 commits August 13, 2026 15:30
The widget answered "what am I on" but not "for how long" — the thing you
actually open it for — so you still had to go to the calendar. Each row now
carries the remaining time, a progress bar, and the pomodoro count, with a
left accent bar echoing the calendar's current-time line.
The window maths moved into a private getWindow(), so the active-task filter
and the progress readout are built on one definition and cannot disagree.
Header is now "Идёт сейчас": the old "Текущая задача" was singular while the
list can hold several rows.
Rows carry a border rather than relying on bg-sidebar-accent/40 alone — in
light mode that fill sat within 1.7% of the sidebar background (0.968 vs 0.985
oklch) and the rows were effectively invisible. The play button keeps its 32px
visual size but expands to a 44px hit area via ::before, and the progress fill
honours prefers-reduced-motion.
The row now says whether the timer is on this task — a red pulsing "идёт"
while it ticks, a muted "пауза" while it is armed but stopped.
This is not only a label: the play button is removed in the running state
because startTask() rewinds to the first phase, so a stray click on a live
task would discard the pomodoros already worked.
The paused state keeps a button, which resumes via toggleTimer instead of
restarting. That matters because startTask only *arms* a session — ticking
starts separately — so a row lands in `paused` immediately after the widget's
own play click. Dropping the button there would have made the widget unable to
start a timer at all.
timer-store now exposes activeTaskId; without it a row cannot tell "running"
from "running on something else".
@MegaBadCoder
MegaBadCoder merged commit 4f16409 into mainAug 13, 2026
3 checks passed
Sign up for freeto 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

@MegaBadCoder