From e1904da9472ce53861c03b16002e6c9704f9ed3f Mon Sep 17 00:00:00 2001 From: Kangdy Date: Sat, 24 Jan 2026 23:02:13 +0900 Subject: [PATCH 1/9] =?UTF-8?q?feat:=20=ED=88=AC=ED=91=9C=20=ED=98=84?= =?UTF-8?q?=ED=99=A9=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=8C=80=EB=9E=B5?= =?UTF-8?q?=EC=A0=81=EC=9C=BC=EB=A1=9C=20UI=20=EA=B5=AC=EC=B6=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/join/page.tsx | 4 ++ app/meeting/page.tsx | 150 ++++++++++++++++++++++++++++++++++++++++++ components/header.tsx | 2 +- 3 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 app/meeting/page.tsx diff --git a/app/join/page.tsx b/app/join/page.tsx index 8f17e01..8316fca 100644 --- a/app/join/page.tsx +++ b/app/join/page.tsx @@ -1,11 +1,14 @@ 'use client'; +import Link from 'next/link'; +import { useRouter } from 'next/navigation'; import { useState } from 'react'; export default function JoinMeetingPage() { const [name, setName] = useState(''); const [password, setPassword] = useState(''); const [isRemembered, setIsRemembered] = useState(true); + const router = useRouter(); // 이름/비번 유효성 검사 (입력값이 있을 때만 버튼 활성화) const isFormValid = name.length > 0 && password.length === 4; @@ -15,6 +18,7 @@ export default function JoinMeetingPage() { if (!isFormValid) return; console.log('참여 요청:', { name, password, isRemembered }); + router.push('/meeting'); }; return ( diff --git a/app/meeting/page.tsx b/app/meeting/page.tsx new file mode 100644 index 0000000..a70f016 --- /dev/null +++ b/app/meeting/page.tsx @@ -0,0 +1,150 @@ +'use client'; + +import { useState } from 'react'; +import { Search, Share2, MapPin } from 'lucide-react'; + +const MOCK_PARTICIPANTS = [ + { id: 1, name: '안', station: '홍대입구역', status: 'pending', color: 'bg-blue-500' }, + { id: 2, name: '손', station: '성수역', status: 'pending', color: 'bg-orange-400' }, + { id: 3, name: '김', station: '강남역', status: 'done', color: 'bg-red-500' }, + { id: 4, name: '이', station: '건대입구역', status: 'done', color: 'bg-purple-600' }, + { id: 5, name: '강', station: '천호역', status: 'done', color: 'bg-yellow-500' }, + { id: 6, name: '최', station: '사당역', status: 'done', color: 'bg-violet-600' }, + { id: 7, name: '정', station: '고속터미널역', status: 'pending', color: 'bg-sky-500' }, +]; + +export default function MeetingPage() { + const [searchValue, setSearchValue] = useState(''); + + return ( + // 1. 전체 화면 배경 및 중앙 정렬 (회색 배경) +
+ {/* 2. 메인 컨테이너 (반응형 박스) + - 모바일: 화면 꽉 참 (w-full h-full) + - 데스크탑(md): 860px x 700px 고정, 중앙 정렬, 둥근 모서리 + */} +
+ {/* ========================================================= + [LEFT PANEL] 정보 영역 + - 너비: 모바일(100%), 데스크탑(380px 고정) + - 구조: 타이머 -> [모바일 지도] -> 검색 -> 리스트 + ========================================================= */} +
+ {/* A. 타이머 섹션 (항상 상단) */} +
+
+
+

+ 투표 마감 시간 +
+ 03 : 45 남았습니다 +

+

+ 아직 입력 안 한 모임원 2명 +

+
+ +
+
+ + {/* ★★★ B. [모바일 전용 지도] ★★★ + - 위치: 타이머와 검색창 사이 + - 동작: 모바일(기본)에선 보이고(block), 데스크탑(md)에선 숨김(hidden) + */} +
+
+ 모바일 지도 영역 +
+
+ + {/* C. 검색창 */} +
+

내 출발지

+
+ setSearchValue(e.target.value)} + className="w-full rounded border border-gray-200 bg-gray-50 py-3 pr-10 pl-4 text-[14px] text-gray-900 transition-all outline-none placeholder:text-gray-400 focus:ring-1 focus:ring-blue-500" + /> + +
+
+ + {/* D. 참여 현황 (남은 공간 전체 차지) */} +
+ {/* [1] 상단 고정 영역 (헤더 + 배너) - 스크롤 안 됨 */} +
+
+

참여현황

+ + {MOCK_PARTICIPANTS.length}명 + 이 참여 중 + +
+ + {/* 재촉하기 배너 */} +
+
+ + 아직 입력하지 않은 친구 + + 재촉하기 +
+
+
+
+ + {/* [2] 하단 스크롤 영역 (리스트) - 남은 공간 차지(flex-1) & 스크롤(overflow-y-auto) */} +
+
+ {MOCK_PARTICIPANTS.map((user) => ( +
+ {user.station} +
+
+ {user.name} +
+ + {user.status === 'done' ? '만기면' : '안가연'} + +
+
+ ))} +
+
+
+
+ + {/* ========================================================= + [RIGHT PANEL] 데스크탑 전용 지도 영역 + - 위치: 오른쪽 패널 + - 동작: 모바일(기본)에선 숨김(hidden), 데스크탑(md)에선 보임(block) + ========================================================= */} +
+ {/* 지도 배경 */} +
+ + {/* 핀 예시 */} +
+
+ 안 +
+
+
+
+
+ ); +} diff --git a/components/header.tsx b/components/header.tsx index bf295dd..5e60782 100644 --- a/components/header.tsx +++ b/components/header.tsx @@ -8,7 +8,7 @@ const Header = () => { const { onOpen } = useModalStore(); return ( -
+
Mingling Logo From bac260a58eea2bff8a5ef26d1c0c48accacf6578 Mon Sep 17 00:00:00 2001 From: Kangdy Date: Sat, 24 Jan 2026 23:32:55 +0900 Subject: [PATCH 2/9] =?UTF-8?q?feat:=20=EB=AA=A8=EC=9E=84=20=EC=9E=A5?= =?UTF-8?q?=EC=86=8C=20=ED=88=AC=ED=91=9C=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=EC=B9=B4=EC=B9=B4=EC=98=A4?= =?UTF-8?q?=EB=A7=B5=20SDK=20=EC=97=B0=EB=8F=99=20-=20=EA=B5=AC=EC=B2=B4?= =?UTF-8?q?=EC=A0=81=EC=9D=B8=20figma=20=EC=8B=9C=EC=95=88=EC=97=90=20?= =?UTF-8?q?=EB=A7=9E=EC=B6=B0=EC=84=9C=20=EB=94=94=EC=9E=90=EC=9D=B8?= =?UTF-8?q?=EC=9D=80=20=EC=88=98=EC=A0=95=EC=9D=B4=20=EB=8D=94=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/layout.tsx | 5 ++++ app/meeting/page.tsx | 46 +++++++++++++------------------------ components/map/kakaoMap.tsx | 37 +++++++++++++++++++++++++++++ types/global.d.ts | 8 ++++++- 4 files changed, 65 insertions(+), 31 deletions(-) create mode 100644 components/map/kakaoMap.tsx diff --git a/app/layout.tsx b/app/layout.tsx index 1d501f7..d8aae5e 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,5 +1,6 @@ import './globals.css'; import type { Metadata } from 'next'; +import Script from 'next/script'; import localFont from 'next/font/local'; import Header from '../components/header'; import Footer from '../components/footer'; @@ -38,6 +39,10 @@ export default function RootLayout({
{children}