feat: reorder toolkit & navbar, update RAISE incubator & portal modules, fix faculty department filtering
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
# ─── DATABASE CONNECTION CONFIGURATION ───
|
# ─── DATABASE CONNECTION CONFIGURATION ───
|
||||||
spring.datasource.url=jdbc:postgresql://localhost:5432/rit_freshers_hub?sslmode=disable
|
spring.datasource.url=jdbc:postgresql://localhost:5432/rit_freshers_hub?sslmode=disable
|
||||||
spring.datasource.username=postgres
|
spring.datasource.username=postgres
|
||||||
spring.datasource.password=${DB_PASSWORD:Anbukathir@2006}
|
spring.datasource.password=${DB_PASSWORD:Amudiesh22@.}
|
||||||
|
|
||||||
# ─── JPA / HIBERNATE SETTINGS ───
|
# ─── JPA / HIBERNATE SETTINGS ───
|
||||||
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
|
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
|
||||||
|
|||||||
28
package-lock.json
generated
28
package-lock.json
generated
@@ -102,7 +102,6 @@
|
|||||||
"integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
|
"integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/code-frame": "^7.29.7",
|
"@babel/code-frame": "^7.29.7",
|
||||||
"@babel/generator": "^7.29.7",
|
"@babel/generator": "^7.29.7",
|
||||||
@@ -1637,6 +1636,17 @@
|
|||||||
"tslib": "^2.4.0"
|
"tslib": "^2.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@emnapi/runtime": {
|
||||||
|
"version": "1.11.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz",
|
||||||
|
"integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@emnapi/wasi-threads": {
|
"node_modules/@emnapi/wasi-threads": {
|
||||||
"version": "1.2.2",
|
"version": "1.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz",
|
||||||
@@ -4422,7 +4432,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.101.3.tgz",
|
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.101.3.tgz",
|
||||||
"integrity": "sha512-ZjgcRwmQUSCythDPj6pE2NKFi9bpQegxIBxgt3hPytXI1ElFHNaa3A7aWW8vFaLCIRjPv467rbREYHbxcdgQbg==",
|
"integrity": "sha512-ZjgcRwmQUSCythDPj6pE2NKFi9bpQegxIBxgt3hPytXI1ElFHNaa3A7aWW8vFaLCIRjPv467rbREYHbxcdgQbg==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tanstack/query-core": "5.101.3"
|
"@tanstack/query-core": "5.101.3"
|
||||||
},
|
},
|
||||||
@@ -4508,7 +4517,6 @@
|
|||||||
"integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==",
|
"integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"undici-types": "~7.18.0"
|
"undici-types": "~7.18.0"
|
||||||
}
|
}
|
||||||
@@ -4519,7 +4527,6 @@
|
|||||||
"integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==",
|
"integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==",
|
||||||
"devOptional": true,
|
"devOptional": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"csstype": "^3.2.2"
|
"csstype": "^3.2.2"
|
||||||
}
|
}
|
||||||
@@ -4530,7 +4537,6 @@
|
|||||||
"integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
|
"integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
|
||||||
"devOptional": true,
|
"devOptional": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@types/react": "^19.2.0"
|
"@types/react": "^19.2.0"
|
||||||
}
|
}
|
||||||
@@ -4606,7 +4612,6 @@
|
|||||||
"integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
|
"integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fast-deep-equal": "^3.1.3",
|
"fast-deep-equal": "^3.1.3",
|
||||||
"fast-uri": "^3.0.1",
|
"fast-uri": "^3.0.1",
|
||||||
@@ -4865,7 +4870,6 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"baseline-browser-mapping": "^2.10.42",
|
"baseline-browser-mapping": "^2.10.42",
|
||||||
"caniuse-lite": "^1.0.30001803",
|
"caniuse-lite": "^1.0.30001803",
|
||||||
@@ -6541,8 +6545,7 @@
|
|||||||
"version": "1.9.4",
|
"version": "1.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz",
|
||||||
"integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==",
|
"integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==",
|
||||||
"license": "BSD-2-Clause",
|
"license": "BSD-2-Clause"
|
||||||
"peer": true
|
|
||||||
},
|
},
|
||||||
"node_modules/leven": {
|
"node_modules/leven": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
@@ -7170,7 +7173,6 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"nanoid": "^3.3.16",
|
"nanoid": "^3.3.16",
|
||||||
"picocolors": "^1.1.1",
|
"picocolors": "^1.1.1",
|
||||||
@@ -7214,7 +7216,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz",
|
"resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz",
|
||||||
"integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==",
|
"integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
@@ -7224,7 +7225,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz",
|
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz",
|
||||||
"integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==",
|
"integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"scheduler": "^0.27.0"
|
"scheduler": "^0.27.0"
|
||||||
},
|
},
|
||||||
@@ -7237,7 +7237,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.82.0.tgz",
|
"resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.82.0.tgz",
|
||||||
"integrity": "sha512-Zw/uFZ2dO+02GHlBn7JFGn8kZJ7LdM33B/0BXOovzFay+CMhf94JMw5BVu+F1tVkUKjNvBuaE3fz5BJhga10Tg==",
|
"integrity": "sha512-Zw/uFZ2dO+02GHlBn7JFGn8kZJ7LdM33B/0BXOovzFay+CMhf94JMw5BVu+F1tVkUKjNvBuaE3fz5BJhga10Tg==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0"
|
"node": ">=18.0.0"
|
||||||
},
|
},
|
||||||
@@ -7544,7 +7543,6 @@
|
|||||||
"integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==",
|
"integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/estree": "1.0.9"
|
"@types/estree": "1.0.9"
|
||||||
},
|
},
|
||||||
@@ -8090,7 +8088,6 @@
|
|||||||
"integrity": "sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==",
|
"integrity": "sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "BSD-2-Clause",
|
"license": "BSD-2-Clause",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/source-map": "^0.3.3",
|
"@jridgewell/source-map": "^0.3.3",
|
||||||
"acorn": "^8.15.0",
|
"acorn": "^8.15.0",
|
||||||
@@ -8416,7 +8413,6 @@
|
|||||||
"integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==",
|
"integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"lightningcss": "^1.32.0",
|
"lightningcss": "^1.32.0",
|
||||||
"picomatch": "^4.0.5",
|
"picomatch": "^4.0.5",
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ import {
|
|||||||
Users,
|
Users,
|
||||||
Code2,
|
Code2,
|
||||||
Trophy,
|
Trophy,
|
||||||
|
Ticket,
|
||||||
|
Award,
|
||||||
GraduationCap,
|
GraduationCap,
|
||||||
LayoutDashboard,
|
LayoutDashboard,
|
||||||
Home as HomeIcon,
|
Home as HomeIcon,
|
||||||
@@ -38,19 +40,24 @@ const PRIMARY_LINKS: NavItem[] = [
|
|||||||
{ label: 'Toolkit', path: '/toolkit', icon: Wrench },
|
{ label: 'Toolkit', path: '/toolkit', icon: Wrench },
|
||||||
{ label: 'Chatbot', path: '/ai-assistant', icon: Bot },
|
{ label: 'Chatbot', path: '/ai-assistant', icon: Bot },
|
||||||
{ label: 'Clubs & Centers', path: '/events', icon: Users },
|
{ label: 'Clubs & Centers', path: '/events', icon: Users },
|
||||||
{ label: 'Dev Collab', path: '/collab', icon: Code2 },
|
|
||||||
{ label: 'LeetCode', path: '/leetcode', icon: Trophy },
|
|
||||||
];
|
|
||||||
|
|
||||||
const MORE_LINKS: NavItem[] = [
|
|
||||||
{ label: 'Campus Map', path: '/campus', icon: Map },
|
{ label: 'Campus Map', path: '/campus', icon: Map },
|
||||||
{ label: 'Bus Routes', path: '/bus-routes', icon: Bus },
|
{ label: 'Bus Routes', path: '/bus-routes', icon: Bus },
|
||||||
{ label: 'Faculty Directory', path: '/faculty', icon: UserCheck },
|
{ label: 'Faculty Directory', path: '/faculty', icon: UserCheck },
|
||||||
{ label: 'Community', path: '/community', icon: MessageCircle },
|
{ label: 'Community', path: '/community', icon: MessageCircle },
|
||||||
{ label: 'RAISE Incubator', path: '/raise', icon: Rocket },
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const ALL_MOBILE_LINKS: NavItem[] = [...PRIMARY_LINKS, ...MORE_LINKS];
|
const MORE_LINKS: NavItem[] = [
|
||||||
|
{ label: 'Dev Collab', path: '/collab', icon: Code2 },
|
||||||
|
{ label: 'LeetCode', path: '/leetcode', icon: Trophy },
|
||||||
|
{ label: 'Student Gate Pass', path: '/notes?portal=gatepass', icon: Ticket },
|
||||||
|
{ label: 'Student Proficiency', path: '/notes?portal=proficiency', icon: Award },
|
||||||
|
];
|
||||||
|
|
||||||
|
const ALL_MOBILE_LINKS: NavItem[] = [
|
||||||
|
...PRIMARY_LINKS,
|
||||||
|
...MORE_LINKS,
|
||||||
|
{ label: 'RAISE Incubator', path: '/raise', icon: Rocket },
|
||||||
|
];
|
||||||
|
|
||||||
export default function Navbar() {
|
export default function Navbar() {
|
||||||
const [isMobileOpen, setIsMobileOpen] = useState(false);
|
const [isMobileOpen, setIsMobileOpen] = useState(false);
|
||||||
@@ -81,12 +88,15 @@ export default function Navbar() {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const checkIsActive = (linkPath: string) => {
|
const checkIsActive = (linkPath: string) => {
|
||||||
const [pathName] = linkPath.split('?');
|
if (linkPath === '/') return location.pathname === '/';
|
||||||
if (pathName === '/') return location.pathname === '/';
|
if (linkPath === '/notes') return location.pathname === '/notes';
|
||||||
return location.pathname.startsWith(pathName);
|
if (linkPath.includes('?')) {
|
||||||
|
return location.pathname + location.search === linkPath;
|
||||||
|
}
|
||||||
|
return location.pathname.startsWith(linkPath);
|
||||||
};
|
};
|
||||||
|
|
||||||
const isMoreActive = MORE_LINKS.some((link) => checkIsActive(link.path));
|
const isMoreActive = MORE_LINKS.some((link) => !link.path.startsWith('/notes') && checkIsActive(link.path));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -96,7 +106,7 @@ export default function Navbar() {
|
|||||||
initial={{ y: -60, opacity: 0 }}
|
initial={{ y: -60, opacity: 0 }}
|
||||||
animate={{ y: 0, opacity: 1 }}
|
animate={{ y: 0, opacity: 1 }}
|
||||||
transition={{ duration: 0.45, ease: 'easeOut' }}
|
transition={{ duration: 0.45, ease: 'easeOut' }}
|
||||||
className="pointer-events-auto flex items-center justify-between gap-2 lg:gap-4 px-3 sm:px-4 py-2 rounded-2xl bg-slate-950/90 backdrop-blur-xl border border-white/10 shadow-[0_8px_30px_rgba(0,0,0,0.35)] transition-all"
|
className="relative pointer-events-auto flex items-center justify-between gap-2 lg:gap-4 px-3 sm:px-4 py-2 rounded-2xl bg-slate-950/90 backdrop-blur-xl border border-white/10 shadow-[0_8px_30px_rgba(0,0,0,0.35)] transition-all"
|
||||||
>
|
>
|
||||||
{/* Left: Logo & College Brand */}
|
{/* Left: Logo & College Brand */}
|
||||||
<Link to="/" className="flex items-center gap-2.5 group shrink-0">
|
<Link to="/" className="flex items-center gap-2.5 group shrink-0">
|
||||||
@@ -193,12 +203,12 @@ export default function Navbar() {
|
|||||||
onClick={() => setIsMoreOpen(false)}
|
onClick={() => setIsMoreOpen(false)}
|
||||||
className={`flex items-center gap-2.5 px-3 py-2 rounded-xl text-xs font-medium transition-all ${
|
className={`flex items-center gap-2.5 px-3 py-2 rounded-xl text-xs font-medium transition-all ${
|
||||||
active
|
active
|
||||||
? 'bg-gradient-to-r from-[#FF6B00] to-[#F97316] text-white font-bold'
|
? 'bg-white/15 text-orange-400 font-semibold'
|
||||||
: 'text-slate-300 hover:text-white hover:bg-white/10'
|
: 'text-slate-300 hover:text-white hover:bg-white/10'
|
||||||
}`}
|
}`}
|
||||||
style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}
|
style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}
|
||||||
>
|
>
|
||||||
{IconComponent && <IconComponent className="w-4 h-4 shrink-0 text-slate-300" />}
|
{IconComponent && <IconComponent className={`w-4 h-4 shrink-0 ${active ? 'text-orange-400' : 'text-slate-300'}`} />}
|
||||||
<span>{item.label}</span>
|
<span>{item.label}</span>
|
||||||
</Link>
|
</Link>
|
||||||
);
|
);
|
||||||
@@ -344,6 +354,7 @@ export default function Navbar() {
|
|||||||
<div className="grid grid-cols-2 gap-2">
|
<div className="grid grid-cols-2 gap-2">
|
||||||
{ALL_MOBILE_LINKS.map((link) => {
|
{ALL_MOBILE_LINKS.map((link) => {
|
||||||
const isActive = checkIsActive(link.path);
|
const isActive = checkIsActive(link.path);
|
||||||
|
const isRaise = link.path === '/raise';
|
||||||
const IconComp = link.icon;
|
const IconComp = link.icon;
|
||||||
return (
|
return (
|
||||||
<Link
|
<Link
|
||||||
@@ -351,7 +362,9 @@ export default function Navbar() {
|
|||||||
to={link.path}
|
to={link.path}
|
||||||
onClick={() => setIsMobileOpen(false)}
|
onClick={() => setIsMobileOpen(false)}
|
||||||
className={`px-3 py-2.5 rounded-xl text-xs font-semibold flex items-center gap-2 transition-all ${
|
className={`px-3 py-2.5 rounded-xl text-xs font-semibold flex items-center gap-2 transition-all ${
|
||||||
isActive
|
isRaise
|
||||||
|
? 'bg-gradient-to-r from-[#EC4899] via-[#F43F5E] to-[#E11D48] text-white font-bold shadow-md shadow-pink-500/30 col-span-2 justify-center'
|
||||||
|
: isActive
|
||||||
? 'bg-gradient-to-r from-[#FF6B00] to-[#F97316] text-white shadow-sm'
|
? 'bg-gradient-to-r from-[#FF6B00] to-[#F97316] text-white shadow-sm'
|
||||||
: 'bg-white/5 text-slate-200 hover:bg-white/10 border border-white/5'
|
: 'bg-white/5 text-slate-200 hover:bg-white/10 border border-white/5'
|
||||||
}`}
|
}`}
|
||||||
@@ -396,6 +409,27 @@ export default function Navbar() {
|
|||||||
</motion.div>
|
</motion.div>
|
||||||
)}
|
)}
|
||||||
</AnimatePresence>
|
</AnimatePresence>
|
||||||
|
|
||||||
|
{/* Floating RAISE Incubator Button directly below Sign In at right corner */}
|
||||||
|
<motion.div
|
||||||
|
initial={{ y: -10, opacity: 0 }}
|
||||||
|
animate={{ y: 0, opacity: 1 }}
|
||||||
|
transition={{ duration: 0.35, ease: 'easeOut', delay: 0.1 }}
|
||||||
|
className="absolute right-3 lg:right-4 top-[calc(100%+8px)] pointer-events-auto hidden lg:block z-40"
|
||||||
|
>
|
||||||
|
<Link
|
||||||
|
to="/raise"
|
||||||
|
className={`flex items-center gap-2 px-3.5 py-2 rounded-xl text-xs font-extrabold text-white transition-all shadow-lg hover:scale-105 active:scale-95 cursor-pointer backdrop-blur-xl ${
|
||||||
|
checkIsActive('/raise')
|
||||||
|
? 'bg-gradient-to-r from-pink-600 via-rose-600 to-pink-700 ring-2 ring-pink-300 shadow-pink-500/50'
|
||||||
|
: 'bg-gradient-to-r from-[#EC4899] via-[#F43F5E] to-[#E11D48] hover:from-[#DB2777] hover:to-[#BE123C] shadow-pink-500/40 border border-pink-400/40'
|
||||||
|
}`}
|
||||||
|
style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}
|
||||||
|
>
|
||||||
|
<Rocket className="w-4 h-4 text-white animate-pulse" />
|
||||||
|
<span>RAISE Incubator</span>
|
||||||
|
</Link>
|
||||||
|
</motion.div>
|
||||||
</motion.nav>
|
</motion.nav>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|||||||
@@ -117,13 +117,22 @@ export const FEATURES: Feature[] = [
|
|||||||
bgColor: '#FFFBEB',
|
bgColor: '#FFFBEB',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'raise',
|
id: 'gatepass',
|
||||||
icon: 'Rocket',
|
icon: 'Ticket',
|
||||||
title: 'RAISE Incubator',
|
title: 'Student Gate Pass',
|
||||||
description: 'Pitch startup ideas, get incubation support, seed funding opportunities, and entrepreneurial mentoring.',
|
description: 'Request digital campus out-pass, track warden approvals, and present clearance QR codes.',
|
||||||
path: '/raise',
|
path: '/notes?portal=gatepass',
|
||||||
color: '#EC4899',
|
color: '#10B981',
|
||||||
bgColor: '#FDF2F8',
|
bgColor: '#ECFDF5',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'proficiency',
|
||||||
|
icon: 'Award',
|
||||||
|
title: 'Student Proficiency',
|
||||||
|
description: 'Track domain competency scores, placement readiness analytics, and verified skill certifications.',
|
||||||
|
path: '/notes?portal=proficiency',
|
||||||
|
color: '#8B5CF6',
|
||||||
|
bgColor: '#F5F3FF',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -3104,6 +3113,26 @@ export const EVENTS_DATA: Event[] = [
|
|||||||
|
|
||||||
// ─── Clubs ───────────────────────────────────────────────────────────────────
|
// ─── Clubs ───────────────────────────────────────────────────────────────────
|
||||||
export const CLUBS_DATA: Club[] = [
|
export const CLUBS_DATA: Club[] = [
|
||||||
|
{
|
||||||
|
id: 'center_raise',
|
||||||
|
name: 'RAISE INCUBATOR',
|
||||||
|
description: 'Pitch startup ideas, get incubation support, seed funding opportunities, and entrepreneurial mentoring.',
|
||||||
|
details: 'RAISE Incubator is a dedicated Section 8 (not-for-profit) company situated directly within the Rajalakshmi Institute of Technology campus. We transform engineering ideas into market-viable products with seed funding, mentoring, and patent support.',
|
||||||
|
category: 'Center of Excellence',
|
||||||
|
type: 'Center',
|
||||||
|
members: 2450,
|
||||||
|
presidentName: 'Incubation Director',
|
||||||
|
vicePresidentName: 'Startup Lead',
|
||||||
|
coordinatorName: 'Dr. RIT Innovation Cell',
|
||||||
|
year: 'Campus Incubation Center',
|
||||||
|
contactEmail: 'incubator@ritchennai.edu.in',
|
||||||
|
contactPhone: '+91 44 6718 1600',
|
||||||
|
icon: 'Rocket',
|
||||||
|
logoUrl: '/logo.png',
|
||||||
|
socialLinks: {
|
||||||
|
website: '/raise',
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'nss',
|
id: 'nss',
|
||||||
name: 'NSS OF RIT',
|
name: 'NSS OF RIT',
|
||||||
@@ -3760,13 +3789,13 @@ export const QUESTIONS_DATA: Question[] = [
|
|||||||
|
|
||||||
// ─── Toolkit Items ───────────────────────────────────────────────────────────
|
// ─── Toolkit Items ───────────────────────────────────────────────────────────
|
||||||
export const TOOLKIT_ITEMS: ToolkitItem[] = [
|
export const TOOLKIT_ITEMS: ToolkitItem[] = [
|
||||||
|
{ id: '7', title: 'GPA and internal calculator', description: 'Access GPA, CGPA, and internal marks calculator utilities.', type: 'link', url: '#', icon: 'Calculator', category: 'Engineering' },
|
||||||
{ id: '1', title: 'CS tools', description: 'Access specialized development environments, IDE configurations, compiler guides, GitHub setup instructions, and essential documentation for Computer Science students.', type: 'link', url: '#', icon: 'Code', category: 'Engineering' },
|
{ id: '1', title: 'CS tools', description: 'Access specialized development environments, IDE configurations, compiler guides, GitHub setup instructions, and essential documentation for Computer Science students.', type: 'link', url: '#', icon: 'Code', category: 'Engineering' },
|
||||||
{ id: '2', title: 'Business tools', description: 'Explore enterprise resource planning (ERP) guides, financial spreadsheets, management templates, and business analytics tools for CSBS and management students.', type: 'link', url: '#', icon: 'Briefcase', category: 'Engineering' },
|
{ id: '2', title: 'Business tools', description: 'Explore enterprise resource planning (ERP) guides, financial spreadsheets, management templates, and business analytics tools for CSBS and management students.', type: 'link', url: '#', icon: 'Briefcase', category: 'Engineering' },
|
||||||
{ id: '3', title: 'Cybersecurity tools', description: 'Discover network simulators, virtualization setup guides, penetration testing tutorials, cryptography tools, and security lab blueprints.', type: 'link', url: '#', icon: 'Shield', category: 'Engineering' },
|
{ id: '3', title: 'Cybersecurity tools', description: 'Discover network simulators, virtualization setup guides, penetration testing tutorials, cryptography tools, and security lab blueprints.', type: 'link', url: '#', icon: 'Shield', category: 'Engineering' },
|
||||||
{ id: '4', title: 'AI tools', description: 'Configure machine learning frameworks, deep learning libraries, Jupyter environments, dataset download scripts, and pre-trained model APIs.', type: 'link', url: '#', icon: 'Brain', category: 'Engineering' },
|
{ id: '4', title: 'AI tools', description: 'Configure machine learning frameworks, deep learning libraries, Jupyter environments, dataset download scripts, and pre-trained model APIs.', type: 'link', url: '#', icon: 'Brain', category: 'Engineering' },
|
||||||
{ id: '5', title: 'Electrical and Electronic tools', description: 'Access circuit design simulators, MATLAB packages, microcontroller IDE setups, hardware debugging guides, and lab calculation spreadsheets.', type: 'link', url: '#', icon: 'Cpu', category: 'Engineering' },
|
{ id: '5', title: 'Electrical and Electronic tools', description: 'Access circuit design simulators, MATLAB packages, microcontroller IDE setups, hardware debugging guides, and lab calculation spreadsheets.', type: 'link', url: '#', icon: 'Cpu', category: 'Engineering' },
|
||||||
{ id: '6', title: 'Biotech tools', description: 'Find biology lab guidelines, chemical structure tools, bioinformatics databases tutorials, genetic sequence analysis resources, and safety manuals.', type: 'link', url: '#', icon: 'FlaskConical', category: 'Engineering' },
|
{ id: '6', title: 'Biotech tools', description: 'Find biology lab guidelines, chemical structure tools, bioinformatics databases tutorials, genetic sequence analysis resources, and safety manuals.', type: 'link', url: '#', icon: 'FlaskConical', category: 'Engineering' },
|
||||||
{ id: '7', title: 'GPA and internal calculator', description: 'Access GPA, CGPA, and internal marks calculator utilities.', type: 'link', url: '#', icon: 'Calculator', category: 'Engineering' },
|
|
||||||
];
|
];
|
||||||
|
|
||||||
// ─── Campus Locations ────────────────────────────────────────────────────────
|
// ─── Campus Locations ────────────────────────────────────────────────────────
|
||||||
@@ -3803,5 +3832,9 @@ export const DEPARTMENTS = [
|
|||||||
'Computer Science & Engineering',
|
'Computer Science & Engineering',
|
||||||
'Electronics & Communication Engineering',
|
'Electronics & Communication Engineering',
|
||||||
'Electronics Engineering VLSI (Design and Technology)',
|
'Electronics Engineering VLSI (Design and Technology)',
|
||||||
|
'Humanities & Sciences',
|
||||||
|
'M.E. (VLSI Design)',
|
||||||
|
'M.Tech (Data Science)',
|
||||||
|
'Mathematics',
|
||||||
'Mechanical Engineering',
|
'Mechanical Engineering',
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { useState, useMemo } from 'react';
|
import { useState, useMemo } from 'react';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
import { motion, AnimatePresence } from 'framer-motion';
|
import { motion, AnimatePresence } from 'framer-motion';
|
||||||
import {
|
import {
|
||||||
Users, Tag, X, Mail, Phone, UserCheck, GraduationCap, Info,
|
Users, Tag, X, Mail, Phone, UserCheck, GraduationCap, Info,
|
||||||
@@ -869,7 +870,8 @@ export default function Events() {
|
|||||||
selectedClub.socialLinks?.instagram ||
|
selectedClub.socialLinks?.instagram ||
|
||||||
selectedClub.socialLinks?.linkedin ||
|
selectedClub.socialLinks?.linkedin ||
|
||||||
selectedClub.socialLinks?.whatsapp ||
|
selectedClub.socialLinks?.whatsapp ||
|
||||||
selectedClub.socialLinks?.youtube
|
selectedClub.socialLinks?.youtube ||
|
||||||
|
selectedClub.socialLinks?.website
|
||||||
) && (
|
) && (
|
||||||
<div className="mb-6 bg-orange-50/60 border border-orange-200/80 rounded-2xl p-4">
|
<div className="mb-6 bg-orange-50/60 border border-orange-200/80 rounded-2xl p-4">
|
||||||
<div className="flex items-center justify-between mb-3">
|
<div className="flex items-center justify-between mb-3">
|
||||||
@@ -881,6 +883,16 @@ export default function Events() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="grid grid-cols-2 gap-2.5">
|
<div className="grid grid-cols-2 gap-2.5">
|
||||||
|
{selectedClub.socialLinks?.website && (
|
||||||
|
<Link
|
||||||
|
to={selectedClub.socialLinks.website}
|
||||||
|
onClick={() => setSelectedClub(null)}
|
||||||
|
className="flex items-center gap-2 p-2.5 rounded-xl bg-gradient-to-r from-[#EC4899] via-[#F43F5E] to-[#E11D48] text-white hover:from-pink-600 hover:to-rose-600 transition-all text-xs font-bold shadow-xs col-span-2 justify-center"
|
||||||
|
>
|
||||||
|
<Rocket className="w-4 h-4 text-white shrink-0 animate-pulse" />
|
||||||
|
<span>Launch RAISE Incubator Portal →</span>
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
|
|
||||||
{selectedClub.socialLinks?.instagram && (
|
{selectedClub.socialLinks?.instagram && (
|
||||||
<a
|
<a
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { useState, useMemo, useEffect } from 'react';
|
import { useState, useMemo, useEffect } from 'react';
|
||||||
import { motion } from 'framer-motion';
|
import { motion } from 'framer-motion';
|
||||||
import { Search, Users, Filter, ArrowUpDown, BookOpen, ChevronRight, AlertTriangle, Sparkles, X } from 'lucide-react';
|
import { Search, Users, Filter, ArrowUpDown, BookOpen, ChevronRight, Sparkles, X } from 'lucide-react';
|
||||||
import FacultyCard from '@/components/FacultyCard/FacultyCard';
|
import FacultyCard from '@/components/FacultyCard/FacultyCard';
|
||||||
import { StaggerContainer, StaggerItem } from '@/components/AnimatedContainer/AnimatedContainer';
|
import { StaggerContainer, StaggerItem } from '@/components/AnimatedContainer/AnimatedContainer';
|
||||||
import { FACULTY_DATA, DEPARTMENTS } from '@/constants';
|
import { FACULTY_DATA, DEPARTMENTS } from '@/constants';
|
||||||
@@ -8,17 +8,17 @@ import { Link, useSearchParams } from 'react-router-dom';
|
|||||||
import { getStoredImsSession } from '@/services/imsService';
|
import { getStoredImsSession } from '@/services/imsService';
|
||||||
|
|
||||||
const DEPT_MAP: Record<string, { abrv: string; full: string }> = {
|
const DEPT_MAP: Record<string, { abrv: string; full: string }> = {
|
||||||
'Computer Science & Engineering': { abrv: 'CSE', full: 'Computer Science and Engineering' },
|
'Computer Science & Engineering': { abrv: 'CSE', full: 'Computer Science & Engineering' },
|
||||||
'Computer Science & Business Systems': { abrv: 'CSBS', full: 'Computer Science and Business Systems' },
|
'Computer Science & Business Systems': { abrv: 'CSBS', full: 'Computer Science & Business Systems' },
|
||||||
'Artificial Intelligence & Machine Learning': { abrv: 'AIML', full: 'Artificial Intelligence and Machine Learning' },
|
'Artificial Intelligence & Machine Learning': { abrv: 'AIML', full: 'Artificial Intelligence & Machine Learning' },
|
||||||
'Electronics & Communication Engineering': { abrv: 'ECE', full: 'Electronics and Communication Engineering' },
|
'Electronics & Communication Engineering': { abrv: 'ECE', full: 'Electronics & Communication Engineering' },
|
||||||
'Mechanical Engineering': { abrv: 'MECH', full: 'Mechanical Engineering' },
|
'Mechanical Engineering': { abrv: 'MECH', full: 'Mechanical Engineering' },
|
||||||
'Civil Engineering': { abrv: 'CIVIL', full: 'Civil Engineering' },
|
'Civil Engineering': { abrv: 'CIVIL', full: 'Civil Engineering' },
|
||||||
'Artificial Intelligence & Data Science': { abrv: 'AI&DS', full: 'Artificial Intelligence and Data Science' },
|
'Artificial Intelligence & Data Science': { abrv: 'AI & DS', full: 'Artificial Intelligence & Data Science' },
|
||||||
'Electrical & Electronics Engineering': { abrv: 'EEE', full: 'Electrical and Electronics Engineering' },
|
'Electrical & Electronics Engineering': { abrv: 'EEE', full: 'Electrical & Electronics Engineering' },
|
||||||
'Communication and Computer Engineering': { abrv: 'CCE', full: 'Communication and Computer Engineering' },
|
'Communication and Computer Engineering': { abrv: 'CCE', full: 'Communication and Computer Engineering' },
|
||||||
'Electronics Engineering VLSI (Design and Technology)': { abrv: 'EE VLSI (D&T)', full: 'Electronics Engineering (VLSI Design and Technology)' },
|
'Electronics Engineering VLSI (Design and Technology)': { abrv: 'EE VLSI (D&T)', full: 'Electronics Engineering VLSI (Design and Technology)' },
|
||||||
'Humanities & Sciences': { abrv: 'H&S', full: 'Humanities and Sciences' },
|
'Humanities & Sciences': { abrv: 'H&S', full: 'Humanities & Sciences' },
|
||||||
'M.Tech (Data Science)': { abrv: 'M.TECH-DS', full: 'M.Tech (Data Science)' },
|
'M.Tech (Data Science)': { abrv: 'M.TECH-DS', full: 'M.Tech (Data Science)' },
|
||||||
'Mathematics': { abrv: 'MATHS', full: 'Mathematics' },
|
'Mathematics': { abrv: 'MATHS', full: 'Mathematics' },
|
||||||
'M.E. (VLSI Design)': { abrv: 'MEVLSI', full: 'M.E. (VLSI Design)' },
|
'M.E. (VLSI Design)': { abrv: 'MEVLSI', full: 'M.E. (VLSI Design)' },
|
||||||
@@ -109,8 +109,13 @@ export default function Faculty() {
|
|||||||
}, [filteredAndSortedFaculty]);
|
}, [filteredAndSortedFaculty]);
|
||||||
|
|
||||||
const departmentOrder = useMemo(() => {
|
const departmentOrder = useMemo(() => {
|
||||||
return DEPARTMENTS.filter(d => d !== 'All Departments');
|
const presentDepts = Object.keys(groupedFaculty);
|
||||||
}, []);
|
const sorted = DEPARTMENTS.filter(d => d !== 'All Departments');
|
||||||
|
presentDepts.forEach(d => {
|
||||||
|
if (!sorted.includes(d)) sorted.push(d);
|
||||||
|
});
|
||||||
|
return sorted;
|
||||||
|
}, [groupedFaculty]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen relative overflow-hidden bg-[#F8FAFC]">
|
<div className="min-h-screen relative overflow-hidden bg-[#F8FAFC]">
|
||||||
@@ -173,27 +178,6 @@ export default function Faculty() {
|
|||||||
</motion.div>
|
</motion.div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/* Under Development Banner */}
|
|
||||||
<motion.div
|
|
||||||
initial={{ opacity: 0, y: -10 }}
|
|
||||||
animate={{ opacity: 1, y: 0 }}
|
|
||||||
className="bg-amber-50 border border-amber-200 rounded-2xl p-4 flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3 text-amber-900 shadow-2xs"
|
|
||||||
>
|
|
||||||
<div className="flex items-center gap-3">
|
|
||||||
<div className="w-9 h-9 rounded-xl bg-amber-500/10 border border-amber-500/20 flex items-center justify-center shrink-0">
|
|
||||||
<AlertTriangle className="w-5 h-5 text-amber-600" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<div className="text-xs font-bold uppercase tracking-wider text-amber-700" style={{ fontFamily: 'Inter, sans-serif' }}>Under Development</div>
|
|
||||||
<div className="text-xs font-medium text-amber-900" style={{ fontFamily: 'Inter, sans-serif' }}>
|
|
||||||
Currently displaying sample mock faculty profiles. Official RIT faculty directory integration is in progress.
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<span className="px-3 py-1 rounded-full bg-amber-100 border border-amber-300 text-[11px] font-bold text-amber-800 shrink-0">
|
|
||||||
Mock Data Active
|
|
||||||
</span>
|
|
||||||
</motion.div>
|
|
||||||
|
|
||||||
{/* Faculty Hero Section */}
|
{/* Faculty Hero Section */}
|
||||||
<div className="grid grid-cols-1 lg:grid-cols-12 gap-6 items-stretch">
|
<div className="grid grid-cols-1 lg:grid-cols-12 gap-6 items-stretch">
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
import { useState, useRef, useEffect } from 'react';
|
import { useState, useRef, useEffect } from 'react';
|
||||||
import { useSearchParams } from 'react-router-dom';
|
import { useSearchParams } from 'react-router-dom';
|
||||||
import { motion } from 'framer-motion';
|
import { motion } from 'framer-motion';
|
||||||
import { Search, Download, Filter, BookOpen, FileText, ScrollText, BookMarked, ChevronRight, ArrowLeft, ExternalLink, Code, Globe, GitBranch, Cloud, Palette, Shield, DollarSign, BarChart3, Users, Megaphone, TrendingUp, UserCheck, ClipboardList, ShoppingCart, Cpu, Activity, LayoutGrid, Layers, Zap, Settings, Gauge, Radio, Wifi, Bot, Sun, Wrench, Binary, BatteryCharging, CircuitBoard, ShieldCheck, BrainCircuit, FlaskConical, Lock, Terminal, Dna, Microscope, Sparkles, Smartphone, Monitor, Server, CheckCircle2, Database, Briefcase, AlertTriangle, RefreshCw } from 'lucide-react';
|
import { Search, Download, Filter, BookOpen, FileText, ScrollText, BookMarked, ChevronRight, ArrowLeft, ExternalLink, Code, Globe, GitBranch, Cloud, Palette, Shield, DollarSign, BarChart3, Users, Megaphone, TrendingUp, UserCheck, ClipboardList, ShoppingCart, Cpu, Activity, LayoutGrid, Layers, Zap, Settings, Gauge, Radio, Wifi, Bot, Sun, Wrench, Binary, BatteryCharging, CircuitBoard, ShieldCheck, BrainCircuit, FlaskConical, Lock, Terminal, Dna, Microscope, Sparkles, Smartphone, Monitor, Server, CheckCircle2, Database, Briefcase, AlertTriangle, RefreshCw, Ticket, Award, QrCode } from 'lucide-react';
|
||||||
import SectionTitle from '@/components/SectionTitle/SectionTitle';
|
import SectionTitle from '@/components/SectionTitle/SectionTitle';
|
||||||
|
|
||||||
const MOODLE_URL = 'http://182.74.17.142/moodle/login/index.php';
|
const MOODLE_URL = 'http://182.74.17.142/moodle/login/index.php';
|
||||||
|
const GATE_PASS_URL = 'http://182.74.17.142/gatepass/login';
|
||||||
|
const PROFICIENCY_URL = 'http://182.74.17.142/proficiency/login';
|
||||||
import { getBackendUrl } from '@/lib/utils';
|
import { getBackendUrl } from '@/lib/utils';
|
||||||
import { StaggerContainer, StaggerItem } from '@/components/AnimatedContainer/AnimatedContainer';
|
import { StaggerContainer, StaggerItem } from '@/components/AnimatedContainer/AnimatedContainer';
|
||||||
import { TOOLKIT_ITEMS, DEPARTMENTS } from '@/constants';
|
import { TOOLKIT_ITEMS, DEPARTMENTS } from '@/constants';
|
||||||
@@ -1329,6 +1331,7 @@ export default function Notes() {
|
|||||||
const [selectedCategory, setSelectedCategory] = useState<number | null>(null);
|
const [selectedCategory, setSelectedCategory] = useState<number | null>(null);
|
||||||
const [selectedLanguage, setSelectedLanguage] = useState<number | null>(null);
|
const [selectedLanguage, setSelectedLanguage] = useState<number | null>(null);
|
||||||
const [selectedTool, setSelectedTool] = useState<{ name: string; desc: string; url: string; category: string; bg: string; color: string } | null>(null);
|
const [selectedTool, setSelectedTool] = useState<{ name: string; desc: string; url: string; category: string; bg: string; color: string } | null>(null);
|
||||||
|
const [activePortalTab, setActivePortalTab] = useState<'moodle' | 'gatepass' | 'proficiency'>('moodle');
|
||||||
|
|
||||||
const [notes, setNotes] = useState<any[]>([]);
|
const [notes, setNotes] = useState<any[]>([]);
|
||||||
|
|
||||||
@@ -1363,6 +1366,10 @@ export default function Notes() {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
const portalParam = searchParams.get('portal');
|
||||||
|
if (portalParam === 'gatepass' || portalParam === 'proficiency' || portalParam === 'moodle') {
|
||||||
|
setActivePortalTab(portalParam as any);
|
||||||
|
}
|
||||||
if (searchParams.get('section') === 'toolkit') {
|
if (searchParams.get('section') === 'toolkit') {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
toolkitRef.current?.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
toolkitRef.current?.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||||||
@@ -1919,7 +1926,10 @@ export default function Notes() {
|
|||||||
) : (
|
) : (
|
||||||
<div>
|
<div>
|
||||||
<div className="mb-12">
|
<div className="mb-12">
|
||||||
{/* Moodle Academic Portal Hero Hub */}
|
|
||||||
|
|
||||||
|
{/* 1. MOODLE LMS CARD */}
|
||||||
|
{activePortalTab === 'moodle' && (
|
||||||
<motion.div
|
<motion.div
|
||||||
initial={{ opacity: 0, y: 16 }}
|
initial={{ opacity: 0, y: 16 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
@@ -1927,18 +1937,15 @@ export default function Notes() {
|
|||||||
className="bg-white rounded-3xl border border-[#E5E7EB] p-8 md:p-10 shadow-sm relative overflow-hidden mb-8"
|
className="bg-white rounded-3xl border border-[#E5E7EB] p-8 md:p-10 shadow-sm relative overflow-hidden mb-8"
|
||||||
style={{ boxShadow: '0 4px 25px -5px rgba(0,0,0,0.05)' }}
|
style={{ boxShadow: '0 4px 25px -5px rgba(0,0,0,0.05)' }}
|
||||||
>
|
>
|
||||||
{/* Subtle Decorative Background Glow */}
|
|
||||||
<div className="absolute -right-20 -top-20 w-80 h-80 bg-orange-500/5 rounded-full blur-3xl pointer-events-none" />
|
<div className="absolute -right-20 -top-20 w-80 h-80 bg-orange-500/5 rounded-full blur-3xl pointer-events-none" />
|
||||||
<div className="absolute -left-20 -bottom-20 w-80 h-80 bg-amber-500/5 rounded-full blur-3xl pointer-events-none" />
|
<div className="absolute -left-20 -bottom-20 w-80 h-80 bg-amber-500/5 rounded-full blur-3xl pointer-events-none" />
|
||||||
|
|
||||||
<div className="relative z-10 max-w-3xl mx-auto text-center">
|
<div className="relative z-10 max-w-3xl mx-auto text-center">
|
||||||
{/* Header Badge */}
|
|
||||||
<div className="inline-flex items-center gap-2 px-3.5 py-1.5 rounded-full bg-orange-50 border border-orange-200 text-xs font-bold text-[#F97316] mb-6">
|
<div className="inline-flex items-center gap-2 px-3.5 py-1.5 rounded-full bg-orange-50 border border-orange-200 text-xs font-bold text-[#F97316] mb-6">
|
||||||
<BookOpen className="w-4 h-4 text-[#F97316]" />
|
<BookOpen className="w-4 h-4 text-[#F97316]" />
|
||||||
<span>Official RIT Learning Management System</span>
|
<span>Official RIT Learning Management System</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Main Heading */}
|
|
||||||
<h2 className="text-3xl sm:text-4xl font-extrabold text-[#1E293B] mb-4 leading-tight" style={{ fontFamily: 'Playfair Display, serif' }}>
|
<h2 className="text-3xl sm:text-4xl font-extrabold text-[#1E293B] mb-4 leading-tight" style={{ fontFamily: 'Playfair Display, serif' }}>
|
||||||
Access Academic Notes & Study Materials on{' '}
|
Access Academic Notes & Study Materials on{' '}
|
||||||
<span style={{ background: 'linear-gradient(135deg, #F97316, #FB923C)', WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent', backgroundClip: 'text' }}>
|
<span style={{ background: 'linear-gradient(135deg, #F97316, #FB923C)', WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent', backgroundClip: 'text' }}>
|
||||||
@@ -1950,7 +1957,6 @@ export default function Notes() {
|
|||||||
All official semester notes, previous year question papers (PYQs), syllabus data, and lab manuals are hosted directly on the official Rajalakshmi Institute of Technology Moodle server.
|
All official semester notes, previous year question papers (PYQs), syllabus data, and lab manuals are hosted directly on the official Rajalakshmi Institute of Technology Moodle server.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
{/* Primary Launch Action Buttons */}
|
|
||||||
<div className="flex flex-col sm:flex-row items-center justify-center gap-4 mb-10">
|
<div className="flex flex-col sm:flex-row items-center justify-center gap-4 mb-10">
|
||||||
<a
|
<a
|
||||||
href={MOODLE_URL}
|
href={MOODLE_URL}
|
||||||
@@ -1979,7 +1985,6 @@ export default function Notes() {
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Feature Highlights Grid */}
|
|
||||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 text-left border-t border-[#F1F5F9] pt-8">
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 text-left border-t border-[#F1F5F9] pt-8">
|
||||||
<div className="p-4 rounded-2xl bg-[#F8FAFC] border border-[#E5E7EB]/70 flex flex-col gap-2">
|
<div className="p-4 rounded-2xl bg-[#F8FAFC] border border-[#E5E7EB]/70 flex flex-col gap-2">
|
||||||
<div className="w-8 h-8 rounded-xl bg-emerald-500/10 border border-emerald-500/20 flex items-center justify-center text-emerald-600">
|
<div className="w-8 h-8 rounded-xl bg-emerald-500/10 border border-emerald-500/20 flex items-center justify-center text-emerald-600">
|
||||||
@@ -2017,13 +2022,205 @@ export default function Notes() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* Technical Security Note */}
|
{/* 2. STUDENT GATE PASS CARD */}
|
||||||
<div className="mt-6 text-[11px] text-[#94A3B8] leading-relaxed" style={{ fontFamily: 'Inter, sans-serif' }}>
|
{activePortalTab === 'gatepass' && (
|
||||||
ℹ️ <span className="font-semibold text-[#64748B]">Security Note:</span> To protect student session privacy and prevent clickjacking attacks, RIT's Moodle server enforces opening the portal directly in a secure browser tab rather than inside third-party frames (<code className="bg-slate-100 px-1 py-0.5 rounded text-[10px]">X-Frame-Options: SAMEORIGIN</code>).
|
<motion.div
|
||||||
|
initial={{ opacity: 0, y: 16 }}
|
||||||
|
animate={{ opacity: 1, y: 0 }}
|
||||||
|
transition={{ duration: 0.4 }}
|
||||||
|
className="bg-white rounded-3xl border border-[#E5E7EB] p-8 md:p-10 shadow-sm relative overflow-hidden mb-8"
|
||||||
|
style={{ boxShadow: '0 4px 25px -5px rgba(0,0,0,0.05)' }}
|
||||||
|
>
|
||||||
|
<div className="absolute -right-20 -top-20 w-80 h-80 bg-orange-500/5 rounded-full blur-3xl pointer-events-none" />
|
||||||
|
<div className="absolute -left-20 -bottom-20 w-80 h-80 bg-amber-500/5 rounded-full blur-3xl pointer-events-none" />
|
||||||
|
|
||||||
|
<div className="relative z-10 max-w-3xl mx-auto text-center">
|
||||||
|
<div className="inline-flex items-center gap-2 px-3.5 py-1.5 rounded-full bg-orange-50 border border-orange-200 text-xs font-bold text-[#F97316] mb-6">
|
||||||
|
<Ticket className="w-4 h-4 text-[#F97316]" />
|
||||||
|
<span>Official RIT Campus Gate Pass Portal</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2 className="text-3xl sm:text-4xl font-extrabold text-[#1E293B] mb-4 leading-tight" style={{ fontFamily: 'Playfair Display, serif' }}>
|
||||||
|
Request & Manage Out-Passes on{' '}
|
||||||
|
<span style={{ background: 'linear-gradient(135deg, #F97316, #FB923C)', WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent', backgroundClip: 'text' }}>
|
||||||
|
Student Gate Pass
|
||||||
|
</span>
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p className="text-base text-[#64748B] mb-8 leading-relaxed max-w-2xl mx-auto" style={{ fontFamily: 'Inter, sans-serif' }}>
|
||||||
|
Official digital campus out-pass system for day scholars and hostellers. Submit leave requests, track warden approvals, and present digital QR passes to campus security.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div className="flex flex-col sm:flex-row items-center justify-center gap-4 mb-10">
|
||||||
|
<button
|
||||||
|
onClick={() => {
|
||||||
|
alert('Student Gate Pass Portal dummy link triggered! You can provide the live URL anytime to connect it.');
|
||||||
|
}}
|
||||||
|
className="w-full sm:w-auto inline-flex items-center justify-center gap-3 px-8 py-4 rounded-2xl text-base font-bold text-white shadow-lg hover:shadow-xl hover:-translate-y-0.5 transition-all cursor-pointer"
|
||||||
|
style={{
|
||||||
|
fontFamily: 'Poppins, sans-serif',
|
||||||
|
background: 'linear-gradient(135deg, #F97316, #FB923C)',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ExternalLink className="w-5 h-5" />
|
||||||
|
Launch Student Gate Pass Portal
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button
|
||||||
|
onClick={() => {
|
||||||
|
navigator.clipboard.writeText(GATE_PASS_URL);
|
||||||
|
alert('Student Gate Pass URL copied to clipboard!');
|
||||||
|
}}
|
||||||
|
className="w-full sm:w-auto inline-flex items-center justify-center gap-2 px-6 py-4 rounded-2xl border border-[#E5E7EB] hover:border-[#F97316] bg-[#F8FAFC] hover:bg-white text-sm font-semibold text-[#475569] hover:text-[#F97316] transition-all cursor-pointer"
|
||||||
|
style={{ fontFamily: 'Poppins, sans-serif' }}
|
||||||
|
>
|
||||||
|
<Globe className="w-4 h-4 text-[#64748B]" />
|
||||||
|
Copy Gate Pass Direct URL
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 text-left border-t border-[#F1F5F9] pt-8">
|
||||||
|
<div className="p-4 rounded-2xl bg-emerald-50/50 border border-emerald-100 flex flex-col gap-2">
|
||||||
|
<div className="w-8 h-8 rounded-xl bg-emerald-500/10 border border-emerald-500/20 flex items-center justify-center text-emerald-600">
|
||||||
|
<QrCode className="w-4 h-4" />
|
||||||
|
</div>
|
||||||
|
<div className="text-xs font-bold text-[#1E293B]" style={{ fontFamily: 'Poppins, sans-serif' }}>
|
||||||
|
Digital QR Clearance
|
||||||
|
</div>
|
||||||
|
<div className="text-[11px] text-[#64748B]" style={{ fontFamily: 'Inter, sans-serif' }}>
|
||||||
|
Generate real-time encrypted QR code for security verification at campus gates.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="p-4 rounded-2xl bg-emerald-50/50 border border-emerald-100 flex flex-col gap-2">
|
||||||
|
<div className="w-8 h-8 rounded-xl bg-teal-500/10 border border-teal-500/20 flex items-center justify-center text-teal-600">
|
||||||
|
<CheckCircle2 className="w-4 h-4" />
|
||||||
|
</div>
|
||||||
|
<div className="text-xs font-bold text-[#1E293B]" style={{ fontFamily: 'Poppins, sans-serif' }}>
|
||||||
|
Warden & Parent Approval
|
||||||
|
</div>
|
||||||
|
<div className="text-[11px] text-[#64748B]" style={{ fontFamily: 'Inter, sans-serif' }}>
|
||||||
|
Automated SMS and email notifications to wardens, mentors, and registered guardians.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="p-4 rounded-2xl bg-emerald-50/50 border border-emerald-100 flex flex-col gap-2">
|
||||||
|
<div className="w-8 h-8 rounded-xl bg-green-500/10 border border-green-500/20 flex items-center justify-center text-green-600">
|
||||||
|
<ShieldCheck className="w-4 h-4" />
|
||||||
|
</div>
|
||||||
|
<div className="text-xs font-bold text-[#1E293B]" style={{ fontFamily: 'Poppins, sans-serif' }}>
|
||||||
|
Verified RIT Student ID
|
||||||
|
</div>
|
||||||
|
<div className="text-[11px] text-[#64748B]" style={{ fontFamily: 'Inter, sans-serif' }}>
|
||||||
|
Authenticates securely with official college Roll Number & registered portal password.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* 3. STUDENT PROFICIENCY CARD */}
|
||||||
|
{activePortalTab === 'proficiency' && (
|
||||||
|
<motion.div
|
||||||
|
initial={{ opacity: 0, y: 16 }}
|
||||||
|
animate={{ opacity: 1, y: 0 }}
|
||||||
|
transition={{ duration: 0.4 }}
|
||||||
|
className="bg-white rounded-3xl border border-[#E5E7EB] p-8 md:p-10 shadow-sm relative overflow-hidden mb-8"
|
||||||
|
style={{ boxShadow: '0 4px 25px -5px rgba(0,0,0,0.05)' }}
|
||||||
|
>
|
||||||
|
<div className="absolute -right-20 -top-20 w-80 h-80 bg-orange-500/5 rounded-full blur-3xl pointer-events-none" />
|
||||||
|
<div className="absolute -left-20 -bottom-20 w-80 h-80 bg-amber-500/5 rounded-full blur-3xl pointer-events-none" />
|
||||||
|
|
||||||
|
<div className="relative z-10 max-w-3xl mx-auto text-center">
|
||||||
|
<div className="inline-flex items-center gap-2 px-3.5 py-1.5 rounded-full bg-orange-50 border border-orange-200 text-xs font-bold text-[#F97316] mb-6">
|
||||||
|
<Award className="w-4 h-4 text-[#F97316]" />
|
||||||
|
<span>Official RIT Skill Evaluation & Readiness System</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2 className="text-3xl sm:text-4xl font-extrabold text-[#1E293B] mb-4 leading-tight" style={{ fontFamily: 'Playfair Display, serif' }}>
|
||||||
|
Track Skill Milestones & Credentials on{' '}
|
||||||
|
<span style={{ background: 'linear-gradient(135deg, #F97316, #FB923C)', WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent', backgroundClip: 'text' }}>
|
||||||
|
Student Proficiency
|
||||||
|
</span>
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p className="text-base text-[#64748B] mb-8 leading-relaxed max-w-2xl mx-auto" style={{ fontFamily: 'Inter, sans-serif' }}>
|
||||||
|
Official RIT skill evaluation platform for tracking domain competencies, technical certifications, placement readiness scores, and verified proficiency badges.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div className="flex flex-col sm:flex-row items-center justify-center gap-4 mb-10">
|
||||||
|
<button
|
||||||
|
onClick={() => {
|
||||||
|
alert('Student Proficiency Portal dummy link triggered! You can provide the live URL anytime to connect it.');
|
||||||
|
}}
|
||||||
|
className="w-full sm:w-auto inline-flex items-center justify-center gap-3 px-8 py-4 rounded-2xl text-base font-bold text-white shadow-lg hover:shadow-xl hover:-translate-y-0.5 transition-all cursor-pointer"
|
||||||
|
style={{
|
||||||
|
fontFamily: 'Poppins, sans-serif',
|
||||||
|
background: 'linear-gradient(135deg, #F97316, #FB923C)',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ExternalLink className="w-5 h-5" />
|
||||||
|
Launch Student Proficiency Portal
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button
|
||||||
|
onClick={() => {
|
||||||
|
navigator.clipboard.writeText(PROFICIENCY_URL);
|
||||||
|
alert('Student Proficiency URL copied to clipboard!');
|
||||||
|
}}
|
||||||
|
className="w-full sm:w-auto inline-flex items-center justify-center gap-2 px-6 py-4 rounded-2xl border border-[#E5E7EB] hover:border-[#F97316] bg-[#F8FAFC] hover:bg-white text-sm font-semibold text-[#475569] hover:text-[#F97316] transition-all cursor-pointer"
|
||||||
|
style={{ fontFamily: 'Poppins, sans-serif' }}
|
||||||
|
>
|
||||||
|
<Globe className="w-4 h-4 text-[#64748B]" />
|
||||||
|
Copy Proficiency Direct URL
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 text-left border-t border-[#F1F5F9] pt-8">
|
||||||
|
<div className="p-4 rounded-2xl bg-purple-50/50 border border-purple-100 flex flex-col gap-2">
|
||||||
|
<div className="w-8 h-8 rounded-xl bg-purple-500/10 border border-purple-500/20 flex items-center justify-center text-purple-600">
|
||||||
|
<TrendingUp className="w-4 h-4" />
|
||||||
|
</div>
|
||||||
|
<div className="text-xs font-bold text-[#1E293B]" style={{ fontFamily: 'Poppins, sans-serif' }}>
|
||||||
|
Skill Radar & Domain Scores
|
||||||
|
</div>
|
||||||
|
<div className="text-[11px] text-[#64748B]" style={{ fontFamily: 'Inter, sans-serif' }}>
|
||||||
|
Visualize competency scores across programming, core engineering, and analytical reasoning.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="p-4 rounded-2xl bg-purple-50/50 border border-purple-100 flex flex-col gap-2">
|
||||||
|
<div className="w-8 h-8 rounded-xl bg-indigo-500/10 border border-indigo-500/20 flex items-center justify-center text-indigo-600">
|
||||||
|
<Sparkles className="w-4 h-4" />
|
||||||
|
</div>
|
||||||
|
<div className="text-xs font-bold text-[#1E293B]" style={{ fontFamily: 'Poppins, sans-serif' }}>
|
||||||
|
Placement Readiness
|
||||||
|
</div>
|
||||||
|
<div className="text-[11px] text-[#64748B]" style={{ fontFamily: 'Inter, sans-serif' }}>
|
||||||
|
Live feedback on mock interview performances, coding assessments, and company cutoffs.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="p-4 rounded-2xl bg-purple-50/50 border border-purple-100 flex flex-col gap-2">
|
||||||
|
<div className="w-8 h-8 rounded-xl bg-violet-500/10 border border-violet-500/20 flex items-center justify-center text-violet-600">
|
||||||
|
<Award className="w-4 h-4" />
|
||||||
|
</div>
|
||||||
|
<div className="text-xs font-bold text-[#1E293B]" style={{ fontFamily: 'Poppins, sans-serif' }}>
|
||||||
|
Verified Credentials
|
||||||
|
</div>
|
||||||
|
<div className="text-[11px] text-[#64748B]" style={{ fontFamily: 'Inter, sans-serif' }}>
|
||||||
|
Upload, verify, and generate shareable badges for NPTEL, Coursera & RIT certification credits.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -1404,6 +1404,65 @@ export default function Toolkit() {
|
|||||||
<SectionTitle tag="Useful Downloads" title="Student" highlight="Toolkit" align="left" />
|
<SectionTitle tag="Useful Downloads" title="Student" highlight="Toolkit" align="left" />
|
||||||
<StaggerContainer className="grid grid-cols-1 md:grid-cols-2 gap-6 mb-20">
|
<StaggerContainer className="grid grid-cols-1 md:grid-cols-2 gap-6 mb-20">
|
||||||
{TOOLKIT_ITEMS.map((item) => {
|
{TOOLKIT_ITEMS.map((item) => {
|
||||||
|
if (item.title === 'GPA and internal calculator') {
|
||||||
|
return (
|
||||||
|
<StaggerItem key={item.id} className="col-span-1 md:col-span-2 flex">
|
||||||
|
<motion.div
|
||||||
|
onClick={() => setSelectedToolkit('gpa')}
|
||||||
|
whileHover={{ y: -4, boxShadow: '0 20px 40px -12px rgba(239,68,68,0.22)' }}
|
||||||
|
className="relative w-full p-7 md:p-8 bg-gradient-to-r from-[#FFF7ED] via-[#FEF2F2] to-[#FFF1F2] rounded-[26px] border-2 border-[#FECACA] hover:border-[#FCA5A5] cursor-pointer group transition-all shadow-md hover:shadow-xl overflow-hidden flex flex-col md:flex-row items-start md:items-center justify-between gap-6"
|
||||||
|
>
|
||||||
|
{/* Top Gradient Bar */}
|
||||||
|
<div className="absolute top-0 left-0 right-0 h-1.5 bg-gradient-to-r from-[#FF6B00] via-[#EF4444] to-[#F97316]" />
|
||||||
|
|
||||||
|
<div className="flex items-start md:items-center gap-5 flex-1 min-w-0 z-10">
|
||||||
|
<div className="w-16 h-16 md:w-18 md:h-18 rounded-2xl bg-gradient-to-tr from-[#EF4444] via-[#F97316] to-[#FF6B00] text-white flex items-center justify-center shrink-0 font-bold shadow-lg shadow-rose-500/25 group-hover:scale-105 transition-transform">
|
||||||
|
<Calculator className="w-8 h-8 md:w-9 md:h-9" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex-1 min-w-0">
|
||||||
|
<div className="flex flex-wrap items-center gap-2.5 mb-1.5">
|
||||||
|
<span className="inline-flex items-center gap-1.5 px-3 py-1 rounded-full text-xs font-extrabold bg-gradient-to-r from-[#EF4444] to-[#F97316] text-white shadow-xs tracking-wide uppercase">
|
||||||
|
<Sparkles className="w-3.5 h-3.5 animate-pulse" /> POPULAR UTILITY
|
||||||
|
</span>
|
||||||
|
<span className="inline-flex items-center gap-1 px-2.5 py-0.5 rounded-full text-xs font-semibold bg-white/90 text-[#991B1B] border border-red-200 shadow-2xs">
|
||||||
|
RIT Regulations
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3 className="text-xl md:text-2xl font-extrabold text-[#1E293B] group-hover:text-[#EF4444] transition-colors mb-1.5" style={{ fontFamily: 'Plus Jakarta Sans, sans-serif' }}>
|
||||||
|
GPA, CGPA & Internal Marks Calculator
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p className="text-sm text-[#475569] leading-relaxed max-w-2xl" style={{ fontFamily: 'Inter, sans-serif' }}>
|
||||||
|
Calculate your semester GPA, overall CGPA, and internal assessment marks based on official department course regulations and grade points.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div className="flex flex-wrap items-center gap-3 mt-3 text-xs font-medium text-[#64748B]">
|
||||||
|
<span className="flex items-center gap-1.5 text-rose-700 font-semibold bg-rose-50 px-2.5 py-1 rounded-lg border border-rose-200/80">
|
||||||
|
<CheckCircle2 className="w-3.5 h-3.5 text-rose-500" /> Semester GPA
|
||||||
|
</span>
|
||||||
|
<span className="flex items-center gap-1.5 text-orange-700 font-semibold bg-orange-50 px-2.5 py-1 rounded-lg border border-orange-200/80">
|
||||||
|
<CheckCircle2 className="w-3.5 h-3.5 text-orange-500" /> Cumulative CGPA
|
||||||
|
</span>
|
||||||
|
<span className="flex items-center gap-1.5 text-amber-700 font-semibold bg-amber-50 px-2.5 py-1 rounded-lg border border-amber-200/80">
|
||||||
|
<CheckCircle2 className="w-3.5 h-3.5 text-amber-500" /> Internal Score
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex items-center gap-2 z-10 self-end md:self-center shrink-0">
|
||||||
|
<button className="px-6 py-3 bg-gradient-to-r from-[#EF4444] via-[#F97316] to-[#FF6B00] hover:from-[#DC2626] hover:to-[#EA580C] text-white font-bold text-sm rounded-xl shadow-md group-hover:shadow-lg group-hover:scale-105 transition-all flex items-center gap-2">
|
||||||
|
Calculate Now
|
||||||
|
<ChevronRight className="w-4 h-4 group-hover:translate-x-1 transition-transform" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
</StaggerItem>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const iconConfig = TOOLKIT_ICONS[item.title] || { icon: Code, bg: '#FFF7ED', color: '#F97316' };
|
const iconConfig = TOOLKIT_ICONS[item.title] || { icon: Code, bg: '#FFF7ED', color: '#F97316' };
|
||||||
const IconComponent = iconConfig.icon;
|
const IconComponent = iconConfig.icon;
|
||||||
return (
|
return (
|
||||||
@@ -1422,8 +1481,6 @@ export default function Toolkit() {
|
|||||||
setSelectedToolkit('ai');
|
setSelectedToolkit('ai');
|
||||||
} else if (item.title === 'Biotech tools') {
|
} else if (item.title === 'Biotech tools') {
|
||||||
setSelectedToolkit('biotech');
|
setSelectedToolkit('biotech');
|
||||||
} else if (item.title === 'GPA and internal calculator') {
|
|
||||||
setSelectedToolkit('gpa');
|
|
||||||
} else if (item.url && item.url !== '#') {
|
} else if (item.url && item.url !== '#') {
|
||||||
window.open(item.url, '_blank');
|
window.open(item.url, '_blank');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user