(() => { "use strict"; if (window.__dcxSettingsInstalled) return; window.__dcxSettingsInstalled = true; const REDUCED_MOTION = window.matchMedia("(prefers-reduced-motion: reduce)"); const COMMANDS = [ { label: "Open", description: "Pick up where you left off.", command: "/impeccable design-context open", }, { label: "Edit", description: "Make a few changes to this design context.", command: "/impeccable design-context edit", }, { label: "Export", description: "Save a copy to share or keep elsewhere.", command: "/impeccable design-context export", }, { label: "Import", description: "Bring a saved design context into this project.", command: "/impeccable design-context import", }, ]; const settingsIcon = ` `; const closeIcon = ` `; const installTopbarActions = (root) => { const topbar = root?.querySelector?.(".dcx-topbar"); const templateClose = topbar?.querySelector(".dcx-close"); if (!topbar || !templateClose || topbar.querySelector("[data-dcx-settings-open]")) return; const actions = document.createElement("div"); actions.className = "dcx-topbar-actions"; const trigger = document.createElement("button"); trigger.className = "dcx-settings-trigger"; trigger.type = "button"; trigger.dataset.dcxSettingsOpen = ""; trigger.setAttribute("aria-label", "Design context settings"); trigger.setAttribute("aria-haspopup", "dialog"); trigger.setAttribute("aria-controls", "dcx-context-settings"); trigger.setAttribute("aria-expanded", "false"); trigger.innerHTML = settingsIcon; const request = topbar.querySelector(".dcx-request"); (request || templateClose).before(actions); if (request) actions.append(request); actions.append(trigger, templateClose); }; const shellTemplate = document.querySelector("#dcx-shell-template"); installTopbarActions(shellTemplate?.content); document.querySelectorAll(".dcx-expander").forEach(installTopbarActions); let modal = document.querySelector("#dcx-context-settings"); if (!modal) { modal = document.createElement("dialog"); modal.id = "dcx-context-settings"; modal.className = "picker-modal dcx-settings-modal"; modal.setAttribute("aria-labelledby", "dcx-context-settings-title"); modal.setAttribute("aria-describedby", "dcx-context-settings-lede"); modal.innerHTML = `

Design context commands

Choose what you’d like to do with this design context.

${COMMANDS.map(({ label, description, command }) => `

${label}

${description}

${command}
`).join("")}

`; document.body.appendChild(modal); } let invoker = null; let closeTimer = 0; const resetCopyState = () => { modal.querySelectorAll("[data-dcx-copy-command]").forEach((button) => { window.clearTimeout(button._dcxCopyTimer); button.classList.remove("copied"); button.removeAttribute("data-copied"); }); const status = modal.querySelector(".dcx-command-status"); if (status) status.textContent = ""; }; const openSettings = (trigger) => { window.clearTimeout(closeTimer); resetCopyState(); invoker = trigger; trigger.setAttribute("aria-expanded", "true"); if (!modal.open) modal.showModal(); requestAnimationFrame(() => { modal.classList.add("is-visible"); modal.querySelector("[data-dcx-settings-close]")?.focus({ preventScroll: true }); }); }; const closeSettings = ({ restoreFocus = true, instant = false } = {}) => { if (!modal.open) return; window.clearTimeout(closeTimer); modal.classList.remove("is-visible"); const finish = () => { if (!modal.open) return; modal.close(); resetCopyState(); invoker?.setAttribute?.("aria-expanded", "false"); if (restoreFocus && invoker instanceof HTMLElement && invoker.isConnected) { invoker.focus({ preventScroll: true }); } invoker = null; }; if (instant || REDUCED_MOTION.matches) finish(); else closeTimer = window.setTimeout(finish, 200); }; window.closeDcxSettings = closeSettings; document.addEventListener("click", async (event) => { const openButton = event.target.closest?.("[data-dcx-settings-open]"); if (openButton) { event.preventDefault(); openSettings(openButton); return; } if (event.target.closest?.("[data-dcx-settings-close]")) { closeSettings(); return; } }); modal.addEventListener("click", (event) => { if (event.target !== modal) return; const rect = modal.getBoundingClientRect(); const outside = event.clientX < rect.left || event.clientX > rect.right || event.clientY < rect.top || event.clientY > rect.bottom; if (outside) closeSettings(); }); modal.addEventListener("cancel", (event) => { event.preventDefault(); closeSettings(); }); document.addEventListener("keydown", (event) => { if (!modal.open) return; if (event.key === "Escape") { event.preventDefault(); event.stopImmediatePropagation(); closeSettings(); return; } if (event.key !== "Tab") return; const focusable = [...modal.querySelectorAll("button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex='-1'])")] .filter((element) => element.getClientRects().length > 0 && !element.hidden); if (!focusable.length) { event.preventDefault(); modal.focus({ preventScroll: true }); return; } const first = focusable[0]; const last = focusable[focusable.length - 1]; const active = document.activeElement; if (event.shiftKey && (active === first || !modal.contains(active))) { event.preventDefault(); last.focus({ preventScroll: true }); } else if (!event.shiftKey && (active === last || !modal.contains(active))) { event.preventDefault(); first.focus({ preventScroll: true }); } }, true); document.addEventListener("dcx:document-mounted", (event) => { installTopbarActions(event.target); }); })();