feat(studio): Cmd+K palette, recent-activity panel, icon/screenshot rendering (v0.21.0)

Three sweeps in a single bundle.

Universal command palette (⌘K / ctrl+K):
- Modal at top-of-window with a single search input. Indexes
  pages, installed modules, store entries, saved flows on
  open; filters client-side as the operator types.
- Keyboard nav (↑/↓ + Enter), grouped sections, hover-to-
  highlight. Hit selection navigates / opens the right
  surface in one keystroke. Closes with Esc.
- Designed to mirror the VSCode / Linear / 1Password
  ergonomics — gives non-CLI operators a "jump anywhere"
  affordance that scales with the number of installed
  modules.

Modules page recent-activity panel:
- Top-of-page strip lists the last 10 install / uninstall
  events from the audit log, color-coded by direction.
  Hidden when no relevant events exist (fresh installs).
  Same locale-unambiguous timestamp format used in audit.

Store detail sheet now renders icons + screenshots:
- `_ModuleIcon` widget loads the explicit `iconUrl` if
  provided, falls back to the category glyph on missing
  URL or load failure (no broken-image rectangle).
- Screenshots strip below the description: 320×200 tiles,
  horizontally-scrollable, click opens full-size via the
  OS handler. Placeholder card on load failure.

StoreItem extended with `iconUrl`, `screenshotUrls`,
`docsUrl` so the new content paths through unchanged.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-05-07 21:51:47 +02:00
parent fb7352d182
commit 11b0ac97a1
7 changed files with 803 additions and 30 deletions

View file

@ -391,6 +391,9 @@ class HubService {
status: e.status,
installed: e.installed,
featured: e.featured,
iconUrl: e.iconUrl,
screenshotUrls: e.screenshotUrls,
docsUrl: e.docsUrl,
),
)
.toList();
@ -1065,6 +1068,16 @@ class StoreItem {
/// featured (curated quarterly in the bundled seed.yaml).
/// Drives the "Featured" strip at the top of the Store page.
final bool featured;
/// Optional icon URL square PNG / SVG. Empty for entries
/// that don't supply one; UI falls back to a category icon.
final String iconUrl;
/// Ordered list of screenshot URLs; empty when none. Studio
/// renders them as a horizontally-scrollable strip in the
/// detail sheet.
final List<String> screenshotUrls;
/// Explicit docs URL override. When empty, the hub falls back
/// to the well-known raw-README paths off [repository].
final String docsUrl;
const StoreItem({
required this.name,
@ -1082,5 +1095,8 @@ class StoreItem {
required this.status,
required this.installed,
required this.featured,
required this.iconUrl,
required this.screenshotUrls,
required this.docsUrl,
});
}