// ============ THEME TOGGLE ============ (function () { const html = document.documentElement; let theme = (matchMedia('(prefers-color-scheme:dark)').matches ? 'dark' : 'light'); html.setAttribute('data-theme', theme); function updateToggles() { document.querySelectorAll('[data-theme-toggle]').forEach(btn => { btn.innerHTML = theme === 'dark' ? '' : ''; btn.setAttribute('aria-label', 'Switch to ' + (theme === 'dark' ? 'light' : 'dark') + ' mode'); }); } document.addEventListener('DOMContentLoaded', () => { updateToggles(); document.querySelectorAll('[data-theme-toggle]').forEach(btn => { btn.addEventListener('click', () => { theme = theme === 'dark' ? 'light' : 'dark'; html.setAttribute('data-theme', theme); // theme stored in memory only updateToggles(); }); }); }); })(); // ============ MOBILE MENU ============ document.addEventListener('DOMContentLoaded', () => { const hamburger = document.querySelector('.hamburger'); const mobileMenu = document.querySelector('.mobile-menu'); if (hamburger && mobileMenu) { hamburger.addEventListener('click', () => { mobileMenu.classList.toggle('open'); }); } // ============ CODE COPY ============ document.querySelectorAll('.code-block__copy').forEach(btn => { btn.addEventListener('click', () => { const pre = btn.closest('.code-block').querySelector('pre'); navigator.clipboard.writeText(pre.textContent).then(() => { btn.textContent = 'Copied!'; setTimeout(() => btn.textContent = 'Copy', 2000); }); }); }); // ============ PROMPT TABS ============ document.querySelectorAll('.prompt-example__tab').forEach(tab => { tab.addEventListener('click', () => { const example = tab.closest('.prompt-example'); example.querySelectorAll('.prompt-example__tab').forEach(t => t.classList.remove('active')); example.querySelectorAll('.prompt-panel').forEach(p => p.classList.remove('active')); tab.classList.add('active'); const target = example.querySelector('#' + tab.dataset.panel); if (target) target.classList.add('active'); }); }); // ============ SCROLL ANIMATIONS ============ const observer = new IntersectionObserver((entries) => { entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add('animate-in'); observer.unobserve(e.target); } }); }, { threshold: 0.1 }); document.querySelectorAll('.lesson-card, .track-card, .feature-item, .technique-card').forEach(el => { el.style.opacity = '0'; el.style.transform = 'translateY(16px)'; el.style.transition = 'opacity 0.45s ease, transform 0.45s ease'; observer.observe(el); }); document.addEventListener('animationend', (e) => { e.target.style.opacity = ''; e.target.style.transform = ''; }); // ============ ACTIVE SIDEBAR LINK ============ const sidebarLinks = document.querySelectorAll('.sidebar__item a'); const hash = window.location.pathname.split('/').pop(); sidebarLinks.forEach(a => { if (a.getAttribute('href') && a.getAttribute('href').includes(hash)) { a.closest('.sidebar__item').classList.add('active'); } }); }); // ============ PLAYGROUND DEMO ============ window.runPlayground = function () { const input = document.getElementById('pg-input'); const output = document.getElementById('pg-output'); const technique = document.getElementById('pg-technique'); if (!input || !output) return; const prompt = input.value.trim(); if (!prompt) { output.textContent = 'Please enter a prompt first.'; return; } const t = technique ? technique.value : 'basic'; const examples = { basic: `[Response to: "${prompt.slice(0, 50)}..."]\n\nThis is a simulated response demonstrating basic prompting. In a real Claude session, the model reads your exact words and generates a contextually appropriate reply.\n\nKey insight: The clearer your prompt, the better the response.`, roleplay: `[Role: Expert assigned]\nAs a domain expert, I'll answer: "${prompt.slice(0, 50)}..."\n\nRole prompting activates Claude's specialized knowledge modes. By assigning a persona, you frame the response context and get more authoritative, on-topic answers.`, cot: `[Chain-of-Thought activated]\nLet me think through this step by step:\n\n1. First, I identify the core question in: "${prompt.slice(0, 40)}..."\n2. I consider the relevant context and constraints\n3. I reason through potential approaches\n4. I arrive at a well-structured conclusion\n\nResult: CoT prompting dramatically improves accuracy on complex reasoning tasks.`, xml: `[XML-structured response]\n\n Understanding the prompt: "${prompt.slice(0, 40)}..."\n XML tags help Claude organize output and follow structured instructions precisely\n Structured prompts yield structured, predictable outputs\n`, fewshot: `[Few-shot learning activated]\nBased on the patterns in your examples, I'm applying that template to: "${prompt.slice(0, 40)}..."\n\nFew-shot prompting shows Claude the exact format and style you want, eliminating ambiguity and dramatically improving output consistency.` }; output.textContent = examples[t] || examples.basic; };