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
No matches
Try fewer words, or open support to ask a new question.
Cookies & local storage
We store your theme and FAQ upvotes on this device to improve your experience.
No ads
No tracking pixels
You control it
`;
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}
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
- /Focus search
- EscClose modal / clear focus
- EnterToggle focused FAQ card
- Ctrl + KOpen support
`;
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.
`;
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());
})();