This commit is contained in:
33333-33333 2026-07-29 20:52:11 +09:00
commit 091afc2b5c
77 changed files with 4405 additions and 8223 deletions

View file

@ -16,10 +16,34 @@
dialog.id = id;
dialog.className = className;
dialog.innerHTML = html;
const panel = dialog.querySelector('[role="dialog"], [role="alertdialog"]');
dialog.setAttribute("role", panel?.getAttribute("role") || "dialog");
dialog.setAttribute("aria-modal", panel?.getAttribute("aria-modal") || "true");
const labelledBy = panel?.getAttribute("aria-labelledby");
const describedBy = panel?.getAttribute("aria-describedby");
if (labelledBy) dialog.setAttribute("aria-labelledby", labelledBy);
if (describedBy) dialog.setAttribute("aria-describedby", describedBy);
panel?.removeAttribute("role");
panel?.removeAttribute("aria-modal");
panel?.removeAttribute("aria-labelledby");
panel?.removeAttribute("aria-describedby");
dialog.setAttribute("aria-hidden", dialog.classList.contains("hidden") ? "true" : "false");
document.body.appendChild(dialog);
return dialog;
}
function showEditorDialog(dialog, opener = document.activeElement) {
if (!dialog) return;
if (global.TarinaiManagedDialogs?.open) global.TarinaiManagedDialogs.open(dialog, opener);
else { dialog.classList.remove("hidden"); dialog.setAttribute("aria-hidden", "false"); }
}
function hideEditorDialog(dialog) {
if (!dialog) return;
if (global.TarinaiManagedDialogs?.close) global.TarinaiManagedDialogs.close(dialog);
else { dialog.classList.add("hidden"); dialog.setAttribute("aria-hidden", "true"); }
}
function bindEditorClose(dialog, close, selectors = []) {
if (!dialog || typeof close !== "function") return;
for (const selector of selectors) {
@ -27,6 +51,9 @@
if (button) button.onclick = close;
}
dialog.onclick = (event) => { if (event.target === dialog) close(); };
if (dialog._tarinaiCloseRequestHandler) dialog.removeEventListener("tarinai:dialog-close-request", dialog._tarinaiCloseRequestHandler);
dialog._tarinaiCloseRequestHandler = close;
dialog.addEventListener("tarinai:dialog-close-request", close);
}
function ensureSignboardEditor() {
@ -91,7 +118,7 @@
const clear = dialog.querySelector("#signboardEditorClear");
const closeBtn = dialog.querySelector("#signboardEditorClose");
const close = () => {
dialog.classList.add("hidden");
hideEditorDialog(dialog);
};
const syncCount = () => {
if (!area || !count) return;
@ -148,7 +175,7 @@
if (apply) apply.onclick = () => commit(area?.value || "");
if (clear) clear.onclick = () => commit("");
bindEditorClose(dialog, close, ["#signboardEditorCancel", "#signboardEditorClose"]);
dialog.classList.remove("hidden");
showEditorDialog(dialog);
syncCount();
return true;
}
@ -200,7 +227,7 @@
for (const input of inputs) input.checked = Boolean((Number(mask) | 0) & (bits[input.dataset.robotTarget] || 0));
};
const close = () => {
dialog.classList.add("hidden");
hideEditorDialog(dialog);
};
const commit = (mask) => {
api?.setRobotCleanerMask?.(robot, mask);
@ -220,7 +247,7 @@
bindEditorClose(dialog, close, ["#robotCleanerEditorClose", "#robotCleanerCancel"]);
if (def) def.onclick = () => { writeMask(defaultMask); if (highSpeed) highSpeed.checked = false; };
if (apply) apply.onclick = () => commit(readMask());
dialog.classList.remove("hidden");
showEditorDialog(dialog);
return true;
}
@ -291,7 +318,7 @@
syncEditorInputPair(center, centerNum);
syncEditorInputPair(swingRange, swingRangeNum);
syncEditorInputPair(swingSpeed, swingSpeedNum);
const close = () => dialog.classList.add("hidden");
const close = () => hideEditorDialog(dialog);
const commit = (forceStop = false) => {
global.TarinaiHistory.capture(worldRef, "fan-swing-edit");
const cDeg = Math.max(0, Math.min(355, Number(centerNum?.value || center?.value || 0) || 0));
@ -314,7 +341,7 @@
if (stop) stop.onclick = () => commit(true);
if (apply) apply.onclick = () => commit(false);
bindEditorClose(dialog, close, ["#fanEditorCancel", "#fanEditorClose"]);
dialog.classList.remove("hidden");
showEditorDialog(dialog);
return true;
}
@ -419,7 +446,7 @@
editor.syncInputPair(speed, speedNum, controller.draw);
editor.syncInputPair(thick, thickNum, controller.draw);
const close = () => {
dialog.classList.add("hidden");
hideEditorDialog(dialog);
controller.close();
};
if (apply) apply.onclick = () => {
@ -447,7 +474,7 @@
};
bindEditorClose(dialog, close, ["#rotatorCancel", "#rotatorEditorClose"]);
controller.draw();
dialog.classList.remove("hidden");
showEditorDialog(dialog);
return true;
}
@ -557,7 +584,7 @@
editor.syncInputPair(travel, travelNum, controller.draw);
editor.syncInputPair(thick, thickNum, controller.draw);
const close = () => {
dialog.classList.add("hidden");
hideEditorDialog(dialog);
controller.close();
};
if (apply) apply.onclick = () => {
@ -590,7 +617,7 @@
};
bindEditorClose(dialog, close, ["#reciprocatorCancel", "#reciprocatorEditorClose"]);
controller.draw();
dialog.classList.remove("hidden");
showEditorDialog(dialog);
return true;
}
@ -1002,7 +1029,7 @@
bindNearestThumbTeleport(timeRange, timeStart, timeEnd, value => normalizeMinute(value, 0), updateTimeRange);
target.onchange = () => updateMode(true);
updateMode(false);
const close = () => { dialog.classList.add("hidden"); if (worldRef._pressureSwitchOverlay?.item === item) worldRef._pressureSwitchOverlay = null; global.render?.(); };
const close = () => { hideEditorDialog(dialog); if (worldRef._pressureSwitchOverlay?.item === item) worldRef._pressureSwitchOverlay = null; global.render?.(); };
dialog.querySelector("#signalItemEditorApply").onclick = () => {
global.TarinaiHistory.capture(worldRef, "detector-edit");
item.pressureTarget = DETECTOR_TARGETS[target.value] ? target.value : "tarinai";
@ -1016,10 +1043,8 @@
item.pressureTimeEnd = normalizeMinute(timeEnd.value, 1080);
worldRef.drawListDirty = true; worldRef.markSpatialDirty?.("detector-edit"); global.render?.(); close();
};
dialog.querySelector("#signalItemEditorCancel").onclick = close;
dialog.querySelector("#signalItemEditorClose").onclick = close;
dialog.onclick = e => { if (e.target === dialog) close(); };
dialog.classList.remove("hidden");
bindEditorClose(dialog, close, ["#signalItemEditorCancel", "#signalItemEditorClose"]);
showEditorDialog(dialog);
return true;
}