From ba53ea3306549a68f3b579e71dcd38dc07352512 Mon Sep 17 00:00:00 2001
From: David <33458145+davidmcpowell@users.noreply.github.com>
Date: Thu, 29 May 2025 09:37:46 +0100
Subject: [PATCH] Merge pull request #25999 from overleaf/dp-eq-preview-fix
Move rendering of equation preview math into codemirror extension to fix zoomed in issue
GitOrigin-RevId: 66bf9120191da236d88213d16b457c0a676f38ac
---
.../components/math-preview-tooltip.tsx | 95 ++++++++-----------
.../source-editor/extensions/math-preview.ts | 13 ++-
2 files changed, 50 insertions(+), 58 deletions(-)
diff --git a/services/web/frontend/js/features/source-editor/components/math-preview-tooltip.tsx b/services/web/frontend/js/features/source-editor/components/math-preview-tooltip.tsx
index 60d9c430e2..cfa88d292d 100644
--- a/services/web/frontend/js/features/source-editor/components/math-preview-tooltip.tsx
+++ b/services/web/frontend/js/features/source-editor/components/math-preview-tooltip.tsx
@@ -13,7 +13,7 @@ import OLModal, {
} from '@/features/ui/components/ol/ol-modal'
import MaterialIcon from '@/shared/components/material-icon'
import useEventListener from '@/shared/hooks/use-event-listener'
-import { FC, useCallback, useLayoutEffect, useRef, useState } from 'react'
+import { FC, useCallback, useState } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import {
useCodeMirrorStateContext,
@@ -35,9 +35,9 @@ const MathPreviewTooltipContainer: FC = () => {
return null
}
- const { tooltip, mathContent } = mathPreviewState
+ const { tooltip } = mathPreviewState
- if (!tooltip || !mathContent) {
+ if (!tooltip) {
return null
}
@@ -47,15 +47,16 @@ const MathPreviewTooltipContainer: FC = () => {
return null
}
- return ReactDOM.createPortal(
- ,
- tooltipView.dom
- )
+ const inner = tooltipView.dom.querySelector('#ol-cm-math-tooltip')
+
+ if (!inner) {
+ return null
+ }
+
+ return ReactDOM.createPortal(, inner)
}
-const MathPreviewTooltip: FC<{ mathContent: HTMLDivElement }> = ({
- mathContent,
-}) => {
+const MathPreviewTooltipMenu: FC = () => {
const { t } = useTranslation()
const newEditor = useIsNewEditorEnabled()
@@ -69,8 +70,6 @@ const MathPreviewTooltip: FC<{ mathContent: HTMLDivElement }> = ({
window.dispatchEvent(new Event('editor:hideMathTooltip'))
}, [])
- const mathRef = useRef(null)
-
const keyDownListener = useCallback(
(event: KeyboardEvent) => {
if (event.key === 'Escape') {
@@ -82,50 +81,40 @@ const MathPreviewTooltip: FC<{ mathContent: HTMLDivElement }> = ({
useEventListener('keydown', keyDownListener)
- useLayoutEffect(() => {
- if (mathRef.current) {
- mathRef.current.replaceChildren(mathContent)
- }
- }, [mathContent])
-
return (
<>
-
-
-
-
-
+
+
+
+
+
+ Esc
+
+ }
>
-
-
-
-
- Esc
-
- }
- >
- {t('hide')}
-
-
- {t('disable')}
-
-
-
-
+ {t('hide')}
+
+
+ {t('disable')}
+
+
+
{showDisableModal && (
diff --git a/services/web/frontend/js/features/source-editor/extensions/math-preview.ts b/services/web/frontend/js/features/source-editor/extensions/math-preview.ts
index d946769fb3..3df55b2f28 100644
--- a/services/web/frontend/js/features/source-editor/extensions/math-preview.ts
+++ b/services/web/frontend/js/features/source-editor/extensions/math-preview.ts
@@ -44,7 +44,6 @@ export const setMathPreview = (enabled: boolean): TransactionSpec => ({
export const mathPreviewStateField = StateField.define<{
tooltip: Tooltip | null
- mathContent: HTMLDivElement | null
hide: boolean
}>({
create: buildInitialState,
@@ -52,7 +51,7 @@ export const mathPreviewStateField = StateField.define<{
update(state, tr) {
for (const effect of tr.effects) {
if (effect.is(hideTooltipEffect)) {
- return { tooltip: null, hide: true, mathContent: null }
+ return { tooltip: null, hide: true }
}
}
@@ -61,19 +60,18 @@ export const mathPreviewStateField = StateField.define<{
if (mathContainer) {
if (state.hide) {
- return { tooltip: null, hide: true, mathContent: null }
+ return { tooltip: null, hide: true }
} else {
const mathContent = buildTooltipContent(tr.state, mathContainer)
return {
tooltip: buildTooltip(mathContainer, mathContent),
- mathContent,
hide: false,
}
}
}
- return { tooltip: null, hide: false, mathContent: null }
+ return { tooltip: null, hide: false }
}
return state
@@ -159,6 +157,11 @@ function buildTooltip(
create() {
const dom = document.createElement('div')
dom.classList.add('ol-cm-math-tooltip-container')
+ const innerElt = document.createElement('div')
+ innerElt.classList.add('ol-cm-math-tooltip')
+ innerElt.id = 'ol-cm-math-tooltip'
+ innerElt.appendChild(mathContent)
+ dom.appendChild(innerElt)
return { dom, overlap: true, offset: { x: 0, y: 8 } }
},