diff --git a/public/arrow-black.svg b/public/arrow-black.svg
new file mode 100644
index 000000000..6453d74fd
--- /dev/null
+++ b/public/arrow-black.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/arrow-white.svg b/public/arrow-white.svg
new file mode 100644
index 000000000..dbfb5bb6b
--- /dev/null
+++ b/public/arrow-white.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/github-black.svg b/public/github-black.svg
new file mode 100644
index 000000000..c59eb6432
--- /dev/null
+++ b/public/github-black.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/github-white.svg b/public/github-white.svg
new file mode 100644
index 000000000..678670d7e
--- /dev/null
+++ b/public/github-white.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/instagram-black.svg b/public/instagram-black.svg
new file mode 100644
index 000000000..4b342561c
--- /dev/null
+++ b/public/instagram-black.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/instagram-white.svg b/public/instagram-white.svg
new file mode 100644
index 000000000..8ef9d29bf
--- /dev/null
+++ b/public/instagram-white.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/join-discord-black.svg b/public/join-discord-black.svg
new file mode 100644
index 000000000..d4cc55f21
--- /dev/null
+++ b/public/join-discord-black.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/join-discord-white.svg b/public/join-discord-white.svg
new file mode 100644
index 000000000..ff1353943
--- /dev/null
+++ b/public/join-discord-white.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/linkedin-black.svg b/public/linkedin-black.svg
new file mode 100644
index 000000000..7cac55776
--- /dev/null
+++ b/public/linkedin-black.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/linkedin-white.svg b/public/linkedin-white.svg
new file mode 100644
index 000000000..3e4f6ccd4
--- /dev/null
+++ b/public/linkedin-white.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx
index c5a6ae5cb..4e41dbf67 100644
--- a/src/app/dashboard/page.tsx
+++ b/src/app/dashboard/page.tsx
@@ -1,3 +1,4 @@
+import Footer from '@/components/common/Footer/Footer';
import Split from '@/components/common/Split/Split';
import StickySide from '@/components/common/Split/StickySide';
import ComparePage from '@/components/compare/ComparePage/ComparePage';
@@ -98,6 +99,7 @@ export default async function Page({ searchParams }: Props) {
{isCompare ? : }
+
>
);
@@ -196,6 +198,7 @@ export default async function Page({ searchParams }: Props) {
>
)}
+
>
diff --git a/src/app/planner/PlannerPage.tsx b/src/app/planner/PlannerPage.tsx
index f603882f6..290014363 100644
--- a/src/app/planner/PlannerPage.tsx
+++ b/src/app/planner/PlannerPage.tsx
@@ -1,5 +1,6 @@
'use client';
+import Footer from '@/components/common/Footer/Footer';
import Header from '@/components/navigation/Header/Header';
import React, { Suspense, useRef } from 'react';
import Planner, { PlannerLoadingSkeleton } from './Planner';
@@ -16,6 +17,7 @@ export default function PlannerPage() {
+
>
);
diff --git a/src/components/common/Footer/Footer.tsx b/src/components/common/Footer/Footer.tsx
new file mode 100644
index 000000000..363925fac
--- /dev/null
+++ b/src/components/common/Footer/Footer.tsx
@@ -0,0 +1,251 @@
+'use client';
+
+import DarkArrow from '@/../public/arrow-black.svg';
+import LightArrow from '@/../public/arrow-white.svg';
+import DarkGitHub from '@/../public/github-black.svg';
+import LightGitHub from '@/../public/github-white.svg';
+import DarkInsta from '@/../public/instagram-black.svg';
+import LightInsta from '@/../public/instagram-white.svg';
+import DarkDiscord from '@/../public/join-discord-black.svg';
+import LightDiscord from '@/../public/join-discord-white.svg';
+import DarkLinkedin from '@/../public/linkedin-black.svg';
+import LightLinkedin from '@/../public/linkedin-white.svg';
+import NebulaLogo from '@/components/icons/NebulaLogo/NebulaLogo';
+import { UTDTrendsLogoCombination } from '@/components/icons/UTDTrendsLogo/UTDTrendsLogo';
+import { Tooltip } from '@mui/material';
+import Image from 'next/image';
+import Link from 'next/link';
+
+/**
+ * Contact logo that displays a light and dark version based on the current theme
+ */
+function Icon(props: {
+ className?: string;
+ light: string;
+ dark: string;
+ alt: string;
+ size: number | `${number}`;
+}) {
+ return (
+ <>
+
+
+ >
+ );
+}
+
+function ScrollUpButton() {
+ return (
+
+
+
+ );
+}
+
+const links = [
+ {
+ name: 'Resources',
+ links: [
+ { name: 'Galaxy', href: 'https://www.utdallas.edu/galaxy/' },
+ {
+ name: 'Academic Calendars',
+ href: 'https://www.utdallas.edu/academics/calendar/',
+ },
+ {
+ name: 'Advisors',
+ href: 'https://oue.utdallas.edu/undergraduate-advising/ug-academic-advisors/',
+ },
+ { name: 'Career Center', href: 'https://career.utdallas.edu/' },
+ ],
+ },
+ {
+ name: 'Data',
+ links: [
+ { name: 'Nebula API', href: 'https://www.utdnebula.com/projects/api' },
+ {
+ name: 'Grades',
+ href: 'https://github.com/UTDNebula/api-tools/tree/develop/static-data/grades',
+ },
+ {
+ name: 'Rate My Professors',
+ href: 'https://www.ratemyprofessors.com/school/1273',
+ },
+ { name: 'CourseBook', href: 'https://coursebook.utdallas.edu/' },
+ { name: 'Profiles', href: 'https://profiles.utdallas.edu/' },
+ ],
+ },
+ {
+ name: 'Projects',
+ links: [
+ { name: 'Clubs', href: 'https://clubs.utdnebula.com/' },
+ { name: 'Skedge', href: 'https://www.utdnebula.com/projects/skedge' },
+ { name: 'Rooms', href: 'https://rooms.utdnebula.com/' },
+ {
+ name: 'API & Platform',
+ href: 'https://www.utdnebula.com/projects/api',
+ },
+ ],
+ },
+];
+
+const linkClasses =
+ 'underline decoration-transparent hover:decoration-inherit transition';
+
+interface LinkGroupProps {
+ name: string;
+ links: {
+ name: string;
+ href: string;
+ }[];
+}
+
+function LinkGroup({ name, links }: LinkGroupProps) {
+ return (
+
+
{name}
+
+ {links.map(({ name, href }) => (
+
+ {name}
+
+ ))}
+
+
+ );
+}
+
+function GetToKnowUs() {
+ return (
+
+
+
+
+
+
+ Website
+
+
+
+ Instagram
+
+
+
+ Linkedin
+
+
+
+ Github
+
+
+ );
+}
+
+export default function Footer() {
+ return (
+
+ );
+}