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

@ -545,7 +545,7 @@ abstract class AppLocalizations {
/// No description provided for @sidebarChannelTooltip.
///
/// In en, this message translates to:
/// **'Active channel — click to switch in Settings (⌘;).\nproduction = stable · beta = pre-release · dev = rolling · local = workspace'**
/// **'Active channel — click to switch.\nproduction = stable · beta = pre-release · dev = rolling · local = workspace'**
String get sidebarChannelTooltip;
/// No description provided for @buttonCancel.
@ -1436,6 +1436,102 @@ abstract class AppLocalizations {
/// **'Reload'**
String get storeReloadTooltip;
/// No description provided for @storesManagerButton.
///
/// In en, this message translates to:
/// **'Add store'**
String get storesManagerButton;
/// No description provided for @storesManagerTitle.
///
/// In en, this message translates to:
/// **'Module stores'**
String get storesManagerTitle;
/// No description provided for @storesManagerIntro.
///
/// In en, this message translates to:
/// **'The hub merges the modules from every store below into one index. Add a store\'s index URL to make its modules installable here.'**
String get storesManagerIntro;
/// No description provided for @storesManagerAddSection.
///
/// In en, this message translates to:
/// **'Add a store'**
String get storesManagerAddSection;
/// No description provided for @storesManagerNameLabel.
///
/// In en, this message translates to:
/// **'Name'**
String get storesManagerNameLabel;
/// No description provided for @storesManagerUrlLabel.
///
/// In en, this message translates to:
/// **'Index URL (https:// or file://)'**
String get storesManagerUrlLabel;
/// No description provided for @storesManagerAddAction.
///
/// In en, this message translates to:
/// **'Add store'**
String get storesManagerAddAction;
/// No description provided for @storesManagerBundled.
///
/// In en, this message translates to:
/// **'{count} modules · bundled'**
String storesManagerBundled(int count);
/// No description provided for @storesManagerModuleCount.
///
/// In en, this message translates to:
/// **'{count} modules'**
String storesManagerModuleCount(int count);
/// No description provided for @storesManagerAddFailed.
///
/// In en, this message translates to:
/// **'Could not add store'**
String get storesManagerAddFailed;
/// No description provided for @storesManagerRemoveFailed.
///
/// In en, this message translates to:
/// **'Could not remove store'**
String get storesManagerRemoveFailed;
/// No description provided for @storesManagerSuggested.
///
/// In en, this message translates to:
/// **'Suggested stores'**
String get storesManagerSuggested;
/// No description provided for @storesManagerAddShort.
///
/// In en, this message translates to:
/// **'Add'**
String get storesManagerAddShort;
/// No description provided for @storesManagerNotAvailable.
///
/// In en, this message translates to:
/// **'Not available yet'**
String get storesManagerNotAvailable;
/// No description provided for @storesManagerNotAvailableHint.
///
/// In en, this message translates to:
/// **'The provider hasn\'t published this store index yet. It will become installable once they do.'**
String get storesManagerNotAvailableHint;
/// No description provided for @storesSuggestedReclaimDesc.
///
/// In en, this message translates to:
/// **'Recl∆Im — modules for law & duty reform-mapping'**
String get storesSuggestedReclaimDesc;
/// No description provided for @storeTodayBadge.
///
/// In en, this message translates to:
@ -2969,9 +3065,21 @@ abstract class AppLocalizations {
/// No description provided for @approvalsPayloadPreview.
///
/// In en, this message translates to:
/// **'PAYLOAD PREVIEW'**
/// **'DATA TO BE RELEASED'**
String get approvalsPayloadPreview;
/// No description provided for @approvalsRequestFallback.
///
/// In en, this message translates to:
/// **'Approval required for this step'**
String get approvalsRequestFallback;
/// No description provided for @approvalsFlowStepMeta.
///
/// In en, this message translates to:
/// **'Flow: {flow} · Step: {step}'**
String approvalsFlowStepMeta(String flow, String step);
/// No description provided for @approvalsApproveButton.
///
/// In en, this message translates to: