import 'package:flutter/material.dart'; import '../../../shared/theme/theme_extensions.dart'; class PressableScale extends StatefulWidget { final Widget child; final VoidCallback? onTap; final BorderRadius? borderRadius; const PressableScale({ super.key, required this.child, this.onTap, this.borderRadius, }); @override State createState() => _PressableScaleState(); } class _PressableScaleState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; late Animation _scale; @override void initState() { super.initState(); _controller = AnimationController( vsync: this, duration: AnimationDuration.fast, lowerBound: 0.0, upperBound: 1.0, ); _scale = Tween(begin: 1.0, end: 0.98).animate( CurvedAnimation(parent: _controller, curve: AnimationCurves.easeInOut), ); } @override void dispose() { _controller.dispose(); super.dispose(); } void _onTapDown(TapDownDetails _) => _controller.forward(); void _onTapUp(TapUpDetails _) => _controller.reverse(); void _onTapCancel() => _controller.reverse(); @override Widget build(BuildContext context) { return GestureDetector( onTapDown: _onTapDown, onTapUp: _onTapUp, onTapCancel: _onTapCancel, onTap: widget.onTap, child: ScaleTransition( scale: _scale, child: ClipRRect( borderRadius: widget.borderRadius ?? BorderRadius.circular(AppBorderRadius.card), child: widget.child, ), ), ); } }