-
+
{moodLabel}
Based on all entries
diff --git a/client/src/index.css b/client/src/index.css
index 2938a202..4d0fbbd3 100644
--- a/client/src/index.css
+++ b/client/src/index.css
@@ -12,24 +12,24 @@ html, body, #root {
/* === Global CSS Variables === */
-/* LIGHT THEME (Default) */
+/* LIGHT THEME (Default - Zinc/Blue aesthetic) */
:root {
- --bg: #ffffff;
- --card-bg: #f9fafb;
- --border: #e5e7eb;
- --heading: #111827;
- --body-text: #374151;
- --button: #6366f1;
- --button-hover: #4f46e5;
- --gradient-from: #6366f1;
- --gradient-to: #d946ef;
+ --bg: #fafafa;
+ --card-bg: #ffffff;
+ --border: #e4e4e7;
+ --heading: #18181b;
+ --body-text: #3f3f46;
+ --button: #2563eb;
+ --button-hover: #1d4ed8;
+ --gradient-from: #3b82f6;
+ --gradient-to: #8b5cf6;
--input-bg: #ffffff;
- --input-border: #d1d5db;
- --icon: #6b7280;
- --link: #3b82f6;
+ --input-border: #d4d4d8;
+ --icon: #71717a;
+ --link: #2563eb;
--link-hover: #1d4ed8;
- font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
+ font-family: 'Plus Jakarta Sans', system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color: var(--body-text);
@@ -41,20 +41,20 @@ html, body, #root {
-moz-osx-font-smoothing: grayscale;
}
-/* DARK THEME (Applied via class) */
+/* DARK THEME (Sleek Slate aesthetic) */
.dark {
- --bg: #0b1120;
- --card-bg: #111827;
- --border: #1f2937;
- --heading: #f3f4f6;
- --body-text: #d1d5db;
- --button: #6366f1;
- --button-hover: #4f46e5;
- --gradient-from: #6366f1;
- --gradient-to: #d946ef;
- --input-bg: #1a2332;
- --input-border: #334155;
- --icon: #94a3b8;
+ --bg: #09090b;
+ --card-bg: #18181b;
+ --border: #27272a;
+ --heading: #fafafa;
+ --body-text: #a1a1aa;
+ --button: #3b82f6;
+ --button-hover: #2563eb;
+ --gradient-from: #3b82f6;
+ --gradient-to: #c084fc;
+ --input-bg: #18181b;
+ --input-border: #27272a;
+ --icon: #a1a1aa;
--link: #60a5fa;
--link-hover: #3b82f6;
}
@@ -110,6 +110,30 @@ button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
+/* Utility Classes */
+@layer utilities {
+ .glass-panel {
+ background-color: rgba(255, 255, 255, 0.7);
+ backdrop-filter: blur(12px);
+ -webkit-backdrop-filter: blur(12px);
+ border: 1px solid rgba(255, 255, 255, 0.3);
+ box-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.1);
+ }
+
+ .dark .glass-panel {
+ background-color: rgba(24, 24, 27, 0.7);
+ border: 1px solid rgba(255, 255, 255, 0.05);
+ box-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.5);
+ }
+
+ .text-gradient {
+ background-clip: text;
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-image: linear-gradient(to right, var(--gradient-from), var(--gradient-to));
+ }
+}
+
/* Floating animation for background circles */
@keyframes float {
0%, 100% {
@@ -123,20 +147,69 @@ button:focus-visible {
/* Respect system theme if no manual toggle */
@media (prefers-color-scheme: dark) {
:root:not(.light):not(.dark) {
- --bg: #0b1120;
- --card-bg: #111827;
- --border: #1f2937;
- --heading: #f3f4f6;
- --body-text: #d1d5db;
- --button: #6366f1;
- --button-hover: #4f46e5;
- --gradient-from: #6366f1;
- --gradient-to: #d946ef;
- --input-bg: #1a2332;
- --input-border: #334155;
- --icon: #94a3b8;
+ --bg: #09090b;
+ --card-bg: #18181b;
+ --border: #27272a;
+ --heading: #fafafa;
+ --body-text: #a1a1aa;
+ --button: #3b82f6;
+ --button-hover: #2563eb;
+ --gradient-from: #3b82f6;
+ --gradient-to: #c084fc;
+ --input-bg: #18181b;
+ --input-border: #27272a;
+ --icon: #a1a1aa;
--link: #60a5fa;
--link-hover: #3b82f6;
}
}
+
+.light {
+ --bg: #f1f5f9;
+ --card-bg: #ffffff;
+ --border: #e2e8f0;
+ --heading: #0f172a;
+ --body-text: #334155;
+ --button: #0284c7;
+ --button-hover: #0369a1;
+ --gradient-from: #0284c7; /* sky-600 */
+ --gradient-to: #2563eb; /* blue-600 */
+ --input-bg: #ffffff;
+ --input-border: #cbd5e1;
+ --icon: #0f172a;
+ --link: #0ea5e9;
+ --link-hover: #0284c7;
+ }
+
+ .dark {
+ --bg: #0f172a; /* slate-900 */
+ --card-bg: #1e293b; /* slate-800 */
+ --border: #334155;
+ --heading: #f8fafc;
+ --body-text: #94a3b8;
+ --button: #0ea5e9;
+ --button-hover: #38bdf8;
+ --gradient-from: #0369a1; /* sky-700 */
+ --gradient-to: #1e40af; /* blue-800 */
+ --input-bg: #1e293b;
+ --input-border: #334155;
+ --icon: #f8fafc;
+ --link: #38bdf8;
+ --link-hover: #7dd3fc;
+ }
+
+/* Theme Toggle View Transition Overrides */
+::view-transition-old(root),
+::view-transition-new(root) {
+ animation: none;
+ mix-blend-mode: normal;
+}
+
+::view-transition-old(root) {
+ z-index: 1;
+}
+
+::view-transition-new(root) {
+ z-index: 2;
+}
diff --git a/client/src/pages/AnalyzePage.jsx b/client/src/pages/AnalyzePage.jsx
index 86c3b0fe..21a5bf47 100644
--- a/client/src/pages/AnalyzePage.jsx
+++ b/client/src/pages/AnalyzePage.jsx
@@ -176,8 +176,8 @@ const AnalyzePage = () => {
{/* Header */}
Advanced Document Sentiment Analysis
@@ -257,7 +257,7 @@ const AnalyzePage = () => {
/>
fileInputRef.current?.click()}
- className="bg-gradient-to-r from-blue-500 to-purple-600 text-white px-8 py-3 rounded-lg font-medium hover:from-blue-600 hover:to-purple-700 transition-all duration-300 shadow-lg hover:shadow-xl"
+ className="bg-gradient-to-r from-sky-600 to-blue-700 dark:from-sky-700 dark:to-blue-800 text-white px-8 py-3 rounded-lg font-medium hover:from-blue-600 hover:to-sky-700 transition-all duration-300 shadow-lg hover:shadow-xl"
disabled={isExtracting}
>
Choose File
diff --git a/client/src/pages/ContactPage.jsx b/client/src/pages/ContactPage.jsx
index b9c39813..d00c5dd8 100644
--- a/client/src/pages/ContactPage.jsx
+++ b/client/src/pages/ContactPage.jsx
@@ -46,7 +46,7 @@ export const ContactPage = () => {
{/* Header */}
-
+
Contact Us
@@ -91,7 +91,7 @@ export const ContactPage = () => {
-
+
Go to Help Center
@@ -105,7 +105,7 @@ export const ContactPage = () => {
onSubmit={handleSubmit}
className="w-full p-8 rounded-2xl shadow-xl bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 flex flex-col gap-6"
>
-
+
Send Us a Message
@@ -172,7 +172,7 @@ export const ContactPage = () => {
{/* Submit Button */}
Submit
diff --git a/client/src/pages/Dashboard.jsx b/client/src/pages/Dashboard.jsx
index 34ca6ad8..ae6540f1 100644
--- a/client/src/pages/Dashboard.jsx
+++ b/client/src/pages/Dashboard.jsx
@@ -11,9 +11,8 @@ import BacktoTopButton from "../components/BackToTop";
const GLASS_CARD_STYLE = `
- bg-white/50 border border-gray-300/30 text-black
- dark:bg-slate-900/50 dark:border-gray-700/30 dark:text-gray-200
- p-5 rounded-3xl shadow-xl backdrop-blur-lg
+ glass-panel text-zinc-900 dark:text-zinc-100
+ p-6 rounded-3xl hover:shadow-[0_10px_40px_-10px_rgba(0,0,0,0.1)] transition-all duration-300
`;
const Dashboard = () => {
@@ -54,7 +53,7 @@ const Dashboard = () => {
className="
font-sans w-full min-h-screen
// Enhanced background for Glassmorphism effect visibility
- bg-gradient-to-br from-indigo-50 to-purple-100 text-black
+ bg-gradient-to-br from-indigo-50 to-sky-100 text-black
dark:from-[#081229] dark:to-[#171e35] dark:text-gray-200
"
>
diff --git a/client/src/pages/ForgotPassword.jsx b/client/src/pages/ForgotPassword.jsx
index 27eca664..862a2bda 100644
--- a/client/src/pages/ForgotPassword.jsx
+++ b/client/src/pages/ForgotPassword.jsx
@@ -40,7 +40,7 @@ export default function ForgotPassword() {
{error &&
{error}
}
Send Reset Link
diff --git a/client/src/pages/HelpCenterPage.jsx b/client/src/pages/HelpCenterPage.jsx
index f8686ba3..9189c06a 100644
--- a/client/src/pages/HelpCenterPage.jsx
+++ b/client/src/pages/HelpCenterPage.jsx
@@ -112,7 +112,7 @@ const HelpCenterPage = () => {
{/* Header */}
-
+
Help Center
@@ -150,7 +150,7 @@ const HelpCenterPage = () => {
onClick={() =>
setOpenFAQ(openFAQ === faqIndex ? null : faqIndex)
}
- className="w-full flex justify-between items-center px-4 py-3 font-semibold text-white text-left bg-gradient-to-r from-blue-500 via-purple-500 to-pink-500 hover:from-blue-600 hover:via-purple-600 hover:to-pink-600 transition-colors duration-300 text-lg"
+ className="w-full flex justify-between items-center px-4 py-3 font-semibold text-white text-left bg-gradient-to-r from-sky-600 to-blue-700 dark:from-sky-700 dark:to-blue-800 hover:from-blue-600 hover:via-sky-600 hover:to-blue-600 transition-colors duration-300 text-lg"
>
{item.question}
@@ -202,7 +202,7 @@ const HelpCenterPage = () => {
-
+
Contact Us
diff --git a/client/src/pages/JournalPage.jsx b/client/src/pages/JournalPage.jsx
index 6379e06f..40dfd893 100644
--- a/client/src/pages/JournalPage.jsx
+++ b/client/src/pages/JournalPage.jsx
@@ -81,24 +81,24 @@ const JournalPage = () => {
return (
<>
{/* Enhanced Background Pattern */}
@@ -106,7 +106,7 @@ const JournalPage = () => {
{/* Hero Section */}
-
+
{/* Header with Loading Icon */}
-
+
{loading ? (
) : (
@@ -193,11 +190,11 @@ const JournalPage = () => {
-
+
{loading ? (
@@ -291,7 +288,7 @@ const JournalPage = () => {
: result.sentiment === "NEGATIVE"
? "bg-gradient-to-r from-red-400 to-red-600"
: result.sentiment === "NEUTRAL"
- ? "bg-gradient-to-r from-yellow-400 to-yellow-600"
+ ? "bg-gradient-to-r from-blue-400 to-blue-600"
: "bg-gradient-to-r from-gray-400 to-gray-600"
}`}
>
@@ -351,8 +348,8 @@ const JournalPage = () => {
}`}
>
{
}`}
>
{
}`}
>
@@ -104,7 +104,7 @@ function LoginPage() {
diff --git a/client/src/pages/NewsListingPage.jsx b/client/src/pages/NewsListingPage.jsx
index a73c5895..2312d6fa 100644
--- a/client/src/pages/NewsListingPage.jsx
+++ b/client/src/pages/NewsListingPage.jsx
@@ -322,8 +322,8 @@ const NewsListingPage = () => {
return (
@@ -338,20 +338,20 @@ const NewsListingPage = () => {
return (
{/* Enhanced Background Pattern */}
@@ -364,11 +364,11 @@ const NewsListingPage = () => {
-
+
-
+
Daily News Hub
@@ -394,7 +394,7 @@ const NewsListingPage = () => {
Refresh
@@ -579,7 +579,7 @@ const NewsListingPage = () => {
openArticleModal(article)}
- className="inline-flex items-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-xl hover:shadow-lg transition-all duration-200 transform hover:scale-105"
+ className="inline-flex items-center gap-2 px-6 py-3 bg-gradient-to-r from-sky-600 to-blue-700 dark:from-sky-700 dark:to-blue-800 text-white rounded-xl hover:shadow-lg transition-all duration-200 transform hover:scale-105"
>
View Full Article
diff --git a/client/src/pages/NewsPage.jsx b/client/src/pages/NewsPage.jsx
index 6a6a30d3..daca67de 100644
--- a/client/src/pages/NewsPage.jsx
+++ b/client/src/pages/NewsPage.jsx
@@ -45,24 +45,24 @@ const NewsPage = () => {
return (
<>
{/* Enhanced Background Pattern */}
@@ -70,7 +70,7 @@ const NewsPage = () => {
{/* Hero Section */}
-
+
News Article Analysis
{
{/* Header with Loading Icon */}
-
+
{loading ? (
) : (
@@ -156,11 +156,11 @@ const NewsPage = () => {
-
+
{loading ? (
@@ -254,7 +254,7 @@ const NewsPage = () => {
: result.sentiment === "NEGATIVE"
? "bg-gradient-to-r from-red-400 to-red-600"
: result.sentiment === "NEUTRAL"
- ? "bg-gradient-to-r from-yellow-400 to-yellow-600"
+ ? "bg-gradient-to-r from-blue-400 to-blue-600"
: "bg-gradient-to-r from-gray-400 to-gray-600"
}`}
>
@@ -311,8 +311,8 @@ const NewsPage = () => {
: 'bg-white border-blue-100'
}`}>
{
: 'bg-white border-green-100'
}`}>
{
: 'bg-white border-purple-100'
}`}>
diff --git a/client/src/pages/SignupPage.jsx b/client/src/pages/SignupPage.jsx
index cc4c853e..7adbf5d3 100644
--- a/client/src/pages/SignupPage.jsx
+++ b/client/src/pages/SignupPage.jsx
@@ -196,7 +196,7 @@ function SignupPage() {
@@ -211,7 +211,7 @@ function SignupPage() {
@@ -347,7 +347,7 @@ function SignupPage() {
className={`w-full py-3 rounded text-white transition-all duration-300 shadow-lg font-semibold ${
loading || (form.password && !validatePassword(form.password).isValid)
? 'bg-gray-400 cursor-not-allowed hover:bg-gray-400 hover:scale-100'
- : 'bg-gradient-to-r from-blue-600 via-purple-600 to-pink-600 hover:scale-105'
+ : 'bg-gradient-to-r from-sky-600 to-blue-700 dark:from-sky-700 dark:to-blue-800 hover:scale-105'
}`}
title={form.password && !validatePassword(form.password).isValid ? "Please meet all password requirements" : ""}
>
diff --git a/client/src/pages/UserProfile.jsx b/client/src/pages/UserProfile.jsx
index 8cd25a52..fb704b98 100644
--- a/client/src/pages/UserProfile.jsx
+++ b/client/src/pages/UserProfile.jsx
@@ -114,12 +114,12 @@ function UserProfile() {
};
return (
-
+
@@ -209,7 +209,7 @@ function UserProfile() {
{/* Save button */}
{isLoading ? 'Saving...' : 'Save Changes'}
diff --git a/client/yarn.lock b/client/yarn.lock
index cf04d340..a370393a 100644
--- a/client/yarn.lock
+++ b/client/yarn.lock
@@ -190,10 +190,10 @@
resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz"
integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==
-"@esbuild/linux-x64@0.18.20":
+"@esbuild/win32-x64@0.18.20":
version "0.18.20"
- resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz"
- integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==
+ resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz"
+ integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==
"@eslint-community/eslint-utils@^4.2.0":
version "4.7.0"
@@ -383,15 +383,10 @@
source-map-js "^1.2.1"
tailwindcss "4.1.11"
-"@tailwindcss/oxide-linux-x64-gnu@4.1.11":
+"@tailwindcss/oxide-win32-x64-msvc@4.1.11":
version "4.1.11"
- resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz"
- integrity sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==
-
-"@tailwindcss/oxide-linux-x64-musl@4.1.11":
- version "4.1.11"
- resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz"
- integrity sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==
+ resolved "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz"
+ integrity sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==
"@tailwindcss/oxide@4.1.11":
version "4.1.11"
@@ -1623,15 +1618,10 @@ lie@~3.3.0:
dependencies:
immediate "~3.0.5"
-lightningcss-linux-x64-gnu@1.30.1:
- version "1.30.1"
- resolved "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz"
- integrity sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==
-
-lightningcss-linux-x64-musl@1.30.1:
+lightningcss-win32-x64-msvc@1.30.1:
version "1.30.1"
- resolved "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz"
- integrity sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==
+ resolved "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz"
+ integrity sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==
lightningcss@^1.21.0, lightningcss@1.30.1:
version "1.30.1"
diff --git a/server/.env.example b/server/.env.example
index 9485aa73..5a520474 100644
--- a/server/.env.example
+++ b/server/.env.example
@@ -1,29 +1,38 @@
-MONGO_URI=mongodb://localhost:27017/sentilogai
-
-NEWS_API_KEY=process.env.NEWS_API_KEY
-GUARDIAN_API_KEY=process.env.GUARDIAN_API_KEY
+# ==========================================
+# Backend Environment Variables (.env)
+# ==========================================
+# Core Server Config
PORT=8080
-Jwt_USER_SECRET=sent@106
-JWT_RESET_SECRET=reset@123
+CLIENT_URL=http://localhost:5173
FRONTEND_URL=http://localhost:5173
-ML_API_URL = http://localhost:8060/ml-api
+ML_API_URL=http://localhost:5000
+
+# Database & Security
+MONGO_URI=mongodb+srv://admin:password@cluster.mongodb.net/SentiLog?retryWrites=true&w=majority
+JWT_USER_SECRET=your_super_secret_jwt_key_here
+JWT_RESET_SECRET=your_password_reset_jwt_key_here
-# Email credentials (used by Nodemailer)
-EMAIL_USER=your_email@example.com
-EMAIL_PASS=your_app_specific_password_here
+# News Fetching (For the dashboard/news sections)
+# Get keys from: https://newsapi.org/ and https://open-platform.theguardian.com/access/
+NEWS_API_KEY=your_newsapi_org_key
+GUARDIAN_API_KEY=your_guardian_api_key
-# cloundary credentials
-CLOUDINARY_CLOUD_NAME=
-CLOUDINARY_API_KEY=
-CLOUDINARY_API_SECRET=
+# Email configuration (For Forgot Password)
+EMAIL_USER=your_smtp_email@gmail.com
+EMAIL_PASS=your_app_specific_password
-# Github OAuth credentials
-GITHUB_CALLBACK_URL = https://sentilog-ai.onrender.com/api/auth/callback
-GITHUB_CLIENT_ID =
-GITHUB_CLIENT_SECRET=
-CLIENT_URL = https://sentilog-ai.vercel.app
+# Image Uploads (For User Profile Avatars)
+# Get keys from: https://cloudinary.com/
+CLOUDINARY_CLOUD_NAME=your_cloudinary_name
+CLOUDINARY_API_KEY=your_cloudinary_key
+CLOUDINARY_API_SECRET=your_cloudinary_secret
-GOOGLE_CLIENT_ID=
-GOOGLE_CLIENT_SECRET=
+# OAuth Config (Google & GitHub Signup/Login)
+GOOGLE_CLIENT_ID=your_google_client_id.apps.googleusercontent.com
+GOOGLE_CLIENT_SECRET=your_google_client_secret
GOOGLE_CALLBACK_URL=http://localhost:8080/api/auth/google/callback
+
+GITHUB_CLIENT_ID=your_github_client_id
+GITHUB_CLIENT_SECRET=your_github_client_secret
+GITHUB_CALLBACK_URL=http://localhost:8080/api/auth/github/callback