fix(B06): 조정창 값 조절 때 스크롤이 맨 위로 튀던 것을 고친다
값 버튼을 누르면 refreshCard가 카드 DOM을 통째로 갈아끼우므로 조정창도 새로 만들어진다. 새 창의 show()가 기억해 둔 scrollTop을 되살리려 하지만 그 시점에는 카드가 아직 문서에 붙기 전이라 레이아웃이 없어 대입이 무시됐고, 붙은 뒤에는 0(제목 줄)으로 남았다. restoreScroll()을 두어 대입이 먹지 않았으면 다음 프레임(카드가 붙은 뒤)에 한 번 더 넣는다. 그때 창이 닫혔거나 떨어져 나갔으면 건드리지 않는다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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();
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user