Agrega PRIVACY.md, actualiza AGENTS.md

This commit is contained in:
Super User
2026-06-14 15:34:53 -04:00
parent 9ac9e9e953
commit 0df1bf90cf
20 changed files with 685 additions and 166 deletions

View File

@@ -1,10 +1,11 @@
import 'package:flutter/material.dart';
class StatCard extends StatelessWidget {
class StatCard extends StatefulWidget {
final String title;
final String value;
final IconData icon;
final Color color;
final int delayMs;
const StatCard({
super.key,
@@ -12,26 +13,79 @@ class StatCard extends StatelessWidget {
required this.value,
required this.icon,
required this.color,
this.delayMs = 0,
});
@override
State<StatCard> createState() => _StatCardState();
}
class _StatCardState extends State<StatCard>
with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _fadeAnim;
late Animation<Offset> _slideAnim;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(milliseconds: 400),
vsync: this,
);
_fadeAnim = Tween<double>(begin: 0, end: 1).animate(
CurvedAnimation(parent: _controller, curve: Curves.easeOut),
);
_slideAnim = Tween<Offset>(
begin: const Offset(0, 0.15),
end: Offset.zero,
).animate(
CurvedAnimation(parent: _controller, curve: Curves.easeOutCubic),
);
if (widget.delayMs > 0) {
Future.delayed(Duration(milliseconds: widget.delayMs), () {
if (mounted) _controller.forward();
});
} else {
_controller.forward();
}
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
final theme = Theme.of(context);
return FadeTransition(
opacity: _fadeAnim,
child: SlideTransition(
position: _slideAnim,
child: Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(icon, color: color, size: 20),
const SizedBox(width: 8),
Text(title, style: Theme.of(context).textTheme.bodySmall),
Row(
children: [
Icon(widget.icon, color: widget.color, size: 20),
const SizedBox(width: 8),
Text(widget.title, style: theme.textTheme.bodySmall),
],
),
const SizedBox(height: 8),
Text(
widget.value,
style: theme.textTheme.headlineSmall
?.copyWith(fontWeight: FontWeight.bold),
),
],
),
const SizedBox(height: 8),
Text(value, style: Theme.of(context).textTheme.headlineSmall?.copyWith(fontWeight: FontWeight.bold)),
],
),
),
),
);