diff --git a/frontend/src/Components/Home/RecentArticles/RecentArticleItem/RecentArticleItem.jsx b/frontend/src/Components/Home/RecentArticles/RecentArticleItem/RecentArticleItem.jsx
index 5de9874..8a2805a 100644
--- a/frontend/src/Components/Home/RecentArticles/RecentArticleItem/RecentArticleItem.jsx
+++ b/frontend/src/Components/Home/RecentArticles/RecentArticleItem/RecentArticleItem.jsx
@@ -4,7 +4,7 @@ import { Image } from "react-bootstrap";
import { Bookmark, BookmarkFill } from "react-bootstrap-icons";
import "./RecentArticleItem.scss";
-
+import { useTheme } from "../../../../hooks/useTheme";
export default function RecentArticleItem({
articleTitle,
articleAuthor,
@@ -15,6 +15,8 @@ export default function RecentArticleItem({
toBeBookmarked,
bookmarkToggler,
}) {
+ const { isDarkMode } = useTheme();
+
return (
<>
@@ -38,13 +40,20 @@ export default function RecentArticleItem({
)}
-
+
{articleTitle.toUpperCase()}
{/*
{articleDesc}
*/}
By {articleAuthor}
-
Published {articleDatePublished}
+
+ Published {articleDatePublished}
+
diff --git a/frontend/src/Components/Home/RecentArticles/RecentArticleItem/RecentArticleItem.scss b/frontend/src/Components/Home/RecentArticles/RecentArticleItem/RecentArticleItem.scss
index 58fa843..142cd12 100644
--- a/frontend/src/Components/Home/RecentArticles/RecentArticleItem/RecentArticleItem.scss
+++ b/frontend/src/Components/Home/RecentArticles/RecentArticleItem/RecentArticleItem.scss
@@ -242,46 +242,3 @@
.recent-article-date-time {
margin-bottom: 1px;
}
-
-//COLOR MODES
-@include color-mode(dark) {
- .recent-article-title,
- .recent-article-desc,
- .recent-article-author,
- .recent-article-date-time {
- color: $primary-text-dark;
- }
-
- .recent-article-title:hover {
- text-decoration: underline;
- color: hsl(0, 0%, 85%);
- }
-
- .recent-article-bookmark {
- color: $bookmark-bg-dark;
- }
-}
-
-@include color-mode(light) {
- .recent-article-title,
- .recent-article-desc,
- .recent-article-author,
- .recent-article-date-time {
- color: $primary-text-light;
- }
-
- .recent-article-title:hover {
- text-decoration: underline;
- color: hsl(0, 1%, 27%);
- }
-
- .recent-article-author,
- .recent-article-date-time {
- color: hsl(0, 2%, 10%);
- font-weight: 300;
- }
-
- .recent-article-bookmark {
- color: $bookmark-bg-light;
- }
-}
diff --git a/frontend/src/assets/cs-central-black.png b/frontend/src/assets/cs-central-black.png
new file mode 100644
index 0000000..0ec5f7f
Binary files /dev/null and b/frontend/src/assets/cs-central-black.png differ
diff --git a/frontend/src/assets/cs-central-white.png b/frontend/src/assets/cs-central-white.png
new file mode 100644
index 0000000..24ee818
Binary files /dev/null and b/frontend/src/assets/cs-central-white.png differ
diff --git a/frontend/src/assets/logo.png b/frontend/src/assets/logo.png
index b729641..6de359b 100644
Binary files a/frontend/src/assets/logo.png and b/frontend/src/assets/logo.png differ
diff --git a/frontend/src/context/AuthContext.jsx b/frontend/src/context/AuthContext.jsx
index 1f79a4c..822361c 100644
--- a/frontend/src/context/AuthContext.jsx
+++ b/frontend/src/context/AuthContext.jsx
@@ -1,37 +1,35 @@
-import { createContext , useReducer, useEffect } from 'react'
+import { createContext, useReducer, useEffect, useState } from "react";
export const AuthContext = createContext();
-export const authReducer = (state, action) =>
-{
- switch (action.type) {
- case 'LOGIN':
- return {user : action.payload}
- case 'LOGOUT' :
- return {user : null}
- default:
- return state
+export const authReducer = (state, action) => {
+ switch (action.type) {
+ case "LOGIN":
+ return { user: action.payload };
+ case "LOGOUT":
+ return { user: null };
+ default:
+ return state;
+ }
+};
- }
-}
-
-export const AuthContextProvider = ({children}) => {
- const [state, dispatch] = useReducer(authReducer, {
- user : null
- })
+export const AuthContextProvider = ({ children }) => {
+ const [state, dispatch] = useReducer(authReducer, {
+ user: null,
+ });
- useEffect( () => {
- const user = JSON.parse(localStorage.getItem('user'))
- if (user) {
- dispatch({type: 'LOGIN', payload: user})
- }
- }, [])
+ useEffect(() => {
+ const user = JSON.parse(localStorage.getItem("user"));
+ if (user) {
+ dispatch({ type: "LOGIN", payload: user });
+ }
+ }, []);
- console.log ('AuthContext state: ', state)
+ console.log("AuthContext state: ", state);
- return (
-
- {children}
-
- )
-}
\ No newline at end of file
+ return (
+
+ {children}
+
+ );
+};
diff --git a/frontend/src/context/ThemeContext.jsx b/frontend/src/context/ThemeContext.jsx
new file mode 100644
index 0000000..870ebad
--- /dev/null
+++ b/frontend/src/context/ThemeContext.jsx
@@ -0,0 +1,20 @@
+// src/contexts/ThemeContext.js
+import React, { createContext, useState } from "react";
+
+const ThemeContext = createContext();
+
+const ThemeProvider = ({ children }) => {
+ const [isDarkMode, setDarkMode] = useState(false);
+
+ const toggleTheme = () => {
+ setDarkMode((prevMode) => !prevMode);
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+
+export { ThemeProvider, ThemeContext };
diff --git a/frontend/src/hooks/useTheme.jsx b/frontend/src/hooks/useTheme.jsx
new file mode 100644
index 0000000..69bead5
--- /dev/null
+++ b/frontend/src/hooks/useTheme.jsx
@@ -0,0 +1,17 @@
+// src/hooks/useTheme.js
+import { useContext, useEffect } from "react";
+import { ThemeContext } from "../context/ThemeContext";
+
+export const useTheme = () => {
+ const { isDarkMode, toggleTheme } = useContext(ThemeContext);
+
+ useEffect(() => {
+ if (isDarkMode) {
+ document.body.classList.add("dark-mode");
+ } else {
+ document.body.classList.remove("dark-mode");
+ }
+ }, [isDarkMode]);
+
+ return { isDarkMode, toggleTheme };
+};
diff --git a/frontend/src/index.jsx b/frontend/src/index.jsx
index 60d32e3..a1e734a 100644
--- a/frontend/src/index.jsx
+++ b/frontend/src/index.jsx
@@ -5,14 +5,17 @@ import "./scss/custom.scss";
import { BrowserRouter } from "react-router-dom";
import reportWebVitals from "./reportWebVitals";
import { AuthContextProvider } from "./context/AuthContext";
+import { ThemeProvider } from "./context/ThemeContext";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
-
-
-
+
+
+
+
+
);
@@ -22,7 +25,6 @@ root.render(
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
-
//theme toggle listener
(() => {
"use strict";
diff --git a/frontend/src/pages/BasePage.jsx b/frontend/src/pages/BasePage.jsx
index 3635c5d..9aa478f 100644
--- a/frontend/src/pages/BasePage.jsx
+++ b/frontend/src/pages/BasePage.jsx
@@ -5,10 +5,10 @@ import Footer from "../Components/Footer/Footer";
export default function BasePage() {
return (
-
+ <>
-
+ >
);
}
diff --git a/frontend/src/pages/HomePage/Home.jsx b/frontend/src/pages/HomePage/Home.jsx
index 358d6da..4abd515 100644
--- a/frontend/src/pages/HomePage/Home.jsx
+++ b/frontend/src/pages/HomePage/Home.jsx
@@ -14,7 +14,7 @@ import devin_ai from "../../assets/Article_Images/devin_ai.png";
import ai_in_business from "../../assets/Article_Images/ai_in_business.png";
import quantum from "../../assets/Article_Images/quantum.png";
import ai_brain from "../../assets/ml_brain.jpg";
-
+import { useTheme } from "../../hooks/useTheme";
export default function Home() {
// demo feature article
const feature_article_example = {
@@ -76,10 +76,15 @@ export default function Home() {
// useEffect to fetch the main feature article from the database (added later)
useEffect(() => {}, []);
-
+ const { isDarkMode } = useTheme();
return (
<>
-
+
{/* Left section - Articles Display */}
diff --git a/frontend/src/pages/HomePage/Home.scss b/frontend/src/pages/HomePage/Home.scss
index 31a3344..b026812 100644
--- a/frontend/src/pages/HomePage/Home.scss
+++ b/frontend/src/pages/HomePage/Home.scss
@@ -9,7 +9,12 @@
max-width: 1000px !important;
}
}
-
+.cs-central-img img {
+ width: 100%;
+ min-width: 250px;
+ max-width: 27vw;
+ height: auto;
+}
// Dark mode
@include color-mode(dark) {
.home-page {
diff --git a/frontend/src/scss/_variables.scss b/frontend/src/scss/_variables.scss
index e9a6088..96ea5b4 100644
--- a/frontend/src/scss/_variables.scss
+++ b/frontend/src/scss/_variables.scss
@@ -1,8 +1,8 @@
-
+$header-bg-color: #312f2f;
$primary: #f65757;
$secondary: #228b22;
-$form-select-indicator-color: #FFFF;
+$form-select-indicator-color: #ffff;
$dropdown-bg: #4a4848;
$dropdown-color: white;
@@ -10,7 +10,8 @@ $dropdown-link-color: white;
$dropdown-link-hover-bg: #8c8888;
$dropdown-link-disabled-color: #8c8888;
+$text-dark-yellow: #f4e4bb;
-@import './variables/variables-dark';
-@import './variables/variables-light';
-@import './variables/variables-universal';
\ No newline at end of file
+@import "./variables/variables-dark";
+@import "./variables/variables-light";
+@import "./variables/variables-universal";
diff --git a/package-lock.json b/package-lock.json
index a0dd4dd..c457b2f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1295,9 +1295,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001581",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz",
- "integrity": "sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==",
+ "version": "1.0.30001636",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz",
+ "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==",
"funding": [
{
"type": "opencollective",
@@ -3858,9 +3858,9 @@
}
},
"caniuse-lite": {
- "version": "1.0.30001581",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz",
- "integrity": "sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ=="
+ "version": "1.0.30001636",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz",
+ "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg=="
},
"chalk": {
"version": "4.1.2",