feat(studio): editorial Today hero on the store (v0.30.0)

App-store research shows that the most loved discovery
surfaces — Apple's Today tab being the canonical example —
work because editors tell stories instead of stacking
algorithmic recommendations. F∆I has no surveillance budget
and no monetization pressure, so we lean fully into editorial
curation.

This commit adds `_StoreTodayHero`, the first surface a
browsing operator sees:

- Single curated story per release, kept const in
  [_kCurrentTodayStory] so the narrative is reviewable in code
  review and ships in the audit log via the binary hash. No
  CMS, no network, no surveillance.
- Bilingual content shipped inline (`titleEn`/`titleDe`,
  `bodyEn`/`bodyDe`) so KRITIS deployments don't need a
  translation backend.
- Gradient backdrop with hero icon, deck, narrative paragraph,
  optional CTA. Visual treatment matches Apple Today's
  hierarchy: badge → headline → body → action.
- Auto-hides whenever a filter is active so a purposeful
  search isn't pushed below the fold.
- Per-session dismiss button — no permanent suppression, the
  next Studio launch shows it again so a release-bumped story
  has a chance to be seen.

Current story (Studio v0.30.x) directs operators to the new
recommended-sources strip, closing the loop between editorial
context and one-click action.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-05-08 12:44:39 +02:00
parent 581ebbeaf7
commit fe933a713f
8 changed files with 273 additions and 2 deletions

View file

@ -692,6 +692,24 @@ abstract class AppLocalizations {
/// **'Reload'**
String get storeReloadTooltip;
/// No description provided for @storeTodayBadge.
///
/// In en, this message translates to:
/// **'TODAY'**
String get storeTodayBadge;
/// No description provided for @storeTodayDeck.
///
/// In en, this message translates to:
/// **'From the F∆I editor'**
String get storeTodayDeck;
/// No description provided for @storeTodayDismissTooltip.
///
/// In en, this message translates to:
/// **'Hide for this session'**
String get storeTodayDismissTooltip;
/// No description provided for @storePillInstalled.
///
/// In en, this message translates to: