Skip to content

Commit 72ca508

Browse files
authored
Merge pull request #389 from mosu-dev/feature#388
Feature#388 학교대항전 이벤트 페이지 구현
2 parents e07913c + 10ae5b2 commit 72ca508

29 files changed

Lines changed: 1083 additions & 0 deletions

mosu-app/next.config.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ const nextConfig: NextConfig = {
2727
child_process: false,
2828
};
2929
}
30+
31+
config.module.rules.push({
32+
test: /\.svg$/i,
33+
use: ["@svgr/webpack"],
34+
});
35+
3036
return config;
3137
},
3238

mosu-app/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
"@storybook/nextjs": "^8.6.12",
7676
"@storybook/react": "^8.6.12",
7777
"@storybook/test": "^8.6.12",
78+
"@svgr/webpack": "^8.1.0",
7879
"@tailwindcss/postcss": "^4",
7980
"@testing-library/dom": "^10.4.0",
8081
"@testing-library/react": "^16.3.0",

mosu-app/src/@types/kakao.d.ts

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
declare namespace Kakao {
2+
function init(key: string): void;
3+
function isInitialized(): boolean;
4+
5+
namespace Share {
6+
// 기본 템플릿 공유 버튼 생성
7+
function createDefaultButton(options: DefaultButtonOptions): void;
8+
// 기본 템플릿 직접 발송
9+
function sendDefault(options: DefaultTemplate): void;
10+
11+
// 커스텀 템플릿 공유 버튼 생성
12+
function createCustomButton(options: CustomButtonOptions): void;
13+
// 커스텀 템플릿 직접 발송
14+
function sendCustom(options: CustomTemplate): void;
15+
16+
// 스크랩 공유 버튼 생성
17+
function createScrapButton(options: ScrapButtonOptions): void;
18+
// 스크랩 직접 발송
19+
function sendScrap(options: ScrapOptions): void;
20+
21+
// 이미지 업로드/스크랩/삭제
22+
function uploadImage(options: UploadImageOptions): Promise<UploadImageResponse>;
23+
function scrapImage(options: ScrapImageOptions): Promise<ScrapImageResponse>;
24+
function deleteImage(options: DeleteImageOptions): Promise<void>;
25+
}
26+
27+
interface LinkObject {
28+
mobileWebUrl: string;
29+
webUrl: string;
30+
androidExecutionParams?: string;
31+
iosExecutionParams?: string;
32+
}
33+
34+
interface ButtonObject {
35+
title: string;
36+
link: LinkObject;
37+
}
38+
39+
interface ContentObject {
40+
title: string;
41+
description?: string;
42+
imageUrl: string;
43+
link: LinkObject;
44+
}
45+
46+
interface ItemContentObject {
47+
profileText?: string;
48+
profileImageUrl?: string;
49+
titleImageUrl?: string;
50+
titleImageText?: string;
51+
titleImageCategory?: string;
52+
items?: Array<{ item: string; itemOp: string }>;
53+
sum?: string;
54+
sumOp?: string;
55+
}
56+
57+
interface SocialObject {
58+
likeCount?: number;
59+
commentCount?: number;
60+
sharedCount?: number;
61+
viewCount?: number;
62+
subscriberCount?: number;
63+
}
64+
65+
interface DefaultTemplate {
66+
objectType: "feed" | "list" | "location" | "commerce" | "text" | "calendar";
67+
content: ContentObject;
68+
itemContent?: ItemContentObject;
69+
social?: SocialObject;
70+
buttons?: ButtonObject[];
71+
text?: string;
72+
link?: LinkObject;
73+
serverCallbackArgs?: Record<string, string>;
74+
}
75+
76+
interface DefaultButtonOptions extends DefaultTemplate {
77+
container: string | HTMLElement;
78+
}
79+
80+
interface CustomTemplate {
81+
templateId: number;
82+
templateArgs?: Record<string, string>;
83+
serverCallbackArgs?: Record<string, string>;
84+
}
85+
86+
interface CustomButtonOptions extends CustomTemplate {
87+
container: string | HTMLElement;
88+
}
89+
90+
interface ScrapOptions {
91+
requestUrl: string;
92+
templateId?: number;
93+
templateArgs?: Record<string, string>;
94+
serverCallbackArgs?: Record<string, string>;
95+
}
96+
97+
interface ScrapButtonOptions extends ScrapOptions {
98+
container: string | HTMLElement;
99+
}
100+
101+
interface UploadImageOptions {
102+
file: FileList | File[];
103+
}
104+
interface UploadImageResponse {
105+
infos: {
106+
original: { url: string };
107+
[key: string]: { url: string };
108+
};
109+
}
110+
111+
interface ScrapImageOptions {
112+
imageUrl: string;
113+
}
114+
interface ScrapImageResponse {
115+
imageUrl: string;
116+
}
117+
118+
interface DeleteImageOptions {
119+
imageUrl: string;
120+
}
121+
}
122+
123+
declare global {
124+
interface Window {
125+
Kakao: typeof Kakao;
126+
}
127+
}
128+
129+
declare const Kakao: typeof Kakao;
130+
export = Kakao;
131+
export as namespace Kakao;
3.49 KB
Loading
3.56 KB
Loading
3.51 KB
Loading
Lines changed: 3 additions & 0 deletions
Loading
3.31 MB
Loading
173 KB
Loading
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
.rank_badge {
2+
display: flex;
3+
flex-direction: column;
4+
justify-content: center;
5+
align-items: center;
6+
7+
header {
8+
display: flex;
9+
10+
svg {
11+
scale: 1;
12+
@media (max-width: 1023px) {
13+
scale: 0.75;
14+
}
15+
@media (max-width: 768px) {
16+
scale: 0.5;
17+
}
18+
}
19+
20+
svg:first-child {
21+
transform: scaleX(-1);
22+
}
23+
24+
svg[data-rank="1"] {
25+
path {
26+
fill: #bcc9ff;
27+
}
28+
}
29+
30+
svg[data-rank="2"],
31+
svg[data-rank="3"] {
32+
path {
33+
fill: #a2ffff;
34+
}
35+
}
36+
37+
div {
38+
display: flex;
39+
flex-direction: column;
40+
justify-content: center;
41+
42+
img {
43+
@media (max-width: 1023px) {
44+
width: 3rem;
45+
height: 3rem;
46+
}
47+
@media (max-width: 768px) {
48+
width: 2rem;
49+
height: 2rem;
50+
}
51+
}
52+
53+
h2 {
54+
font-size: 1.75rem;
55+
font-weight: 700;
56+
text-align: center;
57+
color: #fff;
58+
}
59+
}
60+
}
61+
62+
footer {
63+
margin: 0rem 0;
64+
65+
h1 {
66+
font-size: 2rem;
67+
font-weight: 800;
68+
color: #fff;
69+
}
70+
h1:not([data-rank="1"]) {
71+
font-size: 1.75rem;
72+
}
73+
74+
@media (max-width: 1023px) {
75+
h1 {
76+
font-size: 1.5rem;
77+
}
78+
h1:not([data-rank="1"]) {
79+
font-size: 1.25rem;
80+
}
81+
}
82+
@media (max-width: 768px) {
83+
h1 {
84+
font-size: 1.25rem;
85+
}
86+
h1:not([data-rank="1"]) {
87+
font-size: 1rem;
88+
}
89+
}
90+
}
91+
}

0 commit comments

Comments
 (0)