main
dart 74 lines 1.95 KB
Raw
1 import 'package:flutter/material.dart';
2 import 'package:localmind/core/theme/colors.dart';
3 import 'package:localmind/l10n/app_localizations.dart';
4
5 class ThinkingIndicator extends StatefulWidget {
6 const ThinkingIndicator({super.key, required this.isDark});
7 final bool isDark;
8
9 @override
10 State<ThinkingIndicator> createState() => _ThinkingIndicatorState();
11 }
12
13 class _ThinkingIndicatorState extends State<ThinkingIndicator>
14 with SingleTickerProviderStateMixin {
15 late AnimationController _controller;
16
17 @override
18 void initState() {
19 super.initState();
20 _controller = AnimationController(
21 duration: const Duration(milliseconds: 1500),
22 vsync: this,
23 )..repeat();
24 }
25
26 @override
27 void dispose() {
28 _controller.dispose();
29 super.dispose();
30 }
31
32 @override
33 Widget build(BuildContext context) {
34 final l10n = AppLocalizations.of(context)!;
35 return Row(
36 mainAxisSize: MainAxisSize.min,
37 children: [
38 AnimatedBuilder(
39 animation: _controller,
40 builder: (context, child) {
41 return Container(
42 width: 6,
43 height: 6,
44 decoration: BoxDecoration(
45 color: widget.isDark
46 ? Color.lerp(
47 AppColors.darkMutedText,
48 AppColors.darkAccent,
49 _controller.value,
50 )
51 : Color.lerp(
52 AppColors.lightMutedText,
53 AppColors.darkAccent,
54 _controller.value,
55 ),
56 shape: BoxShape.circle,
57 ),
58 );
59 },
60 ),
61 const SizedBox(width: 4),
62 Text(
63 l10n.thinking,
64 style: TextStyle(
65 fontSize: 12,
66 color: widget.isDark
67 ? AppColors.darkMutedText
68 : AppColors.lightMutedText,
69 ),
70 ),
71 ],
72 );
73 }
74 }