Components · Political
A civic campaign at a glance — the CampaignStatusCard roll-up over one CampaignRollupRow. The scope/status badges lead, the headline progress toward a call/commitment target reads as a display StatTile + OKR Meter with a momentum indicator, then the volume + call-through key stats, the repeat-contact cooldown posture, and a recent-activity Timeline. A lapsed cooldown flips the posture to a warn badge and surfaces the accent Re-open action.
You can contact again in 41h.
+138 calls this month — on pace to clear the 1,000 goal before the Oct floor vote.
Recent activity
The % of goal badge + the momentum pill both derive from the roll-up; the display StatTile carries the +138 this month delta and the Meter spells out N / target. Cooldown posture reads "active" from lastContactAt + cooldownHours.
Past its cooldownHours window with no fresh announcement, lapsedCooldown flips the neutral posture badge to warn and reveals the accent Re-open button (pinned :hover) that fires the onReopen passthrough.
CampaignRollupRow (lib/committee-politics) — title / scope / status / contacts / contactors / calls+callsThrough / throughRate / cooldownHours / lastAnnouncementAt / lastContactAt / lapsedCooldown. Every number + the lapsed flag come straight off it.StatTile (count · +N this month delta) over an OKR Meter (N / goal). Higher call-through is better: good ≥50% · accent ≥20% · warn below.ContactStatus → the "you can contact again in Nh" (or "update posted") line under the cooldown badge. Rendered close to where it was computed — the card never reads the clock.onReopen surfaces the accent Re-open button when lapsedCooldown is true; onSelect turns the title into a button (open the campaign detail).Source · ds/political/CampaignStatusCard.tsx (composed FROM ds/surface Surface + Timeline) · @phauna/ds StatTile / Meter / Badge / Button · momentum from ds/political/CommitmentFunnel.tsx · data lib/committee-politics.ts.