feat(studio): clearer store + channel switcher + approvals & welcome polish
Some checks failed
Security / Security check (push) Failing after 2s

- store: repair the filter dialog crash (a Spacer lived directly in
  AlertDialog.actions, which is an OverflowBar, not a Flex — it threw
  and rendered a broken dialog). Buttons now sit in a Row.
- store: promote the module-store manager from a bare icon to a
  labelled 'Add store' button, and fully localize the dialog (DE/EN).
- store: add a curated 'Suggested stores' shelf with one-click
  add/remove (first entry: Recl∆Im). Each suggestion is probed for
  reachability and shows 'not available yet' until its index is
  published, instead of failing only on click. Fail-open on network
  errors so a transient hiccup never hides a real store.
- sidebar: the channel pill is now a one-click channel switcher
  (menu with per-channel running state + active check; switching
  writes ~/.chain/current-channel, restarts the daemon, and Studio
  repoints to the new channel).
- approvals: lead the card with the human prompt ('what am I
  releasing?') and demote the flow/step id to a metadata line; clear
  fallback when the step left the prompt empty.
- welcome: tidy the docs grid into equal-height paired rows with a
  full-width trailing card for the odd one out.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-06-18 21:29:39 +02:00
parent 62ed3951e5
commit 5220f19ff8
10 changed files with 865 additions and 148 deletions

View file

@ -261,7 +261,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get sidebarChannelTooltip =>
'Aktiver Kanal — klicken um in Einstellungen (⌘;) zu wechseln.\nproduction = stabil · beta = Vorabversion · dev = laufend · local = Arbeitsumgebung';
'Aktiver Kanal — klicken zum Wechseln.\nproduction = stabil · beta = Vorabversion · dev = laufend · local = Arbeitsumgebung';
@override
String get buttonCancel => 'Abbrechen';
@ -771,6 +771,61 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get storeReloadTooltip => 'Aktualisieren';
@override
String get storesManagerButton => 'Store hinzufügen';
@override
String get storesManagerTitle => 'Module-Stores';
@override
String get storesManagerIntro =>
'Der Hub führt die Module aller Stores unten zu einem Index zusammen. Füge die Index-URL eines Stores hinzu, damit seine Module hier installierbar werden.';
@override
String get storesManagerAddSection => 'Store hinzufügen';
@override
String get storesManagerNameLabel => 'Name';
@override
String get storesManagerUrlLabel => 'Index-URL (https:// oder file://)';
@override
String get storesManagerAddAction => 'Hinzufügen';
@override
String storesManagerBundled(int count) {
return '$count Module · gebündelt';
}
@override
String storesManagerModuleCount(int count) {
return '$count Module';
}
@override
String get storesManagerAddFailed => 'Store konnte nicht hinzugefügt werden';
@override
String get storesManagerRemoveFailed => 'Store konnte nicht entfernt werden';
@override
String get storesManagerSuggested => 'Vorgeschlagene Stores';
@override
String get storesManagerAddShort => 'Hinzufügen';
@override
String get storesManagerNotAvailable => 'Noch nicht verfügbar';
@override
String get storesManagerNotAvailableHint =>
'Der Anbieter hat diesen Store-Index noch nicht veröffentlicht. Sobald er das tut, ist er installierbar.';
@override
String get storesSuggestedReclaimDesc =>
'Recl∆Im — Module für Rechts- und Pflichten-Reform-Mapping';
@override
String get storeTodayBadge => 'HEUTE';
@ -1712,7 +1767,16 @@ class AppLocalizationsDe extends AppLocalizations {
String get approvalsPillExpired => 'abgelaufen';
@override
String get approvalsPayloadPreview => 'PAYLOAD-VORSCHAU';
String get approvalsPayloadPreview => 'DIESE DATEN WERDEN FREIGEGEBEN';
@override
String get approvalsRequestFallback =>
'Freigabe für diesen Schritt erforderlich';
@override
String approvalsFlowStepMeta(String flow, String step) {
return 'Flow: $flow · Schritt: $step';
}
@override
String get approvalsApproveButton => 'Freigeben';