Current Room
-{room.name}
-현재 {room.activeMembers}명 함께 집중 중
-diff --git a/docs/90_current_state.md b/docs/90_current_state.md index 299deab..68b5b20 100644 --- a/docs/90_current_state.md +++ b/docs/90_current_state.md @@ -19,6 +19,15 @@ Last Updated: 2026-02-27 - `/app` Start Ritual에서 절차감을 높이던 `건너뛰기` 제거 - `/app`에서 `다시 시작(30초)` 제거 - `/space` HUD에 `features/restart-30s` 기반 `↻ 다시 시작 + 30초 배지` 추가 +- `/space` 하단 사운드 프리셋 바 제거, 오른쪽 `🎧 Sound` 시트로 이동 +- `features/sound-preset` + `widgets/sound-sheet` 추가 +- `features/immersion-mode` 추가, Quick 시트에서 몰입 모드 토글 연결 +- 몰입 모드 ON 시 `/space` 크롬 정리: + - 상단 `Current Room` 블록 숨김 + - 우상단 허브 버튼 소형 아이콘화 + - 오른쪽 아이콘 레일 기본 미니화(hover/click 시 확장) + - HUD 대비/불투명도 완화 + - 비네팅/그레인 강화 - `/app` 룸 카드의 인원수 기반 정보 제거 - `entities/room`에 분위기/추천 필드 추가: - `recommendedSound` @@ -28,14 +37,14 @@ Last Updated: 2026-02-27 ## NEXT -1. `/space` 상단 카피의 인원수 문구(`현재 n명`)를 분위기형 문구로 전환 -2. `RoomSheetWidget`/도크 패널의 인원수 기반 UI를 큐레이션형 정보로 재정의할지 정책 확정 +1. `RoomSheetWidget`/도크 패널의 인원수 기반 UI를 큐레이션형 정보로 재정의 +2. 몰입 모드에서 터치 환경(hover 없음) 레일 노출 UX를 보완할지 정책 확정 ## RISKS - `npm run build`는 네트워크 제한 시 Google Font fetch 실패 가능 -- 현재 워크트리는 다수 파일이 수정/추가된 상태라 커밋 단위 분리가 중요 -- 일부 문구가 여전히 실시간 지표처럼 읽힐 수 있으므로 카피 가이드 지속 점검 필요 +- 터치 기기에서 레일 미니 상태가 발견성 낮을 수 있어 추가 힌트가 필요할 수 있음 +- 일부 시트(예: Room)는 아직 인원수 중심 문구가 남아 있어 톤 불일치 가능성 존재 ## CHANGED FILES @@ -56,10 +65,26 @@ Last Updated: 2026-02-27 - `src/features/restart-30s/index.ts` - `src/features/restart-30s/model/useRestart30s.ts` - `src/features/restart-30s/ui/Restart30sAction.tsx` +- `src/features/immersion-mode/index.ts` +- `src/features/immersion-mode/model/useImmersionMode.ts` +- `src/features/immersion-mode/ui/ImmersionModeToggle.tsx` +- `src/features/sound-preset/index.ts` +- `src/features/sound-preset/model/useSoundPresetSelection.ts` +- `src/features/sound-preset/ui/SoundPresetControls.tsx` +- `src/shared/ui/Toggle.tsx` +- `src/widgets/sound-sheet/index.ts` +- `src/widgets/sound-sheet/ui/SoundSheetWidget.tsx` +- `src/widgets/space-chrome/index.ts` +- `src/widgets/space-chrome/ui/SpaceChromeWidget.tsx` +- `src/widgets/quick-sheet/ui/QuickSheetWidget.tsx` +- `src/widgets/space-shell/ui/SpaceSkeletonWidget.tsx` +- `src/widgets/space-tools-dock/model/useSpaceToolsDock.ts` +- `src/widgets/space-tools-dock/ui/SpaceToolsDockWidget.tsx` - `src/widgets/space-timer-hud/ui/SpaceTimerHudWidget.tsx` ## QUICK VERIFY 1. `/app`: 건너뛰기/다시 시작 노출 없음 2. `/app`: 룸 카드에 사람 수 문구 없음, 추천 정보 노출 -3. `/space`: HUD 근처 `↻ 다시 시작` 클릭 시 토스트 노출 +3. `/space`: 하단 사운드 바 없음, 오른쪽 `🎧 Sound` 시트에서 프리셋 선택 가능 +4. `/space`: 몰입 모드 ON 시 상단 룸 블록 숨김 + 레일 미니화 + HUD 저대비 적용 diff --git a/docs/session_brief.md b/docs/session_brief.md index fa7c927..36ee936 100644 --- a/docs/session_brief.md +++ b/docs/session_brief.md @@ -14,19 +14,21 @@ Last Updated: 2026-02-27 ## 현재 우선순위 -1. `/space` 상단의 인원 수 카피를 분위기형 카피로 전환 -2. `RoomSheetWidget`/도크 패널의 인원 수 UI를 큐레이션형으로 재정의할지 결정 +1. `RoomSheetWidget`/도크 패널의 인원 수 UI를 큐레이션형으로 전환 +2. 몰입 모드에서 터치 환경 레일 발견성(미니 핸들 UX) 보완 여부 결정 ## 최근 세션 상태 - 세션 복구용 문서/템플릿/스크립트가 준비되어 있다. - `workFlow.md`는 토큰 절약 모드를 사용한다. +- `/space` 하단 사운드 바를 제거하고 오른쪽 `🎧 Sound` 시트로 이동했다. +- 몰입 모드 ON 시 상단 룸 블록 숨김, 레일 미니화, HUD 저대비, 비네팅 강화가 적용된다. - 이후 작업은 `docs/work.md`를 기준으로 실행한다. ## 리스크 - 네트워크 제한 환경에서는 `npm run build` 시 Google Fonts fetch 실패 가능 -- 작업 범위가 넓을 때 커밋 단위가 커질 수 있으므로 주제 분리 점검 필요 +- 터치 환경에서 레일 미니 상태가 발견성 낮을 수 있어 UX 보완이 필요할 수 있음 ## 상세 원문 위치 diff --git a/src/features/immersion-mode/index.ts b/src/features/immersion-mode/index.ts new file mode 100644 index 0000000..b9226eb --- /dev/null +++ b/src/features/immersion-mode/index.ts @@ -0,0 +1,2 @@ +export * from './model/useImmersionMode'; +export * from './ui/ImmersionModeToggle'; diff --git a/src/features/immersion-mode/model/useImmersionMode.ts b/src/features/immersion-mode/model/useImmersionMode.ts new file mode 100644 index 0000000..8d02811 --- /dev/null +++ b/src/features/immersion-mode/model/useImmersionMode.ts @@ -0,0 +1,16 @@ +'use client'; + +import { useState } from 'react'; + +export const useImmersionMode = () => { + const [isImmersionMode, setImmersionMode] = useState(false); + + const toggleImmersionMode = () => { + setImmersionMode((current) => !current); + }; + + return { + isImmersionMode, + toggleImmersionMode, + }; +}; diff --git a/src/features/immersion-mode/ui/ImmersionModeToggle.tsx b/src/features/immersion-mode/ui/ImmersionModeToggle.tsx new file mode 100644 index 0000000..1e285ad --- /dev/null +++ b/src/features/immersion-mode/ui/ImmersionModeToggle.tsx @@ -0,0 +1,25 @@ +import { Toggle } from '@/shared/ui'; + +interface ImmersionModeToggleProps { + enabled: boolean; + onToggle: () => void; +} + +export const ImmersionModeToggle = ({ + enabled, + onToggle, +}: ImmersionModeToggleProps) => { + return ( +
몰입 모드
+배경 우선으로 화면 요소를 최소화합니다.
+Preset
+뮤트
+
빠른 옵션 UI 목업입니다. 실제 동작은 연결하지 않았습니다.
diff --git a/src/widgets/sound-sheet/index.ts b/src/widgets/sound-sheet/index.ts
new file mode 100644
index 0000000..88a6a76
--- /dev/null
+++ b/src/widgets/sound-sheet/index.ts
@@ -0,0 +1 @@
+export * from './ui/SoundSheetWidget';
diff --git a/src/widgets/sound-sheet/ui/SoundSheetWidget.tsx b/src/widgets/sound-sheet/ui/SoundSheetWidget.tsx
new file mode 100644
index 0000000..6212f44
--- /dev/null
+++ b/src/widgets/sound-sheet/ui/SoundSheetWidget.tsx
@@ -0,0 +1,70 @@
+import {
+ SoundPresetControls,
+ type SoundTrackKey,
+} from '@/features/sound-preset';
+
+interface SoundSheetWidgetProps {
+ onClose: () => void;
+ selectedPresetId: string;
+ onSelectPreset: (presetId: string) => void;
+ isMixerOpen: boolean;
+ onToggleMixer: () => void;
+ isMuted: boolean;
+ onMuteChange: (next: boolean) => void;
+ masterVolume: number;
+ onMasterVolumeChange: (next: number) => void;
+ trackKeys: readonly SoundTrackKey[];
+ trackLevels: Record VibeRoom Current Room {roomName} 지금 분위기 · {vibeLabel} VibeRoom Current Room {room.name} 현재 {room.activeMembers}명 함께 집중 중 목표: {goal}
+ 목표: {goal}
+