Skip to content
Open
Show file tree
Hide file tree
Changes from 38 commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
4b25556
feat: 도면 선택 페이지 인터페이스 구현
jstar000 Mar 15, 2026
83a0d15
feat: FloorPlan 스텝 타입, 더미 데이터, 스토어, 훅 구현
jstar000 Mar 18, 2026
ee3ca1a
fix: 여러 시점 로직 임시 적용
jstar000 Mar 18, 2026
7b05776
fix: PageLayout에 v2 navbar 반영
jstar000 Mar 18, 2026
8c792c6
fix: RoomTypeCard 반응형 적용
jstar000 Mar 18, 2026
18cbe6b
fix: 바텀시트 헤더 css 수정
jstar000 Mar 18, 2026
fc2be90
fix: height 상속 체인 추가
jstar000 Mar 18, 2026
80a9999
feat: 도면선택 바텀시트 구현
jstar000 Mar 18, 2026
eccc3b0
feat: 도면선택 그리드 구현
jstar000 Mar 18, 2026
b42349b
fix: 바텀시트 컴포넌트 피그마 디자인 반영
jstar000 Mar 18, 2026
2c46c12
feat: RecentFloorPlanSheet 구현
jstar000 Mar 18, 2026
37b5040
feat: FloorPlanSelectStep 구현
jstar000 Mar 18, 2026
3ae9f83
fix: 도면 선택 훅 수정
jstar000 Mar 18, 2026
eac8f48
fix: PreviewCard minWidth 수정
jstar000 Mar 18, 2026
a5f92b8
feat: 필터칩 다중선택 로직 추가
jstar000 Mar 18, 2026
05ff8ae
feat: 필터칩 다중선택 시 필터칩 텍스트 변경
jstar000 Mar 18, 2026
9901293
fix: 필터칩 선택 훅 수정
jstar000 Mar 18, 2026
f234880
feat: 필터칩 가로스크롤 적용
jstar000 Mar 18, 2026
4c49fbf
feat: 도면 view 개수에 따라 PreviewCard 버튼 분기처리
jstar000 Mar 18, 2026
4d2527e
chore: 주석 추가
jstar000 Mar 18, 2026
0d9ff21
fix: floorPlan 타입 수정
jstar000 Mar 19, 2026
f5c568e
feat: ActionButton 공통 스타일 추가 및 테스트 파일 정리
jstar000 Mar 19, 2026
7c933b1
Merge branch 'develop' into feat/space-select-flow/#485
jstar000 Mar 24, 2026
3a75799
feat: ActionButton에 fullWidth props 추가
jstar000 Mar 24, 2026
28d4e2c
fix: FilterSheet ActionButton 공컴 적용
jstar000 Mar 24, 2026
9195853
fix: FloorPlanSheet ActionButton 공컴 적용
jstar000 Mar 24, 2026
46ad1a1
fix: RecentFloorPlanSheet 삭제 (FloorPlanSheet로 통일)
jstar000 Mar 24, 2026
4fcd5fe
feat: 최근 생성 공간 sheet 렌더링 시 토스트 알림 추가
jstar000 Mar 24, 2026
41706fb
feat: 임시 ActionButton 삭제
jstar000 Mar 24, 2026
8b0e8d4
fix: FloorPlanSelectGrid, BottomSheet, TitleNavBar에 v2 아이콘 적용
jstar000 Mar 24, 2026
4b3847b
fix: ActionButton 불필요한 span 제거
jstar000 Mar 24, 2026
283d061
fix: 아이콘 수정
jstar000 Mar 24, 2026
21ff65c
fix: 바텀시트 Drawer.Overlay -> 커스텀 div로 변경(데스크탑 환경 고려)
jstar000 Mar 24, 2026
3364eea
fix: Chip 컴포넌트 수정
jstar000 Mar 24, 2026
10e6961
fix: 불필요한 css 제거
jstar000 Mar 24, 2026
36128e2
fix: RoomTypeSection의 RoomTypeCard 너비 고정
jstar000 Mar 24, 2026
6c2fc84
feat: 필터 결과가 없을 때 UI 추가
jstar000 Mar 24, 2026
9fe788f
refactor: 도면 Swiper 적용
jstar000 Mar 24, 2026
da4acec
refactor: FilterCategory id 타입 좁히기
jstar000 Mar 25, 2026
992bfd4
refactor: useFloorPlanSelect useMemo, useCallback 제거 및 주석 추가
jstar000 Mar 25, 2026
57ba60f
refactor: useFloorPlanSelect 훅 수정
jstar000 Mar 25, 2026
0fe3e0e
refactor: 도면 선택 상태 초기값 상수로 추출 및 재사용
jstar000 Mar 25, 2026
0d1c79e
chore: 테스트 페이지 추가
jstar000 Mar 25, 2026
32f86ae
fix: 최근 도면 바텀시트 좌우반전 하드코딩 제거
jstar000 Mar 25, 2026
e53097c
chore: css 수정
jstar000 Mar 25, 2026
ef98f2b
fix: 미사용 코드 제거
jstar000 Mar 25, 2026
31b9081
fix: 미사용 import 제거
jstar000 Mar 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,8 @@ export const cardList = style({
padding: `0 ${unitVars.unit.gapPadding['500']}`,
width: 'max-content',
});

export const cardItem = style({
flexShrink: 0,
width: '16rem',
});
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,21 @@ const RoomTypeSection = () => {
<div className={styles.cardScroll}>
<div className={styles.cardList}>
{ROOM_TYPE_MOCK.map((room) => (
<RoomTypeCard
key={room.id}
type="default"
size="s"
label={room.label}
imageSrc={room.imageSrc}
onClick={() => {}}
/>
// cardList가 가로 스크롤 가능한 컴포넌트(width: max-content + flex-wrap:nowrap) + RoomTypeCard는 반응형 대응 가능(width: 100%)
// => cardItem으로 명시적으로 너비를 설정해야 RoomTypeCard의 너비가 무한히 커지지 않음
<div key={room.id} className={styles.cardItem}>
<RoomTypeCard
type="default"
size="s"
label={room.label}
imageSrc={room.imageSrc}
onClick={() => {}}
/>
</div>
))}
<RoomTypeCard type="more" size="s" onClick={() => {}} />
<div className={styles.cardItem}>
<RoomTypeCard type="more" size="s" onClick={() => {}} />
</div>
</div>
</div>
</section>
Expand Down
2 changes: 2 additions & 0 deletions src/pages/imageSetup/stores/useFunnelStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import { create } from 'zustand';

import type { CompletedHouseInfo } from '../types/funnel/houseInfo';

// TODO: FunnelStore 수정
// moodBoard, activityInfo 스텝은 이미지 생성에 필요할 수도 있고 아닐 수도 있음
Comment on lines +5 to +6
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

불확실한 요구사항 TODO는 스토어 계약으로 명시해 주세요.

Line 5~6의 TODO처럼 필수 여부가 미정인 상태를 주석으로만 남기면,
후속 단계에서 분기 해석이 달라질 수 있습니다. moodBoard/activityInfo
필수 여부를 타입(예: 단계 enum/플래그)으로 명시하거나 이슈 번호를 연결해
결정 시점을 고정하는 쪽이 안전합니다. 원하시면 현재 플로우 기준으로
타입 계약안까지 바로 제안드릴게요.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/imageSetup/stores/useFunnelStore.ts` around lines 5 - 6, 현재 주석
TODO는 요구사항 불확실성을 남겨두므로 useFunnelStore의 계약을 명시하세요: 제거할 주석 대신에 FunnelStore(또는
useFunnelStore) 내부에 단계 타입(예: enum Steps {MoodBoard, ActivityInfo, ...}) 또는 각 스텝에
대한 필수 여부를 담은 플래그(예: requiredSteps: Record<Steps, boolean>)를 추가하고, moodBoard와
activityInfo를 해당 타입/플래그로 표현해 분기 로직이 타입에 의해 결정되도록 변경하세요; 결정 보류가 필요하면 관련 이슈 번호를
참조하는 필드(issueId: string) 또는 주석을 남겨 결정 시점을 고정하세요.

interface FunnelStore {
// 각 스텝 데이터(각 스텝 별 요구되는 데이터만 저장)
houseInfo: CompletedHouseInfo | null;
Expand Down
241 changes: 241 additions & 0 deletions src/pages/imageSetup/v2/constants/floorPlanDummy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
import type {
FilterCategory,
FloorPlanData,
FloorPlanDetailView,
RecentFloorPlanData,
} from '../types/floorPlan';

export const DUMMY_FILTER_CATEGORIES: FilterCategory[] = [
{
id: 'residenceType',
label: '주거 형태',
options: [
{ id: 'ALL', label: '전체' },
{ id: 'OFFICETEL', label: '오피스텔' },
{ id: 'VILLA', label: '빌라/다세대' },
{ id: 'APARTMENT', label: '아파트' },
{ id: 'ETC', label: '그 외' },
],
},
{
id: 'layoutType',
label: '구조',
options: [
{ id: 'ALL', label: '전체' },
{ id: 'OPEN_ONE_ROOM', label: '오픈형 원룸' },
{ id: 'SEPARATE_ONE_ROOM', label: '분리형 원룸' },
{ id: 'DUPLEX', label: '복층형' },
{ id: 'TWO_ROOM', label: '투룸' },
{ id: 'THREE_ROOM_PLUS', label: '쓰리룸 이상' },
{ id: 'ETC', label: '그 외' },
],
},
{
id: 'areaSize',
label: '평형',
options: [
{ id: 'ALL', label: '전체' },
{ id: 'UNDER_4', label: '4평 이하' },
{ id: 'FROM_5_TO_10', label: '5-10평' },
{ id: 'TENS', label: '10평대' },
{ id: 'TWENTIES', label: '20평대' },
{ id: 'OVER_30', label: '30평 이상' },
],
},
];

export const DUMMY_FLOOR_PLANS: FloorPlanData[] = [
{
id: 1,
name: '일자형 원룸',
imageUrl: 'https://placehold.co/164x164?text=1',
isLatest: true,
residenceType: 'OFFICETEL',
layoutType: 'OPEN_ONE_ROOM',
areaSize: 'FROM_5_TO_10',
},
{
id: 2,
name: '분리형 원룸',
imageUrl: 'https://placehold.co/164x164?text=2',
isLatest: false,
residenceType: 'VILLA',
layoutType: 'SEPARATE_ONE_ROOM',
areaSize: 'TENS',
},
{
id: 3,
name: 'ㄱ자형 투룸',
imageUrl: 'https://placehold.co/164x164?text=3',
isLatest: false,
residenceType: 'APARTMENT',
layoutType: 'TWO_ROOM',
areaSize: 'TENS',
},
{
id: 4,
name: '복층형 쓰리룸',
imageUrl: 'https://placehold.co/164x164?text=4',
isLatest: false,
residenceType: 'OFFICETEL',
layoutType: 'THREE_ROOM_PLUS',
areaSize: 'TWENTIES',
},
{
id: 5,
name: '오픈형 원룸',
imageUrl: 'https://placehold.co/164x164?text=5',
isLatest: false,
residenceType: 'OFFICETEL',
layoutType: 'OPEN_ONE_ROOM',
areaSize: 'FROM_5_TO_10',
},
{
id: 6,
name: '소형 원룸',
imageUrl: 'https://placehold.co/164x164?text=6',
isLatest: false,
residenceType: 'ETC',
layoutType: 'OPEN_ONE_ROOM',
areaSize: 'UNDER_4',
},
{
id: 7,
name: '복층형 투룸',
imageUrl: 'https://placehold.co/164x164?text=7',
isLatest: false,
residenceType: 'VILLA',
layoutType: 'DUPLEX',
areaSize: 'TENS',
},
{
id: 8,
name: '대형 아파트',
imageUrl: 'https://placehold.co/164x164?text=8',
isLatest: false,
residenceType: 'APARTMENT',
layoutType: 'THREE_ROOM_PLUS',
areaSize: 'OVER_30',
},
];

// 도면 상세 뷰 더미 (카드 클릭 시 반환, 추후 API 교체)
// key: floorPlanId → value: FloorPlanDetailView[]
export const DUMMY_FLOOR_PLAN_DETAILS: Record<number, FloorPlanDetailView[]> = {
1: [
{
id: 1,
name: '일자형 원룸',
imageUrl: 'https://placehold.co/343x343?text=1-A',
equilibrium: '5-10평',
view: '정면 뷰',
},
{
id: 1,
name: '일자형 원룸',
imageUrl: 'https://placehold.co/343x343?text=1-B',
equilibrium: '5-10평',
view: '창가 뷰',
},
],
2: [
{
id: 2,
name: '분리형 원룸',
imageUrl: 'https://placehold.co/343x343?text=2-A',
equilibrium: '10평대',
view: '정면 뷰',
},
],
3: [
{
id: 3,
name: 'ㄱ자형 투룸',
imageUrl: 'https://placehold.co/343x343?text=3-A',
equilibrium: '10평대',
view: '정면 뷰',
},
{
id: 3,
name: 'ㄱ자형 투룸',
imageUrl: 'https://placehold.co/343x343?text=3-B',
equilibrium: '10평대',
view: '창가 뷰',
},
{
id: 3,
name: 'ㄱ자형 투룸',
imageUrl: 'https://placehold.co/343x343?text=3-C',
equilibrium: '10평대',
view: '주방 뷰',
},
],
4: [
{
id: 4,
name: '복층형 쓰리룸',
imageUrl: 'https://placehold.co/343x343?text=4-A',
equilibrium: '20평대',
view: '정면 뷰',
},
],
5: [
{
id: 5,
name: '오픈형 원룸',
imageUrl: 'https://placehold.co/343x343?text=5-A',
equilibrium: '5-10평',
view: '정면 뷰',
},
{
id: 5,
name: '오픈형 원룸',
imageUrl: 'https://placehold.co/343x343?text=5-B',
equilibrium: '5-10평',
view: '창가 뷰',
},
],
6: [
{
id: 6,
name: '소형 원룸',
imageUrl: 'https://placehold.co/343x343?text=6-A',
equilibrium: '4평 이하',
view: '정면 뷰',
},
],
7: [
{
id: 7,
name: '복층형 투룸',
imageUrl: 'https://placehold.co/343x343?text=7-A',
equilibrium: '10평대',
view: '정면 뷰',
},
],
8: [
{
id: 8,
name: '대형 아파트',
imageUrl: 'https://placehold.co/343x343?text=8-A',
equilibrium: '30평 이상',
view: '정면 뷰',
},
{
id: 8,
name: '대형 아파트',
imageUrl: 'https://placehold.co/343x343?text=8-B',
equilibrium: '30평 이상',
view: '창가 뷰',
},
],
};

// 최근 생성 도면 (별도 API 응답)
export const DUMMY_RECENT_FLOOR_PLAN: RecentFloorPlanData | null = {
id: 1,
name: '일자형 원룸',
imageUrl: 'https://placehold.co/343x343?text=Recent',
equilibrium: '5-10평',
view: '정면 뷰',
};
Loading
Loading