구조색 4종(mist/paper/linen/sage)을 const에서 뺀 뒤 AppPalette.applyTemplateTheme()
으로 템플릿 장착/해제 시 한 번에 바꿔치기하게 했다. 이 4개는 전부 "배경/카드/
구분선" 용도로만 쓰이던 색이라, 장착 즉시 거의 모든 화면(백품타 포함, AppPalette.mist/
paper/sage를 쓰는 화면이면 코드 수정 없이 자동 반영)의 배경·카드·테두리가 테마를
따라간다. ink는 텍스트/버튼 등 너무 광범위하게 쓰여서 그대로 고정.
제목 알약(TitlePill, 24개 화면이 공유)은 ink를 직접 바꾸면 안 되므로 별도로
globalProfileTheme(ValueNotifier) 하나를 구독해서 배경을 theme.secondary로
바꾸게 했다 - 이 위젯 하나만 고쳐서 모든 화면의 제목 배경에 한 번에 적용.
백품타(study_timer_screen)는 시작/재개 버튼과 큰 타이머 숫자처럼 "중립" 요소만
테마 강조색(accent)으로 바꾸고, 일시정지(warning)/종료(danger) 같은 경고성
색은 의미가 있어서 그대로 뒀다.
main_dashboard/profile_customize_screen은 실제로 장착이 바뀔 때마다
applyGlobalProfileTheme()을 호출해 위 두 전역 상태를 동기화한다.
구조색을 const에서 빼면서 기존에 const로 선언돼 있던 지점 몇 곳
(app_notice, device_checkout_ledger_page, group_detail_screen,
main_dashboard, teacher_attendance_page)에서 const 컴파일 에러가 나서
해당 const 키워드만 제거해 수정했다.
기존엔 미리보기가 큰 타일 하나만 바꾸고, 배경/카드 등 화면 전체는 실제
장착된 테마를 따로 불러와 보여줬다. 이제는 _resolvePreviewTemplate()
하나로 "지금 보여줄 테마"를 통일해서, 체험하기로 고른 템플릿이 배경색/
보유 캐시 바/카드 전부에 즉시 반영된다. "기본 모습"을 고르면 화면 전체가
원래 모습으로 돌아간다.
ShopTemplate에 code 필드를 추가해서 profileThemes 맵을 바로 찾아 쓸 수
있게 했다.
1. 커스텀(상점) 화면 자체도 장착한 테마를 반영하도록 함: 배경색, 보유 캐시
바 배경, 템플릿 카드 배경/테두리/텍스트, 체험하기·장착하기 버튼 색까지
전부 테마를 따라간다. 미리보기는 기존처럼 큰 타일 하나만 별도로 바뀐다.
2. 메인 대시보드의 테마 반영 대상을 학생+관리자에서 학생+교사+관리자로
확장 - 백엔드에서 교사 계정도 템플릿을 무료로 쓸 수 있게 된 것과 짝.
같은 _tileSpecs/_buildModernCard 코드를 역할 구분 없이 공유하므로
테마 로딩 조건만 넓히면 교사/관리자 타일에도 자동으로 적용된다.
- 프로필 꾸미기: 미리보기 중인 큰 타일의 테두리도 테마 색으로 바뀌게 수정,
미구매 템플릿에 "체험하기" 버튼을 따로 둬서 사기 전에도 눌러볼 수 있게 함
- 앱 전반의 확인/삭제/저장 같은 다이얼로그 기본 액션 버튼에 autofocus를 줘서
엔터 키로도 눌리게 함 (텍스트 입력이 있는 다이얼로그는 입력창 쪽에
autofocus + onSubmitted를 달아 입력 중 바로 엔터로 제출되게 처리)
- HoldToRevealPasswordField 위젯 추가 - 눈 아이콘을 누르고 있는 동안만
비밀번호가 평문으로 보임. 로그인/간편인증/초기 비밀번호 변경 화면에 적용
템플릿 카드를 누르면(구매 여부 상관없이) 위쪽 "기본 프로필 꾸미기" 큰 타일이
그 테마 그라데이션으로 바로 바뀌어서 사기 전에 실제 느낌을 볼 수 있다.
미리보기 중인 카드에는 "미리보기" 표시와 테두리로 구분을 주고, 아무것도
직접 고르지 않았을 땐 실제 장착된 테마를 기본으로 보여준다.
카테고리 타일 내부 패딩/간격을 줄이고 제목·부제목에 ellipsis를 줘서
"준비중" 텍스트가 타일 밖으로 삐져나오던 문제를 해결. 관리자 계정도
백엔드에서 템플릿을 무료로 쓸 수 있게 된 것에 맞춰, 메인 대시보드
프로필 카드의 장착 테마 반영을 관리자 계정에도 적용한다.
ListView(스크롤 영역) 안에서 Row에 stretch 정렬만 주면 높이가 정해지지 않아
자식 크기 계산이 깨지는 문제였다. 카테고리 타일 Row 전체를 SizedBox로
감싸 높이를 고정하니 "기본 프로필 꾸미기" 타일과 그 아래 템플릿 목록이
정상적으로 그려진다.
백엔드에 새로 생긴 /api/shop/* 엔드포인트를 붙여서 프로필 커스텀 화면을
실제 상점으로 채웠다. 랭킹/친구창 배경, 출석/그룹창 표시 카테고리는
와이어프레임 자리만 잡아둔 준비중 상태 - 1단계는 기본 프로필 테마만 동작.
장착한 테마는 메인 대시보드 프로필 카드 배경에 바로 반영된다.
학생이 직접 템플릿을 만들어 파는 기능은 이후 단계로 보류.
메인 대시보드 프로필 카드 오른쪽 위에 작은 편집(연필) 버튼을 달아서
누르면 새로 만든 빈 커스텀 화면(ProfileCustomizeScreen)으로 이동한다.
아직은 자리만 잡아둔 화면이고, 실제 커스텀 기능들은 이후에 하나씩 추가.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>