diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx
index 8428d193..58a65124 100644
--- a/frontend/src/App.jsx
+++ b/frontend/src/App.jsx
@@ -16,7 +16,7 @@ import Withdraw from 'pages/vault/withdraw/Withdraw';
import { useWalletStore } from 'stores/useWalletStore';
import { Notifier } from 'components/Notifier/Notifier';
import { useConnectWallet } from 'hooks/useConnectWallet';
-
+import Stake from 'pages/vault/stake/Stake';
function App() {
const { walletId, setWalletId, removeWalletId } = useWalletStore();
@@ -90,6 +90,8 @@ function App() {
} />
} />
} />
+
+ } />
diff --git a/frontend/src/assets/icons/apy_icon.svg b/frontend/src/assets/icons/apy_icon.svg
new file mode 100644
index 00000000..c6eda91f
--- /dev/null
+++ b/frontend/src/assets/icons/apy_icon.svg
@@ -0,0 +1,4 @@
+
diff --git a/frontend/src/components/GasFee/GasFee.jsx b/frontend/src/components/GasFee/GasFee.jsx
new file mode 100644
index 00000000..b30a7c3e
--- /dev/null
+++ b/frontend/src/components/GasFee/GasFee.jsx
@@ -0,0 +1,18 @@
+import React from 'react';
+import { ReactComponent as SettingIcon } from 'assets/icons/settings.svg';
+import './gasfee.css';
+
+
+export default function GasFee() {
+ return (
+
+
+
+
+
+
+
Gas fee: 0.00 STRK
+
+
+ );
+}
\ No newline at end of file
diff --git a/frontend/src/components/GasFee/gasfee.css b/frontend/src/components/GasFee/gasfee.css
new file mode 100644
index 00000000..00bc8e87
--- /dev/null
+++ b/frontend/src/components/GasFee/gasfee.css
@@ -0,0 +1,31 @@
+.gas-fee-container {
+ width: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.gas-fee-circle {
+ width: 32px;
+ height: 32px;
+ background-color: var(--footer-divider-bg);
+ border-radius: 50%;
+ display: inline-block;
+ position: relative;
+ cursor: pointer;
+}
+
+.gas-fee-icon {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ width: 16px;
+ height: 16px;
+}
+
+.gas-fee-title {
+ color: var(--stormy-gray);
+ font-size: 12px;
+ font-weight: 400;
+}
\ No newline at end of file
diff --git a/frontend/src/components/NavigationLinks.jsx b/frontend/src/components/NavigationLinks.jsx
index 83cd1ebc..ec474ed3 100644
--- a/frontend/src/components/NavigationLinks.jsx
+++ b/frontend/src/components/NavigationLinks.jsx
@@ -11,6 +11,10 @@ const NavigationLinks = ({ onNavClick }) => (
(isActive ? 'active-link' : '')} onClick={onNavClick}>
Dashboard
+
+ (isActive ? 'active-link' : '')} onClick={onNavClick}>
+ Vault
+
);
diff --git a/frontend/src/components/StakeCard/MetricCard.jsx b/frontend/src/components/StakeCard/MetricCard.jsx
new file mode 100644
index 00000000..5529cd7f
--- /dev/null
+++ b/frontend/src/components/StakeCard/MetricCard.jsx
@@ -0,0 +1,16 @@
+import React from 'react';
+import './metricCard.css';
+
+export default function MetricCard({ icon= 1, title, value }) {
+ return (
+
+
+
+
{title}
+
+
+ {value}
+
+
+ );
+}
diff --git a/frontend/src/components/StakeCard/metricCard.css b/frontend/src/components/StakeCard/metricCard.css
new file mode 100644
index 00000000..58cee379
--- /dev/null
+++ b/frontend/src/components/StakeCard/metricCard.css
@@ -0,0 +1,14 @@
+.stake-card {
+ width: 309px;
+ background: var(--header-button-bg);
+ border: var(--midnight-purple-border);
+ border-radius: 900px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
+
+.stake-card .img {
+ margin-right: 100px;
+}
\ No newline at end of file
diff --git a/frontend/src/pages/vault/VaultLayout.jsx b/frontend/src/pages/vault/VaultLayout.jsx
new file mode 100644
index 00000000..458a9d60
--- /dev/null
+++ b/frontend/src/pages/vault/VaultLayout.jsx
@@ -0,0 +1,46 @@
+import React from 'react';
+import { NavLink, Outlet } from 'react-router-dom';
+import './vaultLayout.css';
+
+export function VaultLayout({ children }) {
+ return (
+
+ );
+}
diff --git a/frontend/src/pages/vault/stake/Stake.jsx b/frontend/src/pages/vault/stake/Stake.jsx
new file mode 100644
index 00000000..c7f253e5
--- /dev/null
+++ b/frontend/src/pages/vault/stake/Stake.jsx
@@ -0,0 +1,107 @@
+import React, { useState } from 'react';
+import STRK from '../../../assets/icons/strk.svg';
+import USDC from '../../../assets/icons/apy_icon.svg';
+import './stake.css';
+import { VaultLayout } from '../VaultLayout';
+import { Button } from 'components/ui/Button';
+import MetricCard from 'components/StakeCard/MetricCard';
+import GasFee from 'components/GasFee/GasFee';
+
+function Stake() {
+ const [selectedNetwork, setSelectedNetwork] = useState('Starknet');
+ const [amount, setAmount] = useState('0');
+
+ const networks = [{ name: 'Starknet', image: STRK }];
+
+ const handleChange = (e) => {
+ setSelectedNetwork(e.target.value);
+ };
+
+ const handleAmountChange = (e) => {
+ const value = e.target.value;
+ const regex = /^\d*\.?\d*$/;
+ if (regex.test(value)) {
+ setAmount(value);
+ }
+ };
+
+ return (
+
+
+
+
+
+
Please submit your leverage details
+
+
+
+
+
+
network.name === selectedNetwork)?.image}
+ alt={selectedNetwork}
+ className="network-icon"
+ />
+
{selectedNetwork}
+
+
+
+
+
+ {networks.map((network) => (
+
handleChange(network)}>
+
+
{network.name}
+
+ ))}
+
+
+
+
+
+ STRK
+
+
+
$0.00 APY / year
+
+
+
+
+
+
+
+ );
+}
+
+export default Stake;
diff --git a/frontend/src/pages/vault/stake/stake.css b/frontend/src/pages/vault/stake/stake.css
new file mode 100644
index 00000000..e87b0f64
--- /dev/null
+++ b/frontend/src/pages/vault/stake/stake.css
@@ -0,0 +1,146 @@
+.stake-wrapper {
+ background-size: cover;
+ background-position: center 39%;
+ min-height: 100vh;
+ display: flex;
+ justify-content: center;
+ align-items: flex-start;
+}
+
+.stake-card {
+ width: 309px;
+ background: var(--header-button-bg);
+ border: var(--midnight-purple-border);
+ border-radius: 900px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
+
+.stake-title {
+ font-size: 20px;
+ font-weight: 600;
+ color: var(--primary);
+ text-align: center;
+}
+
+.stake-container {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ gap: 32px;
+}
+
+.network-selector-container {
+ position: relative;
+ width: 100%;
+}
+
+.network-selector {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 0.75rem;
+ background: var(--bg);
+ border-bottom: 1px solid var(--light-purple);
+ color: white;
+ padding: 0.75rem 1rem;
+ cursor: pointer;
+ font-size: 1rem;
+ width: 100%;
+ position: relative;
+ z-index: 10;
+}
+
+.network-selector .selected-network {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+}
+
+.network-icon {
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+}
+
+.chevron {
+ margin-left: auto;
+ transition: transform 0.3s ease;
+}
+
+.network-dropdown {
+ display: none;
+ position: absolute;
+ top: 100%;
+ left: 0;
+ width: 100%;
+ background: var(--gray);
+ border-radius: 2rem;
+ z-index: 1;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
+}
+
+.network-dropdown .network-option {
+ padding: 0.75rem 1rem;
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ cursor: pointer;
+ border-radius: 2rem;
+ transition: background 0.3s;
+}
+
+.network-dropdown .network-option:hover {
+ background: rgba(255, 255, 255, 0.2);
+}
+
+.network-selector-container:hover .network-dropdown {
+ display: block;
+}
+
+.network-selector-container:hover .chevron {
+ transform: rotate(180deg);
+}
+
+.amount-input {
+ position: relative;
+ width: 100%;
+ max-width: 400px;
+ margin: 2rem auto;
+ text-align: center;
+}
+
+.amount-field {
+ background: transparent;
+ border: none;
+ color: var(--gray);
+ font-size: 64px;
+ font-weight: 600;
+ outline: none;
+ text-align: center;
+ width: 100%;
+}
+
+.currency {
+ position: absolute;
+ color: var(--dark-gray);
+ right: -5%;
+ top: 10%;
+ transform: translateY(-50%);
+ opacity: 0.5;
+ font-size: 1.5rem;
+ z-index: 999999;
+}
+
+.apy-rate {
+ color: var(--dark-gray);
+ font-size: 0.875rem;
+ margin-bottom: 2rem;
+ text-align: center;
+}
+
+.stake-button {
+ width: 100%;
+}
diff --git a/frontend/src/pages/vault/vaultLayout.css b/frontend/src/pages/vault/vaultLayout.css
new file mode 100644
index 00000000..7eaeba12
--- /dev/null
+++ b/frontend/src/pages/vault/vaultLayout.css
@@ -0,0 +1,94 @@
+.layout {
+ display: flex;
+ min-height: 100vh;
+ background: url('../../../public/background.png') no-repeat;
+ background-size: cover;
+ background-position: center 39%;
+ background-repeat: no-repeat;
+ position: relative;
+}
+
+.sidebar {
+ width: 280px;
+ background-color: #00000F;
+ border-right: 1px solid #300734;
+ display: flex;
+ flex-direction: column;
+ padding: 1.5rem 2.5rem 1.5rem;
+ position: absolute;
+ height: 100%;
+}
+
+.sidebar-title {
+ color: white;
+ font-size: 1rem;
+ font-weight: 500;
+ margin-bottom: 1rem;
+ padding-bottom: 8px;
+ border-bottom: 1px solid var(--light-purple);
+}
+
+.sidebar-nav {
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+}
+
+.nav-item {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ color: white;
+ text-decoration: none;
+ font-size: 0.875rem;
+ transition: color 0.2s;
+ padding-bottom: 10px;
+}
+
+.nav-item:hover {
+ color: white;
+}
+
+.nav-bullet {
+ font-size: 1.25rem;
+ line-height: 1;
+ transition: color 0.2s;
+}
+
+.nav-item.active {
+ position: relative;
+}
+
+.nav-item.active::after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 2px;
+ background: linear-gradient(to right, #49ABD2, #36294E);
+}
+
+
+.nav-item.active .nav-bullet {
+ color: var(--nav-button-hover);
+}
+
+.main-content {
+ flex: 1;
+ padding: 2rem 0;
+ position: relative;
+}
+
+@media (max-width: 768px) {
+ .sidebar {
+ width: 200px;
+ }
+}
+
+@media (max-width: 640px) {
+ .sidebar {
+ width: 160px;
+ }
+
+}
\ No newline at end of file
diff --git a/frontend/src/pages/vault/withdraw/Withdraw.jsx b/frontend/src/pages/vault/withdraw/Withdraw.jsx
index 83518f0c..89047b26 100644
--- a/frontend/src/pages/vault/withdraw/Withdraw.jsx
+++ b/frontend/src/pages/vault/withdraw/Withdraw.jsx
@@ -4,9 +4,11 @@ import { ReactComponent as DiamondIcon } from 'assets/icons/diamond.svg';
import { ReactComponent as TimeIcon } from 'assets/icons/time.svg';
import { ReactComponent as SettingIcon } from 'assets/icons/settings.svg';
import MetricCard from 'components/MetricCard/MetricCard';
+import { VaultLayout } from '../VaultLayout';
export default function Withdraw() {
return (
+
@@ -55,5 +57,6 @@ export default function Withdraw() {
+
);
}