fix(B06): 기슭막이 클릭이 관에 먹히던 문제·강조 색 토큰화

화면 확인에서 나온 두 가지:
- 그리기 순서가 벽 → 관 → 보호공이라 관 폴리곤이 벽 가운데를 덮어, 벽을 눌러도
  관이 먼저 클릭을 먹었다. 그리기 순서는 그대로 두고 **투명 판정면**을 맨 마지막에
  얹어 벽 전체가 눌리게 했다.
- 선택 강조가 존재하지 않는 --color-accent를 참조하고 있었다. 면적 밴드와 같은
  규칙으로 --color-royal-amethyst를 쓰고, 규칙 위치도 기슭막이 기본 스타일 옆
  (_Style_Cross_Areas.css)으로 옮겼다.

검증(공용 브라우저, 13+15.7 카드): 벽 클릭 → 강조·화살표 노출, ◀ 2회 이동 반영,
↺ 자동 자리 정확 복귀. tsc 통과, pytest 148 pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-21 16:21:09 +09:00
co-authored by Claude Opus 5
parent 6a3c991b5a
commit 5eed5e801c
3 changed files with 39 additions and 19 deletions
+20 -7
View File
@@ -117,13 +117,7 @@ export function appendCulvertOverlay(
` · 근입 ${REVET_EMBED_DEPTH_M.toFixed(2)}m(실무 기초콘크리트 H=0.5 — 법정 규정 없음)` +
(wall.lengthM ? ` · 연장 ${wall.lengthM.toFixed(1)}m` : ""),
);
if (onSelectRevet) {
revetShape.classList.add("is-selectable");
revetShape.addEventListener("click", (event) => {
event.stopPropagation();
onSelectRevet(wall.role);
});
}
if (onSelectRevet) revetShape.classList.add("is-selectable");
revetShapes.set(wall.role, revetShape);
layer.append(revetShape);
// 평행사변형 띠와 사다리꼴 사이 대각 이음선(내부 경계 — 사용자 스케치의 가운데 선):
@@ -285,6 +279,25 @@ export function appendCulvertOverlay(
}
drawPitching();
// 클릭 판정용 투명 겹면 — **맨 마지막에** 얹는다. 관·보호공이 벽 위를 지나가 그리기
// 순서상 벽 가운데를 덮으므로, 벽 폴리곤에 직접 핸들러를 달면 가운데를 눌러도 관이
// 먼저 먹는다(2026-08-21 화면 확인). 그리기 순서(벽 → 관 → 보호공)는 그대로 두고
// 판정면만 위로 올린다. 관 자체의 툴팁은 벽 밖 구간에서 그대로 뜬다.
if (onSelectRevet) {
for (const wall of wallsInOrder) {
const hit = polygon(
wall.points.map((p) => [x(p.offset), toDisplayY(p.elevation)] as [number, number]),
"b06-chart__culvert-revet-hit",
`${roleLabel(wall.role)} 기슭막이 선택 — 카드 하단 ◀/▶로 자리 조절`,
);
hit.addEventListener("click", (event) => {
event.stopPropagation();
onSelectRevet(wall.role);
});
layer.append(hit);
}
}
// 강조는 클래스만 갈아 끼운다 — 카드를 다시 그리면 휠 줌·팬이 초기화된다.
return (key) => {
for (const [role, shape] of revetShapes) shape.classList.toggle("is-active", role === key);
@@ -597,15 +597,3 @@
color: var(--color-text);
background: var(--color-surface);
}
/* 기슭막이 선택 — 구조물 선택이 절·성토 면적 강조보다 우선한다(2026-08-21 사용자 ①).
색은 토큰만 쓰고 하드코딩하지 않는다. */
.b06-chart__culvert-revet.is-selectable {
cursor: pointer;
}
.b06-chart__culvert-revet.is-active {
stroke: var(--color-accent, currentColor);
stroke-width: 2;
filter: brightness(1.15);
}
@@ -186,6 +186,25 @@
stroke-linejoin: round;
}
/* 기슭막이 선택(2026-08-21) — 구조물 선택이 절·성토 면적 강조보다 우선한다.
강조 색은 면적 밴드와 같은 규칙으로 토큰만 쓴다. */
.b06-chart__culvert-revet.is-selectable {
cursor: pointer;
}
.b06-chart__culvert-revet.is-active {
fill: color-mix(in srgb, var(--color-royal-amethyst) 45%, transparent);
stroke: var(--color-royal-amethyst);
stroke-width: 2.2;
}
/* 클릭 판정용 투명 겹면 — 관·보호공보다 위에 얹혀 벽 가운데도 눌린다. */
.b06-chart__culvert-revet-hit {
fill: transparent;
stroke: none;
cursor: pointer;
}
.b06-chart__culvert-apron {
fill: color-mix(in srgb, var(--color-text-secondary) 22%, transparent);
stroke: var(--color-text-secondary);