From 980d7a62f58a1397a7b1080995d0b3bae2d449b0 Mon Sep 17 00:00:00 2001 From: imnyang Date: Sun, 25 May 2025 14:41:18 +0900 Subject: [PATCH] =?UTF-8?q?=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/page.tsx | 6 ++++ src/components/Projects.tsx | 40 +++++++++++++++++++++++++++ src/components/ProjectsComponents.tsx | 38 +++++++++++++++++++++++++ src/index.css | 5 ++-- styles/globals.css | 4 +-- 5 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 src/components/Projects.tsx create mode 100644 src/components/ProjectsComponents.tsx diff --git a/src/app/page.tsx b/src/app/page.tsx index ff2f234..22995e9 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -3,6 +3,7 @@ import { useState, useEffect } from "react"; import Image from "@/profile.avif"; import Timeline from "@/components/TimeLine"; import Contact from "@/components/Contact"; +import Projects from "@/components/Projects"; export function Page() { const [age, setAge] = useState(0); @@ -104,6 +105,11 @@ export function Page() {
+ + +
+ +
diff --git a/src/components/Projects.tsx b/src/components/Projects.tsx new file mode 100644 index 0000000..0c0adb0 --- /dev/null +++ b/src/components/Projects.tsx @@ -0,0 +1,40 @@ +import ProjectsComponents from "./ProjectsComponents"; + +const projects = [ + { + name: "team-neko/two_hearts", + url: "https://chromewebstore.google.com/detail/fhbjjhpphmigcniggnhgoepaodgoobdk?utm_source=item-share-cb", + description: "Two Hearts는 Chrome 확장 프로그램으로, 새탭을 더 간단명료하게 보여줍니다.", + techStack: ["Bun", "Chrome", "TypeScript", "React"] + }, + { + name: "imnyang/today.isangjeong", + url: "https://github.com/imnyang/today.isangjeong", + description: "친구들과 간단하게 학교의 급식을 공유하기 위해 고안한 프로젝트입니다.\n원래 Python으로 작성되었지만 현재는 TypeScript로 재작성되었습니다.", + techStack: ["Bun", "TypeScript", "Instagram"] + }, + { + name: "team-neko/dynamic-kawaii", + url: "https://github.com/team-neko/dynamic-kawaii", + description: "Dynamic Kawaii는 Visual Studio Code의 몇 안되는 핑크색 다크모드입니다.", + techStack: ["VSCode", "json"] + }, + { + name: "imnyang/tsh", + url: "https://github.com/imnyang/tsh", + description: "tsh는 Rust로 작성된 CLI Trash Bin입니다.", + techStack: ["Rust", "trash"] + } +]; + +export default function Projects() { + return ( +
+
+ {projects.map((project, index) => ( + + ))} +
+
+ ) +} diff --git a/src/components/ProjectsComponents.tsx b/src/components/ProjectsComponents.tsx new file mode 100644 index 0000000..8204d30 --- /dev/null +++ b/src/components/ProjectsComponents.tsx @@ -0,0 +1,38 @@ +type Project = { + name: string; + url: string; + description: string; + techStack: string[]; +}; + +export default function ProjectsComponents({ project }: { project: Project }) { + return ( +
+
+

+ + {project.name} + +

+

+ {project.description.split('\n').map((line, idx) => ( + + {line} +
+
+ ))} +

+
+ {project.techStack.map((tech, idx) => ( + + {tech} + + ))} +
+
+
+ ); +} \ No newline at end of file diff --git a/src/index.css b/src/index.css index 357354d..dffe22c 100644 --- a/src/index.css +++ b/src/index.css @@ -1,5 +1,4 @@ -@import url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable-dynamic-subset.min.css"); - +@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans+KR&family=Noto+Color+Emoji&display=swap'); @import "../styles/globals.css"; @layer base { @@ -18,7 +17,7 @@ } * { - font-family: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif; + font-family: 'IBM Plex Sans KR', sans-serif; } .font-ntype { diff --git a/styles/globals.css b/styles/globals.css index 22c651b..f108d7a 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -16,7 +16,7 @@ --secondary: hsl(340 25% 95%); --secondary-foreground: hsl(240 5.9% 10%); --muted: hsl(340 20% 95%); - --muted-foreground: hsl(340 10% 40%); + --muted-foreground: hsl(340 10% 60%); --accent: hsl(340 25% 94%); --accent-foreground: hsl(240 5.9% 10%); --destructive: hsl(0 84.2% 60.2%); @@ -53,7 +53,7 @@ --secondary: hsl(296, 18%, 15%); --secondary-foreground: hsl(0 0% 98%); --muted: hsl(296, 18%, 15%); - --muted-foreground: hsl(240 5% 64.9%); + --muted-foreground: hsl(240 5% 68%); --accent: hsl(296, 18%, 15%); --accent-foreground: hsl(0 0% 98%); --destructive: hsl(0 62.8% 30.6%);