51 lines
1.7 KiB
JavaScript
51 lines
1.7 KiB
JavaScript
// Theme cycle: dark → light → forest → coffee
|
|
(function() {
|
|
const themes = ['dark', 'light', 'forest', 'coffee'];
|
|
const icons = { dark: '🌙', light: '☀️', forest: '🌿', coffee: '☕' };
|
|
|
|
function getStored() {
|
|
try { return localStorage.getItem('kp-theme'); } catch(e) { return null; }
|
|
}
|
|
|
|
function setStored(theme) {
|
|
try { localStorage.setItem('kp-theme', theme); } catch(e) {}
|
|
}
|
|
|
|
function applyTheme(theme) {
|
|
document.documentElement.setAttribute('data-theme', theme);
|
|
setStored(theme);
|
|
var btn = document.getElementById('theme-toggle');
|
|
if (btn) btn.textContent = icons[theme] || '🌙';
|
|
}
|
|
|
|
// Init: stored preference, then data-theme attr, then default dark
|
|
var stored = getStored();
|
|
var current = stored || document.documentElement.getAttribute('data-theme') || 'dark';
|
|
if (themes.indexOf(current) === -1) current = 'dark';
|
|
applyTheme(current);
|
|
|
|
// Toggle
|
|
document.getElementById('theme-toggle').addEventListener('click', function() {
|
|
var idx = themes.indexOf(document.documentElement.getAttribute('data-theme'));
|
|
var next = themes[(idx < 0 ? 0 : idx + 1) % themes.length];
|
|
applyTheme(next);
|
|
});
|
|
})();
|
|
|
|
// Mobile nav toggle
|
|
document.getElementById('nav-toggle').addEventListener('click', function() {
|
|
var menu = document.getElementById('nav-menu');
|
|
this.classList.toggle('is-active');
|
|
menu.classList.toggle('is-active');
|
|
});
|
|
|
|
// Contact form (placeholder)
|
|
var form = document.getElementById('contact-form');
|
|
if (form) {
|
|
form.addEventListener('submit', function(e) {
|
|
e.preventDefault();
|
|
var status = document.getElementById('form-status');
|
|
status.style.display = 'block';
|
|
form.querySelector('button[type="submit"]').disabled = true;
|
|
});
|
|
}
|