fix(docs): Shadow DOM 목차 앵커 클릭 시 스크롤 이동
All checks were successful
CI / backend-test (push) Successful in 1m11s
CI / frontend-build (push) Successful in 47s
CI / backend-dep-scan (push) Successful in 5s

브라우저의 #프래그먼트 이동은 Shadow DOM 안의 id를 못 찾아 목차 순번
클릭이 안 먹혔다. 클릭을 가로채 그림자 안에서 대상을 찾아 scrollIntoView.
This commit is contained in:
AWESOMEDEV 2026-07-23 12:44:26 +09:00
parent cd61f06ba5
commit a209bb1d80

View File

@ -28,6 +28,28 @@ function DocShadow({ html }) {
if (!host) return; if (!host) return;
const shadow = host.shadowRoot || host.attachShadow({ mode: 'open' }); const shadow = host.shadowRoot || host.attachShadow({ mode: 'open' });
shadow.innerHTML = html; shadow.innerHTML = html;
// Shadow DOM (<a href="#id">) .
// # light DOM id , .
// , .
// ( .doc-immersive-scroll .)
const onClick = (e) => {
const a = e.composedPath().find(
(el) => el.tagName === 'A' && el.getAttribute?.('href')?.startsWith('#'),
);
if (!a) return;
const id = decodeURIComponent(a.getAttribute('href').slice(1));
if (!id) return;
const target =
shadow.querySelector(`#${CSS.escape(id)}`) ||
shadow.querySelector(`[name="${CSS.escape(id)}"]`);
if (target) {
e.preventDefault();
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
};
shadow.addEventListener('click', onClick);
return () => shadow.removeEventListener('click', onClick);
}, [html]); }, [html]);
return <div ref={hostRef} className="doc-shadow-host" />; return <div ref={hostRef} className="doc-shadow-host" />;
} }