Figma 설명 프레임 반영 — 로그인·온보딩·스플래시 · HOME · GALAXY · 퀘스트·이클립스·알림

This commit is contained in:
Sn-Kinos
2026-10-06 03:03:20 +09:00
parent 64825e72b0
commit ecf5998725
77 changed files with 2703 additions and 640 deletions
@@ -11,6 +11,7 @@ import 'quest_data.dart';
import 'widgets/quest_card_tile.dart';
import '../../core/i18n/app_locale.dart';
import '../../core/ui/bottom_inset.dart';
import '../../core/ui/sheet_route.dart';
/// 퀘스트 생성 — 화면 대조 원장 F4 · Figma `254:164081`.
///
@@ -51,6 +52,7 @@ class _QuestCreateScreenState extends State<QuestCreateScreen> {
QuestLink? _link;
bool _checkingLink = false;
bool _saving = false;
int? _myPop;
@override
void initState() {
@@ -75,6 +77,9 @@ class _QuestCreateScreenState extends State<QuestCreateScreen> {
}
Future<void> _load() async {
widget.repository.spendableBalance().then((v) {
if (mounted) setState(() => _myPop = v);
}, onError: (_) {});
final catalog = await widget.repository.catalog();
if (mounted) setState(() => _catalog = catalog);
}
@@ -107,6 +112,8 @@ class _QuestCreateScreenState extends State<QuestCreateScreen> {
? context.l10n.questPreviewHint
: _title.text.trim(),
categoryName: _activity?.name ?? _category?.name ?? context.l10n.questNoCategory,
// 명세 `523:18123` 미리보기 — *입력 상태에 따라 실시간 반영*. 고른 활동의 아이콘을 바로 보인다.
type: _activity == null ? QuestType.unknown : QuestType.parse(_activity!.key),
author: QuestAuthor.user,
stage: QuestStage.mine,
goal: _needs('goal') ? _intOf(_goal) : 1,
@@ -303,7 +310,12 @@ class _QuestCreateScreenState extends State<QuestCreateScreen> {
ListTile(
contentPadding: EdgeInsets.zero,
leading: const Icon(Icons.place_outlined),
title: Text(_place?.name ?? context.l10n.questPickPlace),
// 명세 `523:18270` — *텍스트 넘칠 경우 ... 처리*.
title: Text(
_place?.name ?? context.l10n.questPickPlace,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
trailing: const Icon(Icons.chevron_right),
onTap: _pickPlace,
),
@@ -380,6 +392,20 @@ class _QuestCreateScreenState extends State<QuestCreateScreen> {
),
style: const TextStyle(fontSize: 13, color: AppColors.onCosmicVariant),
),
// 명세 `523:18176` 완료 보상 설정 영역 — *보유 POP 값*.
if (_myPop != null)
Text.rich(
TextSpan(
text: context.l10n.commonMyPop,
children: [
TextSpan(
text: formatPop(_myPop!),
style: const TextStyle(color: AppColors.cosmicBlue),
),
],
),
style: const TextStyle(fontSize: 13, color: AppColors.onCosmicVariant),
),
] else
Text(
context.l10n.questNoReward,
@@ -422,7 +448,8 @@ class _QuestCreateScreenState extends State<QuestCreateScreen> {
_places = places;
}
final picked = await Navigator.of(context, rootNavigator: true).push<QuestPlace>(
MaterialPageRoute(builder: (_) => PlacePickerScreen(places: _places)),
// 명세 `523:18207` — 선택 완료 시 *하단 move out 페이지 종료 후 이전 화면 이동*.
SheetRoute(builder: (_) => PlacePickerScreen(places: _places)),
);
if (picked == null || !mounted) return;
setState(() => _place = picked);
@@ -448,8 +475,9 @@ class _QuestCreateScreenState extends State<QuestCreateScreen> {
final go = await showConfirmDialog(
context,
context.l10n.questCreateConfirm,
cancelLabel: context.l10n.commonKeepEditing,
confirmLabel: context.l10n.questCreate,
// 명세 `523:18176` 생성 안내 모달 — *취소 / 완료*(시안 `548:19548` · `548:19552`).
cancelLabel: context.l10n.commonCancel,
confirmLabel: context.l10n.commonDone,
body: context.l10n.questCreateCost(
_preview.title,
formatPop(_intOf(_reward)),