style(control-center): Packs/Profiles를 프리미엄 톤으로 최소 노출

맥락:
- Control Center에서 Pro 기능이 설정 패널처럼 과밀하게 보이면 Focus 흐름이 끊깁니다.

변경사항:
- Quick Controls의 추천 조합 영역에서 클릭 버튼을 제거하고 정보 1줄만 남겼습니다.
- 하단에 Scene Packs/Sound Packs/Profiles 요약 카드를 추가해 확장 기능을 조용한 카드 형태로 수납했습니다.
- 기본 Scene/Time/Sound는 선택 중심으로 유지하고 Packs 잠금 클릭만 별도 동선으로 연결했습니다.

검증:
- npx tsc --noEmit

세션-상태: Control Center가 Scene/Time 중심 + 조용한 Packs 확장 구조로 정리됨
세션-다음: 잠금 카드 클릭 기반 Paywall 시트를 의도 기반 메시지로 간결화
세션-리스크: Plan Pill normal 클릭 시 paywall 오픈 동선은 다음 커밋에서 제거 예정
This commit is contained in:
2026-03-05 17:24:33 +09:00
parent 3c6c5e6aa0
commit 1c7c6d396f
3 changed files with 1 additions and 38 deletions

View File

@@ -27,7 +27,6 @@ interface ControlCenterSheetWidgetProps {
onSelectSound: (presetId: string) => void; onSelectSound: (presetId: string) => void;
onSelectProFeature: (featureId: string) => void; onSelectProFeature: (featureId: string) => void;
onLockedClick: (source: string) => void; onLockedClick: (source: string) => void;
onResetToRecommended: () => void;
} }
const SectionTitle = ({ title, description }: { title: string; description: string }) => { const SectionTitle = ({ title, description }: { title: string; description: string }) => {
@@ -55,7 +54,6 @@ export const ControlCenterSheetWidget = ({
onSelectSound, onSelectSound,
onSelectProFeature, onSelectProFeature,
onLockedClick, onLockedClick,
onResetToRecommended,
}: ControlCenterSheetWidgetProps) => { }: ControlCenterSheetWidgetProps) => {
const reducedMotion = useReducedMotion(); const reducedMotion = useReducedMotion();
const isPro = plan === 'pro'; const isPro = plan === 'pro';
@@ -171,16 +169,7 @@ export const ControlCenterSheetWidget = ({
<div className="space-y-1.5 rounded-xl border border-white/12 bg-white/[0.03] px-3 py-2.5"> <div className="space-y-1.5 rounded-xl border border-white/12 bg-white/[0.03] px-3 py-2.5">
<p className="text-[11px] text-white/58">: {sceneRecommendedSoundLabel} · {sceneRecommendedTimerLabel}</p> <p className="text-[11px] text-white/58">: {sceneRecommendedSoundLabel} · {sceneRecommendedTimerLabel}</p>
<button <p className="text-[10px] text-white/48"> .</p>
type="button"
onClick={onResetToRecommended}
className={cn(
'text-left text-[11px] text-white/72 transition-colors hover:text-white/90',
colorMotionClass,
)}
>
</button>
</div> </div>
<section className="space-y-2 rounded-2xl border border-white/12 bg-black/18 p-3 backdrop-blur-md"> <section className="space-y-2 rounded-2xl border border-white/12 bg-black/18 p-3 backdrop-blur-md">

View File

@@ -41,7 +41,6 @@ interface SpaceToolsDockWidgetProps {
onRestoreThought: (thought: RecentThought) => void; onRestoreThought: (thought: RecentThought) => void;
onRestoreThoughts: (thoughts: RecentThought[]) => void; onRestoreThoughts: (thoughts: RecentThought[]) => void;
onClearInbox: () => RecentThought[]; onClearInbox: () => RecentThought[];
onResetToSceneRecommended: () => void;
onStatusMessage: (payload: HudStatusLinePayload) => void; onStatusMessage: (payload: HudStatusLinePayload) => void;
onExitRequested: () => void; onExitRequested: () => void;
} }
@@ -70,7 +69,6 @@ export const SpaceToolsDockWidget = ({
onRestoreThought, onRestoreThought,
onRestoreThoughts, onRestoreThoughts,
onClearInbox, onClearInbox,
onResetToSceneRecommended,
onStatusMessage, onStatusMessage,
onExitRequested, onExitRequested,
}: SpaceToolsDockWidgetProps) => { }: SpaceToolsDockWidgetProps) => {
@@ -515,7 +513,6 @@ export const SpaceToolsDockWidget = ({
onSelectSound={onQuickSoundSelect} onSelectSound={onQuickSoundSelect}
onSelectProFeature={handleSelectProFeature} onSelectProFeature={handleSelectProFeature}
onLockedClick={handleLockedClick} onLockedClick={handleLockedClick}
onResetToRecommended={onResetToSceneRecommended}
/> />
) : null} ) : null}

View File

@@ -265,28 +265,6 @@ export const SpaceWorkspaceWidget = () => {
}); });
}; };
const handleResetToSceneRecommended = () => {
const room = getRoomById(selectedRoomId);
if (!room) {
return;
}
setSelectionOverride({ sound: false, timer: false });
const recommendedTimerLabel = resolveTimerLabelFromPresetId(room.recommendedTimerPresetId);
if (recommendedTimerLabel) {
setSelectedTimerLabel(recommendedTimerLabel);
}
if (SOUND_PRESETS.some((preset) => preset.id === room.recommendedSoundPresetId)) {
setSelectedPresetId(room.recommendedSoundPresetId);
}
pushStatusLine({ message: '추천으로 되돌림(더미)' });
};
const handleGoalChipSelect = (chip: GoalChip) => { const handleGoalChipSelect = (chip: GoalChip) => {
setSelectedGoalId(chip.id); setSelectedGoalId(chip.id);
setGoalInput(chip.label); setGoalInput(chip.label);
@@ -407,7 +385,6 @@ export const SpaceWorkspaceWidget = () => {
onQuickSoundSelect={(presetId) => handleSelectSound(presetId, true)} onQuickSoundSelect={(presetId) => handleSelectSound(presetId, true)}
sceneRecommendedSoundLabel={selectedRoom.recommendedSound} sceneRecommendedSoundLabel={selectedRoom.recommendedSound}
sceneRecommendedTimerLabel={resolveTimerLabelFromPresetId(selectedRoom.recommendedTimerPresetId) ?? selectedTimerLabel} sceneRecommendedTimerLabel={resolveTimerLabelFromPresetId(selectedRoom.recommendedTimerPresetId) ?? selectedTimerLabel}
onResetToSceneRecommended={handleResetToSceneRecommended}
soundVolume={masterVolume} soundVolume={masterVolume}
onSetSoundVolume={setMasterVolume} onSetSoundVolume={setMasterVolume}
isSoundMuted={isMuted} isSoundMuted={isMuted}