feat(ui): scope, freshness and jurist-review badges + live empty-state

Adds three dark-first chip badges in the TierBadge pattern:
- Jurisdiction (Berlin/DE/EU/International) — derived from the ELI,
  surfaced on the norms list, detail header and heatmap chips/hover.
- Freshness (aktuell/geaendert/ungeprueft) — flags norms amended
  upstream (standDate + sourceSha256); renders only when stale.
- Jurist review — marks evaluations a trusted jurist has confirmed
  (optional; the figure stands on its own).
Models gain Jurisdiction/Freshness enums, Norm.freshness/supersededNote
and Evaluation.reviewedBy/reviewedAt; HubRepository parses them from
the flow bag (ELI fallback). HeatmapPage shows a real empty-state
(hub-down vs no-evaluations) instead of a blank plot, and connect()
no longer throws on a failed probe.

Signed-off-by: flemming-it <sf@flemming.it>
This commit is contained in:
flemming-it 2026-06-19 02:25:39 +02:00
parent 9dfa418e92
commit aabff2b140
11 changed files with 604 additions and 26 deletions

View file

@ -36,6 +36,23 @@ class ReclaimColors {
static const tierT2 = Color(0xFF6CA29A); // verband
static const tierT3 = Color(0xFFB0AC8E); // own survey
static const tierT4 = Color(0xFFA86F5C); // qualitative signal only
// Scope badges Geltungsbereich of a norm. Hues widen from a
// warm-local Berlin to a cool-global teal, distinct from the
// tier palette so the two chips never read as the same thing.
// Tuned for dark-first legibility on the ink canvas (bright
// enough to read as chip text/border over inkRaised).
static const scopeBerlin = Color(0xFFD0685C); // Land Berlin (brick)
static const scopeDeutschland = Color(0xFFC79A3C); // Bund (gold)
static const scopeEu = Color(0xFF5B8DD6); // EU (union blue)
static const scopeInternational = Color(0xFF4FB89E); // global (teal)
// Freshness is our norm version current vs. the published source.
static const freshSuperseded = Color(0xFFE0973A); // amended upstream
static const freshUnknown = Color(0xFF9AA0A6); // not reconciled
// Jurist review an evaluation confirmed (signed off) by a jurist.
static const reviewConfirmed = Color(0xFF6FBE7A); // confirm green
}
/// Spacing scale 4/8/12/16/24/32/48 multiples, matching