feat(store): show module maintainers (0.79.0)
Some checks failed
Security / Security check (push) Failing after 2s

The detail sheet always answers 'who maintains this?': one
selectable line per maintainer from the store index's new
maintainers list, or an honest 'not specified' when the index
names nobody (StoreMaintainersSection, public for the widget
tests). The install trust gate carries the same fact when
present and stays terse otherwise. DE+EN; dialog-harness proof
captured with the maintainer row.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-07-22 22:06:18 +02:00
parent 66886389a6
commit 351c5a82bc
13 changed files with 198 additions and 2 deletions

View file

@ -2686,6 +2686,7 @@ class _StoreDetailSheetState extends State<_StoreDetailSheet> {
_DocsPanel(text: _docsResult!.text),
const SizedBox(height: ChainSpace.lg),
],
StoreMaintainersSection(maintainers: item.maintainers),
if (item.repository.isNotEmpty) ...[
_SectionHeader(l.storeSectionSource),
const SizedBox(height: ChainSpace.sm),
@ -3835,6 +3836,44 @@ class _ProvenancePill extends StatelessWidget {
}
}
/// Who maintains this module always shown in the detail sheet
/// (decision-maker transparency, same motivation as the About
/// page): one selectable line per maintainer, and an honest
/// "not specified" when the store index names nobody. Public so
/// the widget test pumps both states directly.
class StoreMaintainersSection extends StatelessWidget {
final List<String> maintainers;
const StoreMaintainersSection({super.key, required this.maintainers});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final l = AppLocalizations.of(context)!;
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_SectionHeader(l.storeSectionMaintainers),
const SizedBox(height: ChainSpace.sm),
if (maintainers.isEmpty)
Text(
l.storeMaintainersNone,
style: theme.textTheme.bodySmall?.copyWith(
color: theme.colorScheme.onSurfaceVariant,
),
)
else
for (final m in maintainers)
Padding(
padding: const EdgeInsets.only(bottom: 2),
child: SelectableText(m, style: theme.textTheme.bodySmall),
),
const SizedBox(height: ChainSpace.lg),
],
);
}
}
/// Signature-verification warning pill. Same philosophy as the
/// provenance pill: the GOOD path (signature checked at install)
/// stays quiet, and so does the policy-off case that one is a