diff --git a/README.md b/README.md
index 395cbfc..e84da89 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
-
+
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"