feat(studio): clearer store + channel switcher + approvals & welcome polish
Some checks failed
Security / Security check (push) Failing after 2s
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:
parent
62ed3951e5
commit
5220f19ff8
10 changed files with 865 additions and 148 deletions
|
|
@ -81,7 +81,7 @@
|
|||
"connectionStartHub": "Hub starten",
|
||||
"connectionTapToStart": "antippen zum Starten",
|
||||
"sidebarSettingsTooltip": "Einstellungen (⌘;)",
|
||||
"sidebarChannelTooltip": "Aktiver Kanal — klicken um in Einstellungen (⌘;) zu wechseln.\nproduction = stabil · beta = Vorabversion · dev = laufend · local = Arbeitsumgebung",
|
||||
"sidebarChannelTooltip": "Aktiver Kanal — klicken zum Wechseln.\nproduction = stabil · beta = Vorabversion · dev = laufend · local = Arbeitsumgebung",
|
||||
"buttonCancel": "Abbrechen",
|
||||
"buttonSave": "Speichern",
|
||||
"buttonClose": "Schließen",
|
||||
|
|
@ -319,6 +319,22 @@
|
|||
}
|
||||
},
|
||||
"storeReloadTooltip": "Aktualisieren",
|
||||
"storesManagerButton": "Store hinzufügen",
|
||||
"storesManagerTitle": "Module-Stores",
|
||||
"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.",
|
||||
"storesManagerAddSection": "Store hinzufügen",
|
||||
"storesManagerNameLabel": "Name",
|
||||
"storesManagerUrlLabel": "Index-URL (https:// oder file://)",
|
||||
"storesManagerAddAction": "Hinzufügen",
|
||||
"storesManagerBundled": "{count} Module · gebündelt",
|
||||
"storesManagerModuleCount": "{count} Module",
|
||||
"storesManagerAddFailed": "Store konnte nicht hinzugefügt werden",
|
||||
"storesManagerRemoveFailed": "Store konnte nicht entfernt werden",
|
||||
"storesManagerSuggested": "Vorgeschlagene Stores",
|
||||
"storesManagerAddShort": "Hinzufügen",
|
||||
"storesManagerNotAvailable": "Noch nicht verfügbar",
|
||||
"storesManagerNotAvailableHint": "Der Anbieter hat diesen Store-Index noch nicht veröffentlicht. Sobald er das tut, ist er installierbar.",
|
||||
"storesSuggestedReclaimDesc": "Recl∆Im — Module für Rechts- und Pflichten-Reform-Mapping",
|
||||
"storeTodayBadge": "HEUTE",
|
||||
"storeTodayDeck": "Von der Ch∆In-Redaktion",
|
||||
"storeTodayDismissTooltip": "Für diese Sitzung ausblenden",
|
||||
|
|
@ -998,7 +1014,9 @@
|
|||
"approvalsPillApproved": "freigegeben",
|
||||
"approvalsPillRejected": "abgelehnt",
|
||||
"approvalsPillExpired": "abgelaufen",
|
||||
"approvalsPayloadPreview": "PAYLOAD-VORSCHAU",
|
||||
"approvalsPayloadPreview": "DIESE DATEN WERDEN FREIGEGEBEN",
|
||||
"approvalsRequestFallback": "Freigabe für diesen Schritt erforderlich",
|
||||
"approvalsFlowStepMeta": "Flow: {flow} · Schritt: {step}",
|
||||
"approvalsApproveButton": "Freigeben",
|
||||
"approvalsRejectButton": "Ablehnen",
|
||||
"approvalsRejectDialogTitle": "Freigabe ablehnen",
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@
|
|||
"connectionStartHub": "Start hub",
|
||||
"connectionTapToStart": "tap to start",
|
||||
"sidebarSettingsTooltip": "Settings (⌘;)",
|
||||
"sidebarChannelTooltip": "Active channel — click to switch in Settings (⌘;).\nproduction = stable · beta = pre-release · dev = rolling · local = workspace",
|
||||
"sidebarChannelTooltip": "Active channel — click to switch.\nproduction = stable · beta = pre-release · dev = rolling · local = workspace",
|
||||
"buttonCancel": "Cancel",
|
||||
"buttonSave": "Save",
|
||||
"buttonClose": "Close",
|
||||
|
|
@ -322,6 +322,32 @@
|
|||
}
|
||||
},
|
||||
"storeReloadTooltip": "Reload",
|
||||
"storesManagerButton": "Add store",
|
||||
"storesManagerTitle": "Module stores",
|
||||
"storesManagerIntro": "The hub merges the modules from every store below into one index. Add a store's index URL to make its modules installable here.",
|
||||
"storesManagerAddSection": "Add a store",
|
||||
"storesManagerNameLabel": "Name",
|
||||
"storesManagerUrlLabel": "Index URL (https:// or file://)",
|
||||
"storesManagerAddAction": "Add store",
|
||||
"storesManagerBundled": "{count} modules · bundled",
|
||||
"@storesManagerBundled": {
|
||||
"placeholders": {
|
||||
"count": { "type": "int" }
|
||||
}
|
||||
},
|
||||
"storesManagerModuleCount": "{count} modules",
|
||||
"@storesManagerModuleCount": {
|
||||
"placeholders": {
|
||||
"count": { "type": "int" }
|
||||
}
|
||||
},
|
||||
"storesManagerAddFailed": "Could not add store",
|
||||
"storesManagerRemoveFailed": "Could not remove store",
|
||||
"storesManagerSuggested": "Suggested stores",
|
||||
"storesManagerAddShort": "Add",
|
||||
"storesManagerNotAvailable": "Not available yet",
|
||||
"storesManagerNotAvailableHint": "The provider hasn't published this store index yet. It will become installable once they do.",
|
||||
"storesSuggestedReclaimDesc": "Recl∆Im — modules for law & duty reform-mapping",
|
||||
"storeTodayBadge": "TODAY",
|
||||
"storeTodayDeck": "From the Ch∆In editor",
|
||||
"storeTodayDismissTooltip": "Hide for this session",
|
||||
|
|
@ -1001,7 +1027,15 @@
|
|||
"approvalsPillApproved": "approved",
|
||||
"approvalsPillRejected": "rejected",
|
||||
"approvalsPillExpired": "expired",
|
||||
"approvalsPayloadPreview": "PAYLOAD PREVIEW",
|
||||
"approvalsPayloadPreview": "DATA TO BE RELEASED",
|
||||
"approvalsRequestFallback": "Approval required for this step",
|
||||
"approvalsFlowStepMeta": "Flow: {flow} · Step: {step}",
|
||||
"@approvalsFlowStepMeta": {
|
||||
"placeholders": {
|
||||
"flow": { "type": "String" },
|
||||
"step": { "type": "String" }
|
||||
}
|
||||
},
|
||||
"approvalsApproveButton": "Approve",
|
||||
"approvalsRejectButton": "Reject",
|
||||
"approvalsRejectDialogTitle": "Reject approval",
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -260,7 +260,7 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||
|
||||
@override
|
||||
String get sidebarChannelTooltip =>
|
||||
'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';
|
||||
|
||||
@override
|
||||
String get buttonCancel => 'Cancel';
|
||||
|
|
@ -789,6 +789,61 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||
@override
|
||||
String get storeReloadTooltip => 'Reload';
|
||||
|
||||
@override
|
||||
String get storesManagerButton => 'Add store';
|
||||
|
||||
@override
|
||||
String get storesManagerTitle => 'Module stores';
|
||||
|
||||
@override
|
||||
String get storesManagerIntro =>
|
||||
'The hub merges the modules from every store below into one index. Add a store\'s index URL to make its modules installable here.';
|
||||
|
||||
@override
|
||||
String get storesManagerAddSection => 'Add a store';
|
||||
|
||||
@override
|
||||
String get storesManagerNameLabel => 'Name';
|
||||
|
||||
@override
|
||||
String get storesManagerUrlLabel => 'Index URL (https:// or file://)';
|
||||
|
||||
@override
|
||||
String get storesManagerAddAction => 'Add store';
|
||||
|
||||
@override
|
||||
String storesManagerBundled(int count) {
|
||||
return '$count modules · bundled';
|
||||
}
|
||||
|
||||
@override
|
||||
String storesManagerModuleCount(int count) {
|
||||
return '$count modules';
|
||||
}
|
||||
|
||||
@override
|
||||
String get storesManagerAddFailed => 'Could not add store';
|
||||
|
||||
@override
|
||||
String get storesManagerRemoveFailed => 'Could not remove store';
|
||||
|
||||
@override
|
||||
String get storesManagerSuggested => 'Suggested stores';
|
||||
|
||||
@override
|
||||
String get storesManagerAddShort => 'Add';
|
||||
|
||||
@override
|
||||
String get storesManagerNotAvailable => 'Not available yet';
|
||||
|
||||
@override
|
||||
String get storesManagerNotAvailableHint =>
|
||||
'The provider hasn\'t published this store index yet. It will become installable once they do.';
|
||||
|
||||
@override
|
||||
String get storesSuggestedReclaimDesc =>
|
||||
'Recl∆Im — modules for law & duty reform-mapping';
|
||||
|
||||
@override
|
||||
String get storeTodayBadge => 'TODAY';
|
||||
|
||||
|
|
@ -1722,7 +1777,15 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||
String get approvalsPillExpired => 'expired';
|
||||
|
||||
@override
|
||||
String get approvalsPayloadPreview => 'PAYLOAD PREVIEW';
|
||||
String get approvalsPayloadPreview => 'DATA TO BE RELEASED';
|
||||
|
||||
@override
|
||||
String get approvalsRequestFallback => 'Approval required for this step';
|
||||
|
||||
@override
|
||||
String approvalsFlowStepMeta(String flow, String step) {
|
||||
return 'Flow: $flow · Step: $step';
|
||||
}
|
||||
|
||||
@override
|
||||
String get approvalsApproveButton => 'Approve';
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue