Skip to content

Commit 708cdf9

Browse files
Merge pull request #1826 from anujsharma8d/fix/appearance-toggle
fix: restore theme toggle and appearance dropdown functionality
2 parents b4c2c34 + 882b4f9 commit 708cdf9

4 files changed

Lines changed: 79 additions & 29 deletions

File tree

web-app/css/styles.css

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,7 @@ body.sidebar-active .sidebar-dock {
529529

530530
.sidebar-controls {
531531
display: flex;
532+
flex-direction: column;
532533
align-items: center;
533534
gap: 8px;
534535
width: 100%;
@@ -557,7 +558,7 @@ body.sidebar-active .sidebar-dock {
557558
gap: 0.35rem;
558559
min-width: 160px;
559560
max-width: 220px;
560-
flex: 1 1 160px;
561+
/* flex: 1 1 160px; */
561562
}
562563

563564
.theme-selector-label {
@@ -646,6 +647,10 @@ body.sidebar-active .sidebar-dock {
646647
color: var(--text);
647648
}
648649

650+
body.sidebar-collapsed .theme-picker {
651+
display: none ;
652+
}
653+
649654
[data-theme="dark"] .theme-picker {
650655
background: #26232b;
651656
border-color: #3d3947;

web-app/index.html

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
<title>Python Mini Projects — Interactive Web Edition</title>
3131
<link href="assets/favicon.svg" rel="icon" type="image/svg+xml" />
3232
<link rel="manifest" href="manifest.json" />
33-
<link href="css/styles.css?v=2" rel="stylesheet" />
33+
<link href="css/styles.css?v=3" rel="stylesheet" />
3434
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"
3535
integrity="sha512-iecdLmaskl7CVkqkXNQ/ZH/XLlvWZOJyj7Yy7tcenmpD1ypASozpmT/E0iPtmFIB46ZmdtAc9eNBvH0H/ZpiBw=="
3636
crossorigin="anonymous" referrerpolicy="no-referrer" />
@@ -170,25 +170,25 @@
170170
<button aria-label="Switch theme" class="theme-toggle" id="sidebarThemeToggle" type="button">
171171
<i class="fas fa-moon" aria-hidden="true"></i>
172172
</button>
173-
<div class="theme-selector">
174-
<span class="theme-selector-label">Appearance</span>
175-
<button id="themeModePicker" class="theme-picker" type="button" aria-haspopup="listbox"
176-
aria-expanded="false">
177-
<span class="theme-picker-value">Auto (System)</span>
178-
<i class="fas fa-chevron-down theme-picker-chevron" aria-hidden="true"></i>
179-
</button>
180-
<ul id="themeModeMenu" class="theme-picker-menu" role="listbox" aria-label="Theme mode options">
181-
<li role="option" class="theme-picker-option" data-value="auto" aria-selected="true">
182-
Auto (System)
183-
</li>
184-
<li role="option" class="theme-picker-option" data-value="light" aria-selected="false">
185-
Light
186-
</li>
187-
<li role="option" class="theme-picker-option" data-value="dark" aria-selected="false">
188-
Dark
189-
</li>
190-
</ul>
191-
</div>
173+
</div>
174+
<div class="theme-selector">
175+
<span class="theme-selector-label">Appearance</span>
176+
<button id="themeModePicker" class="theme-picker" type="button" aria-haspopup="listbox"
177+
aria-expanded="false">
178+
<span class="theme-picker-value">Auto (System)</span>
179+
<i class="fas fa-chevron-down theme-picker-chevron" aria-hidden="true"></i>
180+
</button>
181+
<ul id="themeModeMenu" class="theme-picker-menu" role="listbox" aria-label="Theme mode options">
182+
<li role="option" class="theme-picker-option" data-value="auto" aria-selected="true">
183+
Auto (System)
184+
</li>
185+
<li role="option" class="theme-picker-option" data-value="light" aria-selected="false">
186+
Light
187+
</li>
188+
<li role="option" class="theme-picker-option" data-value="dark" aria-selected="false">
189+
Dark
190+
</li>
191+
</ul>
192192
</div>
193193

194194
<button aria-label="Toggle Sidebar" class="collapse-sidebar-btn" id="sidebarCollapseBtn" type="button">
@@ -630,7 +630,7 @@ <h3>Stay Updated</h3>
630630
<script defer src="js/projects.js?v=4"></script>
631631
<script defer src="js/cm-editor.js"></script>
632632
<script defer src="js/playground.js"></script>
633-
<script defer type="module" src="js/main.js?v=2"></script>
633+
<script defer type="module" src="js/main.js?v=3"></script>
634634
<script defer src="js/hero-canvas.js"></script>
635635
<script defer src="js/projects/war-card-game.js"></script>
636636
<script defer src="js/projects/number-sliding-puzzle.js"></script>
@@ -1282,7 +1282,7 @@ <h3>${project.title}</h3>
12821282
})();
12831283
</script>
12841284

1285-
//THEME TOGGLE
1285+
<!-- THEME TOGGLE -->
12861286
<script>
12871287
(function () {
12881288
const html = document.documentElement;

web-app/js/main.js

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,15 +119,15 @@ function applyThemeMode(mode) {
119119
theme === 'light'
120120
? '<i class="fas fa-sun" aria-hidden="true"></i>'
121121
: '<i class="fas fa-moon" aria-hidden="true"></i>';
122-
updateThemeToggleAria(newTheme === 'light');
122+
updateThemeToggleAria(theme === 'light');
123123
});
124124
}
125125

126126
const savedTheme = localStorage.getItem('theme') || 'dark';
127127
html.setAttribute('data-theme', savedTheme);
128128
syncThemeColor(savedTheme);
129-
if (themeToggle) {
130-
themeToggle.innerHTML =
129+
if (themeToggles) {
130+
themeToggles.innerHTML =
131131
savedTheme === 'light'
132132
? '<i class="fas fa-sun" aria-hidden="true"></i>'
133133
: '<i class="fas fa-moon" aria-hidden="true"></i>';
@@ -209,7 +209,7 @@ function showInfoModal(title, steps) {
209209
newClose.addEventListener("click", function (e) {
210210
e.preventDefault();
211211
closeModal();
212-
};
212+
});
213213
}
214214

215215
if (gotItBtn) {
@@ -218,7 +218,7 @@ function showInfoModal(title, steps) {
218218
newGotIt.addEventListener("click", function (e) {
219219
e.preventDefault();
220220
closeModal();
221-
};
221+
});
222222
}
223223

224224
overlay.onclick = function (e) {
@@ -364,6 +364,51 @@ document.addEventListener("DOMContentLoaded", function () {
364364
});
365365
}
366366

367+
// Theme toggle
368+
themeToggles.forEach((toggle) => {
369+
toggle.addEventListener("click", () => {
370+
const current =
371+
document.documentElement.getAttribute("data-theme") === "dark"
372+
? "dark"
373+
: "light";
374+
375+
const next = current === "dark" ? "light" : "dark";
376+
applyThemeMode(next);
377+
setThemePickerLabel(next);
378+
});
379+
});
380+
381+
// Appearance dropdown
382+
if (themeModePicker && themeModeMenu) {
383+
themeModePicker.addEventListener("click", (e) => {
384+
e.stopPropagation();
385+
386+
if (themeModeMenu.classList.contains("active")) {
387+
closeThemeMenu();
388+
} else {
389+
openThemeMenu();
390+
}
391+
});
392+
393+
themeModeMenu.querySelectorAll(".theme-picker-option").forEach((option) => {
394+
option.addEventListener("click", () => {
395+
const mode = option.dataset.value;
396+
applyThemeMode(mode);
397+
setThemePickerLabel(mode);
398+
closeThemeMenu();
399+
});
400+
});
401+
402+
document.addEventListener("click", (e) => {
403+
if (
404+
!themeModePicker.contains(e.target) &&
405+
!themeModeMenu.contains(e.target)
406+
) {
407+
closeThemeMenu();
408+
}
409+
});
410+
}
411+
367412
/* ── Sound Toggle (Multi-Element Support) ─────────────────────────── */
368413
var soundToggles = document.querySelectorAll(".sound-toggle");
369414

web-app/service-worker.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const CACHE_NAME = 'python-mini-projects-v3';
1+
const CACHE_NAME = 'python-mini-projects-v4';
22

33
const PRECACHE_ASSETS = [
44
'./',

0 commit comments

Comments
 (0)