From 527661b6e5f6aefba5d8a290c1003f4107deaf6d Mon Sep 17 00:00:00 2001 From: sihoo Date: Tue, 8 Sep 2026 15:17:05 +0900 Subject: [PATCH] =?UTF-8?q?=EB=82=98=EB=A8=B8=EC=A7=80=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=ED=99=94=EB=A9=B4=EB=93=A4=EB=8F=84=20=EA=B2=80?= =?UTF-8?q?=EC=A0=95=20AppBar=EB=A5=BC=20=EB=91=A5=EA=B7=BC=20=EC=A0=9C?= =?UTF-8?q?=EB=AA=A9=20=EC=95=8C=EC=95=BD=EC=9C=BC=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 실시간 출석 현황과 같은 톤으로, 설정/교사 회원가입/관리자 시스템/ NFC 태그 쓰기·체크인/학생 통합 관리 센터/스마트기기 반출 신청·대장 화면의 검정 배경 AppBar를 투명 배경 + 가운데 둥근 제목 알약으로 교체. 출석 현황 화면과 달리 폰트 크기는 줄이지 않고 각 화면이 원래 쓰던 스타일(굵기 등)을 그대로 유지 - 공용 TitlePill 위젯이 스타일링된 Text를 그대로 감싸주기만 함. Co-Authored-By: Claude Sonnet 5 --- lib/ui/admin_dashboard.dart | 11 ++++++++--- lib/ui/dashboard_settings_page.dart | 10 +++++++--- lib/ui/device_checkout_ledger_page.dart | 19 ++++++++++++------ lib/ui/device_checkout_request_screen.dart | 19 ++++++++++++------ lib/ui/nfc_poccket_checkin_screen.dart | 19 ++++++++++++------ lib/ui/nfc_tag_writer_screen.dart | 14 ++++++++++--- lib/ui/teacher_register_screen.dart | 11 ++++++++--- lib/ui/teacher_student_management_page.dart | 19 ++++++++++++------ lib/ui/title_pill.dart | 22 +++++++++++++++++++++ 9 files changed, 108 insertions(+), 36 deletions(-) create mode 100644 lib/ui/title_pill.dart diff --git a/lib/ui/admin_dashboard.dart b/lib/ui/admin_dashboard.dart index 183d4e1..ff4a509 100644 --- a/lib/ui/admin_dashboard.dart +++ b/lib/ui/admin_dashboard.dart @@ -5,6 +5,7 @@ import '../function/admin_controller.dart'; import '../theme/app_palette.dart'; import 'app_notice.dart'; import 'login_screen.dart'; +import 'title_pill.dart'; // ========================================== // 🛠️ 5. 관리자 대시보드 (DB 초기화 암호 파라미터 보정 완료) @@ -73,9 +74,13 @@ class _AdminDashboardState extends State { return Scaffold( backgroundColor: AppPalette.mist, appBar: AppBar( - title: const Text('관리자 시스템'), - backgroundColor: AppPalette.ink, - foregroundColor: AppPalette.paper, + backgroundColor: Colors.transparent, + foregroundColor: AppPalette.ink, + elevation: 0, + centerTitle: true, + title: const TitlePill( + child: Text('관리자 시스템', style: TextStyle(color: Colors.white)), + ), actions: [ IconButton( icon: const Icon(Icons.logout), diff --git a/lib/ui/dashboard_settings_page.dart b/lib/ui/dashboard_settings_page.dart index f81cd02..e1cf1c6 100644 --- a/lib/ui/dashboard_settings_page.dart +++ b/lib/ui/dashboard_settings_page.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import '../models/dashboard_tile_layout.dart'; import '../theme/app_palette.dart'; +import 'title_pill.dart'; class DashboardSettingsPage extends StatelessWidget { const DashboardSettingsPage({super.key}); @@ -12,10 +13,13 @@ class DashboardSettingsPage extends StatelessWidget { return Scaffold( backgroundColor: AppPalette.mist, appBar: AppBar( - title: const Text('설정'), - backgroundColor: AppPalette.ink, - foregroundColor: AppPalette.paper, + backgroundColor: Colors.transparent, + foregroundColor: AppPalette.ink, elevation: 0, + centerTitle: true, + title: const TitlePill( + child: Text('설정', style: TextStyle(color: Colors.white)), + ), ), body: ListView( padding: const EdgeInsets.all(16), diff --git a/lib/ui/device_checkout_ledger_page.dart b/lib/ui/device_checkout_ledger_page.dart index 47eaae2..bbef001 100644 --- a/lib/ui/device_checkout_ledger_page.dart +++ b/lib/ui/device_checkout_ledger_page.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import '../function/device_checkout_ledger_controller.dart'; import '../theme/app_palette.dart'; import 'app_notice.dart'; +import 'title_pill.dart'; class DeviceCheckoutLedgerPage extends StatefulWidget { final String? teacherId; @@ -89,13 +90,19 @@ class _DeviceCheckoutLedgerPageState extends State { return Scaffold( backgroundColor: AppPalette.mist, appBar: AppBar( - title: const Text( - '스마트기기 반출 대장', - style: TextStyle(fontWeight: FontWeight.bold), - ), - backgroundColor: AppPalette.ink, - foregroundColor: Colors.white, + backgroundColor: Colors.transparent, + foregroundColor: AppPalette.ink, elevation: 0, + centerTitle: true, + title: const TitlePill( + child: Text( + '스마트기기 반출 대장', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ), actions: [ IconButton( icon: const Icon(Icons.refresh_rounded), diff --git a/lib/ui/device_checkout_request_screen.dart b/lib/ui/device_checkout_request_screen.dart index c588b17..bc116a8 100644 --- a/lib/ui/device_checkout_request_screen.dart +++ b/lib/ui/device_checkout_request_screen.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import '../function/device_checkout_controller.dart'; import '../theme/app_palette.dart'; import 'app_notice.dart'; +import 'title_pill.dart'; class DeviceCheckoutRequestScreen extends StatefulWidget { final String studentId; @@ -82,13 +83,19 @@ class _DeviceCheckoutRequestScreenState return Scaffold( backgroundColor: AppPalette.mist, appBar: AppBar( - title: const Text( - '스마트기기 반출 신청', - style: TextStyle(fontWeight: FontWeight.bold), - ), - backgroundColor: AppPalette.ink, - foregroundColor: Colors.white, + backgroundColor: Colors.transparent, + foregroundColor: AppPalette.ink, elevation: 0, + centerTitle: true, + title: const TitlePill( + child: Text( + '스마트기기 반출 신청', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ), ), body: SingleChildScrollView( padding: const EdgeInsets.all(24.0), diff --git a/lib/ui/nfc_poccket_checkin_screen.dart b/lib/ui/nfc_poccket_checkin_screen.dart index c803b33..c3982e1 100644 --- a/lib/ui/nfc_poccket_checkin_screen.dart +++ b/lib/ui/nfc_poccket_checkin_screen.dart @@ -5,7 +5,9 @@ import 'dart:io' show Platform; import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/material.dart'; import '../function/nfc_pocket_checkin_controller.dart'; +import '../theme/app_palette.dart'; import 'app_notice.dart'; +import 'title_pill.dart'; class NfcPocketCheckInScreen extends StatefulWidget { final String studentId; // 로그인된 학생 학번 (예: "2061") @@ -158,14 +160,19 @@ class _NfcPocketCheckInScreenState extends State { return Scaffold( appBar: AppBar( - title: const Text( - "자습실 NFC 출석체크", - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, + backgroundColor: Colors.transparent, + foregroundColor: AppPalette.ink, + elevation: 0, + centerTitle: true, + title: const TitlePill( + child: Text( + "자습실 NFC 출석체크", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), ), ), - backgroundColor: const Color.fromARGB(255, 48, 48, 52), ), body: Center( child: Padding( diff --git a/lib/ui/nfc_tag_writer_screen.dart b/lib/ui/nfc_tag_writer_screen.dart index 02db293..5ae805f 100644 --- a/lib/ui/nfc_tag_writer_screen.dart +++ b/lib/ui/nfc_tag_writer_screen.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import '../function/nfc_tag_writer_controller.dart'; import '../theme/app_palette.dart'; import 'app_notice.dart'; +import 'title_pill.dart'; class NfcTagWriterScreen extends StatefulWidget { const NfcTagWriterScreen({super.key}); @@ -53,9 +54,16 @@ class _NfcTagWriterScreenState extends State { return Scaffold( backgroundColor: AppPalette.mist, appBar: AppBar( - title: const Text("NFC 주머니 태그 쓰기"), - backgroundColor: AppPalette.ink, - foregroundColor: AppPalette.paper, + backgroundColor: Colors.transparent, + foregroundColor: AppPalette.ink, + elevation: 0, + centerTitle: true, + title: const TitlePill( + child: Text( + "NFC 주머니 태그 쓰기", + style: TextStyle(color: Colors.white), + ), + ), ), body: Padding( padding: const EdgeInsets.all(24.0), diff --git a/lib/ui/teacher_register_screen.dart b/lib/ui/teacher_register_screen.dart index 87ee51f..3cb51e4 100644 --- a/lib/ui/teacher_register_screen.dart +++ b/lib/ui/teacher_register_screen.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import '../function/teacher_register_controller.dart'; import '../theme/app_palette.dart'; import 'app_notice.dart'; +import 'title_pill.dart'; class TeacherRegisterScreen extends StatefulWidget { const TeacherRegisterScreen({super.key}); @@ -61,9 +62,13 @@ class _TeacherRegisterScreenState extends State { return Scaffold( backgroundColor: AppPalette.mist, appBar: AppBar( - title: const Text('교사 회원가입'), - backgroundColor: AppPalette.ink, - foregroundColor: AppPalette.paper, + backgroundColor: Colors.transparent, + foregroundColor: AppPalette.ink, + elevation: 0, + centerTitle: true, + title: const TitlePill( + child: Text('교사 회원가입', style: TextStyle(color: Colors.white)), + ), ), body: SingleChildScrollView( padding: const EdgeInsets.all(24.0), diff --git a/lib/ui/teacher_student_management_page.dart b/lib/ui/teacher_student_management_page.dart index 0a2673d..462fe19 100644 --- a/lib/ui/teacher_student_management_page.dart +++ b/lib/ui/teacher_student_management_page.dart @@ -7,6 +7,7 @@ import '../function/excel_file_picker.dart'; import '../function/teacher_student_management_controller.dart'; import '../theme/app_palette.dart'; import 'app_notice.dart'; +import 'title_pill.dart'; // 📐 "실시간 출석 확인" 목록(teacher_attendance_page.dart)의 타일 규격과 동일하게 맞춘다. const double kAttendanceTileWidth = 220; @@ -658,13 +659,19 @@ class _TeacherStudentManagementPageState return Scaffold( backgroundColor: AppPalette.mist, appBar: AppBar( - title: const Text( - '학생 통합 관리 센터', - style: TextStyle(fontWeight: FontWeight.bold), - ), - backgroundColor: AppPalette.ink, - foregroundColor: AppPalette.paper, + backgroundColor: Colors.transparent, + foregroundColor: AppPalette.ink, elevation: 0, + centerTitle: true, + title: const TitlePill( + child: Text( + '학생 통합 관리 센터', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ), ), body: SingleChildScrollView( padding: const EdgeInsets.all(24.0), diff --git a/lib/ui/title_pill.dart b/lib/ui/title_pill.dart new file mode 100644 index 0000000..a1ec1ff --- /dev/null +++ b/lib/ui/title_pill.dart @@ -0,0 +1,22 @@ +// 🪶 검정 AppBar 대신 쓰는 둥근 제목 알약. 실시간 출석 현황 화면과 톤을 맞추되, +// 크기는 줄이지 않고 각 화면이 원래 쓰던 폰트 스타일을 그대로 넘겨받는다. +import 'package:flutter/material.dart'; +import '../theme/app_palette.dart'; + +class TitlePill extends StatelessWidget { + final Widget child; + + const TitlePill({super.key, required this.child}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + decoration: BoxDecoration( + color: AppPalette.ink, + borderRadius: BorderRadius.circular(999), + ), + child: child, + ); + } +}