diff --git a/index.html b/index.html
index cd7ef13..1a742d2 100644
--- a/index.html
+++ b/index.html
@@ -61,8 +61,13 @@
StudyPlan
@@ -372,8 +377,11 @@ {
- localStorage.removeItem('studyplan_user');
+ // (Header logout removed) logout handled in profile popover
- // Show login modal again
- document.getElementById('auth-modal').style.display = 'flex';
+ // Profile Button / Popover
+ const profileBtn = document.getElementById('profile-btn');
+ const profilePopover = document.getElementById('profile-popover');
+
+ function renderProfile() {
+ const userStr = localStorage.getItem('studyplan_user');
+ if (!profileBtn) return;
+ if (!userStr) {
+ profileBtn.innerHTML = 'Profile';
+ profilePopover.style.display = 'none';
+ return;
+ }
+ let user;
+ try { user = JSON.parse(userStr); } catch (e) { user = { email: userStr }; }
+ const name = user.name || (user.email ? user.email.split('@')[0] : 'User');
+ const avatar = `https://ui-avatars.com/api/?name=${encodeURIComponent(name)}&background=4f46e5&color=fff&size=128`;
+ profileBtn.innerHTML = `
${name}`;
+ profilePopover.innerHTML = `
+
+

+
+
${name}
+
${user.email || ''}
+
+
+
+
+
+ `;
+ }
+
+ profileBtn.addEventListener('click', (e) => {
+ if (!localStorage.getItem('studyplan_user')) {
+ document.getElementById('auth-modal').style.display = 'flex';
+ return;
+ }
+ profilePopover.style.display = profilePopover.style.display === 'block' ? 'none' : 'block';
+ const expanded = profilePopover.style.display === 'block';
+ profileBtn.setAttribute('aria-expanded', expanded ? 'true' : 'false');
+ });
+
+ // Close popover when clicking outside
+ document.addEventListener('click', (e) => {
+ if (!profilePopover.contains(e.target) && e.target !== profileBtn) {
+ profilePopover.style.display = 'none';
+ profileBtn.setAttribute('aria-expanded','false');
+ }
+ });
+
+ // Logout from popover
+ document.addEventListener('click', (e) => {
+ if (e.target && e.target.id === 'popover-logout') {
+ localStorage.removeItem('studyplan_user');
+ document.getElementById('auth-modal').style.display = 'flex';
+ profilePopover.style.display = 'none';
+ window.location.reload();
+ }
+ });
- // Refresh page state
- window.location.reload();
-});
+ // Render profile on load
+ renderProfile();
// Settings Modal Logic
const settingsModal = document.getElementById('settings-modal');
diff --git a/package-lock.json b/package-lock.json
index 5652882..e9685a4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,7 +16,7 @@
"sqlite3": "^6.0.1"
},
"engines": {
- "node": "20.x"
+ "node": ">=20.x"
}
},
"node_modules/@google/genai": {