/// Renders Reward Icon pieces for the FocusFlow Flutter timeline. library; import 'package:flutter/material.dart'; import '../../theme/focus_flow_tokens.dart'; /// Sparkle-style reward indicator for a timeline task. class RewardIcon extends StatelessWidget { /// Creates a reward icon. const RewardIcon({ this.color = FocusFlowTokens.accentMagenta, this.size = 24, super.key, }); /// Fill color used by the icon painter. final Color color; /// Square size of the painted icon. final double size; @override Widget build(BuildContext context) { return CustomPaint( size: Size.square(size), painter: _RewardIconPainter(color), ); } } class _RewardIconPainter extends CustomPainter { const _RewardIconPainter(this.color); final Color color; @override void paint(Canvas canvas, Size size) { final paint = Paint() ..color = color ..style = PaintingStyle.fill; _drawSparkle( canvas, paint, size.center(Offset.zero), size.shortestSide * 0.44, ); _drawSparkle( canvas, paint, Offset(size.width * 0.78, size.height * 0.24), size.shortestSide * 0.18, ); _drawSparkle( canvas, paint, Offset(size.width * 0.24, size.height * 0.78), size.shortestSide * 0.14, ); } void _drawSparkle(Canvas canvas, Paint paint, Offset center, double radius) { final path = Path() ..moveTo(center.dx, center.dy - radius) ..lineTo(center.dx + radius * 0.24, center.dy - radius * 0.24) ..lineTo(center.dx + radius, center.dy) ..lineTo(center.dx + radius * 0.24, center.dy + radius * 0.24) ..lineTo(center.dx, center.dy + radius) ..lineTo(center.dx - radius * 0.24, center.dy + radius * 0.24) ..lineTo(center.dx - radius, center.dy) ..lineTo(center.dx - radius * 0.24, center.dy - radius * 0.24) ..close(); canvas.drawPath(path, paint); } @override bool shouldRepaint(covariant _RewardIconPainter oldDelegate) { return oldDelegate.color != color; } }