Skip to content

Commit f0052c3

Browse files
committed
made sidebar collapsable
1 parent 4953914 commit f0052c3

File tree

7 files changed

+80
-22
lines changed

7 files changed

+80
-22
lines changed

package-lock.json

+9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"react-chartjs-2": "^5.2.0",
2424
"react-dom": "^18.3.1",
2525
"react-github-calendar": "^4.5.2",
26+
"react-icons": "^5.5.0",
2627
"rimraf": "^5.0.10",
2728
"tailwind-merge": "^2.5.5"
2829
},

src/app/dashboard/layout.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ const DashboardLayout = ({ children }: PropsWithChildren) => {
88
return (
99
<SelectedButtonProvider>
1010
<div className="flex min-h-screen w-full ">
11-
<div className='w-2/12 h-screen top-0 sticky'>
11+
<div className="fixed left-0 top-0 h-screen z-50 md:w-2/12 md:sticky">
1212
<Sidebar />
1313
</div>
1414
{/* Content area will take the remaining space */}
15-
<div className="w-10/12 bg-bgMainColor">
15+
<div className="bg-bgMainColor w-full md:w-10/12 ml-20 md:ml-0">
1616
{children}
1717
</div>
1818
</div>

src/app/dashboard/page.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ const DashboardPage = () => {
1515
);
1616
};
1717

18-
export default DashboardPage;
18+
export default DashboardPage;

src/components/Sidebar.tsx

+60-15
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
"use client";
2-
import React from "react";
2+
import React, { useState, useEffect } from "react";
33
import SideBarButton from "./SidebarButton";
44
import { Award, CalendarCheck2, Home } from "lucide-react";
55
import { useSelectedButton } from "@/context/SelectedButtonContext"; // Adjust the path as necessary
66
import Image from 'next/image';
7+
import { FaAngleLeft, FaAngleRight } from "react-icons/fa";
78

89
const buttons = [
910
{
@@ -21,33 +22,77 @@ const buttons = [
2122
];
2223

2324
const SidePanel: React.FC = () => {
25+
const [collapsed, setcollapsed] = useState(true);
26+
const [isMobile, setIsMobile] = useState(false);
2427
const { setSelectedButton } = useSelectedButton();
2528

2629
const handleButtonClick = (name: string) => {
2730
setSelectedButton(name);
2831
};
32+
const toggleCollapsed = () => {
33+
setcollapsed(!collapsed);
34+
}
2935

30-
return (
31-
<div className="flex flex-col items-center min-h-full p-5 bg-panelColor text-white w-full">
32-
<div className="flex flex-col md:flex-row items-center">
33-
<Image
34-
src="/amfoss-logo-white.png"
35-
alt="amfoss-logo-white"
36-
className="h-auto min-w-[10vw] sm:w-[10vw] md:w-[40px] lg:w-[50px] md:min-w-[40px] lg:min-w-[50px] max-h-auto"
37-
width={50}
38-
height={50}
39-
priority
40-
/>
41-
<div className="hidden md:flex flex-col text-center text-[20px] md:text-[24px] font-jetbrains items-center text-offWhite justify-center md:ml-2">
42-
Home
36+
useEffect(() => {
37+
const handleResize = () => {
38+
setIsMobile(window.innerWidth < 768);
39+
};
40+
41+
handleResize();
42+
window.addEventListener('resize', handleResize);
43+
44+
return () => window.removeEventListener('resize', handleResize);
45+
}, []);
46+
47+
return (!isMobile ?
48+
<div className="flex flex-col items-center min-h-full py-5 px-3 bg-panelColor text-white w-full">
49+
<div className="flex flex-row md:justify-evenly w-full">
50+
<div className="flex flex-col md:flex-row items-center">
51+
<Image
52+
src="/amfoss-logo-white.png"
53+
alt="amfoss-logo-white"
54+
className="h-auto min-w-[10vw] md:w-[40px] lg:w-[50px] md:min-w-[40px] lg:min-w-[50px] max-h-auto"
55+
width={50}
56+
height={50}
57+
priority
58+
/>
59+
<div className="md:flex flex-col text-center text-[20px] md:text-[24px] font-jetbrains items-center text-offWhite justify-center md:ml-2">
60+
Home
61+
</div>
4362
</div>
4463
</div>
45-
<div className="sm:flex flex-col space-y-4 font-jetbrains m-2 mt-10 overflow-hidden lg:w-full">
64+
<div className="md:flex flex-col space-y-4 font-jetbrains m-2 mt-10 overflow-hidden lg:w-full">
65+
{buttons.map((button, index) => (
66+
<SideBarButton
67+
key={index}
68+
icon={button.icon}
69+
text={button.name}
70+
collapsed={collapsed}
71+
onClick={() => handleButtonClick(button.name.toLowerCase())}
72+
/>
73+
))}
74+
</div>
75+
</div> :
76+
// For mobile scren
77+
<div className="flex flex-col items-center min-h-full py-5 px-2 bg-panelColor text-white w-full">
78+
<div className="flex flex-row items-center">
79+
<Image
80+
src="/amfoss-logo-white.png"
81+
alt="amfoss-logo-white"
82+
className="h-auto w-[8vw] max-h-auto"
83+
width={50}
84+
height={50}
85+
priority
86+
/>
87+
<div className="flex text-center items-center mr-0" onClick={toggleCollapsed}>{collapsed ? <FaAngleRight className="text-2xl" /> : <FaAngleLeft className="text-2xl"/>}</div>
88+
</div>
89+
<div className="sflex flex-col space-y-4 font-jetbrains m-2 mt-10 overflow-hidden">
4690
{buttons.map((button, index) => (
4791
<SideBarButton
4892
key={index}
4993
icon={button.icon}
5094
text={button.name}
95+
collapsed={collapsed}
5196
onClick={() => handleButtonClick(button.name.toLowerCase())}
5297
/>
5398
))}

src/components/SidebarButton.tsx

+6-3
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import React from 'react';
33
type SideBarButtonProps = {
44
icon?: React.ReactElement;
55
text: string;
6+
collapsed: boolean;
67
onClick: (text: string) => void;
78
};
89

9-
const SideBarButton: React.FC<SideBarButtonProps> = ({ icon, text, onClick }) => {
10+
const SideBarButton: React.FC<SideBarButtonProps> = ({ icon, text, onClick, collapsed }) => {
1011
return (
1112
<div
12-
className="lg:flex justify-center items-center max-w-full bg-panelButtonColor p-5 rounded-none sm:rounded-md md:rounded-xl text-white overflow-hidden cursor-pointer transition-colors duration-500"
13+
className="lg:flex sm:flex sm:flex-row md:block justify-center items-center max-w-full bg-panelButtonColor lg:p-5 md:px-1 sm:px-4 sm:py-5 rounded-none sm:rounded-md md:rounded-xl text-white overflow-hidden cursor-pointer transition-colors duration-500"
1314
onClick={() => onClick(text)}
1415
title={text}
1516
>
@@ -22,9 +23,11 @@ const SideBarButton: React.FC<SideBarButtonProps> = ({ icon, text, onClick }) =>
2223

2324
{/* Text container */}
2425
<div className="flex-1 flex items-center justify-center z-20">
25-
<div className="text-base lg:text-lg hidden md:block">{text}</div>
26+
<div className={`text-base lg:text-lg ${collapsed ? "hidden" : ""} md:block`}>{text}</div>
2627
</div>
28+
2729
</div>
30+
2831
);
2932
};
3033

tailwind.config.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export default {
4747
},
4848
screens: {
4949
sm: "0px",
50-
md: "640px",
50+
md: "768px",
5151
lg: "1024px",
5252
xl: "1280px",
5353
},

0 commit comments

Comments
 (0)