feat(ui): add premium PluriWave redesign
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../tema/pluriwave_tokens.dart';
|
||||
import '../tema/pluriwave_theme.dart';
|
||||
|
||||
enum PluriIconGlyph { home, search, favorites, player, settings }
|
||||
|
||||
enum PluriIconVariant { outline, filled, activeGlow }
|
||||
|
||||
class PluriIcon extends StatelessWidget {
|
||||
const PluriIcon({
|
||||
super.key,
|
||||
required this.glyph,
|
||||
this.variant = PluriIconVariant.outline,
|
||||
this.size = 24,
|
||||
this.semanticLabel,
|
||||
});
|
||||
|
||||
final PluriIconGlyph glyph;
|
||||
final PluriIconVariant variant;
|
||||
final double size;
|
||||
final String? semanticLabel;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final tokens = context.pluriTokens;
|
||||
final icon = Icon(
|
||||
_resolveData(),
|
||||
size: size,
|
||||
color: _resolveColor(context, tokens),
|
||||
);
|
||||
final child = variant == PluriIconVariant.activeGlow
|
||||
? Container(
|
||||
width: size + 12,
|
||||
height: size + 12,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: tokens.glowColor,
|
||||
blurRadius: 14,
|
||||
spreadRadius: 1,
|
||||
),
|
||||
],
|
||||
),
|
||||
alignment: Alignment.center,
|
||||
child: icon,
|
||||
)
|
||||
: icon;
|
||||
|
||||
return Semantics(
|
||||
label: semanticLabel ?? _fallbackLabel(glyph),
|
||||
image: true,
|
||||
child: ExcludeSemantics(child: child),
|
||||
);
|
||||
}
|
||||
|
||||
Color _resolveColor(BuildContext context, PluriWaveTokens tokens) {
|
||||
if (variant == PluriIconVariant.activeGlow) return tokens.electricMagenta;
|
||||
if (variant == PluriIconVariant.filled) return Theme.of(context).colorScheme.onSurface;
|
||||
return Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.78);
|
||||
}
|
||||
|
||||
IconData _resolveData() {
|
||||
return switch ((glyph, variant)) {
|
||||
(PluriIconGlyph.home, PluriIconVariant.outline) => Icons.home_outlined,
|
||||
(PluriIconGlyph.home, _) => Icons.home_rounded,
|
||||
(PluriIconGlyph.search, PluriIconVariant.outline) => Icons.search_outlined,
|
||||
(PluriIconGlyph.search, _) => Icons.search_rounded,
|
||||
(PluriIconGlyph.favorites, PluriIconVariant.outline) => Icons.favorite_border_rounded,
|
||||
(PluriIconGlyph.favorites, _) => Icons.favorite_rounded,
|
||||
(PluriIconGlyph.player, PluriIconVariant.outline) => Icons.play_circle_outline_rounded,
|
||||
(PluriIconGlyph.player, _) => Icons.play_circle_rounded,
|
||||
(PluriIconGlyph.settings, PluriIconVariant.outline) => Icons.settings_outlined,
|
||||
(PluriIconGlyph.settings, _) => Icons.settings_rounded,
|
||||
};
|
||||
}
|
||||
|
||||
String _fallbackLabel(PluriIconGlyph glyph) {
|
||||
return switch (glyph) {
|
||||
PluriIconGlyph.home => 'Inicio',
|
||||
PluriIconGlyph.search => 'Buscar',
|
||||
PluriIconGlyph.favorites => 'Favoritos',
|
||||
PluriIconGlyph.player => 'Reproductor',
|
||||
PluriIconGlyph.settings => 'Ajustes',
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user