From caed0fbbf39f0db6990887afc17cb6ad2ba264aa Mon Sep 17 00:00:00 2001 From: pkdee Date: Sat, 4 Jul 2026 19:24:03 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=9E=84=EB=B0=95=C2=B7=EC=A7=80?= =?UTF-8?q?=EC=97=B0=20=ED=91=9C=EC=8B=9C=EB=A5=BC=20danger=E2=86=92warnin?= =?UTF-8?q?g=20=ED=86=A4=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - taskStateMeta 밀림/미완료, debtStateMeta 계속 밀림을 warning 으로 - 히어로 마감 임박 배지 warning subtle + warningFg flame(solid 대비 미달 회피) - 홈 D-값 긴급 색·계속 밀림 뱃지·debtWarning 알림 톤 통일 - danger 는 파괴적 액션·오류 전용 예약(DQ-10, ADR-0032 6항) Closes #198 --- lib/data/meta.dart | 7 ++++--- lib/parts/dday_hero.dart | 11 ++++++----- lib/screens/plan/task_screen.dart | 2 +- lib/screens/sheets/notif_sheet.dart | 2 +- lib/screens/today/today_screen.dart | 5 +++-- test/meta_test.dart | 7 +++++++ 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/lib/data/meta.dart b/lib/data/meta.dart index 1b7f72e..5809221 100644 --- a/lib/data/meta.dart +++ b/lib/data/meta.dart @@ -28,8 +28,9 @@ DkStateMeta taskStateMeta(DkTaskState state) => switch (state) { DkTaskState.done => const DkStateMeta(DkTone.success, '완료'), DkTaskState.today => const DkStateMeta(DkTone.primary, '오늘'), DkTaskState.carried => const DkStateMeta(DkTone.info, '옮김'), - DkTaskState.overdue => const DkStateMeta(DkTone.danger, '밀림'), - DkTaskState.missed => const DkStateMeta(DkTone.danger, '미완료'), + // 지연·미룸은 warning(시간 압박) — danger 는 파괴적 액션 전용(DQ-10, ADR-0032 6항). + DkTaskState.overdue => const DkStateMeta(DkTone.warning, '밀림'), + DkTaskState.missed => const DkStateMeta(DkTone.warning, '미완료'), DkTaskState.abandoned => const DkStateMeta(DkTone.neutral, '내려놓음'), DkTaskState.pending => const DkStateMeta(DkTone.neutral, '예정'), }; @@ -38,7 +39,7 @@ DkStateMeta taskStateMeta(DkTaskState state) => switch (state) { DkStateMeta debtStateMeta(DkDebtStatus status) => switch (status) { DkDebtStatus.pending => const DkStateMeta(DkTone.neutral, '대기'), DkDebtStatus.assigned => const DkStateMeta(DkTone.info, '배정됨'), - DkDebtStatus.overdue => const DkStateMeta(DkTone.danger, '계속 밀림'), + DkDebtStatus.overdue => const DkStateMeta(DkTone.warning, '계속 밀림'), DkDebtStatus.resolved => const DkStateMeta(DkTone.success, '해소'), DkDebtStatus.abandoned => const DkStateMeta(DkTone.neutral, '내려놓음'), }; diff --git a/lib/parts/dday_hero.dart b/lib/parts/dday_hero.dart index 9059ec6..acdce9b 100644 --- a/lib/parts/dday_hero.dart +++ b/lib/parts/dday_hero.dart @@ -74,16 +74,17 @@ class DdayHero extends StatelessWidget { ), if (urgent) ...[ const SizedBox(width: 8), - const DkBadge( + // warning 톤(시간 압박) — danger 는 파괴적 액션 전용(DQ-10). + // solid(흰 글자)는 다크 앰버 배경에서 대비가 깨져 subtle 유지. + DkBadge( '마감 임박', - tone: DkTone.danger, - solid: true, + tone: DkTone.warning, leading: DkIcon( 'flame', size: 12, - color: white, + color: t.warningFg, strokeWidth: 2, - fill: white, + fill: t.warningFg, ), ), ], diff --git a/lib/screens/plan/task_screen.dart b/lib/screens/plan/task_screen.dart index 7f45ba6..66b3a52 100644 --- a/lib/screens/plan/task_screen.dart +++ b/lib/screens/plan/task_screen.dart @@ -186,7 +186,7 @@ class _TaskScreenState extends State { const SizedBox(width: 6), DkBadge( '계속 밀림 ${widget.debtOverdue}건', - tone: DkTone.danger, + tone: DkTone.warning, ), ], ], diff --git a/lib/screens/sheets/notif_sheet.dart b/lib/screens/sheets/notif_sheet.dart index 175b311..737f231 100644 --- a/lib/screens/sheets/notif_sheet.dart +++ b/lib/screens/sheets/notif_sheet.dart @@ -12,7 +12,7 @@ import '../../widgets/dk_sheet.dart'; ({String icon, DkTone tone}) _appearance(DkNotifType type) => switch (type) { DkNotifType.dday => (icon: 'target', tone: DkTone.primary), DkNotifType.debtCreated => (icon: 'carryForward', tone: DkTone.warning), - DkNotifType.debtWarning => (icon: 'flame', tone: DkTone.danger), + DkNotifType.debtWarning => (icon: 'flame', tone: DkTone.warning), DkNotifType.streak => (icon: 'trophy', tone: DkTone.success), }; diff --git a/lib/screens/today/today_screen.dart b/lib/screens/today/today_screen.dart index 792c880..27bd707 100644 --- a/lib/screens/today/today_screen.dart +++ b/lib/screens/today/today_screen.dart @@ -214,8 +214,9 @@ class _DdayRow extends StatelessWidget { : '${info.pct}%') : info.label.replaceAll('마감 ', '').replaceAll('시작 ', ''); // 종료(D+)는 강조 해제(회색), 임박은 danger, 그 외 기본. + // 임박(high)은 warning(시간 압박) — danger 는 파괴적 액션 전용(DQ-10). Color uColor(DkUrgency u) => switch (u) { - DkUrgency.high => t.danger, + DkUrgency.high => t.warning, DkUrgency.past => t.fgDisabled, _ => t.fgStrong, }; @@ -455,7 +456,7 @@ class _DebtNudge extends StatelessWidget { ), if (overdueCount > 0) ...[ const SizedBox(width: 6), - DkBadge('계속 밀림 $overdueCount건', tone: DkTone.danger), + DkBadge('계속 밀림 $overdueCount건', tone: DkTone.warning), ], ], ), diff --git a/test/meta_test.dart b/test/meta_test.dart index 90fccd0..399bf53 100644 --- a/test/meta_test.dart +++ b/test/meta_test.dart @@ -3,6 +3,7 @@ import 'package:ieoseo/data/meta.dart'; import 'package:ieoseo/data/models.dart'; import 'package:ieoseo/theme/tokens.dart'; import 'package:ieoseo/theme/tweaks.dart'; +import 'package:ieoseo/widgets/dk_badge.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { @@ -52,6 +53,12 @@ void main() { expect(taskStateMeta(DkTaskState.carried).label, '옮김'); }); + test('지연·미룸 상태는 warning 톤 — danger 는 파괴적 액션 전용(DQ-10)', () { + expect(taskStateMeta(DkTaskState.overdue).tone, DkTone.warning); + expect(taskStateMeta(DkTaskState.missed).tone, DkTone.warning); + expect(debtStateMeta(DkDebtStatus.overdue).tone, DkTone.warning); + }); + test('부채 상태 → 톤·라벨', () { expect(debtStateMeta(DkDebtStatus.overdue).label, '계속 밀림'); expect(debtStateMeta(DkDebtStatus.assigned).label, '배정됨');