Files

138 lines
3.5 KiB
Dart

import 'package:flutter/material.dart';
/// PrimeVue 스타일의 뱃지 위젯
///
/// [label] - 뱃지에 표시할 텍스트
/// [color] - 뱃지의 배경색
/// [icon] - 뱃지 앞에 표시할 아이콘 (선택사항)
/// [severity] - 미리 정의된 색상 스타일 (info, success, warning, danger)
/// [size] - 뱃지 크기 (small, normal, large)
/// [outlined] - 외곽선 스타일 적용 여부
/// [rounded] - 둥근 모서리 적용 여부
class PrimeBadge extends StatelessWidget {
final String label;
final Color? color;
final IconData? icon;
final String? severity;
final String size;
final bool outlined;
final bool rounded;
const PrimeBadge({
super.key,
required this.label,
this.color,
this.icon,
this.severity,
this.size = 'normal',
this.outlined = false,
this.rounded = true,
});
@override
Widget build(BuildContext context) {
// 색상 결정 (severity 또는 직접 지정된 색상)
Color backgroundColor = _getBackgroundColor();
Color textColor = _getTextColor(backgroundColor);
// 크기에 따른 패딩 및 폰트 크기 설정
EdgeInsets padding = _getPadding();
double fontSize = _getFontSize();
double iconSize = _getIconSize();
// 테두리 반경 설정
double borderRadius = rounded ? 16.0 : 4.0;
return Container(
padding: padding,
decoration: BoxDecoration(
color: outlined ? Colors.transparent : backgroundColor,
border: outlined ? Border.all(color: backgroundColor) : null,
borderRadius: BorderRadius.circular(borderRadius),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
if (icon != null) ...[
Icon(
icon,
size: iconSize,
color: outlined ? backgroundColor : textColor,
),
SizedBox(width: 4),
],
Text(
label,
style: TextStyle(
color: outlined ? backgroundColor : textColor,
fontWeight: FontWeight.bold,
fontSize: fontSize,
),
),
],
),
);
}
Color _getBackgroundColor() {
if (color != null) {
return color!;
}
switch (severity) {
case 'info':
return Colors.blue;
case 'success':
return Colors.green;
case 'warning':
return Colors.orange;
case 'danger':
return Colors.red;
default:
return Colors.blue;
}
}
Color _getTextColor(Color backgroundColor) {
// 배경색의 밝기에 따라 텍스트 색상 결정 (밝은 배경 -> 어두운 텍스트, 어두운 배경 -> 밝은 텍스트)
final brightness = ThemeData.estimateBrightnessForColor(backgroundColor);
return brightness == Brightness.dark ? Colors.white : Colors.black87;
}
EdgeInsets _getPadding() {
switch (size) {
case 'small':
return const EdgeInsets.symmetric(horizontal: 8, vertical: 2);
case 'large':
return const EdgeInsets.symmetric(horizontal: 16, vertical: 8);
case 'normal':
default:
return const EdgeInsets.symmetric(horizontal: 12, vertical: 6);
}
}
double _getFontSize() {
switch (size) {
case 'small':
return 10.0;
case 'large':
return 16.0;
case 'normal':
default:
return 12.0;
}
}
double _getIconSize() {
switch (size) {
case 'small':
return 12.0;
case 'large':
return 20.0;
case 'normal':
default:
return 16.0;
}
}
}