맥락: - 허브를 경유하는 흐름 대신 /space 한 화면에서 설정과 몰입을 이어서 처리할 필요가 있었습니다. - View 로직 분리와 파일 분할 기준을 지키면서 도크/시트 패턴을 통합해야 했습니다. 변경사항: - /space를 Setup(기본)과 Focus(시작 후) 2상태로 운영하는 space-workspace 위젯을 추가했습니다. - Setup Drawer를 추가해 Space 선택, Goal(필수), Sound(선택) 섹션과 하단 고정 CTA를 구성했습니다. - Goal 입력이 비어있으면 시작하기 버튼이 비활성화되도록 UI 검증을 반영했습니다. - Focus 상태에서 하단 HUD만 유지하고 우측 Tools Dock(🎧/📝/📨/📊/⚙) + 우측 시트 패턴을 적용했습니다. - Notes(쓰기)와 Inbox(읽기) 패널을 분리하고 더미 토스트 동작을 연결했습니다. - FSD 분리를 위해 features(space-select/session-goal/inbox)와 widgets(space-workspace/space-setup-drawer/space-focus-hud/space-sheet-shell)를 추가했습니다. - 기존 space-shell은 신규 워크스페이스로 연결되는 얇은 래퍼로 정리했습니다. 검증: - npx tsc --noEmit - npm run build 세션-상태: /space 단일 워크스페이스에서 Setup→Focus 전환이 동작합니다. 세션-다음: 진입 경로를 /space로 통일하고 레거시 /app 라우트를 정리합니다. 세션-리스크: useSearchParams 기반 초기값은 클라이언트 최초 렌더 기준으로만 반영됩니다.
26 lines
831 B
TypeScript
26 lines
831 B
TypeScript
import type { RecentThought } from '@/entities/session';
|
|
import { InboxList } from '@/features/inbox';
|
|
|
|
interface InboxToolPanelProps {
|
|
thoughts: RecentThought[];
|
|
onClear: () => void;
|
|
}
|
|
|
|
export const InboxToolPanel = ({ thoughts, onClear }: InboxToolPanelProps) => {
|
|
return (
|
|
<div className="space-y-3.5">
|
|
<div className="flex items-center justify-between gap-2">
|
|
<p className="text-xs text-white/58">나중에 모아보는 읽기 전용 인박스</p>
|
|
<button
|
|
type="button"
|
|
onClick={onClear}
|
|
className="rounded-full border border-white/20 bg-white/8 px-2.5 py-1 text-[11px] text-white/74 transition-colors hover:bg-white/14 hover:text-white"
|
|
>
|
|
모두 비우기
|
|
</button>
|
|
</div>
|
|
<InboxList thoughts={thoughts} />
|
|
</div>
|
|
);
|
|
};
|