feat: Material 3 Expressive анимации загрузки и нажатий

This commit is contained in:
klockky
2026-07-14 18:38:25 +03:00
parent e2949288aa
commit 3b60851037
49 changed files with 546 additions and 572 deletions
@@ -1,6 +1,9 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'small_spinner.dart';
import 'springy_tap.dart';
class PrimaryLoadingButton extends StatelessWidget {
final ValueListenable<bool> loading;
final VoidCallback? onPressed;
@@ -23,23 +26,22 @@ class PrimaryLoadingButton extends StatelessWidget {
final fg = foreground ?? cs.onPrimary;
return ValueListenableBuilder<bool>(
valueListenable: loading,
builder: (context, isLoading, _) => FilledButton(
onPressed: isLoading ? null : onPressed,
style: FilledButton.styleFrom(
backgroundColor: background ?? cs.primary,
foregroundColor: fg,
padding: const EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
builder: (context, isLoading, _) => SpringyTap(
enabled: !isLoading,
child: FilledButton(
onPressed: isLoading ? null : onPressed,
style: FilledButton.styleFrom(
backgroundColor: background ?? cs.primary,
foregroundColor: fg,
padding: const EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
child: isLoading
? SmallSpinner(size: 20, color: fg)
: child,
),
child: isLoading
? SizedBox(
width: 20,
height: 20,
child: CircularProgressIndicator(strokeWidth: 2, color: fg),
)
: child,
),
);
}