feat: toolbar section dividers & post card badge stacking deconfliction v2.0.13
This commit is contained in:
@@ -10,7 +10,7 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="https://img.shields.io/badge/Version-2.0.12-blueviolet?style=for-the-badge" alt="Version 2.0.12" />
|
<img src="https://img.shields.io/badge/Version-2.0.13-blueviolet?style=for-the-badge" alt="Version 2.0.13" />
|
||||||
<img src="https://img.shields.io/badge/Flutter-3.47+-02569B?style=for-the-badge&logo=flutter&logoColor=white" alt="Flutter" />
|
<img src="https://img.shields.io/badge/Flutter-3.47+-02569B?style=for-the-badge&logo=flutter&logoColor=white" alt="Flutter" />
|
||||||
<img src="https://img.shields.io/badge/Platform-Android%20%7C%20Linux%20%7C%20Windows-brightgreen?style=for-the-badge" alt="Platforms" />
|
<img src="https://img.shields.io/badge/Platform-Android%20%7C%20Linux%20%7C%20Windows-brightgreen?style=for-the-badge" alt="Platforms" />
|
||||||
<img src="https://img.shields.io/badge/Gitea-RarDog%2FLunaris-orange?style=for-the-badge&logo=gitea&logoColor=white" alt="Gitea" />
|
<img src="https://img.shields.io/badge/Gitea-RarDog%2FLunaris-orange?style=for-the-badge&logo=gitea&logoColor=white" alt="Gitea" />
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
const appDisplayVersion = '2.0.12';
|
const appDisplayVersion = '2.0.13';
|
||||||
const appBuildNumber = 34;
|
const appBuildNumber = 35;
|
||||||
const appReleaseChannel = 'Stable';
|
const appReleaseChannel = 'Stable';
|
||||||
|
|||||||
@@ -1,4 +1,14 @@
|
|||||||
const lunarisChangelog = [
|
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(
|
LunarisChange(
|
||||||
version: '2.0.12',
|
version: '2.0.12',
|
||||||
title: 'Feed 2.0: Pinterest Modern Redesign & Sleek Cards',
|
title: 'Feed 2.0: Pinterest Modern Redesign & Sleek Cards',
|
||||||
|
|||||||
@@ -179,7 +179,9 @@ class _FeedToolbarState extends State<FeedToolbar> {
|
|||||||
),
|
),
|
||||||
const SizedBox(width: 8),
|
const SizedBox(width: 8),
|
||||||
],
|
],
|
||||||
const SizedBox(width: 8),
|
const SizedBox(width: 4),
|
||||||
|
const _ToolbarDivider(),
|
||||||
|
const SizedBox(width: 10),
|
||||||
],
|
],
|
||||||
for (final period in TopPeriodFilter.values) ...[
|
for (final period in TopPeriodFilter.values) ...[
|
||||||
ChoiceChip(
|
ChoiceChip(
|
||||||
@@ -286,6 +288,8 @@ class _FeedToolbarState extends State<FeedToolbar> {
|
|||||||
onPressed: widget.onRefresh,
|
onPressed: widget.onRefresh,
|
||||||
),
|
),
|
||||||
const SizedBox(width: 6),
|
const SizedBox(width: 6),
|
||||||
|
const _ToolbarDivider(),
|
||||||
|
const SizedBox(width: 6),
|
||||||
FilterChip(
|
FilterChip(
|
||||||
visualDensity: VisualDensity.compact,
|
visualDensity: VisualDensity.compact,
|
||||||
selected: widget.rating != null,
|
selected: widget.rating != null,
|
||||||
@@ -294,6 +298,8 @@ class _FeedToolbarState extends State<FeedToolbar> {
|
|||||||
onSelected: (_) => widget.onRatingFilter(),
|
onSelected: (_) => widget.onRatingFilter(),
|
||||||
),
|
),
|
||||||
const SizedBox(width: 6),
|
const SizedBox(width: 6),
|
||||||
|
const _ToolbarDivider(),
|
||||||
|
const SizedBox(width: 6),
|
||||||
if (widget.providers.isNotEmpty) ...[
|
if (widget.providers.isNotEmpty) ...[
|
||||||
FilterChip(
|
FilterChip(
|
||||||
visualDensity: VisualDensity.compact,
|
visualDensity: VisualDensity.compact,
|
||||||
@@ -313,6 +319,9 @@ class _FeedToolbarState extends State<FeedToolbar> {
|
|||||||
),
|
),
|
||||||
const SizedBox(width: 6),
|
const SizedBox(width: 6),
|
||||||
],
|
],
|
||||||
|
const SizedBox(width: 2),
|
||||||
|
const _ToolbarDivider(),
|
||||||
|
const SizedBox(width: 6),
|
||||||
],
|
],
|
||||||
for (final period in TopPeriodFilter.values) ...[
|
for (final period in TopPeriodFilter.values) ...[
|
||||||
ChoiceChip(
|
ChoiceChip(
|
||||||
@@ -332,6 +341,20 @@ class _FeedToolbarState extends State<FeedToolbar> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 {
|
class _HorizontalWheelScroller extends StatefulWidget {
|
||||||
const _HorizontalWheelScroller({
|
const _HorizontalWheelScroller({
|
||||||
required this.builder,
|
required this.builder,
|
||||||
|
|||||||
@@ -244,7 +244,7 @@ class _PostCardState extends ConsumerState<PostCard>
|
|||||||
left: 0,
|
left: 0,
|
||||||
right: 0,
|
right: 0,
|
||||||
bottom: 0,
|
bottom: 0,
|
||||||
height: 48,
|
height: 64,
|
||||||
child: IgnorePointer(
|
child: IgnorePointer(
|
||||||
child: DecoratedBox(
|
child: DecoratedBox(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
@@ -252,7 +252,7 @@ class _PostCardState extends ConsumerState<PostCard>
|
|||||||
begin: Alignment.bottomCenter,
|
begin: Alignment.bottomCenter,
|
||||||
end: Alignment.topCenter,
|
end: Alignment.topCenter,
|
||||||
colors: [
|
colors: [
|
||||||
Colors.black.withValues(alpha: 0.65),
|
Colors.black.withValues(alpha: 0.72),
|
||||||
Colors.transparent,
|
Colors.transparent,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -266,34 +266,36 @@ class _PostCardState extends ConsumerState<PostCard>
|
|||||||
top: 8,
|
top: 8,
|
||||||
child: _ProviderBadge(name: post.providerName),
|
child: _ProviderBadge(name: post.providerName),
|
||||||
),
|
),
|
||||||
Positioned(
|
|
||||||
right: 8,
|
|
||||||
top: 8,
|
|
||||||
child: Row(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
if (post.fileType.toLowerCase().contains('video') ||
|
if (post.fileType.toLowerCase().contains('video') ||
|
||||||
post.fileType.toLowerCase().contains('webm') ||
|
post.fileType.toLowerCase().contains('webm') ||
|
||||||
post.fileType.toLowerCase().contains('mp4') ||
|
post.fileType.toLowerCase().contains('mp4') ||
|
||||||
post.fileType.toLowerCase().contains('gif')) ...[
|
post.fileType.toLowerCase().contains('gif'))
|
||||||
_MediaBadge(fileType: post.fileType),
|
Positioned(
|
||||||
const SizedBox(width: 4),
|
right: 8,
|
||||||
],
|
top: 8,
|
||||||
RatingBadge(rating: post.rating),
|
child: _MediaBadge(fileType: post.fileType),
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
Positioned(
|
Positioned(
|
||||||
left: 8,
|
left: 8,
|
||||||
bottom: 8,
|
bottom: 8,
|
||||||
child: Row(
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
if (widget.isViewed) ...[
|
if (widget.isViewed || widget.isDownloaded) ...[
|
||||||
const _SeenBadge(),
|
Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
if (widget.isViewed) const _SeenBadge(),
|
||||||
|
if (widget.isViewed && widget.isDownloaded)
|
||||||
const SizedBox(width: 4),
|
const SizedBox(width: 4),
|
||||||
|
if (widget.isDownloaded)
|
||||||
|
const _DownloadedBadge(),
|
||||||
],
|
],
|
||||||
if (widget.isDownloaded) const _DownloadedBadge(),
|
),
|
||||||
|
const SizedBox(height: 4),
|
||||||
|
],
|
||||||
|
RatingBadge(rating: post.rating),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -14,16 +14,23 @@ class RatingBadge extends StatelessWidget {
|
|||||||
'explicit' || 'e' => Colors.red,
|
'explicit' || 'e' => Colors.red,
|
||||||
_ => Colors.blueGrey,
|
_ => Colors.blueGrey,
|
||||||
};
|
};
|
||||||
return DecoratedBox(
|
return Container(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 6.5, vertical: 3),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: color.withValues(alpha: 0.85),
|
color: color.withValues(alpha: 0.88),
|
||||||
borderRadius: BorderRadius.circular(6),
|
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(
|
child: Text(
|
||||||
rating.isEmpty ? 'unknown' : rating,
|
rating.isEmpty ? 'unknown' : rating,
|
||||||
style: const TextStyle(fontSize: 11, color: Colors.white),
|
style: const TextStyle(
|
||||||
|
fontSize: 10.5,
|
||||||
|
color: Colors.white,
|
||||||
|
fontWeight: FontWeight.w700,
|
||||||
|
letterSpacing: 0.2,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
name: gel_rule_app
|
name: gel_rule_app
|
||||||
description: Local backend/core layer for a Flutter booru browser app.
|
description: Local backend/core layer for a Flutter booru browser app.
|
||||||
publish_to: "none"
|
publish_to: "none"
|
||||||
version: 2.0.12+34
|
version: 2.0.13+35
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=3.3.0 <4.0.0"
|
sdk: ">=3.3.0 <4.0.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user