2978
ui/package-lock.json
generated
2978
ui/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -10,8 +10,12 @@
|
|||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@tremor/react": "^3.14.1",
|
||||||
|
"antd": "^5.15.1",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0"
|
"react-dom": "^18.2.0",
|
||||||
|
"react-icons": "^5.0.1",
|
||||||
|
"react-router-dom": "^6.22.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/react": "^18.2.56",
|
"@types/react": "^18.2.56",
|
||||||
|
|||||||
@@ -1,12 +1,22 @@
|
|||||||
function App() {
|
import Topbar from "./components/Topbar";
|
||||||
|
import Sidebar from "./components/Sidebar";
|
||||||
|
import { ConfigProvider } from 'antd';
|
||||||
|
import { BrowserRouter } from 'react-router-dom'
|
||||||
|
|
||||||
return (
|
const App = () => (
|
||||||
<>
|
<ConfigProvider
|
||||||
<h1 className="text-3xl font-bold underline">
|
theme={{
|
||||||
Hello world!
|
token: {
|
||||||
</h1>
|
colorPrimary: '#ff00c3',
|
||||||
</>
|
borderRadius: 2,
|
||||||
)
|
},
|
||||||
}
|
}}
|
||||||
|
>
|
||||||
|
<BrowserRouter>
|
||||||
|
<Topbar />
|
||||||
|
<Sidebar />
|
||||||
|
</BrowserRouter>
|
||||||
|
</ConfigProvider>
|
||||||
|
);
|
||||||
|
|
||||||
export default App
|
export default App;
|
||||||
32
ui/src/components/Sidebar/index.tsx
Normal file
32
ui/src/components/Sidebar/index.tsx
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import { Layout, Menu } from "antd";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
|
||||||
|
const { Sider } = Layout;
|
||||||
|
|
||||||
|
const Sidebar = () => {
|
||||||
|
return (
|
||||||
|
<Sider
|
||||||
|
className="h-screen bg-white text-gray-800 fixed top-16 left-0 flex flex-col justify-between shadow-xl"
|
||||||
|
width={250}
|
||||||
|
>
|
||||||
|
<div className="flex flex-col justify-between h-full mt-32">
|
||||||
|
<Menu mode="vertical">
|
||||||
|
<Menu.Item key="1">
|
||||||
|
<Link to="/bots">Bots</Link>
|
||||||
|
</Menu.Item>
|
||||||
|
<Menu.Item key="2">
|
||||||
|
<Link to="/workflow">Workflow</Link>
|
||||||
|
</Menu.Item>
|
||||||
|
<Menu.Item key="3">
|
||||||
|
<Link to="/analytics">Analytics</Link>
|
||||||
|
</Menu.Item>
|
||||||
|
<Menu.Item key="4">
|
||||||
|
<Link to="/api">API</Link>
|
||||||
|
</Menu.Item>
|
||||||
|
</Menu>
|
||||||
|
</div>
|
||||||
|
</Sider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Sidebar;
|
||||||
76
ui/src/components/Topbar/index.tsx
Normal file
76
ui/src/components/Topbar/index.tsx
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
import { useState } from "react";
|
||||||
|
import { Layout, Menu, Col, Drawer } from "antd";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
import { FaBars } from "react-icons/fa";
|
||||||
|
|
||||||
|
const { Header } = Layout;
|
||||||
|
|
||||||
|
const Topbar = () => {
|
||||||
|
const [visible, setVisible] = useState(false);
|
||||||
|
|
||||||
|
const showDrawer = () => setVisible(true);
|
||||||
|
const hideDrawer = () => setVisible(false);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Header className="flex justify-between items-center h-16 bg-white shadow-md">
|
||||||
|
<Col span={4} className="flex items-center">
|
||||||
|
<Link to="/">
|
||||||
|
<img src="maxun_logo.png" alt="Maxun" className="h-8 w-auto" />
|
||||||
|
</Link>
|
||||||
|
</Col>
|
||||||
|
<Col span={16} className="hidden lg:flex justify-end">
|
||||||
|
<Menu mode="horizontal">
|
||||||
|
<Menu.Item key="1">
|
||||||
|
<Link to="/dashboard">Dashboard</Link>
|
||||||
|
</Menu.Item>
|
||||||
|
<Menu.Item key="2">
|
||||||
|
<Link to="/credits">Credits</Link>
|
||||||
|
</Menu.Item>
|
||||||
|
<Menu.Item key="3">
|
||||||
|
<Link to="/profile">Profile</Link>
|
||||||
|
</Menu.Item>
|
||||||
|
</Menu>
|
||||||
|
</Col>
|
||||||
|
<Col span={4} className="lg:hidden flex justify-end">
|
||||||
|
<FaBars className="text-2xl text-gray-600" />
|
||||||
|
<button className="text-gray-600 focus:outline-none" onClick={showDrawer}>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
strokeWidth="1.5"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
className="w-6 h-6"
|
||||||
|
>
|
||||||
|
<path d="M4 6h16v2H4zm0 5h16v2H4zm0 5h16v2H4z" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</Col>
|
||||||
|
<Drawer
|
||||||
|
title="Navigation"
|
||||||
|
placement="right"
|
||||||
|
closable={false}
|
||||||
|
onClose={hideDrawer}
|
||||||
|
open={visible}
|
||||||
|
getContainer={() => document.body} // Ensure the drawer covers viewport on mobile
|
||||||
|
>
|
||||||
|
<Menu mode="vertical">
|
||||||
|
<Menu.Item key="1">
|
||||||
|
<Link to="/dashboard" onClick={hideDrawer}>
|
||||||
|
Dashboard
|
||||||
|
</Link>
|
||||||
|
</Menu.Item>
|
||||||
|
<Menu.Item key="2">
|
||||||
|
<Link to="/credits" onClick={hideDrawer}>Credits</Link>
|
||||||
|
</Menu.Item>
|
||||||
|
<Menu.Item key="3">
|
||||||
|
<Link to="/profile" onClick={hideDrawer}>Profile</Link>
|
||||||
|
</Menu.Item>
|
||||||
|
</Menu>
|
||||||
|
</Drawer>
|
||||||
|
</Header>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Topbar;
|
||||||
@@ -7,4 +7,4 @@ ReactDOM.createRoot(document.getElementById('root')!).render(
|
|||||||
<React.StrictMode>
|
<React.StrictMode>
|
||||||
<App />
|
<App />
|
||||||
</React.StrictMode>,
|
</React.StrictMode>,
|
||||||
)
|
)
|
||||||
Reference in New Issue
Block a user