feat(b06): 노면공 고름 = 범위 카드 전부 테두리 · 카드 하나 안 고름 · 첫 카드로 스크롤만 (177-4)

- applySpan 노면공도 --span · revealStation(리스너 없이 옛 카드 풂 · 폼 유지)
- focusChainage revealOnly · 세션 고름은 패널이 직접
- test_165 · test_106 기대값 고침 · 새 시험 test_177_4_pavement_span_box

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015sDZSjFvoiDjdGpgj3muc3
This commit is contained in:
2026-10-10 11:51:15 +09:00
co-authored by Claude Opus 5.5
parent 2d4c65dc78
commit 1a96188ce0
8 changed files with 133 additions and 24 deletions
+11 -2
View File
@@ -235,7 +235,7 @@ export function createSectionView(
/**
* 고른 구간형 구조물(옹벽 · 독립 흙막이 · 사토장)의 시작~종료 안 횡단 카드 전부에 테두리 강조(106-1).
* 노면공(G군)은 테두리 대신 범위 카드 안 그 노면공의 포장층만 강조(152-5) — 겹친 노면공은 범위 표식으로 하나만.
* 노면공(G군)도 테두리 + 범위 카드 안 그 노면공의 포장층 강조(152-5 · 177-4) — 겹친 노면공은 범위 표식으로 하나만.
* 가장 가까운 한 장의 `--selected` 는 그대로 — 클래스만 갈아 끼워 줌·팬을 지킨다.
*/
let spanMarks: ReadonlyArray<StructureInstance> = [];
@@ -257,7 +257,7 @@ export function createSectionView(
: undefined;
const span = inSpan(section, mark);
const pave = span && isPavement(spanMarkId);
card.classList.toggle("b06-cross-card--span", span && !pave);
card.classList.toggle("b06-cross-card--span", span);
highlightPavement(card, pave ? mark : undefined);
};
const syncSpanHighlights = (): void => {
@@ -576,6 +576,15 @@ export function createSectionView(
);
}
},
revealStation(stationId) {
// 노면공 고름 = 카드 하나 안 고름 · 옛 카드는 리스너 없이 풂(폼 유지) · 그 카드로 스크롤만(177-4)
const previous = selectedStationId;
selectedStationId = null;
activeAreaKey = null;
markCard(previous);
profile.showCard(null);
revealCard(stationId, "smooth");
},
selectMark: (structureId, span = true) => {
// span 끔 = 알약만 · 카드는 고른 측점 하나(137-4 — 측점 고름 리스너) · 노면공 포장층은 테두리가 아니라 늘 켬(165-2)
spanMarkId = span || isPavement(structureId) ? structureId : null;