Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
fba1833
design: 반응형 모서리 radius 수정
hyeonjiroh Jul 8, 2025
cfd1372
feat: 추천 패널과 지도 모두 조작 가능하도록 구현
hyeonjiroh Jul 8, 2025
3dd87d8
chore: 이미지 도메인 추가
hyeonjiroh Jul 8, 2025
f3da947
design: PC 화면에서 추천 패널 크기 지정
hyeonjiroh Jul 8, 2025
d4406b4
feat: 지도에 마커 및 경로 표시 테스트
hyeonjiroh Jul 9, 2025
221d4dc
feat: 사용자가 선택한 거주 의향 지역을 도착 지점으로 지정 및 마커 표시 & 시작 지점과 중간 지점의 중간 지점을 초기…
hyeonjiroh Jul 9, 2025
89708a4
design: 지도가 사이드 패널의 공간을 제외하고 꽉 채울 수 있도록 변경
hyeonjiroh Jul 9, 2025
60e094d
feat: 추천 장소 커스텀 마커 생성
hyeonjiroh Jul 9, 2025
9faeb64
feat: 경로 임시 표시
hyeonjiroh Jul 9, 2025
3b3e0e8
design: 네비게이션 바 로고 변경
hyeonjiroh Jul 9, 2025
88d0c93
design: 플로팅 버튼 디자인 변경 및 반응형 스타일 적용
hyeonjiroh Jul 9, 2025
b207a48
refactor: prop 전달 방식 변경
hyeonjiroh Jul 9, 2025
ca14d78
feat: 추천 장소 마커 표시
hyeonjiroh Jul 9, 2025
f6eca5d
design: 시작 및 도착 마커 변경
hyeonjiroh Jul 9, 2025
9353291
refactor: 추천 장소 마커 기본 이미지 변경
hyeonjiroh Jul 9, 2025
ea15d7c
feat: 추천 장소 마커 클릭 시 해당 추천 장소 경유하는 경로 표시
hyeonjiroh Jul 9, 2025
ece9977
style: 패널 내용 넘칠 시 잘리는 문제 해결
hyeonjiroh Jul 9, 2025
433061a
feat: 추천 장소 클릭 시 해당 추천 장소가 지도의 중심에 위치하도록 변경
hyeonjiroh Jul 9, 2025
9ad0b32
design: 플로팅 버튼 배치 변경
hyeonjiroh Jul 9, 2025
eddfcbc
design: 로고, 배경 변경 및 반응형 스타일 적용
hyeonjiroh Jul 9, 2025
88894ff
design: 로고, 배경 변경 및 반응형 스타일 적용
hyeonjiroh Jul 9, 2025
725e644
remove: 사용하지 않는 이미지 파일 삭제
hyeonjiroh Jul 9, 2025
e274d94
design: svg 이미지 대신 lucide 아이콘 사용
hyeonjiroh Jul 9, 2025
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
1 change: 1 addition & 0 deletions next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const nextConfig = {
"www.gunsan.go.kr",
"www.ktriptips.com",
"www.saemangeum.go.kr",
"www.sdco.or.kr",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

현지님 나중에 풀리퀘 마크다운 프레임 참조해도 될까요. 가독성이 아주 조하요

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

넵 편하게 사용하세요!

],
},
};
Expand Down
4 changes: 4 additions & 0 deletions public/icons/marker_destination.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions public/icons/marker_origin.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
30 changes: 30 additions & 0 deletions public/icons/marker_recommendation.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/illusts/commute_recommendation.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/illusts/mood_finder.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 11 additions & 0 deletions public/logo/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
File renamed without changes
File renamed without changes
9 changes: 9 additions & 0 deletions public/logo/logo_simple.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
71 changes: 42 additions & 29 deletions src/app/_components/LandingPage/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

import { useEffect } from "react";
import { createNewUser } from "@/utils/createNewUser";
import { Info } from "lucide-react";
import Image from "next/image";
import Button from "@/components/Button";
import Logo from "@/assets/icons/logo.png";
import { Info } from "lucide-react";
import Logo from "../../../../public/logo/logo.svg";

export default function LandingPage({
routing,
Expand All @@ -17,42 +17,55 @@ export default function LandingPage({
}, []);

return (
<div className="flex h-screen w-full items-center bg-[#F7F9FD]">
<div className="flex w-full flex-col items-center gap-[40px]">
<Image src={Logo} alt="logo" width={98} height={81} className="sm:h-[121px] sm:w-[98px] h-[81px] w-[65px]"/>
<div className="flex flex-col items-center gap-[24px] w-full">
<h2 className="text-[#142448] text-center text-title-large sm:text-display">
새길에 오신 것을<br />환영해요!
</h2>
<div className="w-full max-w-[720px] bg-[#e6f4f8] border border-[#b6e0ef] rounded-xl p-4 shadow-sm flex gap-2">
<div className="text-[#1683a4] mt-1">

<Info size={20} />
</div>
<div className="text-[#1683a4] text-[14px] font-[500] leading-[150%]">
<p>
본 서비스는 새만금사업 보조 목적의 정주의향 확인 및 인구유입 가능성을 확인하는 설문조사입니다.
</p>
<p className="mt-2">
설문조사 응답은 오로지 새만금 관련 신규데이터 생산에만 쓰이며,<br />
<div className="m-auto flex h-screen w-full flex-col items-center justify-center gap-16 bg-gradient-to-t from-[#EBF0FA] to-white px-5 pt-10 sm:gap-20">
<div className="flex w-full flex-col items-center gap-10">
<Image
src={Logo}
className="h-20 w-[86px] sm:h-[120px] sm:w-[112px]"
alt="새길 로고"
/>
<div className="flex w-full flex-col items-center gap-5 sm:gap-10">
<h1 className="text-title-large sm:text-display text-[#142448]">
새길에 오신 것을 환영해요!
</h1>
<div className="flex flex-col gap-5 sm:gap-6">
<div className="flex w-full max-w-[640px] gap-2 rounded-xl border border-[#C3E5E9] bg-[#E9F5F7] p-4">
<div className="mt-1 text-[#3C98A4]">
<Info size={14} />
</div>
<p className="text-link-small sm:text-link-large text-[#3C98A4]">
본 서비스는 새만금사업 보조 목적의 정주의향 확인 및 인구유입
가능성을 확인하는 설문조사입니다.
<br />
<br />
설문조사 응답은 오로지 새만금 관련 신규데이터 생산에만 쓰이며,
<br />
민감한 개인정보는 수집 대상이 아님을 밝힙니다.
</p>
</div>
<p className="text-link-small sm:text-body-medium text-center text-[#4B5263]">
귀중한 시간을 내주셔서 감사드리며,
<br /> 편안하고 진솔하게 답해주시길 바랍니다.
</p>
</div>

<p className="text-[#4b5263] text-center text-[15px] font-[600] leading-[150%]">
귀중한 시간을 내주셔서 감사드리며,<br /> 편안하고 진솔하게 답해주시길 바랍니다.
</p>
<p className="text-[#3560c0] text-center text-[22px] font-[600] leading-[150%]">
</div>
</div>
<div className="flex flex-col items-center gap-3 sm:gap-6">
<div className="flex w-full flex-col items-center gap-3 sm:gap-2">
<p className="text-body-small sm:text-title-xsmall text-[#3560C0]">
먼저 간단한 정보부터 시작해볼까요?
</p>
<Button variant="primary" width={355} onClick={() => routing("OnboardingSurvey")}>
<Button
color="blue"
className="text-body-large h-[62px] w-full max-w-[335px] rounded-xl sm:w-[335px]"
onClick={() => routing("OnboardingSurvey")}
>
지금 시작할게요!
</Button>
<p className="text-[#79839a] text-center text-[10px] font-[600] leading-[150%]">
기타 서비스 관련 문의사항 | chickentasty0112@gmail.com
</p>
</div>
<p className="text-link-small sm:text-body-small text-[#79839A]">
기타 서비스 관련 문의사항 | chickentasty0112@gmail.com
</p>
</div>
</div>
);
Expand Down
10 changes: 7 additions & 3 deletions src/app/_components/SurveyScreen/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,18 @@ export default function SurveyScreen({ type, routing }: SurveyScreenProps) {
</div>
<div className="flex items-center gap-[12px] self-end">
{currentQuestion > 0 && (
<Button variant="secondary" width={120} onClick={handlePrevClick}>
<Button
color="gray"
onClick={handlePrevClick}
className="text-body-large h-[62px] w-[120px] rounded-xl"
>
이전
</Button>
)}
<Button
variant="primary"
width={120}
color="blue"
onClick={handleNextClick}
className="text-body-large h-[62px] w-[120px] rounded-xl"
disabled={!answers[currentQuestion]}
>
다음
Expand Down
18 changes: 12 additions & 6 deletions src/app/_components/TransitionScreen/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,20 @@ export default function TransitionScreen({
}, [transitionContent, routing]);

return (
<div className="flex h-screen w-full items-center bg-[#F7F9FD]">
<div className="flex w-full flex-col items-center gap-[40px]">
<Image src={transitionContent.image} alt="" />
<div className="flex w-full flex-col items-center gap-[24px]">
<h2 className="text-heading-large text-center whitespace-pre-line text-[#142448]">
<div className="flex h-screen w-full items-center justify-center bg-gradient-to-b from-[#EBF0FA] to-[#E9F5F7]">
<div className="flex flex-col items-center gap-4 sm:gap-10">
<Image
src={transitionContent.image}
className="size-40 sm:size-80"
width={320}
height={320}
alt=""
/>
<div className="flex w-full flex-col items-center gap-4 sm:gap-6">
<h2 className="text-title-large sm:text-heading-large text-center whitespace-pre-line text-[#142448]">
{transitionContent.title}
</h2>
<p className="text-title-medium text-center text-[#7F9CDC]">
<p className="text-title-xsmall sm:text-title-medium text-center text-[#7F9CDC]">
{transitionContent.subtitle}
</p>
</div>
Expand Down
45 changes: 45 additions & 0 deletions src/app/recommend/_components/MapView/RecommendationMarker.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { CustomOverlayMap, MapMarker } from "react-kakao-maps-sdk";
import { RecommendationResponse } from "@/lib/type";
import Image from "next/image";
import Temp from "@/assets/icons/temp.jpg";

interface RecommendationMarkerProps extends RecommendationResponse {
onClick?: () => void;
}

export default function RecommendationMarker({
image,
coordinate,
onClick,
}: RecommendationMarkerProps) {
if (!coordinate) return null;

const coord = { lat: coordinate.latitude, lng: coordinate.longitude };

return (
<>
<MapMarker
position={coord}
image={{
src: "/icons/marker_recommendation.svg",
size: {
width: 51,
height: 63,
},
}}
/>
<CustomOverlayMap position={coord} yAnchor={1.25}>
<div className="size-[43px]" onClick={onClick}>
<div className="relative m-auto size-9">
<Image
src={image || Temp}
fill
className="rounded-full object-cover"
alt=""
/>
</div>
</div>
</CustomOverlayMap>
</>
);
}
84 changes: 76 additions & 8 deletions src/app/recommend/_components/MapView/index.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,90 @@
"use client";

import { Map, MapMarker, useKakaoLoader } from "react-kakao-maps-sdk";
import { Map, MapMarker, Polyline, useKakaoLoader } from "react-kakao-maps-sdk";
import { RecommendationResponse } from "@/lib/type";
import { COORDINATE } from "@/constants/spaceData";
import { Coordinate, getMidpoint } from "@/utils/getMidpoint";
import { getDestination } from "@/utils/getDestination";
import RecommendationMarker from "./RecommendationMarker";
import { useState } from "react";

export default function MapView() {
export default function MapView({
spaceData,
}: {
spaceData: RecommendationResponse[];
}) {
const [loading, error] = useKakaoLoader({
appkey: process.env.NEXT_PUBLIC_APPKEY!,
});
const [selectedSpace, setSelectedSpace] = useState<Coordinate | null>(null);

if (loading) return <div>Loading</div>;
if (error) return <div>Error</div>;

const origin = COORDINATE.SAEMANGEUM;
const destination = getDestination();
const midpoint = getMidpoint(origin, destination);

return (
<Map
level={3}
center={{ lat: 33.5563, lng: 126.79581 }}
style={{ width: "100%", height: "360px" }}
level={10}
center={selectedSpace ? selectedSpace : midpoint}
style={{ width: "100%", height: "100%" }}
>
<MapMarker position={{ lat: 33.55635, lng: 126.795841 }}>
<div style={{ color: "#000" }}>Hello World!</div>
</MapMarker>
{/* 추천 지점 마커 */}
{spaceData.map((space, index) => (
<RecommendationMarker
key={index}
{...space}
onClick={() => {
if (space.coordinate) {
setSelectedSpace({
lat: space.coordinate.latitude,
lng: space.coordinate.longitude,
});
}
}}
/>
))}

{/* 시작 지점 마커 */}
<MapMarker
position={origin}
image={{
src: "/icons/marker_origin.svg",
size: {
width: 42,
height: 55,
},
}}
/>

{/* 도착 지점 마커 */}
<MapMarker
position={destination}
image={{
src: "/icons/marker_destination.svg",
size: {
width: 42,
height: 55,
},
}}
/>

{/* 경로 */}
<Polyline
path={[
[
origin,
...(selectedSpace ? [selectedSpace] : [midpoint]),
destination,
],
]}
strokeWeight={5}
strokeColor={"#F84B5F"}
strokeOpacity={0.8}
strokeStyle={"solid"}
/>
</Map>
);
}
16 changes: 6 additions & 10 deletions src/app/recommend/_components/NavBar.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
import Image from "next/image";
import Logo from "@/assets/icons/logo.png";
import LogoDev from "@/assets/icons/logo_dev.png";
import LogoKR from "@/assets/icons/logo_kr.png";
import Logo from "../../../../public/logo/logo_simple.svg";
import LogoDev from "../../../../public/logo/logo_dev.png";
import LogoKR from "../../../../public/logo/logo_kr.png";

export default function NavBar() {
return (
<div className="flex h-12 w-screen items-center border-r-1 border-[#EEEFF2] bg-white px-5 sm:h-screen sm:w-[72px] sm:flex-col sm:justify-between sm:px-0 sm:py-3">
<Image
src={Logo}
className="h-[30px] w-6 sm:h-[50px] sm:w-10"
alt="새길 로고"
/>
<div className="pointer-events-auto flex h-10 w-screen items-center border-r-1 border-[#EEEFF2] bg-white px-5 sm:h-screen sm:w-[72px] sm:flex-col sm:justify-between sm:px-0 sm:py-4">
<Image src={Logo} className="size-6 sm:size-10" alt="새길 로고" />
<div className="hidden flex-col items-center justify-between gap-6 py-10 sm:flex">
<Image src={LogoDev} width={32} height={32} alt="새만금 개발청" />
<Image src={LogoDev} width={32} height={32} alt=" 새만금 개발청" />
<Image src={LogoKR} width={48} height={25} alt="새만금 사업단" />
</div>
</div>
Expand Down
Loading