feat(B06): 추가 기슭막이 칸을 그 단이 딸린 쪽 아래로 붙인다

다단은 유출 채널(extra)과 유입·계류측 채널(bextra)로 갈린다. 칸이 늘 유출구
아래 고정이라 어느 쪽 단인지 자리로 읽히지 않았다. 고른 단의 채널을 창이
알려 주고, 칸을 그 쪽(배관 유입구·유출구 / 독립 좌·우) 바로 아래로 옮겨 세운다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-29 19:18:08 +09:00
co-authored by Claude Opus 5
parent 2ee71eff19
commit f0af311d4b
2 changed files with 17 additions and 8 deletions
+15 -8
View File
@@ -52,6 +52,14 @@ function slotUsable(target: HTMLElement | undefined): target is HTMLElement {
return !!group && !group.hidden;
}
/** 배관이면 유입구·유출구 칸, 독립 기슭막이면 좌·우 칸 — 지금 서 있는 쪽을 준다. */
function slotOf(side: "inlet" | "outlet"): HTMLElement {
const slots = sideSlots!;
return slotUsable(slots[side])
? slots[side]
: slots[side === "inlet" ? "revetInlet" : "revetOutlet"];
}
/** 옮겨 온 행과 그 **제자리 표식** — 되돌릴 때 원래 순서로 꽂기 위해 짝으로 둔다.
* 표식 없이 지우면 행 DOM이 사라져, 같은 창에서 다른 벽을 고를 때 그 행이 다시는
* 나오지 않는다(2026-08-29 사용자 보고: 단 수·옵션이 사라짐). */
@@ -97,17 +105,16 @@ function relocateSideRows(panelRoot: HTMLElement): void {
clearSideSlots();
const side = panelRoot.dataset.side;
if (!sideSlots || (side !== "inlet" && side !== "outlet" && side !== "extra")) return;
// 배관이면 유입구·유출구 칸, 독립 기슭막이면 좌·우 칸 — 지금 서 있는 쪽으로 간다.
const target =
side === "extra"
? sideSlots.extra
: slotUsable(sideSlots[side])
? sideSlots[side]
: sideSlots[side === "inlet" ? "revetInlet" : "revetOutlet"];
// 추가 기슭막이 칸은 평소 숨어 있다 — 고른 벽이 다단이면 여기서 세운다.
const target = side === "extra" ? sideSlots.extra : slotOf(side);
// 추가 기슭막이 칸은 평소 숨어 있다 — 고른 벽이 다단이면 **그 단이 딸린 칸 바로
// 아래**로 옮겨 세운다(2026-08-30 사용자: 좌/우 각각의 하단으로).
if (side === "extra") {
const group = target.closest<HTMLElement>("fieldset");
if (!group) return;
const owner = slotOf(panelRoot.dataset.extraSide === "inlet" ? "inlet" : "outlet").closest(
"fieldset",
);
if (owner && owner !== group) owner.after(group);
group.hidden = false;
} else if (!slotUsable(target)) return;
const rows = panelRoot.querySelectorAll<HTMLElement>(side === "extra" ? EXTRA_ROWS : SIDE_ROWS);