feat(studio): brand-agnostic onboarding hints + clickable checklist + theme-picker clarity
Some checks failed
Security / Security check (push) Failing after 2s

Three changes:

1. Onboarding checklist hints no longer mention DeepWiki,
   Semgrep, text.extract, or extract-summarize.yaml by
   name. Brand- and file-specific copy moved to neutral
   feature pointers ('add an MCP source', 'install a
   module'). Brand names belong on the welcome page only
   if they're load-bearing for understanding, which they
   aren't.

2. Checklist rows are now clickable. Tapping a row navigates
   to the page where the operator can complete it — MCP +
   AI open Settings, Module opens Store, Flow opens Flows.
   StudioShellState gains a public navigateTo(pageId) helper
   so descendants can drive sidebar selection without
   plumbing a controller through props.

3. Theme picker hint copy rewritten. Old hint suggested
   'Custom' was a single-colour tweak; new copy spells out
   that Material 3 derives a full palette (primary,
   secondary, tertiary, surface, …) from one seed colour.
   The Custom tile shows a small tune icon so its
   open-the-picker semantics is visually distinct from the
   apply-immediately plugin tiles.

Editor bumped to 0.12.0 (panel toggle + LabVIEW-style port
colours).

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-06-02 11:13:38 +02:00
parent c1c60d5434
commit 3db875c903
10 changed files with 105 additions and 31 deletions

View file

@ -149,6 +149,10 @@ class _ThemePickerGridState extends State<ThemePickerGrid> {
final seed = seedHex != null
? _parseHexColor(seedHex)
: theme.colorScheme.primary;
// Material 3 derives a full ColorScheme from one seed
// primary, secondary, tertiary, surface, outline, on-*.
// The custom tile previews that full palette so it reads
// visually as a complete theme, NOT a single colour.
final scheme = ColorScheme.fromSeed(
seedColor: seed ?? theme.colorScheme.primary,
brightness: theme.brightness,
@ -157,6 +161,11 @@ class _ThemePickerGridState extends State<ThemePickerGrid> {
label: l.themePluginCustom,
swatches: [scheme.primary, scheme.secondary, scheme.tertiary],
selected: isCustom,
// Slight visual cue that this tile is a different
// *source* of theme (seed-derived) compared to the
// plugin tiles (hand-curated palette). Same widget, the
// dashed border separates the concept.
editable: true,
onTap: () async {
final picked = await _showColorPickerDialog(
context,
@ -195,6 +204,11 @@ class _Tile extends StatelessWidget {
final List<Color> swatches;
final bool selected;
final bool loading;
/// Adds a small tune icon at the top-right, telegraphing
/// "this tile opens an editor instead of applying
/// immediately". Used for the Custom tile so the operator
/// knows clicking it will open the colour-picker dialog.
final bool editable;
final VoidCallback onTap;
const _Tile({
required this.label,
@ -202,6 +216,7 @@ class _Tile extends StatelessWidget {
required this.selected,
required this.onTap,
this.loading = false,
this.editable = false,
});
@override
@ -273,6 +288,12 @@ class _Tile extends StatelessWidget {
),
),
),
if (editable && !selected)
Icon(
Icons.tune,
size: 14,
color: theme.colorScheme.onSurfaceVariant,
),
if (selected)
Icon(
Icons.check_circle,