Keep provider identity in one place instead of two copies

main.qml and configProviders.qml both render provider metadata, so both
carried the same alias, CLI argument, brand colour, dashboard, login, status,
documentation and icon tables. Adding a provider meant editing two files, and
the only thing that noticed a miss was a drift check in test_ui_regressions.sh
that compared the two copies entry by entry. A test whose job is to watch a
duplication is a good argument for removing the duplication.

The tables move into ProviderIdentity.js, which already owned key resolution.
Everything there stays free of QML context, so brand colours are channel
triples the caller feeds to Qt.rgba, and the icon and documentation lookups
return a bare name or path that the caller resolves. The display names are the
one table that cannot move: i18n needs literal strings in a file gettext scans,
so providerTitle stays duplicated and keeps its drift check.

The static checks follow the data rather than asserting against whichever file
used to hold it. The parity, icon, theme and security checks now read the
shared module, and what they assert about the surfaces is that neither has
grown a private table again. tst_provider_identity.qml covers alias
resolution, graceful degradation for unknown providers, and the icon-name
refusal that keeps a provider-controlled key from naming a path.

Verified equivalent before and after with a throwaway qmltestrunner harness
comparing all seven lookups across 149 provider keys and all 71 brand colours
against the previous implementation; every result matched.

main.qml 5046 -> 4522 lines, configProviders.qml 2528 -> 2061.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1d2820ae41Simone committed on 8/18/2026, 3:37:49 AMparente72360b

Checks

All checks passed
9 files changedLine totals unavailable