diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 52d0f987..136e97aa 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -8,6 +8,7 @@
"name": "frontend",
"version": "0.0.0",
"dependencies": {
+ "axios": "^1.13.1",
"pretendard": "^1.3.9",
"react": "^19.1.1",
"react-dom": "^19.1.1",
@@ -3010,6 +3011,12 @@
"node": ">= 0.4"
}
},
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
"node_modules/at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
@@ -3036,6 +3043,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/axios": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.1.tgz",
+ "integrity": "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.4",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
"node_modules/babel-plugin-polyfill-corejs2": {
"version": "0.4.14",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz",
@@ -3170,7 +3188,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
@@ -3265,6 +3282,18 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
@@ -3476,6 +3505,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/doctrine": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
@@ -3493,7 +3531,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
@@ -3600,7 +3637,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3610,7 +3646,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -3648,7 +3683,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
@@ -3661,7 +3695,6 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
@@ -4145,6 +4178,26 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/follow-redirects": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
"node_modules/for-each": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
@@ -4161,6 +4214,22 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/form-data": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
+ "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
@@ -4203,7 +4272,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -4254,7 +4322,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
@@ -4286,7 +4353,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
- "dev": true,
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
@@ -4383,7 +4449,6 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -4455,7 +4520,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -4468,7 +4532,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
@@ -4484,7 +4547,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
@@ -5270,12 +5332,32 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -5681,6 +5763,12 @@
"react-is": "^16.13.1"
}
},
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
+ },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index a952bc8b..7f652df0 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -10,6 +10,7 @@
"preview": "vite preview"
},
"dependencies": {
+ "axios": "^1.13.1",
"pretendard": "^1.3.9",
"react": "^19.1.1",
"react-dom": "^19.1.1",
diff --git a/frontend/src/assets/coin3.png b/frontend/src/assets/coin3.png
new file mode 100644
index 00000000..ba2d9084
Binary files /dev/null and b/frontend/src/assets/coin3.png differ
diff --git a/frontend/src/assets/coin5.png b/frontend/src/assets/coin5.png
new file mode 100644
index 00000000..6a42e4e1
Binary files /dev/null and b/frontend/src/assets/coin5.png differ
diff --git a/frontend/src/assets/logo.png b/frontend/src/assets/logo.png
new file mode 100644
index 00000000..4d1caad0
Binary files /dev/null and b/frontend/src/assets/logo.png differ
diff --git a/frontend/src/components/Layout.jsx b/frontend/src/components/Layout.jsx
index 07b05c9f..321fe6e0 100644
--- a/frontend/src/components/Layout.jsx
+++ b/frontend/src/components/Layout.jsx
@@ -1,11 +1,20 @@
-import { Outlet } from 'react-router-dom';
+import { Outlet, useLocation } from 'react-router-dom';
import Sidebar from './Sidebar';
function Layout() {
+ const location = useLocation();
+ const isRoot = location.pathname === '/';
+
return (
-
-
-
+
+ {/* 홈이 아닐 때는 Sidebar 고정 */}
+ {!isRoot && }
+
+
+ {/* 홈일 때만 Sidebar를 main 내부에서 렌더링 (햄버거 + 슬라이드) */}
+ {isRoot && }
diff --git a/frontend/src/components/Sidebar.jsx b/frontend/src/components/Sidebar.jsx
index ffc21765..0b1c4966 100644
--- a/frontend/src/components/Sidebar.jsx
+++ b/frontend/src/components/Sidebar.jsx
@@ -1,27 +1,17 @@
-import { NavLink } from 'react-router-dom';
+import { NavLink, useLocation, useNavigate } from 'react-router-dom';
import styles from './Sidebar.module.css';
+import Logo from '../assets/logo.png';
+import { useState } from 'react';
const Sidebar = () => {
- return (
-
-
-
-
-
- 세종투자연구회
-
- Finance . IT
-
-
-
+ const location = useLocation();
+ const isRoot = location.pathname === '/';
+ const [isOpen, setIsOpen] = useState(false);
+ const toggleSidebar = () => setIsOpen(!isOpen);
+ const nav = useNavigate();
+
+ const menuSections = (
+ <>
+ >
+ );
+
+ if (isRoot) {
+ return (
+
+ {/* 홈에서는 버튼만 고정 */}
+
+
+
nav('/')}>
+

+
세종투자연구회
+
+
+
+ {/* 클릭 시 사이드바 슬라이드 */}
+
+ {menuSections}
+
+
+ );
+ }
+
+ // 홈 외 페이지는 항상 열려있음
+ return (
+
+
+
+
+
+ 세종투자연구회
+
+ Finance . IT
+
+
+
+ {menuSections}
);
};
diff --git a/frontend/src/components/Sidebar.module.css b/frontend/src/components/Sidebar.module.css
index 3c699ecf..7bcfae89 100644
--- a/frontend/src/components/Sidebar.module.css
+++ b/frontend/src/components/Sidebar.module.css
@@ -1,7 +1,31 @@
.sidebar {
height: 100vh;
padding: 0 32px;
- background-color: #0e1a2c;
+ background-color: #02040d;
+ position: relative;
+}
+
+.homeSidebarMenu {
+ position: fixed;
+ top: 90px;
+ left: 0;
+ width: 200px;
+ height: calc(100vh - 90px);
+ padding: 0 32px;
+ background-color: #02040d;
+ transform: translateX(-100%);
+ transition: transform 0.3s ease;
+ z-index: 100;
+ overflow: hidden;
+}
+
+.open {
+ transform: translateX(0);
+}
+
+.closed {
+ transform: translateX(-100%);
+ pointer-events: none;
}
.sidebar-header {
@@ -83,5 +107,55 @@
.inactive-link {
background-color: transparent;
+ width: 100%;
padding: 10px 8px;
}
+
+.left {
+ display: flex;
+ gap: 30px;
+ position: fixed;
+ align-items: center;
+ z-index: 999;
+ top: 32px;
+ left: 32px;
+}
+
+.brand {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ cursor: pointer;
+}
+
+.title {
+ font-weight: 600;
+ font-size: 18.53px;
+ line-height: 120%;
+ letter-spacing: -3%;
+ color: white;
+}
+
+.menuButton {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ width: 22px;
+ height: 16px;
+ background: none;
+ border: none;
+ cursor: pointer;
+ padding: 0;
+}
+
+.menuButton span {
+ display: block;
+ height: 2px;
+ background: white;
+ border-radius: 2px;
+}
+
+.logo {
+ width: 19px;
+ height: 19px;
+}
diff --git a/frontend/src/pages/Home.jsx b/frontend/src/pages/Home.jsx
index 57fff0e4..f123dd86 100644
--- a/frontend/src/pages/Home.jsx
+++ b/frontend/src/pages/Home.jsx
@@ -1,5 +1,39 @@
+import styles from './Home.module.css';
+import Coin3 from '../assets/coin3.png';
+import Coin4 from '../assets/coin4.svg';
+import Coin5 from '../assets/coin5.png';
+import { useNavigate } from 'react-router-dom';
+
const Home = () => {
- return
;
+ const nav = useNavigate();
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ Sejong Investment
+ Scholars Club
+
+
세투연과 함께 세상을 읽고 미래에 투자하라
+
+
+
+ );
};
export default Home;
diff --git a/frontend/src/pages/Home.module.css b/frontend/src/pages/Home.module.css
new file mode 100644
index 00000000..6a6bc9f6
--- /dev/null
+++ b/frontend/src/pages/Home.module.css
@@ -0,0 +1,121 @@
+.container {
+ width: 100vw;
+ height: 100vh;
+ overflow: hidden;
+}
+
+/* 위쪽 어두운 부분 */
+.upper {
+ height: 50%;
+ background: linear-gradient(to bottom, #000000, #060d2a);
+}
+
+/* 아래쪽 타원형 빛 부분 */
+.lower {
+ height: 50%;
+ background: radial-gradient(
+ 100% 60% at 50% 100%,
+ #ade6ff 4%,
+ #6893ff 11%,
+ #3256c9 24%,
+ #1c348b 38%,
+ #091138 83%,
+ #081033 100%,
+ #060d2a 100%
+ );
+}
+
+.header {
+ position: absolute;
+ top: 0;
+ right: 60px;
+ width: 100%;
+ height: 100px;
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+}
+
+.textBox h1 {
+ font-weight: 600;
+ font-size: 64px;
+ line-height: 120%;
+ letter-spacing: -3%;
+ position: absolute;
+ top: 180px;
+ left: 300px;
+ color: #ffffff;
+ width: 600px;
+}
+
+.textBox h2 {
+ font-weight: 700;
+ font-size: 36px;
+ line-height: 110%;
+ letter-spacing: -1%;
+ position: absolute;
+ top: 370px;
+ left: 300px;
+ background: linear-gradient(
+ 290.46deg,
+ #5b93ed 19.78%,
+ #78b4f3 51.79%,
+ #b2f4ff 62.83%,
+ #fcffff 105.89%
+ );
+ background-clip: text;
+ -webkit-text-fill-color: transparent;
+ width: 650px;
+}
+
+.login {
+ border: none;
+ border-right: 1px solid #a3a3a3;
+ background: none;
+ color: #ffffff;
+ cursor: pointer;
+ font-weight: 500;
+ font-size: 16px;
+ line-height: 120%;
+ letter-spacing: -3%;
+ width: 90px;
+}
+
+.signUp {
+ border: none;
+ border-left: 1px solid #a3a3a3;
+ background: none;
+ color: #ffffff;
+ cursor: pointer;
+ font-weight: 500;
+ font-size: 16px;
+ line-height: 120%;
+ letter-spacing: -3%;
+ width: 100px;
+}
+
+.coin3 {
+ position: absolute;
+ width: 269px;
+ height: 186px;
+ top: 205px;
+ left: 978px;
+ z-index: 3;
+}
+
+.coin4 {
+ position: absolute;
+ width: 200px;
+ height: 235px;
+ left: 1016px;
+ top: 468px;
+}
+
+.coin5 {
+ position: absolute;
+ width: 241px;
+ height: 232px;
+ top: 285px;
+ left: 1091px;
+ z-index: 1;
+}