diff --git a/frontend/dashboard.css b/frontend/dashboard.css
index 1014ab9..f370e74 100644
--- a/frontend/dashboard.css
+++ b/frontend/dashboard.css
@@ -1206,6 +1206,10 @@ textarea { resize: vertical; min-height: 120px; }
.mobile-update-outcome p { margin:0 0 10px; }
.mobile-update-outcome button { width:100%; min-height:44px; }
.mobile-today-hud { position:fixed; left:8px; right:8px; bottom:calc(56px + env(safe-area-inset-bottom)); z-index:44; display:grid; grid-template-columns:repeat(6,minmax(0,1fr)); gap:4px; max-width:100%; padding:8px; border:1px solid #31577f; border-radius:12px 12px 0 0; background:rgba(16,38,65,.98); box-shadow:0 -8px 24px rgba(0,0,0,.28); }
+ .mobile-first-task-coach { grid-column:1 / -1; display:grid; gap:2px; padding:8px 10px; border-left:3px solid #60a5fa; border-radius:6px; background:#172f4d; }
+ .mobile-first-task-coach[hidden] { display:none; }
+ .mobile-first-task-receipt { position:fixed; left:12px; right:12px; bottom:calc(var(--mobile-today-clearance, 166px) + 8px + env(safe-area-inset-bottom)); z-index:46; padding:12px; border:1px solid #34d399; border-radius:10px; background:#0d3b35; font-weight:700; }
+ .mobile-first-task-receipt[hidden] { display:none; }
.mobile-today-summary { grid-column:1 / 4; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; text-align:left; font-weight:700; }
.mobile-today-hud [data-work-session-progress] { grid-column:4 / 7; align-self:center; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.mobile-today-hud [data-mobile-today-complete] { grid-column:1 / 3; }
diff --git a/frontend/dashboard.js b/frontend/dashboard.js
index 59012c2..0fcac55 100644
--- a/frontend/dashboard.js
+++ b/frontend/dashboard.js
@@ -1,6 +1,7 @@
(async function(){
const workspaceLifecycle = await loadWorkspace({ document, window });
const qs = (s, el=document) => el.querySelector(s);
+ const announceWork = message => qs('#my-work-action-status').textContent = message;
const fmt = (d) => new Date(d).toLocaleString();
const cardPlanning = createCardPlanning(document);
const mobileComposerViewport = createMobileComposerViewport({
@@ -128,7 +129,7 @@
openFiled: openFiledFollowUp,
selectFilter: selectMobileQueue,
firstAction: name => qs('#my-work-list .my-work-card-main, #my-work-list .draft-resume, #my-work-list .draft-continue, #my-work-list .draft-edit'),
- announce: message => { qs('#my-work-action-status').textContent = message; },
+ announce: announceWork,
getCounts: () => mobileQueueCounts,
openFindWork: () => qs('#find-work').click(),
});
@@ -1700,7 +1701,7 @@
hasCheckpoint: () => updateTriage.resumable(),
resume: () => updateTriage.resume(),
start: () => updateTriage.start(),
- announce: message => { qs('#my-work-action-status').textContent = message; },
+ announce: announceWork,
});
function openUpdateTriage() {
@@ -2051,7 +2052,7 @@
hasCheckpoint: () => Boolean(agendaSessionCheckpoint.read()),
resume: () => workSession.resume(),
start: () => workSession.start(),
- announce: message => { qs('#my-work-action-status').textContent = message; },
+ announce: announceWork,
});
function openAgendaSession() {
return agendaSessionLauncher.open();
@@ -2193,7 +2194,7 @@
qs('[data-work-filter="today"]').click();
workSession.start(item);
},
- announce: message => { qs('#my-work-action-status').textContent = message; },
+ announce: announceWork,
});
function renderCreateStartCapacity() {
const result = createAndStart.capacity(qs('#create-issue-estimate').value);
@@ -2219,7 +2220,7 @@
qs('#my-work-action-status').textContent = 'Checking Today readiness…';
return todayReadiness.run('start', workSession.items(), item);
},
- announce: message => { qs('#my-work-action-status').textContent = message; },
+ announce: announceWork,
});
const selectedSessionItem = kind => ({
@@ -2234,8 +2235,8 @@
workSession,
refresh: () => refreshMyWorkView({ reconcileSession:false }),
warm: warmTodayOffline,
- announce: message => { qs('#my-work-action-status').textContent = message; },
- advance: () => runTodayTransition('complete'),
+ announce: announceWork,
+ advance: () => (mobileFirstTask.completeOutcome(), runTodayTransition('complete')),
});
todayLockScreen = createTodayLockScreen({
storage:localStorage,
@@ -2971,7 +2972,7 @@
close: () => workRoute.close(),
refresh: refreshMyWorkView,
focus: () => qs('[data-work-filter="' + selectedWorkFilter + '"]')?.focus(),
- announce: message => { qs('#my-work-action-status').textContent = message; },
+ announce: announceWork,
formatTime: fmt,
});
const laterPickerElement = qs('#later-picker');
diff --git a/frontend/index.html b/frontend/index.html
index ecee3c9..85ba709 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -1655,12 +1655,19 @@
+
+ Complete your first task
+ Open it, then use Done & next after a real outcome.
+
+
+ First task completed · continue Today
+