From 9fe3e61c1c209a85c8c30affd395952b2708976f Mon Sep 17 00:00:00 2001 From: sihoo Date: Wed, 30 Sep 2026 06:29:37 +0000 Subject: [PATCH] =?UTF-8?q?=EC=A0=84=EC=B2=B4=20UI=20=EC=83=89=EC=83=81=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC=20-=20=EC=A0=9C=EA=B0=81=EA=B0=81=EC=9D=B4?= =?UTF-8?q?=EB=8D=98=20=EB=B9=A8=EA=B0=95/=EC=A3=BC=ED=99=A9/=ED=8C=8C?= =?UTF-8?q?=EB=9E=91=20=EA=B3=84=EC=97=B4=EC=9D=84=20=EC=9D=98=EB=AF=B8?= =?UTF-8?q?=EB=B3=84=20=ED=86=A0=ED=81=B0=204=EC=A2=85=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit danger/warning/success/approved(+각 Bg 버전)를 AppPalette에 추가하고, 화면마다 다르게 쓰이던 Colors.red[400/600/700]/redAccent, orange/amber 계열, blue 계열 리터럴을 전부 해당 토큰으로 교체. NFC 체크인 화면의 홀로 튀던 Colors.blueAccent도 함께 정리. --- lib/theme/app_palette.dart | 11 ++++++ lib/ui/admin_dashboard.dart | 19 +++++++--- lib/ui/board_post_detail_screen.dart | 2 +- lib/ui/board_report_screen.dart | 4 +- lib/ui/device_checkout_ledger_page.dart | 41 +++++++++++---------- lib/ui/friends_screen.dart | 2 +- lib/ui/group_detail_screen.dart | 5 ++- lib/ui/group_list_screen.dart | 9 +++-- lib/ui/login_screen.dart | 2 +- lib/ui/main_dashboard.dart | 11 ++++-- lib/ui/nfc_poccket_checkin_screen.dart | 25 +++++++------ lib/ui/nfc_tag_writer_screen.dart | 4 +- lib/ui/study_calendar_screen.dart | 6 +-- lib/ui/study_timer_screen.dart | 11 ++++-- lib/ui/teacher_attendance_page.dart | 40 ++++++++++---------- lib/ui/teacher_call_screen.dart | 12 ++++-- lib/ui/teacher_student_management_page.dart | 27 +++++++------- 17 files changed, 137 insertions(+), 94 deletions(-) diff --git a/lib/theme/app_palette.dart b/lib/theme/app_palette.dart index d98f05a..1262bdb 100644 --- a/lib/theme/app_palette.dart +++ b/lib/theme/app_palette.dart @@ -11,4 +11,15 @@ class AppPalette { static const Color linen = Color(0xFFECEBE4); // 은은한 카드/배지 배경 static const Color mist = Color(0xFFEEF0F2); // 페이지 배경 static const Color paper = Color(0xFFFAFAFF); // 카드 표면(거의 흰색) + + // 🚨 경고성 색상 3종 - 예전엔 화면마다 Colors.red/red[400]/red[700]/redAccent처럼 + // 제각각 써서 같은 의미인데 색이 미묘하게 달랐다. 이제 의미별로 딱 하나씩만 쓴다. + static const Color danger = Color(0xFFE13B3B); // 삭제/위반/거절/신고 등 위험/경고 + static const Color dangerBg = Color(0xFFFCE9E9); // danger의 연한 배경(배지 등) + static const Color warning = Color(0xFFF08A24); // 대기중/수업중/진행중 등 주의 + static const Color warningBg = Color(0xFFFDF0E1); // warning의 연한 배경 + static const Color success = Color(0xFF2E9E5B); // 완료/성공(NFC 스캔 성공 등) + static const Color successBg = Color(0xFFE4F5EB); // success의 연한 배경 + static const Color approved = Color(0xFF3B78C2); // 승인됨/완료 상태 표시 + static const Color approvedBg = Color(0xFFE7F0FA); // approved의 연한 배경 } diff --git a/lib/ui/admin_dashboard.dart b/lib/ui/admin_dashboard.dart index 83540f2..4397c05 100644 --- a/lib/ui/admin_dashboard.dart +++ b/lib/ui/admin_dashboard.dart @@ -39,7 +39,10 @@ class _AdminDashboardState extends State { 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 { 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 { 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( diff --git a/lib/ui/board_post_detail_screen.dart b/lib/ui/board_post_detail_screen.dart index 3d0f361..efc2bd0 100644 --- a/lib/ui/board_post_detail_screen.dart +++ b/lib/ui/board_post_detail_screen.dart @@ -140,7 +140,7 @@ class _BoardPostDetailScreenState extends State { ), TextButton( onPressed: () => Navigator.pop(dialogContext, true), - child: const Text('삭제', style: TextStyle(color: Colors.red)), + child: const Text('삭제', style: TextStyle(color: AppPalette.danger)), ), ], ), diff --git a/lib/ui/board_report_screen.dart b/lib/ui/board_report_screen.dart index 59fdc14..08d4317 100644 --- a/lib/ui/board_report_screen.dart +++ b/lib/ui/board_report_screen.dart @@ -113,7 +113,7 @@ class _BoardReportScreenState extends State { Text( '신고 사유: ${report['reason']}', style: const TextStyle( - color: Colors.redAccent, + color: AppPalette.danger, fontSize: 12.5, ), ), @@ -145,7 +145,7 @@ class _BoardReportScreenState extends State { Expanded( child: ElevatedButton( style: ElevatedButton.styleFrom( - backgroundColor: Colors.red[400], + backgroundColor: AppPalette.danger, foregroundColor: Colors.white, ), onPressed: _controller.isBusy diff --git a/lib/ui/device_checkout_ledger_page.dart b/lib/ui/device_checkout_ledger_page.dart index bd89284..2453ae3 100644 --- a/lib/ui/device_checkout_ledger_page.dart +++ b/lib/ui/device_checkout_ledger_page.dart @@ -106,7 +106,7 @@ class _DeviceCheckoutLedgerPageState extends State { 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 { '${_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 { _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 { ({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 { 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 { 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 { 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 { 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 { style: OutlinedButton.styleFrom( foregroundColor: - Colors.red, + AppPalette.danger, side: const BorderSide( - color: Colors.red, + color: + AppPalette.danger, ), ), child: const Text('거절'), diff --git a/lib/ui/friends_screen.dart b/lib/ui/friends_screen.dart index 00603cb..97878dd 100644 --- a/lib/ui/friends_screen.dart +++ b/lib/ui/friends_screen.dart @@ -100,7 +100,7 @@ class _FriendsScreenState extends State { ), TextButton( onPressed: () => Navigator.pop(dialogContext, true), - child: const Text('삭제', style: TextStyle(color: Colors.red)), + child: const Text('삭제', style: TextStyle(color: AppPalette.danger)), ), ], ), diff --git a/lib/ui/group_detail_screen.dart b/lib/ui/group_detail_screen.dart index 4a9f0d9..3fe1bb9 100644 --- a/lib/ui/group_detail_screen.dart +++ b/lib/ui/group_detail_screen.dart @@ -196,7 +196,10 @@ class _GroupDetailScreenState extends State { ), TextButton( onPressed: () => Navigator.pop(dialogContext, true), - child: const Text('나가기', style: TextStyle(color: Colors.red)), + child: const Text( + '나가기', + style: TextStyle(color: AppPalette.danger), + ), ), ], ), diff --git a/lib/ui/group_list_screen.dart b/lib/ui/group_list_screen.dart index ec21b8e..d4b2959 100644 --- a/lib/ui/group_list_screen.dart +++ b/lib/ui/group_list_screen.dart @@ -344,20 +344,23 @@ class _GroupListScreenState extends State { 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, ), ), ), diff --git a/lib/ui/login_screen.dart b/lib/ui/login_screen.dart index 7d830a5..7075f5f 100644 --- a/lib/ui/login_screen.dart +++ b/lib/ui/login_screen.dart @@ -122,7 +122,7 @@ class _LoginScreenState extends State { children: [ const Text( '보안을 위해 새로운 비밀번호를 설정해 주세요.', - style: TextStyle(color: Colors.redAccent), + style: TextStyle(color: AppPalette.danger), ), const SizedBox(height: 16), TextField( diff --git a/lib/ui/main_dashboard.dart b/lib/ui/main_dashboard.dart index 2703cc9..5847070 100644 --- a/lib/ui/main_dashboard.dart +++ b/lib/ui/main_dashboard.dart @@ -116,7 +116,7 @@ class _MainDashboardState extends State { ), 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 { 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 { } }, style: ElevatedButton.styleFrom( - backgroundColor: Colors.redAccent, + backgroundColor: AppPalette.danger, foregroundColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), diff --git a/lib/ui/nfc_poccket_checkin_screen.dart b/lib/ui/nfc_poccket_checkin_screen.dart index beaa810..ce57136 100644 --- a/lib/ui/nfc_poccket_checkin_screen.dart +++ b/lib/ui/nfc_poccket_checkin_screen.dart @@ -50,9 +50,9 @@ class _NfcPocketCheckInScreenState extends State { 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 { 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 { _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 { fontSize: 18, fontWeight: FontWeight.bold, color: _controller.isProcessing - ? Colors.orange + ? AppPalette.warning : Colors.black87, ), ), @@ -227,13 +230,13 @@ class _NfcPocketCheckInScreenState extends State { 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), diff --git a/lib/ui/nfc_tag_writer_screen.dart b/lib/ui/nfc_tag_writer_screen.dart index 21aa345..0de0041 100644 --- a/lib/ui/nfc_tag_writer_screen.dart +++ b/lib/ui/nfc_tag_writer_screen.dart @@ -40,7 +40,7 @@ class _NfcTagWriterScreenState extends State { 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 { 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( diff --git a/lib/ui/study_calendar_screen.dart b/lib/ui/study_calendar_screen.dart index 1f5463a..1ad57f2 100644 --- a/lib/ui/study_calendar_screen.dart +++ b/lib/ui/study_calendar_screen.dart @@ -144,7 +144,7 @@ class _StudyCalendarScreenState extends State { }, child: const Text( '삭제', - style: TextStyle(color: Colors.red), + style: TextStyle(color: AppPalette.danger), ), ), ), @@ -347,7 +347,7 @@ class _StudyCalendarScreenState extends State { size: 12, color: studied ? Colors.white - : Colors.orange, + : AppPalette.warning, ), ), ], @@ -363,7 +363,7 @@ class _StudyCalendarScreenState extends State { const SizedBox(width: 16), _legendIcon( Icons.card_giftcard_rounded, - Colors.orange, + AppPalette.warning, '이벤트', ), ], diff --git a/lib/ui/study_timer_screen.dart b/lib/ui/study_timer_screen.dart index 5f7e7f2..17672dc 100644 --- a/lib/ui/study_timer_screen.dart +++ b/lib/ui/study_timer_screen.dart @@ -196,7 +196,10 @@ class _StudyTimerScreenState extends State 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 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 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 size: 110, icon: Icons.stop_rounded, label: '공부 종료', - color: Colors.red[400]!, + color: AppPalette.danger, onTap: () => _runAction(_controller.stop), ), ], diff --git a/lib/ui/teacher_attendance_page.dart b/lib/ui/teacher_attendance_page.dart index 55e6523..444964a 100644 --- a/lib/ui/teacher_attendance_page.dart +++ b/lib/ui/teacher_attendance_page.dart @@ -360,8 +360,10 @@ class _TeacherAttendancePageState extends State { 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 { 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 { 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 { 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 { 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 { '무단반출', style: TextStyle( fontSize: 7.5, - color: Colors.red[700], + color: AppPalette.danger, fontWeight: FontWeight.bold, ), ), @@ -849,19 +851,19 @@ class _TeacherAttendancePageState extends State { 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, ), diff --git a/lib/ui/teacher_call_screen.dart b/lib/ui/teacher_call_screen.dart index 71a660d..221899b 100644 --- a/lib/ui/teacher_call_screen.dart +++ b/lib/ui/teacher_call_screen.dart @@ -376,7 +376,7 @@ class _TeacherCallScreenState extends State { 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 { 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, ), ), ), diff --git a/lib/ui/teacher_student_management_page.dart b/lib/ui/teacher_student_management_page.dart index 02ca60d..520e20b 100644 --- a/lib/ui/teacher_student_management_page.dart +++ b/lib/ui/teacher_student_management_page.dart @@ -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: '계정 영구 삭제',