// The spawn modal (issue #27): bottom-sheet/dialog chrome around the shared // spawn form (spawnForm.ts). The modal coexists with the inline draft panes // (#57) until a later issue deletes it. import { createSpawnForm, type SpawnFormSeed } from "./spawnForm.js"; /** Seed values for the spawn form — used by "clone" to reopen the dialog with * the same cwd, command, and name as an existing session. */ export type SpawnPrefill = SpawnFormSeed; export function openSpawnModal(prefill?: SpawnPrefill): void { const existing = document.getElementById("modal-host"); if (existing) existing.remove(); const host = document.createElement("div"); host.id = "modal-host"; host.className = "modal-backdrop"; host.innerHTML = ` `; document.body.appendChild(host); const formHandle = createSpawnForm({ seed: prefill, class: "modal-body", onSuccess(session) { close(); location.hash = `#/attach/${encodeURIComponent(session.id)}`; }, }); (host.querySelector(".form-slot") as HTMLElement).replaceWith(formHandle.el); const close = () => { formHandle.destroy(); host.remove(); }; // The modal keeps its Cancel affordance; the shared form ships only Submit. const actions = formHandle.el.querySelector(".form-actions") as HTMLElement; const cancel = document.createElement("button"); cancel.type = "button"; cancel.className = "btn btn-ghost cancel"; cancel.textContent = "Cancel"; cancel.addEventListener("click", close); actions.prepend(cancel); host.querySelector(".close")?.addEventListener("click", close); host.addEventListener("click", (e) => { if (e.target === host) close(); }); window.addEventListener( "keydown", (e) => { if (e.key === "Escape") close(); }, { once: true }, ); // ---- clone seed ------------------------------------------------------ if (prefill) { (host.querySelector("#spawn-title") as HTMLElement).textContent = "Clone session"; } }