feat(nav): rebuild the bottom bar as the prototype's balloon bar

The functional redesign never touched pluri_bottom_navigation.dart, so the
bar kept the old glass + magenta/coral language while every other surface
moved on. Rebuilds it to prototype t4/4a: a 52px opaque #0A1B24 pill with a
110x74 balloon raised over the active tab, a teal radial glow behind it, the
active item lifted 15px with its label, and inactive items reduced to a 23px
icon at 46% opacity.

The five tabs and their PluriIconGlyph icons are unchanged, per the standing
decision — only the bar's shape, colour and behaviour move.

altura and PluriLayout.bottomChromeInset are both asserted against the real
laid-out height rather than hardcoded guesses.
This commit is contained in:
2026-07-29 20:00:30 +02:00
parent c01c518541
commit b8f078bc14
5 changed files with 555 additions and 94 deletions
+8
View File
@@ -15,6 +15,7 @@ class PluriIcon extends StatelessWidget {
this.variant = PluriIconVariant.outline,
this.size = 24,
this.semanticLabel,
this.color,
});
final PluriIconGlyph glyph;
@@ -22,6 +23,12 @@ class PluriIcon extends StatelessWidget {
final double size;
final String? semanticLabel;
/// Explicit colour override for the Icon-fallback render path (used when
/// the raster asset fails to decode). `null` (default) preserves the
/// existing variant-driven colour for every current call site — see
/// `_resolveColor`.
final Color? color;
@override
Widget build(BuildContext context) {
final tokens = context.pluriTokens;
@@ -82,6 +89,7 @@ class PluriIcon extends StatelessWidget {
}
Color _resolveColor(BuildContext context, PluriWaveTokens tokens) {
if (color != null) return color!;
if (variant == PluriIconVariant.activeGlow) return tokens.electricMagenta;
if (variant == PluriIconVariant.filled) {
return Theme.of(context).colorScheme.onSurface;