feat(store): advisory-version badge for federated entries
Some checks failed
Security / Security check (push) Failing after 1s

Store cards + detail-sheet now prefix the version pill with
`~` and attach a tooltip for federated entries (MCP / n8n /
Temporal). Upstream services don't honour semver, so the
version pill is a label, not a contract — the tilde says
"this number may change without a version bump."

Three render sites updated to stay visually consistent:
- compact card pill in grid view
- expanded card pill row
- detail-sheet header pill cluster

EN + DE l10n entries added (`storeAdvisoryVersionTooltip`)
and `app_localizations.dart` regenerated.

dart analyze clean; flutter test green (11 tests).

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-05-28 23:26:49 +02:00
parent c5a96bc8d4
commit 327bc0fea2
7 changed files with 55 additions and 13 deletions

View file

@ -1661,10 +1661,22 @@ class _FeaturedTile extends StatelessWidget {
Row(
children: [
if (item.bestVersion.isNotEmpty)
FaiPill(
label: 'v${item.bestVersion}',
tone: FaiPillTone.neutral,
monospace: true,
Tooltip(
// Federated upstream services (MCP, n8n,
// Temporal workflows) don't honour semver,
// so their version pill carries a "~"
// prefix + tooltip noting that the value
// is advisory only.
message: item.isFederated
? l.storeAdvisoryVersionTooltip
: '',
child: FaiPill(
label: item.isFederated
? '~v${item.bestVersion}'
: 'v${item.bestVersion}',
tone: FaiPillTone.neutral,
monospace: true,
),
),
const SizedBox(width: FaiSpace.xs),
if (item.status.isNotEmpty)
@ -1835,10 +1847,17 @@ class _StoreCard extends StatelessWidget {
Row(
children: [
if (item.bestVersion.isNotEmpty) ...[
FaiPill(
label: 'v${item.bestVersion}',
tone: FaiPillTone.neutral,
monospace: true,
Tooltip(
message: item.isFederated
? l.storeAdvisoryVersionTooltip
: '',
child: FaiPill(
label: item.isFederated
? '~v${item.bestVersion}'
: 'v${item.bestVersion}',
tone: FaiPillTone.neutral,
monospace: true,
),
),
const SizedBox(width: FaiSpace.xs),
],
@ -2134,10 +2153,17 @@ class _StoreDetailSheetState extends State<_StoreDetailSheet> {
runSpacing: 4,
children: [
if (item.bestVersion.isNotEmpty)
FaiPill(
label: 'v${item.bestVersion}',
tone: FaiPillTone.neutral,
monospace: true,
Tooltip(
message: item.isFederated
? l.storeAdvisoryVersionTooltip
: '',
child: FaiPill(
label: item.isFederated
? '~v${item.bestVersion}'
: 'v${item.bestVersion}',
tone: FaiPillTone.neutral,
monospace: true,
),
),
if (item.status.isNotEmpty)
FaiPill(