Coach hero
canonReport header „Jak na tom jsi“: one sentence, metric blocks with goal, improvement from → to, what to work on; with GoalRing for the monthly goal.
acrm !4412 + !4413 (Reporty › Koučink, owner approved 1. 10. 2026), verified on dev 2. 10. 2026 (1440 light/dark + 390). Colour = --goal-in / --goal-in-ink / --goal-in-subtle (vivid green, owner rejected faded --positive here) vs --ic-amber; motion only under prefers-reduced-motion: no-preference. App-level next to Spark; before canon: stories (States: in band / out / no goal / no data), usage + a11y, and a decision whether it moves to packages/ui. 2. 10. 2026: beta — usage/a11y written, states reviewed by AD on the preview (koucink-stavy.html). Canon 2. 10. 2026: stories + light/dark baselines merged in !4422, AD-verified in the catalogue. Registry repaired 17 Oct 2026 (review F3): mapped existing Ladle stories.
Used in 1 file · 1 area · 2× — components/sales-reports
Default
Jak na tom jsi
2 ze 3 návyků máš v doporučení
- Nejdelší monolog2:40cíl ≤ 2:30
- Otázky19cíl ≥ 18
- Pauza před odpovědí0,7 scíl 0,6–1 s
Zlepšení: monolog 3:50 → 2:40, otázky 9 → 19 a pauza 0,4 s → 0,7 s.
Ještě zapracuj na: nejdelší monolog (2:40, cíl ≤ 2:30).
export const Default = () => (
<div style={{ display: 'flex', gap: 'var(--sp-6)', alignItems: 'flex-start' }}>
<Frame>
<CoachHero report={report(MIXED)} />
</Frame>
<Frame width={120}>
<GoalRing pct={87} reached={false} />
</Frame>
</div>
);States
Jak na tom jsi
2 ze 2 návyků máš v doporučení
- Nejdelší monolog2:10cíl ≤ 2:30
- Otázky20cíl ≥ 18
Zlepšení: monolog 3:00 → 2:10 a otázky 12 → 20.
Všechno, co má doporučení, držíš v pásmu.
export const States = () => (
<div style={{ display: 'grid', gap: 'var(--sp-6)' }}>
<Frame text="all in band — no „Ještě zapracuj na“, praise instead">
<CoachHero report={report(ALL_IN)} />
</Frame>
<Frame text="no goal — no metric with a recommendation and a value: the header is not rendered">
<CoachHero
report={report([
metric('wordsPerMin', 164, { weekly: [171, 170, 168, 169, 166, 165, 166, 164] }),
])}
/>
<Hidden />
</Frame>
<Frame text="no data — a metric with a band but no „now“ value is not counted: not rendered">
<CoachHero report={report([metric('longestMonologue', null, { band: MONOLOGUE_BAND })])} />
<Hidden />
</Frame>
<Frame text="Goal ring — reached (100 %, --goal-in) · on the way (87 %) · start (0 %, no arc) · no data (—)">
<div style={{ display: 'flex', gap: 'var(--sp-6)' }}>
<GoalRing pct={100} reached />
<GoalRing pct={87} reached={false} />
<GoalRing pct={0} reached={false} />
<GoalRing pct={null} reached={false} />
</div>
</Frame>
</div>
);