diff --git a/index.html b/index.html index 139cd28..3b9b0fd 100644 --- a/index.html +++ b/index.html @@ -11,7 +11,7 @@ dataLayer.push(arguments); } gtag("js", new Date()); - gtag("config", import.meta.env.VITE_GOOGLE_ANALYTICS); + gtag("config", "%import.meta.env.VITE_GOOGLE_ANALYTICS%"); 2024 경북대 대동제, 하푸르나 diff --git a/src/assets/daegun.png b/src/assets/daegun.png new file mode 100644 index 0000000..b46b313 Binary files /dev/null and b/src/assets/daegun.png differ diff --git a/src/assets/donggun.png b/src/assets/donggun.png new file mode 100644 index 0000000..05e60c1 Binary files /dev/null and b/src/assets/donggun.png differ diff --git a/src/assets/dongpil.png b/src/assets/dongpil.png new file mode 100644 index 0000000..035756a Binary files /dev/null and b/src/assets/dongpil.png differ diff --git a/src/assets/hyoeun.png b/src/assets/hyoeun.png new file mode 100644 index 0000000..718a1c6 Binary files /dev/null and b/src/assets/hyoeun.png differ diff --git a/src/assets/jeongsik.png b/src/assets/jeongsik.png new file mode 100644 index 0000000..a498529 Binary files /dev/null and b/src/assets/jeongsik.png differ diff --git a/src/assets/jiwoong.png b/src/assets/jiwoong.png new file mode 100644 index 0000000..fd1b88c Binary files /dev/null and b/src/assets/jiwoong.png differ diff --git a/src/assets/junhyeok.png b/src/assets/junhyeok.png new file mode 100644 index 0000000..216728d Binary files /dev/null and b/src/assets/junhyeok.png differ diff --git a/src/components/display/Card.styled.ts b/src/components/display/Card.styled.ts new file mode 100644 index 0000000..4396616 --- /dev/null +++ b/src/components/display/Card.styled.ts @@ -0,0 +1,99 @@ +import styled from "styled-components"; + +export const SectionWrapper = styled.div` + background: #ffffff; + padding: 20px; + width: 70%; + margin-bottom: 30px; + + display: flex; + flex-direction: column; + align-items: center; + + border: 1px solid #d4d2e3; + border-radius: 24px; +`; + +export const TopSection = styled.div` + display: flex; + align-items: center; + width: 100%; +`; + +export const Photo = styled.img` + width: 70px; + height: 70px; + border-radius: 50%; + object-fit: cover; + margin-right: 20px; +`; + +export const MemberInfo = styled.div` + display: flex; + flex-direction: column; + gap: 2px; +`; + +export const MiddleSection = styled.div` + width: 100%; + padding: 10px 0; +`; + +export const Description = styled.div` + margin-top: 6px; + list-style: none; + padding-left: 0; + + li { + position: relative; + margin-bottom: 3px; + padding-left: 20px; + + &::before { + content: ""; + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%); + width: 6px; + height: 6px; + background-color: #adabc3; + border-radius: 50%; + } + } +`; + +export const BottomSection = styled.div` + width: 100%; + display: flex; + justify-content: flex-start; + flex-wrap: wrap; + padding: 0; +`; + +export const Contact = styled.div` + display: flex; + gap: 10px; + flex-wrap: wrap; +`; + +export const IconLink = styled.a` + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + padding: 5px 10px; + background-color: #f2f2f2; + border-radius: 20px; + color: #5d5a88; + text-decoration: none; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + font-family: "MesloLGS NF", monospace; +`; + +export const SocialIcon = styled.div` + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; +`; diff --git a/src/components/display/Card.tsx b/src/components/display/Card.tsx new file mode 100644 index 0000000..e66d1b5 --- /dev/null +++ b/src/components/display/Card.tsx @@ -0,0 +1,96 @@ +import { FaInstagram, FaLinkedin, FaGithub } from "react-icons/fa"; + +import { Text } from "../typography/Text"; +import { + SectionWrapper, + TopSection, + Photo, + MemberInfo, + MiddleSection, + Description, + BottomSection, + Contact, + IconLink, +} from "./Card.styled"; + +interface ICard { + name: string; + dept: string; + role: string; + photo: string; + description: string[]; + contact: { + instagram?: string; + linkedin?: string; + github?: string; + }; + team: string; +} + +const Card: React.FC = ({ photo, name, dept, role, description, contact }) => { + const instagramURL = contact.instagram ? `https://instagram.com/${contact.instagram}` : null; + const linkedinURL = contact.linkedin ? `https://linkedin.com/in/${contact.linkedin}` : null; + const githubURL = contact.github ? `https://github.com/${contact.github}` : null; + + return ( + <> + + + + + + {name} + + + {dept} + + + {role} + + + + + + {description.map((item, index) => ( +
  • + + {item} + +
  • + ))} +
    +
    + + + {instagramURL && ( + + + + {contact.instagram} + + + )} + {linkedinURL && ( + + + + {contact.linkedin} + + + )} + {githubURL && ( + + + + {contact.github} + + + )} + + +
    + + ); +}; + +export default Card; diff --git a/src/components/display/Countdown.tsx b/src/components/display/Countdown.tsx index f1b3be4..6ffbf38 100644 --- a/src/components/display/Countdown.tsx +++ b/src/components/display/Countdown.tsx @@ -28,7 +28,7 @@ export const Countdown: React.FC = ({ targetDate }) => { 축제까지 남은 시간 - + {displayTime} diff --git a/src/components/typography/Text.tsx b/src/components/typography/Text.tsx index 6c48ae9..6a72bb3 100644 --- a/src/components/typography/Text.tsx +++ b/src/components/typography/Text.tsx @@ -11,6 +11,8 @@ export const Text = styled.span` font-size: ${(props) => { switch (props.size) { + case "xxs": + return "12px"; case "xs": return "14px"; case "s": @@ -20,6 +22,8 @@ export const Text = styled.span` case "l": return "22px"; case "xl": + return "28px"; + case "xxl": return "40px"; default: return props.size; diff --git a/src/constants/contributors.json b/src/constants/contributors.json new file mode 100644 index 0000000..538f23d --- /dev/null +++ b/src/constants/contributors.json @@ -0,0 +1,81 @@ +[ + { + "name": "김대건", + "dept": "컴퓨터학부 20", + "role": "멋쟁이사자처럼 12기 회장", + "photo": "daegun", + "description": ["지도 페이지 개발", "기여한 부분 2", "기여한 부분 3"], + "contact": { + "instagram": "toothless.kid" + }, + "team": "Front-End" + }, + { + "name": "이효은", + "dept": "컴퓨터학부 21", + "role": "멋쟁이사자처럼 12기 운영진", + "photo": "hyoeun", + "description": ["웹 페이지 디자인", "", "기여한 부분 3"], + "contact": { + "instagram": "hyon__er" + }, + "team": "Front-End" + }, + { + "name": "조동필", + "dept": "컴퓨터학부 19", + "role": "멋쟁이사자처럼 12기 운영진", + "photo": "dongpil", + "description": ["웹 페이지 디자인", "기여한 부분 2", "기여한 부분 3"], + "contact": { + "instagram": "j0_dph" + }, + "team": "Front-End" + }, + { + "name": "채준혁", + "dept": "컴퓨터학부 21", + "role": "멋쟁이사자처럼 12기 운영진", + "photo": "junhyeok", + "description": ["메인 페이지 개발", "만든이들 페이지 개발 2", "웹 페이지 디자인"], + "contact": { + "instagram": "junyeokk_", + "linkedin": "junhyeokchae", + "github": "junyeokk" + }, + "team": "Front-End" + }, + { + "name": "이동건", + "dept": "컴퓨터학부 20", + "role": "멋쟁이사자처럼 12기 운영진", + "photo": "donggun", + "description": ["기여한 부분 1", "기여한 부분 2", "기여한 부분 3"], + "contact": { + "instagram": "thismovinggun" + }, + "team": "Back-End" + }, + { + "name": "전지웅", + "dept": "컴퓨터학부 19", + "role": "멋쟁이사자처럼 12기 운영진", + "photo": "jiwoong", + "description": ["기여한 부분 1", "기여한 부분 2", "기여한 부분 3"], + "contact": { + "instagram": "dnd._.hihi" + }, + "team": "Back-End" + }, + { + "name": "최정식", + "dept": "컴퓨터학부 21", + "role": "멋쟁이사자처럼 12기 운영진", + "photo": "jeongsik", + "description": ["기여한 부분 1", "기여한 부분 2", "기여한 부분 3"], + "contact": { + "instagram": "siksik__choi" + }, + "team": "Back-End" + } +] diff --git a/src/pages/ContributorPage.styled.ts b/src/pages/ContributorPage.styled.ts new file mode 100644 index 0000000..2e10a4f --- /dev/null +++ b/src/pages/ContributorPage.styled.ts @@ -0,0 +1,32 @@ +import styled from "styled-components"; + +export const DefaultGap = styled.div` + margin-top: 120px; +`; + +export const TextContainer = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-top: 50px; + text-align: center; + line-height: 1.5; + + span { + margin-bottom: 10px; + } +`; + +export const PositionContainer = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin: 40px 0; +`; + +export const PositionTextWrapper = styled.div` + margin-bottom: 20px; + font-family: "MesloLGS NF", monospace; +`; diff --git a/src/pages/ContributorPage.styled.tsx b/src/pages/ContributorPage.styled.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/pages/ContributorPage.tsx b/src/pages/ContributorPage.tsx index 741114b..749b976 100644 --- a/src/pages/ContributorPage.tsx +++ b/src/pages/ContributorPage.tsx @@ -1,3 +1,64 @@ +import { Text } from "@/components/typography/Text"; + +import daegun from "@/assets/daegun.png"; +import donggun from "@/assets/donggun.png"; +import dongpil from "@/assets/dongpil.png"; +import hyoeun from "@/assets/hyoeun.png"; +import jeongsik from "@/assets/jeongsik.png"; +import jiwoong from "@/assets/jiwoong.png"; +import junhyeok from "@/assets/junhyeok.png"; + +import contributors from "@/constants/contributors.json"; + +import Card from "../components/display/Card"; +import { DefaultGap, TextContainer, PositionContainer, PositionTextWrapper } from "./ContributorPage.styled"; + +const imageMap: { [key: string]: string } = { + daegun, + hyoeun, + dongpil, + junhyeok, + donggun, + jiwoong, + jeongsik, +}; +const teams = ["Front-End", "Back-End"]; + export default function ContributorPage() { - return <>; + const renderContributors = (team: string): JSX.Element[] => + contributors + .filter((contributor) => contributor.team === team) + .map((contributor, index) => ); + + return ( + <> + + + + + 만든이들 + + + 2024 경북대 대동제 홈페이지를 위해
    + 컴퓨터학부 멋쟁이사자처럼 운영진에서
    + 학생 분들의 편의를 위해 제작하게 되었습니다.
    +
    + 이번 축제가 오랜만에 이루어지는 만큼
    + 더 즐겁고 행복한 축제가 되셨으면 좋겠습니다. +
    +
    +
    + + {teams.map((team) => ( + + + + {team} + + + {renderContributors(team)} + + ))} + + ); } diff --git a/src/pages/HomePage.tsx b/src/pages/HomePage.tsx index 063b3fb..d1db25d 100644 --- a/src/pages/HomePage.tsx +++ b/src/pages/HomePage.tsx @@ -1,4 +1,4 @@ -import React, { useRef } from "react"; +import { useRef } from "react"; import { ButtonList } from "@/components/display/ButtonList"; import { Countdown } from "@/components/display/Countdown"; @@ -9,7 +9,7 @@ import { PageContainer, MainContent, StyledImage, ElementContainer } from "@/pag import mainPageImage from "@/assets/main_page.jpg"; -const HomePage: React.FC = () => { +export default function HomePage() { const quickAccessRef = useRef(null); const scrollToQuickAccess = () => { @@ -46,6 +46,4 @@ const HomePage: React.FC = () => { ); -}; - -export default HomePage; +} diff --git a/tsconfig.json b/tsconfig.json index a5b7112..d702beb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,31 +1,31 @@ { - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, - /* Folder Link */ - "baseUrl": ".", - "paths": { - "@/*": ["src/*"] - } - }, - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }] + /* Folder Link */ + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] }