From dce5f1ad1b075e3ea26578a22cb35d2f4bae8aee Mon Sep 17 00:00:00 2001 From: sihoo Date: Fri, 4 Sep 2026 14:36:30 +0900 Subject: [PATCH] =?UTF-8?q?=EC=95=B1=20=EC=A0=84=EC=B2=B4=20=EB=B0=B0?= =?UTF-8?q?=EA=B2=BD/=EC=B9=B4=EB=93=9C=20=EC=83=89=EC=83=81=EC=9D=84=20co?= =?UTF-8?q?olors=20=ED=8C=94=EB=A0=88=ED=8A=B8=EB=A1=9C=20=ED=86=B5?= =?UTF-8?q?=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit coolors.co 무채색 팔레트(1c1c1c-daddd8-ecebe4-eef0f2-fafaff)를 lib/theme/app_palette.dart에 정의하고, 로그인/대시보드/출석 확인/ 학생 계정 관리/스마트기기 반출(신청·대장)/관리자 화면 전반의 배너·배경·카드·기본 버튼 색을 이 팔레트로 교체. 기능적으로 의미 있는 색(위반/미출석/삭제/거절 등 경고성 빨간색, 승인 대기 등 상태 표시)은 그대로 유지 — 구조적/장식적 색상만 무채색으로 통일해 위험한 동작이 시각적으로 더 도드라지게 함. Co-Authored-By: Claude Sonnet 5 --- lib/theme/app_palette.dart | 14 ++++++ lib/ui/admin_dashboard.dart | 8 ++-- lib/ui/device_checkout_ledger_page.dart | 14 +++--- lib/ui/device_checkout_request_screen.dart | 18 +++----- lib/ui/login_screen.dart | 13 +++--- lib/ui/main_dashboard.dart | 51 ++++++++++----------- lib/ui/teacher_attendance_page.dart | 22 +++++---- lib/ui/teacher_student_management_page.dart | 49 ++++++++++---------- 8 files changed, 102 insertions(+), 87 deletions(-) create mode 100644 lib/theme/app_palette.dart diff --git a/lib/theme/app_palette.dart b/lib/theme/app_palette.dart new file mode 100644 index 0000000..d98f05a --- /dev/null +++ b/lib/theme/app_palette.dart @@ -0,0 +1,14 @@ +// 🎨 앱 전역 무채색 팔레트 (coolors.co: 1c1c1c-daddd8-ecebe4-eef0f2-fafaff). +// 배경/카드/배너 같은 구조적 색상은 전부 이 5색으로 통일한다. +// 삭제/위반/거절처럼 사용자가 즉시 알아채야 하는 경고성 색상(빨강 등)만 예외로 유지한다. +import 'package:flutter/material.dart'; + +class AppPalette { + AppPalette._(); + + static const Color ink = Color(0xFF1C1C1C); // 가장 어두운 톤 — 배너/주요 텍스트/버튼 + static const Color sage = Color(0xFFDADDD8); // 보더/구분선/보조 표면 + static const Color linen = Color(0xFFECEBE4); // 은은한 카드/배지 배경 + static const Color mist = Color(0xFFEEF0F2); // 페이지 배경 + static const Color paper = Color(0xFFFAFAFF); // 카드 표면(거의 흰색) +} diff --git a/lib/ui/admin_dashboard.dart b/lib/ui/admin_dashboard.dart index 738c1d4..0c99bcf 100644 --- a/lib/ui/admin_dashboard.dart +++ b/lib/ui/admin_dashboard.dart @@ -2,6 +2,7 @@ // 서버 통신/상태는 lib/function/admin_controller.dart가 담당한다. import 'package:flutter/material.dart'; import '../function/admin_controller.dart'; +import '../theme/app_palette.dart'; import 'login_screen.dart'; // ========================================== @@ -71,10 +72,11 @@ class _AdminDashboardState extends State { listenable: _controller, builder: (context, _) { return Scaffold( + backgroundColor: AppPalette.mist, appBar: AppBar( title: const Text('🛠️ 관리자 시스템'), - backgroundColor: Colors.orange, - foregroundColor: Colors.white, + backgroundColor: AppPalette.ink, + foregroundColor: AppPalette.paper, actions: [ IconButton( icon: const Icon(Icons.logout), @@ -94,7 +96,7 @@ class _AdminDashboardState extends State { const Icon( Icons.admin_panel_settings, size: 100, - color: Colors.orange, + color: AppPalette.ink, ), const SizedBox(height: 20), const Text( diff --git a/lib/ui/device_checkout_ledger_page.dart b/lib/ui/device_checkout_ledger_page.dart index f2401e5..387d61f 100644 --- a/lib/ui/device_checkout_ledger_page.dart +++ b/lib/ui/device_checkout_ledger_page.dart @@ -2,6 +2,7 @@ // 서버 통신/상태는 lib/function/device_checkout_ledger_controller.dart가 담당한다. import 'package:flutter/material.dart'; import '../function/device_checkout_ledger_controller.dart'; +import '../theme/app_palette.dart'; class DeviceCheckoutLedgerPage extends StatefulWidget { final String? teacherId; @@ -91,13 +92,13 @@ class _DeviceCheckoutLedgerPageState extends State { .length; return Scaffold( - backgroundColor: Colors.grey[100], + backgroundColor: AppPalette.mist, appBar: AppBar( title: const Text( '📱 스마트기기 반출 대장', style: TextStyle(fontWeight: FontWeight.bold), ), - backgroundColor: Colors.teal, + backgroundColor: AppPalette.ink, foregroundColor: Colors.white, elevation: 0, actions: [ @@ -154,13 +155,14 @@ class _DeviceCheckoutLedgerPageState extends State { final bool isPending = status == 'PENDING'; return Card( - elevation: 1, + elevation: 0, + color: AppPalette.paper, margin: const EdgeInsets.only(bottom: 10), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), side: isPending ? BorderSide(color: Colors.orange[300]!) - : BorderSide.none, + : BorderSide(color: AppPalette.sage), ), child: Padding( padding: const EdgeInsets.all(16), @@ -263,9 +265,9 @@ class _DeviceCheckoutLedgerPageState extends State { style: ElevatedButton.styleFrom( backgroundColor: - Colors.teal, + AppPalette.ink, foregroundColor: - Colors.white, + AppPalette.paper, ), child: const Text('승인'), ), diff --git a/lib/ui/device_checkout_request_screen.dart b/lib/ui/device_checkout_request_screen.dart index 06c1433..fd32257 100644 --- a/lib/ui/device_checkout_request_screen.dart +++ b/lib/ui/device_checkout_request_screen.dart @@ -2,6 +2,7 @@ // 서버 통신/상태는 lib/function/device_checkout_controller.dart가 담당한다. import 'package:flutter/material.dart'; import '../function/device_checkout_controller.dart'; +import '../theme/app_palette.dart'; class DeviceCheckoutRequestScreen extends StatefulWidget { final String studentId; @@ -82,13 +83,13 @@ class _DeviceCheckoutRequestScreenState listenable: _controller, builder: (context, _) { return Scaffold( - backgroundColor: Colors.grey[100], + backgroundColor: AppPalette.mist, appBar: AppBar( title: const Text( '📱 스마트기기 반출 신청', style: TextStyle(fontWeight: FontWeight.bold), ), - backgroundColor: Colors.teal, + backgroundColor: AppPalette.ink, foregroundColor: Colors.white, elevation: 0, ), @@ -110,14 +111,9 @@ class _DeviceCheckoutRequestScreenState Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( - color: Colors.white, + color: AppPalette.paper, borderRadius: BorderRadius.circular(24), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.04), - blurRadius: 16, - ), - ], + border: Border.all(color: AppPalette.sage), ), child: Column( children: [ @@ -166,8 +162,8 @@ class _DeviceCheckoutRequestScreenState child: ElevatedButton( onPressed: _controller.isSubmitting ? null : _submit, style: ElevatedButton.styleFrom( - backgroundColor: Colors.teal, - foregroundColor: Colors.white, + backgroundColor: AppPalette.ink, + foregroundColor: AppPalette.paper, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), diff --git a/lib/ui/login_screen.dart b/lib/ui/login_screen.dart index 3897930..d2cf4fc 100644 --- a/lib/ui/login_screen.dart +++ b/lib/ui/login_screen.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import '../config.dart' show schoolName; import '../function/login_controller.dart'; +import '../theme/app_palette.dart'; import 'main_dashboard.dart'; import 'teacher_register_screen.dart'; @@ -128,7 +129,7 @@ class _LoginScreenState extends State { ) : ElevatedButton( style: ElevatedButton.styleFrom( - backgroundColor: Colors.indigo, + backgroundColor: AppPalette.ink, foregroundColor: Colors.white, ), onPressed: () async { @@ -285,7 +286,7 @@ class _LoginScreenState extends State { listenable: _controller, builder: (context, _) { return Scaffold( - backgroundColor: Colors.grey[50], + backgroundColor: AppPalette.mist, body: Center( child: SingleChildScrollView( padding: const EdgeInsets.all(24.0), @@ -294,14 +295,14 @@ class _LoginScreenState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(Icons.school, size: 80, color: Colors.indigo), + const Icon(Icons.school, size: 80, color: AppPalette.ink), const SizedBox(height: 16), Text( '$schoolName 모니터', style: const TextStyle( fontSize: 26, fontWeight: FontWeight.bold, - color: Colors.indigo, + color: AppPalette.ink, ), ), const SizedBox(height: 8), @@ -339,7 +340,7 @@ class _LoginScreenState extends State { height: 55, child: ElevatedButton( style: ElevatedButton.styleFrom( - backgroundColor: Colors.indigo, + backgroundColor: AppPalette.ink, foregroundColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), @@ -366,7 +367,7 @@ class _LoginScreenState extends State { child: const Text( '👨‍🏫 선생님이신가요? 교사 회원가입 하기', style: TextStyle( - color: Colors.indigo, + color: AppPalette.ink, fontWeight: FontWeight.bold, ), ), diff --git a/lib/ui/main_dashboard.dart b/lib/ui/main_dashboard.dart index c69de2b..cba8cec 100644 --- a/lib/ui/main_dashboard.dart +++ b/lib/ui/main_dashboard.dart @@ -4,6 +4,7 @@ // 계정 강제 삭제 서버 통신은 lib/function/student_dashboard_controller.dart가 담당한다. import 'package:flutter/material.dart'; import '../function/student_dashboard_controller.dart'; +import '../theme/app_palette.dart'; import 'admin_dashboard.dart'; import 'device_checkout_ledger_page.dart'; import 'device_checkout_request_screen.dart'; @@ -160,34 +161,34 @@ class _MainDashboardState extends State { ); } - // 🎨 [역할별 테마] 배너 색상/제목/문구만 역할에 따라 다르게. 레이아웃 자체는 공통. + // 🎨 [역할별 테마] 배너 색상은 팔레트로 통일하고, 제목/문구/아이콘만 역할에 따라 다르게. ({String title, String subtitle, Color color, IconData icon}) _theme() { if (_isDeveloper) { return ( title: '👑 MASTER CONTROL', subtitle: '최고 관리 권한 활성화됨', - color: Colors.deepPurple[700]!, + color: AppPalette.ink, icon: Icons.admin_panel_settings_rounded, ); } else if (widget.role == 'admin') { return ( title: '🛠️ ADMIN CONTROL', subtitle: '시스템 관리자 권한 활성화됨', - color: Colors.deepPurple[700]!, + color: AppPalette.ink, icon: Icons.admin_panel_settings_rounded, ); } else if (widget.role == 'teacher') { return ( title: '👨‍🏫 TEACHER PORTAL', subtitle: '교직원 번호: $_displayId | 교사 권한 활성화됨', - color: Colors.green[700]!, + color: AppPalette.ink, icon: Icons.admin_panel_settings_rounded, ); } return ( title: '🎓 STUDENT PORTAL', subtitle: '학번: $_displayId | 인증 완료', - color: Colors.indigo[700]!, + color: AppPalette.ink, icon: Icons.school_rounded, ); } @@ -200,7 +201,7 @@ class _MainDashboardState extends State { final theme = _theme(); return Scaffold( - backgroundColor: Colors.grey[100], + backgroundColor: AppPalette.mist, appBar: AppBar( title: Text( theme.title, @@ -250,7 +251,7 @@ class _MainDashboardState extends State { ), child: CircleAvatar( radius: 30, - backgroundColor: theme.color.withValues(alpha: 0.08), + backgroundColor: AppPalette.linen, child: Icon(theme.icon, size: 32, color: theme.color), ), ), @@ -298,7 +299,7 @@ class _MainDashboardState extends State { style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, - color: Colors.black87, + color: AppPalette.ink, ), ), ], @@ -335,8 +336,8 @@ class _MainDashboardState extends State { ? '출석 및 폰 수거 완료' : '⚠️ 본인 인증 기기 전용', color: widget.isDeviceMatched - ? Colors.blue - : Colors.grey[400]!, + ? AppPalette.ink + : AppPalette.sage, onTap: widget.isDeviceMatched ? () => _openPocketCheckIn(context) : () { @@ -358,7 +359,7 @@ class _MainDashboardState extends State { icon: Icons.fastfood_rounded, title: '실시간 학교 상황', subtitle: '급식실 줄 & 매점 재고 확인', - color: Colors.orange[700]!, + color: AppPalette.ink, onTap: () { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( @@ -374,7 +375,7 @@ class _MainDashboardState extends State { icon: Icons.tablet_mac_rounded, title: '스마트기기 반출', subtitle: '패드 사용 신청 (시간/목적)', - color: Colors.teal, + color: AppPalette.ink, onTap: () => Navigator.push( context, MaterialPageRoute( @@ -393,7 +394,7 @@ class _MainDashboardState extends State { icon: Icons.assignment_turned_in_rounded, title: '실시간 출석 확인', subtitle: '학생 제출 로그 모니터링', - color: Colors.blue, + color: AppPalette.ink, onTap: () => Navigator.push( context, MaterialPageRoute( @@ -407,7 +408,7 @@ class _MainDashboardState extends State { icon: Icons.manage_accounts_rounded, title: '학생 계정 관리', subtitle: '계정 추가 및 강제 리셋', - color: Colors.orange, + color: AppPalette.ink, onTap: () => Navigator.push( context, MaterialPageRoute( @@ -421,7 +422,7 @@ class _MainDashboardState extends State { icon: Icons.tablet_mac_rounded, title: '스마트기기 반출 대장', subtitle: '패드 반출 신청 승인/거절', - color: Colors.teal, + color: AppPalette.ink, onTap: () => Navigator.push( context, MaterialPageRoute( @@ -440,7 +441,7 @@ class _MainDashboardState extends State { icon: Icons.terminal_rounded, title: '서버 DB 제어', subtitle: '시스템 원격 초기화', - color: Colors.amber[800]!, + color: AppPalette.ink, onTap: () => Navigator.push( context, MaterialPageRoute( @@ -462,7 +463,7 @@ class _MainDashboardState extends State { icon: Icons.edit_note_rounded, title: 'NFC 태그 쓰기', subtitle: '주머니 스티커 초기 설정', - color: Colors.deepPurple, + color: AppPalette.ink, onTap: () => Navigator.push( context, MaterialPageRoute( @@ -503,15 +504,9 @@ class _MainDashboardState extends State { child: Ink( padding: const EdgeInsets.all(20), decoration: BoxDecoration( - color: Colors.white, + color: AppPalette.paper, borderRadius: BorderRadius.circular(24), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.04), - blurRadius: 16, - offset: const Offset(0, 4), - ), - ], + border: Border.all(color: AppPalette.sage, width: 1), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -520,7 +515,7 @@ class _MainDashboardState extends State { Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( - color: color.withValues(alpha: 0.1), + color: AppPalette.linen, borderRadius: BorderRadius.circular(16), ), child: Icon(icon, color: color, size: 28), @@ -537,7 +532,7 @@ class _MainDashboardState extends State { style: const TextStyle( fontSize: 15, fontWeight: FontWeight.bold, - color: Colors.black87, + color: AppPalette.ink, ), ), ), @@ -560,7 +555,7 @@ class _MainDashboardState extends State { subtitle, style: TextStyle( fontSize: 12, - color: Colors.grey[500], + color: AppPalette.ink.withValues(alpha: 0.55), height: 1.2, ), ), diff --git a/lib/ui/teacher_attendance_page.dart b/lib/ui/teacher_attendance_page.dart index d15ce44..44f7046 100644 --- a/lib/ui/teacher_attendance_page.dart +++ b/lib/ui/teacher_attendance_page.dart @@ -2,6 +2,7 @@ // 서버 통신·상태·파생 로직은 lib/function/teacher_attendance_controller.dart가 담당한다. import 'package:flutter/material.dart'; import '../function/teacher_attendance_controller.dart'; +import '../theme/app_palette.dart'; // ----------------------------------------------------------------------------- // 📅 [서브 화면 1] 실시간 출석 확인 란 (StudentDashboard 카드 스타일 리스트화) @@ -202,13 +203,13 @@ class _TeacherAttendancePageState extends State { final int absentCount = totalCount - checkedInCount; return Scaffold( - backgroundColor: Colors.grey[100], + backgroundColor: AppPalette.mist, appBar: AppBar( title: const Text( '📋 실시간 출석 현황', style: TextStyle(fontWeight: FontWeight.bold), ), - backgroundColor: Colors.blue, + backgroundColor: AppPalette.ink, foregroundColor: Colors.white, elevation: 0, actions: [ @@ -336,7 +337,7 @@ class _TeacherAttendancePageState extends State { width: 4, height: 16, decoration: BoxDecoration( - color: Colors.blue, + color: AppPalette.ink, borderRadius: BorderRadius.circular(2), ), ), @@ -346,7 +347,7 @@ class _TeacherAttendancePageState extends State { style: const TextStyle( fontSize: 16, fontWeight: FontWeight.bold, - color: Colors.black87, + color: AppPalette.ink, ), ), const SizedBox(width: 6), @@ -396,11 +397,12 @@ class _TeacherAttendancePageState extends State { return Container( padding: const EdgeInsets.all(14), decoration: BoxDecoration( - color: hasViolation ? Colors.red[50] : Colors.white, + color: hasViolation ? Colors.red[50] : AppPalette.paper, borderRadius: BorderRadius.circular(20), - border: hasViolation - ? Border.all(color: Colors.red[300]!, width: 1.5) - : null, + border: Border.all( + color: hasViolation ? Colors.red[300]! : AppPalette.sage, + width: hasViolation ? 1.5 : 1, + ), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.03), @@ -590,7 +592,7 @@ class _TeacherAttendancePageState extends State { return Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( - color: Colors.white, + color: AppPalette.paper, borderRadius: BorderRadius.circular(16), boxShadow: [ BoxShadow( @@ -639,7 +641,7 @@ class _TeacherAttendancePageState extends State { return Container( width: double.infinity, padding: const EdgeInsets.all(16), - color: const Color(0xFF1E293B), + color: AppPalette.ink, child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ diff --git a/lib/ui/teacher_student_management_page.dart b/lib/ui/teacher_student_management_page.dart index f0e68c0..86b8ed1 100644 --- a/lib/ui/teacher_student_management_page.dart +++ b/lib/ui/teacher_student_management_page.dart @@ -5,6 +5,7 @@ import 'package:desktop_drop/desktop_drop.dart'; import 'package:flutter/material.dart'; import '../function/excel_file_picker.dart'; import '../function/teacher_student_management_controller.dart'; +import '../theme/app_palette.dart'; // 📐 "실시간 출석 확인" 목록(teacher_attendance_page.dart)의 타일 규격과 동일하게 맞춘다. const double kAttendanceTileWidth = 220; @@ -162,8 +163,8 @@ class _TeacherStudentManagementPageState _runBulkImport(rows); }, style: ElevatedButton.styleFrom( - backgroundColor: Colors.orange, - foregroundColor: Colors.white, + backgroundColor: AppPalette.ink, + foregroundColor: AppPalette.paper, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), @@ -295,7 +296,7 @@ class _TeacherStudentManagementPageState builder: (ctx) => AlertDialog( title: const Text( '⚠️ 기기 등록 초기화', - style: TextStyle(fontWeight: FontWeight.bold, color: Colors.purple), + style: TextStyle(fontWeight: FontWeight.bold, color: AppPalette.ink), ), content: Text('$studentName 학생의 스마트폰 기기 등록과 비밀번호(1234)를 초기화하시겠습니까?'), actions: [ @@ -305,8 +306,8 @@ class _TeacherStudentManagementPageState ), ElevatedButton( style: ElevatedButton.styleFrom( - backgroundColor: Colors.purple, - foregroundColor: Colors.white, + backgroundColor: AppPalette.ink, + foregroundColor: AppPalette.paper, ), onPressed: () async { Navigator.pop(ctx); @@ -373,7 +374,7 @@ class _TeacherStudentManagementPageState } // 🏷️ 섹션 제목 (색 인디케이터 바 + 텍스트). - Widget _sectionTitle(String text, {Color color = Colors.orange}) { + Widget _sectionTitle(String text, {Color color = AppPalette.ink}) { return Row( children: [ Container( @@ -400,8 +401,9 @@ class _TeacherStudentManagementPageState return Container( padding: const EdgeInsets.all(10), decoration: BoxDecoration( - color: Colors.white, + color: AppPalette.paper, borderRadius: BorderRadius.circular(24), + border: Border.all(color: AppPalette.sage), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.04), @@ -458,8 +460,8 @@ class _TeacherStudentManagementPageState child: ElevatedButton( onPressed: _controller.isWorking ? null : _addStudentAccount, style: ElevatedButton.styleFrom( - backgroundColor: Colors.orange, - foregroundColor: Colors.white, + backgroundColor: AppPalette.ink, + foregroundColor: AppPalette.paper, padding: EdgeInsets.zero, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), @@ -519,10 +521,10 @@ class _TeacherStudentManagementPageState height: double.infinity, padding: const EdgeInsets.all(20), decoration: BoxDecoration( - color: _isDragging ? Colors.orange[50] : Colors.white, + color: _isDragging ? Colors.orange[50] : AppPalette.paper, borderRadius: BorderRadius.circular(24), border: Border.all( - color: _isDragging ? Colors.orange : Colors.grey.shade300, + color: _isDragging ? Colors.orange : AppPalette.sage, width: _isDragging ? 2 : 1, ), ), @@ -532,7 +534,7 @@ class _TeacherStudentManagementPageState Icon( Icons.upload_file_rounded, size: 40, - color: _isDragging ? Colors.orange : Colors.grey[400], + color: _isDragging ? Colors.orange : AppPalette.sage, ), const SizedBox(height: 12), Text( @@ -540,7 +542,7 @@ class _TeacherStudentManagementPageState textAlign: TextAlign.center, style: TextStyle( fontWeight: FontWeight.bold, - color: _isDragging ? Colors.orange[800] : Colors.black87, + color: _isDragging ? Colors.orange[800] : AppPalette.ink, ), ), const SizedBox(height: 4), @@ -566,8 +568,9 @@ class _TeacherStudentManagementPageState return Container( padding: const EdgeInsets.all(14), decoration: BoxDecoration( - color: Colors.white, + color: AppPalette.paper, borderRadius: BorderRadius.circular(20), + border: Border.all(color: AppPalette.sage), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.03), @@ -583,15 +586,15 @@ class _TeacherStudentManagementPageState Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( - color: (needsReset ? Colors.red : Colors.blue).withValues( - alpha: 0.1, - ), + color: needsReset + ? Colors.red.withValues(alpha: 0.1) + : AppPalette.linen, shape: BoxShape.circle, ), child: Icon( needsReset ? Icons.lock_reset : Icons.person, size: 18, - color: needsReset ? Colors.red : Colors.blue, + color: needsReset ? Colors.red : AppPalette.ink, ), ), const SizedBox(height: 8), @@ -638,7 +641,7 @@ class _TeacherStudentManagementPageState IconButton( icon: const Icon( Icons.lock_reset, - color: Colors.purple, + color: AppPalette.ink, size: 18, ), tooltip: '기기 리셋', @@ -670,14 +673,14 @@ class _TeacherStudentManagementPageState listenable: _controller, builder: (context, _) { return Scaffold( - backgroundColor: Colors.grey[100], + backgroundColor: AppPalette.mist, appBar: AppBar( title: const Text( '⚙️ 학생 통합 관리 센터', style: TextStyle(fontWeight: FontWeight.bold), ), - backgroundColor: Colors.orange, - foregroundColor: Colors.white, + backgroundColor: AppPalette.ink, + foregroundColor: AppPalette.paper, elevation: 0, ), body: SingleChildScrollView( @@ -748,7 +751,7 @@ class _TeacherStudentManagementPageState children: [ Row( children: [ - _sectionTitle('전체 학생 목록', color: Colors.blue), + _sectionTitle('전체 학생 목록'), const Spacer(), IconButton( icon: const Icon(Icons.refresh_rounded),