feat(proj): init

This commit is contained in:
vl.arkhangelskii
2026-09-21 04:06:43 +03:00
commit c956b94983
1076 changed files with 50876 additions and 0 deletions
+56
View File
@@ -0,0 +1,56 @@
import 'package:flutter/cupertino.dart';
import 'package:please_pay_me/theme/tokens.dart';
import 'package:please_pay_me/ui/atoms/app_text.dart';
/// Inset-grouped card for free-form content (metrics, summaries).
class AppCard extends StatelessWidget {
const AppCard({
super.key,
required this.child,
this.title,
this.subtitle,
this.padding = const EdgeInsets.all(AppSpacing.s4),
this.margin = const EdgeInsets.symmetric(horizontal: AppSpacing.gutter),
this.onTap,
});
final Widget child;
final String? title;
final String? subtitle;
final EdgeInsetsGeometry padding;
final EdgeInsetsGeometry margin;
final VoidCallback? onTap;
@override
Widget build(BuildContext context) {
final card = Container(
margin: margin,
padding: padding,
decoration: BoxDecoration(
color: AppColors.of(context, AppColors.groupedSurface),
borderRadius: BorderRadius.circular(AppRadii.lg),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (title != null) AppText.headline(title!),
if (subtitle != null) ...[
const SizedBox(height: 2),
AppText.footnote(subtitle!),
],
if (title != null || subtitle != null) const SizedBox(height: AppSpacing.s3),
child,
],
),
);
if (onTap == null) return card;
return CupertinoButton(
padding: EdgeInsets.zero,
minimumSize: Size.zero,
onPressed: onTap,
child: card,
);
}
}