Skip to content

Commit a181088

Browse files
committed
Fix theme toggle, put navbar in extra file, Minor CSS improvements
1 parent 47ce63f commit a181088

File tree

13 files changed

+379
-279
lines changed

13 files changed

+379
-279
lines changed

about.html

Lines changed: 3 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,10 @@
66
<title>About - Mod-Sauce Dev's</title>
77
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico?">
88
<link rel="stylesheet" type="text/css" href="style.css">
9+
<link rel="stylesheet" type="text/css" href="assets/css/theme-toggle.css">
910

1011
</head>
1112
<body>
12-
<!-- Accessible Navigation -->
13-
<nav class="navbar site-nav" role="navigation" aria-label="Main">
14-
<div class="nav-content">
15-
<a href="index.html" class="logo">
16-
<img src="favicon.ico" alt="Mod-Sauce Logo">
17-
Mod-Sauce Dev's
18-
</a>
19-
20-
<button id="nav-toggle" class="burger" aria-expanded="false" aria-controls="primary-menu" aria-label="Toggle menu">
21-
<span class="burger-box"><span class="burger-inner"></span></span>
22-
</button>
23-
24-
<div id="primary-menu" class="nav-menu" hidden>
25-
<div class="nav-links">
26-
<a href="index.html">Home</a>
27-
<a href="about.html" class="active">About</a>
28-
<div class="dropdown">
29-
<a href="#">Projects ▼</a>
30-
<div class="dropdown-menu">
31-
<a href="impr.html">IMP Renewed</a>
32-
<a href="oer.html">Otyacraft Engine Renewed</a>
33-
</div>
34-
<a href="testing.html" class="active">Test Uploads</a>
35-
</div>
36-
</div>
37-
</div>
38-
39-
<button id="theme-toggle" class="theme-toggle" aria-pressed="false" aria-label="Toggle color theme">
40-
<span class="icon-sun" aria-hidden="true">☀️</span>
41-
<span class="icon-moon" aria-hidden="true">🌙</span>
42-
</button>
43-
</div>
44-
</nav>
4513
<!-- Main Content -->
4614
<main class="main-content">
4715
<h1>About Mod-Sauce Dev's</h1>
@@ -76,6 +44,8 @@ <h2>Get Involved</h2>
7644
<p>Thank you for your support!</p>
7745
</div>
7846
</main>
47+
<script src="assets/js/navbar-loader.js"></script>
7948
<script src="assets/js/nav-theme.js"></script>
49+
<script src="assets/js/theme-toggle.js"></script>
8050
</body>
8151
</html>

assets/css/theme-toggle.css

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/* Theme Toggle Button Styles */
2+
.theme-toggle-btn {
3+
background: var(--primary);
4+
color: var(--text);
5+
border: none;
6+
padding: 0.6rem 1rem;
7+
border-radius: 6px;
8+
cursor: pointer;
9+
font-size: 1.2rem;
10+
transition: all 0.3s ease;
11+
display: inline-flex;
12+
align-items: center;
13+
justify-content: center;
14+
margin-left: auto;
15+
z-index: 1001;
16+
pointer-events: auto !important;
17+
position: relative;
18+
}
19+
20+
.theme-toggle-btn:hover {
21+
background: var(--secondary);
22+
transform: scale(1.05);
23+
}
24+
25+
.theme-toggle-btn:active {
26+
transform: scale(0.95);
27+
}
28+
29+
.toggle-icon {
30+
display: inline-block;
31+
transition: transform 0.3s ease;
32+
}
33+
34+
.theme-toggle-btn:hover .toggle-icon {
35+
transform: rotate(20deg);
36+
}
37+
38+
/* Ensure toggle is visible on all screen sizes */
39+
@media (max-width: 768px) {
40+
.theme-toggle-btn {
41+
padding: 0.5rem 0.8rem;
42+
font-size: 1rem;
43+
margin-left: 0.5rem;
44+
}
45+
}
46+

assets/js/nav-theme.js

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,6 @@
4848
btn.innerHTML = '<span class="burger-box"><span class="burger-inner"></span></span>';
4949
left.appendChild(btn);
5050

51-
// theme toggle
52-
const themeBtn = document.createElement('button');
53-
themeBtn.id = 'theme-toggle';
54-
themeBtn.className = 'theme-toggle';
55-
themeBtn.setAttribute('aria-pressed', 'false');
56-
themeBtn.setAttribute('aria-label', 'Toggle color theme');
57-
themeBtn.innerHTML = '<span class="icon-sun" aria-hidden="true">☀️</span><span class="icon-moon" aria-hidden="true">🌙</span>';
58-
left.appendChild(themeBtn);
59-
6051
// menu: try to reuse existing .nav-links
6152
const menu = document.createElement('div');
6253
menu.id = 'primary-menu';
@@ -84,7 +75,6 @@
8475
siteNavs.forEach((nav) => {
8576
const navToggle = nav.querySelector('#nav-toggle');
8677
const menu = nav.querySelector('#primary-menu');
87-
const themeBtn = nav.querySelector('#theme-toggle');
8878

8979
// Ensure menu visibility based on viewport
9080
const innerLinks = menu ? menu.querySelector('.nav-links') : null;
@@ -141,27 +131,17 @@
141131
});
142132
}
143133

144-
// Theme toggle wiring
145-
if (themeBtn) {
146-
themeBtn.setAttribute('aria-pressed', document.documentElement.getAttribute('data-theme') === 'dark');
147-
themeBtn.addEventListener('click', (e) => {
148-
e.stopPropagation();
149-
console.debug('nav-theme: themeBtn click, before theme=', document.documentElement.getAttribute('data-theme'));
150-
const cur = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light';
151-
const next = cur === 'dark' ? 'light' : 'dark';
152-
applyTheme(next);
153-
localStorage.setItem(THEME_KEY, next);
154-
themeBtn.setAttribute('aria-pressed', next === 'dark');
155-
console.debug('nav-theme: themeBtn click, after theme=', document.documentElement.getAttribute('data-theme'));
156-
});
157-
}
134+
158135
});
159136
console.debug('nav-theme: init done, navs=', siteNavs.length);
160137
} catch (err) {
161138
console.error('nav-theme: init error', err);
162139
}
163140
}
164141

142+
// Listen for navbar loaded event (from navbar-loader.js)
143+
document.addEventListener('navbarLoaded', initNavAndTheme);
144+
165145
if (document.readyState === 'loading') {
166146
document.addEventListener('DOMContentLoaded', initNavAndTheme);
167147
} else {
@@ -173,12 +153,14 @@
173153
document.addEventListener('click', (e) => {
174154
const btn = e.target.closest && e.target.closest('.burger');
175155
if (!btn) return;
156+
e.preventDefault();
157+
e.stopPropagation();
176158
const nav = btn.closest && btn.closest('nav.site-nav');
177159
if (!nav) return;
178160
const navToggle = btn;
179161
const menu = nav.querySelector('#primary-menu');
180162
const innerLinks = menu ? menu.querySelector('.nav-links') : null;
181-
console.debug('nav-theme: delegated burger click, innerWidth=', window.innerWidth, 'menu.hidden=', menu ? menu.hidden : 'no-menu');
163+
console.log('Burger menu clicked!');
182164
const open = navToggle.getAttribute('aria-expanded') === 'true';
183165
navToggle.setAttribute('aria-expanded', String(!open));
184166
if (open) {
@@ -191,4 +173,6 @@
191173
if (first) first.focus();
192174
}
193175
});
176+
177+
194178
})();

assets/js/navbar-loader.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Load navbar from navbar.html and inject it into the page
2+
(function () {
3+
async function loadNavbar() {
4+
try {
5+
// Use absolute path from root
6+
const navbarPath = window.location.origin + window.location.pathname.split('/').slice(0, -1).join('/') + '/navbar.html';
7+
8+
const response = await fetch(navbarPath);
9+
if (!response.ok) throw new Error(`Failed to load navbar: ${response.status}`);
10+
const html = await response.text();
11+
12+
// Insert navbar at the beginning of body
13+
const body = document.body;
14+
const tempDiv = document.createElement('div');
15+
tempDiv.innerHTML = html;
16+
const navbar = tempDiv.firstElementChild;
17+
18+
// Remove any existing navbar
19+
const existingNav = document.querySelector('nav.site-nav');
20+
if (existingNav) {
21+
existingNav.remove();
22+
}
23+
24+
// Insert new navbar at the beginning
25+
body.insertBefore(navbar, body.firstChild);
26+
27+
// Dispatch event to signal navbar is loaded
28+
document.dispatchEvent(new CustomEvent('navbarLoaded'));
29+
} catch (err) {
30+
console.error('navbar-loader: Failed to load navbar', err);
31+
}
32+
}
33+
34+
if (document.readyState === 'loading') {
35+
document.addEventListener('DOMContentLoaded', loadNavbar);
36+
} else {
37+
loadNavbar();
38+
}
39+
})();
40+

assets/js/theme-toggle.js

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
// Simple Theme Toggle Implementation
2+
(function() {
3+
const THEME_KEY = 'site-theme';
4+
console.log('Theme toggle script loaded');
5+
6+
// Apply theme to document
7+
function applyTheme(theme) {
8+
console.log('applyTheme called with:', theme);
9+
if (theme === 'dark') {
10+
document.documentElement.setAttribute('data-theme', 'dark');
11+
} else {
12+
document.documentElement.removeAttribute('data-theme');
13+
}
14+
updateToggleButton(theme);
15+
}
16+
17+
// Update toggle button appearance
18+
function updateToggleButton(theme) {
19+
console.log('updateToggleButton called with:', theme);
20+
const toggle = document.getElementById('theme-toggle');
21+
console.log('toggle element:', toggle);
22+
if (toggle) {
23+
const newHTML = theme === 'dark' ? '<span class="toggle-icon">☀️</span>' : '<span class="toggle-icon">🌙</span>';
24+
console.log('Setting toggle HTML to:', newHTML);
25+
toggle.innerHTML = newHTML;
26+
}
27+
}
28+
29+
// Toggle between dark and light theme
30+
function toggleTheme(e) {
31+
console.log('toggleTheme called, event:', e);
32+
e.preventDefault();
33+
const currentTheme = document.documentElement.getAttribute('data-theme') || 'light';
34+
console.log('currentTheme:', currentTheme);
35+
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
36+
console.log('newTheme:', newTheme);
37+
localStorage.setItem(THEME_KEY, newTheme);
38+
applyTheme(newTheme);
39+
}
40+
41+
// Initialize theme
42+
function initTheme() {
43+
console.log('initTheme called');
44+
const savedTheme = localStorage.getItem(THEME_KEY);
45+
console.log('savedTheme from localStorage:', savedTheme);
46+
let theme;
47+
48+
if (savedTheme) {
49+
// Use saved preference if available
50+
theme = savedTheme;
51+
console.log('Using saved theme:', theme);
52+
} else {
53+
// Check system preference (browser settings)
54+
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
55+
console.log('System prefers dark mode:', prefersDark);
56+
theme = prefersDark ? 'dark' : 'light';
57+
console.log('Using system theme:', theme);
58+
}
59+
60+
console.log('theme to apply:', theme);
61+
applyTheme(theme);
62+
}
63+
64+
// Listen for system theme changes
65+
function setupSystemThemeListener() {
66+
const darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)');
67+
darkModeQuery.addEventListener('change', (e) => {
68+
// Only apply system theme if user hasn't saved a preference
69+
if (!localStorage.getItem(THEME_KEY)) {
70+
const newTheme = e.matches ? 'dark' : 'light';
71+
console.log('System theme changed to:', newTheme);
72+
applyTheme(newTheme);
73+
}
74+
});
75+
}
76+
77+
// Setup click handler
78+
function setupClickHandler() {
79+
console.log('setupClickHandler called');
80+
const toggle = document.getElementById('theme-toggle');
81+
console.log('toggle element found:', !!toggle);
82+
if (toggle) {
83+
console.log('Adding click listener to toggle button');
84+
toggle.addEventListener('click', toggleTheme);
85+
console.log('Click listener added');
86+
} else {
87+
console.log('ERROR: toggle element not found!');
88+
}
89+
}
90+
91+
// Initialize on page load
92+
function init() {
93+
console.log('init called');
94+
initTheme();
95+
setupClickHandler();
96+
setupSystemThemeListener();
97+
}
98+
99+
// Run initialization
100+
console.log('document.readyState:', document.readyState);
101+
102+
// Wait for navbar to be loaded first
103+
document.addEventListener('navbarLoaded', function() {
104+
console.log('navbarLoaded event received, initializing theme toggle');
105+
setTimeout(init, 50);
106+
});
107+
108+
// Also try on DOMContentLoaded as fallback
109+
if (document.readyState === 'loading') {
110+
console.log('DOM still loading, waiting for DOMContentLoaded');
111+
document.addEventListener('DOMContentLoaded', function() {
112+
console.log('DOMContentLoaded fired');
113+
setTimeout(init, 100);
114+
});
115+
} else {
116+
console.log('DOM already loaded, trying init');
117+
setTimeout(init, 100);
118+
}
119+
})();
120+

impr.html

Lines changed: 3 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,10 @@
66
<title>IMPR - Mod-Sauce Dev's</title>
77
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico?">
88
<link rel="stylesheet" type="text/css" href="style.css">
9+
<link rel="stylesheet" type="text/css" href="assets/css/theme-toggle.css">
910

1011
</head>
1112
<body>
12-
<!-- Accessible Navigation -->
13-
<nav class="navbar site-nav" role="navigation" aria-label="Main">
14-
<div class="nav-content">
15-
<a href="index.html" class="logo">
16-
<img src="favicon.ico" alt="Mod-Sauce Logo">
17-
Mod-Sauce Dev's
18-
</a>
19-
20-
<button id="nav-toggle" class="burger" aria-expanded="false" aria-controls="primary-menu" aria-label="Toggle menu">
21-
<span class="burger-box"><span class="burger-inner"></span></span>
22-
</button>
23-
24-
<div id="primary-menu" class="nav-menu" hidden>
25-
<div class="nav-links">
26-
<a href="index.html">Home</a>
27-
<a href="about.html">About</a>
28-
<div class="dropdown">
29-
<a href="#" class="active">Projects ▼</a>
30-
<div class="dropdown-menu">
31-
<a href="impr.html">IMP Renewed</a>
32-
<a href="oer.html">Otyacraft Engine Renewed</a>
33-
</div>
34-
<a href="testing.html" class="active">Test Uploads</a>
35-
</div>
36-
</div>
37-
</div>
38-
39-
<button id="theme-toggle" class="theme-toggle" aria-pressed="false" aria-label="Toggle color theme">
40-
<span class="icon-sun" aria-hidden="true">☀️</span>
41-
<span class="icon-moon" aria-hidden="true">🌙</span>
42-
</button>
43-
</div>
44-
</nav>
4513
<!-- Main Content -->
4614
<main class="main-content">
4715
<h1>IMPR (Iam Music Player Renewed)</h1>
@@ -74,6 +42,8 @@ <h2>Download and Support</h2>
7442
<p>Thank you for supporting IMPR!</p>
7543
</div>
7644
</main>
45+
<script src="assets/js/navbar-loader.js"></script>
7746
<script src="assets/js/nav-theme.js"></script>
47+
<script src="assets/js/theme-toggle.js"></script>
7848
</body>
7949
</html>

0 commit comments

Comments
 (0)