Repository navigation
v1.4.0 — Emergency mode, handoff notes, emoji, start of day, timeblock fixes
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 —
liveEntryundefined inrenderTimeblockcrashed render on every log entry beforesetIntervalcould be reached -
- Day switch without restart — midnight rollover now detected in
tickClockevery 10s; auto-carries tasks and re-renders
- Day switch without restart — midnight rollover now detected in
-
- Export banner null crash —
checkNewDay/checkSnapshotreferenced removed HTML; replaced with no-ops
- Export banner null crash —
-
_lastTickDateTDZ — 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 —
tsEndexactly on 30-min boundary mapped to next slot viaMath.roundintimeToSlot; fixed by subtracting 1 from slot index on boundary
- Untracked slot boundary —
-
- Paused timer covers wrong slots — live block and covered-slot calc now cap at pause point (
entry.ts + accumulatedMs), notDate.now()
- Paused timer covers wrong slots — live block and covered-slot calc now cap at pause point (
-
- Parent not promoted —
promoteParents()runs at top of everyrenderPlan()call as an enforced invariant
- Parent not promoted —
-
- Handoff text invisible — text colour hardcoded to
rgba(255,255,255,0.9)for dark timer bar
- Handoff text invisible — text colour hardcoded to
-
- Canvas null crash in
setFavicon—getContext('2d')null-checked and wrapped in try/catch
- Canvas null crash in
-
setIntervaldecoupled fromtickTimer— 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.emojiunescaped in innerHTML — fixed withescHtml()