diff --git a/README.md b/README.md index 395cbfc..e84da89 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@

- Version 2.0.12 + Version 2.0.13 Flutter Platforms Gitea diff --git a/lib/app/app_version.dart b/lib/app/app_version.dart index a1c2764..ca113a7 100644 --- a/lib/app/app_version.dart +++ b/lib/app/app_version.dart @@ -1,3 +1,3 @@ -const appDisplayVersion = '2.0.12'; -const appBuildNumber = 34; +const appDisplayVersion = '2.0.13'; +const appBuildNumber = 35; const appReleaseChannel = 'Stable'; diff --git a/lib/app/changelog.dart b/lib/app/changelog.dart index 1fffae3..5c59019 100644 --- a/lib/app/changelog.dart +++ b/lib/app/changelog.dart @@ -1,4 +1,14 @@ const lunarisChangelog = [ + LunarisChange( + version: '2.0.13', + title: 'Toolbar Section Dividers & Post Card Badge Stacking Fix', + bullets: [ + 'Toolbar Section Dividers: added subtle vertical dividers between Actions (Reset/Refresh), Rating, Providers, and Top Periods to prevent visual clutter.', + 'Post Card Badge Deconfliction: moved Rating badge (Explicit/Questionable/Safe) to the bottom-left beneath the Seen/Downloaded indicators.', + 'Separated Provider & Media Badges: booru source (e.g. Gelbooru) remains top-left and Video/GIF badge remains top-right, preventing them from overlapping on narrow screens.', + 'Expanded Bottom Gradient: increased bottom cinematic gradient height to 64dp for clean text and badge contrast.', + ], + ), LunarisChange( version: '2.0.12', title: 'Feed 2.0: Pinterest Modern Redesign & Sleek Cards', diff --git a/lib/features/feed/presentation/widgets/feed_toolbar.dart b/lib/features/feed/presentation/widgets/feed_toolbar.dart index 99f3350..08703ca 100644 --- a/lib/features/feed/presentation/widgets/feed_toolbar.dart +++ b/lib/features/feed/presentation/widgets/feed_toolbar.dart @@ -179,7 +179,9 @@ class _FeedToolbarState extends State { ), const SizedBox(width: 8), ], - const SizedBox(width: 8), + const SizedBox(width: 4), + const _ToolbarDivider(), + const SizedBox(width: 10), ], for (final period in TopPeriodFilter.values) ...[ ChoiceChip( @@ -286,6 +288,8 @@ class _FeedToolbarState extends State { onPressed: widget.onRefresh, ), const SizedBox(width: 6), + const _ToolbarDivider(), + const SizedBox(width: 6), FilterChip( visualDensity: VisualDensity.compact, selected: widget.rating != null, @@ -294,6 +298,8 @@ class _FeedToolbarState extends State { onSelected: (_) => widget.onRatingFilter(), ), const SizedBox(width: 6), + const _ToolbarDivider(), + const SizedBox(width: 6), if (widget.providers.isNotEmpty) ...[ FilterChip( visualDensity: VisualDensity.compact, @@ -313,6 +319,9 @@ class _FeedToolbarState extends State { ), const SizedBox(width: 6), ], + const SizedBox(width: 2), + const _ToolbarDivider(), + const SizedBox(width: 6), ], for (final period in TopPeriodFilter.values) ...[ ChoiceChip( @@ -332,6 +341,20 @@ class _FeedToolbarState extends State { } } +class _ToolbarDivider extends StatelessWidget { + const _ToolbarDivider(); + + @override + Widget build(BuildContext context) { + return Container( + width: 1, + height: 20, + margin: const EdgeInsets.symmetric(horizontal: 2, vertical: 8), + color: Theme.of(context).colorScheme.outlineVariant.withValues(alpha: 0.4), + ); + } +} + class _HorizontalWheelScroller extends StatefulWidget { const _HorizontalWheelScroller({ required this.builder, diff --git a/lib/shared/widgets/post_card.dart b/lib/shared/widgets/post_card.dart index 999a4ff..12e1f32 100644 --- a/lib/shared/widgets/post_card.dart +++ b/lib/shared/widgets/post_card.dart @@ -244,7 +244,7 @@ class _PostCardState extends ConsumerState left: 0, right: 0, bottom: 0, - height: 48, + height: 64, child: IgnorePointer( child: DecoratedBox( decoration: BoxDecoration( @@ -252,7 +252,7 @@ class _PostCardState extends ConsumerState begin: Alignment.bottomCenter, end: Alignment.topCenter, colors: [ - Colors.black.withValues(alpha: 0.65), + Colors.black.withValues(alpha: 0.72), Colors.transparent, ], ), @@ -266,34 +266,36 @@ class _PostCardState extends ConsumerState top: 8, child: _ProviderBadge(name: post.providerName), ), - Positioned( - right: 8, - top: 8, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - if (post.fileType.toLowerCase().contains('video') || - post.fileType.toLowerCase().contains('webm') || - post.fileType.toLowerCase().contains('mp4') || - post.fileType.toLowerCase().contains('gif')) ...[ - _MediaBadge(fileType: post.fileType), - const SizedBox(width: 4), - ], - RatingBadge(rating: post.rating), - ], + if (post.fileType.toLowerCase().contains('video') || + post.fileType.toLowerCase().contains('webm') || + post.fileType.toLowerCase().contains('mp4') || + post.fileType.toLowerCase().contains('gif')) + Positioned( + right: 8, + top: 8, + child: _MediaBadge(fileType: post.fileType), ), - ), Positioned( left: 8, bottom: 8, - child: Row( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - if (widget.isViewed) ...[ - const _SeenBadge(), - const SizedBox(width: 4), + if (widget.isViewed || widget.isDownloaded) ...[ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (widget.isViewed) const _SeenBadge(), + if (widget.isViewed && widget.isDownloaded) + const SizedBox(width: 4), + if (widget.isDownloaded) + const _DownloadedBadge(), + ], + ), + const SizedBox(height: 4), ], - if (widget.isDownloaded) const _DownloadedBadge(), + RatingBadge(rating: post.rating), ], ), ), diff --git a/lib/shared/widgets/rating_badge.dart b/lib/shared/widgets/rating_badge.dart index ce7a8d8..f885462 100644 --- a/lib/shared/widgets/rating_badge.dart +++ b/lib/shared/widgets/rating_badge.dart @@ -14,16 +14,23 @@ class RatingBadge extends StatelessWidget { 'explicit' || 'e' => Colors.red, _ => Colors.blueGrey, }; - return DecoratedBox( + return Container( + padding: const EdgeInsets.symmetric(horizontal: 6.5, vertical: 3), decoration: BoxDecoration( - color: color.withValues(alpha: 0.85), - borderRadius: BorderRadius.circular(6), + color: color.withValues(alpha: 0.88), + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: Colors.white.withValues(alpha: 0.18), + width: 0.7, + ), ), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 7, vertical: 3), - child: Text( - rating.isEmpty ? 'unknown' : rating, - style: const TextStyle(fontSize: 11, color: Colors.white), + child: Text( + rating.isEmpty ? 'unknown' : rating, + style: const TextStyle( + fontSize: 10.5, + color: Colors.white, + fontWeight: FontWeight.w700, + letterSpacing: 0.2, ), ), ); diff --git a/pubspec.yaml b/pubspec.yaml index d389e34..9f92f20 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: gel_rule_app description: Local backend/core layer for a Flutter booru browser app. publish_to: "none" -version: 2.0.12+34 +version: 2.0.13+35 environment: sdk: ">=3.3.0 <4.0.0"