From 37aa4218cbabf53b32a89b97d02bd41c1e7677da Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EA=B9=80=ED=95=98=EC=9D=80?=
<117327533+hankim0904@users.noreply.github.com>
Date: Tue, 30 Apr 2024 10:48:57 +0900
Subject: [PATCH] =?UTF-8?q?Refactor:=20=EC=8A=A4=ED=83=9D=20=EC=95=84?=
=?UTF-8?q?=EC=9D=B4=EC=BD=98=20svg=20sprite=20=EC=A0=81=EC=9A=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
co-kkiri/.prettierrc.json | 11 +-
co-kkiri/src/App.tsx | 4 +-
.../commons/GlobalStackSvgSprite.tsx | 401 ++++++++++++++++++
co-kkiri/src/components/commons/Stack.tsx | 6 +-
co-kkiri/src/constants/stacks.ts | 63 +--
co-kkiri/vite.config.ts | 4 +-
6 files changed, 453 insertions(+), 36 deletions(-)
create mode 100644 co-kkiri/src/components/commons/GlobalStackSvgSprite.tsx
diff --git a/co-kkiri/.prettierrc.json b/co-kkiri/.prettierrc.json
index 2401b0ca..31b3c61e 100644
--- a/co-kkiri/.prettierrc.json
+++ b/co-kkiri/.prettierrc.json
@@ -6,5 +6,14 @@
"useTabs": false,
"tabWidth": 2,
"bracketSameLine": true,
- "endOfLine": "auto"
+ "endOfLine": "auto",
+ "overrides": [
+ {
+ "files": "./src/constants/stacks.ts",
+ "options": {
+ "quoteProps": "preserve",
+ "printWidth": 300
+ }
+ }
+ ]
}
diff --git a/co-kkiri/src/App.tsx b/co-kkiri/src/App.tsx
index f2cef273..bc8daddb 100644
--- a/co-kkiri/src/App.tsx
+++ b/co-kkiri/src/App.tsx
@@ -3,6 +3,7 @@ import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
import GlobalStyles from "./styles/globals";
import PageRouter from "./PageRouter";
import Toasts from "./components/commons/Widgets/Toast";
+import { GlobalStackSvgSprite } from "./components/commons/GlobalStackSvgSprite";
const queryClient = new QueryClient({
defaultOptions: {
@@ -19,7 +20,8 @@ function App() {
-
+
+
>
);
diff --git a/co-kkiri/src/components/commons/GlobalStackSvgSprite.tsx b/co-kkiri/src/components/commons/GlobalStackSvgSprite.tsx
new file mode 100644
index 00000000..655a0568
--- /dev/null
+++ b/co-kkiri/src/components/commons/GlobalStackSvgSprite.tsx
@@ -0,0 +1,401 @@
+import { createPortal } from "react-dom";
+
+const stackSvgSpriteCode = (
+
+);
+
+export function GlobalStackSvgSprite() {
+ return createPortal(stackSvgSpriteCode, document.body);
+}
diff --git a/co-kkiri/src/components/commons/Stack.tsx b/co-kkiri/src/components/commons/Stack.tsx
index 5001652c..350d47fb 100644
--- a/co-kkiri/src/components/commons/Stack.tsx
+++ b/co-kkiri/src/components/commons/Stack.tsx
@@ -20,7 +20,9 @@ export default function Stack({ stack, className }: StackProps) {
return (
-
+
+
+
);
}
@@ -40,7 +42,7 @@ const Background = styled.div`
justify-content: center;
`;
-const Icon = styled.img`
+const Icon = styled.svg`
width: 100%; /* 컨테이너 너비에 맞춤 */
height: 100%; /* 컨테이너 높이에 맞춤 */
object-fit: contain;
diff --git a/co-kkiri/src/constants/stacks.ts b/co-kkiri/src/constants/stacks.ts
index 6ba56b7d..b59c8512 100644
--- a/co-kkiri/src/constants/stacks.ts
+++ b/co-kkiri/src/constants/stacks.ts
@@ -1,36 +1,39 @@
import { Stacks } from "@/types/stackTypes";
export const STACKS: Stacks = {
- "JavaScript": { name: "JavaScript", img: "https://cdn.svgporn.com/logos/javascript.svg", relatedPosition: ["FRONT_END", "BACK_END"] },
- "TypeScript": { name: "TypeScript", img: "https://cdn.svgporn.com/logos/typescript-icon.svg", relatedPosition: ["FRONT_END", "BACK_END"] },
- "React": { name: "React", img: "https://cdn.svgporn.com/logos/react.svg", relatedPosition: ["FRONT_END"] },
- "Vue.js": { name: "Vue.js", img: "https://cdn.svgporn.com/logos/vue.svg", relatedPosition: ["FRONT_END"] },
- "Angular": { name: "Angular", img: "https://cdn.svgporn.com/logos/angular-icon.svg", relatedPosition: ["FRONT_END"] },
- "React Query": { name: "React Query", img: "https://cdn.svgporn.com/logos/react-query-icon.svg", relatedPosition: ["FRONT_END"] },
- "Redux": { name: "Redux", img: "https://cdn.svgporn.com/logos/redux.svg", relatedPosition: ["FRONT_END"] },
- "Node.js": { name: "Node.js", img: "https://cdn.svgporn.com/logos/nodejs-icon.svg", relatedPosition: ["BACK_END"] },
- "Spring": { name: "Spring", img: "https://cdn.svgporn.com/logos/spring-icon.svg", relatedPosition: ["BACK_END"] },
- "Django": { name: "Django", img: "https://cdn.svgporn.com/logos/django-icon.svg", relatedPosition: ["BACK_END"] },
- "Python": { name: "Python", img: "https://cdn.svgporn.com/logos/python.svg", relatedPosition: ["BACK_END", "OTHERS"] }, // AI 포함
- "Java": { name: "Java", img: "https://cdn.svgporn.com/logos/java.svg", relatedPosition: ["BACK_END", "MOBILE"] },
- "MySQL": { name: "MySQL", img: "https://cdn.svgporn.com/logos/mysql-icon.svg", relatedPosition: ["BACK_END"] }, // 데이터베이스
- "MongoDB": { name: "MongoDB", img: "https://cdn.svgporn.com/logos/mongodb-icon.svg", relatedPosition: ["BACK_END"] }, // 데이터베이스
- "PostgreSQL": { name: "PostgreSQL", img: "https://cdn.svgporn.com/logos/postgresql.svg", relatedPosition: ["BACK_END"] }, // 데이터베이스
- "Redis": { name: "Redis", img: "https://cdn.svgporn.com/logos/redis.svg", relatedPosition: ["BACK_END"] }, // 데이터베이스
- "GraphQL": { name: "GraphQL", img: "https://cdn.svgporn.com/logos/graphql.svg", relatedPosition: ["BACK_END", "FRONT_END"] }, // API
- "Kotlin": { name: "Kotlin", img: "https://cdn.svgporn.com/logos/kotlin-icon.svg", relatedPosition: ["BACK_END", "MOBILE"] },
- "Swift": { name: "Swift", img: "https://cdn.svgporn.com/logos/swift.svg", relatedPosition: ["MOBILE"] },
- "Flutter": { name: "Flutter", img: "https://cdn.svgporn.com/logos/flutter.svg", relatedPosition: ["MOBILE"] },
- "React Native": { name: "React Native", img: "https://cdn.svgporn.com/logos/react.svg", relatedPosition: ["MOBILE"] },
- "Figma": { name: "Figma", img: "https://cdn.svgporn.com/logos/figma.svg", relatedPosition: ["OTHERS"] }, // 디자인
- "Adobe XD": { name: "Adobe XD", img: "https://cdn.svgporn.com/logos/adobe-xd.svg", relatedPosition: ["OTHERS"] }, // 디자인
- "AWS": { name: "AWS", img: "https://cdn.svgporn.com/logos/aws.svg", relatedPosition: ["OTHERS"] }, // 클라우드 서비스
- "Docker": { name: "Docker", img: "https://cdn.svgporn.com/logos/docker-icon.svg", relatedPosition: ["OTHERS"] }, // 데브옵스
- "Kubernetes": { name: "Kubernetes", img: "https://cdn.svgporn.com/logos/kubernetes.svg", relatedPosition: ["OTHERS"] }, // 데브옵스
- "Git": { name: "Git", img: "https://cdn.svgporn.com/logos/git-icon.svg", relatedPosition: ["OTHERS"] }, // 버전 관리
- "Jira": { name: "Jira", img: "https://cdn.svgporn.com/logos/jira.svg", relatedPosition: ["OTHERS"] }, // 프로젝트 관리
- "TensorFlow": { name: "TensorFlow", img: "https://cdn.svgporn.com/logos/tensorflow.svg", relatedPosition: ["OTHERS"] }, // AI
- "PyTorch": { name: "PyTorch", img: "https://cdn.svgporn.com/logos/pytorch-icon.svg", relatedPosition: ["OTHERS"] }, // AI
+ "JavaScript": { name: "JavaScript", img: `#javascript`, relatedPosition: ["FRONT_END", "BACK_END"] },
+ "TypeScript": { name: "TypeScript", img: `#typescript`, relatedPosition: ["FRONT_END", "BACK_END"] },
+ "React": { name: "React", img: `#react`, relatedPosition: ["FRONT_END"] },
+ "Vue.js": { name: "Vue.js", img: `#vue`, relatedPosition: ["FRONT_END"] },
+ "Angular": { name: "Angular", img: `#angular`, relatedPosition: ["FRONT_END"] },
+ "React Query": { name: "React Query", img: `#react-query`, relatedPosition: ["FRONT_END"] },
+ "Redux": { name: "Redux", img: `#redux`, relatedPosition: ["FRONT_END"] },
+ "Next.js": { name: "Next.js", img: `#nextjs`, relatedPosition: ["FRONT_END"] },
+ "Node.js": { name: "Node.js", img: `#nodejs`, relatedPosition: ["BACK_END"] },
+ "Spring": { name: "Spring", img: `#spring`, relatedPosition: ["BACK_END"] },
+ "Django": { name: "Django", img: `#django`, relatedPosition: ["BACK_END"] },
+ "Nest.js": { name: "Nest.js", img: `#nestjs`, relatedPosition: ["BACK_END"] },
+ "Express": { name: "Express", img: `#express`, relatedPosition: ["BACK_END"] },
+ "Python": { name: "Python", img: `#python`, relatedPosition: ["BACK_END", "OTHERS"] }, // AI 포함
+ "Java": { name: "Java", img: `#java`, relatedPosition: ["BACK_END", "MOBILE"] },
+ "MySQL": { name: "MySQL", img: `#mysql`, relatedPosition: ["BACK_END"] }, // 데이터베이스
+ "MongoDB": { name: "MongoDB", img: `#mongodb`, relatedPosition: ["BACK_END"] }, // 데이터베이스
+ "PostgreSQL": { name: "PostgreSQL", img: `#postgresql`, relatedPosition: ["BACK_END"] }, // 데이터베이스
+ "Redis": { name: "Redis", img: `#redis`, relatedPosition: ["BACK_END"] }, // 데이터베이스
+ "GraphQL": { name: "GraphQL", img: `#graphql`, relatedPosition: ["BACK_END", "FRONT_END"] }, // API
+ "Kotlin": { name: "Kotlin", img: `#kotlin`, relatedPosition: ["BACK_END", "MOBILE"] },
+ "Swift": { name: "Swift", img: `#swift`, relatedPosition: ["MOBILE"] },
+ "Flutter": { name: "Flutter", img: `#flutter`, relatedPosition: ["MOBILE"] },
+ "React Native": { name: "React Native", img: `#react`, relatedPosition: ["MOBILE"] },
+ "Figma": { name: "Figma", img: `#figma`, relatedPosition: ["OTHERS"] }, // 디자인
+ "Adobe XD": { name: "Adobe XD", img: `#adobe-xd`, relatedPosition: ["OTHERS"] }, // 디자인
+ "AWS": { name: "AWS", img: `#aws`, relatedPosition: ["OTHERS"] }, // 클라우드 서비스
+ "Docker": { name: "Docker", img: `#docker`, relatedPosition: ["OTHERS"] }, // 데브옵스
+ "Kubernetes": { name: "Kubernetes", img: `#kubernetes`, relatedPosition: ["OTHERS"] }, // 데브옵스
+ "Git": { name: "Git", img: `#git`, relatedPosition: ["OTHERS"] }, // 버전 관리
+ "Jira": { name: "Jira", img: `#jira`, relatedPosition: ["OTHERS"] }, // 프로젝트 관리
+ "TensorFlow": { name: "TensorFlow", img: `#tensorflow`, relatedPosition: ["OTHERS"] }, // AI
+ "PyTorch": { name: "PyTorch", img: `#pytorch`, relatedPosition: ["OTHERS"] }, // AI
} as const;
export const STACK_NAMES = Object.keys(STACKS);
diff --git a/co-kkiri/vite.config.ts b/co-kkiri/vite.config.ts
index 1eedf7fc..a8df4fdc 100644
--- a/co-kkiri/vite.config.ts
+++ b/co-kkiri/vite.config.ts
@@ -13,8 +13,8 @@ export default defineConfig({
alias: [{ find: "@", replacement: path.resolve(__dirname, "src") }] as Alias[],
},
server: {
- host: '0.0.0.0',
+ host: "0.0.0.0",
port: 80,
- }
+ },
});
``;