159 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'package:flutter/material.dart';
 | 
						|
import 'package:gap/gap.dart';
 | 
						|
import 'package:easy_localization/easy_localization.dart';
 | 
						|
import 'package:styled_widget/styled_widget.dart';
 | 
						|
 | 
						|
class LevelingProgressCard extends StatelessWidget {
 | 
						|
  final int level;
 | 
						|
  final int experience;
 | 
						|
  final double progress;
 | 
						|
  final VoidCallback? onTap;
 | 
						|
  final bool isCompact;
 | 
						|
 | 
						|
  const LevelingProgressCard({
 | 
						|
    super.key,
 | 
						|
    required this.level,
 | 
						|
    required this.experience,
 | 
						|
    required this.progress,
 | 
						|
    this.onTap,
 | 
						|
    this.isCompact = false,
 | 
						|
  });
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    // Calculate level stage (1-12, each stage covers 10 levels)
 | 
						|
    int stage = ((level - 1) ~/ 10) + 1;
 | 
						|
    stage = stage.clamp(1, 12); // Ensure stage is within 1-12
 | 
						|
 | 
						|
    // Define colors for each stage
 | 
						|
    const List<Color> stageColors = [
 | 
						|
      Colors.green,
 | 
						|
      Colors.blue,
 | 
						|
      Colors.teal,
 | 
						|
      Colors.cyan,
 | 
						|
      Colors.indigo,
 | 
						|
      Colors.lime,
 | 
						|
      Colors.yellow,
 | 
						|
      Colors.amber,
 | 
						|
      Colors.orange,
 | 
						|
      Colors.deepOrange,
 | 
						|
      Colors.pink,
 | 
						|
      Colors.red,
 | 
						|
    ];
 | 
						|
 | 
						|
    Color stageColor = stageColors[stage - 1];
 | 
						|
 | 
						|
    // Compact mode adjustments
 | 
						|
    final double levelFontSize = isCompact ? 14 : 18;
 | 
						|
    final double stageFontSize = isCompact ? 13 : 14;
 | 
						|
    final double experienceFontSize = isCompact ? 12 : 14;
 | 
						|
    final double progressHeight = isCompact ? 6 : 10;
 | 
						|
    final double horizontalPadding = isCompact ? 16 : 20;
 | 
						|
    final double verticalPadding = isCompact ? 12 : 16;
 | 
						|
    final double gapSize = isCompact ? 4 : 8;
 | 
						|
    final double rowSpacing = 12;
 | 
						|
 | 
						|
    final cardContent = Card(
 | 
						|
      margin: EdgeInsets.zero,
 | 
						|
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
 | 
						|
      child: InkWell(
 | 
						|
        onTap: onTap,
 | 
						|
        borderRadius: BorderRadius.circular(12),
 | 
						|
        child: Container(
 | 
						|
          decoration: BoxDecoration(
 | 
						|
            borderRadius: BorderRadius.circular(12),
 | 
						|
            gradient: LinearGradient(
 | 
						|
              colors: [
 | 
						|
                stageColor.withOpacity(0.1),
 | 
						|
                Theme.of(context).colorScheme.surface,
 | 
						|
              ],
 | 
						|
              begin: Alignment.topLeft,
 | 
						|
              end: Alignment.bottomRight,
 | 
						|
            ),
 | 
						|
          ),
 | 
						|
          child: Column(
 | 
						|
            crossAxisAlignment: CrossAxisAlignment.stretch,
 | 
						|
            children: [
 | 
						|
              Row(
 | 
						|
                spacing: rowSpacing,
 | 
						|
                crossAxisAlignment: CrossAxisAlignment.baseline,
 | 
						|
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | 
						|
                textBaseline: TextBaseline.alphabetic,
 | 
						|
                children: [
 | 
						|
                  Expanded(
 | 
						|
                    child: Text(
 | 
						|
                      'levelingProgressLevel'.tr(args: [level.toString()]),
 | 
						|
                      style: TextStyle(
 | 
						|
                        color: stageColor,
 | 
						|
                        fontWeight: FontWeight.bold,
 | 
						|
                        fontSize: levelFontSize,
 | 
						|
                      ),
 | 
						|
                    ),
 | 
						|
                  ),
 | 
						|
                  Row(
 | 
						|
                    mainAxisSize: MainAxisSize.min,
 | 
						|
                    children: [
 | 
						|
                      Text(
 | 
						|
                        'levelingStage$stage'.tr(),
 | 
						|
                        style: TextStyle(
 | 
						|
                          color: stageColor.withOpacity(0.7),
 | 
						|
                          fontWeight: FontWeight.w500,
 | 
						|
                          fontSize: stageFontSize,
 | 
						|
                        ),
 | 
						|
                      ),
 | 
						|
                      if (onTap != null) ...[
 | 
						|
                        const Gap(4),
 | 
						|
                        Icon(
 | 
						|
                          Icons.arrow_forward_ios,
 | 
						|
                          size: isCompact ? 10 : 12,
 | 
						|
                          color: stageColor.withOpacity(0.7),
 | 
						|
                        ),
 | 
						|
                      ],
 | 
						|
                    ],
 | 
						|
                  ),
 | 
						|
                ],
 | 
						|
              ),
 | 
						|
              Gap(gapSize),
 | 
						|
              Row(
 | 
						|
                spacing: rowSpacing,
 | 
						|
                crossAxisAlignment: CrossAxisAlignment.center,
 | 
						|
                children: [
 | 
						|
                  Expanded(
 | 
						|
                    child: Tooltip(
 | 
						|
                      message: '${(progress * 100).toStringAsFixed(1)}%',
 | 
						|
                      child: LinearProgressIndicator(
 | 
						|
                        minHeight: progressHeight,
 | 
						|
                        value: progress,
 | 
						|
                        borderRadius: BorderRadius.circular(32),
 | 
						|
                        backgroundColor: Theme.of(
 | 
						|
                          context,
 | 
						|
                        ).colorScheme.surfaceContainerLow.withOpacity(0.75),
 | 
						|
                        color: stageColor,
 | 
						|
                        stopIndicatorRadius: 0,
 | 
						|
                        trackGap: 0,
 | 
						|
                      ),
 | 
						|
                    ),
 | 
						|
                  ),
 | 
						|
                  Text(
 | 
						|
                    'levelingProgressExperience'.tr(
 | 
						|
                      args: [experience.toString()],
 | 
						|
                    ),
 | 
						|
                    style: TextStyle(
 | 
						|
                      color: Theme.of(
 | 
						|
                        context,
 | 
						|
                      ).colorScheme.onSurface.withOpacity(0.8),
 | 
						|
                      fontSize: experienceFontSize,
 | 
						|
                    ),
 | 
						|
                  ),
 | 
						|
                ],
 | 
						|
              ),
 | 
						|
            ],
 | 
						|
          ).padding(horizontal: horizontalPadding, vertical: verticalPadding),
 | 
						|
        ),
 | 
						|
      ),
 | 
						|
    );
 | 
						|
 | 
						|
    return cardContent;
 | 
						|
  }
 | 
						|
}
 |