fix(B06): 조정창 값 조절 때 스크롤이 맨 위로 튀던 것을 고친다

값 버튼을 누르면 refreshCard가 카드 DOM을 통째로 갈아끼우므로 조정창도 새로
만들어진다. 새 창의 show()가 기억해 둔 scrollTop을 되살리려 하지만 그 시점에는
카드가 아직 문서에 붙기 전이라 레이아웃이 없어 대입이 무시됐고, 붙은 뒤에는
0(제목 줄)으로 남았다.

restoreScroll()을 두어 대입이 먹지 않았으면 다음 프레임(카드가 붙은 뒤)에 한 번
더 넣는다. 그때 창이 닫혔거나 떨어져 나갔으면 건드리지 않는다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-29 08:08:53 +09:00
co-authored by Claude Opus 5
parent e959879500
commit 23285dc016
@@ -108,6 +108,21 @@ export function buildStructurePanel(deps: StructurePanelDeps): StructurePanelHan
root.addEventListener("scroll", () => {
if (!root.classList.contains("is-hidden")) panelScrollTops.set(deps.scrollKey, root.scrollTop);
});
/**
* 기억해 둔 스크롤 자리를 되살린다. 카드를 다시 그릴 때 창은 **카드가 문서에
* 붙기 전에** 만들어지므로 그 순간의 대입은 레이아웃이 없어 먹지 않는다
* (2026-08-29 사용자: 값 조절만 해도 창이 제목 줄로 튀던 원인). 대입이 먹지
* 않았으면 붙은 다음 프레임에 한 번 더 넣는다.
*/
const restoreScroll = (): void => {
const saved = panelScrollTops.get(deps.scrollKey);
if (!saved) return;
root.scrollTop = saved;
if (root.scrollTop === saved) return;
requestAnimationFrame(() => {
if (root.isConnected && !root.classList.contains("is-hidden")) root.scrollTop = saved;
});
};
// 창 안에서의 클릭이 카드 선택으로 번지지 않게 한 번에 막는다.
root.addEventListener("click", (event) => event.stopPropagation());
@@ -568,8 +583,7 @@ export function buildStructurePanel(deps: StructurePanelDeps): StructurePanelHan
: "0m");
// 행 표시가 다 끝난 뒤에 되살린다 — 숨김 토글로 창 높이가 바뀌기 전에 넣으면
// 브라우저가 잘라 버린다.
const saved = panelScrollTops.get(deps.scrollKey);
if (saved) root.scrollTop = saved;
restoreScroll();
},
};
}