import 'dart:ui'; import 'package:flutter/material.dart'; import '../tema/pluriwave_theme.dart'; /// S3+S4 (Tier 1 visual fidelity): the prototype's own system rule (`t4` /// line 40, verbatim) — "Superficie de lista opaca #102532, cristal solo en /// el cromo y en la tarjeta activa" ("Opaque list surface #102532, glass /// only in the chrome and in the active card"). This primitive backs nearly /// every card/row in the app, so [glass] defaults to `false`: an OPAQUE /// [PluriWaveTokens.listSurface] fill, no blur. Pass `glass: true` for the /// rule's two named exceptions — chrome (e.g. `MiniReproductor`) and the /// active/now-playing card (Escuchar's `_EscucharHero`) — to keep the /// original translucent, blurred look there. class PluriGlassSurface extends StatelessWidget { const PluriGlassSurface({ super.key, required this.child, this.padding = const EdgeInsets.all(16), this.borderRadius, this.blurSigma = 18, this.glowColor, this.glass = false, }); final Widget child; final EdgeInsetsGeometry padding; final BorderRadius? borderRadius; final double blurSigma; final Color? glowColor; /// See class doc — `false` (opaque `listSurface`) is the system default. final bool glass; @override Widget build(BuildContext context) { final t = context.pluriTokens; final radius = borderRadius ?? BorderRadius.circular(t.radiusMd); final decoratedChild = DecoratedBox( decoration: BoxDecoration( color: glass ? t.glassSurface : t.listSurface, borderRadius: radius, border: Border.all( color: glass ? t.glassBorder : Colors.white.withValues(alpha: 0.07), ), boxShadow: glass ? [ BoxShadow( color: glowColor ?? t.glowColor.withValues(alpha: 0.12), blurRadius: 30, spreadRadius: -14, offset: const Offset(0, 18), ), ] : null, ), child: Padding(padding: padding, child: child), ); if (!glass) { return RepaintBoundary( child: ClipRRect(borderRadius: radius, child: decoratedChild), ); } return RepaintBoundary( child: ClipRRect( borderRadius: radius, child: BackdropFilter( filter: ImageFilter.blur(sigmaX: blurSigma, sigmaY: blurSigma), child: decoratedChild, ), ), ); } }