Instant answers • Local upvotes

Frequently Asked Questions

Search across topics and save your upvotes on this device. No accounts, no tracking.

Device stats

0 local upvotes saved

Stored in your browser only. Clearing site data removes them.

Next sync: 00:20

Questions

`; headerEl.innerHTML = headerHTML.trim(); footerEl.innerHTML = footerHTML.trim(); } function v4c0n(){ const storedTheme = localStorage.getItem('theme') || localStorage.getItem(c1t2h.themeKey); if(storedTheme === 'dark' || storedTheme === 'light'){ s3m8x.theme = storedTheme; localStorage.setItem('theme', storedTheme); localStorage.setItem(c1t2h.themeKey, storedTheme); } else { s3m8x.theme = document.documentElement.classList.contains('dark') ? 'dark' : 'light'; localStorage.setItem('theme', s3m8x.theme); localStorage.setItem(c1t2h.themeKey, s3m8x.theme); } try{ const v = JSON.parse(localStorage.getItem(c1t2h.votesKey) || '{}'); if(v && typeof v === 'object') s3m8x.votes = v; }catch(e){ s3m8x.votes = {}; } try{ const o = JSON.parse(localStorage.getItem(c1t2h.openKey) || '{}'); if(o && typeof o === 'object') s3m8x.open = o; }catch(e){ s3m8x.open = {}; } try{ const q = localStorage.getItem(c1t2h.searchKey) || ''; s3m8x.query = q; }catch(e){ s3m8x.query = ''; } } function a9s2e(theme){ s3m8x.theme = theme; const root = document.documentElement; if(theme === 'dark') root.classList.add('dark'); else root.classList.remove('dark'); localStorage.setItem('theme', theme); localStorage.setItem(c1t2h.themeKey, theme); f5n2a(); } function f5n2a(){ const tState = z9p1d('#themeState'); const footerTheme = z9p1d('#footerTheme'); const sun = z9p1d('#iconSun'); const moon = z9p1d('#iconMoon'); const isDark = document.documentElement.classList.contains('dark'); const label = isDark ? 'Dark' : 'Light'; if(tState) tState.textContent = label; if(footerTheme) footerTheme.textContent = label; if(sun && moon){ if(isDark){ sun.classList.add('hidden'); moon.classList.remove('hidden'); } else { moon.classList.add('hidden'); sun.classList.remove('hidden'); } } } function y6w1p(text, query){ const safe = String(text); const q = b7q0s(query).trim(); if(!q) return safe; const parts = q.split(/\s+/).filter(Boolean).slice(0, 6); if(!parts.length) return safe; let out = safe; for(const token of parts){ if(token.length < 2) continue; const re = new RegExp(`(${token.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'ig'); out = out.replace(re, '$1'); } return out; } function e1k7u(v){ const n = Number(v); if(!Number.isFinite(n)) return 0; return Math.max(0, Math.min(9999, Math.round(n))); } function m8p4d(){ localStorage.setItem(c1t2h.votesKey, JSON.stringify(s3m8x.votes)); } function o1b7c(){ localStorage.setItem(c1t2h.openKey, JSON.stringify(s3m8x.open)); } function t0d9q(){ const total = Object.values(s3m8x.votes).reduce((a,b)=>a+e1k7u(b),0); const voteTotal = z9p1d('#voteTotal'); const footerVotes = z9p1d('#footerVotes'); if(voteTotal) voteTotal.textContent = String(total); if(footerVotes) footerVotes.textContent = String(total); } function k7n2v(){ const list = z9p1d('#faqList'); const noRes = z9p1d('#noResults'); const meta = z9p1d('#resultMeta'); const q = z9p1d('#faqSearch')?.value ?? s3m8x.query ?? ''; const query = String(q); s3m8x.query = query; try{ localStorage.setItem(c1t2h.searchKey, query); }catch(e){} const normQ = b7q0s(query).trim(); const tokens = normQ ? normQ.split(/\s+/).filter(Boolean).slice(0, 8) : []; const matches = x8k1q.filter(it=>{ if(!tokens.length) return true; const hay = b7q0s([it.q, it.a, (it.cat||[]).join(' ')].join(' ')); return tokens.every(t => hay.includes(t)); }); s3m8x.lastResultsCount = matches.length; if(meta){ meta.textContent = tokens.length ? `${matches.length} match${matches.length===1?'':'es'} • ${tokens.length} token${tokens.length===1?'':'s'}` : `${matches.length} question${matches.length===1?'':'s'} • all topics`; } list.innerHTML = ''; if(!matches.length){ noRes.classList.remove('hidden'); return; } noRes.classList.add('hidden'); const frag = document.createDocumentFragment(); matches.forEach((it, idx)=>{ const votes = e1k7u(s3m8x.votes[it.id] || 0); const isOpen = !!s3m8x.open[it.id]; const cats = (it.cat || []).slice(0, 3); const art = document.createElement('article'); art.className = 'group rounded-3xl border border-slate-200 bg-white p-5 shadow-sm transition hover:shadow-md hover:shadow-slate-900/5 dark:border-slate-800 dark:bg-slate-900/40 dark:hover:shadow-black/20'; art.setAttribute('data-id', it.id); art.setAttribute('tabindex', '0'); art.setAttribute('role', 'article'); art.setAttribute('aria-label', it.q); const titleHTML = y6w1p(it.q, query); const answerHTML = y6w1p(it.a, query); art.innerHTML = `
${cats.map(c => `${c}`).join('')} #${idx+1}

${answerHTML}

Local votes only Updated anytime
`; frag.appendChild(art); }); list.appendChild(frag); t0d9q(); s9q0a(); } function s9q0a(){ const clearBtn = z9p1d('#clearSearch'); const v = z9p1d('#faqSearch')?.value || ''; if(!clearBtn) return; if(String(v).trim().length){ clearBtn.classList.remove('hidden'); clearBtn.classList.add('flex'); } else { clearBtn.classList.add('hidden'); clearBtn.classList.remove('flex'); } } function j4r1o(id){ const a = z9p1d(`article[data-id="${CSS.escape(id)}"]`); if(!a) return; const ans = z9p1d('[data-role="answer"]', a); const open = !!s3m8x.open[id]; if(open){ ans.classList.remove('hidden'); } else { ans.classList.add('hidden'); } } function q1f8n(openAll){ x8k1q.forEach(it => { s3m8x.open[it.id] = !!openAll; }); o1b7c(); h2k6m('#faqList article').forEach(art=>{ const id = art.getAttribute('data-id'); if(!id) return; j4r1o(id); }); } function c3l9y(el){ if(!el) return null; const art = el.closest('article[data-id]'); if(!art) return null; const id = art.getAttribute('data-id'); return { art, id }; } function g0a5k(){ const banner = z9p1d('#cookieBanner'); const choice = localStorage.getItem(c1t2h.cookieKey); if(choice === 'accept' || choice === 'decline'){ banner.classList.add('hidden'); return; } banner.classList.remove('hidden'); } function p6s1d(choice){ localStorage.setItem(c1t2h.cookieKey, choice); localStorage.setItem(c1t2h.cookieAt, new Date().toISOString()); z9p1d('#cookieBanner')?.classList.add('hidden'); } function b0m2t(title, subtitle, bodyNode){ const shell = z9p1d('#modalShell'); const body = z9p1d('#modalBody'); const ttl = z9p1d('#modalTitle'); const sub = z9p1d('#modalSubtitle'); ttl.textContent = title || 'Modal'; sub.textContent = subtitle || '—'; body.innerHTML = ''; body.appendChild(bodyNode); shell.classList.remove('hidden'); shell.dataset.open = '1'; z9p1d('#modalClose')?.focus(); document.body.classList.add('overflow-hidden'); } function z0k2c(){ const shell = z9p1d('#modalShell'); shell.classList.add('hidden'); shell.dataset.open = '0'; document.body.classList.remove('overflow-hidden'); } function l5e7p(){ const node = document.createElement('div'); node.className = 'space-y-4'; const tips = document.createElement('div'); tips.className = 'rounded-3xl border border-slate-200 bg-white p-5 dark:border-slate-800 dark:bg-slate-950'; tips.innerHTML = `

Keyboard shortcuts

`; node.appendChild(tips); const closeHint = document.createElement('div'); closeHint.className = 'rounded-3xl border border-slate-200 bg-white p-5 dark:border-slate-800 dark:bg-slate-950'; closeHint.innerHTML = `

Tip

Focus stays in the modal while it is open. Click outside or press Esc to close.

`; node.appendChild(closeHint); b0m2t('Keyboard help', 'Navigate faster without a mouse', node); } function d2h5x(){ const node = document.createElement('div'); node.className = 'space-y-4'; const box = document.createElement('div'); box.className = 'rounded-3xl border border-slate-200 bg-white p-5 dark:border-slate-800 dark:bg-slate-950'; const votesJson = JSON.stringify(s3m8x.votes, null, 2); const openJson = JSON.stringify(s3m8x.open, null, 2); box.innerHTML = `

Local data

This is what’s stored on your device for this page.

Votes

${votesJson.replace(/[<>]/g, c => c === '<' ? '<' : '>')}

Open state

${openJson.replace(/[<>]/g, c => c === '<' ? '<' : '>')}
`; node.appendChild(box); const note = document.createElement('div'); note.className = 'rounded-3xl border border-slate-200 bg-white p-5 text-sm text-slate-600 dark:border-slate-800 dark:bg-slate-950 dark:text-slate-300'; note.innerHTML = `

Privacy note: data never leaves your browser. Copy it only if you choose to share with support.

`; node.appendChild(note); b0m2t('Local storage', 'Votes and open states', node); const btn = z9p1d('#copyLocalData'); if(btn){ btn.addEventListener('click', async ()=>{ const payload = { at: new Date().toISOString(), votes: s3m8x.votes, open: s3m8x.open, query: s3m8x.query }; try{ await navigator.clipboard.writeText(JSON.stringify(payload, null, 2)); btn.textContent = 'Copied'; await u5d2a(900); btn.textContent = 'Copy JSON'; }catch(e){ btn.textContent = 'Copy failed'; await u5d2a(900); btn.textContent = 'Copy JSON'; } }); } } function f9y3b(){ const wrap = document.createElement('div'); wrap.className = 'space-y-4'; const card = document.createElement('div'); card.className = 'rounded-3xl border border-slate-200 bg-white p-5 dark:border-slate-800 dark:bg-slate-950'; card.innerHTML = `

Send a support message

We’ll reply by email. Include purchase details if billing-related.

We typically respond within 1–2 business days.

`; wrap.appendChild(card); const privacy = document.createElement('div'); privacy.className = 'rounded-3xl border border-slate-200 bg-white p-5 text-sm text-slate-600 dark:border-slate-800 dark:bg-slate-950 dark:text-slate-300'; privacy.innerHTML = `

Note: this form opens your email client via a mailto link. No data is sent automatically from the page.

`; wrap.appendChild(privacy); b0m2t('Contact support', 'Send us your question', wrap); const form = z9p1d('#supportForm'); const ok = z9p1d('#sfOk'); const submitBtn = z9p1d('#sfSubmit'); const setErr = (k, msg) => { const p = z9p1d(`[data-err="${k}"]`); if(!p) return; if(msg){ p.textContent = msg; p.classList.remove('hidden'); } else { p.textContent = '—'; p.classList.add('hidden'); } }; const emailOk = (v) => /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/i.test(String(v||'').trim()); form.addEventListener('input', (e)=>{ const t = e.target; if(!(t instanceof HTMLElement)) return; if(t.name === 'name') setErr('name', ''); if(t.name === 'email') setErr('email', ''); if(t.name === 'topic') setErr('topic', ''); if(t.name === 'order') setErr('order', ''); if(t.name === 'message') setErr('message', ''); ok.classList.add('hidden'); }); form.addEventListener('submit', (e)=>{ e.preventDefault(); const fd = new FormData(form); const name = String(fd.get('name')||'').trim(); const email = String(fd.get('email')||'').trim(); const topic = String(fd.get('topic')||'').trim(); const order = String(fd.get('order')||'').trim(); const msg = String(fd.get('message')||'').trim(); let bad = false; if(name.length < 2){ setErr('name', 'Please enter your name (min 2 characters).'); bad = true; } if(!emailOk(email)){ setErr('email', 'Please enter a valid email address.'); bad = true; } if(topic.length < 3){ setErr('topic', 'Please enter a topic (min 3 characters).'); bad = true; } if(order && !/^[a-z0-9][a-z0-9\-]{3,32}$/i.test(order)){ setErr('order', 'Order ID format looks unusual. Example: MK-102938'); bad = true; } if(msg.length < 10){ setErr('message', 'Please provide a short description (min 10 characters).'); bad = true; } if(bad) return; const subject = encodeURIComponent(`Support: ${topic}${order ? ' — '+order : ''}`); const body = encodeURIComponent( `Name: ${name}\nEmail: ${email}\nTopic: ${topic}\nOrder ID: ${order || '—'}\n\nMessage:\n${msg}\n\n—\nSent from FAQ page` ); submitBtn.disabled = true; submitBtn.classList.add('opacity-70'); const mailto = `mailto:[email protected]?subject=${subject}&body=${body}`; window.location.href = mailto; ok.classList.remove('hidden'); setTimeout(()=>{ submitBtn.disabled = false; submitBtn.classList.remove('opacity-70'); }, 1200); }); } function e6b0g(){ const v = z9p1d('#faqSearch'); if(v && s3m8x.query){ v.value = s3m8x.query; s9q0a(); } } function w4k7m(){ let left = 20; const el = z9p1d('#syncTimer'); const tick = ()=>{ if(!el) return; const mm = String(Math.floor(left/60)).padStart(2,'0'); const ss = String(left%60).padStart(2,'0'); el.textContent = `${mm}:${ss}`; left -= 1; if(left < 0){ left = 20; const m = z9p1d('#resultMeta'); if(m){ m.classList.add('ring-1','ring-emerald-300','dark:ring-emerald-500/40'); setTimeout(()=>m.classList.remove('ring-1','ring-emerald-300','dark:ring-emerald-500/40'), 450); } } }; tick(); setInterval(tick, 1000); } function i9t2s(){ const year = z9p1d('#yearNow'); if(year) year.textContent = String(new Date().getFullYear()); } function r7u1c(){ const search = z9p1d('#faqSearch'); const form = z9p1d('#searchForm'); const list = z9p1d('#faqList'); z9p1d('#themeToggle')?.addEventListener('click', ()=>{ const isDark = document.documentElement.classList.contains('dark'); a9s2e(isDark ? 'light' : 'dark'); }); z9p1d('#expandAll')?.addEventListener('click', ()=>q1f8n(true)); z9p1d('#collapseAll')?.addEventListener('click', ()=>q1f8n(false)); z9p1d('#openSupport')?.addEventListener('click', f9y3b); z9p1d('#openSupport2')?.addEventListener('click', f9y3b); z9p1d('#noResultsSupport')?.addEventListener('click', f9y3b); z9p1d('#openKeyboard')?.addEventListener('click', l5e7p); z9p1d('#openData')?.addEventListener('click', d2h5x); z9p1d('#modalClose')?.addEventListener('click', z0k2c); z9p1d('#modalBackdrop')?.addEventListener('click', z0k2c); document.addEventListener('keydown', (e)=>{ const shellOpen = z9p1d('#modalShell')?.dataset.open === '1'; if(e.key === 'Escape'){ if(shellOpen){ z0k2c(); e.preventDefault(); return; } if(document.activeElement && document.activeElement !== document.body){ (document.activeElement).blur?.(); } } if(e.key === '/' && !shellOpen){ const tag = (document.activeElement && document.activeElement.tagName || '').toLowerCase(); if(['input','textarea','select'].includes(tag)) return; e.preventDefault(); search?.focus(); } if((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'k' && !shellOpen){ e.preventDefault(); f9y3b(); } }); document.addEventListener('keydown', (e)=>{ const shellOpen = z9p1d('#modalShell')?.dataset.open === '1'; if(!shellOpen) return; if(e.key !== 'Tab') return; const focusables = h2k6m('#modalShell button, #modalShell a, #modalShell input, #modalShell textarea, #modalShell select, #modalShell [tabindex]:not([tabindex="-1"])') .filter(el => !el.hasAttribute('disabled') && !el.getAttribute('aria-hidden')); if(!focusables.length) return; const first = focusables[0]; const last = focusables[focusables.length-1]; const active = document.activeElement; if(e.shiftKey){ if(active === first || active === z9p1d('#modalShell')){ e.preventDefault(); last.focus(); } }else{ if(active === last){ e.preventDefault(); first.focus(); } } }); form?.addEventListener('submit', (e)=>e.preventDefault()); search?.addEventListener('input', ()=>{ k7n2v(); s9q0a(); }); z9p1d('#clearSearch')?.addEventListener('click', ()=>{ if(search){ search.value = ''; search.focus(); } k7n2v(); s9q0a(); }); z9p1d('#noResultsClear')?.addEventListener('click', ()=>{ if(search){ search.value = ''; search.focus(); } k7n2v(); s9q0a(); }); z9p1d('#resetVotes')?.addEventListener('click', async ()=>{ const node = document.createElement('div'); node.className = 'space-y-4'; node.innerHTML = `

Reset local upvotes?

This removes all upvotes stored on this device for this FAQ page.

`; b0m2t('Confirm action', 'Local storage change', node); z9p1d('#rvCancel')?.addEventListener('click', z0k2c); z9p1d('#rvConfirm')?.addEventListener('click', async ()=>{ s3m8x.votes = {}; m8p4d(); h2k6m('#faqList article').forEach(art=>{ const id = art.getAttribute('data-id'); const cnt = z9p1d('[data-role="voteCount"]', art); if(cnt) cnt.textContent = '0'; if(id) s3m8x.votes[id] = 0; }); s3m8x.votes = {}; m8p4d(); t0d9q(); z0k2c(); }); }); list?.addEventListener('click', async (e)=>{ const t = e.target; if(!(t instanceof Element)) return; const actionBtn = t.closest('button[data-action]'); if(!actionBtn) return; const info = c3l9y(actionBtn); if(!info) return; const { art, id } = info; const action = actionBtn.getAttribute('data-action'); if(action === 'toggle'){ s3m8x.open[id] = !s3m8x.open[id]; o1b7c(); j4r1o(id); return; } if(action === 'upvote'){ const newV = e1k7u((s3m8x.votes[id] || 0) + 1); s3m8x.votes[id] = newV; m8p4d(); const cnt = z9p1d('[data-role="voteCount"]', art); if(cnt) cnt.textContent = String(newV); t0d9q(); actionBtn.classList.add('ring-2','ring-emerald-300','dark:ring-emerald-500/40'); setTimeout(()=>actionBtn.classList.remove('ring-2','ring-emerald-300','dark:ring-emerald-500/40'), 250); return; } if(action === 'downvote'){ const newV = e1k7u((s3m8x.votes[id] || 0) - 1); s3m8x.votes[id] = newV; m8p4d(); const cnt = z9p1d('[data-role="voteCount"]', art); if(cnt) cnt.textContent = String(newV); t0d9q(); return; } if(action === 'copy'){ const url = new URL(window.location.href); url.hash = id; try{ await navigator.clipboard.writeText(url.toString()); actionBtn.textContent = 'Copied'; await u5d2a(800); actionBtn.innerHTML = `Copy link `; }catch(err){ actionBtn.textContent = 'Copy failed'; await u5d2a(900); actionBtn.textContent = 'Copy link'; } return; } if(action === 'report'){ const node = document.createElement('div'); node.className = 'space-y-4'; const qText = x8k1q.find(x=>x.id===id)?.q || 'FAQ item'; node.innerHTML = `

Report an issue

You’re reporting: ${qText.replace(/[<>]/g, c => c === '<' ? '<' : '>')}

`; b0m2t('Report content', 'Helps us improve the FAQ', node); const setErr = (msg)=>{ const p = z9p1d('[data-err="reason"]'); if(!p) return; if(msg){ p.textContent = msg; p.classList.remove('hidden'); } else { p.classList.add('hidden'); p.textContent = '—'; } }; z9p1d('#rpCancel')?.addEventListener('click', z0k2c); z9p1d('#reportForm')?.addEventListener('submit', (ev)=>{ ev.preventDefault(); const fd = new FormData(ev.target); const reason = String(fd.get('reason')||'').trim(); const details = String(fd.get('details')||'').trim(); if(reason.length < 3){ setErr('Please enter a reason (min 3 characters).'); return; } setErr(''); const subject = encodeURIComponent(`FAQ report: ${id}`); const body = encodeURIComponent(`FAQ item: ${id}\nQuestion: ${qText}\nReason: ${reason}\nDetails: ${details || '—'}\n\nPage: ${window.location.href}\n\n—\nSent from FAQ page`); window.location.href = `mailto:[email protected]?subject=${subject}&body=${body}`; z9p1d('#rpOk')?.classList.remove('hidden'); }); return; } }); list?.addEventListener('keydown', (e)=>{ const t = e.target; if(!(t instanceof Element)) return; const art = t.closest('article[data-id]'); if(!art) return; const id = art.getAttribute('data-id'); if(!id) return; if(e.key === 'Enter'){ e.preventDefault(); s3m8x.open[id] = !s3m8x.open[id]; o1b7c(); j4r1o(id); return; } }); h2k6m('button[data-chip]').forEach(btn=>{ btn.addEventListener('click', ()=>{ const chip = btn.getAttribute('data-chip') || ''; if(!chip) return; const cur = String(search?.value || '').trim(); const next = cur ? `${cur} ${chip}` : chip; if(search){ search.value = next; search.focus(); } k7n2v(); s9q0a(); }); }); z9p1d('#cookieAccept')?.addEventListener('click', ()=>p6s1d('accept')); z9p1d('#cookieDecline')?.addEventListener('click', ()=>p6s1d('decline')); z9p1d('#cookieCloseX')?.addEventListener('click', ()=>p6s1d('decline')); } function h8l2n(){ const hash = (location.hash || '').replace('#','').trim(); if(!hash) return; const exists = x8k1q.some(it=>it.id===hash); if(!exists) return; s3m8x.open[hash] = true; o1b7c(); requestAnimationFrame(()=>{ k7n2v(); const a = z9p1d(`article[data-id="${CSS.escape(hash)}"]`); if(a) a.scrollIntoView({behavior:'smooth', block:'start'}); }); } r2l8f(); v4c0n(); i9t2s(); f5n2a(); e6b0g(); r7u1c(); k7n2v(); t0d9q(); g0a5k(); w4k7m(); h8l2n(); window.addEventListener('hashchange', ()=>h8l2n()); })();