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 } } },