Course Catalog
Refine your path. Use precise filters and preview details before enrolling.
`;
const footerHTML = ``;
document.querySelector('header').innerHTML = headerHTML;
document.querySelector('footer').innerHTML = footerHTML;
setupGlobalUI();
};
function setupGlobalUI() {
const toggle = document.getElementById('themeToggle');
if (toggle) {
toggle.addEventListener('click', () => {
const isDark = document.documentElement.classList.toggle('dark');
localStorage.setItem('theme', isDark ? 'dark' : 'light');
});
}
const banner = document.getElementById('cookieBanner');
const accept = document.getElementById('cookieAccept');
if (banner && accept) {
if (localStorage.getItem('cookieConsent') === 'true') banner.classList.add('hidden');
accept.addEventListener('click', () => {
localStorage.setItem('cookieConsent', 'true');
banner.classList.add('hidden');
});
}
const openSignIn = document.getElementById('openSignIn');
const openRegister = document.getElementById('openRegister');
const authModal = document.getElementById('authModal');
const closeAuth = document.getElementById('closeAuth');
const authTabs = document.querySelectorAll('[data-auth-tab]');
const authForms = document.querySelectorAll('[data-auth-form]');
const signInForm = document.getElementById('signInForm');
const registerForm = document.getElementById('registerForm');
function openAuth(m) {
if (!authModal) return;
authModal.classList.remove('hidden');
switchMode(m);
}
function switchMode(m) {
authTabs.forEach(t => t.dataset.authTab === m ? t.classList.add('bg-amber-500', 'text-slate-900') : t.classList.remove('bg-amber-500', 'text-slate-900'));
authForms.forEach(f => f.dataset.authForm === m ? f.classList.remove('hidden') : f.classList.add('hidden'));
}
if (openSignIn) openSignIn.addEventListener('click', () => openAuth('signin'));
if (openRegister) openRegister.addEventListener('click', () => openAuth('register'));
if (closeAuth) closeAuth.addEventListener('click', () => authModal.classList.add('hidden'));
document.addEventListener('click', (e) => { if (e.target.id === 'authBackdrop') authModal.classList.add('hidden'); });
if (signInForm) signInForm.addEventListener('submit', (e) => { e.preventDefault(); authModal.classList.add('hidden'); alert('Signed in successfully!'); });
if (registerForm) registerForm.addEventListener('submit', (e) => { e.preventDefault(); authModal.classList.add('hidden'); alert('Account created!'); });
const menuToggle = document.getElementById('menuToggle');
const mobileMenu = document.getElementById('mobileMenu');
if (menuToggle && mobileMenu) menuToggle.addEventListener('click', () => mobileMenu.classList.toggle('hidden'));
}
function loadData() {
// Self-contained data (simulating fetch("./catalog.json"))
state.data = [
{"id":"c001","title":"Lace Mastery","level":"Intermediate","category":"Lace","price":189,"rating":4.9,"lessons":14,"duration":"6 weeks","instructor":"Elena Voss","tags":["shawl","chart-reading"],"shortDescription":"Intricate lace techniques for shawls and garments.","description":"Master Estonian and Shetland lace techniques with detailed chart reading and yarn management.","cover":"./images/lace_mastery_course_knitting_detail.jpg"},
{"id":"c002","title":"Brioche Basics","level":"Beginner","category":"Brioche","price":129,"rating":4.8,"lessons":10,"duration":"5 weeks","instructor":"Marcus Hale","tags":["sweater","finishing"],"shortDescription":"Learn two-color brioche knitting from scratch.","description":"Foundation to advanced two-color brioche with seamless construction and color play.","cover":"./images/brioche_basics_knitting_detail.jpg"},
{"id":"c003","title":"Cable Knitting Intensive","level":"Advanced","category":"Cables","price":219,"rating":4.7,"lessons":16,"duration":"8 weeks","instructor":"Sofia Quinn","tags":["sweater"],"shortDescription":"Complex cable patterns for sweaters and more.","description":"Aran, Celtic and modern cable constructions with correct decreases and shaping.","cover":"./images/cable_intensive_knitting_detail.jpg"},
{"id":"c004","title":"Colorwork Fundamentals","level":"Intermediate","category":"Colorwork","price":159,"rating":4.9,"lessons":12,"duration":"6 weeks","instructor":"Lina Berg","tags":["sweater","chart-reading"],"shortDescription":"Fair Isle, stranded and intarsia techniques.","description":"Confidence with color dominance, steeking and perfect tension.","cover":"./images/colorwork_fundamentals_detail.jpg"},
{"id":"c005","title":"Sweater Fit & Design","level":"Advanced","category":"Fit & Shaping","price":239,"rating":4.6,"lessons":18,"duration":"9 weeks","instructor":"Theo Rens","tags":["sweater"],"shortDescription":"Professional garment design and modification.","description":"Body measurements, ease calculations and custom pattern alterations.","cover":"./images/sweater_fit_design_detail.jpg"},
{"id":"c006","title":"Finishing School","level":"Intermediate","category":"Finishing","price":149,"rating":4.8,"lessons":9,"duration":"4 weeks","instructor":"Clara Nells","tags":["finishing"],"shortDescription":"Professional finishing techniques.","description":"Blocking, seaming, buttonholes and beautiful edgings.","cover":"./images/finishing_school_knitting_detail.jpg"},
{"id":"c007","title":"Sock Architecture","level":"Beginner","category":"Accessories","price":99,"rating":4.9,"lessons":8,"duration":"4 weeks","instructor":"Jonas Vale","tags":["socks"],"shortDescription":"Cuff to toe sock construction.","description":"Toe-up and cuff-down methods with heel variations.","cover":"./images/sock_architecture_detail.jpg"},
{"id":"c008","title":"Shawl Design Studio","level":"Advanced","category":"Design","price":199,"rating":4.7,"lessons":13,"duration":"7 weeks","instructor":"Nora Klein<|eos|>