fix(ui): align local lyrics and refine Mornye selection

Read embedded lyrics through the playback metadata fallback when the lyrics reader misses them. Restore edge icon highlighting during navbar drags, tune selection contrast, and blend the profile name field into its card.
This commit is contained in:
zarzet committed 2026-09-21 18:07:15 +07:00
1 parent d8d46108bc
commit 1c535b493c
7 files changed
+217 -37

No files matched your search

+15 -4
View File
@@ -107,7 +107,7 @@ class MornyeBottomBar extends ConsumerWidget {
scheme.brightness == Brightness.dark ? 0.5 : 0.4,
);
final player = MiniPlayer(compact: collapsed, bottomPadding: 0);
final tabs = TickerMode(
Widget tabs({required bool hideEdgeIcons}) => TickerMode(
enabled: !collapsed,
child: RepaintBoundary(
child: MornyeTabBar(
@@ -115,10 +115,15 @@ class MornyeBottomBar extends ConsumerWidget {
selectedIndex: selectedIndex,
onSelected: onSelected,
blurEnabled: blurEnabled,
hideEdgeIcons: true,
hideEdgeIcons: hideEdgeIcons,
),
),
);
// At rest the glass bar must paint its own edge icons: its selected layer
// follows a dragged pill before the destination is committed. Hand them
// to the moving overlays only while folding, at the same coordinates.
final fullTabs = tabs(hideEdgeIcons: false);
final foldingTabs = tabs(hideEdgeIcons: true);
return LayoutBuilder(
builder: (context, constraints) {
// Match the tab's actual label height, including accessibility scaling.
@@ -185,7 +190,10 @@ class MornyeBottomBar extends ConsumerWidget {
scheme.primary,
amount,
),
icon: destinations[index].icon,
icon: Opacity(
opacity: amount == 0 ? 0 : 1,
child: destinations[index].icon,
),
onPressed: home ? onHome : onSearch,
),
),
@@ -237,7 +245,10 @@ class MornyeBottomBar extends ConsumerWidget {
ignoring: amount > 0.5,
child: ExcludeSemantics(
excluding: amount > 0.5,
child: Opacity(opacity: 1 - amount, child: tabs),
child: Opacity(
opacity: 1 - amount,
child: amount == 0 ? fullTabs : foldingTabs,
),
),
),
),
+11 -5
View File
@@ -451,6 +451,9 @@ class MornyeTabBar extends StatelessWidget {
@override
Widget build(BuildContext context) {
final scheme = Theme.of(context).colorScheme;
final selectionFill = scheme.onSurface.withValues(
alpha: scheme.brightness == Brightness.dark ? 0.12 : 0.08,
);
final inactiveIconColor = Color.lerp(
scheme.onSurfaceVariant,
scheme.onSurface,
@@ -510,12 +513,13 @@ class MornyeTabBar extends StatelessWidget {
iconSize: 25,
labelFontSize: 11,
),
pillStyle: const LiquidGlassTabPillStyle(
pillStyle: LiquidGlassTabPillStyle(
mode: LiquidGlassPillMode.impellerOnly,
color: selectionFill,
animated: true,
// Keep the moving refractive pill, without stacking the
// package's second magnifier lens beneath it.
magnifierPill: LiquidGlassTabMagnifierPillStyle(
magnifierPill: const LiquidGlassTabMagnifierPillStyle(
enabled: false,
),
),
@@ -548,7 +552,7 @@ class MornyeTabBar extends StatelessWidget {
?.copyWith(
fontSize: label.textStyle.fontSize,
fontWeight: FontWeight.w600,
color: scheme.onSurface,
color: label.textStyle.color,
),
),
),
@@ -591,7 +595,7 @@ class MornyeTabBar extends StatelessWidget {
),
decoration: BoxDecoration(
color: index == selectedIndex
? scheme.onSurface.withValues(alpha: 0.09)
? selectionFill
: Colors.transparent,
borderRadius: BorderRadius.circular(28),
),
@@ -625,7 +629,9 @@ class MornyeTabBar extends StatelessWidget {
style: Theme.of(context).textTheme.labelSmall
?.copyWith(
fontWeight: FontWeight.w600,
color: scheme.onSurface,
color: index == selectedIndex
? scheme.primary
: scheme.onSurface,
),
),
],