import 'package:flutter/material.dart'; /// 섹션별 컨텐츠를 감싸는 기본 카드 위젯 /// 폼 섹션, 정보 표시 섹션 등에 사용됩니다. class SectionCard extends StatelessWidget { final String? title; final Widget child; final EdgeInsetsGeometry? padding; final EdgeInsetsGeometry? margin; final Color? backgroundColor; final double borderRadius; final List? boxShadow; final Border? border; final double? height; final double? width; final VoidCallback? onTap; const SectionCard({ super.key, this.title, required this.child, this.padding, this.margin, this.backgroundColor, this.borderRadius = 20, this.boxShadow, this.border, this.height, this.width, this.onTap, }); @override Widget build(BuildContext context) { final theme = Theme.of(context); final effectiveBackgroundColor = backgroundColor ?? Colors.white; final effectiveShadow = boxShadow ?? [ BoxShadow( color: Colors.black.withOpacity(0.05), blurRadius: 10, offset: const Offset(0, 4), ), ]; Widget card = Container( height: height, width: width, margin: margin, decoration: BoxDecoration( color: effectiveBackgroundColor, borderRadius: BorderRadius.circular(borderRadius), boxShadow: effectiveShadow, border: border, ), child: Padding( padding: padding ?? const EdgeInsets.all(20), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ if (title != null) ...[ Text( title!, style: TextStyle( fontSize: 18, fontWeight: FontWeight.w700, color: theme.colorScheme.onSurface, ), ), const SizedBox(height: 16), ], child, ], ), ), ); if (onTap != null) { return InkWell( onTap: onTap, borderRadius: BorderRadius.circular(borderRadius), child: card, ); } return card; } } /// 투명한 배경의 섹션 카드 /// 어두운 배경 위에서 사용하기 적합합니다. class TransparentSectionCard extends StatelessWidget { final String? title; final Widget child; final EdgeInsetsGeometry? padding; final EdgeInsetsGeometry? margin; final double opacity; final double borderRadius; final Color? borderColor; final VoidCallback? onTap; const TransparentSectionCard({ super.key, this.title, required this.child, this.padding, this.margin, this.opacity = 0.15, this.borderRadius = 16, this.borderColor, this.onTap, }); @override Widget build(BuildContext context) { Widget card = Container( margin: margin, decoration: BoxDecoration( color: Colors.white.withOpacity(opacity), borderRadius: BorderRadius.circular(borderRadius), border: borderColor != null ? Border.all(color: borderColor!, width: 1) : null, ), child: Padding( padding: padding ?? const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ if (title != null) ...[ Text( title!, style: TextStyle( fontSize: 16, fontWeight: FontWeight.w600, color: Colors.white.withOpacity(0.9), ), ), const SizedBox(height: 12), ], child, ], ), ), ); if (onTap != null) { return InkWell( onTap: onTap, borderRadius: BorderRadius.circular(borderRadius), child: card, ); } return card; } } /// 정보 표시용 카드 /// 읽기 전용 정보를 표시할 때 사용합니다. class InfoCard extends StatelessWidget { final String label; final String value; final IconData? icon; final Color? iconColor; final Color? backgroundColor; final EdgeInsetsGeometry? padding; final double borderRadius; const InfoCard({ super.key, required this.label, required this.value, this.icon, this.iconColor, this.backgroundColor, this.padding, this.borderRadius = 12, }); @override Widget build(BuildContext context) { final theme = Theme.of(context); return Container( padding: padding ?? const EdgeInsets.all(16), decoration: BoxDecoration( color: backgroundColor ?? theme.colorScheme.surface, borderRadius: BorderRadius.circular(borderRadius), ), child: Row( children: [ if (icon != null) ...[ Icon( icon, size: 24, color: iconColor ?? theme.colorScheme.primary, ), const SizedBox(width: 12), ], Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( label, style: TextStyle( fontSize: 14, color: theme.colorScheme.onSurface.withOpacity(0.6), ), ), const SizedBox(height: 4), Text( value, style: TextStyle( fontSize: 16, fontWeight: FontWeight.w600, color: theme.colorScheme.onSurface, ), ), ], ), ), ], ), ); } }