feat(studio): rich theme picker (presets + custom colour) + editor 0.11.0
Some checks failed
Security / Security check (push) Failing after 1s

Settings dialog's Theme Plugin section is now a grid of
swatched tiles:

- Built-in (none) — falls back to FaiTheme.light/.dark
- One tile per installed studio.theme.* plugin, each
  showing the plugin's primary/secondary/tertiary as
  live colour dots. Tile loads its preview lazily so a
  dozen installed themes don't block the picker.
- Custom — opens a colour-picker dialog with 12 curated
  Material presets + a hex input + live preview. Selecting
  applies ColorScheme.fromSeed for both brightnesses.

main.dart's _pluginThemes parses a 'custom:#RRGGBB' sigil
in the same notifier slot as plugin capability ids, so the
existing persistence + restoration paths cover the custom
case with no new state.

Bumps editor to 0.11.0 (type-checked port connections +
dynamic card width fix + card-height border allowance) and
Studio to 0.58.0.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-06-02 01:29:34 +02:00
parent 69864da934
commit c1c60d5434
30 changed files with 1280 additions and 846 deletions

View file

@ -25,9 +25,7 @@ class FaiModuleSheet extends StatefulWidget {
backgroundColor: Theme.of(context).colorScheme.surfaceContainer,
isScrollControlled: true,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(
top: Radius.circular(FaiRadius.md),
),
borderRadius: BorderRadius.vertical(top: Radius.circular(FaiRadius.md)),
),
builder: (_) => FaiModuleSheet(moduleName: name),
);
@ -56,8 +54,7 @@ class _FaiModuleSheetState extends State<FaiModuleSheet> {
// "remove the highest version", which is rarely what an
// operator means when they've explicitly kept multiple
// versions around.
final versions =
await HubService.instance.installedVersions(detail.name);
final versions = await HubService.instance.installedVersions(detail.name);
if (!mounted) return;
String? targetVersion;
if (versions.length > 1) {
@ -101,9 +98,7 @@ class _FaiModuleSheetState extends State<FaiModuleSheet> {
);
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(l.modulesUninstalledToast(r.name, r.version)),
),
SnackBar(content: Text(l.modulesUninstalledToast(r.name, r.version))),
);
Navigator.pop(context, true);
} catch (e) {
@ -138,8 +133,9 @@ class _FaiModuleSheetState extends State<FaiModuleSheet> {
Padding(
padding: const EdgeInsets.all(FaiSpace.xl),
child: Text(
AppLocalizations.of(context)!
.moduleSheetFailedToLoad(snapshot.error.toString()),
AppLocalizations.of(
context,
)!.moduleSheetFailedToLoad(snapshot.error.toString()),
style: theme.textTheme.bodyMedium?.copyWith(
color: theme.colorScheme.error,
),