This commit is contained in:
th committed 2026-04-06 20:27:19 +02:00
1 parent e85b5203cd
commit 0d4d369870
19 files changed
+2258 -1814

No files matched your search

+57
View File
@@ -0,0 +1,57 @@
// ── Custom dialog system ──
import { $ } from './util.js';
const overlay = $('dialog');
const titleEl = $('dialog-title');
const msgEl = $('dialog-msg');
const inputEl = $('dialog-input');
const cancelBtn = $('dialog-cancel');
const okBtn = $('dialog-ok');
const closeBtn = $('dialog-close');
let resolve = null;
function canCancel() { return !cancelBtn.classList.contains('hidden'); }
function close(result) {
overlay.classList.remove('open');
if (resolve) { resolve(result); resolve = null; }
}
function submit() {
close(inputEl.classList.contains('hidden') ? true : inputEl.value);
}
export function showDialog({ title, message = '', input = false, placeholder = '', danger = false, okLabel = 'ok', cancelLabel = 'cancel' }) {
return new Promise(res => {
resolve = res;
titleEl.textContent = title;
msgEl.textContent = message;
msgEl.classList.toggle('hidden', !message);
inputEl.classList.toggle('hidden', input === false);
inputEl.value = '';
inputEl.placeholder = placeholder;
inputEl.type = input === 'password' ? 'password' : 'text';
okBtn.textContent = okLabel;
okBtn.classList.toggle('border-t-danger', danger);
okBtn.classList.toggle('text-t-danger', danger);
okBtn.classList.toggle('border-t-accent', !danger);
okBtn.classList.toggle('text-t-accent', !danger);
cancelBtn.textContent = cancelLabel;
cancelBtn.classList.toggle('hidden', !cancelLabel);
if (closeBtn) closeBtn.classList.toggle('hidden', !cancelLabel);
overlay.classList.add('open');
if (input) inputEl.focus(); else okBtn.focus();
});
}
export function isDialogOpen() { return overlay.classList.contains('open'); }
okBtn.addEventListener('click', submit);
cancelBtn.addEventListener('click', () => { if (canCancel()) close(null); });
if (closeBtn) closeBtn.addEventListener('click', () => { if (canCancel()) close(null); });
overlay.addEventListener('click', e => { if (e.target === overlay && canCancel()) close(null); });
overlay.addEventListener('keydown', e => {
if (e.key === 'Escape' && canCancel()) close(null);
if (e.key === 'Enter') submit();
});