feat: vault-aligned server v1 + UX polish
All checks were successful
CI / Windows build (push) Successful in 7m47s

Redesign the optional FastAPI companion around vault files (manifest /
PUT/GET/DELETE + OCR jobs) instead of legacy strokes_json notes. Wire a
client Server settings panel for health/login. Polish shell UX: l10n for
settings/home/board, sticky-board empty state, and a narrow-screen
diagnostics FAB.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-05 19:04:48 +08:00
parent d346cc2670
commit 198da00ecd
20 changed files with 1325 additions and 90 deletions

View File

@@ -115,18 +115,29 @@ class _AppShellState extends ConsumerState<AppShell> {
return Scaffold(
body: body,
bottomNavigationBar: NavigationBar(
selectedIndex: _index,
onDestinationSelected: _select,
destinations: [
for (final d in destinations)
NavigationDestination(
icon: Icon(d.icon),
selectedIcon: Icon(d.selectedIcon),
label: d.label,
),
bottomNavigationBar: Column(
mainAxisSize: MainAxisSize.min,
children: [
NavigationBar(
selectedIndex: _index,
onDestinationSelected: _select,
destinations: [
for (final d in destinations)
NavigationDestination(
icon: Icon(d.icon),
selectedIcon: Icon(d.selectedIcon),
label: d.label,
),
],
),
],
),
floatingActionButton: FloatingActionButton.small(
heroTag: 'diag_fab',
tooltip: AppLocalizations.of(context).diagnosticsSection,
onPressed: () => _diagKey.currentState?.toggle(),
child: const Icon(Icons.bug_report_outlined),
),
);
}
@@ -150,14 +161,14 @@ Future<void> exportDiagnosticPack(BuildContext context) async {
if (!context.mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('诊断包: ${result.zipPath}'),
content: Text(AppLocalizations.of(context).diagExported(result.bytes)),
duration: const Duration(seconds: 5),
),
);
} catch (e) {
if (!context.mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('导出失败: $e')),
SnackBar(content: Text(AppLocalizations.of(context).diagExportFail('$e'))),
);
}
}