mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	Fix mermaid diagram height when initially hidden (#32457)
In a hidden iframe, `document.body.clientHeight` is not reliable. Use `IntersectionObserver` to detect the visibility change and update the height there. Fixes: https://github.com/go-gitea/gitea/issues/32392 <img width="885" alt="image" src="https://github.com/user-attachments/assets/a95ef6aa-27e7-443f-9d06-400ef27919ae">
This commit is contained in:
		| @@ -57,10 +57,21 @@ export async function renderMermaid() { | ||||
|       btn.setAttribute('data-clipboard-text', source); | ||||
|       mermaidBlock.append(btn); | ||||
|  | ||||
|       const updateIframeHeight = () => { | ||||
|         iframe.style.height = `${iframe.contentWindow.document.body.clientHeight}px`; | ||||
|       }; | ||||
|  | ||||
|       // update height when element's visibility state changes, for example when the diagram is inside | ||||
|       // a <details> + <summary> block and the <details> block becomes visible upon user interaction, it | ||||
|       // would initially set a incorrect height and the correct height is set during this callback. | ||||
|       (new IntersectionObserver(() => { | ||||
|         updateIframeHeight(); | ||||
|       }, {root: document.documentElement})).observe(iframe); | ||||
|  | ||||
|       iframe.addEventListener('load', () => { | ||||
|         pre.replaceWith(mermaidBlock); | ||||
|         mermaidBlock.classList.remove('tw-hidden'); | ||||
|         iframe.style.height = `${iframe.contentWindow.document.body.clientHeight}px`; | ||||
|         updateIframeHeight(); | ||||
|         setTimeout(() => { // avoid flash of iframe background | ||||
|           mermaidBlock.classList.remove('is-loading'); | ||||
|           iframe.classList.remove('tw-invisible'); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 silverwind
					silverwind