Skip to content

v1.4.0 — Emergency mode, handoff notes, emoji, start of day, timeblock fixes

Choose a tag to compare

@lupinesse lupinesse released this 07 May 19:44
· 565 commits to main since this release

New features

🚨 Emergency / focus mode — strips UI to current task, smallest next action, and timer. Press 🚨 focus in timer bar, Escape to exit. Next action persists per task.

✍️ Transition handoff note — first Stop click shows a context field. Saves per task name, shown next time you start that task.

🌅 Start the day button — sets work start time; timeblock only shows untracked slots from that point. Sits below the ← Today → nav.

🎨 Category colour picker — click the coloured dot while renaming a category to open a native colour picker. Saves with the name.

😀 Task emoji — emoji button on each plan task opens a compact picker (45 common emojis + free text). Shown before task name in plan and completed sections.

📅 Meeting category — now light blue (#7EC8E3) with 📅 prefix in plan list.

🔔 Chime interval control — dropdown in Pomodoro: off / 15 / 30 / 45 / 60 min. Persists across reloads.

Bug fixes

  • Timer not ticking — liveEntry undefined in renderTimeblock crashed render on every log entry before setInterval could be reached
    • Day switch without restart — midnight rollover now detected in tickClock every 10s; auto-carries tasks and re-renders
    • Export banner null crash — checkNewDay/checkSnapshot referenced removed HTML; replaced with no-ops
    • _lastTickDate TDZ — declaration moved before first use in startup sequence
    • Task in both In Progress and Done — marking done now retires all older same-text versions; completed section deduplicates
    • Untracked slot boundary — tsEnd exactly on 30-min boundary mapped to next slot via Math.round in timeToSlot; fixed by subtracting 1 from slot index on boundary
    • Paused timer covers wrong slots — live block and covered-slot calc now cap at pause point (entry.ts + accumulatedMs), not Date.now()
    • Parent not promoted — promoteParents() runs at top of every renderPlan() call as an enforced invariant
    • Handoff text invisible — text colour hardcoded to rgba(255,255,255,0.9) for dark timer bar
    • Canvas null crash in setFavicon — getContext('2d') null-checked and wrapped in try/catch
    • setInterval decoupled from tickTimer — interval set up before first tick in all start paths

Tests

70 → 114 smoke tests passing. New areas: emergency mode, handoff, day-change fixes, task retirement, untracked boundary, paused block cap, parent invariant, task emoji, start of day.

Security

  • Task emoji button rendered t.emoji unescaped in innerHTML — fixed with escHtml()