From ae3a3f18eae503d579bdc11d1a5d4b47c7316887 Mon Sep 17 00:00:00 2001 From: sihoo Date: Wed, 30 Sep 2026 05:53:01 +0000 Subject: [PATCH] =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=95=84=20=ED=83=80?= =?UTF-8?q?=EC=9D=BC=EC=97=90=20=ED=8E=B8=EC=A7=91=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EC=BB=A4=EC=8A=A4=ED=85=80=20=ED=99=94=EB=A9=B4=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 메인 대시보드 프로필 카드 오른쪽 위에 작은 편집(연필) 버튼을 달아서 누르면 새로 만든 빈 커스텀 화면(ProfileCustomizeScreen)으로 이동한다. 아직은 자리만 잡아둔 화면이고, 실제 커스텀 기능들은 이후에 하나씩 추가. Co-Authored-By: Claude Sonnet 5 --- lib/ui/main_dashboard.dart | 155 ++++++++++++++++----------- lib/ui/profile_customize_screen.dart | 56 ++++++++++ 2 files changed, 150 insertions(+), 61 deletions(-) create mode 100644 lib/ui/profile_customize_screen.dart diff --git a/lib/ui/main_dashboard.dart b/lib/ui/main_dashboard.dart index 3511da3..2703cc9 100644 --- a/lib/ui/main_dashboard.dart +++ b/lib/ui/main_dashboard.dart @@ -24,6 +24,7 @@ import 'launchpad_transition.dart'; import 'login_screen.dart'; import 'nfc_poccket_checkin_screen.dart'; import 'nfc_tag_writer_screen.dart'; +import 'profile_customize_screen.dart'; import 'study_calendar_screen.dart'; import 'study_timer_screen.dart'; import 'teacher_attendance_page.dart'; @@ -632,72 +633,104 @@ class _MainDashboardState extends State { // 🪪 작은 프로필 카드로 배치 — 화면 전체를 차지하던 배너 대신 // 가운데에 떠 있는 카드 하나만 둔다. Center( - child: Container( - padding: const EdgeInsets.symmetric( - horizontal: 28, - vertical: 18, - ), - decoration: BoxDecoration( - color: theme.color, - borderRadius: BorderRadius.circular(24), - boxShadow: [ - BoxShadow( - color: theme.color.withValues(alpha: 0.25), - blurRadius: 16, - offset: const Offset(0, 6), + child: Stack( + clipBehavior: Clip.none, + children: [ + Container( + padding: const EdgeInsets.symmetric( + horizontal: 28, + vertical: 18, ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - theme.title, - style: const TextStyle( - fontWeight: FontWeight.bold, - letterSpacing: 1.2, - color: Colors.white, - fontSize: 13, - ), + decoration: BoxDecoration( + color: theme.color, + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: theme.color.withValues(alpha: 0.25), + blurRadius: 16, + offset: const Offset(0, 6), + ), + ], ), - const SizedBox(height: 10), - Container( - padding: const EdgeInsets.all(4), - decoration: const BoxDecoration( - color: Colors.white, - shape: BoxShape.circle, - ), - child: CircleAvatar( - radius: 22, - backgroundColor: AppPalette.linen, - child: Icon( - theme.icon, - size: 22, - color: theme.color, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + theme.title, + style: const TextStyle( + fontWeight: FontWeight.bold, + letterSpacing: 1.2, + color: Colors.white, + fontSize: 13, + ), + ), + const SizedBox(height: 10), + Container( + padding: const EdgeInsets.all(4), + decoration: const BoxDecoration( + color: Colors.white, + shape: BoxShape.circle, + ), + child: CircleAvatar( + radius: 22, + backgroundColor: AppPalette.linen, + child: Icon( + theme.icon, + size: 22, + color: theme.color, + ), + ), + ), + const SizedBox(height: 10), + Text( + '$_displayName 님', + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 17, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + const SizedBox(height: 3), + Text( + theme.subtitle, + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white.withValues(alpha: 0.8), + fontSize: 12, + ), + ), + ], + ), + ), + Positioned( + top: -6, + right: -6, + child: Material( + color: AppPalette.paper, + shape: const CircleBorder(), + elevation: 2, + child: InkWell( + customBorder: const CircleBorder(), + onTap: () => pushLaunchpad( + context, + (context) => ProfileCustomizeScreen( + studentId: _displayId, + studentName: _displayName, + ), + ), + child: const Padding( + padding: EdgeInsets.all(8), + child: Icon( + Icons.edit_rounded, + size: 16, + color: AppPalette.ink, + ), ), ), ), - const SizedBox(height: 10), - Text( - '$_displayName 님', - textAlign: TextAlign.center, - style: const TextStyle( - fontSize: 17, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ), - const SizedBox(height: 3), - Text( - theme.subtitle, - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white.withValues(alpha: 0.8), - fontSize: 12, - ), - ), - ], - ), + ), + ], ), ), const SizedBox(height: 28), diff --git a/lib/ui/profile_customize_screen.dart b/lib/ui/profile_customize_screen.dart new file mode 100644 index 0000000..f446b50 --- /dev/null +++ b/lib/ui/profile_customize_screen.dart @@ -0,0 +1,56 @@ +// 🎨 프로필 커스텀 화면 (UI 전용). 아직은 자리만 잡아둔 빈 화면 - 프로필 꾸미기 +// 관련 기능들이 여기에 하나씩 추가될 예정이다. +import 'package:flutter/material.dart'; +import '../theme/app_palette.dart'; +import 'title_pill.dart'; + +class ProfileCustomizeScreen extends StatelessWidget { + final String studentId; + final String studentName; + + const ProfileCustomizeScreen({ + super.key, + required this.studentId, + required this.studentName, + }); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppPalette.mist, + appBar: AppBar( + backgroundColor: Colors.transparent, + foregroundColor: AppPalette.ink, + elevation: 0, + centerTitle: true, + title: const TitlePill('프로필 꾸미기'), + ), + body: Center( + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon( + Icons.auto_awesome_rounded, + size: 48, + color: AppPalette.ink, + ), + const SizedBox(height: 16), + const Text( + '곧 다양한 프로필 커스텀 기능이 추가될 예정이에요.', + textAlign: TextAlign.center, + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + ), + const SizedBox(height: 6), + Text( + '$studentName ($studentId)', + style: const TextStyle(color: Colors.grey), + ), + ], + ), + ), + ), + ); + } +}