style(_ui*): update enhanced

This commit is contained in:
eshanized
2024-12-19 14:28:02 +05:30
parent d63a443774
commit eb6be747de
3 changed files with 99 additions and 8 deletions

View File

@@ -11,6 +11,7 @@
"preview": "vite preview" "preview": "vite preview"
}, },
"dependencies": { "dependencies": {
"axios": "^1.7.9",
"lucide-react": "^0.344.0", "lucide-react": "^0.344.0",
"octokit": "^3.2.1", "octokit": "^3.2.1",
"react": "^18.3.1", "react": "^18.3.1",

73
pnpm-lock.yaml generated
View File

@@ -8,6 +8,9 @@ importers:
.: .:
dependencies: dependencies:
axios:
specifier: ^1.7.9
version: 1.7.9
lucide-react: lucide-react:
specifier: ^0.344.0 specifier: ^0.344.0
version: 0.344.0(react@18.3.1) version: 0.344.0(react@18.3.1)
@@ -751,6 +754,9 @@ packages:
argparse@2.0.1: argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
autoprefixer@10.4.20: autoprefixer@10.4.20:
resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
@@ -758,6 +764,9 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.1.0 postcss: ^8.1.0
axios@1.7.9:
resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==}
balanced-match@1.0.2: balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -822,6 +831,10 @@ packages:
color-name@1.1.4: color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
commander@4.1.1: commander@4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'} engines: {node: '>= 6'}
@@ -856,6 +869,10 @@ packages:
deep-is@0.1.4: deep-is@0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
deprecation@2.3.1: deprecation@2.3.1:
resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
@@ -981,10 +998,23 @@ packages:
flatted@3.3.2: flatted@3.3.2:
resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==}
follow-redirects@1.15.9:
resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
peerDependenciesMeta:
debug:
optional: true
foreground-child@3.3.0: foreground-child@3.3.0:
resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
engines: {node: '>=14'} engines: {node: '>=14'}
form-data@4.0.1:
resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
engines: {node: '>= 6'}
fraction.js@4.3.7: fraction.js@4.3.7:
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
@@ -1186,6 +1216,14 @@ packages:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'} engines: {node: '>=8.6'}
mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
mime-types@2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
minimatch@3.1.2: minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@@ -1331,6 +1369,9 @@ packages:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
punycode@2.3.1: punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'} engines: {node: '>=6'}
@@ -2269,6 +2310,8 @@ snapshots:
argparse@2.0.1: {} argparse@2.0.1: {}
asynckit@0.4.0: {}
autoprefixer@10.4.20(postcss@8.4.49): autoprefixer@10.4.20(postcss@8.4.49):
dependencies: dependencies:
browserslist: 4.24.3 browserslist: 4.24.3
@@ -2279,6 +2322,14 @@ snapshots:
postcss: 8.4.49 postcss: 8.4.49
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
axios@1.7.9:
dependencies:
follow-redirects: 1.15.9
form-data: 4.0.1
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
balanced-match@1.0.2: {} balanced-match@1.0.2: {}
before-after-hook@2.2.3: {} before-after-hook@2.2.3: {}
@@ -2342,6 +2393,10 @@ snapshots:
color-name@1.1.4: {} color-name@1.1.4: {}
combined-stream@1.0.8:
dependencies:
delayed-stream: 1.0.0
commander@4.1.1: {} commander@4.1.1: {}
concat-map@0.0.1: {} concat-map@0.0.1: {}
@@ -2364,6 +2419,8 @@ snapshots:
deep-is@0.1.4: {} deep-is@0.1.4: {}
delayed-stream@1.0.0: {}
deprecation@2.3.1: {} deprecation@2.3.1: {}
didyoumean@1.2.2: {} didyoumean@1.2.2: {}
@@ -2526,11 +2583,19 @@ snapshots:
flatted@3.3.2: {} flatted@3.3.2: {}
follow-redirects@1.15.9: {}
foreground-child@3.3.0: foreground-child@3.3.0:
dependencies: dependencies:
cross-spawn: 7.0.6 cross-spawn: 7.0.6
signal-exit: 4.1.0 signal-exit: 4.1.0
form-data@4.0.1:
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
fraction.js@4.3.7: {} fraction.js@4.3.7: {}
fsevents@2.3.3: fsevents@2.3.3:
@@ -2704,6 +2769,12 @@ snapshots:
braces: 3.0.3 braces: 3.0.3
picomatch: 2.3.1 picomatch: 2.3.1
mime-db@1.52.0: {}
mime-types@2.1.35:
dependencies:
mime-db: 1.52.0
minimatch@3.1.2: minimatch@3.1.2:
dependencies: dependencies:
brace-expansion: 1.1.11 brace-expansion: 1.1.11
@@ -2834,6 +2905,8 @@ snapshots:
prelude-ls@1.2.1: {} prelude-ls@1.2.1: {}
proxy-from-env@1.1.0: {}
punycode@2.3.1: {} punycode@2.3.1: {}
queue-microtask@1.2.3: {} queue-microtask@1.2.3: {}

View File

@@ -3,15 +3,20 @@ import { Link, useLocation } from 'react-router-dom';
import { Menu, X } from 'lucide-react'; import { Menu, X } from 'lucide-react';
export function Header() { export function Header() {
// Use location hook to get the current route path for active link checking
const location = useLocation(); const location = useLocation();
// State to toggle the mobile menu
const [isMenuOpen, setIsMenuOpen] = React.useState(false); const [isMenuOpen, setIsMenuOpen] = React.useState(false);
// Function to check if the current path is active for styling the active link
const isActive = (path: string) => location.pathname === path; const isActive = (path: string) => location.pathname === path;
return ( return (
<header className="sticky top-0 z-50 bg-gradient-to-r from-gray-900 via-gray-800 to-gray-900 text-white shadow-md"> <header className="sticky top-0 z-50 bg-gradient-to-r from-gray-900 via-gray-800 to-gray-900 text-white shadow-md">
<div className="container mx-auto px-6"> <div className="container mx-auto px-6">
<div className="flex items-center justify-between h-20"> <div className="flex items-center justify-between h-20">
{/* Logo and brand name */}
<Link to="/" className="flex items-center space-x-4 group"> <Link to="/" className="flex items-center space-x-4 group">
<img <img
src="/snigdhaos-logo.svg" src="/snigdhaos-logo.svg"
@@ -23,20 +28,23 @@ export function Header() {
</span> </span>
</Link> </Link>
{/* Mobile menu button */} {/* Mobile menu toggle button */}
<button <button
className="md:hidden p-2 rounded-lg hover:bg-gray-800 transition-all focus:outline-none focus:ring-2 focus:ring-[#6495ED]" className="md:hidden p-2 rounded-lg hover:bg-gray-800 transition-all focus:outline-none focus:ring-2 focus:ring-[#6495ED]"
onClick={() => setIsMenuOpen(!isMenuOpen)} onClick={() => setIsMenuOpen(!isMenuOpen)} // Toggle menu open/close state
> >
{isMenuOpen ? ( {isMenuOpen ? (
// If menu is open, show 'X' icon
<X className="h-7 w-7 animate-spin-reverse" /> <X className="h-7 w-7 animate-spin-reverse" />
) : ( ) : (
// If menu is closed, show 'Menu' icon
<Menu className="h-7 w-7 animate-spin" /> <Menu className="h-7 w-7 animate-spin" />
)} )}
</button> </button>
{/* Desktop navigation */} {/* Desktop navigation links (hidden on mobile) */}
<nav className="hidden md:flex space-x-10"> <nav className="hidden md:flex space-x-10">
{/* Render navigation links */}
<NavLinks isActive={isActive} closeMenu={() => setIsMenuOpen(false)} animate /> <NavLinks isActive={isActive} closeMenu={() => setIsMenuOpen(false)} animate />
</nav> </nav>
</div> </div>
@@ -44,12 +52,16 @@ export function Header() {
{/* Mobile navigation */} {/* Mobile navigation */}
<div <div
className={`${ className={`${
// Apply fade-in or fade-out animation based on the menu state
isMenuOpen ? 'animate-fade-in-down' : 'animate-fade-out-up' isMenuOpen ? 'animate-fade-in-down' : 'animate-fade-out-up'
} md:hidden overflow-hidden transition-all duration-500`} } md:hidden overflow-hidden transition-all duration-500`}
> >
{/* Only render the mobile menu if it is open */}
{isMenuOpen && ( {isMenuOpen && (
<nav className="mt-4"> <nav className="mt-4">
{/* Mobile menu styling */}
<div className="flex flex-col space-y-4 bg-gray-800 p-5 rounded-lg shadow-lg"> <div className="flex flex-col space-y-4 bg-gray-800 p-5 rounded-lg shadow-lg">
{/* Render navigation links in the mobile menu */}
<NavLinks <NavLinks
isActive={isActive} isActive={isActive}
closeMenu={() => setIsMenuOpen(false)} closeMenu={() => setIsMenuOpen(false)}
@@ -62,6 +74,7 @@ export function Header() {
</div> </div>
{/* Global Keyframe Animations (inline style tag) */} {/* Global Keyframe Animations (inline style tag) */}
{/* These animations control the fade-in and fade-out effects for menu items */}
<style>{` <style>{`
@keyframes fade-in-down { @keyframes fade-in-down {
0% { opacity: 0; transform: translateY(-10px); } 0% { opacity: 0; transform: translateY(-10px); }
@@ -82,10 +95,11 @@ export function Header() {
); );
} }
// Navigation links component
function NavLinks({ function NavLinks({
isActive, isActive, // Function to check if a link is active
closeMenu, closeMenu, // Function to close the mobile menu after selecting a link
animate, animate, // Whether to apply animation for the links
}: { }: {
isActive: (path: string) => boolean; isActive: (path: string) => boolean;
closeMenu: () => void; closeMenu: () => void;
@@ -93,25 +107,28 @@ function NavLinks({
}) { }) {
return ( return (
<ul className="space-y-4 md:space-y-0 md:flex md:space-x-10"> <ul className="space-y-4 md:space-y-0 md:flex md:space-x-10">
{/* Loop through paths and labels to create navigation links */}
{['/', '/about', '/download', '/donors', '/maintainers'].map((path, idx) => { {['/', '/about', '/download', '/donors', '/maintainers'].map((path, idx) => {
const labels = ['Home', 'About', 'Download', 'Donors', 'Maintainers']; const labels = ['Home', 'About', 'Download', 'Donors', 'Maintainers'];
return ( return (
<li <li
key={path} key={path}
className={`${ className={`${
// Add animation delay if `animate` is true
animate ? `animate-fade-in-up delay-${idx * 100}` : '' animate ? `animate-fade-in-up delay-${idx * 100}` : ''
}`} }`}
> >
<Link <Link
to={path} to={path}
className={`${ className={`${
// If the link is active, apply custom active styles
isActive(path) isActive(path)
? 'text-[#6495ED] underline underline-offset-4 decoration-2' ? 'text-[#6495ED] underline underline-offset-4 decoration-2'
: 'text-gray-300 hover:text-[#6495ED]' : 'text-gray-300 hover:text-[#6495ED]'
} font-medium transition-all duration-300 hover:scale-110`} } font-medium transition-all duration-300 hover:scale-110`}
onClick={closeMenu} onClick={closeMenu} // Close the mobile menu when a link is clicked
> >
{labels[idx]} {labels[idx]} {/* Display label for the link */}
</Link> </Link>
</li> </li>
); );