138 lines
3.5 KiB
Dart
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;
|
|
}
|
|
}
|
|
}
|