@edu-tosel/design 1.0.132 → 1.0.134
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/layout/index.d.ts +1 -1
- package/layout/index.js +1 -1
- package/layout/template/BbsLayout.d.ts +2 -1
- package/layout/template/BbsLayout.js +4 -4
- package/layout/template/Event/Container.d.ts +18 -0
- package/layout/template/Event/Container.js +75 -0
- package/layout/template/Event/Layout.d.ts +5 -0
- package/layout/template/Event/Layout.js +5 -0
- package/layout/template/Event/index.d.ts +7 -0
- package/layout/template/Event/index.js +7 -0
- package/layout/template/Olympiad/Conditions.js +42 -6
- package/layout/template/Olympiad/Features.js +1 -1
- package/layout/template/Olympiad/Olympiad.layout.js +1 -0
- package/layout/template/Olympiad/Prizes.js +1 -1
- package/layout/template/home/Promotion.js +82 -31
- package/layout/template/home/Service.d.ts +0 -1
- package/layout/template/home/Service.js +86 -32
- package/layout/template/home/Shortcut.js +23 -6
- package/layout/template/home/layout/Carousel.js +8 -5
- package/layout/template/home/layout/Footer.js +34 -5
- package/layout/template/home/layout/Header.js +2 -1
- package/package.json +1 -1
- package/tailwind.config.ts +28 -1
- package/version.txt +1 -1
- package/layout/template/Promotion.d.ts +0 -5
- package/layout/template/Promotion.js +0 -5
- package/layout/template/promotion/Layout.d.ts +0 -1
- package/layout/template/promotion/Layout.js +0 -132
package/layout/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export { default as Announcement } from "./template/Announcement";
|
|
|
4
4
|
export { default as Archive } from "./template/Archive";
|
|
5
5
|
export { default as Home } from "./template/home";
|
|
6
6
|
export * from "./template/dashboard";
|
|
7
|
-
export { default as
|
|
7
|
+
export { default as Event } from "./template/Event";
|
|
8
8
|
export { default as Olympiad } from "./template/Olympiad";
|
|
9
9
|
export { default as Sign } from "./template/Sign";
|
|
10
10
|
export { default as DataField } from "./template/DataField";
|
package/layout/index.js
CHANGED
|
@@ -4,7 +4,7 @@ export { default as Announcement } from "./template/Announcement";
|
|
|
4
4
|
export { default as Archive } from "./template/Archive";
|
|
5
5
|
export { default as Home } from "./template/home";
|
|
6
6
|
export * from "./template/dashboard";
|
|
7
|
-
export { default as
|
|
7
|
+
export { default as Event } from "./template/Event";
|
|
8
8
|
export { default as Olympiad } from "./template/Olympiad";
|
|
9
9
|
export { default as Sign } from "./template/Sign";
|
|
10
10
|
export { default as DataField } from "./template/DataField";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export interface BbsLayoutProps {
|
|
2
2
|
title: string;
|
|
3
|
+
topRight?: React.ReactNode;
|
|
3
4
|
icon?: React.ReactNode;
|
|
4
5
|
children: React.ReactNode;
|
|
5
6
|
}
|
|
6
|
-
export default function BbsLayout({ title, icon, children }: BbsLayoutProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export default function BbsLayout({ title, icon, topRight, children, }: BbsLayoutProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { cn } from "../../util";
|
|
3
|
-
export default function BbsLayout({ title, icon, children }) {
|
|
3
|
+
export default function BbsLayout({ title, icon, topRight, children, }) {
|
|
4
4
|
const container = {
|
|
5
5
|
displays: "flex flex-col items-center",
|
|
6
6
|
sizes: "w-full min-h-screen",
|
|
@@ -10,9 +10,9 @@ export default function BbsLayout({ title, icon, children }) {
|
|
|
10
10
|
sizes: "w-full max-w-[1200px]",
|
|
11
11
|
};
|
|
12
12
|
const header = {
|
|
13
|
-
displays: "flex justify-
|
|
13
|
+
displays: "flex justify-between items-end",
|
|
14
14
|
sizes: "w-full h-[188px]",
|
|
15
|
-
boundaries: "
|
|
15
|
+
boundaries: "px-12 pb-10",
|
|
16
16
|
};
|
|
17
|
-
return (_jsx("div", { className: cn(container), children: _jsxs("div", { className: cn(body), children: [
|
|
17
|
+
return (_jsx("div", { className: cn(container), children: _jsxs("div", { className: cn(body), children: [_jsxs("div", { className: cn(header), children: [_jsxs("div", { className: "flex gap-x-5 items-center", children: [icon, _jsx("div", { className: "text-[40px] leading-none font-pretendard-bold text-green-dark", children: title })] }), topRight] }), children] }) }));
|
|
18
18
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Button as _Button } from "../../../interface";
|
|
2
|
+
type EventType = "event" | "notice";
|
|
3
|
+
interface Event {
|
|
4
|
+
id: number;
|
|
5
|
+
type: EventType;
|
|
6
|
+
thumbnail: string;
|
|
7
|
+
createdAt: string;
|
|
8
|
+
startedAt?: string;
|
|
9
|
+
expiredAt?: string;
|
|
10
|
+
endData?: string;
|
|
11
|
+
title: string;
|
|
12
|
+
content: string;
|
|
13
|
+
button?: _Button;
|
|
14
|
+
}
|
|
15
|
+
export default function Container({ events }: {
|
|
16
|
+
events: Event[];
|
|
17
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { IoIosSearch } from "react-icons/io";
|
|
4
|
+
import dayjs from "dayjs";
|
|
5
|
+
import { cn, isHTMLString } from "../../../util";
|
|
6
|
+
export default function Container({ events }) {
|
|
7
|
+
const [selectedEvent, setSelectedEvent] = useState(null);
|
|
8
|
+
const [filter, setFilter] = useState("모두보기");
|
|
9
|
+
const [searchQuery, setSearchQuery] = useState("");
|
|
10
|
+
const handleCardClick = (event) => {
|
|
11
|
+
setSelectedEvent(event);
|
|
12
|
+
};
|
|
13
|
+
const handleBackToList = () => {
|
|
14
|
+
setSelectedEvent(null);
|
|
15
|
+
};
|
|
16
|
+
const getStatusText = (event) => {
|
|
17
|
+
const now = dayjs();
|
|
18
|
+
const startedAt = dayjs(event.startedAt);
|
|
19
|
+
const expiredAt = event.expiredAt
|
|
20
|
+
? dayjs(event.expiredAt)
|
|
21
|
+
: dayjs(event.endData);
|
|
22
|
+
if (event.type === "event") {
|
|
23
|
+
if (event.expiredAt) {
|
|
24
|
+
if (now.isBefore(startedAt)) {
|
|
25
|
+
return (_jsx("span", { className: "px-2 py-1 text-2xs font-semibold rounded-md bg-green-dark text-white", children: "\uC624\uD508\uC608\uC815" }));
|
|
26
|
+
}
|
|
27
|
+
else if (now.isAfter(expiredAt)) {
|
|
28
|
+
return (_jsx("span", { className: "px-2 py-1 text-2xs font-semibold rounded-md bg-gray-light text-gray-mid", children: "\uB9C8\uAC10" }));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
const diff = expiredAt.diff(now, "day");
|
|
32
|
+
return (_jsxs("span", { className: "px-2 py-1 text-2xs font-semibold rounded-md bg-green-dark/10 text-green-dark", children: ["\uC9C4\uD589\uC911 | D-", diff] }));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
return (_jsx("div", { className: "w-[63px] h-[22px] rounded-md bg-black flex items-center justify-center", style: {
|
|
37
|
+
background: "linear-gradient(269deg, rgba(118, 0, 35, 0.10) 0%, rgba(16, 86, 82, 0.10) 100%)",
|
|
38
|
+
}, children: _jsx("div", { className: "px-2 py-1 text-2xs font-semibold rounded-md", style: {
|
|
39
|
+
background: "linear-gradient(269deg, rgba(118, 0, 35) 0%, rgba(16, 86, 82) 100%)",
|
|
40
|
+
WebkitBackgroundClip: "text",
|
|
41
|
+
WebkitTextFillColor: "transparent",
|
|
42
|
+
}, children: "\uC0C1\uC2DC \uC774\uBCA4\uD2B8" }) }));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else if (event.type === "notice") {
|
|
46
|
+
return (_jsx("span", { className: "px-2 py-1 text-2xs font-semibold rounded-md bg-blue-navy/10 text-blue-navy", children: "\uD1A0\uC140 \uC18C\uC2DD" }));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
return "";
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const filteredEvents = events
|
|
53
|
+
.filter((event) => {
|
|
54
|
+
const now = dayjs();
|
|
55
|
+
const startedAt = dayjs(event.startedAt);
|
|
56
|
+
const expiredAt = dayjs(event.expiredAt);
|
|
57
|
+
if (filter === "모두보기")
|
|
58
|
+
return true;
|
|
59
|
+
if (filter === "진행 중") {
|
|
60
|
+
return (event.startedAt && now.isAfter(startedAt) && now.isBefore(expiredAt));
|
|
61
|
+
}
|
|
62
|
+
if (filter === "예정된") {
|
|
63
|
+
return event.startedAt && now.isBefore(startedAt);
|
|
64
|
+
}
|
|
65
|
+
if (filter === "토셀소식")
|
|
66
|
+
return event.type === "notice";
|
|
67
|
+
return false;
|
|
68
|
+
})
|
|
69
|
+
.filter((event) => event.title.includes(searchQuery));
|
|
70
|
+
const button = () => ({
|
|
71
|
+
sizes: "w-full h-12 flex items-center justify-center rounded-md text-white cursor-pointer font-bold gap-3 text-sm xs:text-md",
|
|
72
|
+
backgrounds: "bg-gradient-to-l from-[#760023] to-[#105652]",
|
|
73
|
+
});
|
|
74
|
+
return (_jsx("div", { className: "min-h-screen w-full mx-auto", children: _jsx("div", { className: "mmd:max-w-300 h-full flex flex-col mx-auto px-10", children: selectedEvent ? (_jsxs("div", { className: "flex flex-col mmd:flex-row", children: [_jsx("div", { className: "min-w-[320px] h-auto p-5 mmd:sticky mmd:top-20 mmd:self-start", children: _jsxs("div", { className: "w-full h-auto rounded-xl sm:flex mmd:flex-col", children: [_jsx("div", { className: "w-full mmd:h-50 overflow-hidden", children: _jsx("img", { src: selectedEvent.thumbnail, alt: "", className: "rounded-xl h-full object-cover w-full" }) }), _jsxs("div", { className: "w-full h-auto pt-5 sm:p-5 mmd:p-0 mmd:pt-5 gap-3 flex flex-col", children: [_jsx("div", { className: "flex items-center", children: getStatusText(selectedEvent) }), _jsx("div", { className: "text-sm font-bold text-gray-dark flex items-center mb-2", children: selectedEvent.title }), selectedEvent.button && (_jsx("div", { onClick: selectedEvent.button.onClick, className: cn(button()), children: selectedEvent.button?.title }))] })] }, selectedEvent.id) }), _jsxs("div", { className: "flex-grow p-5", children: [_jsx("div", { children: isHTMLString(selectedEvent.content) ? (_jsx("div", { dangerouslySetInnerHTML: { __html: selectedEvent.content }, className: "w-full rounded-xl object-cover overflow-hidden" })) : (_jsx("div", { children: selectedEvent.content })) }), _jsx("button", { onClick: handleBackToList, className: "p-5 bg-green-dark/5 text-green-dark rounded-xl flex items-center justify-center hover:bg-green-dark/20 transition-all", children: "\uBAA9\uB85D\uC73C\uB85C \uB3CC\uC544\uAC00\uAE30" })] })] })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex flex-col sm:flex-row justify-between min-h-14.5 border-b-1", children: [_jsxs("div", { className: "w-full mb-5 h-9 sm:w-80 sm:h-9.5 flex items-center bg-[#f0f0f0]/10 rounded-xl", children: [_jsx(IoIosSearch, { className: "text-xl text-green-dark mr-3" }), _jsx("input", { type: "text", placeholder: "\uD0A4\uC6CC\uB4DC\uB97C \uC785\uB825\uD558\uC138\uC694.", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "w-full h-full text-sm bg-[#f0f0f0]/10 placeholder:text-[#7f7f7f] placeholder:font-light outline-none" })] }), _jsx("div", { className: "flex h-9 pb-5 sm:pb-0 sm:h-9.5 items-center sm:justify-center ", children: ["모두보기", "진행 중", "예정된", "토셀소식"].map((item) => (_jsx("div", { className: `text-xs sm:text-2xs md:text-xs p-2 sm:p-3 flex items-center justify-center cursor-pointer rounded-lg ${filter === item ? "bg-green-dark/10 text-green-dark" : ""}`, onClick: () => setFilter(item), children: item }, item))) })] }), _jsx("div", { className: "pt-5 flex grid sm:grid-cols-2 mmd:grid-cols-3 gap-5 rounded-xl", children: filteredEvents.map((event) => (_jsxs("div", { onClick: () => handleCardClick(event), className: "w-full max-h-84 shadow-md rounded-xl cursor-pointer box-shadow-green transition-all duration-500", children: [_jsx("div", { className: "w-full max-h-50 rounded-t-xl overflow-hidden relative", children: _jsx("img", { src: event.thumbnail, alt: "", className: "w-full" }) }), _jsxs("div", { className: "w-full min-h-34 p-8 gap-3 flex flex-col", children: [_jsx("div", { className: "flex items-center", children: getStatusText(event) }), _jsx("div", { className: "text-sm font-bold text-gray-dark flex items-center", children: event.title })] })] }, event.id))) })] })) }) }));
|
|
75
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import BbsLayout from "../BbsLayout";
|
|
3
|
+
export default function Layout({ topRight, children }) {
|
|
4
|
+
return (_jsx(BbsLayout, { title: "\uC774\uBCA4\uD2B8", topRight: topRight, icon: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "48", height: "48", viewBox: "0 0 48 48", fill: "none", children: _jsx("path", { d: "M42 22.5V39C42 39.7957 41.6839 40.5587 41.1213 41.1213C40.5587 41.6839 39.7956 42 39 42H10.5C9.70435 42 8.94129 41.6839 8.37868 41.1213C7.81607 40.5587 7.5 39.7957 7.5 39V22.5M24 9.75C24 8.71165 23.6921 7.69662 23.1152 6.83326C22.5383 5.9699 21.7184 5.29699 20.7591 4.89963C19.7998 4.50227 18.7442 4.39831 17.7258 4.60088C16.7074 4.80345 15.7719 5.30347 15.0377 6.03769C14.3035 6.77192 13.8034 7.70738 13.6009 8.72578C13.3983 9.74418 13.5023 10.7998 13.8996 11.7591C14.297 12.7184 14.9699 13.5383 15.8333 14.1152C16.6966 14.6921 17.7116 15 18.75 15H24M24 9.75V15M24 9.75C24 8.71165 24.3079 7.69662 24.8848 6.83326C25.4617 5.9699 26.2816 5.29699 27.2409 4.89963C28.2002 4.50227 29.2558 4.39831 30.2742 4.60088C31.2926 4.80345 32.2281 5.30347 32.9623 6.03769C33.6965 6.77192 34.1966 7.70738 34.3991 8.72578C34.6017 9.74418 34.4977 10.7998 34.1004 11.7591C33.703 12.7184 33.0301 13.5383 32.1667 14.1152C31.3034 14.6921 30.2884 15 29.25 15H24M24 15V42M6.75 22.5H42.75C43.992 22.5 45 21.492 45 20.25V17.25C45 16.008 43.992 15 42.75 15H6.75C5.508 15 4.5 16.008 4.5 17.25V20.25C4.5 21.492 5.508 22.5 6.75 22.5Z", stroke: "#105652", "stroke-width": "3", "stroke-linecap": "round", "stroke-linejoin": "round" }) }), children: children }));
|
|
5
|
+
}
|
|
@@ -1,11 +1,47 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { cn } from "../../../util";
|
|
3
3
|
export default function Conditions() {
|
|
4
4
|
const container = {
|
|
5
|
-
sizes: "w-full h-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
sizes: "w-full h-fit",
|
|
6
|
+
spacings: "my-20 lg:my-40",
|
|
7
|
+
displays: "flex flex-col justify-center items-center",
|
|
8
|
+
graphics: "antialiased",
|
|
9
|
+
text: "break-keep",
|
|
9
10
|
};
|
|
10
|
-
|
|
11
|
+
const cardPositioning = {
|
|
12
|
+
displays: "flex flex-nowrap",
|
|
13
|
+
sizes: "w-screen",
|
|
14
|
+
};
|
|
15
|
+
const cardWrapper = {
|
|
16
|
+
sizes: `w-full overflow-x-auto scroll-smooth scrollbar-hidden scroll-pl-4`,
|
|
17
|
+
display: "flex flex-nowrap vertical-top",
|
|
18
|
+
spacings: "p-5",
|
|
19
|
+
snap: "snap-x snap-mandatory scroll-ms-0",
|
|
20
|
+
};
|
|
21
|
+
const cardDeck = {
|
|
22
|
+
displays: "inline-flex",
|
|
23
|
+
spacings: "gap-5 ml:mr-[calc(100vw-1200px)]",
|
|
24
|
+
};
|
|
25
|
+
const ghostCard = {
|
|
26
|
+
sizes: "h-100 ",
|
|
27
|
+
displays: "flex",
|
|
28
|
+
spacings: "ms-0 ps-0 last:[calc(50vw-520px)]",
|
|
29
|
+
animations: "duration-300",
|
|
30
|
+
scroll: "snap-start last:snap-end",
|
|
31
|
+
};
|
|
32
|
+
//control size of the card
|
|
33
|
+
const card = {
|
|
34
|
+
graphics: "shadow-main",
|
|
35
|
+
sizes: "h-100 w-80 rounded-2xl",
|
|
36
|
+
backgrounds: "bg-red",
|
|
37
|
+
hover: "hover:shadow-main-hover",
|
|
38
|
+
position: "ml:translate-x-[calc(50vw-600px)]",
|
|
39
|
+
transition: "duration-200",
|
|
40
|
+
displays: "display-block",
|
|
41
|
+
};
|
|
42
|
+
const sectiontitle = {
|
|
43
|
+
textstyles: "text-xl text-center text-green-dark mb-10 font-pretendard-bold md:text-2xl",
|
|
44
|
+
animations: "duration-300",
|
|
45
|
+
};
|
|
46
|
+
return (_jsxs("div", { className: cn(container), children: [_jsx("div", { className: cn(sectiontitle), children: "\uD559\uC0DD\uC774\uB77C\uBA74 \uB204\uAD6C\uB098 \uB3C4\uC804\uD560 \uC218 \uC788\uC5B4\uC694" }), _jsx("div", { className: "h-0.5 w-1/4 mb-8 bg-green-dark rounded-lg" }), _jsx("div", { className: cn(cardPositioning), children: _jsx("div", { className: cn(cardWrapper), children: _jsxs("div", { className: cn(cardDeck), children: [_jsx("div", { className: cn(ghostCard), children: _jsx("div", { className: cn(card), children: "1" }) }), _jsx("div", { className: cn(ghostCard), children: _jsx("div", { className: cn(card), children: "1" }) }), _jsx("div", { className: cn(ghostCard), children: _jsx("div", { className: cn(card), children: "1" }) }), _jsx("div", { className: cn(ghostCard), children: _jsx("div", { className: cn(card), children: "1" }) }), _jsx("div", { className: cn(ghostCard), children: _jsx("div", { className: cn(card), children: "1" }) }), _jsx("div", { className: cn(ghostCard), children: _jsx("div", { className: cn(card), children: "1" }) }), _jsx("div", { className: cn(ghostCard), children: _jsx("div", { className: cn(card), children: "1" }) }), _jsx("div", { className: cn(ghostCard), children: _jsx("div", { className: cn(card), children: "1" }) }), _jsx("div", { className: cn(ghostCard), children: _jsx("div", { className: cn(card), children: "1" }) })] }) }) })] }));
|
|
11
47
|
}
|
|
@@ -23,7 +23,7 @@ export default function Features() {
|
|
|
23
23
|
sizes: "w-full h-fit max-w-md",
|
|
24
24
|
displays: "flex flex-col items-center md:grow",
|
|
25
25
|
spacings: "py-4",
|
|
26
|
-
animations: "duration-300",
|
|
26
|
+
animations: "duration-300 hover:scale-105",
|
|
27
27
|
};
|
|
28
28
|
const boxTitle = {
|
|
29
29
|
textstyles: "font-pretendard-bold text-lg text-center text-green-dark my-4 md:text-xl",
|
|
@@ -45,5 +45,5 @@ export default function Prizes() {
|
|
|
45
45
|
const prizeDetail = {
|
|
46
46
|
textstyles: "font-pretendard-medium",
|
|
47
47
|
};
|
|
48
|
-
return (_jsxs("div", { className: cn(container), children: [_jsx("div", { className: cn(medalHandler), children: _jsx("img", { src: "images/olympiad/img-oly-prize-medal.png", alt: "" }) }), _jsxs("div", { className: cn(sectionTitleBreaker), children: [_jsx("div", { className: cn(sectionTitle), children: "\uACE0\uB824\uB300\uD559\uAD50 \uAE30\uAD00\uC7A5\uC0C1\uC744" }), _jsx("div", { className: cn(sectionTitle), children: "\uC218\uC0C1\uD560 \uC218 \uC788\uB294 \uAE30\uD68C" })] }), _jsx("div", { className: "h-0.5 w-1/4 my-10 bg-green-dark rounded-lg" }), _jsx("div", { className: cn(prizeWrapper), children: _jsxs("div", { className: cn(prizeSet), children: [_jsx("div", { className: "px-8 max-w-lg flex flex-col md:max-w-2xl", children: _jsx("img", { src: "images/olympiad/img-oly-prize-certificate.png", alt: "\uCEF4\uD4E8\uD130\uB85C \uBB38\uC81C\uB97C \uD478\uB294 \uC5EC\uC131", className: "rounded-xl overflow-hidden shadow-
|
|
48
|
+
return (_jsxs("div", { className: cn(container), children: [_jsx("div", { className: cn(medalHandler), children: _jsx("img", { src: "images/olympiad/img-oly-prize-medal.png", alt: "" }) }), _jsxs("div", { className: cn(sectionTitleBreaker), children: [_jsx("div", { className: cn(sectionTitle), children: "\uACE0\uB824\uB300\uD559\uAD50 \uAE30\uAD00\uC7A5\uC0C1\uC744" }), _jsx("div", { className: cn(sectionTitle), children: "\uC218\uC0C1\uD560 \uC218 \uC788\uB294 \uAE30\uD68C" })] }), _jsx("div", { className: "h-0.5 w-1/4 my-10 bg-green-dark rounded-lg" }), _jsx("div", { className: cn(prizeWrapper), children: _jsxs("div", { className: cn(prizeSet), children: [_jsx("div", { className: "px-8 max-w-lg flex flex-col md:max-w-2xl", children: _jsx("img", { src: "images/olympiad/img-oly-prize-certificate.png", alt: "\uCEF4\uD4E8\uD130\uB85C \uBB38\uC81C\uB97C \uD478\uB294 \uC5EC\uC131", className: "rounded-xl overflow-hidden shadow-main hover:shadow-main-hover duration-300 hover:scale-105" }) }), _jsxs("div", { className: cn(prizeExplainWrapper), children: [_jsxs("div", { className: cn(prizeExplainSet), children: [_jsx("div", { className: cn(prizeTitle), children: "\uB300\uC0C1" }), _jsx("div", { className: cn(prizeDetail), children: "\uACE0\uB824\uB300\uD559\uAD50 \uACBD\uC601\uB300\uD559 \uD559\uC7A5\uC0C1" })] }), _jsxs("div", { className: cn(prizeExplainSet), children: [_jsx("div", { className: cn(prizeTitle), children: "\uAE08\uC0C1/\uC740\uC0C1/\uB3D9\uC0C1" }), _jsx("div", { className: cn(prizeDetail), children: "\uACE0\uB824\uB300\uD559\uAD50 \uC5B8\uC5B4\uC815\uBCF4\uC5F0\uAD6C\uC18C \uC18C\uC7A5\uC0C1" })] }), _jsxs("div", { className: cn(prizeExplainSet), children: [_jsx("div", { className: cn(prizeTitle), children: "\uC7A5\uB824\uC0C1" }), _jsx("div", { className: cn(prizeDetail), children: "\uACE0\uB824\uB300\uD559\uAD50 \uAD6D\uC81C\uD1A0\uC140\uC704\uC6D0\uD68C \uC704\uC6D0\uC7A5\uC0C1" })] })] })] }) })] }));
|
|
49
49
|
}
|
|
@@ -1,41 +1,92 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
2
|
+
import { cn } from "../../../util";
|
|
3
|
+
import { useRef } from "react";
|
|
4
4
|
export default function Promotion({ banners, option, }) {
|
|
5
5
|
const { className } = option ?? {};
|
|
6
|
+
const scrollContainerRef = useRef(null);
|
|
7
|
+
const cardWidth = 480; //card width
|
|
8
|
+
const handleScroll = (direction) => {
|
|
9
|
+
if (scrollContainerRef.current) {
|
|
10
|
+
const scrollAmount = cardWidth;
|
|
11
|
+
const currentScrollLeft = scrollContainerRef.current.scrollLeft;
|
|
12
|
+
const newScrollLeft = direction === "left"
|
|
13
|
+
? Math.max(currentScrollLeft - scrollAmount, 0)
|
|
14
|
+
: currentScrollLeft + scrollAmount;
|
|
15
|
+
scrollContainerRef.current.scrollTo({
|
|
16
|
+
left: newScrollLeft,
|
|
17
|
+
behavior: "smooth"
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
};
|
|
6
21
|
const container = {
|
|
7
|
-
positions: "relative",
|
|
22
|
+
positions: "relative z-10 group mt-20",
|
|
8
23
|
displays: "flex flex-col",
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
};
|
|
12
|
-
const
|
|
13
|
-
displays: "flex flex-row
|
|
14
|
-
sizes: "w-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
25
|
-
|
|
24
|
+
textstyles: "break-keep antialiased",
|
|
25
|
+
// test: "border-red-500 border-4",
|
|
26
|
+
};
|
|
27
|
+
const deckTitlePositioning = {
|
|
28
|
+
displays: "flex flex-row ml:justify-center ml:itmes-center",
|
|
29
|
+
sizes: "w-full",
|
|
30
|
+
};
|
|
31
|
+
const deckTitle = {
|
|
32
|
+
displays: "pl-5",
|
|
33
|
+
sizes: "max-w-300 w-full",
|
|
34
|
+
textstyles: "font-pretendard-var font-bold text-2xl text-green-dark",
|
|
35
|
+
};
|
|
36
|
+
const cardPositioning = {
|
|
37
|
+
displays: "flex flex-nowrap",
|
|
38
|
+
sizes: "w-screen",
|
|
39
|
+
};
|
|
40
|
+
const cardWrapper = {
|
|
41
|
+
sizes: "w-full overflow-x-auto scroll-smooth scrollbar-hidden scroll-px-4",
|
|
42
|
+
display: "flex flex-nowrap vertical-top",
|
|
43
|
+
spacings: "px-5 pt-4 md:pt-6 pb-12",
|
|
44
|
+
snap: "snap-x snap-mandatory scroll-ms-0",
|
|
45
|
+
};
|
|
46
|
+
//adjust the responsive right margin of scroller
|
|
47
|
+
const cardDeck = {
|
|
48
|
+
displays: "inline-flex",
|
|
49
|
+
spacings: "gap-5 ml:mr-[calc(100vw-1200px)]",
|
|
50
|
+
};
|
|
51
|
+
const buttonPositioning = {
|
|
52
|
+
displays: "hidden flex-row md:flex",
|
|
53
|
+
sizes: "w-full h-full",
|
|
54
|
+
spacings: "px-2",
|
|
55
|
+
positions: "absolute top-0 left-0 justify-between items-center opacity-0 group-hover:opacity-100 duration-300",
|
|
56
|
+
hovering: "group pointer-events-none",
|
|
57
|
+
};
|
|
58
|
+
const hoverButton = {
|
|
59
|
+
sizes: "rounded-full w-12 h-12 scale-50 group-hover:scale-100",
|
|
60
|
+
animation: "duration-300 ",
|
|
61
|
+
test: "bg-gray-medium/20 hover:bg-gray-medium/50 pointer-events-auto backdrop-blur-sm fill-red-500"
|
|
62
|
+
};
|
|
63
|
+
return (_jsxs("div", { className: cn(container), children: [_jsx("div", { className: cn(deckTitlePositioning), children: _jsx("div", { className: cn(deckTitle), children: "\uC0C8\uB85C\uC6B4 \uC18C\uC2DD" }) }), _jsx("div", { className: cn(cardPositioning), children: _jsx("div", { className: cn(cardWrapper), ref: scrollContainerRef, children: _jsx("div", { className: cn(cardDeck), children: banners.map((banner) => (_jsx(Banner, { ...banner }, banner.image.src))) }) }) }), _jsxs("div", { className: cn(buttonPositioning), children: [_jsx("div", { className: cn(hoverButton), onClick: () => handleScroll("left"), children: _jsx("img", { src: "images/home/handle-left.svg", alt: "" }) }), _jsx("div", { className: cn(hoverButton), onClick: () => handleScroll("right"), children: _jsx("img", { src: "images/home/handle-right.svg", alt: "" }) })] })] }));
|
|
26
64
|
}
|
|
27
65
|
function Banner({ image, option }) {
|
|
28
|
-
const { background
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
66
|
+
const { background } = option ?? {};
|
|
67
|
+
//ghost card snaps to the end of the viewport
|
|
68
|
+
const ghostCard = {
|
|
69
|
+
displays: "flex",
|
|
70
|
+
spacings: "ms-0 ps-0 ",
|
|
71
|
+
scroll: "snap-start",
|
|
72
|
+
};
|
|
73
|
+
//adjust the responsive left margin of scroller
|
|
74
|
+
//adjust the card size
|
|
75
|
+
const card = {
|
|
76
|
+
graphics: "shadow-main",
|
|
77
|
+
sizes: "w-65 h-40 xxxs:w-76 xxxs:h-47.5 md:w-120 md:h-75 rounded-2xl md:rounded-xl",
|
|
78
|
+
backgrounds: background,
|
|
79
|
+
hover: "hover:shadow-main-hover hover:scale-[1.03]",
|
|
80
|
+
position: "ml:translate-x-[calc(50vw-600px)]",
|
|
81
|
+
transition: "duration-300",
|
|
82
|
+
displays: "relative display-block overflow-hidden",
|
|
83
|
+
fonts: "font-pretendard-var"
|
|
35
84
|
};
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
85
|
+
const imageWrapper = {
|
|
86
|
+
sizes: "w-full h-full",
|
|
87
|
+
displays: "absolute",
|
|
88
|
+
positions: "bottom-0 left-0",
|
|
89
|
+
background: `bg-cover bg-center`
|
|
39
90
|
};
|
|
40
|
-
return (_jsx("div", { className: cn(
|
|
91
|
+
return (_jsx("div", { className: cn(ghostCard), children: _jsx("div", { className: cn(card), children: _jsx("div", { className: cn(imageWrapper), style: { backgroundImage: `url(${image?.src})` } }) }) }));
|
|
41
92
|
}
|
|
@@ -1,52 +1,106 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { useRef } from "react";
|
|
3
|
+
import { cn } from "../../../util";
|
|
3
4
|
export default function Service({ banners }) {
|
|
5
|
+
const scrollContainerRef = useRef(null);
|
|
6
|
+
const cardWidth = 400; // card width
|
|
7
|
+
const handleScroll = (direction) => {
|
|
8
|
+
if (scrollContainerRef.current) {
|
|
9
|
+
const scrollAmount = cardWidth;
|
|
10
|
+
const currentScrollLeft = scrollContainerRef.current.scrollLeft;
|
|
11
|
+
const newScrollLeft = direction === "left"
|
|
12
|
+
? Math.max(currentScrollLeft - scrollAmount, 0)
|
|
13
|
+
: currentScrollLeft + scrollAmount;
|
|
14
|
+
scrollContainerRef.current.scrollTo({
|
|
15
|
+
left: newScrollLeft,
|
|
16
|
+
behavior: "smooth",
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
};
|
|
4
20
|
const container = {
|
|
5
|
-
positions: "relative",
|
|
21
|
+
positions: "relative z-10 group",
|
|
6
22
|
displays: "flex flex-col",
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
textstyles: "break-keep antialiased",
|
|
24
|
+
// test: "border-red-500 border-4",
|
|
25
|
+
};
|
|
26
|
+
const deckTitlePositioning = {
|
|
27
|
+
displays: "flex flex-row ml:justify-center ml:itmes-center",
|
|
28
|
+
sizes: "w-full",
|
|
29
|
+
};
|
|
30
|
+
const deckTitle = {
|
|
31
|
+
displays: "pl-5",
|
|
32
|
+
sizes: "max-w-300 w-full",
|
|
33
|
+
textstyles: "font-pretendard-var font-bold text-2xl text-green-dark",
|
|
34
|
+
};
|
|
35
|
+
const cardPositioning = {
|
|
36
|
+
displays: "flex flex-nowrap",
|
|
37
|
+
sizes: "w-screen",
|
|
38
|
+
};
|
|
39
|
+
const cardWrapper = {
|
|
40
|
+
sizes: "w-full overflow-x-auto scroll-smooth scrollbar-hidden scroll-px-4",
|
|
41
|
+
display: "flex flex-nowrap vertical-top",
|
|
42
|
+
spacings: "px-5 pt-4 md:pt-6 pb-12",
|
|
43
|
+
snap: "snap-x snap-mandatory scroll-ms-0",
|
|
44
|
+
};
|
|
45
|
+
//adjust the responsive right margin of scroller
|
|
46
|
+
const cardDeck = {
|
|
47
|
+
displays: "inline-flex",
|
|
48
|
+
spacings: "gap-5 ml:mr-[calc(100vw-1200px)]",
|
|
49
|
+
};
|
|
50
|
+
const buttonPositioning = {
|
|
51
|
+
displays: "hidden flex-row md:flex",
|
|
52
|
+
sizes: "w-full h-full",
|
|
53
|
+
spacings: "px-2",
|
|
54
|
+
positions: "absolute top-0 left-0 justify-between items-center opacity-0 group-hover:opacity-100 duration-300",
|
|
55
|
+
hovering: "group pointer-events-none",
|
|
56
|
+
};
|
|
57
|
+
const hoverButton = {
|
|
58
|
+
sizes: "rounded-full w-12 h-12 scale-50 group-hover:scale-100",
|
|
59
|
+
animation: "duration-300 ",
|
|
60
|
+
test: "bg-gray-medium/20 hover:bg-gray-medium/50 pointer-events-auto backdrop-blur-sm fill-red-500",
|
|
61
|
+
};
|
|
62
|
+
return (_jsxs("div", { className: cn(container), children: [_jsx("div", { className: cn(deckTitlePositioning), children: _jsx("div", { className: cn(deckTitle), children: "\uD1A0\uC140\uC758 \uCC28\uBCC4\uD654\uB41C \uC11C\uBE44\uC2A4" }) }), _jsx("div", { className: cn(cardPositioning), children: _jsx("div", { className: cn(cardWrapper), ref: scrollContainerRef, children: _jsx("div", { className: cn(cardDeck), children: banners.map((banner) => (_jsx(Banner, { ...banner }, banner.titles.title))) }) }) }), _jsxs("div", { className: cn(buttonPositioning), children: [_jsx("div", { className: cn(hoverButton), onClick: () => handleScroll("left"), children: _jsx("img", { src: "images/home/handle-left.svg", alt: "" }) }), _jsx("div", { className: cn(hoverButton), onClick: () => handleScroll("right"), children: _jsx("img", { src: "images/home/handle-right.svg", alt: "" }) })] })] }));
|
|
23
63
|
}
|
|
24
64
|
function Banner({ titles, image, option }) {
|
|
25
65
|
const { background } = option ?? {};
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
displays: "flex
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
66
|
+
//ghost card snaps to the end of the viewport
|
|
67
|
+
const ghostCard = {
|
|
68
|
+
displays: "flex",
|
|
69
|
+
spacings: "ms-0 ps-0 ",
|
|
70
|
+
scroll: "snap-start",
|
|
71
|
+
};
|
|
72
|
+
//adjust the responsive left margin of scroller
|
|
73
|
+
//adjust the card size
|
|
74
|
+
const card = {
|
|
75
|
+
graphics: "shadow-main",
|
|
76
|
+
sizes: "h-100 w-65 xxxs:w-76 md:w-100 md:h-125 rounded-2xl md:rounded-xl",
|
|
77
|
+
backgrounds: background,
|
|
78
|
+
hover: "hover:shadow-main-hover hover:scale-[1.03]",
|
|
79
|
+
position: "ml:translate-x-[calc(50vw-600px)]",
|
|
80
|
+
transition: "duration-300",
|
|
81
|
+
displays: "relative display-block overflow-hidden",
|
|
82
|
+
fonts: "font-pretendard-var",
|
|
32
83
|
};
|
|
33
84
|
const titleBox = {
|
|
34
85
|
container: {
|
|
35
|
-
positions: "relative z-10",
|
|
36
|
-
|
|
86
|
+
positions: "relative flex flex-col z-10",
|
|
87
|
+
sizes: "w-full h-fit",
|
|
88
|
+
paddings: "p-7",
|
|
37
89
|
},
|
|
38
90
|
title: {
|
|
39
|
-
fonts: "text-
|
|
91
|
+
fonts: "text-xl font-bold md:text-2xl",
|
|
40
92
|
colors: titles.titleColor ?? "text-gray-dark ",
|
|
41
93
|
},
|
|
42
94
|
subtitle: {
|
|
43
|
-
fonts: "text-
|
|
95
|
+
fonts: "text-xs font-medium ",
|
|
44
96
|
colors: titles.subtitleColor ?? "text-gray-medium",
|
|
45
97
|
},
|
|
46
98
|
};
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
99
|
+
const imageWrapper = {
|
|
100
|
+
sizes: "w-full h-full",
|
|
101
|
+
displays: "absolute",
|
|
102
|
+
positions: "bottom-0 left-0",
|
|
103
|
+
background: `bg-cover bg-center`,
|
|
50
104
|
};
|
|
51
|
-
return (
|
|
105
|
+
return (_jsx("div", { className: cn(ghostCard), children: _jsxs("div", { className: cn(card), children: [_jsx("div", { className: cn(imageWrapper), style: { backgroundImage: `url(${image?.src})` } }), _jsxs("div", { className: cn(titleBox.container), children: [_jsx("div", { className: cn(titleBox.subtitle), children: titles.subtitle }), _jsx("div", { className: cn(titleBox.title), children: titles.title })] })] }) }));
|
|
52
106
|
}
|
|
@@ -2,14 +2,31 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { cn } from "../../../util";
|
|
3
3
|
export default function ShortcutBanner({ shortcuts, }) {
|
|
4
4
|
const container = {
|
|
5
|
-
displays: "flex
|
|
6
|
-
|
|
5
|
+
displays: "flex justify-center items-center",
|
|
6
|
+
spacings: "px-5 pt-16 pb-24"
|
|
7
|
+
};
|
|
8
|
+
const buttonWrapper = {
|
|
9
|
+
displays: "flex justify-center items-center flex-wrap",
|
|
10
|
+
sizes: "max-w-70 h-fit sm:max-w-full sm:w-full",
|
|
11
|
+
spacings: "gap-x-6 gap-y-4 xxxs:gap-x-10 sm:gap-x-6 md:gap-x-10",
|
|
12
|
+
graphics: "antialiased",
|
|
13
|
+
};
|
|
14
|
+
const buttonSet = {
|
|
15
|
+
displays: "group flex flex-col justify-center items-center",
|
|
16
|
+
sizes: "w-16 hover:scale-110",
|
|
17
|
+
animation: "duration-300",
|
|
18
|
+
spacings: "gap-2"
|
|
7
19
|
};
|
|
8
20
|
const tagBox = {
|
|
9
21
|
displays: "flex justify-center items-center",
|
|
10
|
-
sizes: "w-
|
|
11
|
-
fonts: "text-xs font-pretendard-
|
|
12
|
-
styles: "bg-gray-light rounded-md",
|
|
22
|
+
sizes: "w-full h-6.25 ",
|
|
23
|
+
fonts: "text-xs font-pretendard-var font-medium text-gray-medium group-hover:text-green-dark",
|
|
24
|
+
styles: "bg-gray-light/40 group-hover:bg-green-light rounded-md",
|
|
25
|
+
sapcings: "",
|
|
26
|
+
};
|
|
27
|
+
const iconContainer = {
|
|
28
|
+
sizes: "w-16 h-16 rounded-lg",
|
|
29
|
+
background: "group-hover:bg-gray-light/40"
|
|
13
30
|
};
|
|
14
|
-
return (_jsx("div", { className: cn(container), children: shortcuts.map((shortcut) => (_jsxs("button", { onClick: shortcut.onClick, className:
|
|
31
|
+
return (_jsx("div", { className: cn(container), children: _jsx("div", { className: cn(buttonWrapper), children: shortcuts.map((shortcut) => (_jsxs("button", { onClick: shortcut.onClick, className: cn(buttonSet), children: [_jsx("div", { className: cn(iconContainer), children: _jsx("img", { src: shortcut.icon, alt: shortcut.title }) }), _jsx("div", { className: cn(tagBox), children: shortcut.title })] }, shortcut.title))) }) }));
|
|
15
32
|
}
|
|
@@ -80,11 +80,14 @@ export default function Carousel({ contents, }) {
|
|
|
80
80
|
styles: "rounded-md",
|
|
81
81
|
};
|
|
82
82
|
const buttonBox = {
|
|
83
|
-
positions: !isMD && "absolute bottom-5 left-5 sm:bottom-10 sm:left-10",
|
|
84
83
|
animations: "duration-500",
|
|
85
|
-
displays: "justify-center items-center gap-1 flex",
|
|
86
|
-
sizes: "w-
|
|
87
|
-
paddings: "px-1.5 mt-12",
|
|
84
|
+
displays: "justify-center items-center gap-1 flex z-10",
|
|
85
|
+
sizes: "w-30 h-10 md:h-6.25 md:w-23.25 bg-gray-dark rounded-full",
|
|
86
|
+
paddings: "px-1.5 mt-0 mb-5 md:mt-12 ",
|
|
88
87
|
};
|
|
89
|
-
|
|
88
|
+
const buttonBoxPosition = {
|
|
89
|
+
display: "absolute flex justify-center items-center md:static md:justify-start",
|
|
90
|
+
sizes: "w-full h-fit left-0 bottom-0 z-10",
|
|
91
|
+
};
|
|
92
|
+
return (_jsx("div", { onClick: contents[index].onClick, className: cn(container), children: _jsxs("div", { className: cn(body), children: [_jsxs("div", { className: "duration-500 w-fit h-fit flex flex-col mt-4 xxs:mt-8 xxs:flex-row xxs:gap-8 md:flex-col md:flex-none md:w-72 md:pl-7.5 md:gap-6 md:mt-0", children: [_jsxs("div", { className: cn(titleSet), children: [_jsx("div", { className: cn(tagBox), children: tagString[tag.type] }), _jsx("div", { className: "font-pretendard-bold text-xl md:text-2xl", children: titles.title })] }), _jsx(LineBreaks, { className: "w-fit flex flex-col justify-center text-sm my-2 xxs:mt-0 md:text-base", texts: titles.subtitle }), _jsx("div", { className: cn(buttonBoxPosition), children: _jsxs("div", { className: cn(buttonBox), children: [_jsx("button", { onClick: handlePrev, className: "w-5 h-5 flex justify-center items-center", children: _jsx(SVG.Symbol.LessThan, {}) }), _jsxs("div", { className: "flex flex-row md:gap-2 gap-4 justify-center items-center", children: [_jsx("div", { className: "text-white w-2 text-sm", children: index + 1 }), _jsx("div", { className: "w-0.5 h-3 bg-gray-medium" }), _jsx("div", { className: "text-white w-2 text-sm", children: contents.length })] }), _jsx("button", { onClick: handleNext, className: "w-5 h-5 flex justify-center items-center", children: _jsx(SVG.Symbol.GreaterThan, {}) })] }) })] }), _jsx("div", { className: "h-full overflow-hidden w-fit", children: image && (_jsx(animated.img, { src: image, alt: "carousel-image", onLoad: () => setLoaded(true), className: "object-cover h-full z-0", style: transitionStyles })) })] }) }));
|
|
90
93
|
}
|
|
@@ -3,15 +3,44 @@ import { cn } from "../../../../util";
|
|
|
3
3
|
export default function Footer() {
|
|
4
4
|
const container = {
|
|
5
5
|
displays: "flex justify-center items-center",
|
|
6
|
-
sizes: "w-full h-
|
|
7
|
-
backgrounds: "bg-
|
|
8
|
-
|
|
6
|
+
sizes: "w-full h-fit",
|
|
7
|
+
backgrounds: "bg-[#FBFBFB]",
|
|
8
|
+
textstyles: "text-gray-medium font-pretendard-var text-sm break-keep antialiased",
|
|
9
9
|
};
|
|
10
10
|
const body = {
|
|
11
11
|
sizes: "w-full max-w-290",
|
|
12
|
-
paddings: "py-
|
|
12
|
+
paddings: "py-20 px-5",
|
|
13
13
|
};
|
|
14
|
-
|
|
14
|
+
const logoWrapper = {
|
|
15
|
+
displays: "flex flex-row gap-6",
|
|
16
|
+
};
|
|
17
|
+
const svgController = {
|
|
18
|
+
sizes: "h-8",
|
|
19
|
+
};
|
|
20
|
+
//general web info of TOSEL
|
|
21
|
+
const infoSet = {
|
|
22
|
+
diaplay: "flex flex-col gap-1 my-8 w-full",
|
|
23
|
+
};
|
|
24
|
+
const infoTitle = {
|
|
25
|
+
textstyling: "text-base font-bold",
|
|
26
|
+
};
|
|
27
|
+
const info = {
|
|
28
|
+
textstyling: "leading-normal text-sm",
|
|
29
|
+
};
|
|
30
|
+
//social button styling
|
|
31
|
+
const iconWrapper = {
|
|
32
|
+
displays: "flex items-center gap-3 mt-8",
|
|
33
|
+
};
|
|
34
|
+
const iconBox = {
|
|
35
|
+
sizes: "w-9 h-9 rounded-md",
|
|
36
|
+
displays: "flex justify-center items-center",
|
|
37
|
+
backgrounds: "bg-gray-medium/30 hover:bg-gray-medium",
|
|
38
|
+
animation: "duration-200"
|
|
39
|
+
};
|
|
40
|
+
const socialIconControl = {
|
|
41
|
+
siezes: "h-6",
|
|
42
|
+
};
|
|
43
|
+
return (_jsx("div", { className: cn(container), children: _jsxs("div", { className: cn(body), children: [_jsxs("div", { className: cn(logoWrapper), children: [_jsx("img", { className: cn(svgController), src: "/images/logos/logo-tosel-main.svg", alt: "" }), _jsx("img", { className: cn(svgController), src: "/images/logos/logo-itc-main.svg", alt: "" })] }), _jsxs("div", { className: "flex flex-wrap justify-between items-center border-b-1 border-gray-dark pb-4 mt-5 font-medium gap-y-1", children: [_jsx("div", { children: "Copyright TOSEL. \u24D2 All Rights Reserved." }), _jsx("div", { className: "flex gap-5", children: buttons.map((button, index) => (_jsx("div", { children: button.title }, index))) })] }), _jsxs("div", { className: cn(infoSet), children: [_jsx("div", { className: cn(infoTitle), children: "\uACE0\uAC1D\uBB38\uC758" }), _jsxs("div", { className: cn(info), children: ["\uB300\uD45C\uBC88\uD638 | 02-923-0505", _jsx("br", {}), " \uAC1C\uC778\uBB38\uC758 | tosel_cs@tosel.co.kr ", _jsx("br", {}), "\uB2E8\uCCB4\uBB38\uC758 | tosel_academy@tosel.co.kr"] })] }), _jsxs("div", { className: cn(infoSet), children: [_jsx("div", { className: cn(infoTitle), children: "\uAD6D\uC81C\uD1A0\uC140\uC704\uC6D0\uD68C" }), _jsxs("div", { className: cn(info), children: ["\uC6F9\uC11C\uBE44\uC2A4: \uC8FC\uC2DD\uD68C\uC0AC \uC5D0\uB4C0\uD1A0\uC140 | \uD1B5\uC2E0\uD310\uB9E4\uC5C5\uC2E0\uACE0\uBC88\uD638: \uC81C 2012-\uC11C\uC6B8\uC131\uBD81-0083\uD638", _jsx("br", {}), " \uC11C\uC6B8\uC2DC \uC131\uBD81\uAD6C \uC548\uC554\uB85C 145 \uACE0\uB824\uB300\uD559\uAD50 \uB77C\uC774\uC2DC\uC6C0 4\uCE35", _jsx("br", {}), " Lyceum Korea University, 145 Anam Ro, Seongbuk-Gu, Seoul, Korea 02841"] })] }), _jsxs("div", { className: cn(iconWrapper), children: [_jsx("a", { onClick: () => location.href = 'https://blog.naver.com/ebs1503', children: _jsx("div", { className: cn(iconBox), children: _jsx("img", { className: cn(socialIconControl), src: "/images/logos/naver.svg", alt: "" }) }) }), _jsx("a", { onClick: () => location.href = 'https://www.instagram.com/tosel_official/', children: _jsx("div", { className: cn(iconBox), children: _jsx("img", { className: cn(socialIconControl), src: "/images/logos/instagram.svg", alt: "" }) }) }), _jsx("a", { onClick: () => location.href = 'https://www.youtube.com/@tosel_official', children: _jsx("div", { className: cn(iconBox), children: _jsx("img", { className: cn(socialIconControl), src: "/images/logos/youtube.svg", alt: "" }) }) })] })] }) }));
|
|
15
44
|
}
|
|
16
45
|
const buttons = [
|
|
17
46
|
// {
|
|
@@ -6,7 +6,8 @@ export default function Header({ logo, rightButton, contents, }) {
|
|
|
6
6
|
positions: "fixed top-0 left-0 z-40",
|
|
7
7
|
displays: "flex justify-center items-center",
|
|
8
8
|
sizes: "w-full",
|
|
9
|
-
styles: "bg-white box-shadow
|
|
9
|
+
styles: "bg-white box-shadow",
|
|
10
|
+
textstyles: "antialiased",
|
|
10
11
|
};
|
|
11
12
|
const body = {
|
|
12
13
|
displays: "flex items-center justify-center md:justify-between",
|
package/package.json
CHANGED
package/tailwind.config.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import tailwindcssAnimate from "tailwindcss-animate";
|
|
2
2
|
import type { Config } from "tailwindcss";
|
|
3
|
+
import type { PluginAPI } from "tailwindcss/types/config";
|
|
3
4
|
|
|
4
5
|
// import twElements from "tw-elements/dist/plugin";
|
|
5
6
|
// import tailwindcssDirectionalShadows from "tailwindcss-directional-shadows";
|
|
@@ -26,6 +27,13 @@ export default {
|
|
|
26
27
|
backgroundImage: {
|
|
27
28
|
"image-space": "url('/images/space/space.png')",
|
|
28
29
|
},
|
|
30
|
+
scrollbar: {
|
|
31
|
+
hidden: "hidden",
|
|
32
|
+
},
|
|
33
|
+
boxShadow: {
|
|
34
|
+
main: "0 2px 10px 0px rgba(0, 0, 0, 0.14)",
|
|
35
|
+
"main-hover": "0 10px 12px 0px rgba(0, 0, 0, 0.3)",
|
|
36
|
+
},
|
|
29
37
|
keyframes: {
|
|
30
38
|
slideBackground: {
|
|
31
39
|
"0%, 100%": { backgroundPosition: "left center" },
|
|
@@ -622,6 +630,25 @@ export default {
|
|
|
622
630
|
pattern: /delay-.*/,
|
|
623
631
|
},
|
|
624
632
|
],
|
|
625
|
-
plugins: [
|
|
633
|
+
plugins: [
|
|
634
|
+
tailwindcssAnimate,
|
|
635
|
+
function ({ addUtilities }: PluginAPI) {
|
|
636
|
+
addUtilities(
|
|
637
|
+
{
|
|
638
|
+
".scrollbar-hidden::-webkit-scrollbar": {
|
|
639
|
+
display: "none", // For WebKit browsers
|
|
640
|
+
},
|
|
641
|
+
".scrollbar-hidden": {
|
|
642
|
+
"-ms-overflow-style": "none", // For Internet Explorer and Edge
|
|
643
|
+
"scrollbar-width": "none", // For Firefox
|
|
644
|
+
},
|
|
645
|
+
},
|
|
646
|
+
{
|
|
647
|
+
respectPrefix: false,
|
|
648
|
+
respectImportant: false,
|
|
649
|
+
}
|
|
650
|
+
);
|
|
651
|
+
},
|
|
652
|
+
],
|
|
626
653
|
darkMode: "selector",
|
|
627
654
|
} satisfies Config;
|
package/version.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.0.
|
|
1
|
+
1.0.134
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default function Layout(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useState } from "react";
|
|
3
|
-
import { IoIosSearch } from "react-icons/io";
|
|
4
|
-
import dayjs from "dayjs";
|
|
5
|
-
import { BsCreditCard } from "react-icons/bs";
|
|
6
|
-
export default function Layout() {
|
|
7
|
-
const eventsData = [
|
|
8
|
-
{
|
|
9
|
-
id: 1,
|
|
10
|
-
img: "/images/promotion/promotion1.png",
|
|
11
|
-
type: "0",
|
|
12
|
-
startDate: "2024-05-01",
|
|
13
|
-
endDate: "2024-12-31",
|
|
14
|
-
title: "5월 토셀 랩 세미나 개최",
|
|
15
|
-
body: "https://www.tosel.org/uploads/book-info-img/1697164321986Listening-Series_Pre-Starter.png",
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
id: 2,
|
|
19
|
-
img: "/images/promotion/promotion2.png",
|
|
20
|
-
type: "0",
|
|
21
|
-
regDate: "2024-09-01",
|
|
22
|
-
startDate: "2024-09-01",
|
|
23
|
-
endDate: "2024-09-30",
|
|
24
|
-
title: "83회 명예의 전당 등재자라면? 지금 바로 인터뷰에 참여해보세요",
|
|
25
|
-
body: "https://www.tosel.org/uploads/book-info-img/1697164321986Listening-Series_Pre-Starter.png",
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
id: 3,
|
|
29
|
-
img: "/images/promotion/promotion3.png",
|
|
30
|
-
type: "1",
|
|
31
|
-
regDate: "2024-09-01",
|
|
32
|
-
startDate: "0000-00-00",
|
|
33
|
-
endDate: "0000-00-00",
|
|
34
|
-
title: "소셜 로그인 이벤트! 네이버 계정 연동하고 쿠폰 받아가세요",
|
|
35
|
-
body: "https://www.tosel.org/uploads/book-info-img/1697164321986Listening-Series_Pre-Starter.png",
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
id: 4,
|
|
39
|
-
img: "/images/promotion/promotion4.png",
|
|
40
|
-
type: "2",
|
|
41
|
-
regDate: "2024-09-01",
|
|
42
|
-
startDate: "0000-00-00",
|
|
43
|
-
endDate: "0000-00-00",
|
|
44
|
-
title: "인사혁신처, 지방공기업 등에 TOSEL 확대 적용 발표",
|
|
45
|
-
body: "https://www.tosel.org/uploads/book-info-img/1697164321986Listening-Series_Pre-Starter.png",
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
id: 5,
|
|
49
|
-
img: "/images/promotion/promotion5.png",
|
|
50
|
-
type: "0",
|
|
51
|
-
regDate: "2024-09-01",
|
|
52
|
-
startDate: "2024-10-01",
|
|
53
|
-
endData: "2024-10-31",
|
|
54
|
-
title: "24년도 하반기 고려대학교 미래교육원 토셀 전문가 과정 모집",
|
|
55
|
-
body: "https://www.tosel.org/uploads/book-info-img/1697164321986Listening-Series_Pre-Starter.png",
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
id: 6,
|
|
59
|
-
img: "/images/promotion/promotion6.png",
|
|
60
|
-
type: "2",
|
|
61
|
-
regDate: "2024-09-01",
|
|
62
|
-
startDate: "0000-00-00",
|
|
63
|
-
endDate: "0000-00-00",
|
|
64
|
-
title: "토셀, 경찰대학교 편입학전형 / 졸업인증 평가 반영",
|
|
65
|
-
body: "https://www.tosel.org/uploads/book-info-img/1697164321986Listening-Series_Pre-Starter.png",
|
|
66
|
-
},
|
|
67
|
-
];
|
|
68
|
-
const [selectedEvent, setSelectedEvent] = useState(null);
|
|
69
|
-
const [filter, setFilter] = useState("모두보기");
|
|
70
|
-
const [searchQuery, setSearchQuery] = useState("");
|
|
71
|
-
const handleCardClick = (event) => {
|
|
72
|
-
setSelectedEvent(event);
|
|
73
|
-
};
|
|
74
|
-
const handleBackToList = () => {
|
|
75
|
-
setSelectedEvent(null);
|
|
76
|
-
};
|
|
77
|
-
const getStatusText = (event) => {
|
|
78
|
-
const now = dayjs();
|
|
79
|
-
const startDate = dayjs(event.startDate);
|
|
80
|
-
const endDate = event.endDate ? dayjs(event.endDate) : dayjs(event.endData);
|
|
81
|
-
if (event.type === "0") {
|
|
82
|
-
if (now.isBefore(startDate)) {
|
|
83
|
-
return (_jsx("span", { className: "px-2 py-1 text-2xs font-semibold rounded-md bg-green-dark text-white", children: "\uC624\uD508\uC608\uC815" }));
|
|
84
|
-
}
|
|
85
|
-
else if (now.isAfter(endDate)) {
|
|
86
|
-
return (_jsx("span", { className: "px-2 py-1 text-2xs font-semibold rounded-md bg-gray-light text-gray-mid", children: "\uB9C8\uAC10" }));
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
const diff = endDate.diff(now, "day");
|
|
90
|
-
return (_jsxs("span", { className: "px-2 py-1 text-2xs font-semibold rounded-md bg-green-dark/10 text-green-dark", children: ["\uC9C4\uD589\uC911 | D-", diff] }));
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
else if (event.type === "1") {
|
|
94
|
-
return (_jsx("div", { className: "w-[63px] h-[22px] rounded-md bg-black flex items-center justify-center", style: {
|
|
95
|
-
background: "linear-gradient(269deg, rgba(118, 0, 35, 0.10) 0%, rgba(16, 86, 82, 0.10) 100%)",
|
|
96
|
-
}, children: _jsx("div", { className: "px-2 py-1 text-2xs font-semibold rounded-md", style: {
|
|
97
|
-
background: "linear-gradient(269deg, rgba(118, 0, 35) 0%, rgba(16, 86, 82) 100%)",
|
|
98
|
-
WebkitBackgroundClip: "text",
|
|
99
|
-
WebkitTextFillColor: "transparent",
|
|
100
|
-
}, children: "\uC0C1\uC2DC \uC774\uBCA4\uD2B8" }) }));
|
|
101
|
-
}
|
|
102
|
-
else if (event.type === "2") {
|
|
103
|
-
return (_jsx("span", { className: "px-2 py-1 text-2xs font-semibold rounded-md bg-blue-navy/10 text-blue-navy", children: "\uD1A0\uC140 \uC18C\uC2DD" }));
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
return "";
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
const filteredEvents = eventsData
|
|
110
|
-
.filter((event) => {
|
|
111
|
-
const now = dayjs();
|
|
112
|
-
const startDate = dayjs(event.startDate);
|
|
113
|
-
const endDate = event.endDate
|
|
114
|
-
? dayjs(event.endDate)
|
|
115
|
-
: dayjs(event.endData);
|
|
116
|
-
if (filter === "모두보기")
|
|
117
|
-
return true;
|
|
118
|
-
if (filter === "진행 중") {
|
|
119
|
-
return (event.type === "0" && now.isAfter(startDate) && now.isBefore(endDate));
|
|
120
|
-
}
|
|
121
|
-
if (filter === "예정된") {
|
|
122
|
-
return event.type === "0" && now.isBefore(startDate);
|
|
123
|
-
}
|
|
124
|
-
if (filter === "토셀소식")
|
|
125
|
-
return event.type === "2";
|
|
126
|
-
return false;
|
|
127
|
-
})
|
|
128
|
-
.filter((event) => event.title.includes(searchQuery));
|
|
129
|
-
return (_jsxs("div", { className: "min-h-screen w-full mx-auto", children: [_jsx("img", { src: "/images/promotion/promotionHeader.png", alt: "" }), _jsx("div", { className: "mmd:max-w-300 h-full flex flex-col mx-auto px-10", children: selectedEvent ? (_jsxs("div", { className: "flex flex-col mmd:flex-row", children: [_jsx("div", { className: "min-w-[320px] h-auto p-5 mmd:sticky mmd:top-20 mmd:self-start", children: _jsxs("div", { className: "w-full h-auto rounded-xl sm:flex mmd:flex-col", children: [_jsx("div", { className: "w-full mmd:h-50 overflow-hidden", children: _jsx("img", { src: selectedEvent.img, alt: "", className: "rounded-xl h-full object-cover w-full" }) }), _jsxs("div", { className: "w-full h-auto pt-5 sm:p-5 mmd:p-0 mmd:pt-5 gap-3 flex flex-col", children: [_jsx("div", { className: "flex items-center", children: getStatusText(selectedEvent) }), _jsx("div", { className: "text-sm font-bold text-gray-dark flex items-center mb-2", children: selectedEvent.title }), _jsxs("div", { className: "w-full h-12 flex items-center justify-center rounded-md text-white cursor-pointer font-bold gap-3 text-sm xs:text-md", style: {
|
|
130
|
-
background: "linear-gradient(269deg, rgba(118, 0, 35) 0%, rgba(16, 86, 82) 100%)",
|
|
131
|
-
}, children: [_jsx(BsCreditCard, { className: "text-lg xs:text-xl" }), "\uC5F0\uB3D9\uD558\uACE0 \uCFE0\uD3F0\uBC1B\uAE30"] })] })] }, selectedEvent.id) }), _jsxs("div", { className: "flex-grow p-5", children: [_jsx("div", { children: _jsx("img", { src: selectedEvent.body, className: "w-full rounded-xl object-cover", alt: "" }) }), _jsx("button", { onClick: handleBackToList, className: "p-5 bg-green-dark/5 text-green-dark rounded-xl flex items-center justify-center hover:bg-green-dark/20 transition-all", children: "\uBAA9\uB85D\uC73C\uB85C \uB3CC\uC544\uAC00\uAE30" })] })] })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex flex-col sm:flex-row justify-between min-h-14.5 border-b-1", children: [_jsxs("div", { className: "w-full mb-5 h-9 sm:w-80 sm:h-9.5 flex items-center bg-[#f0f0f0]/10 rounded-xl", children: [_jsx(IoIosSearch, { className: "text-xl text-green-dark mr-3" }), _jsx("input", { type: "text", placeholder: "\uD0A4\uC6CC\uB4DC\uB97C \uC785\uB825\uD558\uC138\uC694.", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "w-full h-full text-sm bg-[#f0f0f0]/10 placeholder:text-[#7f7f7f] placeholder:font-light outline-none" })] }), _jsx("div", { className: "flex h-9 pb-5 sm:pb-0 sm:h-9.5 items-center sm:justify-center ", children: ["모두보기", "진행 중", "예정된", "토셀소식"].map((item) => (_jsx("div", { className: `text-xs sm:text-2xs md:text-xs p-2 sm:p-3 flex items-center justify-center cursor-pointer rounded-lg ${filter === item ? "bg-green-dark/10 text-green-dark" : ""}`, onClick: () => setFilter(item), children: item }, item))) })] }), _jsx("div", { className: "pt-5 flex grid sm:grid-cols-2 mmd:grid-cols-3 gap-5 rounded-xl", children: filteredEvents.map((event) => (_jsxs("div", { onClick: () => handleCardClick(event), className: "w-full max-h-84 shadow-md rounded-xl cursor-pointer box-shadow-green transition-all duration-500", children: [_jsx("div", { className: "w-full max-h-50 rounded-t-xl overflow-hidden relative", children: _jsx("img", { src: event.img, alt: "", className: "w-full" }) }), _jsxs("div", { className: "w-full min-h-34 p-8 gap-3 flex flex-col", children: [_jsx("div", { className: "flex items-center", children: getStatusText(event) }), _jsx("div", { className: "text-sm font-bold text-gray-dark flex items-center", children: event.title })] })] }, event.id))) })] })) })] }));
|
|
132
|
-
}
|