'use strict'; // ---- Bottom sheet (dialog on tablet/desktop). Body content is built by the caller from trusted/escaped HTML. function openSheet(title, sub, bodyHtml) { closeSheet(); const el = document.createElement('div'); el.id = 'sheet'; el.innerHTML = `
`; document.body.appendChild(el); el.querySelector('.scrim').onclick = closeSheet; requestAnimationFrame(() => el.classList.add('on')); return el; } function closeSheet() { document.getElementById('sheet')?.remove(); } addEventListener('keydown', e => { if (e.key === 'Escape') closeSheet(); }); function actionSheet(title, sub, actions) { const el = openSheet(title, sub, `
${actions.map((a, i) => ` `).join('')}
`); el.querySelector('#sx').onclick = closeSheet; el.querySelectorAll('button.row').forEach(b => b.onclick = () => { closeSheet(); actions[b.dataset.i].run(); }); } function textSheet(title, label, okLabel, onOk, initial = '', validate) { const el = openSheet(title, '', `
`); el.querySelector('#sx').onclick = closeSheet; el.querySelector('form').onsubmit = e => { e.preventDefault(); const v = el.querySelector('#tv').value.trim(); if (!v) return; const bad = validate && validate(v); if (bad) { el.querySelector('#te').textContent = bad; return; } closeSheet(); onOk(v); }; setTimeout(() => { const t = el.querySelector('#tv'); t.focus(); const d = initial.lastIndexOf('.'); t.setSelectionRange(0, d > 0 ? d : initial.length); }, 50); } function confirmSheet(title, sub, okLabel, onOk) { const el = openSheet(title, sub, `
`); el.querySelector('#sx').onclick = closeSheet; el.querySelector('#so').onclick = () => { closeSheet(); onOk(); }; }