Add multi-account support and update project docs
- Add SavedAccount/AccountStore and rework ServerProvider around a list of saved accounts: switch/remove/add, swipe-to-cycle on the avatar button, per-account browsing prefs (sort/view/filters/cache), and a session-generation guard so a stale fetch from an abandoned account can't land in the newly active one - Migrate existing single-account installs into the new schema automatically so upgrading users stay logged in - Settings gains an Accounts section; LoginView gains an "add account" mode pushed on top of the main shell instead of replacing it - Give every Scrollbar in the app a thicker, draggable, Android-style thumb via a shared ScrollbarTheme instead of the default hairline - Splash screen: use the monochrome app icon (tinted per theme) and a smaller spinner - Update CLAUDE.md and .claude/context/*.md to reflect the accumulated multi-account, sharing, and UI changes across this session, and add a standing instruction to keep these docs current going forward Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -30,6 +30,37 @@ class AppTheme {
|
||||
Color(0xFF2E7D32), // Emerald Green
|
||||
];
|
||||
|
||||
// Flutter's default Scrollbar renders a ~6px hairline that's easy to miss
|
||||
// and hard to grab. This tunes it to read like Android's standard
|
||||
// draggable fast-scroll thumb: thicker, pill-shaped, and always at least
|
||||
// faintly visible (not just flashing in on scroll), while still getting
|
||||
// a touch more visible/opaque while actively hovered or dragged.
|
||||
static ScrollbarThemeData _scrollbarTheme(ColorScheme colorScheme) {
|
||||
final thumbColor = colorScheme.onSurfaceVariant;
|
||||
return ScrollbarThemeData(
|
||||
thickness: WidgetStateProperty.resolveWith((states) {
|
||||
if (states.contains(WidgetState.dragged) ||
|
||||
states.contains(WidgetState.hovered)) {
|
||||
return 10.0;
|
||||
}
|
||||
return 8.0;
|
||||
}),
|
||||
radius: const Radius.circular(8),
|
||||
thumbColor: WidgetStateProperty.resolveWith((states) {
|
||||
if (states.contains(WidgetState.dragged)) {
|
||||
return thumbColor.withValues(alpha: 0.9);
|
||||
}
|
||||
if (states.contains(WidgetState.hovered)) {
|
||||
return thumbColor.withValues(alpha: 0.8);
|
||||
}
|
||||
return thumbColor.withValues(alpha: 0.6);
|
||||
}),
|
||||
thumbVisibility: const WidgetStatePropertyAll(true),
|
||||
trackVisibility: const WidgetStatePropertyAll(false),
|
||||
interactive: true,
|
||||
);
|
||||
}
|
||||
|
||||
static ThemeData light(
|
||||
Color seedColor, {
|
||||
ColorScheme? dynamicScheme,
|
||||
@@ -49,6 +80,7 @@ class AppTheme {
|
||||
scaffoldBackgroundColor: colorScheme.surface,
|
||||
pageTransitionsTheme: _pageTransitionsTheme,
|
||||
sliderTheme: _sliderTheme,
|
||||
scrollbarTheme: _scrollbarTheme(colorScheme),
|
||||
textTheme: GoogleFonts.interTextTheme(ThemeData.light().textTheme)
|
||||
.copyWith(
|
||||
headlineMedium: GoogleFonts.inter(
|
||||
@@ -115,6 +147,7 @@ class AppTheme {
|
||||
scaffoldBackgroundColor: colorScheme.surface,
|
||||
pageTransitionsTheme: _pageTransitionsTheme,
|
||||
sliderTheme: _sliderTheme,
|
||||
scrollbarTheme: _scrollbarTheme(colorScheme),
|
||||
textTheme: GoogleFonts.interTextTheme(ThemeData.dark().textTheme)
|
||||
.copyWith(
|
||||
headlineMedium: GoogleFonts.inter(
|
||||
|
||||
Reference in New Issue
Block a user