From e2fb720a5509cfd357eeacfd11304e51d8a6d0bb Mon Sep 17 00:00:00 2001 From: corpi Date: Fri, 27 Feb 2026 14:22:56 +0900 Subject: [PATCH] =?UTF-8?q?feat(immersion):=20=EB=AA=B0=EC=9E=85=20?= =?UTF-8?q?=EB=AA=A8=EB=93=9C=20=EC=83=81=EB=8B=A8=20=EC=95=A1=EC=85=98?= =?UTF-8?q?=EC=9D=84=20=EB=82=98=EA=B0=80=EA=B8=B0=EB=A1=9C=20=EC=A0=84?= =?UTF-8?q?=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 맥락: - 몰입 모드 ON에서 상단 우측 액션이 허브 이동으로 보이는 혼선을 줄이고 즉시 이탈 동선을 제공하기 위해 변경사항: - 몰입 모드 훅에 exitImmersionMode 액션 추가 - 몰입 모드 ON 시 상단 우측 액션을 나가기 버튼으로 전환 - 나가기 클릭 시 토스트(나가기(더미)) 노출 후 몰입 모드 OFF 처리 - docs/90_current_state.md, docs/session_brief.md 최신 상태 반영 검증: - npx tsc --noEmit 세션-상태: 몰입 모드 ON에서 상단 우측 액션은 나가기로 동작함 세션-다음: RoomSheet/도크의 인원수 중심 정보를 분위기형 정보로 교체 세션-리스크: 터치 환경에서 미니 레일 발견성이 낮을 수 있어 UX 보완이 필요 --- docs/90_current_state.md | 10 ++++++ docs/session_brief.md | 4 +++ .../immersion-mode/model/useImmersionMode.ts | 8 +++++ .../space-chrome/ui/SpaceChromeWidget.tsx | 36 ++++++++++--------- .../space-shell/ui/SpaceSkeletonWidget.tsx | 3 +- 5 files changed, 43 insertions(+), 18 deletions(-) diff --git a/docs/90_current_state.md b/docs/90_current_state.md index 68b5b20..6b34a22 100644 --- a/docs/90_current_state.md +++ b/docs/90_current_state.md @@ -22,6 +22,12 @@ Last Updated: 2026-02-27 - `/space` 하단 사운드 프리셋 바 제거, 오른쪽 `🎧 Sound` 시트로 이동 - `features/sound-preset` + `widgets/sound-sheet` 추가 - `features/immersion-mode` 추가, Quick 시트에서 몰입 모드 토글 연결 +- `/space` 상단 헤더 크롬 최소화: + - 헤더 프레임(border/강한 배경) 제거 + - 패딩 축소로 배경 노출 증가 +- 타이머 HUD 하단 위치를 safe-area 기반 최소 여백으로 조정 +- 몰입 모드 ON 시 상단 액션을 `나가기` 버튼으로 전환 + - 클릭 시 토스트 `나가기(더미)` 노출 + 몰입 모드 OFF - 몰입 모드 ON 시 `/space` 크롬 정리: - 상단 `Current Room` 블록 숨김 - 우상단 허브 버튼 소형 아이콘화 @@ -39,12 +45,14 @@ Last Updated: 2026-02-27 1. `RoomSheetWidget`/도크 패널의 인원수 기반 UI를 큐레이션형 정보로 재정의 2. 몰입 모드에서 터치 환경(hover 없음) 레일 노출 UX를 보완할지 정책 확정 +3. `/space` 헤더 최소화 스타일을 테마별(밝은 배경) 대비 점검 ## RISKS - `npm run build`는 네트워크 제한 시 Google Font fetch 실패 가능 - 터치 기기에서 레일 미니 상태가 발견성 낮을 수 있어 추가 힌트가 필요할 수 있음 - 일부 시트(예: Room)는 아직 인원수 중심 문구가 남아 있어 톤 불일치 가능성 존재 +- safe-area 값이 작은 기기에서는 HUD가 너무 낮게 느껴질 수 있어 세부 조정 여지 존재 ## CHANGED FILES @@ -81,6 +89,8 @@ Last Updated: 2026-02-27 - `src/widgets/space-tools-dock/model/useSpaceToolsDock.ts` - `src/widgets/space-tools-dock/ui/SpaceToolsDockWidget.tsx` - `src/widgets/space-timer-hud/ui/SpaceTimerHudWidget.tsx` +- `src/widgets/space-chrome/ui/SpaceChromeWidget.tsx` +- `src/features/immersion-mode/model/useImmersionMode.ts` ## QUICK VERIFY diff --git a/docs/session_brief.md b/docs/session_brief.md index 36ee936..8b74d57 100644 --- a/docs/session_brief.md +++ b/docs/session_brief.md @@ -16,12 +16,15 @@ Last Updated: 2026-02-27 1. `RoomSheetWidget`/도크 패널의 인원 수 UI를 큐레이션형으로 전환 2. 몰입 모드에서 터치 환경 레일 발견성(미니 핸들 UX) 보완 여부 결정 +3. `/space` 헤더 최소화 스타일의 밝은 배경 대비 점검 ## 최근 세션 상태 - 세션 복구용 문서/템플릿/스크립트가 준비되어 있다. - `workFlow.md`는 토큰 절약 모드를 사용한다. - `/space` 하단 사운드 바를 제거하고 오른쪽 `🎧 Sound` 시트로 이동했다. +- `/space` 헤더 프레임을 축소하고 HUD를 하단 safe-area 기준으로 더 밀착시켰다. +- 몰입 모드 ON에서 상단 우측 액션을 `나가기`로 전환했고, 클릭 시 토스트(더미)와 함께 몰입 모드 OFF 처리한다. - 몰입 모드 ON 시 상단 룸 블록 숨김, 레일 미니화, HUD 저대비, 비네팅 강화가 적용된다. - 이후 작업은 `docs/work.md`를 기준으로 실행한다. @@ -29,6 +32,7 @@ Last Updated: 2026-02-27 - 네트워크 제한 환경에서는 `npm run build` 시 Google Fonts fetch 실패 가능 - 터치 환경에서 레일 미니 상태가 발견성 낮을 수 있어 UX 보완이 필요할 수 있음 +- safe-area가 작은 기기에서는 HUD 하단 간격 체감이 과도할 수 있어 미세 조정이 필요할 수 있음 ## 상세 원문 위치 diff --git a/src/features/immersion-mode/model/useImmersionMode.ts b/src/features/immersion-mode/model/useImmersionMode.ts index 8d02811..5222c32 100644 --- a/src/features/immersion-mode/model/useImmersionMode.ts +++ b/src/features/immersion-mode/model/useImmersionMode.ts @@ -1,16 +1,24 @@ 'use client'; import { useState } from 'react'; +import { useToast } from '@/shared/ui'; export const useImmersionMode = () => { + const { pushToast } = useToast(); const [isImmersionMode, setImmersionMode] = useState(false); const toggleImmersionMode = () => { setImmersionMode((current) => !current); }; + const exitImmersionMode = () => { + setImmersionMode(false); + pushToast({ title: '나가기(더미)' }); + }; + return { isImmersionMode, toggleImmersionMode, + exitImmersionMode, }; }; diff --git a/src/widgets/space-chrome/ui/SpaceChromeWidget.tsx b/src/widgets/space-chrome/ui/SpaceChromeWidget.tsx index c5c6a03..18e8803 100644 --- a/src/widgets/space-chrome/ui/SpaceChromeWidget.tsx +++ b/src/widgets/space-chrome/ui/SpaceChromeWidget.tsx @@ -4,12 +4,14 @@ interface SpaceChromeWidgetProps { roomName: string; vibeLabel: string; isImmersionMode: boolean; + onExitImmersionMode: () => void; } export const SpaceChromeWidget = ({ roomName, vibeLabel, isImmersionMode, + onExitImmersionMode, }: SpaceChromeWidgetProps) => { return (
@@ -21,23 +23,23 @@ export const SpaceChromeWidget = ({

VibeRoom

- - {isImmersionMode ? ( - <> - - 허브로 돌아가기 - - ) : ( - '허브로 돌아가기' - )} - + {isImmersionMode ? ( + + ) : ( + + 허브로 돌아가기 + + )} {!isImmersionMode ? ( diff --git a/src/widgets/space-shell/ui/SpaceSkeletonWidget.tsx b/src/widgets/space-shell/ui/SpaceSkeletonWidget.tsx index ea6da5f..cafb13e 100644 --- a/src/widgets/space-shell/ui/SpaceSkeletonWidget.tsx +++ b/src/widgets/space-shell/ui/SpaceSkeletonWidget.tsx @@ -19,7 +19,7 @@ export const SpaceSkeletonWidget = () => { const soundFromQuery = searchParams.get('sound'); const room = useMemo(() => getRoomById(roomId) ?? ROOM_THEMES[0], [roomId]); - const { isImmersionMode, toggleImmersionMode } = useImmersionMode(); + const { isImmersionMode, toggleImmersionMode, exitImmersionMode } = useImmersionMode(); const initialSoundPresetId = SOUND_PRESETS.find((preset) => preset.id === soundFromQuery)?.id ?? SOUND_PRESETS[0].id; @@ -66,6 +66,7 @@ export const SpaceSkeletonWidget = () => { roomName={room.name} vibeLabel={room.vibeLabel} isImmersionMode={isImmersionMode} + onExitImmersionMode={exitImmersionMode} />