diff --git a/package-lock.json b/package-lock.json index 74732b7f..4b8a2ac4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,9 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "embla-carousel-react": "^8.6.0", + "framer-motion": "^12.23.12", "lucide-react": "^0.525.0", + "motion": "^12.23.12", "next-themes": "^0.4.6", "react": "^18", "react-dom": "^18", @@ -6755,6 +6757,33 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/framer-motion": { + "version": "12.23.12", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.12.tgz", + "integrity": "sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.23.12", + "motion-utils": "^12.23.6", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -8247,6 +8276,47 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/motion": { + "version": "12.23.12", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.23.12.tgz", + "integrity": "sha512-8jCD8uW5GD1csOoqh1WhH1A6j5APHVE15nuBkFeRiMzYBdRwyAHmSP/oXSuW0WJPZRXTFdBoG4hY9TFWNhhwng==", + "license": "MIT", + "dependencies": { + "framer-motion": "^12.23.12", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/motion-dom": { + "version": "12.23.12", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.12.tgz", + "integrity": "sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.23.6" + } + }, + "node_modules/motion-utils": { + "version": "12.23.6", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz", + "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", diff --git a/package.json b/package.json index 7e4a5817..6d15381e 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,9 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "embla-carousel-react": "^8.6.0", + "framer-motion": "^12.23.12", "lucide-react": "^0.525.0", + "motion": "^12.23.12", "next-themes": "^0.4.6", "react": "^18", "react-dom": "^18", diff --git a/src/components/home/ContentSection.tsx b/src/components/home/ContentSection.tsx index bf700652..712f8036 100644 --- a/src/components/home/ContentSection.tsx +++ b/src/components/home/ContentSection.tsx @@ -1,3 +1,4 @@ +import { motion } from 'framer-motion'; import Image from 'next/image'; import AverageStar from '@/components/wineDetail/AverageStar'; @@ -6,11 +7,21 @@ import { ImageCard } from '../common/card/ImageCard'; export const ContentSection = () => { return ( -
-
-
-
- +
+ {/* 첫 번째 박스 */} + +
+
+ 매달 새롭게 만나는
와인 추천 콘탠츠
@@ -18,7 +29,11 @@ export const ContentSection = () => { 매달 다양한 인기 와인을 만나보세요

-
+ +
이번 달 추천 와인 @@ -52,9 +67,17 @@ export const ContentSection = () => {
-
-
-
+ + + {/* 두 번째 박스 */} + +
다양한 필터로 찾는 @@ -65,30 +88,41 @@ export const ContentSection = () => { 나에게 맞는 와인을 쉽게 검색해요.

+
필터이미지2
필터이미지1
- 필터로 찾은 내 맞춤 와인 +
+ 필터로 찾은 내 맞춤 와인 +
-
-
-
+ + + {/* 세 번째 박스 */} + +
직관적인 @@ -101,13 +135,16 @@ export const ContentSection = () => { 쉽고 빠르게 와인 리뷰를 살펴보세요

- 와인 리뷰 예시 이미지 + +
+ 와인 리뷰 예시 이미지 +
{ 'linear-gradient(to top, #EBEEF4 0%, transparent 5%, transparent 95%, #EBEEF4 100%)', }} /> -
+
); }; diff --git a/src/components/home/HeroSection.tsx b/src/components/home/HeroSection.tsx index b01357ec..9342a3d1 100644 --- a/src/components/home/HeroSection.tsx +++ b/src/components/home/HeroSection.tsx @@ -1,3 +1,4 @@ +import { motion } from 'framer-motion'; import Image from 'next/image'; import HeroSectionLayout from './HeroSectionLayout'; @@ -7,7 +8,13 @@ import AverageStar from '../wineDetail/AverageStar'; export const HeroSection = () => { return (
-
+
{
{/* 기준 박스 translate-y 아래로-ㅁㅁ만큼 밀어내기 */} - - + -
- 4.3 - -

- Sentinel Carbernet Sauvignon 2016 -

-
-
+ +
+ 4.3 + +

+ Sentinel Carbernet Sauvignon 2016 +

+
+
+
{/* 좌우 위 박스 */} - -
- 4.6 - -

- Ciel du Cheval Vaineyard Collaboration -

-
-
+ +
+ 4.6 + +

+ Ciel du Cheval Vaineyard Collaboration +

+
+
+
- -
- 4.2 - -

Palazzo della Torre 2017

-
-
+ +
+ 4.2 + +

Palazzo della Torre 2017

+
+
+
{/* 좌우 아래 박스 */} - -
- 4.8 - -

- Sentinel Carbernet Sauvignon 2016 -

-
-
+ +
+ 4.8 + +

+ Sentinel Carbernet Sauvignon 2016 +

+
+
+
- -
- 4.9 - -

- Sentinel Carbernet Sauvignon 2016 -

-
-
+ +
+ 4.9 + +

+ Sentinel Carbernet Sauvignon 2016 +

+
+
+
-
+
); }; diff --git a/src/components/home/HeroSectionLayout.tsx b/src/components/home/HeroSectionLayout.tsx index 057dfba1..4545c6c6 100644 --- a/src/components/home/HeroSectionLayout.tsx +++ b/src/components/home/HeroSectionLayout.tsx @@ -8,7 +8,7 @@ interface HeroSectionLayoutProps { } const HeroSectionLayout = ({ children, className }: HeroSectionLayoutProps) => { - const baseClass = 'absolute w-[240px] h-[185px] rounded-xl shadow-xl bg-white'; + const baseClass = 'absolute w-[240px] h-[185px] rounded-xl shadow-xl'; return
{children}
; }; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 40e083f0..814584b0 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,3 +1,4 @@ +import { motion } from 'framer-motion'; import Link from 'next/link'; import { ContentSection } from '@/components/home/ContentSection'; @@ -12,16 +13,23 @@ export default function Home() {
);