Files
pluriwave/lib/tema/pluriwave_tokens.dart
T
FreeTLab b8f078bc14 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.
2026-07-29 20:00:30 +02:00

169 lines
6.0 KiB
Dart

import 'dart:ui' show lerpDouble;
import 'package:flutter/material.dart';
@immutable
class PluriWaveTokens extends ThemeExtension<PluriWaveTokens> {
const PluriWaveTokens({
required this.deepViolet,
required this.electricMagenta,
required this.warmCoral,
required this.glassSurface,
required this.glassBorder,
required this.glowColor,
required this.listSurface,
required this.liveGreen,
required this.offlineAccent,
required this.balloonSurface,
required this.radiusSm,
required this.radiusMd,
required this.radiusLg,
required this.spacingXs,
required this.spacingSm,
required this.spacingMd,
required this.spacingLg,
});
final Color deepViolet;
final Color electricMagenta;
final Color warmCoral;
final Color glassSurface;
final Color glassBorder;
final Color glowColor;
/// Redesign additions (Design ADR-1). Row/card surface for the flat lists
/// introduced by the redesign (Favoritos, Buscar results). De-literalised
/// from `pluriwave_theme.dart`'s previous `surfaceContainerLow` literal —
/// same value, now named — so rendered output stays byte-identical.
final Color listSurface;
/// "EN DIRECTO" indicator and the Escuchar hero's waveform colour.
/// De-literalised from `pluriwave_theme.dart`'s previous `secondary`
/// literal — same value, now named.
final Color liveGreen;
/// Offline/reconnect banner accent (WU16). Value from the proposal's WU1
/// scope line (`#E8879A`) — no prior literal in `pluriwave_theme.dart` to
/// promote, but the hex value itself is not this file's discretion.
final Color offlineAccent;
/// Solid capsule fill for the "barra globo" bottom navigation (Design turn
/// t4, option 4a — the balloon and the flat bar share this colour so their
/// union reads as a single inflated shape). No prior literal to promote —
/// new brand-system near-black distinct from [deepViolet].
final Color balloonSurface;
final double radiusSm;
final double radiusMd;
final double radiusLg;
final double spacingXs;
final double spacingSm;
final double spacingMd;
final double spacingLg;
/// Brand accent (S5-R8). Same hue as [electricMagenta]; exposed as a
/// static const so const contexts (e.g. AudioServiceConfig) can use it.
static const Color brand = Color(0xFF21D4D9);
/// Secondary palette used by gradients and decorative orbs (S5-R1).
/// These are token DEFINITIONS — the only place raw literals may live.
static const Color brightCyan = Color(0xFF20E6FF);
static const Color auroraTeal = Color(0xFF0E4A4F);
static const Color skyBlue = Color(0xFF60A5FA);
static const dark = PluriWaveTokens(
deepViolet: Color(0xFF07121A),
electricMagenta: brand,
warmCoral: Color(0xFFF4B860),
glassSurface: Color(0x1FFFFFFF),
glassBorder: Color(0x33FFFFFF),
glowColor: Color(0x6621D4D9),
listSurface: Color(0xFF102532),
liveGreen: Color(0xFF7EE4C2),
offlineAccent: Color(0xFFE8879A),
balloonSurface: Color(0xFF0A1B24),
radiusSm: 14,
radiusMd: 22,
radiusLg: 30,
spacingXs: 4,
spacingSm: 8,
spacingMd: 16,
spacingLg: 24,
);
@override
PluriWaveTokens copyWith({
Color? deepViolet,
Color? electricMagenta,
Color? warmCoral,
Color? glassSurface,
Color? glassBorder,
Color? glowColor,
Color? listSurface,
Color? liveGreen,
Color? offlineAccent,
Color? balloonSurface,
double? radiusSm,
double? radiusMd,
double? radiusLg,
double? spacingXs,
double? spacingSm,
double? spacingMd,
double? spacingLg,
}) {
return PluriWaveTokens(
deepViolet: deepViolet ?? this.deepViolet,
electricMagenta: electricMagenta ?? this.electricMagenta,
warmCoral: warmCoral ?? this.warmCoral,
glassSurface: glassSurface ?? this.glassSurface,
glassBorder: glassBorder ?? this.glassBorder,
glowColor: glowColor ?? this.glowColor,
listSurface: listSurface ?? this.listSurface,
liveGreen: liveGreen ?? this.liveGreen,
offlineAccent: offlineAccent ?? this.offlineAccent,
balloonSurface: balloonSurface ?? this.balloonSurface,
radiusSm: radiusSm ?? this.radiusSm,
radiusMd: radiusMd ?? this.radiusMd,
radiusLg: radiusLg ?? this.radiusLg,
spacingXs: spacingXs ?? this.spacingXs,
spacingSm: spacingSm ?? this.spacingSm,
spacingMd: spacingMd ?? this.spacingMd,
spacingLg: spacingLg ?? this.spacingLg,
);
}
@override
PluriWaveTokens lerp(
covariant ThemeExtension<PluriWaveTokens>? other,
double t,
) {
if (other is! PluriWaveTokens) return this;
return PluriWaveTokens(
deepViolet: Color.lerp(deepViolet, other.deepViolet, t) ?? deepViolet,
electricMagenta:
Color.lerp(electricMagenta, other.electricMagenta, t) ??
electricMagenta,
warmCoral: Color.lerp(warmCoral, other.warmCoral, t) ?? warmCoral,
glassSurface:
Color.lerp(glassSurface, other.glassSurface, t) ?? glassSurface,
glassBorder: Color.lerp(glassBorder, other.glassBorder, t) ?? glassBorder,
glowColor: Color.lerp(glowColor, other.glowColor, t) ?? glowColor,
listSurface: Color.lerp(listSurface, other.listSurface, t) ?? listSurface,
liveGreen: Color.lerp(liveGreen, other.liveGreen, t) ?? liveGreen,
offlineAccent:
Color.lerp(offlineAccent, other.offlineAccent, t) ?? offlineAccent,
balloonSurface:
Color.lerp(balloonSurface, other.balloonSurface, t) ??
balloonSurface,
radiusSm: lerpDouble(radiusSm, other.radiusSm, t) ?? radiusSm,
radiusMd: lerpDouble(radiusMd, other.radiusMd, t) ?? radiusMd,
radiusLg: lerpDouble(radiusLg, other.radiusLg, t) ?? radiusLg,
spacingXs: lerpDouble(spacingXs, other.spacingXs, t) ?? spacingXs,
spacingSm: lerpDouble(spacingSm, other.spacingSm, t) ?? spacingSm,
spacingMd: lerpDouble(spacingMd, other.spacingMd, t) ?? spacingMd,
spacingLg: lerpDouble(spacingLg, other.spacingLg, t) ?? spacingLg,
);
}
}