Dogfooding fixes: empty-state gaps + Settings/Capture mocks the sweep missed #62

Merged
christian merged 2 commits from fix/empty-focus-and-calm-nag into main 2026-07-12 02:03:43 +00:00
2 changed files with 59 additions and 36 deletions
Showing only changes of commit 50db790f86 - Show all commits

View File

@@ -7,9 +7,10 @@ import { EmptyState } from '../shell/states.js'
import { Badge, Button, Card, IconButton, Tag } from '../ui/index.js' import { Badge, Button, Card, IconButton, Tag } from '../ui/index.js'
/** /**
* Morning service — the Now/Next/Later focus cards + the burn-up cone. * Morning service — the Now/Next/Later focus cards + the burn-up cone, from the
* `focus` (scheduler) and `forecast` (Monte Carlo) override the demo fixtures * scheduler (`focus`) and Monte Carlo forecast (`forecast`). Both come from the
* when gitea is configured; both fall back to the handoff demo otherwise. * reconciled backlog; with no open work the scheduler has nothing to pour, so we
* show the empty state.
*/ */
export function FocusScreen({ export function FocusScreen({
onOpenIssue, onOpenIssue,
@@ -66,7 +67,9 @@ export function FocusScreen({
</Card> </Card>
) )
if (!focus) { // The scheduler returns a FocusView even when the backlog has no open work —
// treat "no now/next/later" as empty, not just an absent `focus`.
if (!focus || (!focus.now && !focus.next && !focus.later)) {
return ( return (
<EmptyState <EmptyState
icon="coffee" icon="coffee"

View File

@@ -161,6 +161,25 @@ export function StandupScreen({
</Section> </Section>
<Section overline="Stale blockers" order={3}> <Section overline="Stale blockers" order={3}>
{s.nag.id === 0 ? (
// Calm sentinel — nothing is over-steeping; render just the reassurance,
// no issue chrome, no click target (there's no #0 to open).
<div
style={{
display: 'flex',
gap: 10,
alignItems: 'center',
background: 'var(--paper-2)',
borderRadius: 'var(--radius-2)',
padding: '12px 14px',
}}
>
<span style={{ color: 'var(--ok)', display: 'inline-flex' }}>
<Icon name="circle-check" size={15} />
</span>
<p style={{ font: 'var(--text-agent)', color: 'var(--ink-2)', margin: 0 }}>{s.nag.text}</p>
</div>
) : (
<div <div
role="button" role="button"
tabIndex={0} tabIndex={0}
@@ -194,6 +213,7 @@ export function StandupScreen({
<p style={{ font: 'var(--text-agent)', color: 'var(--ink-2)', margin: '5px 0 0' }}>{s.nag.text}</p> <p style={{ font: 'var(--text-agent)', color: 'var(--ink-2)', margin: '5px 0 0' }}>{s.nag.text}</p>
</div> </div>
</div> </div>
)}
</Section> </Section>
<footer <footer