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:
@@ -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">
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
Reference in New Issue
Block a user