diff --git a/docs/12_core_loop_execution_roadmap.md b/docs/12_core_loop_execution_roadmap.md index 648d0c4..3bce2f6 100644 --- a/docs/12_core_loop_execution_roadmap.md +++ b/docs/12_core_loop_execution_roadmap.md @@ -302,6 +302,9 @@ Away / Return이 끼어들기 전, 다음으로 예정된 축은 아래 두 가 ### 진행 중 - `Pause / Break / Return` separation polish + - material 1차 분리 반영 완료 + - copy / CTA hierarchy 2차 분리 반영 완료 + - 남은 것은 browser QA와 motion 미세 조정 ### 다음 대기 diff --git a/docs/90_current_state.md b/docs/90_current_state.md index 719a567..4a2e2d3 100644 --- a/docs/90_current_state.md +++ b/docs/90_current_state.md @@ -47,6 +47,11 @@ Last Updated: 2026-03-14 - `Return(focus)`와 `Return(break)`가 같은 tray처럼 보이지 않도록 break tray에 emerald tint release tone 도입 - `Goal Complete`의 `잠깐 쉬기` 선택도 같은 break 계열 material로 연결 - timer HUD는 break phase에서 더 가벼운 emerald 계열 glass로 보정해 focus/pause와 구분되게 조정 +- `/space` Pause / Break / Return copy + interaction polish: + - `Pause`는 `멈춘 이유` 대신 `다시 시작할 한 줄`을 중심으로 카피를 다시 정리 + - `Return(focus)`는 `멈춘 자리에서 이어가기`, `Return(break)`는 `지금부터 쉬기 / 다음 블록 이어가기` 중심으로 재서술 + - `Goal Complete`는 `다음 블록 이어가기 / 잠깐 쉬기 / 여기까지 끝내기` 순의 선택 tray를 먼저 보여주고, 다음 블록 입력은 이후 단계에서만 열리게 정리 + - choice/next view의 헤더와 설명도 각각 다른 감정 상태에 맞춰 분리 - Focus Entry Surface / Execution Surface 재정의: - `/app`을 planning home이 아니라 hero-first focus entry surface로 재구성 diff --git a/docs/session_brief.md b/docs/session_brief.md index 3aff7fc..1c06dd9 100644 --- a/docs/session_brief.md +++ b/docs/session_brief.md @@ -14,8 +14,8 @@ Last Updated: 2026-03-14 ## 현재 우선순위 -1. `Pause / Break / Return` 분리 polish -2. `/space` Refocus + Return 브라우저 QA +1. `/space` Refocus + Return 브라우저 QA +2. `Pause / Break / Return` motion polish 3. `Weekly Review` 상세 기획 ## 최근 세션 상태 @@ -52,6 +52,10 @@ Last Updated: 2026-03-14 - `Return(break)`은 focus 복귀 tray와 같은 재질을 쓰지 않고, 더 부드러운 emerald tint release tone으로 분리했다. - `Goal Complete`의 `잠깐 쉬기` 선택도 같은 release tone으로 연결했다. - timer HUD도 break phase에서는 더 가벼운 emerald 계열 material로 바뀌어 pause/focus와 다르게 읽히도록 정리 중이다. +- `Pause / Break / Return`의 카피와 CTA 위계를 2차로 분리했다. + - `Pause`는 `멈춘 이유`보다 `다시 시작할 한 줄`에 집중하는 recovery tone으로 다시 썼다. + - `Return(focus)`는 `이어가기`, `Return(break)`는 `지금부터 쉬기 / 다음 블록 이어가기` 중심으로 문구를 분리했다. + - `Goal Complete`는 `마무리 / 쉬기 / 이어가기`의 선택 tray가 먼저 보이고, 다음 블록 입력은 이후 단계에서만 열리도록 더 선명해졌다. - `/app`을 single-goal commitment gate로 다시 줄였다. - 2-step ritual setup을 제거했다. - current session이 있으면 `Resume` UI만 보여주고, `/space`로 이어가기만 제안한다. diff --git a/docs/work.md b/docs/work.md index 2d4dc2f..3511384 100644 --- a/docs/work.md +++ b/docs/work.md @@ -81,8 +81,10 @@ - pause는 recovery tone - break는 release tone - return은 re-entry tone으로 분리된다 + - copy와 CTA hierarchy 2차 분리가 반영된다 - 검증: - 브라우저 수동 확인 + - motion 미세 조정 - 커밋 힌트: - feat(space): separate-pause-break-return diff --git a/src/shared/i18n/messages/space.ts b/src/shared/i18n/messages/space.ts index 8d4c5ae..3d9e2bf 100644 --- a/src/shared/i18n/messages/space.ts +++ b/src/shared/i18n/messages/space.ts @@ -47,23 +47,23 @@ export const space = { refocusSaved: '이번 세션 방향을 다듬었어요.', refocusOpenOnPause: '잠시 멈춘 김에 다음 한 조각을 다시 맞춰볼까요?', pausePromptEyebrow: '잠깐 멈춤', - pausePromptTitle: '다시 붙잡을 한 조각만 정하면 돼요.', - pausePromptDescription: '왜 멈췄는지는 묻지 않아요. 다시 시작할 한 조각만 남겨요.', + pausePromptTitle: '다시 시작할 한 줄만 정하면 돼요.', + pausePromptDescription: '멈춘 이유를 정리하지 않아도 괜찮아요. 바로 손을 올릴 시작점만 다시 맞춥니다.', pausePromptRefocus: '한 조각 다시 잡기', pausePromptRefocusHint: '목표는 그대로 두고, 지금 다시 시작할 한 줄만 정리해요.', - pausePromptKeep: '이대로 이어가기', - pausePromptKeepHint: '지금 방향을 그대로 유지한 채 바로 이어서 시작해요.', + pausePromptKeep: '바로 이어가기', + pausePromptKeepHint: '지금 방향을 유지한 채, 멈춘 자리에서 다시 시작해요.', returnPromptEyebrow: '다시 돌아왔어요', - returnPromptFocusTitle: '이어서 갈까요?', - returnPromptFocusDescription: '흐름은 그대로 남아 있어요. 바로 이어가거나 한 조각만 다시 잡을 수 있어요.', + returnPromptFocusTitle: '흐름은 아직 남아 있어요.', + returnPromptFocusDescription: '멈춘 자리에서 바로 이어가거나, 다시 시작할 한 조각만 조용히 다듬을 수 있어요.', returnPromptBreakTitle: '자리를 비운 사이 이 블록이 끝났어요.', - returnPromptBreakDescription: '지금부터 쉬거나, 다음으로 이어갈 수 있어요.', - returnPromptContinue: '이어서 하기', - returnPromptContinueHint: '타이머와 흐름을 그대로 둔 채 다시 집중으로 돌아갑니다.', + returnPromptBreakDescription: '지금부터 쉬거나, 다음 블록으로 부드럽게 넘어갈 수 있어요.', + returnPromptContinue: '멈춘 자리에서 이어가기', + returnPromptContinueHint: '타이머와 현재 흐름을 그대로 두고 다시 집중으로 복귀합니다.', returnPromptRest: '지금부터 쉬기', returnPromptRestHint: '지금부터 break를 시작한 것처럼 천천히 숨을 고릅니다.', - returnPromptNext: '다음 목표 이어가기', - returnPromptNextHint: '다음 한 조각을 바로 정하고 흐름을 끊지 않고 잇습니다.', + returnPromptNext: '다음 블록 이어가기', + returnPromptNextHint: '다음 한 조각을 정하고, 같은 흐름 안에서 부드럽게 이어갑니다.', returnPromptRefocus: '한 조각 다시 잡기', returnPromptRefocusHint: '왜 멈췄는지는 건너뛰고, 지금 다시 시작할 한 줄만 남깁니다.', microStepCompleteAriaLabel: '현재 한 조각 완료', @@ -80,18 +80,20 @@ export const space = { suggestions: ['리뷰 코멘트 2개 처리', '문서 1문단 다듬기', '이슈 1개 정리', '메일 2개 회신'], placeholderFallback: '다음 한 조각을 적어보세요', placeholderExample: (goal: string) => `예: ${goal}`, - title: '좋아요. 다음 한 조각은?', - description: '너무 크게 잡지 말고, 바로 다음 한 조각만.', - currentGoalLabel: '끝낸 목표', - nextGoalLabel: '다음 목표', - chooseNextButton: '다음 목표 이어가기', - chooseNextDescription: '바로 이어갈 다음 한 조각을 정하고 계속 갑니다.', + title: '이 블록을 어떻게 닫을까요?', + description: '지금은 끝내기, 쉬기, 이어가기 중 하나만 고르면 돼요.', + nextTitle: '좋아요. 다음 한 조각만 정해요.', + nextDescription: '너무 크게 잡지 말고, 바로 손을 올릴 한 줄만 남겨요.', + currentGoalLabel: '방금 끝낸 블록', + nextGoalLabel: '이어갈 다음 블록', + chooseNextButton: '다음 블록 이어가기', + chooseNextDescription: '다음 한 조각을 정하고 같은 흐름 안에서 계속 갑니다.', backButton: '돌아가기', closeAriaLabel: '닫기', finishButton: '여기까지 끝내기', finishDescription: '이 블록은 여기서 닫고, 다음 진입은 가볍게 남겨둡니다.', restButton: '잠깐 쉬기', - restDescription: '지금은 멈추고 숨을 고른 뒤 돌아올 여지를 남겨둡니다.', + restDescription: '이 블록은 닫고, 지금부터는 잠깐 쉬는 리듬으로 넘어갑니다.', confirmButton: '다음 목표로 바로 시작', confirmPending: '시작 중…', finishPending: '마무리 중…', diff --git a/src/widgets/space-focus-hud/ui/GoalCompleteSheet.tsx b/src/widgets/space-focus-hud/ui/GoalCompleteSheet.tsx index feee62d..8c21091 100644 --- a/src/widgets/space-focus-hud/ui/GoalCompleteSheet.tsx +++ b/src/widgets/space-focus-hud/ui/GoalCompleteSheet.tsx @@ -87,6 +87,14 @@ export const GoalCompleteSheet = ({ const canConfirm = draft.trim().length > 0; const isSubmitting = submissionMode !== null; const trimmedCurrentGoal = currentGoal.trim(); + const title = + view === 'next' + ? copy.space.goalComplete.nextTitle + : copy.space.goalComplete.title; + const description = + view === 'next' + ? copy.space.goalComplete.nextDescription + : copy.space.goalComplete.description; const handleSubmit = async (event: FormEvent) => { event.preventDefault(); @@ -143,8 +151,8 @@ export const GoalCompleteSheet = ({

목표 완료

-

{copy.space.goalComplete.title}

-

{copy.space.goalComplete.description}

+

{title}

+

{description}

diff --git a/src/widgets/space-focus-hud/ui/ReturnPrompt.tsx b/src/widgets/space-focus-hud/ui/ReturnPrompt.tsx index 568d5d5..e5e3b3f 100644 --- a/src/widgets/space-focus-hud/ui/ReturnPrompt.tsx +++ b/src/widgets/space-focus-hud/ui/ReturnPrompt.tsx @@ -41,9 +41,12 @@ export const ReturnPrompt = ({ return (
-
+
{isBreakReturn ? ( <> ) : ( @@ -130,15 +133,15 @@ export const ReturnPrompt = ({ disabled={isBusy} className={cn(HUD_OPTION_ROW, HUD_OPTION_ROW_PRIMARY)} > -
+

{copy.space.focusHud.returnPromptContinue}

-

+

{copy.space.focusHud.returnPromptContinueHint}

- + )}