mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-04 13:28:25 +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