From 23285dc016442d2060c4a54b0519fa55611a826c Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 29 Aug 2026 08:08:27 +0900 Subject: [PATCH] =?UTF-8?q?fix(B06):=20=EC=A1=B0=EC=A0=95=EC=B0=BD=20?= =?UTF-8?q?=EA=B0=92=20=EC=A1=B0=EC=A0=88=20=EB=95=8C=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=EC=9D=B4=20=EB=A7=A8=20=EC=9C=84=EB=A1=9C=20=ED=8A=80?= =?UTF-8?q?=EB=8D=98=20=EA=B2=83=EC=9D=84=20=EA=B3=A0=EC=B9=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 값 버튼을 누르면 refreshCard가 카드 DOM을 통째로 갈아끼우므로 조정창도 새로 만들어진다. 새 창의 show()가 기억해 둔 scrollTop을 되살리려 하지만 그 시점에는 카드가 아직 문서에 붙기 전이라 레이아웃이 없어 대입이 무시됐고, 붙은 뒤에는 0(제목 줄)으로 남았다. restoreScroll()을 두어 대입이 먹지 않았으면 다음 프레임(카드가 붙은 뒤)에 한 번 더 넣는다. 그때 창이 닫혔거나 떨어져 나갔으면 건드리지 않는다. Co-Authored-By: Claude Opus 5 (1M context) --- .../B06_Section_UI_Cross_Structure_Panel.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/B06_Section/B06_Section_UI_Cross_Structure_Panel.ts b/B06_Section/B06_Section_UI_Cross_Structure_Panel.ts index 02db256f..8e86f65d 100644 --- a/B06_Section/B06_Section_UI_Cross_Structure_Panel.ts +++ b/B06_Section/B06_Section_UI_Cross_Structure_Panel.ts @@ -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(); }, }; }