From ccebd9873594fdffadb271250d144fcfdefd0580 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Sat, 9 May 2026 16:06:58 -0400 Subject: [PATCH] feat(flutter): empty-state copy mirrors web design-system voice MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Five terse "No X." strings replaced with the longer actionable forms the web SPA uses on equivalent surfaces: - Library Artists/Albums tabs: "No artists yet — scan a library folder via the server's config." (mirrors web /library/artists, /albums) - Library Liked tab: "No liked artists, albums, or tracks yet." (consolidates web's per-section copy since Flutter shows all three in one tab) - Search no-results: "No matches for that query." (web has per-section copy that doesn't fit Flutter's combined view) - Discover no-results: "Nothing to add for that search yet." (mirrors web /discover) Hidden tab keeps its current actionable hint (web's "Nothing hidden yet." is terser but lacks the "use a track's menu to flag" guidance). Co-Authored-By: Claude Opus 4.7 (1M context) --- flutter_client/lib/discover/discover_screen.dart | 5 +++-- flutter_client/lib/library/library_screen.dart | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/flutter_client/lib/discover/discover_screen.dart b/flutter_client/lib/discover/discover_screen.dart index a55ea07b..409347be 100644 --- a/flutter_client/lib/discover/discover_screen.dart +++ b/flutter_client/lib/discover/discover_screen.dart @@ -162,8 +162,9 @@ class _DiscoverScreenState extends ConsumerState { final rows = snap.data ?? const []; if (rows.isEmpty) { return Center( - child: Text('No matches.', - style: TextStyle(color: fs.ash)), + child: Text('Nothing to add for that search yet.', + style: TextStyle(color: fs.ash), + textAlign: TextAlign.center), ); } return ListView.separated( diff --git a/flutter_client/lib/library/library_screen.dart b/flutter_client/lib/library/library_screen.dart index f3b2f4b7..323b2959 100644 --- a/flutter_client/lib/library/library_screen.dart +++ b/flutter_client/lib/library/library_screen.dart @@ -132,7 +132,7 @@ class _ArtistsTab extends ConsumerWidget { loading: () => const Center(child: CircularProgressIndicator()), error: (e, _) => Center(child: Text('$e', style: TextStyle(color: fs.error))), data: (page) => page.items.isEmpty - ? Center(child: Text('No artists.', style: TextStyle(color: fs.ash))) + ? Center(child: Text("No artists yet — scan a library folder via the server's config.", style: TextStyle(color: fs.ash), textAlign: TextAlign.center)) : RefreshIndicator( onRefresh: () async => ref.refresh(_libraryArtistsProvider.future), child: GridView.builder( @@ -164,7 +164,7 @@ class _AlbumsTab extends ConsumerWidget { loading: () => const Center(child: CircularProgressIndicator()), error: (e, _) => Center(child: Text('$e', style: TextStyle(color: fs.error))), data: (page) => page.items.isEmpty - ? Center(child: Text('No albums.', style: TextStyle(color: fs.ash))) + ? Center(child: Text("No albums yet — scan a library folder via the server's config.", style: TextStyle(color: fs.ash), textAlign: TextAlign.center)) : RefreshIndicator( onRefresh: () async => ref.refresh(_libraryAlbumsProvider.future), child: GridView.builder( @@ -241,7 +241,7 @@ class _LikedTab extends ConsumerWidget { return Center(child: Text("Couldn't load liked items.", style: TextStyle(color: fs.error))); } if (t.items.isEmpty && al.items.isEmpty && ar.items.isEmpty) { - return Center(child: Text('Nothing liked yet.', style: TextStyle(color: fs.ash))); + return Center(child: Text('No liked artists, albums, or tracks yet.', style: TextStyle(color: fs.ash), textAlign: TextAlign.center)); } return RefreshIndicator( onRefresh: () async {