feat(space): 사운드 시트와 몰입 모드 크롬 정리 적용

맥락:

- /space 하단 사운드 바를 제거하고 도구를 우측 도크에 수납해 배경 몰입을 강화하며, 몰입 모드 ON 체감을 높이기 위해

변경사항:

- 하단 사운드 프리셋 바를 제거하고 도크에 🎧 Sound 패널을 추가

- features/sound-preset + widgets/sound-sheet를 추가해 프리셋 선택/믹서 UI(더미) 구성

- features/immersion-mode + shared/ui/Toggle을 추가하고 Quick 시트 토글과 연결

- 몰입 모드 ON 시 상단 Current Room 숨김, 허브 버튼 소형화, 레일 미니화, HUD 저대비, 비네팅/그레인 강화

- widgets/space-chrome를 신설해 /space 상단 크롬 렌더링을 분리

- docs/90_current_state.md, docs/session_brief.md 최신 상태로 갱신

검증:

- npx tsc --noEmit

세션-상태: /space는 사운드 시트 기반 도크 구조와 몰입 모드 UI를 제공함

세션-다음: RoomSheetWidget 인원수 기반 정보를 큐레이션 표현으로 전환

세션-리스크: 터치 환경에서 미니 레일 발견성이 낮을 수 있어 보조 힌트가 필요할 수 있음
This commit is contained in:
2026-02-27 14:14:12 +09:00
parent f0efd74af3
commit ce1664f472
19 changed files with 640 additions and 114 deletions

39
src/shared/ui/Toggle.tsx Normal file
View File

@@ -0,0 +1,39 @@
import { cn } from '@/shared/lib/cn';
interface ToggleProps {
checked: boolean;
onChange: (checked: boolean) => void;
ariaLabel: string;
className?: string;
}
export const Toggle = ({
checked,
onChange,
ariaLabel,
className,
}: ToggleProps) => {
return (
<button
type="button"
role="switch"
aria-checked={checked}
aria-label={ariaLabel}
onClick={() => onChange(!checked)}
className={cn(
'inline-flex w-11 items-center rounded-full border px-1 py-1 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-200/80',
checked
? 'border-sky-200/70 bg-sky-300/24'
: 'border-white/28 bg-white/9',
className,
)}
>
<span
className={cn(
'h-4 w-4 rounded-full bg-white transition-transform duration-200 motion-reduce:transition-none',
checked ? 'translate-x-5' : 'translate-x-0',
)}
/>
</button>
);
};

View File

@@ -5,3 +5,4 @@ export * from './GlassCard';
export * from './Modal';
export * from './Tabs';
export * from './Toast';
export * from './Toggle';