diff --git a/package.json b/package.json
index 58206d8394..647f5492d6 100644
--- a/package.json
+++ b/package.json
@@ -59,6 +59,7 @@
"dompurify": "^3.2.5",
"elliptic": "^6.6.1",
"font-awesome": "^4.7.0",
+ "framer-motion": "^12.9.2",
"fs-extra": "^11.3.0",
"history": "^4.10.1",
"html-react-parser": "^1.4.14",
diff --git a/src/components/CommunityPortal/EventManagement/EventManagementTabs.jsx b/src/components/CommunityPortal/EventManagement/EventManagementTabs.jsx
new file mode 100644
index 0000000000..2c19690c65
--- /dev/null
+++ b/src/components/CommunityPortal/EventManagement/EventManagementTabs.jsx
@@ -0,0 +1,110 @@
+import { useState, useEffect } from 'react';
+import { useParams, useHistory } from 'react-router-dom';
+import styles from './EventManagementTabs.module.css';
+
+const dummyEvents = [
+ { id: '1', name: 'Tech Conference 2025', date: '2025-05-15', location: 'San Francisco' },
+ { id: '2', name: 'AI Summit', date: '2025-06-20', location: 'New York' },
+ { id: '3', name: 'Developer Meetup', date: '2025-07-10', location: 'Chicago' },
+];
+
+function EventManagementTabs() {
+ const { activityid, tab, section } = useParams();
+ const history = useHistory();
+ const [event, setEvent] = useState(null);
+ const [activeTab, setActiveTab] = useState(tab || 'description');
+ const [activeSection, setActiveSection] = useState(section || 'comments');
+
+ useEffect(() => {
+ const foundEvent = dummyEvents.find(e => e.id === activityid);
+ setEvent(foundEvent);
+ }, [activityid]);
+
+ const tabs = [
+ { key: 'description', label: 'Description' },
+ { key: 'analysis', label: 'Analysis' },
+ { key: 'resources', label: 'Resources' },
+ { key: 'engagement', label: 'Engagement' },
+ ];
+
+ const engagementSections = ['comments', 'feedback'];
+
+ const handleTabClick = newTab => {
+ setActiveTab(newTab);
+ const newPath =
+ newTab === 'engagement'
+ ? `../communityportal/activity/${activityid}/engagement/comments`
+ : `../communityportal/activity/${activityid}/${newTab}`;
+ history.push(newPath);
+ };
+
+ const handleEngagementSectionClick = newSection => {
+ setActiveSection(newSection);
+ history.push(`/communityportal/activity/${activityid}/engagement/${newSection}`);
+ };
+
+ const renderContent = () => {
+ if (!event) return
Event details below
;
+
+ if (activeTab === 'engagement') {
+ return (
+
+
+ {engagementSections.map(sec => (
+
+ ))}
+
+
+ {activeSection === 'feedback' ? (
+
Feedback section
+ ) : (
+
Comments Section
+ )}
+
+
+ );
+ }
+
+ switch (activeTab) {
+ case 'analysis':
+ return Analysis for {event.name}
;
+ case 'resources':
+ return Resources for {event.name}
;
+ case 'description':
+ default:
+ return (
+
+
This is a detailed description of the event.
+
+ );
+ }
+ };
+
+ return (
+
+
+ {tabs.map(({ key, label }) => (
+
+ ))}
+
+
+
{renderContent()}
+
+ );
+}
+
+export default EventManagementTabs;
diff --git a/src/components/CommunityPortal/EventManagement/EventManagementTabs.module.css b/src/components/CommunityPortal/EventManagement/EventManagementTabs.module.css
new file mode 100644
index 0000000000..a930300e9a
--- /dev/null
+++ b/src/components/CommunityPortal/EventManagement/EventManagementTabs.module.css
@@ -0,0 +1,59 @@
+.eventTabs {
+ margin-top: 10px;
+}
+
+.tabButtons {
+ display: flex;
+ gap: 10px;
+ margin-bottom: 15px;
+}
+
+.tabBtn {
+ padding: 10px 15px;
+ border: none;
+ background-color: transparent;
+ font-size: 16px;
+ cursor: pointer;
+ transition: all 0.2s ease-in-out;
+ font-weight: normal;
+}
+
+.tabBtn:hover {
+ font-weight: bold;
+}
+
+.tabBtn.active {
+ font-weight: bold;
+ border-bottom: 2px solid black;
+}
+
+.engagementSections {
+ display: flex;
+ gap: 10px;
+ margin-bottom: 10px;
+}
+
+.sectionBtn {
+ padding: 8px 12px;
+ border: none;
+ background-color: lightgray;
+ cursor: pointer;
+ transition: all 0.2s ease-in-out;
+}
+
+.sectionBtn.active {
+ font-weight: bold;
+ background-color: #595959;
+ color: white;
+}
+
+.contentBox {
+ padding: 15px;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ margin-top: 10px;
+}
+
+.mainContent {
+ margin-top: 10px;
+}
diff --git a/src/components/CommunityPortal/EventManagement/EventPage.jsx b/src/components/CommunityPortal/EventManagement/EventPage.jsx
new file mode 100644
index 0000000000..278f7e024e
--- /dev/null
+++ b/src/components/CommunityPortal/EventManagement/EventPage.jsx
@@ -0,0 +1,234 @@
+import { useState } from 'react';
+import { useParams, useHistory } from 'react-router-dom';
+import DatePicker from 'react-datepicker';
+import 'react-datepicker/dist/react-datepicker.css';
+import Calendar from 'react-calendar';
+import 'react-calendar/dist/Calendar.css';
+import { useSelector } from 'react-redux';
+import styles from './EventPage.module.css';
+import EventManagementTabs from './EventManagementTabs';
+
+function EventPage() {
+ const darkMode = useSelector(state => state.theme.darkMode);
+ const { activityid } = useParams();
+ const history = useHistory();
+
+ const [eventName, setEventName] = useState('Event Name');
+ const [eventType, setEventType] = useState('In-person');
+ const [location, setLocation] = useState('San Francisco, CA 94108');
+ const [startDate, setStartDate] = useState(new Date());
+ const [endDate, setEndDate] = useState(new Date());
+ const [time, setTime] = useState('9:00 AM - 11:00 AM EDT');
+ const [organizer, setOrganizer] = useState('Alex Brain');
+ const [capacity, setCapacity] = useState('120/200');
+ const [status, setStatus] = useState('Active');
+ const [rating] = useState(4);
+ const [media, setMedia] = useState(null);
+ const [description, setDescription] = useState('');
+
+ const handleMediaUpload = event => {
+ const file = event.target.files[0];
+ if (file) {
+ const reader = new FileReader();
+ reader.onloadend = () => {
+ setMedia(reader.result);
+ };
+ reader.readAsDataURL(file);
+ }
+ };
+
+ const renderStars = () => {
+ const stars = ['one', 'two', 'three', 'four', 'five'];
+ return stars.map((id, i) => (
+
+ ⭐
+
+ ));
+ };
+
+ const handleDateChange = dates => {
+ const [start, end] = dates;
+ const today = new Date();
+ today.setHours(0, 0, 0, 0);
+ if (start >= today) {
+ setStartDate(start);
+ setEndDate(end || start);
+ }
+ };
+
+ return (
+
+
+
+
+ {media ?

:
No Media}
+
+
+
+
+
+
setEventName(e.target.value)}
+ />
+
+ Type:{' '}
+
+
+
+ Location:{' '}
+ setLocation(e.target.value)}
+ className={darkMode ? styles.inputDark : ''}
+ />
+
+
+
+
+
+
+ ⏰ Time:
+
{' '}
+
setTime(e.target.value)}
+ className={darkMode ? styles.inputDark : ''}
+ />
+
+
+
+ 👤 Organizer:
+
{' '}
+
setOrganizer(e.target.value)}
+ className={darkMode ? styles.inputDark : ''}
+ />
+
+
+
+
+
+ {' '}
+
+ 👥 Capacity:
+
{' '}
+ setCapacity(e.target.value)}
+ className={darkMode ? styles.inputDark : ''}
+ />
+
+
+
+ {' '}
+
+ ⭐ Overall Rating:
{renderStars()}
+
+
+
+ {' '}
+
+ Status:
+
+
+
+
+
+
+
+
+
+ {
+ if (date >= new Date().setHours(0, 0, 0, 0)) {
+ setStartDate(date);
+ setEndDate(date);
+ }
+ }}
+ value={startDate}
+ minDate={new Date()}
+ tileClassName={({ date, view }) => {
+ if (view === 'month' && date < new Date().setHours(0, 0, 0, 0)) {
+ return styles.calendarTileDisabled;
+ }
+ return null;
+ }}
+ />
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default EventPage;
diff --git a/src/components/CommunityPortal/EventManagement/EventPage.module.css b/src/components/CommunityPortal/EventManagement/EventPage.module.css
new file mode 100644
index 0000000000..5fddd1d32e
--- /dev/null
+++ b/src/components/CommunityPortal/EventManagement/EventPage.module.css
@@ -0,0 +1,236 @@
+.eventPage {
+ padding: 50px;
+}
+
+.eventCard {
+ display: flex;
+ gap: 20px;
+ padding: 20px;
+ background: var(--background);
+ color: var(--text-color);
+ border-radius: 10px;
+ box-shadow: 0 4px 8px rgb(0 0 0 / 10%);
+ border: 1px solid #d3d3d3;
+}
+
+.eventCard:hover {
+ box-shadow: none;
+ transform: none;
+}
+
+.eventCardLeft {
+ width: 20%;
+ height: 90%;
+}
+
+.eventCardMiddle {
+ width: 60%;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.eventCardRight {
+ width: 20%;
+ max-height: 90%;
+ padding-top: 90px;
+}
+
+.eventCardImage {
+ width: 100%;
+ height: 400px;
+ background: #ddd;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 8px;
+}
+
+.eventCardMediaUpload {
+ width: 100%;
+ margin-top: 10px;
+}
+
+.eventCardTitle {
+ text-align: center;
+ font-size: 1.5rem;
+ font-weight: bold;
+ border: none;
+ outline: none;
+ background: transparent;
+ width: 100%;
+}
+
+.eventCardType {
+ margin: 0;
+}
+
+.eventCard12 {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ align-items: flex-start;
+ width: 100%;
+ max-width: 98%;
+ padding: 15px;
+ margin: 10px;
+ background-color: #fff;
+ border-radius: 8px;
+ box-shadow: 0 2px 6px rgb(0 0 0 / 10%);
+ margin-right: 10px;
+}
+
+.eventCardInfo,
+.eventCardExtra {
+ display: flex;
+ justify-content: space-between;
+ width: 100%;
+ margin-bottom: 15px;
+ padding: 10px;
+ background-color: #f9f9f9;
+ border-radius: 4px;
+}
+
+.infoItem,
+.extraItem {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ flex: 1;
+ padding: 5px;
+ margin: 0 5px;
+ width: auto;
+}
+
+.statusActive {
+ background-color: green;
+ color: white;
+}
+
+.statusFinished {
+ background-color: #595959;
+ color: white;
+}
+
+.statusParticipated {
+ background-color: blue;
+ color: white;
+}
+
+.statusDropdown {
+ padding: 4px 8px;
+ border-radius: 4px;
+ border: 1px solid #ccc;
+}
+
+.eventDescription {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ margin-top: 20px;
+}
+
+.textarea {
+ width: 100%;
+ height: 90px;
+ padding: 10px;
+ border-radius: 5px;
+ border: 1px solid #ccc;
+}
+
+.mediaUploadContainer {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.descriptionMediaUpload {
+ margin-right: 10px;
+}
+
+.postBtn {
+ min-height: 10px;
+ border-radius: 10px;
+ width: 250px;
+ padding: 10px;
+ border: 1px solid #ccc;
+ background-color: #2e5061;
+ color: #fff;
+ cursor: pointer;
+ transition: background 0.3s ease;
+}
+
+.postBtn:hover {
+ color: #fff;
+}
+
+.eventTabs {
+ margin-top: 20px;
+}
+
+.star {
+ font-size: 1rem;
+}
+
+.filled {
+ color: #f5a623;
+}
+
+.calendarTileDisabled {
+ color: #ccc;
+ pointer-events: none;
+}
+
+/* Dark Mode */
+.eventPageDark {
+ background-color: #1b2a41;
+ color: #fff;
+ min-height: 100%;
+}
+
+.inputDark {
+ background-color: #2c2c2c;
+ color: #fff;
+ border: 1px solid #444;
+ border-radius: 5px;
+}
+
+.statusDropdownDark {
+ background-color: #fff;
+ color: #2c2c2c;
+ border: 1px solid #444;
+ padding: 4px 8px;
+ border-radius: 4px;
+}
+
+.postBtnDark {
+ background-color: #fff;
+ color: #2e5061;
+ border: 1px solid #666;
+}
+
+.postBtnDark:hover {
+ background-color: #2e5061;
+}
+
+.eventCard12Dark {
+ background-color: #1c2541;
+}
+
+.eventCardInfoDark,
+.eventCardExtraDark {
+ background-color: #3a506b;
+ color: #fff;
+ border: 1px solid #444;
+}
+
+.eventCardRightDark {
+ background-color: transparent;
+}
+
+/* Calendar tile highlight - uses global override since react-calendar injects its own classes */
+:global(.react-calendar__tile--active) {
+ background: #0057b8 !important;
+ color: white !important;
+ font-weight: bold;
+}
diff --git a/src/routes.jsx b/src/routes.jsx
index 6cf79f3a29..dc936b8b30 100644
--- a/src/routes.jsx
+++ b/src/routes.jsx
@@ -159,6 +159,7 @@ import Register from './components/CommunityPortal/Activities/Register/Register'
import CPLogin from './components/CommunityPortal/Login';
import ActivitiesPage from './components/CommunityPortal/Activities/ActivitiesPage';
import EventStats from './components/CommunityPortal/EventPersonalization/EventStats';
+import EventPage from './components/CommunityPortal/EventManagement/EventPage';
import CommunityCalendar from './components/CommunityPortal/Calendar/CommunityCalendar';
import PRGradingDashboard from './components/PRGradingDashboard/PRGradingDashboard';
import RegistrationPopup from './components/CommunityPortal/RegistrationConfirmation/Registration';
@@ -1064,6 +1065,11 @@ export default (
exact
component={ResourceUsage}
/>
+