전체 UI 색상 통일 - 제각각이던 빨강/주황/파랑 계열을 의미별 토큰 4종으로 정리
danger/warning/success/approved(+각 Bg 버전)를 AppPalette에 추가하고, 화면마다 다르게 쓰이던 Colors.red[400/600/700]/redAccent, orange/amber 계열, blue 계열 리터럴을 전부 해당 토큰으로 교체. NFC 체크인 화면의 홀로 튀던 Colors.blueAccent도 함께 정리.
This commit is contained in:
@@ -39,7 +39,10 @@ class _AdminDashboardState extends State<AdminDashboard> {
|
||||
return AlertDialog(
|
||||
title: const Text(
|
||||
'DB 초기화 경고',
|
||||
style: TextStyle(color: Colors.red, fontWeight: FontWeight.bold),
|
||||
style: TextStyle(
|
||||
color: AppPalette.danger,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
content: const Text(
|
||||
'모든 학생의 출석 및 휴대폰 제출 데이터가 영구적으로 삭제됩니다.\n\n정말 초기화하시겠습니까?',
|
||||
@@ -50,7 +53,9 @@ class _AdminDashboardState extends State<AdminDashboard> {
|
||||
child: const Text('취소', style: TextStyle(color: Colors.grey)),
|
||||
),
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(backgroundColor: Colors.red),
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: AppPalette.danger,
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.pop(dialogContext);
|
||||
_resetDatabase();
|
||||
@@ -113,16 +118,18 @@ class _AdminDashboardState extends State<AdminDashboard> {
|
||||
const SizedBox(height: 40),
|
||||
|
||||
_controller.isLoading
|
||||
? const CircularProgressIndicator(color: Colors.red)
|
||||
? const CircularProgressIndicator(
|
||||
color: AppPalette.danger,
|
||||
)
|
||||
: SizedBox(
|
||||
width: double.infinity,
|
||||
height: 60,
|
||||
child: ElevatedButton.icon(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.red[50],
|
||||
foregroundColor: Colors.red,
|
||||
backgroundColor: AppPalette.dangerBg,
|
||||
foregroundColor: AppPalette.danger,
|
||||
side: const BorderSide(
|
||||
color: Colors.red,
|
||||
color: AppPalette.danger,
|
||||
width: 2,
|
||||
),
|
||||
shape: RoundedRectangleBorder(
|
||||
|
||||
@@ -140,7 +140,7 @@ class _BoardPostDetailScreenState extends State<BoardPostDetailScreen> {
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(dialogContext, true),
|
||||
child: const Text('삭제', style: TextStyle(color: Colors.red)),
|
||||
child: const Text('삭제', style: TextStyle(color: AppPalette.danger)),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -113,7 +113,7 @@ class _BoardReportScreenState extends State<BoardReportScreen> {
|
||||
Text(
|
||||
'신고 사유: ${report['reason']}',
|
||||
style: const TextStyle(
|
||||
color: Colors.redAccent,
|
||||
color: AppPalette.danger,
|
||||
fontSize: 12.5,
|
||||
),
|
||||
),
|
||||
@@ -145,7 +145,7 @@ class _BoardReportScreenState extends State<BoardReportScreen> {
|
||||
Expanded(
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.red[400],
|
||||
backgroundColor: AppPalette.danger,
|
||||
foregroundColor: Colors.white,
|
||||
),
|
||||
onPressed: _controller.isBusy
|
||||
|
||||
@@ -106,7 +106,7 @@ class _DeviceCheckoutLedgerPageState extends State<DeviceCheckoutLedgerPage> {
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
|
||||
title: const Row(
|
||||
children: [
|
||||
Icon(Icons.warning_amber_rounded, color: Colors.orange),
|
||||
Icon(Icons.warning_amber_rounded, color: AppPalette.warning),
|
||||
SizedBox(width: 8),
|
||||
Text('많은 시간요청 학생'),
|
||||
],
|
||||
@@ -147,7 +147,7 @@ class _DeviceCheckoutLedgerPageState extends State<DeviceCheckoutLedgerPage> {
|
||||
'${_timeRange(r['requestedStart'], r['requestedEnd'])} '
|
||||
'(약 ${hours?.toStringAsFixed(1)}시간)',
|
||||
style: const TextStyle(
|
||||
color: Colors.orange,
|
||||
color: AppPalette.warning,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 13,
|
||||
),
|
||||
@@ -172,8 +172,10 @@ class _DeviceCheckoutLedgerPageState extends State<DeviceCheckoutLedgerPage> {
|
||||
_reject(r['id']);
|
||||
},
|
||||
style: OutlinedButton.styleFrom(
|
||||
foregroundColor: Colors.red,
|
||||
side: const BorderSide(color: Colors.red),
|
||||
foregroundColor: AppPalette.danger,
|
||||
side: const BorderSide(
|
||||
color: AppPalette.danger,
|
||||
),
|
||||
),
|
||||
child: const Text('거절'),
|
||||
),
|
||||
@@ -224,13 +226,13 @@ class _DeviceCheckoutLedgerPageState extends State<DeviceCheckoutLedgerPage> {
|
||||
({Color color, String label}) _statusInfo(String status) {
|
||||
switch (status) {
|
||||
case 'PENDING':
|
||||
return (color: Colors.orange, label: '대기중');
|
||||
return (color: AppPalette.warning, label: '대기중');
|
||||
case 'APPROVED':
|
||||
return (color: Colors.blue, label: '승인됨');
|
||||
return (color: AppPalette.approved, label: '승인됨');
|
||||
case 'RETURNED':
|
||||
return (color: Colors.grey, label: '반납완료');
|
||||
case 'REJECTED':
|
||||
return (color: Colors.red, label: '거절됨');
|
||||
return (color: AppPalette.danger, label: '거절됨');
|
||||
default:
|
||||
return (color: Colors.grey, label: status);
|
||||
}
|
||||
@@ -276,7 +278,7 @@ class _DeviceCheckoutLedgerPageState extends State<DeviceCheckoutLedgerPage> {
|
||||
icon: Badge(
|
||||
isLabelVisible: longCount > 0,
|
||||
label: Text('$longCount'),
|
||||
backgroundColor: Colors.red,
|
||||
backgroundColor: AppPalette.danger,
|
||||
child: const Icon(Icons.warning_amber_rounded),
|
||||
),
|
||||
onPressed: _showLongRequestsDialog,
|
||||
@@ -297,14 +299,14 @@ class _DeviceCheckoutLedgerPageState extends State<DeviceCheckoutLedgerPage> {
|
||||
vertical: 10,
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.orange[100],
|
||||
color: AppPalette.warningBg,
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
border: Border.all(color: Colors.orange[400]!),
|
||||
border: Border.all(color: AppPalette.warning),
|
||||
),
|
||||
child: Text(
|
||||
'승인 대기 중인 요청이 $pendingCount건 있습니다.',
|
||||
style: TextStyle(
|
||||
color: Colors.orange[900],
|
||||
color: AppPalette.warning,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
@@ -340,15 +342,15 @@ class _DeviceCheckoutLedgerPageState extends State<DeviceCheckoutLedgerPage> {
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(16),
|
||||
side: isLong
|
||||
? BorderSide(
|
||||
color: Colors.red[400]!,
|
||||
? const BorderSide(
|
||||
color: AppPalette.danger,
|
||||
width: 2,
|
||||
)
|
||||
: (isPending
|
||||
? BorderSide(
|
||||
color: Colors.orange[300]!,
|
||||
? const BorderSide(
|
||||
color: AppPalette.warning,
|
||||
)
|
||||
: BorderSide(
|
||||
: const BorderSide(
|
||||
color: AppPalette.sage,
|
||||
)),
|
||||
),
|
||||
@@ -419,7 +421,7 @@ class _DeviceCheckoutLedgerPageState extends State<DeviceCheckoutLedgerPage> {
|
||||
Text(
|
||||
'${r['approvedByTeacherName']} 선생님이 허용했습니다',
|
||||
style: TextStyle(
|
||||
color: Colors.blue[700],
|
||||
color: AppPalette.approved,
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
),
|
||||
@@ -438,9 +440,10 @@ class _DeviceCheckoutLedgerPageState extends State<DeviceCheckoutLedgerPage> {
|
||||
style:
|
||||
OutlinedButton.styleFrom(
|
||||
foregroundColor:
|
||||
Colors.red,
|
||||
AppPalette.danger,
|
||||
side: const BorderSide(
|
||||
color: Colors.red,
|
||||
color:
|
||||
AppPalette.danger,
|
||||
),
|
||||
),
|
||||
child: const Text('거절'),
|
||||
|
||||
@@ -100,7 +100,7 @@ class _FriendsScreenState extends State<FriendsScreen> {
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(dialogContext, true),
|
||||
child: const Text('삭제', style: TextStyle(color: Colors.red)),
|
||||
child: const Text('삭제', style: TextStyle(color: AppPalette.danger)),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -196,7 +196,10 @@ class _GroupDetailScreenState extends State<GroupDetailScreen> {
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(dialogContext, true),
|
||||
child: const Text('나가기', style: TextStyle(color: Colors.red)),
|
||||
child: const Text(
|
||||
'나가기',
|
||||
style: TextStyle(color: AppPalette.danger),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -344,20 +344,23 @@ class _GroupListScreenState extends State<GroupListScreen> {
|
||||
vertical: 1,
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.red[50],
|
||||
color:
|
||||
AppPalette.warningBg,
|
||||
borderRadius:
|
||||
BorderRadius.circular(
|
||||
20,
|
||||
),
|
||||
border: Border.all(
|
||||
color: Colors.red,
|
||||
color:
|
||||
AppPalette.warning,
|
||||
),
|
||||
),
|
||||
child: Text(
|
||||
'대기 ${g['pendingRequestCount']}',
|
||||
style: const TextStyle(
|
||||
fontSize: 10,
|
||||
color: Colors.red,
|
||||
color:
|
||||
AppPalette.warning,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -122,7 +122,7 @@ class _LoginScreenState extends State<LoginScreen> {
|
||||
children: [
|
||||
const Text(
|
||||
'보안을 위해 새로운 비밀번호를 설정해 주세요.',
|
||||
style: TextStyle(color: Colors.redAccent),
|
||||
style: TextStyle(color: AppPalette.danger),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
TextField(
|
||||
|
||||
@@ -116,7 +116,7 @@ class _MainDashboardState extends State<MainDashboard> {
|
||||
),
|
||||
title: const Row(
|
||||
children: [
|
||||
Icon(Icons.warning_amber_rounded, color: Colors.redAccent),
|
||||
Icon(Icons.warning_amber_rounded, color: AppPalette.danger),
|
||||
SizedBox(width: 10),
|
||||
Text(
|
||||
'계정 강제 삭제',
|
||||
@@ -142,10 +142,13 @@ class _MainDashboardState extends State<MainDashboard> {
|
||||
decoration: InputDecoration(
|
||||
labelText: '학번 또는 교직원 번호',
|
||||
hintText: '예: 201101 또는 T1001',
|
||||
labelStyle: TextStyle(color: Colors.red[400]),
|
||||
labelStyle: const TextStyle(color: AppPalette.danger),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(16),
|
||||
borderSide: BorderSide(color: Colors.red[400]!, width: 2),
|
||||
borderSide: const BorderSide(
|
||||
color: AppPalette.danger,
|
||||
width: 2,
|
||||
),
|
||||
),
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(16),
|
||||
@@ -175,7 +178,7 @@ class _MainDashboardState extends State<MainDashboard> {
|
||||
}
|
||||
},
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.redAccent,
|
||||
backgroundColor: AppPalette.danger,
|
||||
foregroundColor: Colors.white,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
|
||||
@@ -50,9 +50,9 @@ class _NfcPocketCheckInScreenState extends State<NfcPocketCheckInScreen> {
|
||||
void _handleMessage(String text, WatchMessageLevel level) {
|
||||
final Color color = switch (level) {
|
||||
WatchMessageLevel.info => Colors.blueGrey,
|
||||
WatchMessageLevel.success => Colors.green,
|
||||
WatchMessageLevel.warning => Colors.orange,
|
||||
WatchMessageLevel.error => Colors.red,
|
||||
WatchMessageLevel.success => AppPalette.success,
|
||||
WatchMessageLevel.warning => AppPalette.warning,
|
||||
WatchMessageLevel.error => AppPalette.danger,
|
||||
};
|
||||
_showSnackBar(text, color);
|
||||
}
|
||||
@@ -73,10 +73,13 @@ class _NfcPocketCheckInScreenState extends State<NfcPocketCheckInScreen> {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
backgroundColor: Colors.red[50],
|
||||
backgroundColor: AppPalette.dangerBg,
|
||||
title: const Text(
|
||||
"무단 반출 감지",
|
||||
style: TextStyle(color: Colors.red, fontWeight: FontWeight.bold),
|
||||
style: TextStyle(
|
||||
color: AppPalette.danger,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
content: Text(
|
||||
"[${pocketNumber ?? _controller.activePocketNumber}] 주머니에서 휴대폰이 꺼내진 것으로 감지되었습니다.\n담당 선생님께 알림이 전송되었습니다.",
|
||||
@@ -177,8 +180,8 @@ class _NfcPocketCheckInScreenState extends State<NfcPocketCheckInScreen> {
|
||||
_controller.isProcessing ? Icons.sync : Icons.nfc,
|
||||
size: 100,
|
||||
color: _controller.isProcessing
|
||||
? Colors.orange
|
||||
: Colors.blueAccent,
|
||||
? AppPalette.warning
|
||||
: AppPalette.ink,
|
||||
),
|
||||
const SizedBox(height: 30),
|
||||
|
||||
@@ -190,7 +193,7 @@ class _NfcPocketCheckInScreenState extends State<NfcPocketCheckInScreen> {
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: _controller.isProcessing
|
||||
? Colors.orange
|
||||
? AppPalette.warning
|
||||
: Colors.black87,
|
||||
),
|
||||
),
|
||||
@@ -227,13 +230,13 @@ class _NfcPocketCheckInScreenState extends State<NfcPocketCheckInScreen> {
|
||||
height: 160,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: Colors.greenAccent.withValues(alpha: 0.15),
|
||||
border: Border.all(color: Colors.greenAccent, width: 3),
|
||||
color: AppPalette.success.withValues(alpha: 0.15),
|
||||
border: Border.all(color: AppPalette.success, width: 3),
|
||||
),
|
||||
child: const Icon(
|
||||
Icons.shield_rounded,
|
||||
size: 72,
|
||||
color: Colors.greenAccent,
|
||||
color: AppPalette.success,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 40),
|
||||
|
||||
@@ -40,7 +40,7 @@ class _NfcTagWriterScreenState extends State<NfcTagWriterScreen> {
|
||||
AppNotice.show(
|
||||
context,
|
||||
text,
|
||||
color: isError ? Colors.red[700] : Colors.green[700],
|
||||
color: isError ? AppPalette.danger : AppPalette.success,
|
||||
icon: isError ? Icons.error_outline_rounded : Icons.check_circle_rounded,
|
||||
);
|
||||
}
|
||||
@@ -79,7 +79,7 @@ class _NfcTagWriterScreenState extends State<NfcTagWriterScreen> {
|
||||
Icon(
|
||||
isWriting ? Icons.nfc : Icons.edit_note_rounded,
|
||||
size: 80,
|
||||
color: isWriting ? Colors.orange : AppPalette.ink,
|
||||
color: isWriting ? AppPalette.warning : AppPalette.ink,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
Text(
|
||||
|
||||
@@ -144,7 +144,7 @@ class _StudyCalendarScreenState extends State<StudyCalendarScreen> {
|
||||
},
|
||||
child: const Text(
|
||||
'삭제',
|
||||
style: TextStyle(color: Colors.red),
|
||||
style: TextStyle(color: AppPalette.danger),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -347,7 +347,7 @@ class _StudyCalendarScreenState extends State<StudyCalendarScreen> {
|
||||
size: 12,
|
||||
color: studied
|
||||
? Colors.white
|
||||
: Colors.orange,
|
||||
: AppPalette.warning,
|
||||
),
|
||||
),
|
||||
],
|
||||
@@ -363,7 +363,7 @@ class _StudyCalendarScreenState extends State<StudyCalendarScreen> {
|
||||
const SizedBox(width: 16),
|
||||
_legendIcon(
|
||||
Icons.card_giftcard_rounded,
|
||||
Colors.orange,
|
||||
AppPalette.warning,
|
||||
'이벤트',
|
||||
),
|
||||
],
|
||||
|
||||
@@ -196,7 +196,10 @@ class _StudyTimerScreenState extends State<StudyTimerScreen>
|
||||
const SizedBox(height: 10),
|
||||
const Text(
|
||||
'타이머가 멈춰있을 때만 설정을 바꿀 수 있어요.',
|
||||
style: TextStyle(color: Colors.redAccent, fontSize: 12.5),
|
||||
style: TextStyle(
|
||||
color: AppPalette.danger,
|
||||
fontSize: 12.5,
|
||||
),
|
||||
),
|
||||
],
|
||||
const SizedBox(height: 18),
|
||||
@@ -442,7 +445,7 @@ class _StudyTimerScreenState extends State<StudyTimerScreen>
|
||||
size: 140,
|
||||
icon: Icons.stop_rounded,
|
||||
label: '공부 종료',
|
||||
color: Colors.red[400]!,
|
||||
color: AppPalette.danger,
|
||||
onTap: () => _runAction(_controller.stop),
|
||||
);
|
||||
}
|
||||
@@ -453,7 +456,7 @@ class _StudyTimerScreenState extends State<StudyTimerScreen>
|
||||
size: 110,
|
||||
icon: isPaused ? Icons.play_arrow_rounded : Icons.pause_rounded,
|
||||
label: isPaused ? '재개' : '일시정지',
|
||||
color: isPaused ? AppPalette.ink : Colors.amber[700]!,
|
||||
color: isPaused ? AppPalette.ink : AppPalette.warning,
|
||||
onTap: () =>
|
||||
_runAction(isPaused ? _controller.resume : _controller.pause),
|
||||
),
|
||||
@@ -462,7 +465,7 @@ class _StudyTimerScreenState extends State<StudyTimerScreen>
|
||||
size: 110,
|
||||
icon: Icons.stop_rounded,
|
||||
label: '공부 종료',
|
||||
color: Colors.red[400]!,
|
||||
color: AppPalette.danger,
|
||||
onTap: () => _runAction(_controller.stop),
|
||||
),
|
||||
],
|
||||
|
||||
@@ -360,8 +360,10 @@ class _TeacherAttendancePageState extends State<TeacherAttendancePage> {
|
||||
final bool isPending = student['attendanceStatus'] == 'PENDING';
|
||||
final bool isComplete = student['attendanceStatus'] == 'COMPLETE';
|
||||
final Color statusColor = hasViolation
|
||||
? Colors.red
|
||||
: (isPending ? Colors.orange : (isComplete ? Colors.blue : Colors.red));
|
||||
? AppPalette.danger
|
||||
: (isPending
|
||||
? AppPalette.warning
|
||||
: (isComplete ? AppPalette.approved : AppPalette.danger));
|
||||
final String statusLine = hasViolation
|
||||
? '무단반출 (${student['violationTime']})'
|
||||
: (isPending
|
||||
@@ -373,10 +375,10 @@ class _TeacherAttendancePageState extends State<TeacherAttendancePage> {
|
||||
return Container(
|
||||
padding: const EdgeInsets.all(14),
|
||||
decoration: BoxDecoration(
|
||||
color: hasViolation ? Colors.red[50] : AppPalette.paper,
|
||||
color: hasViolation ? AppPalette.dangerBg : AppPalette.paper,
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
border: Border.all(
|
||||
color: hasViolation ? Colors.red[300]! : AppPalette.sage,
|
||||
color: hasViolation ? AppPalette.danger : AppPalette.sage,
|
||||
width: hasViolation ? 1.5 : 1,
|
||||
),
|
||||
boxShadow: [
|
||||
@@ -451,10 +453,10 @@ class _TeacherAttendancePageState extends State<TeacherAttendancePage> {
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
color: hasViolation
|
||||
? Colors.red[700]
|
||||
? AppPalette.danger
|
||||
: (isPending
|
||||
? Colors.orange[800]
|
||||
: (isComplete ? Colors.grey[600] : Colors.red[400])),
|
||||
? AppPalette.warning
|
||||
: (isComplete ? Colors.grey[600] : AppPalette.danger)),
|
||||
fontSize: 11.5,
|
||||
fontWeight: hasViolation ? FontWeight.bold : FontWeight.normal,
|
||||
),
|
||||
@@ -470,7 +472,7 @@ class _TeacherAttendancePageState extends State<TeacherAttendancePage> {
|
||||
student['studentName'],
|
||||
),
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.red[600],
|
||||
backgroundColor: AppPalette.danger,
|
||||
foregroundColor: Colors.white,
|
||||
padding: EdgeInsets.zero,
|
||||
),
|
||||
@@ -781,18 +783,18 @@ class _TeacherAttendancePageState extends State<TeacherAttendancePage> {
|
||||
final bool isPending = student['attendanceStatus'] == 'PENDING';
|
||||
final bool isComplete = student['attendanceStatus'] == 'COMPLETE';
|
||||
final Color background = hasViolation
|
||||
? Colors.red[50]!
|
||||
? AppPalette.dangerBg
|
||||
: isComplete
|
||||
? Colors.blue[50]!
|
||||
? AppPalette.approvedBg
|
||||
: isPending
|
||||
? Colors.orange[50]!
|
||||
? AppPalette.warningBg
|
||||
: AppPalette.paper;
|
||||
final Color border = hasViolation
|
||||
? Colors.red[300]!
|
||||
? AppPalette.danger
|
||||
: isComplete
|
||||
? Colors.blue[200]!
|
||||
? AppPalette.approved
|
||||
: isPending
|
||||
? Colors.orange[200]!
|
||||
? AppPalette.warning
|
||||
: AppPalette.sage;
|
||||
|
||||
return InkWell(
|
||||
@@ -828,7 +830,7 @@ class _TeacherAttendancePageState extends State<TeacherAttendancePage> {
|
||||
'무단반출',
|
||||
style: TextStyle(
|
||||
fontSize: 7.5,
|
||||
color: Colors.red[700],
|
||||
color: AppPalette.danger,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
@@ -849,19 +851,19 @@ class _TeacherAttendancePageState extends State<TeacherAttendancePage> {
|
||||
margin: const EdgeInsets.fromLTRB(16, 8, 16, 0),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.amber[100],
|
||||
color: AppPalette.warningBg,
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
border: Border.all(color: Colors.amber[400]!),
|
||||
border: Border.all(color: AppPalette.warning),
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(Icons.lock_open_rounded, color: Colors.amber[800], size: 20),
|
||||
Icon(Icons.lock_open_rounded, color: AppPalette.warning, size: 20),
|
||||
const SizedBox(width: 8),
|
||||
Expanded(
|
||||
child: Text(
|
||||
'지금 전체 반출 허용 중입니다 ($until 까지) — 이 시간 동안은 무단반출 경고가 뜨지 않아요.',
|
||||
style: TextStyle(
|
||||
color: Colors.amber[900],
|
||||
color: AppPalette.warning,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 12.5,
|
||||
),
|
||||
|
||||
@@ -376,7 +376,7 @@ class _TeacherCallScreenState extends State<TeacherCallScreen> {
|
||||
final location = t['location'] ?? '교무실';
|
||||
final isSelected = _selectedTeacherId == t['teacherId'];
|
||||
final inClass = _controller.isInClassNow(name);
|
||||
final statusColor = inClass ? Colors.orange : AppPalette.ink;
|
||||
final statusColor = inClass ? AppPalette.warning : AppPalette.ink;
|
||||
|
||||
return GestureDetector(
|
||||
onTap: () => setState(() {
|
||||
@@ -428,17 +428,21 @@ class _TeacherCallScreenState extends State<TeacherCallScreen> {
|
||||
decoration: BoxDecoration(
|
||||
color: isSelected
|
||||
? Colors.white.withValues(alpha: 0.15)
|
||||
: Colors.orange[50],
|
||||
: AppPalette.warningBg,
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
border: Border.all(
|
||||
color: isSelected ? Colors.white54 : Colors.orange,
|
||||
color: isSelected
|
||||
? Colors.white54
|
||||
: AppPalette.warning,
|
||||
),
|
||||
),
|
||||
child: Text(
|
||||
'수업중',
|
||||
style: TextStyle(
|
||||
fontSize: 9,
|
||||
color: isSelected ? Colors.white : Colors.orange,
|
||||
color: isSelected
|
||||
? Colors.white
|
||||
: AppPalette.warning,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -223,7 +223,10 @@ class _TeacherStudentManagementPageState
|
||||
child: SingleChildScrollView(
|
||||
child: Text(
|
||||
result.failures.join('\n'),
|
||||
style: const TextStyle(fontSize: 12, color: Colors.red),
|
||||
style: const TextStyle(
|
||||
fontSize: 12,
|
||||
color: AppPalette.danger,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -321,7 +324,7 @@ class _TeacherStudentManagementPageState
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)),
|
||||
title: Row(
|
||||
children: [
|
||||
Icon(Icons.warning_amber_rounded, color: Colors.red[700]),
|
||||
Icon(Icons.warning_amber_rounded, color: AppPalette.danger),
|
||||
const SizedBox(width: 10),
|
||||
const Text(
|
||||
'계정 완전 삭제',
|
||||
@@ -339,7 +342,7 @@ class _TeacherStudentManagementPageState
|
||||
),
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.red[600],
|
||||
backgroundColor: AppPalette.danger,
|
||||
foregroundColor: Colors.white,
|
||||
),
|
||||
onPressed: () async {
|
||||
@@ -519,10 +522,10 @@ class _TeacherStudentManagementPageState
|
||||
height: double.infinity,
|
||||
padding: const EdgeInsets.all(20),
|
||||
decoration: BoxDecoration(
|
||||
color: _isDragging ? Colors.orange[50] : AppPalette.paper,
|
||||
color: _isDragging ? AppPalette.warningBg : AppPalette.paper,
|
||||
borderRadius: BorderRadius.circular(24),
|
||||
border: Border.all(
|
||||
color: _isDragging ? Colors.orange : AppPalette.sage,
|
||||
color: _isDragging ? AppPalette.warning : AppPalette.sage,
|
||||
width: _isDragging ? 2 : 1,
|
||||
),
|
||||
),
|
||||
@@ -532,7 +535,7 @@ class _TeacherStudentManagementPageState
|
||||
Icon(
|
||||
Icons.upload_file_rounded,
|
||||
size: 40,
|
||||
color: _isDragging ? Colors.orange : AppPalette.sage,
|
||||
color: _isDragging ? AppPalette.warning : AppPalette.sage,
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
Text(
|
||||
@@ -540,7 +543,7 @@ class _TeacherStudentManagementPageState
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: _isDragging ? Colors.orange[800] : AppPalette.ink,
|
||||
color: _isDragging ? AppPalette.warning : AppPalette.ink,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
@@ -584,15 +587,13 @@ class _TeacherStudentManagementPageState
|
||||
Container(
|
||||
padding: const EdgeInsets.all(8),
|
||||
decoration: BoxDecoration(
|
||||
color: needsReset
|
||||
? Colors.red.withValues(alpha: 0.1)
|
||||
: AppPalette.linen,
|
||||
color: needsReset ? AppPalette.dangerBg : AppPalette.linen,
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
child: Icon(
|
||||
needsReset ? Icons.lock_reset : Icons.person,
|
||||
size: 18,
|
||||
color: needsReset ? Colors.red : AppPalette.ink,
|
||||
color: needsReset ? AppPalette.danger : AppPalette.ink,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
@@ -609,7 +610,7 @@ class _TeacherStudentManagementPageState
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 11.5,
|
||||
color: needsReset ? Colors.red[700] : Colors.grey[600],
|
||||
color: needsReset ? AppPalette.danger : Colors.grey[600],
|
||||
fontWeight: needsReset ? FontWeight.bold : FontWeight.normal,
|
||||
),
|
||||
),
|
||||
@@ -650,7 +651,7 @@ class _TeacherStudentManagementPageState
|
||||
IconButton(
|
||||
icon: const Icon(
|
||||
Icons.delete_forever_rounded,
|
||||
color: Colors.redAccent,
|
||||
color: AppPalette.danger,
|
||||
size: 18,
|
||||
),
|
||||
tooltip: '계정 영구 삭제',
|
||||
|
||||
Reference in New Issue
Block a user