From 0cdcac6a3177f775fcec57bb9f97c7f041232be0 Mon Sep 17 00:00:00 2001
From: karrisanthoshigayatri
Date: Tue, 9 Jun 2026 17:18:28 +0530
Subject: [PATCH 1/2] implemented profile page
---
css/index.css | 13 +++++++
index.html | 57 ++++++++++++++++++++++++++++++-
js/app.js | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 163 insertions(+), 1 deletion(-)
diff --git a/css/index.css b/css/index.css
index 93befe3..599fd73 100644
--- a/css/index.css
+++ b/css/index.css
@@ -4101,6 +4101,19 @@ body {
.tasks-section { flex: 1; overflow-y: auto; padding: 0 24px 24px; scroll-behavior: smooth; }
.tasks-section::-webkit-scrollbar { width: 6px; }
.tasks-section::-webkit-scrollbar-thumb { background: var(--color-border-secondary); border-radius: 10px; }
+.profile-section { flex: 1; overflow-y: auto; padding: 24px; display: flex; flex-direction: column; gap: 24px; }
+.profile-header { display: flex; justify-content: space-between; align-items: flex-start; gap: 20px; }
+.profile-page-title { font-size: 24px; font-weight: 700; color: var(--color-text-primary); }
+.profile-page-subtitle { margin: 8px 0 0; color: var(--color-text-secondary); max-width: 640px; line-height: 1.6; }
+.profile-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }
+.profile-card { background: var(--color-background-primary); border: 1px solid var(--color-border-tertiary); border-radius: var(--border-radius-md); padding: 24px; box-shadow: var(--shadow-sm); }
+.profile-card h2 { margin: 0 0 16px; font-size: 16px; font-weight: 700; color: var(--color-text-primary); }
+.profile-field { display: flex; justify-content: space-between; gap: 16px; margin-bottom: 14px; font-size: 14px; color: var(--color-text-secondary); }
+.profile-field-label { color: var(--color-text-tertiary); font-weight: 600; }
+.profile-stats { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
+.profile-stat-value { display: block; font-size: 22px; font-weight: 700; color: var(--color-text-primary); margin-bottom: 4px; }
+.profile-summary-card p { margin: 0; color: var(--color-text-secondary); line-height: 1.8; }
+@media (max-width: 900px) { .profile-grid { grid-template-columns: 1fr; } }
.tasks-actions-bar {
margin-top: 18px;
display: flex;
diff --git a/index.html b/index.html
index 543be76..e0c921c 100644
--- a/index.html
+++ b/index.html
@@ -62,7 +62,7 @@ StudyPlan
@@ -207,6 +207,61 @@ StudyPlan
+
+
+
+
+
+
+ Account details
+
+ Username
+ StudyPlan User
+
+
+ Email
+ user@studyplan.app
+
+
+ Member since
+ June 2026
+
+
+
+
+ Study statistics
+
+
+ 0
+ Completed
+
+
+ 0
+ Pending
+
+
+ 0
+ Archived
+
+
+ 0
+ Subjects
+
+
+
+
+
+
+ Account overview
+ Your profile information and study statistics will update automatically as you use StudyPlan.
+
+
+
diff --git a/js/app.js b/js/app.js
index f69f7f6..c87ad17 100644
--- a/js/app.js
+++ b/js/app.js
@@ -454,6 +454,89 @@ function renderFocusTasks() {
}
}
+function renderProfileSection() {
+ if (!profileSection) return;
+
+ const tasks = store.tasks || [];
+ const subjects = store.subjects || [];
+ const completedCount = tasks.filter(t => t.status === 'Done').length;
+ const pendingCount = tasks.filter(t => t.status !== 'Done' && !t.archived).length;
+ const archivedCount = tasks.filter(t => t.archived).length;
+ const subjectsCount = subjects.length;
+ const username = localStorage.getItem('studyplan_username') || 'StudyPlan User';
+ const email = localStorage.getItem('studyplan_email') || 'user@studyplan.app';
+ const joinedDate = localStorage.getItem('studyplan_joined') || 'June 2026';
+
+ profileSection.innerHTML = `
+
+
+
+
+ Account details
+
+ Username
+ ${escapeHtml(username)}
+
+
+ Email
+ ${escapeHtml(email)}
+
+
+ Member since
+ ${escapeHtml(joinedDate)}
+
+
+
+
+ Study statistics
+
+
+ ${completedCount}
+ Completed
+
+
+ ${pendingCount}
+ Pending
+
+
+ ${archivedCount}
+ Archived
+
+
+ ${subjectsCount}
+ Subjects
+
+
+
+
+
+
+ Account overview
+ Your profile information and study statistics will update automatically as you use StudyPlan.
+
+ `;
+}
+
+function showProfileSection() {
+ currentView = 'profile';
+ document.querySelector('.cal-section')?.classList.add('hidden');
+ document.getElementById('tasks-section')?.classList.add('hidden');
+ document.getElementById('focus-section')?.classList.add('hidden');
+ profileSection?.classList.remove('hidden');
+ topbar?.classList.add('hidden');
+ renderProfileSection();
+}
+
+function hideProfileSection() {
+ profileSection?.classList.add('hidden');
+ topbar?.classList.remove('hidden');
+}
+
function formatDate(dateStr) {
if (!dateStr) return 'No Date';
const d = new Date(dateStr);
@@ -1095,6 +1178,7 @@ store.subscribe(renderTasks);
store.subscribe(renderExtraction);
store.subscribe(renderCalendar);
store.subscribe(renderFocusTasks);
+store.subscribe(renderProfileSection);
store.subscribe(renderSidebarSubjects);
document.addEventListener('DOMContentLoaded', () => {
@@ -1166,6 +1250,7 @@ document.addEventListener('DOMContentLoaded', () => {
calendarBtn.addEventListener('click', () => {
currentView = 'calendar';
+ hideProfileSection();
document.querySelector('.cal-section').classList.remove('hidden');
document.getElementById('tasks-section').classList.remove('hidden');
document.getElementById('focus-section').classList.add('hidden');
@@ -1175,6 +1260,7 @@ document.addEventListener('DOMContentLoaded', () => {
allTasksBtn.addEventListener('click', () => {
currentView = 'all-tasks';
+ hideProfileSection();
document.querySelector('.cal-section').classList.add('hidden');
document.getElementById('tasks-section').classList.remove('hidden');
document.getElementById('focus-section').classList.add('hidden');
@@ -1184,6 +1270,7 @@ document.addEventListener('DOMContentLoaded', () => {
archivedTasksBtn.addEventListener('click', () => {
currentView = 'archived';
+ hideProfileSection();
document.querySelector('.cal-section').classList.add('hidden');
document.getElementById('tasks-section').classList.remove('hidden');
document.getElementById('focus-section').classList.add('hidden');
@@ -1194,6 +1281,7 @@ document.addEventListener('DOMContentLoaded', () => {
if(focusModeBtn) {
focusModeBtn.addEventListener('click', () => {
currentView = 'focus';
+ hideProfileSection();
document.querySelector('.cal-section').classList.add('hidden');
document.getElementById('tasks-section').classList.add('hidden');
document.getElementById('focus-section').classList.remove('hidden');
@@ -1202,6 +1290,12 @@ document.addEventListener('DOMContentLoaded', () => {
});
}
+ if (profileBtn) {
+ profileBtn.addEventListener('click', () => {
+ showProfileSection();
+ });
+ }
+
document.getElementById('cal-prev').addEventListener('click', () => {
currentMonthDate.setMonth(currentMonthDate.getMonth() - 1);
renderCalendar();
From 983bdaecb90ca37c1f1d328ed199046b9720800b Mon Sep 17 00:00:00 2001
From: karrisanthoshigayatri
Date: Tue, 9 Jun 2026 17:50:56 +0530
Subject: [PATCH 2/2] duplicated id issue
---
index.html | 2 --
1 file changed, 2 deletions(-)
diff --git a/index.html b/index.html
index e0c921c..22d74c9 100644
--- a/index.html
+++ b/index.html
@@ -43,8 +43,6 @@ Wel
Don't have an account?
Sign Up
-
-