import 'package:flutter/material.dart'; import '../../../../l10n/app_localizations.dart'; import '../../../../shared/theme/app_color_palette.dart'; import '../../../../shared/theme/design_tokens.dart'; import '../../../../shared/widgets/toast/toast.dart'; import '../../../../shared/widgets/toast/toast_type.dart'; class SectionLabel extends StatelessWidget { const SectionLabel({super.key, required this.text}); final String text; @override Widget build(BuildContext context) { final colors = Theme.of(context).colorScheme; return Padding( padding: const EdgeInsets.only( left: AppSpacing.sm, bottom: AppSpacing.sm, ), child: Text( text, style: Theme.of(context).textTheme.bodySmall?.copyWith( color: colors.primary, fontWeight: FontWeight.w700, ), ), ); } } class SettingsGroupCard extends StatelessWidget { const SettingsGroupCard({super.key, required this.children}); final List children; @override Widget build(BuildContext context) { final colors = Theme.of(context).colorScheme; return Card( margin: EdgeInsets.zero, elevation: 0, color: colors.surface, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppRadius.xl), ), child: Column(children: children), ); } } class SettingsMenuTile extends StatelessWidget { const SettingsMenuTile({ super.key, required this.icon, required this.title, required this.subtitle, required this.tint, required this.background, required this.onTap, this.showDivider = true, this.showChevron = true, this.trailing, }); final IconData icon; final String title; final String subtitle; final Color tint; final Color background; final VoidCallback onTap; final bool showDivider; final bool showChevron; final Widget? trailing; @override Widget build(BuildContext context) { final colors = Theme.of(context).colorScheme; return Column( children: [ ListTile( onTap: onTap, contentPadding: const EdgeInsets.symmetric( horizontal: AppSpacing.lg, vertical: AppSpacing.sm, ), leading: Container( width: 40, height: 40, decoration: BoxDecoration( color: background, borderRadius: BorderRadius.circular(AppRadius.md), ), child: Icon(icon, color: tint), ), title: Text(title), subtitle: Padding( padding: const EdgeInsets.only(top: AppSpacing.xs), child: Text(subtitle), ), trailing: trailing ?? (showChevron ? Icon(Icons.chevron_right_rounded, color: colors.outline) : null), ), if (showDivider) Divider( height: 1, indent: 72, endIndent: AppSpacing.lg, color: colors.outline, ), ], ); } } class ProfileHeaderCard extends StatelessWidget { const ProfileHeaderCard({ super.key, required this.account, required this.version, }); final String account; final int version; @override Widget build(BuildContext context) { final l10n = AppLocalizations.of(context)!; final colors = Theme.of(context).colorScheme; return Card( margin: EdgeInsets.zero, elevation: 0, color: colors.surface, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppRadius.xl), ), child: Padding( padding: const EdgeInsets.all(AppSpacing.lg), child: Row( children: [ CircleAvatar( radius: 28, backgroundColor: colors.surfaceContainerHighest, child: Icon(Icons.person_rounded, color: colors.primary), ), const SizedBox(width: AppSpacing.md), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(account, style: Theme.of(context).textTheme.titleMedium), const SizedBox(height: AppSpacing.xs), Text( '${l10n.settingsVersionLabel}: v$version', style: Theme.of(context).textTheme.bodySmall, ), ], ), ), ], ), ), ); } } class WalletHeroCard extends StatelessWidget { const WalletHeroCard({ super.key, required this.balance, required this.subtitle, required this.onTap, }); final int balance; final String subtitle; final VoidCallback onTap; @override Widget build(BuildContext context) { final l10n = AppLocalizations.of(context)!; final colors = Theme.of(context).colorScheme; final palette = Theme.of(context).extension()!; return InkWell( onTap: onTap, borderRadius: BorderRadius.circular(AppRadius.xl), child: Ink( decoration: BoxDecoration( borderRadius: BorderRadius.circular(AppRadius.xl), gradient: LinearGradient( colors: [colors.primary, palette.accentPurple], ), ), child: Padding( padding: const EdgeInsets.all(AppSpacing.xl), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Container( padding: const EdgeInsets.all(AppSpacing.md), decoration: BoxDecoration( color: colors.onPrimary.withValues(alpha: 0.14), borderRadius: BorderRadius.circular(AppRadius.lg), ), child: Icon( Icons.monetization_on_rounded, color: colors.onPrimary, ), ), const Spacer(), Icon( Icons.chevron_right_rounded, color: colors.onPrimary.withValues(alpha: 0.9), ), ], ), const SizedBox(height: AppSpacing.lg), Text( l10n.settingsCoinBalanceValue(balance), style: Theme.of( context, ).textTheme.headlineMedium?.copyWith(color: colors.onPrimary), ), const SizedBox(height: AppSpacing.xs), Text( subtitle, style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: colors.onPrimary.withValues(alpha: 0.92), ), ), ], ), ), ), ); } } class CoinPackageCard extends StatelessWidget { const CoinPackageCard({ super.key, required this.title, required this.price, required this.amount, this.badge, }); final String title; final String price; final int amount; final String? badge; @override Widget build(BuildContext context) { final l10n = AppLocalizations.of(context)!; final colors = Theme.of(context).colorScheme; final palette = Theme.of(context).extension()!; return Card( margin: EdgeInsets.zero, elevation: 0, color: colors.surface, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppRadius.xl), ), child: Padding( padding: const EdgeInsets.all(AppSpacing.lg), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title, style: Theme.of(context).textTheme.titleMedium, ), const SizedBox(height: AppSpacing.xs), Text( l10n.settingsCoinAmount(amount), style: Theme.of(context).textTheme.bodyMedium, ), ], ), ), if (badge != null) Container( padding: const EdgeInsets.symmetric( horizontal: AppSpacing.sm, vertical: AppSpacing.xs, ), decoration: BoxDecoration( color: palette.historyGoldBg, borderRadius: BorderRadius.circular(AppRadius.full), ), child: Text( badge!, style: Theme.of(context).textTheme.bodySmall?.copyWith( color: palette.historyGoldText, fontWeight: FontWeight.w700, ), ), ), ], ), const SizedBox(height: AppSpacing.lg), Row( children: [ Text( price, style: Theme.of( context, ).textTheme.headlineMedium?.copyWith(color: colors.primary), ), const Spacer(), FilledButton( onPressed: () { Toast.show( context, l10n.settingsPurchasePending, type: ToastType.info, ); }, style: FilledButton.styleFrom( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppRadius.full), ), ), child: Text(l10n.settingsPurchaseButton), ), ], ), ], ), ), ); } }