import 'dart:ui' show lerpDouble; import 'package:flutter/material.dart'; @immutable class PluriWaveTokens extends ThemeExtension { 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.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). No prior literal to promote — /// a genuinely new colour. final Color offlineAccent; 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(0xFF94A3B8), 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, 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, 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? 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, 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, ); } }