From b1227b2c0c4942a65cd68efbd1f735b99e28d043 Mon Sep 17 00:00:00 2001 From: youjin-hub Date: Wed, 23 Jul 2025 15:56:37 +0900 Subject: [PATCH 01/15] =?UTF-8?q?style:=20MyCard=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=8B=9C=EC=95=88=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=20style=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/card/MyCard.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/common/card/MyCard.tsx b/src/components/common/card/MyCard.tsx index fdd23ae..1bfa16b 100644 --- a/src/components/common/card/MyCard.tsx +++ b/src/components/common/card/MyCard.tsx @@ -33,10 +33,10 @@ export function MyCard({ rating, timeAgo, title, review, rightSlot, className }: {/* 제목 */} -

{title}

+

{title}

{/* 리뷰 내용 */} -

{review}

+

{review}

); } From c30ebdaa65ff9cd01a6d0a149d506ca974fb1663 Mon Sep 17 00:00:00 2001 From: youjin-hub Date: Wed, 23 Jul 2025 16:04:05 +0900 Subject: [PATCH 02/15] =?UTF-8?q?feat:=20=EB=AA=A9=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EB=B0=8F=20=EB=AA=A9=EC=97=85=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80,=20Dot=20=EC=95=84=EC=9D=B4=EC=BD=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/wine.png | Bin 0 -> 28756 bytes src/assets/icons/dot.svg | 3 ++ src/pages/myprofile/mockUser.ts | 67 ++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 public/wine.png create mode 100644 src/assets/icons/dot.svg create mode 100644 src/pages/myprofile/mockUser.ts diff --git a/public/wine.png b/public/wine.png new file mode 100644 index 0000000000000000000000000000000000000000..fa4966ef0434d533a310f3a74889bc68b1a6e194 GIT binary patch literal 28756 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 P00000NkvXXu0mjfe0#+e literal 0 HcmV?d00001 diff --git a/src/assets/icons/dot.svg b/src/assets/icons/dot.svg new file mode 100644 index 0000000..fb1a8c3 --- /dev/null +++ b/src/assets/icons/dot.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/pages/myprofile/mockUser.ts b/src/pages/myprofile/mockUser.ts new file mode 100644 index 0000000..aa7123d --- /dev/null +++ b/src/pages/myprofile/mockUser.ts @@ -0,0 +1,67 @@ +// src/mocks/user.ts + +export interface Review { + id: number; + rating: number; // 별점 (0–5) + timeAgo: string; // 작성 시점(예: "2시간 전") + title: string; // 리뷰 제목 + review: string; // 리뷰 본문 +} + +export interface Wine { + id: number; + name: string; // 와인 이름 + region: string; // 생산지 + price: number; // 가격(원 단위) +} + +export interface User { + id: number; + nickname: string; + profileImageUrl: string; // 프로필 이미지 경로 + reviews: Review[]; + wines: Wine[]; +} + +export const mockUser: User = { + id: 1, + nickname: '홍길동', + profileImageUrl: 'https://picsum.photos/43', + reviews: [ + { + id: 1, + rating: 4.8, + timeAgo: '방금 전', + title: '첫인상이 깔끔해요', + review: '탄탄한 바디감과 깔끔한 피니시가 인상적입니다.', + }, + { + id: 2, + rating: 3.5, + timeAgo: '2시간 전', + title: '과일향 풍부', + review: '달콤한 베리향이 풍성하게 퍼지면서 마무리는 드라이해요.', + }, + { + id: 3, + rating: 5.0, + timeAgo: '하루 전', + title: '최고의 가성비', + review: '가성비가 훌륭하고, 풍미가 깊어 자주 찾게 됩니다.', + }, + ], + wines: [ + { + id: 1, + name: 'Château Margaux 2016', + region: 'Bordeaux, France', + price: 64990, + }, + { + id: 2, + name: 'Screaming Eagle 2012', + region: 'Napa Valley, USA', + price: 320000, + }, + ], +}; From c09f183d84ec1d4ada2614105fb8a48d1e74ef6d Mon Sep 17 00:00:00 2001 From: youjin-hub Date: Wed, 23 Jul 2025 21:36:50 +0900 Subject: [PATCH 03/15] =?UTF-8?q?feat:=20myprofile=20page=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=20ui=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/myprofile/Profile.tsx | 57 ++++++++++++++++++++++++++++++ src/pages/myprofile/ReviewList.tsx | 31 ++++++++++++++++ src/pages/myprofile/Tab.tsx | 22 ++++++++++++ src/pages/myprofile/WineList.tsx | 40 +++++++++++++++++++++ src/pages/myprofile/index.tsx | 31 ++++++++++++++++ 5 files changed, 181 insertions(+) create mode 100644 src/pages/myprofile/Profile.tsx create mode 100644 src/pages/myprofile/ReviewList.tsx create mode 100644 src/pages/myprofile/Tab.tsx create mode 100644 src/pages/myprofile/WineList.tsx create mode 100644 src/pages/myprofile/index.tsx diff --git a/src/pages/myprofile/Profile.tsx b/src/pages/myprofile/Profile.tsx new file mode 100644 index 0000000..4425bc2 --- /dev/null +++ b/src/pages/myprofile/Profile.tsx @@ -0,0 +1,57 @@ +import React, { useState } from 'react'; + +import Input from '@/components/common/Input'; +import { Button } from '@/components/ui/button'; + +interface ProfileProps { + nickname: string; + profileImageUrl: string; +} + +export default function Profile({ nickname, profileImageUrl }: ProfileProps) { + const [newNickname, setNewNickname] = useState(''); + + const handleChange = (e: React.ChangeEvent) => { + setNewNickname(e.target.value); + }; + + return ( +
+
+
+ 프로필 플레이스홀더 +
+
유저 닉네임
+
+
+
+ + +
+ +
+
+ ); +} diff --git a/src/pages/myprofile/ReviewList.tsx b/src/pages/myprofile/ReviewList.tsx new file mode 100644 index 0000000..95e2b9c --- /dev/null +++ b/src/pages/myprofile/ReviewList.tsx @@ -0,0 +1,31 @@ +import DotIcon from '@/assets/icons/dot.svg'; +import { MyCard } from '@/components/common/card/MyCard'; +import { Badge } from '@/components/ui/badge'; + +// mockUser.ts 에서 이렇게 export 했다고 가정 +import type { Review } from './mockUser'; + +interface ReviewListProps { + items: Review[]; +} + +export function ReviewList({ items }: ReviewListProps) { + return ( +
+ {items.map((r) => ( + ★ {r.rating.toFixed(1)}} + timeAgo={r.timeAgo} + title={r.title} + review={r.review} + rightSlot={ + + } + /> + ))} +
+ ); +} diff --git a/src/pages/myprofile/Tab.tsx b/src/pages/myprofile/Tab.tsx new file mode 100644 index 0000000..a78973c --- /dev/null +++ b/src/pages/myprofile/Tab.tsx @@ -0,0 +1,22 @@ +// components/TabNav.tsx +type Tab = 'reviews' | 'wines'; + +export function TabNav({ current, onChange }: { current: Tab; onChange: (t: Tab) => void }) { + return ( + + ); +} diff --git a/src/pages/myprofile/WineList.tsx b/src/pages/myprofile/WineList.tsx new file mode 100644 index 0000000..4683cd5 --- /dev/null +++ b/src/pages/myprofile/WineList.tsx @@ -0,0 +1,40 @@ +// components/WineList.tsx + +import React from 'react'; + +import DotIcon from '@/assets/icons/dot.svg'; +import { ImageCard } from '@/components/common/card/ImageCard'; +import { Badge } from '@/components/ui/badge'; + +import type { Wine } from './mockUser'; + +interface WineListProps { + items: Wine[]; +} + +export function WineList({ items }: WineListProps) { + return ( +
+ {items.map((w) => ( + + + + } + > + {/* children 으로 name, region, price 렌더 */} +
+

{w.name}

+

{w.region}

+ ₩ {w.price.toLocaleString()} +
+
+ ))} +
+ ); +} diff --git a/src/pages/myprofile/index.tsx b/src/pages/myprofile/index.tsx new file mode 100644 index 0000000..20f1d7d --- /dev/null +++ b/src/pages/myprofile/index.tsx @@ -0,0 +1,31 @@ +// pages/myprofile.tsx +import React, { useState } from 'react'; + +import { mockUser } from './mockUser'; +import Profile from './Profile'; +import { ReviewList } from './ReviewList'; +import { TabNav } from './Tab'; +import { WineList } from './WineList'; + +export default function MyProfile() { + const [tab, setTab] = useState<'reviews' | 'wines'>('reviews'); + + return ( +
+
+ {/* Profile */} + + + {/* Tabs */} +
+ + {tab === 'reviews' ? ( + + ) : ( + + )} +
+
+
+ ); +} From a87cb1f0e2cd32b79b5086132e14058431e9566d Mon Sep 17 00:00:00 2001 From: youjin-hub Date: Thu, 24 Jul 2025 13:01:50 +0900 Subject: [PATCH 04/15] =?UTF-8?q?feat:=20API=20=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EA=B8=B0=EB=B0=98=EC=9C=BC=EB=A1=9C=20=20?= =?UTF-8?q?=EB=AA=A9=EC=97=85=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/myprofile/index.tsx | 15 ++- src/pages/myprofile/mockUser.ts | 198 ++++++++++++++++++++++++-------- 2 files changed, 157 insertions(+), 56 deletions(-) diff --git a/src/pages/myprofile/index.tsx b/src/pages/myprofile/index.tsx index 20f1d7d..f67c1bc 100644 --- a/src/pages/myprofile/index.tsx +++ b/src/pages/myprofile/index.tsx @@ -1,7 +1,7 @@ // pages/myprofile.tsx import React, { useState } from 'react'; -import { mockUser } from './mockUser'; +import { mockUserReviewsResponse, mockUserWinesResponse } from './mockUser'; import Profile from './Profile'; import { ReviewList } from './ReviewList'; import { TabNav } from './Tab'; @@ -14,15 +14,20 @@ export default function MyProfile() {
{/* Profile */} - + {/* Tabs */}
- + {tab === 'reviews' ? ( - + ) : ( - + )}
diff --git a/src/pages/myprofile/mockUser.ts b/src/pages/myprofile/mockUser.ts index aa7123d..3e50973 100644 --- a/src/pages/myprofile/mockUser.ts +++ b/src/pages/myprofile/mockUser.ts @@ -1,67 +1,163 @@ -// src/mocks/user.ts - -export interface Review { - id: number; - rating: number; // 별점 (0–5) - timeAgo: string; // 작성 시점(예: "2시간 전") - title: string; // 리뷰 제목 - review: string; // 리뷰 본문 -} - -export interface Wine { - id: number; - name: string; // 와인 이름 - region: string; // 생산지 - price: number; // 가격(원 단위) -} - -export interface User { - id: number; - nickname: string; - profileImageUrl: string; // 프로필 이미지 경로 - reviews: Review[]; - wines: Wine[]; -} - -export const mockUser: User = { - id: 1, - nickname: '홍길동', - profileImageUrl: 'https://picsum.photos/43', - reviews: [ +export const mockUserWinesResponse = { + totalCount: 4, + nextCursor: 0, // 커서 기반 페이징 예시, 이후 로직에 따라 변경 가능 + list: [ { id: 1, - rating: 4.8, - timeAgo: '방금 전', - title: '첫인상이 깔끔해요', - review: '탄탄한 바디감과 깔끔한 피니시가 인상적입니다.', + name: 'Château Margaux 2016', + region: 'Bordeaux, France', + image: 'https://picsum.photos/seed/margaux/100/140', + price: 64990, + type: 'Red', + avgRating: 4.7, + reviewCount: 12, + userId: 1, + recentReview: { + id: 101, + content: '풍부한 과일향과 부드러운 탄닌이 인상적이에요.', + aroma: ['PLUM', 'CEDAR'], + rating: 4.8, + createdAt: '2025-07-22T15:21:43.681Z', + updatedAt: '2025-07-22T15:21:43.681Z', + user: { + id: 2, + nickname: '와인초보', + image: 'https://picsum.photos/seed/user1/32', + }, + }, }, { id: 2, - rating: 3.5, - timeAgo: '2시간 전', - title: '과일향 풍부', - review: '달콤한 베리향이 풍성하게 퍼지면서 마무리는 드라이해요.', + name: 'Screaming Eagle 2012', + region: 'Napa Valley, USA', + image: 'https://picsum.photos/seed/eagle/100/140', + price: 320000, + type: 'Red', + avgRating: 4.9, + reviewCount: 24, + userId: 1, + recentReview: { + id: 102, + content: '이 가격이 아깝지 않은 훌륭한 와인입니다.', + aroma: ['BLACKCURRANT'], + rating: 5.0, + createdAt: '2025-07-21T10:00:00.000Z', + updatedAt: '2025-07-21T10:00:00.000Z', + user: { + id: 3, + nickname: '포도박사', + image: 'https://picsum.photos/seed/user2/32', + }, + }, }, { id: 3, - rating: 5.0, - timeAgo: '하루 전', - title: '최고의 가성비', - review: '가성비가 훌륭하고, 풍미가 깊어 자주 찾게 됩니다.', + name: 'Penfolds Grange 2018', + region: 'South Australia, Australia', + image: 'https://picsum.photos/seed/penfolds/100/140', + price: 210000, + type: 'Red', + avgRating: 4.5, + reviewCount: 7, + userId: 1, + recentReview: { + id: 103, + content: '짙은 향과 파워풀한 맛이 기억에 남아요.', + aroma: ['CHERRY'], + rating: 4.6, + createdAt: '2025-07-20T12:15:00.000Z', + updatedAt: '2025-07-20T12:15:00.000Z', + user: { + id: 4, + nickname: '와인애호가', + image: 'https://picsum.photos/seed/user3/32', + }, + }, + }, + { + id: 4, + name: 'Vega Sicilia Único 2009', + region: 'Ribera del Duero, Spain', + image: 'https://picsum.photos/seed/vega/100/140', + price: 185000, + type: 'Red', + avgRating: 4.6, + reviewCount: 10, + userId: 1, + recentReview: { + id: 104, + content: '스페인 와인의 자존심답게 훌륭합니다.', + aroma: ['SPICE'], + rating: 4.7, + createdAt: '2025-07-19T18:00:00.000Z', + updatedAt: '2025-07-19T18:00:00.000Z', + user: { + id: 5, + nickname: '비노러버', + image: 'https://picsum.photos/seed/user4/32', + }, + }, }, ], - wines: [ +}; + +export const mockUserReviewsResponse = { + totalCount: 3, + nextCursor: 0, + list: [ { - id: 1, - name: 'Château Margaux 2016', - region: 'Bordeaux, France', - price: 64990, + id: 101, + rating: 4.6, + lightBold: 3, + smoothTannic: 2, + drySweet: 1, + softAcidic: 4, + aroma: ['CHERRY', 'BLACKCURRANT'], + content: '부드러운 타닌과 체리향이 잘 어우러진 와인이었어요.', + createdAt: '2025-07-22T15:21:43.672Z', + updatedAt: '2025-07-22T15:21:43.672Z', + user: { + id: 1, + nickname: '홍길동', + image: 'https://picsum.photos/seed/reviewer1/32', + }, + isLiked: true, }, { - id: 2, - name: 'Screaming Eagle 2012', - region: 'Napa Valley, USA', - price: 320000, + id: 102, + rating: 3.8, + lightBold: 2, + smoothTannic: 3, + drySweet: 2, + softAcidic: 2, + aroma: ['VANILLA'], + content: '조금 달달한 편이지만 데일리 와인으로 괜찮아요.', + createdAt: '2025-07-21T12:11:00.000Z', + updatedAt: '2025-07-21T12:11:00.000Z', + user: { + id: 1, + nickname: '홍길동', + image: 'https://picsum.photos/seed/reviewer1/32', + }, + isLiked: false, + }, + { + id: 103, + rating: 5.0, + lightBold: 4, + smoothTannic: 4, + drySweet: 1, + softAcidic: 3, + aroma: ['SPICE', 'LEATHER'], + content: '깊고 풍성한 풍미에 감탄했습니다. 인생 와인!', + createdAt: '2025-07-20T09:00:00.000Z', + updatedAt: '2025-07-20T09:00:00.000Z', + user: { + id: 1, + nickname: '홍길동', + image: 'https://picsum.photos/seed/reviewer1/32', + }, + isLiked: true, }, ], }; From a3bb4633902eab62b4c647f44f389f148e39cce9 Mon Sep 17 00:00:00 2001 From: youjin-hub Date: Thu, 24 Jul 2025 13:04:18 +0900 Subject: [PATCH 05/15] =?UTF-8?q?feat:=20=EB=A6=AC=EC=8B=9C=ED=8A=B8?= =?UTF-8?q?=EC=97=90=20=EB=93=9C=EB=A1=AD=EB=8B=A4=EC=9A=B4=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=EB=B0=8F=20=EB=AA=A9=EC=97=85=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20API=20=EC=9D=91=EB=8B=B5=20=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=EB=A1=9C=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/myprofile/ReviewList.tsx | 31 +++++++++++++++++++++--------- src/pages/myprofile/WineList.tsx | 29 ++++++++++++++++++---------- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/pages/myprofile/ReviewList.tsx b/src/pages/myprofile/ReviewList.tsx index 95e2b9c..53bf1bc 100644 --- a/src/pages/myprofile/ReviewList.tsx +++ b/src/pages/myprofile/ReviewList.tsx @@ -1,12 +1,14 @@ +import React from 'react'; + import DotIcon from '@/assets/icons/dot.svg'; import { MyCard } from '@/components/common/card/MyCard'; +import MenuDropdown from '@/components/common/dropdown/MenuDropdown'; import { Badge } from '@/components/ui/badge'; -// mockUser.ts 에서 이렇게 export 했다고 가정 -import type { Review } from './mockUser'; +import { mockUserReviewsResponse } from './mockUser'; interface ReviewListProps { - items: Review[]; + items: typeof mockUserReviewsResponse.list; } export function ReviewList({ items }: ReviewListProps) { @@ -16,13 +18,24 @@ export function ReviewList({ items }: ReviewListProps) { ★ {r.rating.toFixed(1)}} - timeAgo={r.timeAgo} - title={r.title} - review={r.review} + timeAgo={new Date(r.createdAt).toLocaleDateString()} // 또는 상대 시간 포맷 라이브러리 사용 + title={r.user.nickname} + review={r.content} rightSlot={ - + + + + } + options={[ + { label: '수정', value: 'edit' }, + { label: '삭제', value: 'delete' }, + ]} + onSelect={(value) => { + console.log(`"${value}" clicked for review id: ${r.id}`); + }} + /> } /> ))} diff --git a/src/pages/myprofile/WineList.tsx b/src/pages/myprofile/WineList.tsx index 4683cd5..cfdaeb3 100644 --- a/src/pages/myprofile/WineList.tsx +++ b/src/pages/myprofile/WineList.tsx @@ -1,15 +1,14 @@ -// components/WineList.tsx - import React from 'react'; import DotIcon from '@/assets/icons/dot.svg'; import { ImageCard } from '@/components/common/card/ImageCard'; +import MenuDropdown from '@/components/common/dropdown/MenuDropdown'; import { Badge } from '@/components/ui/badge'; -import type { Wine } from './mockUser'; +import { mockUserWinesResponse } from './mockUser'; interface WineListProps { - items: Wine[]; + items: typeof mockUserWinesResponse.list; } export function WineList({ items }: WineListProps) { @@ -19,15 +18,25 @@ export function WineList({ items }: WineListProps) { - - + + + + } + options={[ + { label: '수정', value: 'edit' }, + { label: '삭제', value: 'delete' }, + ]} + onSelect={(value) => { + console.log(`"${value}" clicked for wine id: ${w.id}`); + }} + /> } > - {/* children 으로 name, region, price 렌더 */}

{w.name}

{w.region}

From 281f6904bd9d9dcbe14fff357e06bc77144aae22 Mon Sep 17 00:00:00 2001 From: youjin-hub Date: Thu, 24 Jul 2025 13:10:06 +0900 Subject: [PATCH 06/15] =?UTF-8?q?feat:=20=ED=83=AD=20=EB=A9=94=EB=89=B4?= =?UTF-8?q?=EC=97=90=20=EB=AA=A9=EC=97=85=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?API=20=EC=9D=91=EB=8B=B5=20=EA=B5=AC=EC=A1=B0=EB=A1=9C=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99=20=EB=B0=8F=20=EC=B4=9D=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=20=EC=B4=9D=20=EA=B0=9C=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/myprofile/Tab.tsx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/pages/myprofile/Tab.tsx b/src/pages/myprofile/Tab.tsx index a78973c..bafc528 100644 --- a/src/pages/myprofile/Tab.tsx +++ b/src/pages/myprofile/Tab.tsx @@ -1,9 +1,17 @@ -// components/TabNav.tsx type Tab = 'reviews' | 'wines'; -export function TabNav({ current, onChange }: { current: Tab; onChange: (t: Tab) => void }) { +interface TabNavProps { + current: Tab; + onChange: (t: Tab) => void; + reviewsCount: number; + winesCount: number; +} + +export function TabNav({ current, onChange, reviewsCount, winesCount }: TabNavProps) { + const count = current === 'reviews' ? reviewsCount : winesCount; + return ( - ); } diff --git a/src/pages/myprofile/WineList.tsx b/src/pages/myprofile/WineList.tsx index cfdaeb3..2ea68c3 100644 --- a/src/pages/myprofile/WineList.tsx +++ b/src/pages/myprofile/WineList.tsx @@ -13,13 +13,13 @@ interface WineListProps { export function WineList({ items }: WineListProps) { return ( -
+
{items.map((w) => ( } options={[ - { label: '수정', value: 'edit' }, - { label: '삭제', value: 'delete' }, + { label: '수정하기', value: 'edit' }, + { label: '삭제하기', value: 'delete' }, ]} onSelect={(value) => { console.log(`"${value}" clicked for wine id: ${w.id}`); @@ -37,9 +37,13 @@ export function WineList({ items }: WineListProps) { /> } > -
-

{w.name}

-

{w.region}

+
+

+ {w.name} +

+

+ {w.region} +

₩ {w.price.toLocaleString()}
diff --git a/src/pages/myprofile/index.tsx b/src/pages/myprofile/index.tsx index f67c1bc..f19841b 100644 --- a/src/pages/myprofile/index.tsx +++ b/src/pages/myprofile/index.tsx @@ -11,13 +11,13 @@ export default function MyProfile() { const [tab, setTab] = useState<'reviews' | 'wines'>('reviews'); return ( -
-
+
+
{/* Profile */} {/* Tabs */} -
+
Date: Fri, 25 Jul 2025 13:12:29 +0900 Subject: [PATCH 08/15] =?UTF-8?q?refactor:Gnb=20z-index=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20menuDropdown=20mod?= =?UTF-8?q?al=20false=20=EC=86=8D=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/Gnb.tsx | 4 ++-- src/components/common/dropdown/MenuDropdown.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/common/Gnb.tsx b/src/components/common/Gnb.tsx index 4659517..16d83dd 100644 --- a/src/components/common/Gnb.tsx +++ b/src/components/common/Gnb.tsx @@ -11,8 +11,8 @@ import UserDefaultImg from './UserDefaultImg'; function Gnb() { return ( //inset-x-0 -> x축:left,right둘 다 0 -
-