Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
162 commits
Select commit Hold shift + click to select a range
f1b23b8
[ticket] feat: 로그인 및 회원가입 API와 관련된 뮤테이션 훅 추가, Axios 에러 처리 및 리프레시 토큰 로…
pepperdad Jul 4, 2025
d3cb087
chore: remove legacy ui package
pepperdad Jul 4, 2025
716b0d3
[design-system] feat: add design system package
pepperdad Jul 4, 2025
6379b6d
[ticket] feat: 디자인 시스템 샘플 페이지 추가
pepperdad Jul 4, 2025
da9bc5b
[config] chore: 린터 및 타입스크립트 설정 업데이트
pepperdad Jul 4, 2025
3e79ae5
[root] chore: 워크스페이스 의존성 업데이트
pepperdad Jul 4, 2025
a3f035e
[ticket] 불필요한 "use client" 지시어 제거
pepperdad Jul 4, 2025
c1b1519
[design-system] refactor: 타이포그래피 믹스인 및 변수 구조 개선
pepperdad Jul 4, 2025
a014d66
[design-system] refactor: 폰트 및 라인 높이 변수를 정리하고 새로운 변수 추가
pepperdad Jul 4, 2025
6001f06
[design-system] feat: 타이포그래피 및 색상 관련 함수 추가
pepperdad Jul 4, 2025
75549ea
[design-system] refactor: 타이포그래피 믹스인 및 변수 이름 변경
pepperdad Jul 4, 2025
96b6af5
[design-system] refactor: Sass 맵 함수 사용으로 코드 개선
pepperdad Jul 4, 2025
abe8e4d
Merge pull request #28 from PERMIT-SEOUL/feat/#24
pepperdad Jul 6, 2025
c480f58
Merge pull request #29 from PERMIT-SEOUL/feat/#27
pepperdad Jul 6, 2025
5eb8f29
[design-system] feat: 색상 변수 'red100' 추가
pepperdad Jul 6, 2025
f4562c3
[design-system] feat: 버튼 컴포넌트 추가 및 스타일 정의
pepperdad Jul 6, 2025
2fa5e29
[ticket] feat: 버튼 컴포넌트 샘플 추가 및 기존 코드 정리
pepperdad Jul 6, 2025
d6da87b
[design-system] fix: stylelint 적용
pepperdad Jul 6, 2025
eca7936
[design-system] feat: TextField 컴포넌트 추가 및 스타일 정의
pepperdad Jul 6, 2025
20756ca
[design-system] feat: useTextField 훅 추가
pepperdad Jul 6, 2025
e9ee8bd
[ticket] feat: TextField 예시 컴포넌트 추가
pepperdad Jul 6, 2025
c59132f
[design-system] feat: Typography 컴포넌트 및 스타일 추가
pepperdad Jul 6, 2025
27bbea1
[design-system] feat: get-typography 믹스인 수정 및 기본 폰트 두께 함수 추가
pepperdad Jul 6, 2025
5f5a2a8
[ticket] feat: Typography 컴포넌트 예시 추가
pepperdad Jul 6, 2025
7f7189d
[design-system] feat: Typography default 색상white 로 변경
pepperdad Jul 6, 2025
64b9980
[design-system] fix: Button 컴포넌트의 패딩 수정
pepperdad Jul 6, 2025
37a6c8e
[design-system] feat: header 버튼 스타일 추가
pepperdad Jul 6, 2025
a997052
[design-system] refactor: Button 컴포넌트의 크기 속성 수정 및 스타일 정리
pepperdad Jul 6, 2025
d897a91
[design-system] feat: Icon 컴포넌트 추가 및 SVG 처리 방식 개선
pepperdad Jul 8, 2025
095a1fc
[design-system] feat: Icon 컴포넌트에 className 속성 추가
pepperdad Jul 8, 2025
45aca13
[ticket] feat: 샘플 페이지에 나이 입력 필드 추가 및 유효성 검사 구현
pepperdad Jul 9, 2025
6ff9923
fix: pnpm-lock.yaml 업데이트 및 의존성 추가
pepperdad Jul 9, 2025
551991d
[design-system] fix: lint 스크립트에서 max-warnings 옵션 제거
pepperdad Jul 9, 2025
9aa6988
Merge pull request #31 from PERMIT-SEOUL/feat/#30
pepperdad Jul 9, 2025
631c823
[ticket] feat: 전역 스타일 추가 - 배경색 및 텍스트 색상 설정
pepperdad Jul 9, 2025
64f2b7c
[ticket] refactor: 페이지 컴포넌트에 주석 추가 및 함수형 컴포넌트로 변경
pepperdad Jul 9, 2025
6dbd95b
fix: styelint 들여쓰기 정렬 오류 해결
pepperdad Jul 9, 2025
ce00b95
[ticket] fix: tsconfig.json에 public 경로 추가
pepperdad Jul 9, 2025
9801789
[ticket] feat: 구글 및 카카오 로고 이미지 추가
pepperdad Jul 9, 2025
3002373
[ticket] feat: 로그인 페이지 퍼블리싱
pepperdad Jul 9, 2025
4159e48
[ticket] fix: CSS import 순서 수정 및 ESLint 경고 비활성화
pepperdad Jul 9, 2025
2b0f8b7
[ticket] fix: 카카오 및 구글 로그인 로고 이미지 경로 수정
pepperdad Jul 9, 2025
bfa01f4
Merge pull request #32 from PERMIT-SEOUL/feat/#25
pepperdad Jul 9, 2025
01f53ca
[ticket] feat: 이벤트 상세 페이지 및 관련 컴포넌트 추가
pepperdad Jul 9, 2025
46218d3
[ticket] refactor: 주석 수정
pepperdad Jul 9, 2025
8ed9315
[ticket] refactor: 리뷰 반영
pepperdad Jul 9, 2025
58d9ed2
[ticket] style: 이미지 캐러셀 버튼 스타일 수정 및 접근성 개선
pepperdad Jul 10, 2025
f65945f
[design-system] feat: Dialog 컴포넌트 추가 및 스타일 정의
pepperdad Jul 10, 2025
b0181b7
[design-system] feat: OverlayProvider 및 useOverlay 훅 추가, 홈 페이지에 다이얼로그…
pepperdad Jul 10, 2025
30e0487
[ticket] refactor: DialogContent 컴포넌트로 다이얼로그 기능 분리 및 홈 페이지 구조 정리
pepperdad Jul 10, 2025
a36d2f1
[ticket] feat: 페이지 컴포넌트에 "use client" 추가
pepperdad Jul 10, 2025
e1b2951
[ticket] refactor: DialogContent 컴포넌트를 별도 파일로 분리하고 useModal 훅 추가
pepperdad Jul 10, 2025
6304798
[ticket] refactor: useModal 훅의 제네릭 타입 P를 Record<string, unknown>으로 변경…
pepperdad Jul 10, 2025
ca3a3ff
[ticket] refactor: 불필요한 주석 제거
pepperdad Jul 10, 2025
3b76476
[design-system] feat: Skeleton 컴포넌트 추가
pepperdad Jul 11, 2025
fb50ff1
Merge pull request #39 from PERMIT-SEOUL/feat/#38
pepperdad Jul 12, 2025
40ca229
Merge pull request #37 from PERMIT-SEOUL/feat/#34
pepperdad Jul 12, 2025
d7efdcd
[ticket] feat: 예매 확정 페이지 추가 및 경로 파라미터 [id] → [eventId]로 수정
pepperdad Jul 12, 2025
21734f6
fix: import 에서 lint 오류 잡히지 않는 오류 수정
pepperdad Jul 12, 2025
ab3e16c
fix: lint 오류 수정
pepperdad Jul 12, 2025
a7a53bc
fix: lint 오류 수정
pepperdad Jul 12, 2025
fb841ae
[ticket] fix: 빌드 이슈 해결
pepperdad Jul 12, 2025
9e1ec67
[ticket] fix: 빌드 이슈 해결
pepperdad Jul 12, 2025
aece032
[ticket] refactor: PAGE_URL 상수를 PATH로 변경 및 이벤트 상세 페이지와 예매 확정 페이지의 pro…
pepperdad Jul 12, 2025
d4f0064
Merge pull request #42 from PERMIT-SEOUL/feat/#35
pepperdad Jul 12, 2025
fe34127
[ticket] signup api `userSex` -> `userGender` 로 변경
pepperdad Jul 13, 2025
215fd49
[ticket] feat: API_URL 구조 변경 및 행사, 예매 관련 API 추가
pepperdad Jul 13, 2025
3b3557e
[ticket] feat: 결제 요청 준비 API 추가 및 사용자 관련 API 경로 수정
pepperdad Jul 13, 2025
32c0bd1
[ticket] feat: FloatingSection에 eventId prop 추가 및 버튼 클릭시 모달 오픈 기능 구현
pepperdad Jul 13, 2025
0c4912a
[design-system] feat: useModal 훅 개선 및 ModalComponentProps 타입 정의 추가
pepperdad Jul 13, 2025
40baa87
[design-system] feat: 버튼 컴포넌트에 로딩 상태 추가 및 스피너 스타일 정의
pepperdad Jul 13, 2025
4783055
[design-system] fix: Dialog 컴포넌트의 하단 패딩 수정
pepperdad Jul 13, 2025
cf481d3
[design-system] fix: 버튼 컴포넌트의 disabled 상태 스타일 수정 및 주석 추가
pepperdad Jul 13, 2025
1c23242
[ticket] fix: sample 페이지 useModal 오류 해결
pepperdad Jul 13, 2025
d9942e9
[ticket] refactor: useLoginMutation을 useReservationReadyMutation으로 이름 변경
pepperdad Jul 13, 2025
60d5938
[design-system] feat: lodash.debounce 훅 추가 및 관련 타입 정의, useDebounce 훅 구현
pepperdad Jul 13, 2025
a16d439
[ticket] feat: 로그아웃 테스트를 위한 페이지 추가
pepperdad Jul 13, 2025
19a40b6
Merge pull request #44 from PERMIT-SEOUL/test/#43
pepperdad Jul 13, 2025
734ba54
Merge branch 'develop' of https://github.com/PERMIT-SEOUL/permit-fe i…
pepperdad Jul 13, 2025
cdfe00a
[ticket] hotfix: signup 페이지 폰트 color 수정
pepperdad Jul 15, 2025
ec01260
[ticket] refactor: 회원가입 및 로그아웃 관련 변수명 수정 및 에러 핸들링 추가
pepperdad Jul 15, 2025
d32d81e
Merge pull request #45 from PERMIT-SEOUL/hotfix/sign-up-text-color
pepperdad Jul 15, 2025
5d48529
[ticket] feat: 결제 성공 및 실패 페이지 추가, DialogContent 컴포넌트 수정
pepperdad Jul 15, 2025
fd68f0e
Merge branch 'develop' of https://github.com/PERMIT-SEOUL/permit-fe i…
pepperdad Jul 16, 2025
55f2446
[ticket] feat: 이벤트, 결제, 예약 API 레이어 구현
pepperdad Jul 18, 2025
7661785
[ticket] feat: 이벤트 상세 페이지 및 티켓 선택 기능 구현
pepperdad Jul 18, 2025
588b833
[ticket] feat: 토스 결제 시스템 구현
pepperdad Jul 18, 2025
08f95b3
[ticket] feat: 공통 유틸리티 및 타입 시스템 개선
pepperdad Jul 18, 2025
f38ad64
[ticket] feat: 에러 바운더리 및 URL 경로 치환 헬퍼 함수 개선
pepperdad Jul 18, 2025
a2b999d
[ticket] fix: getPathUrl 함수의 URL 치환 정규 표현식 개선
pepperdad Jul 18, 2025
74d4551
Merge pull request #46 from PERMIT-SEOUL/feat/#33
pepperdad Jul 18, 2025
23022fb
[ticket] feat: permit 로고 이미지 추가
pepperdad Jul 18, 2025
73cae69
[ticket] feat: Header 컴포넌트 추가 및 레이아웃에 통합
pepperdad Jul 18, 2025
0ec701d
[ticket] feat: 홈페이지 레이아웃 구조 설정
pepperdad Jul 19, 2025
2033cfb
[ticket] fix: 이벤트 카드 호버 효과 개선
pepperdad Jul 19, 2025
0e20c55
[ticket] feat: 반응형 레이아웃 구현
pepperdad Jul 19, 2025
4dbb8a8
[ticket] feat: 홈 페이지 구조 변경 (pages 디렉토리 구조로 변경)
pepperdad Jul 19, 2025
b994910
[ticket] feat: 홈 페이지 컴포넌트 구현 (이벤트 목록, 카테고리 필터)
pepperdad Jul 19, 2025
6b055fe
[ticket] refactor: EventListClient 컴포넌트 리팩토링 (Footer 분리)
pepperdad Jul 19, 2025
6406b65
[ticket] chore: 설정 파일 및 기타 컴포넌트 수정
pepperdad Jul 19, 2025
8d6b578
[ticket] fix: 카테고리 아이템 클래스 카멜 케이스로 수정
pepperdad Jul 19, 2025
2d267ec
[ticket] style: 카테고리 리스트 및 이벤트 카드 스타일 수정
pepperdad Jul 19, 2025
7d45bf2
[ticket] style: 이벤트 카드 스타일 개선
pepperdad Jul 19, 2025
e9320b3
[ticket] feat: 이벤트 카드 링크 추가 및 스타일 수정
pepperdad Jul 19, 2025
64cf35b
[ticket] style: 모바일 반응형 스타일 수정 및 코드 개선
pepperdad Jul 19, 2025
b45f3d0
Merge pull request #48 from PERMIT-SEOUL/feat/#40
pepperdad Jul 19, 2025
088d78e
[design-system] feat: Select 컴포넌트 및 useSelect 훅 추가
pepperdad Jul 19, 2025
586257c
[ticket] feat: Select 컴포넌트 테스트 페이지 추가
pepperdad Jul 19, 2025
baf5c9a
[design-system] fix: placeholder 색상 변경
pepperdad Jul 19, 2025
525a312
[design-system] fix: 날짜 형식 변경 및 onChange 함수 수정
pepperdad Jul 19, 2025
adfbde5
[design-system] refactor: Select 컴포넌트에서 불필요한 TODO 주석 제거
pepperdad Jul 19, 2025
82d67f7
Merge pull request #49 from PERMIT-SEOUL/feat/#41
pepperdad Jul 19, 2025
d3ea5ba
design-system: fix Select placeholder color
pepperdad Jul 19, 2025
597da61
회원가입 페이지 스타일 수정 및 기능 개선
pepperdad Jul 19, 2025
823e4e2
[design-system] feat: 버튼 컴포넌트의 disabled 속성을 isLoading 상태와 결합하여 로딩 중에도…
pepperdad Jul 19, 2025
3bebac1
[design-system] style: Select 컴포넌트의 패딩 및 배경색 수정
pepperdad Jul 19, 2025
2c00456
[design-system] style: Button 및 TextField 컴포넌트 스타일 수정
pepperdad Jul 19, 2025
fa7d71d
[ticket] feat: 회원가입 페이지 필드별 상태 관리 훅 추가 및 유효성 검사 로직 개선
pepperdad Jul 19, 2025
2552ba7
[design-system] style: 회원가입 페이지 스타일 수정
pepperdad Jul 19, 2025
3bff31e
[ticket] feat: 레이아웃 구조 개선 및 Footer 스타일 업데이트
pepperdad Jul 19, 2025
46eddf4
[ticket] feat: EventList 컴포넌트 스타일 개선
pepperdad Jul 19, 2025
1e6124b
[ticket] fix: 로그인/회원가입 페이지 스타일 개선
pepperdad Jul 19, 2025
d1a3506
[design-system] feat: Button 컴포넌트에 클릭 디바운스 기능 추가
pepperdad Jul 19, 2025
fe184c9
[ticket] feat: 회원가입 버튼에 useClickDebounce 속성 적용하여 중복 클릭 방지 기능 강화
pepperdad Jul 19, 2025
8e3fc6b
[ticket[ chore: 불필요 import 제거
pepperdad Jul 19, 2025
7e3ade0
[ticket] feat: LoadingWithLayout 컴포넌트 추가
pepperdad Jul 19, 2025
ecac2dc
[ticket] refactor: LoadingIndicator를 LoadingWithLayout으로 교체 및 스타일 추가
pepperdad Jul 19, 2025
a977192
Merge pull request #50 from PERMIT-SEOUL/feat/#26
pepperdad Jul 19, 2025
6043855
[ticket] refactor: 이메일 체크 핸들러 및 버튼 타입 수정
pepperdad Jul 19, 2025
828cbd3
[design-system] feat: Select 컴포넌트 아이콘 변경 및 색상 수정
pepperdad Jul 19, 2025
d3d8983
[design-system] feat: useIsMobile 훅 추가
pepperdad Jul 19, 2025
747ba89
[ticket] feat: Next.js 설정 업데이트
pepperdad Jul 19, 2025
e5c3484
[ticket] feat: 홈 페이지 EventCard 컴포넌트 개선
pepperdad Jul 19, 2025
cfdc61e
[ticket] feat: 이벤트 페이지 이미지 캐러셀 컴포넌트 개선
pepperdad Jul 19, 2025
0da666a
[ticket] feat: 이벤트 페이지 FloatingSection 컴포넌트 개선
pepperdad Jul 19, 2025
87968e6
[ticket] style: SelectTicketModal 스타일 업데이트
pepperdad Jul 19, 2025
64841ef
[ticket] feat: 이벤트 페이지 EventInfo 컴포넌트 개선
pepperdad Jul 19, 2025
9e966e3
[ticket] feat: 이벤트 페이지 레이아웃 및 mock 데이터 업데이트
pepperdad Jul 19, 2025
585d00a
[ticket] feat: 주문 페이지 Toss 결제 위젯 개선
pepperdad Jul 19, 2025
959bdb8
[ticket] style: 이미지 캐러셀 컴포넌트 스타일 수정 및 반응형 레이아웃 개선
pepperdad Jul 19, 2025
ca104b8
[ticket] chore: 주석 추가
pepperdad Jul 19, 2025
90d4ecd
[ticket] style: EventCard 및 EventList 컴포넌트 스타일 수정 및 반응형 레이아웃 개선
pepperdad Jul 19, 2025
a9350f9
[design-system] fix: useIsMobile 훅 개선 및 스로틀 기능 추가
pepperdad Jul 19, 2025
3f14691
Merge pull request #52 from PERMIT-SEOUL/feat/#51
pepperdad Jul 19, 2025
8e4b36b
[ticket] feat: add EventInfoClient component for payment success page
pepperdad Jul 19, 2025
6555e29
[ticket] feat: add CtaButtonClient component for payment success page…
pepperdad Jul 19, 2025
fee6d93
[ticket] style: add styling for payment success page layout
pepperdad Jul 19, 2025
68b39d3
[ticket] refactor: update payment success page to use new client comp…
pepperdad Jul 19, 2025
b138289
[ticket] chore: 주석 처리 추가
pepperdad Jul 19, 2025
ecca80d
fix: 인터셉터에서 data 반환하도록 변경
pepperdad Jul 23, 2025
f477d65
fix: 응답 타입에서 code 필드 제거 및 데이터 구조 단순화
pepperdad Jul 23, 2025
d80e101
[ticket] feat: 토스 결제 위젯 데이터 연동 개선
pepperdad Jul 23, 2025
ed9c536
[ticket] feat: 결제 결과 페이지 UX 개선
pepperdad Jul 23, 2025
4fc99ba
[design-system] style: 다이얼로그 컴포넌트의 너비 조정 및 헤더 스타일 수정
pepperdad Jul 23, 2025
1d38748
[ticket] style: FloatingSection 컴포넌트의 버튼 스타일 수정 및 타이포그래피 적용
pepperdad Jul 23, 2025
7ccd818
[design-system] style: 다이얼로그 컴포넌트의 배경색을 $gray-900에서 $gray-800으로 변경
pepperdad Jul 23, 2025
5b4c567
[design-system] style: SCSS 변수의 따옴표 통일 및 색상 코드 소문자 변경
pepperdad Jul 23, 2025
6225c46
[ticket] chore: mock 예매 라운드의 가격 형식 및 이름 변경
pepperdad Jul 23, 2025
29a5558
[ticket] feat: 티켓 선택 모달에 수량 선택 기능 및 UI 개선 추가
pepperdad Jul 23, 2025
adb0d0f
[ticket] fix: 푸터 컴포넌트의 사업자 정보 업데이트
pepperdad Jul 23, 2025
e7b688f
[ticket] feat: 티켓 선택 모달에 eventId 추가
pepperdad Jul 23, 2025
084bb00
Merge pull request #55 from PERMIT-SEOUL/feat/#47
pepperdad Jul 23, 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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,5 @@ yarn-error.log*
# Misc
.DS_Store
*.pem

.cursor
6 changes: 5 additions & 1 deletion .husky/pre-push
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
#!/usr/bin/env sh
. "$(dirname "$0")/_/husky.sh"

pnpm lint
echo "🔍 Running lint..."
pnpm lint || exit 1

echo "🛠 Building project..."
pnpm build || exit 1
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
"editor.codeActionsOnSave": {
"source.fixAll.stylelint": "explicit"
},
"editor.defaultFormatter": "stylelint.vscode-stylelint"
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[sass]": {
"editor.codeActionsOnSave": {
Expand Down
35 changes: 35 additions & 0 deletions apps/ticket/next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,48 @@ import { withSentryConfig } from "@sentry/nextjs";
const nextConfig: NextConfig = {
async rewrites() {
// 요청 경로를 다른 경로에 매핑
// TODO: 확인
return [
{
source: "/sample",
destination: "/404",
},
];
},
webpack(config) {
// Grab the existing rule that handles SVG imports
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const fileLoaderRule = config.module.rules.find((rule: any) => rule.test?.test?.(".svg"));

config.module.rules.push(
// Reapply the existing rule, but only for svg imports ending in ?url
{
...fileLoaderRule,
test: /\.svg$/i,
resourceQuery: /url/, // *.svg?url
},
// Convert all other *.svg imports to React components
{
test: /\.svg$/i,
issuer: fileLoaderRule.issuer,
resourceQuery: { not: [...fileLoaderRule.resourceQuery.not, /url/] }, // exclude if *.svg?url
use: ["@svgr/webpack"],
},
);

// Modify the file loader rule to ignore *.svg, since we have it handled now.
fileLoaderRule.exclude = /\.svg$/i;

return config;
},
// FIXME: 이미지 cdn 도메인으로 수정
images: {
domains: [
"avatars.githubusercontent.com",
"scontent-icn2-1.cdninstagram.com",
"images.unsplash.com",
],
},
};

export default withSentryConfig(nextConfig, {
Expand Down
2 changes: 2 additions & 0 deletions apps/ticket/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"lint": "next lint"
},
"dependencies": {
"@permit/design-system": "workspace:*",
"@sentry/nextjs": "^9.33.0",
"@tanstack/react-query": "^5.80.10",
"@tanstack/react-query-devtools": "^5.80.10",
Expand All @@ -27,6 +28,7 @@
"devDependencies": {
"@eslint/eslintrc": "^3",
"@permit/eslint-config": "workspace:*",
"@svgr/webpack": "^8.1.0",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
Expand Down
Binary file added apps/ticket/public/assets/png/google_logo.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 apps/ticket/public/assets/png/kakao_logo.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 apps/ticket/public/assets/png/permit_logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
@use "@permit/design-system/styles/variables" as theme;

.container {
position: relative;
display: flex;
flex-direction: column;
gap: 16px;
width: 100%;

cursor: pointer;

transition: all 0.3s ease-in-out;

@media (min-width: 768px) {
max-width: 93px;

&.hovered {
.hovered_content {
opacity: 1;

pointer-events: auto;
}
}

&.dimmed {
.image_wrapper {
opacity: 0.5;
}

.display_number {
opacity: 0.5;
}
}

.mobile_title {
display: none;
}
}

@media (max-width: 768px) {
max-width: 375px;
margin: 0 auto;

.display_number {
display: none;
}

.hovered_content {
display: none;
}
}
}

.hovered_content {
display: none;

text-align: right;

@media (min-width: 768px) and (max-width: 1335px) {
position: fixed;
top: 110px;
right: 40px;
z-index: 10;
display: flex;
flex-direction: column;
gap: 16px;
width: 33.33vw;

opacity: 0;

transition: opacity 0.3s ease-in-out;

pointer-events: none;
}

@media (min-width: 1336px) {
position: fixed;
top: 110px;
right: 40px;
z-index: 10;
display: flex;
flex-direction: column;
gap: 16px;

opacity: 0;

transition: opacity 0.3s ease-in-out;

pointer-events: none;

.image_wrapper {
position: relative;
width: 447px;
}
}
}

.image_wrapper {
position: relative;
width: 100%;

transition: all 0.3s ease-in-out;
aspect-ratio: 93/125;
}

.display_number {
color: theme.$white;

transition: opacity 0.3s ease-in-out;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import { useState } from "react";
import Image from "next/image";
import Link from "next/link";
import classNames from "classnames/bind";

import { Flex, Typography } from "@permit/design-system";

import styles from "./index.module.scss";

const cx = classNames.bind(styles);

type EventCardProps = {
eventId: number;
imageUrl: string;
title: string;
displayNumber: string;
category: string;
onHover: (isHovered: boolean) => void;
isDimmed: boolean;
};

export const EventCardClient = ({
eventId,
imageUrl,
title,
displayNumber,
category,
onHover,
isDimmed,
}: EventCardProps) => {
const [isHovered, setIsHovered] = useState(false);

const handleMouseEnter = () => {
setIsHovered(true);
onHover(true);
};

const handleMouseLeave = () => {
setIsHovered(false);
onHover(false);
};

return (
<Link href={`/event/${eventId}`}>
<div
className={cx("container", { hovered: isHovered, dimmed: isDimmed })}
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
>
<Typography type="body16" weight="bold" className={cx("display_number")}>
{displayNumber}
</Typography>
<div className={cx("image_wrapper")}>
<Image src={imageUrl} alt={title} fill />
</div>
<Typography type="body14" weight="bold" className={cx("mobile_title")}>
{title}
</Typography>
<div className={cx("hovered_content")}>
<Flex gap={16}>
<Flex direction="column" gap={4}>
<Typography className={cx("category_name")} type="body14" weight="bold">
{category}
</Typography>
<Typography type="body14" weight="bold">
{title}
</Typography>
</Flex>
<div className={cx("image_wrapper")}>
<Image
className={cx("image")}
src={imageUrl}
alt={title}
fill
sizes="(min-width: 1336px) 447px, (min-width: 768px) 33.33vw, 100vw"
/>
</div>
</Flex>
</div>
</div>
</Link>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
.container {
display: flex;
flex-direction: column;

// Header 와 Footer 의 높이 합을 뺀 나머지 높이
min-height: calc(100vh - 102px - 80px);
padding: 0 40px;

@media (max-width: 768px) {
gap: 20px;
padding: 0 16px 20px;
}
}

.event_list {
display: grid;
grid-template-columns: repeat(auto-fill, 93px);
gap: 30px;
width: 100%;
margin-top: 240px;

@media (max-width: 768px) {
grid-template-columns: 1fr;
gap: 16px;
margin-top: 0;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
"use client";

import { useState } from "react";
import classNames from "classnames/bind";

import { CategoryList } from "../../_components/CategoryList";
import { EventWithCategory } from "../../_utils/types";
import { CATEGORIES, CATEGORY_LABELS, CategoryType } from "../../constants/category";
import { mockEventData } from "../../constants/mock";
import { useEventHover } from "../../hooks/useEventHover";
import { EventCardClient } from "../EventCardClient";
import styles from "./index.module.scss";

const cx = classNames.bind(styles);

export const EventListClient = () => {
const [selectedCategory, setSelectedCategory] = useState<CategoryType>(CATEGORIES.ALL);
const { handleEventHover, isEventDimmed } = useEventHover();

const handleCategoryClick = (category: CategoryType) => {
setSelectedCategory(category);
};

const getEventsWithCategory = (): EventWithCategory[] => {
if (selectedCategory === CATEGORIES.ALL) {
return Object.entries(mockEventData).flatMap(([category, events]) =>
events.map((event) => ({
...event,
category: category as CategoryType,
})),
);
}

return (
mockEventData[selectedCategory]?.map((event) => ({
...event,
category: selectedCategory,
})) ?? []
);
};

const filteredEvents = getEventsWithCategory();

return (
<div className={cx("container")}>
<CategoryList selectedCategory={selectedCategory} onClickCategory={handleCategoryClick} />
<div className={cx("event_list")}>
{filteredEvents.map((event: EventWithCategory, index: number) => {
const { eventId, eventName, thumbnailImageUrl, category } = event;
const displayNumber = String(index + 1).padStart(2, "0");

return (
<EventCardClient
key={eventId}
eventId={eventId}
imageUrl={thumbnailImageUrl}
title={eventName}
displayNumber={displayNumber}
category={CATEGORY_LABELS[category]}
onHover={(isHovered) => handleEventHover(eventId, isHovered)}
isDimmed={isEventDimmed(eventId)}
/>
);
})}
</div>
</div>
);
};
Loading