initial commit

This commit is contained in:
2026-07-27 14:42:23 +02:00
commit 833c68a189
257 changed files with 17947 additions and 0 deletions
+12
View File
@@ -0,0 +1,12 @@
/// Formats a past [DateTime] as a short relative string ("2h ago",
/// "5d ago") for activity feeds and stat-tile captions — full timestamps
/// belong in tables (as [MonoText]), not here.
String formatRelative(DateTime dateTime) {
final diff = DateTime.now().difference(dateTime);
if (diff.inSeconds < 45) return 'just now';
if (diff.inMinutes < 60) return '${diff.inMinutes}m ago';
if (diff.inHours < 24) return '${diff.inHours}h ago';
if (diff.inDays < 7) return '${diff.inDays}d ago';
if (diff.inDays < 30) return '${(diff.inDays / 7).floor()}w ago';
return '${(diff.inDays / 30).floor()}mo ago';
}
@@ -0,0 +1,12 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
/// Overridden in `main()` with an instance obtained via
/// `SharedPreferences.getInstance()` before `runApp`. Left unimplemented by
/// default so a missing override fails loudly instead of silently using a
/// throwaway in-memory instance.
final sharedPreferencesProvider = Provider<SharedPreferences>((ref) {
throw UnimplementedError(
'sharedPreferencesProvider must be overridden in main() with a loaded SharedPreferences instance.',
);
});