@pie-lib/editable-html-tip-tap 2.1.1 → 2.1.2-next.102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/lib/components/CharacterPicker.js +51 -20
  2. package/lib/components/CharacterPicker.js.map +1 -1
  3. package/lib/components/EditableHtml.js +37 -24
  4. package/lib/components/EditableHtml.js.map +1 -1
  5. package/lib/components/MenuBar.js +15 -6
  6. package/lib/components/MenuBar.js.map +1 -1
  7. package/lib/components/TiptapContainer.js +9 -1
  8. package/lib/components/TiptapContainer.js.map +1 -1
  9. package/lib/components/common/toolbar-buttons.js +5 -0
  10. package/lib/components/common/toolbar-buttons.js.map +1 -1
  11. package/lib/components/respArea/ExplicitConstructedResponse.js +2 -1
  12. package/lib/components/respArea/ExplicitConstructedResponse.js.map +1 -1
  13. package/lib/components/respArea/InlineDropdown.js +74 -16
  14. package/lib/components/respArea/InlineDropdown.js.map +1 -1
  15. package/lib/components/respArea/inlineDropdownUtils.js +67 -0
  16. package/lib/components/respArea/inlineDropdownUtils.js.map +1 -0
  17. package/lib/extensions/css.js +17 -7
  18. package/lib/extensions/css.js.map +1 -1
  19. package/lib/extensions/image-component.js +9 -6
  20. package/lib/extensions/image-component.js.map +1 -1
  21. package/lib/extensions/math.js +179 -71
  22. package/lib/extensions/math.js.map +1 -1
  23. package/lib/extensions/responseArea.js +7 -1
  24. package/lib/extensions/responseArea.js.map +1 -1
  25. package/lib/index.js +7 -0
  26. package/lib/index.js.map +1 -1
  27. package/lib/utils/toolbar.js +19 -0
  28. package/lib/utils/toolbar.js.map +1 -0
  29. package/package.json +18 -18
  30. package/src/__tests__/EditableHtml.test.jsx +116 -2
  31. package/src/components/CharacterPicker.jsx +56 -19
  32. package/src/components/EditableHtml.jsx +43 -23
  33. package/src/components/MenuBar.jsx +15 -3
  34. package/src/components/TiptapContainer.jsx +18 -2
  35. package/src/components/__tests__/CharacterPicker.test.jsx +57 -6
  36. package/src/components/__tests__/ExplicitConstructedResponse.test.jsx +6 -1
  37. package/src/components/__tests__/InlineDropdown.test.jsx +185 -8
  38. package/src/components/__tests__/MenuBar.test.jsx +1 -0
  39. package/src/components/common/toolbar-buttons.jsx +5 -0
  40. package/src/components/respArea/ExplicitConstructedResponse.jsx +2 -1
  41. package/src/components/respArea/InlineDropdown.jsx +97 -24
  42. package/src/components/respArea/inlineDropdownUtils.js +79 -0
  43. package/src/extensions/__tests__/image-component.test.jsx +1 -0
  44. package/src/extensions/__tests__/math.test.js +481 -42
  45. package/src/extensions/__tests__/responseArea.test.js +57 -3
  46. package/src/extensions/css.js +16 -3
  47. package/src/extensions/image-component.jsx +8 -6
  48. package/src/extensions/math.js +188 -69
  49. package/src/extensions/responseArea.js +7 -1
  50. package/src/index.jsx +2 -2
  51. package/src/utils/__tests__/toolbar.test.js +43 -0
  52. package/src/utils/toolbar.js +15 -0
@@ -1 +1 @@
1
- {"version":3,"file":"image-component.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_isEqual","_debug","_LinearProgress","_styles","_react2","_reactDom","_InsertImageHandler","_ImageToolbar","_customToolbarWrapper","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","log","debug","StyledProgress","styled","LinearProgress","shouldForwardProp","prop","_ref","hideProgress","position","left","width","top","transition","opacity","StyledRoot","includes","_ref2","loading","pendingDelete","display","StyledImageContainer","_ref3","theme","alignItems","StyledImage","_ref4","active","border","concat","palette","primary","main","StyledResize","_ref5","backgroundColor","cursor","height","borderRadius","marginLeft","marginRight","sizePx","s","ImageComponent","props","_options$imageHandlin6","node","editor","attributes","onFocus","getPos","selected","options","_props$maxImageWidth","maxImageWidth","_props$maxImageHeight","maxImageHeight","alt","attrs","pos","selFrom","state","selection","from","selTo","to","onlyThisNodeSelected","useMemo","nodeSize","_useState","useState","_useState2","_slicedToArray2","showToolbar","setShowToolbar","latestNodeRef","useRef","imgRef","resizeRef","toolbarRef","getPercentFromWidth","useCallback","floored","current","naturalWidth","parseInt","toFixed","findNodePos","key","nodeKey","found","doc","descendants","type","name","updateThisNode","newAttrs","nodePos","currentNode","nodeAt","view","dispatch","tr","setNodeMarkup","undefined","applySizeData","resizePercent","useEffect","_node$attrs$src","_node$attrs","_options$imageHandlin","hasImageSrc","String","src","trim","imageHandling","insertImageRequested","finish","InsertImageHandler","resizeHandle","addEventListener","initResize","removeEventListener","loadImage","box","style","w","Math","min","h","naturalHeight","update","isEqual","updateAspect","initial","next","keepAspect","resizeType","ratio","startResize","bounds","target","getBoundingClientRect","clientX","clientY","onChange","newValues","stopResize","window","objectFit","flexAlign","center","right","alignment","createElement","NodeViewWrapper","loaded","deleteStatus","justifyContent","mode","value","percent","onDragStart","preventDefault","_extends2","draggable","ref","onLoad","className","_tiptapContainerEl","ReactDOM","createPortal","zIndex","background","boxShadow","showDone","deletable","toolbarOpts","onDelete","_options$imageHandlin2","_options$imageHandlin3","commands","focus","onDone","_options$imageHandlin4","_options$imageHandlin5","disableImageAlignmentButtons","imageLoaded","propTypes","PropTypes","object","isRequired","func","number","_default","exports"],"sources":["../../src/extensions/image-component.jsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport isEqual from 'lodash-es/isEqual';\nimport debug from 'debug';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport { styled } from '@mui/material/styles';\nimport { NodeViewWrapper } from '@tiptap/react';\nimport ReactDOM from 'react-dom';\nimport InsertImageHandler from '../components/image/InsertImageHandler';\nimport ImageToolbar from '../components/image/ImageToolbar';\nimport CustomToolbarWrapper from './custom-toolbar-wrapper';\n\nconst log = debug('@pie-lib:editable-html:plugins:image:component');\n\nconst StyledProgress = styled(LinearProgress, {\n shouldForwardProp: (prop) => prop !== 'hideProgress',\n})(({ hideProgress }) => ({\n position: 'absolute',\n left: '0',\n width: 'fit-content',\n top: '0%',\n transition: 'opacity 200ms linear',\n ...(hideProgress && {\n opacity: 0,\n }),\n}));\n\nconst StyledRoot = styled('div', {\n shouldForwardProp: (prop) => !['active', 'loading', 'pendingDelete'].includes(prop),\n})(({ loading, pendingDelete }) => ({\n position: 'relative',\n display: 'flex',\n transition: 'opacity 200ms linear',\n ...(loading && {\n opacity: 0.3,\n }),\n ...(pendingDelete && {\n opacity: 0.3,\n }),\n}));\n\nconst StyledImageContainer = styled('div')(({ theme }) => ({\n position: 'relative',\n width: 'fit-content',\n display: 'flex',\n alignItems: 'center',\n '&&:hover > .resize': {\n display: 'block',\n },\n}));\n\nconst StyledImage = styled('img', {\n shouldForwardProp: (prop) => prop !== 'active',\n})(({ theme, active }) => ({\n border: active ? `solid 1px ${theme.palette.primary.main}` : 'solid 1px transparent',\n}));\n\nconst StyledResize = styled('div')(({ theme }) => ({\n backgroundColor: theme.palette.primary.main,\n cursor: 'col-resize',\n height: '35px',\n width: '5px',\n borderRadius: 8,\n marginLeft: '5px',\n marginRight: '10px',\n display: 'none',\n}));\n\nconst sizePx = (s) => (s ? `${s}px` : 'calc(20px)');\n\nfunction ImageComponent(props) {\n const {\n node,\n editor,\n attributes,\n onFocus,\n getPos,\n selected,\n options,\n maxImageWidth = 700,\n maxImageHeight = 900,\n } = props;\n const { alt } = node.attrs;\n const pos = getPos();\n\n const selFrom = editor.state.selection.from;\n const selTo = editor.state.selection.to;\n const onlyThisNodeSelected = useMemo(() => selFrom + node.nodeSize === selTo, [selFrom, selTo, node.nodeSize]);\n\n const [showToolbar, setShowToolbar] = useState(false);\n\n const latestNodeRef = useRef(node);\n const imgRef = useRef(null);\n const resizeRef = useRef(null);\n const toolbarRef = useRef(null);\n\n const getPercentFromWidth = useCallback((width) => {\n const floored = (width / imgRef.current.naturalWidth) * 4;\n return parseInt(floored.toFixed(0) * 25, 10);\n }, []);\n\n const findNodePos = useCallback(() => {\n const key = latestNodeRef.current.attrs.nodeKey;\n let found = null;\n editor.state.doc.descendants((n, pos) => {\n if (found !== null) return false;\n if (n.type.name === 'imageUploadNode' && n.attrs.nodeKey === key) {\n found = pos;\n return false;\n }\n });\n return found;\n }, [editor]);\n\n // dispatch an attribute update targeted precisely at this node by nodeKey.\n const updateThisNode = useCallback(\n (newAttrs) => {\n const nodePos = findNodePos();\n if (nodePos === null) return;\n const currentNode = editor.state.doc.nodeAt(nodePos);\n if (!currentNode) return;\n editor.view.dispatch(editor.state.tr.setNodeMarkup(nodePos, undefined, { ...currentNode.attrs, ...newAttrs }));\n },\n [editor, findNodePos],\n );\n\n const applySizeData = useCallback(() => {\n if (!node.attrs.width || !imgRef.current) return;\n const resizePercent = getPercentFromWidth(node.attrs.width);\n if (node.attrs.resizePercent === resizePercent) return;\n updateThisNode({ resizePercent });\n }, [node.attrs.width, node.attrs.resizePercent, getPercentFromWidth, updateThisNode]);\n\n // keep ref in sync with latest node\n useEffect(() => {\n latestNodeRef.current = { ...node, pos };\n }, [node, pos]);\n\n useEffect(() => {\n if (selected) {\n if (onlyThisNodeSelected) {\n // Only open the upload UI for a fresh placeholder. Remounting after tab switch\n // would otherwise call insertImageRequested again and reopen the file modal.\n const hasImageSrc = String(node.attrs?.src ?? '').trim();\n\n if (!hasImageSrc && options.imageHandling?.insertImageRequested) {\n options.imageHandling.insertImageRequested(\n editor,\n [node, pos],\n (finish) => new InsertImageHandler(editor, [node, pos], finish),\n );\n }\n\n setShowToolbar(selected);\n }\n } else {\n setShowToolbar(selected);\n }\n }, [onlyThisNodeSelected, selected]);\n\n useEffect(() => {\n applySizeData();\n\n const resizeHandle = resizeRef.current;\n if (resizeHandle) {\n resizeHandle.addEventListener('mousedown', initResize, false);\n }\n return () => {\n if (resizeHandle) {\n resizeHandle.removeEventListener('mousedown', initResize, false);\n }\n };\n }, []);\n\n useEffect(() => {\n applySizeData();\n });\n\n const loadImage = useCallback(() => {\n const box = imgRef.current;\n if (!box) return;\n\n if (!box.style.width || box.style.width === 'calc(20px)') {\n const w = Math.min(box.naturalWidth, maxImageWidth);\n const h = Math.min(box.naturalHeight, maxImageHeight);\n\n box.style.width = `${w}px`;\n box.style.height = `${h}px`;\n\n const update = { width: w, height: h };\n if (!isEqual(update, { width: node.attrs.width, height: node.attrs.height })) {\n updateThisNode(update);\n }\n }\n }, [node.attrs.width, node.attrs.height, maxImageWidth, maxImageHeight, updateThisNode]);\n\n const updateAspect = (initial, next, keepAspect = true, resizeType) => {\n if (keepAspect) {\n const ratio = initial.width / initial.height;\n if (resizeType === 'height') return { width: next.height * ratio, height: next.height };\n return { width: next.width, height: next.width / ratio };\n }\n return next;\n };\n\n const startResize = useCallback(\n (e) => {\n const box = imgRef.current;\n if (!box) return;\n\n const bounds = e.target.getBoundingClientRect();\n const initial = { width: box.naturalWidth, height: box.naturalHeight };\n\n const next = updateAspect(initial, {\n width: e.clientX - bounds.left,\n height: e.clientY - bounds.top,\n });\n\n if (next.width > 50 && next.height > 50 && next.width <= 700 && next.height <= 900) {\n box.style.width = `${next.width}px`;\n box.style.height = `${next.height}px`;\n\n updateThisNode({ width: next.width, height: next.height });\n }\n },\n [editor, updateThisNode],\n );\n\n const onChange = useCallback(\n (newValues) => {\n updateThisNode(newValues);\n },\n [editor, updateThisNode],\n );\n\n const stopResize = useCallback(() => {\n window.removeEventListener('mousemove', startResize);\n window.removeEventListener('mouseup', stopResize);\n }, [startResize]);\n\n const initResize = useCallback(() => {\n window.addEventListener('mousemove', startResize);\n window.addEventListener('mouseup', stopResize);\n }, [startResize, stopResize]);\n\n const style = {\n width: sizePx(node.attrs.width),\n height: sizePx(node.attrs.height),\n objectFit: 'contain',\n };\n\n const flexAlign = { left: 'flex-start', center: 'center', right: 'flex-end' }[node.attrs.alignment] || 'flex-start';\n\n return (\n <NodeViewWrapper>\n <StyledRoot\n onFocus={onFocus}\n loading={!node.attrs.loaded}\n pendingDelete={node.attrs.deleteStatus === 'pending'}\n style={{ justifyContent: flexAlign }}\n >\n <StyledProgress mode=\"determinate\" value={node.attrs.percent || 0} hideProgress={node.attrs.loaded} />\n\n <StyledImageContainer onDragStart={(e) => e.preventDefault()}>\n <StyledImage\n {...attributes}\n active={selected && node.attrs.loaded}\n draggable={false}\n ref={imgRef}\n src={node.attrs.src}\n style={style}\n onLoad={loadImage}\n alt={node.attrs.alt}\n />\n <StyledResize ref={resizeRef} className=\"resize\" />\n </StyledImageContainer>\n </StyledRoot>\n\n {showToolbar &&\n editor._tiptapContainerEl &&\n ReactDOM.createPortal(\n <div\n ref={toolbarRef}\n style={{\n zIndex: 20,\n background: 'var(--editable-html-toolbar-bg, #efefef)',\n boxShadow:\n '0px 1px 5px 0px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 3px 1px -2px rgba(0, 0, 0, 0.12)',\n width: '100%',\n }}\n >\n <CustomToolbarWrapper\n showDone\n deletable\n toolbarOpts={options.toolbarOpts || {}}\n onDelete={() => {\n const nodePos = findNodePos();\n if (nodePos === null) return;\n\n options.imageHandling?.onDelete?.(latestNodeRef.current);\n\n editor.view.dispatch(\n editor.state.tr.delete(nodePos, nodePos + editor.state.doc.nodeAt(nodePos).nodeSize),\n );\n setShowToolbar(false);\n editor.commands.focus();\n }}\n onDone={() => {\n setShowToolbar(false);\n options.imageHandling?.onDone?.(editor);\n editor.commands.focus('end');\n }}\n >\n <ImageToolbar\n disableImageAlignmentButtons={options.imageHandling?.disableImageAlignmentButtons}\n alt={node.attrs.alt}\n imageLoaded={node.attrs.loaded}\n alignment={node.attrs.alignment || 'left'}\n onChange={onChange}\n />\n </CustomToolbarWrapper>\n </div>,\n editor._tiptapContainerEl,\n )}\n </NodeViewWrapper>\n );\n}\n\nImageComponent.propTypes = {\n node: PropTypes.object.isRequired,\n editor: PropTypes.object.isRequired,\n attributes: PropTypes.object,\n onFocus: PropTypes.func,\n maxImageWidth: PropTypes.number,\n maxImageHeight: PropTypes.number,\n};\n\nexport default ImageComponent;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"image-component.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_isEqual","_debug","_LinearProgress","_styles","_react2","_reactDom","_InsertImageHandler","_ImageToolbar","_customToolbarWrapper","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","log","debug","StyledProgress","styled","LinearProgress","shouldForwardProp","prop","_ref","hideProgress","position","left","width","top","transition","opacity","StyledRoot","includes","_ref2","loading","pendingDelete","display","StyledImageContainer","_ref3","theme","alignItems","StyledImage","_ref4","active","border","concat","palette","primary","main","StyledResize","_ref5","backgroundColor","cursor","height","borderRadius","marginLeft","marginRight","sizePx","s","ImageComponent","props","_options$imageHandlin6","node","editor","attributes","onFocus","getPos","selected","options","_props$maxImageWidth","maxImageWidth","_props$maxImageHeight","maxImageHeight","alt","attrs","pos","selFrom","state","selection","from","selTo","to","onlyThisNodeSelected","useMemo","nodeSize","_useState","useState","_useState2","_slicedToArray2","showToolbar","setShowToolbar","latestNodeRef","useRef","imgRef","resizeRef","toolbarRef","getPercentFromWidth","useCallback","floored","current","naturalWidth","parseInt","toFixed","findNodePos","key","nodeKey","found","doc","descendants","type","name","updateThisNode","newAttrs","nodePos","currentNode","nodeAt","view","dispatch","tr","setNodeMarkup","undefined","applySizeData","resizePercent","useEffect","isEditable","_node$attrs$src","_node$attrs","_options$imageHandlin","hasImageSrc","String","src","trim","imageHandling","insertImageRequested","finish","InsertImageHandler","resizeHandle","addEventListener","initResize","removeEventListener","loadImage","box","style","w","Math","min","h","naturalHeight","update","isEqual","updateAspect","initial","next","keepAspect","resizeType","ratio","startResize","bounds","target","getBoundingClientRect","clientX","clientY","onChange","newValues","stopResize","window","objectFit","flexAlign","center","right","alignment","createElement","NodeViewWrapper","loaded","deleteStatus","justifyContent","mode","value","percent","onDragStart","preventDefault","_extends2","draggable","ref","onLoad","className","_tiptapContainerEl","ReactDOM","createPortal","zIndex","background","boxShadow","showDone","deletable","toolbarOpts","onDelete","_options$imageHandlin2","_options$imageHandlin3","commands","focus","onDone","_options$imageHandlin4","_options$imageHandlin5","disableImageAlignmentButtons","imageLoaded","propTypes","PropTypes","object","isRequired","func","number","_default","exports"],"sources":["../../src/extensions/image-component.jsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport isEqual from 'lodash-es/isEqual';\nimport debug from 'debug';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport { styled } from '@mui/material/styles';\nimport { NodeViewWrapper } from '@tiptap/react';\nimport ReactDOM from 'react-dom';\nimport InsertImageHandler from '../components/image/InsertImageHandler';\nimport ImageToolbar from '../components/image/ImageToolbar';\nimport CustomToolbarWrapper from './custom-toolbar-wrapper';\n\nconst log = debug('@pie-lib:editable-html:plugins:image:component');\n\nconst StyledProgress = styled(LinearProgress, {\n shouldForwardProp: (prop) => prop !== 'hideProgress',\n})(({ hideProgress }) => ({\n position: 'absolute',\n left: '0',\n width: 'fit-content',\n top: '0%',\n transition: 'opacity 200ms linear',\n ...(hideProgress && {\n opacity: 0,\n }),\n}));\n\nconst StyledRoot = styled('div', {\n shouldForwardProp: (prop) => !['active', 'loading', 'pendingDelete'].includes(prop),\n})(({ loading, pendingDelete }) => ({\n position: 'relative',\n display: 'flex',\n transition: 'opacity 200ms linear',\n ...(loading && {\n opacity: 0.3,\n }),\n ...(pendingDelete && {\n opacity: 0.3,\n }),\n}));\n\nconst StyledImageContainer = styled('div')(({ theme }) => ({\n position: 'relative',\n width: 'fit-content',\n display: 'flex',\n alignItems: 'center',\n '&&:hover > .resize': {\n display: 'block',\n },\n}));\n\nconst StyledImage = styled('img', {\n shouldForwardProp: (prop) => prop !== 'active',\n})(({ theme, active }) => ({\n border: active ? `solid 1px ${theme.palette.primary.main}` : 'solid 1px transparent',\n}));\n\nconst StyledResize = styled('div')(({ theme }) => ({\n backgroundColor: theme.palette.primary.main,\n cursor: 'col-resize',\n height: '35px',\n width: '5px',\n borderRadius: 8,\n marginLeft: '5px',\n marginRight: '10px',\n display: 'none',\n}));\n\nconst sizePx = (s) => (s ? `${s}px` : 'calc(20px)');\n\nfunction ImageComponent(props) {\n const {\n node,\n editor,\n attributes,\n onFocus,\n getPos,\n selected,\n options,\n maxImageWidth = 700,\n maxImageHeight = 900,\n } = props;\n const { alt } = node.attrs;\n const pos = getPos();\n\n const selFrom = editor.state.selection.from;\n const selTo = editor.state.selection.to;\n const onlyThisNodeSelected = useMemo(() => selFrom + node.nodeSize === selTo, [selFrom, selTo, node.nodeSize]);\n\n const [showToolbar, setShowToolbar] = useState(false);\n\n const latestNodeRef = useRef(node);\n const imgRef = useRef(null);\n const resizeRef = useRef(null);\n const toolbarRef = useRef(null);\n\n const getPercentFromWidth = useCallback((width) => {\n const floored = (width / imgRef.current.naturalWidth) * 4;\n return parseInt(floored.toFixed(0) * 25, 10);\n }, []);\n\n const findNodePos = useCallback(() => {\n const key = latestNodeRef.current.attrs.nodeKey;\n let found = null;\n editor.state.doc.descendants((n, pos) => {\n if (found !== null) return false;\n if (n.type.name === 'imageUploadNode' && n.attrs.nodeKey === key) {\n found = pos;\n return false;\n }\n });\n return found;\n }, [editor]);\n\n // dispatch an attribute update targeted precisely at this node by nodeKey.\n const updateThisNode = useCallback(\n (newAttrs) => {\n const nodePos = findNodePos();\n if (nodePos === null) return;\n const currentNode = editor.state.doc.nodeAt(nodePos);\n if (!currentNode) return;\n editor.view.dispatch(editor.state.tr.setNodeMarkup(nodePos, undefined, { ...currentNode.attrs, ...newAttrs }));\n },\n [editor, findNodePos],\n );\n\n const applySizeData = useCallback(() => {\n if (!node.attrs.width || !imgRef.current || !imgRef.current.naturalWidth) return;\n const resizePercent = getPercentFromWidth(node.attrs.width);\n if (node.attrs.resizePercent === resizePercent) return;\n updateThisNode({ resizePercent });\n }, [node.attrs.width, node.attrs.resizePercent, getPercentFromWidth, updateThisNode]);\n\n // keep ref in sync with latest node\n useEffect(() => {\n latestNodeRef.current = { ...node, pos };\n }, [node, pos]);\n\n useEffect(() => {\n if (selected) {\n if (onlyThisNodeSelected && editor.isEditable) {\n // Only open the upload UI for a fresh placeholder. Remounting after tab switch\n // would otherwise call insertImageRequested again and reopen the file modal.\n const hasImageSrc = String(node.attrs?.src ?? '').trim();\n\n if (!hasImageSrc && options.imageHandling?.insertImageRequested) {\n options.imageHandling.insertImageRequested(\n editor,\n [node, pos],\n (finish) => new InsertImageHandler(editor, [node, pos], finish),\n );\n }\n\n setShowToolbar(selected);\n }\n } else {\n setShowToolbar(selected);\n }\n }, [onlyThisNodeSelected, selected, editor.isEditable]);\n\n useEffect(() => {\n applySizeData();\n\n const resizeHandle = resizeRef?.current;\n\n if (resizeHandle && editor.isEditable) {\n resizeHandle.addEventListener('mousedown', initResize, false);\n }\n\n return () => {\n if (resizeHandle) {\n resizeHandle.removeEventListener('mousedown', initResize, false);\n }\n };\n }, []);\n\n useEffect(() => {\n applySizeData();\n });\n\n const loadImage = useCallback(() => {\n const box = imgRef.current;\n if (!box) return;\n\n if (!box.style.width || box.style.width === 'calc(20px)') {\n const w = Math.min(box.naturalWidth, maxImageWidth);\n const h = Math.min(box.naturalHeight, maxImageHeight);\n\n box.style.width = `${w}px`;\n box.style.height = `${h}px`;\n\n const update = { width: w, height: h };\n if (!isEqual(update, { width: node.attrs.width, height: node.attrs.height })) {\n updateThisNode(update);\n }\n }\n }, [node.attrs.width, node.attrs.height, maxImageWidth, maxImageHeight, updateThisNode]);\n\n const updateAspect = (initial, next, keepAspect = true, resizeType) => {\n if (keepAspect) {\n const ratio = initial.width / initial.height;\n if (resizeType === 'height') return { width: next.height * ratio, height: next.height };\n return { width: next.width, height: next.width / ratio };\n }\n return next;\n };\n\n const startResize = useCallback(\n (e) => {\n const box = imgRef.current;\n if (!box) return;\n\n const bounds = e.target.getBoundingClientRect();\n const initial = { width: box.naturalWidth, height: box.naturalHeight };\n\n const next = updateAspect(initial, {\n width: e.clientX - bounds.left,\n height: e.clientY - bounds.top,\n });\n\n if (next.width > 50 && next.height > 50 && next.width <= 700 && next.height <= 900) {\n box.style.width = `${next.width}px`;\n box.style.height = `${next.height}px`;\n\n updateThisNode({ width: next.width, height: next.height });\n }\n },\n [editor, updateThisNode],\n );\n\n const onChange = useCallback(\n (newValues) => {\n updateThisNode(newValues);\n },\n [editor, updateThisNode],\n );\n\n const stopResize = useCallback(() => {\n window.removeEventListener('mousemove', startResize);\n window.removeEventListener('mouseup', stopResize);\n }, [startResize]);\n\n const initResize = useCallback(() => {\n window.addEventListener('mousemove', startResize);\n window.addEventListener('mouseup', stopResize);\n }, [startResize, stopResize]);\n\n const style = {\n width: sizePx(node.attrs.width),\n height: sizePx(node.attrs.height),\n objectFit: 'contain',\n };\n\n const flexAlign = { left: 'flex-start', center: 'center', right: 'flex-end' }[node.attrs.alignment] || 'flex-start';\n\n return (\n <NodeViewWrapper>\n <StyledRoot\n onFocus={onFocus}\n loading={!node.attrs.loaded}\n pendingDelete={node.attrs.deleteStatus === 'pending'}\n style={{ justifyContent: flexAlign }}\n >\n <StyledProgress mode=\"determinate\" value={node.attrs.percent || 0} hideProgress={node.attrs.loaded} />\n\n <StyledImageContainer onDragStart={(e) => e.preventDefault()}>\n <StyledImage\n {...attributes}\n active={selected && node.attrs.loaded}\n draggable={false}\n ref={imgRef}\n src={node.attrs.src}\n style={style}\n onLoad={loadImage}\n alt={node.attrs.alt}\n />\n <StyledResize ref={resizeRef} className=\"resize\" style={{ display: editor.isEditable ? undefined : 'none' }} />\n </StyledImageContainer>\n </StyledRoot>\n\n {showToolbar &&\n editor._tiptapContainerEl &&\n ReactDOM.createPortal(\n <div\n ref={toolbarRef}\n style={{\n zIndex: 20,\n background: 'var(--editable-html-toolbar-bg, #efefef)',\n boxShadow:\n '0px 1px 5px 0px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 3px 1px -2px rgba(0, 0, 0, 0.12)',\n width: '100%',\n }}\n >\n <CustomToolbarWrapper\n showDone\n deletable\n toolbarOpts={options.toolbarOpts || {}}\n onDelete={() => {\n const nodePos = findNodePos();\n if (nodePos === null) return;\n\n options.imageHandling?.onDelete?.(latestNodeRef.current);\n\n editor.view.dispatch(\n editor.state.tr.delete(nodePos, nodePos + editor.state.doc.nodeAt(nodePos).nodeSize),\n );\n setShowToolbar(false);\n editor.commands.focus();\n }}\n onDone={() => {\n setShowToolbar(false);\n options.imageHandling?.onDone?.(editor);\n editor.commands.focus('end');\n }}\n >\n <ImageToolbar\n disableImageAlignmentButtons={options.imageHandling?.disableImageAlignmentButtons}\n alt={node.attrs.alt}\n imageLoaded={node.attrs.loaded}\n alignment={node.attrs.alignment || 'left'}\n onChange={onChange}\n />\n </CustomToolbarWrapper>\n </div>,\n editor._tiptapContainerEl,\n )}\n </NodeViewWrapper>\n );\n}\n\nImageComponent.propTypes = {\n node: PropTypes.object.isRequired,\n editor: PropTypes.object.isRequired,\n attributes: PropTypes.object,\n onFocus: PropTypes.func,\n maxImageWidth: PropTypes.number,\n maxImageHeight: PropTypes.number,\n};\n\nexport default ImageComponent;\n"],"mappings":"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","ignoreList":[]}
@@ -15,6 +15,7 @@ var _react2 = require("@tiptap/react");
15
15
  var _prosemirrorState = require("prosemirror-state");
16
16
  var _mathToolbar = require("@pie-lib/math-toolbar");
17
17
  var _mathRendering = require("@pie-lib/math-rendering");
18
+ var _toolbar = require("../utils/toolbar");
18
19
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
19
20
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
20
21
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -37,7 +38,9 @@ var EnsureTextAfterMathPlugin = exports.EnsureTextAfterMathPlugin = function Ens
37
38
  // Only act when the doc actually changed
38
39
  if (!transactions.some(function (tr) {
39
40
  return tr.docChanged;
40
- })) return null;
41
+ })) {
42
+ return null;
43
+ }
41
44
  var tr = newState.tr;
42
45
  var changed = false;
43
46
  newState.doc.descendants(function (node, pos) {
@@ -56,6 +59,23 @@ var EnsureTextAfterMathPlugin = exports.EnsureTextAfterMathPlugin = function Ens
56
59
  }
57
60
  });
58
61
  };
62
+ var nodeBeforeZeroWidthSpace = function nodeBeforeZeroWidthSpace(doc, from) {
63
+ var i;
64
+
65
+ // finding if previous to the cursor there's a zero-width space
66
+ // and a non-text element, and deleting everything until the space
67
+ for (i = from; i > 0; i--) {
68
+ var _currentDoc$type, _currentDoc$type2;
69
+ var currentDoc = doc.nodeAt(i);
70
+ if ((currentDoc === null || currentDoc === void 0 || (_currentDoc$type = currentDoc.type) === null || _currentDoc$type === void 0 ? void 0 : _currentDoc$type.name) === 'text' && currentDoc.textContent !== "\u200B") {
71
+ return -1;
72
+ }
73
+ if (currentDoc && (currentDoc === null || currentDoc === void 0 || (_currentDoc$type2 = currentDoc.type) === null || _currentDoc$type2 === void 0 ? void 0 : _currentDoc$type2.name) !== 'text') {
74
+ break;
75
+ }
76
+ }
77
+ return i;
78
+ };
59
79
  var ZeroWidthSpaceHandlingPlugin = exports.ZeroWidthSpaceHandlingPlugin = new _prosemirrorState.Plugin({
60
80
  key: new _prosemirrorState.PluginKey('zeroWidthSpaceHandling'),
61
81
  props: {
@@ -67,34 +87,33 @@ var ZeroWidthSpaceHandlingPlugin = exports.ZeroWidthSpaceHandlingPlugin = new _p
67
87
  var from = selection.from,
68
88
  empty = selection.empty;
69
89
  if (empty && event.key === 'Backspace' && from > 0) {
70
- var prevChar = doc.textBetween(from - 1, from, "\uFFFC", "\uFFFC");
71
- if (prevChar === "\u200B") {
72
- var tr = state.tr["delete"](from - 2, from);
73
- dispatch(tr);
74
- return true; // handled
90
+ var start = nodeBeforeZeroWidthSpace(doc, from);
91
+ if (start === -1) {
92
+ return false;
75
93
  }
94
+ var tr = state.tr["delete"](start, from);
95
+ dispatch(tr);
96
+ return true; // handled
76
97
  }
77
98
  if (empty && event.key === 'ArrowLeft' && from > 0) {
78
- var _prevChar = doc.textBetween(from - 1, from, "\uFFFC", "\uFFFC");
79
- // If the previous character is the zero-width space...
80
- if (_prevChar === "\u200B") {
81
- var posBefore = from - 1;
82
- var resolved = state.doc.resolve(posBefore - 1); // look just before the zwsp
83
- var maybeNode = resolved.nodeAfter || resolved.nodeBefore;
99
+ var _start = nodeBeforeZeroWidthSpace(doc, from);
100
+ if (_start === -1) {
101
+ return false;
102
+ }
103
+ var resolved = state.doc.resolve(_start);
104
+ var maybeNode = resolved.nodeAfter || resolved.nodeBefore;
84
105
 
85
- // Check if there's an inline selectable node (e.g., your math node)
86
- if (maybeNode) {
87
- var nodePos = posBefore - maybeNode.nodeSize;
88
- var nodeResolved = state.doc.resolve(nodePos);
89
- var _tr = state.tr.setSelection(_prosemirrorState.NodeSelection.create(state.doc, nodeResolved.pos));
90
- dispatch(_tr);
91
- return true;
92
- } else {
93
- // Just move the text cursor before the zwsp
94
- var _tr2 = state.tr.setSelection(_prosemirrorState.TextSelection.create(state.doc, from - 2));
95
- dispatch(_tr2);
96
- return true;
97
- }
106
+ // Check if there's an inline selectable node (e.g., your math node)
107
+ if (maybeNode) {
108
+ var nodeResolved = state.doc.resolve(_start);
109
+ var _tr = state.tr.setSelection(_prosemirrorState.NodeSelection.create(state.doc, nodeResolved.pos));
110
+ dispatch(_tr);
111
+ return true;
112
+ } else {
113
+ // Just move the text cursor before the zwsp
114
+ var _tr2 = state.tr.setSelection(_prosemirrorState.TextSelection.create(state.doc, from - 2));
115
+ dispatch(_tr2);
116
+ return true;
98
117
  }
99
118
  }
100
119
  return false;
@@ -166,15 +185,10 @@ var MathNode = exports.MathNode = _core.Node.create({
166
185
  tr.setSelection(sel);
167
186
  }
168
187
  dispatch(tr);
188
+ (0, _toolbar.setToolbarOpened)(editor, true);
169
189
  return true;
170
190
  };
171
191
  }
172
- // insertMath: (latex = '') => ({ commands }) => {
173
- // return commands.insertContent({
174
- // type: this.name,
175
- // attrs: { latex },
176
- // });
177
- // },
178
192
  };
179
193
  },
180
194
  renderHTML: function renderHTML(_ref2) {
@@ -206,12 +220,15 @@ var MathNodeView = exports.MathNodeView = function MathNodeView(props) {
206
220
  updateAttributes = props.updateAttributes,
207
221
  editor = props.editor,
208
222
  selected = props.selected,
209
- options = props.options;
223
+ options = props.options,
224
+ getPos = props.getPos;
210
225
  var _useState = (0, _react.useState)(selected),
211
226
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
212
227
  showToolbar = _useState2[0],
213
228
  setShowToolbar = _useState2[1];
214
229
  var toolbarRef = (0, _react.useRef)(null);
230
+ var nodeRef = (0, _react.useRef)(null);
231
+ var timestamp = (0, _react.useRef)(Date.now());
215
232
  var _useState3 = (0, _react.useState)({
216
233
  top: 0,
217
234
  left: 0
@@ -230,25 +247,124 @@ var MathNodeView = exports.MathNodeView = function MathNodeView(props) {
230
247
  keyPadCharacterRef = mathOptions.keyPadCharacterRef,
231
248
  setKeypadInteraction = mathOptions.setKeypadInteraction;
232
249
  var latex = node.attrs.latex || '';
250
+ var handleChange = function handleChange(newLatex) {
251
+ updateAttributes({
252
+ latex: newLatex
253
+ });
254
+ };
255
+
256
+ // moveCursorAfterNode is set explicitly by the caller (not inferred from
257
+ // editor.state.selection: every keystroke while editing already calls
258
+ // updateAttributes, which replaces this node's content and — per a
259
+ // ProseMirror mapping quirk — collapses any NodeSelection on it into a
260
+ // plain TextSelection right away, so the live selection can't be trusted
261
+ // to still describe this node by the time handleDone runs).
262
+ //
263
+ // - Check icon: always move the cursor to just after this node.
264
+ // - Clicking elsewhere in the editable content while the toolbar was
265
+ // open (see handleClickOutside): leave the cursor where the user
266
+ // actually clicked instead of overriding it.
267
+ var handleDone = function handleDone(newLatex) {
268
+ var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
269
+ _ref4$moveCursorAfter = _ref4.moveCursorAfterNode,
270
+ moveCursorAfterNode = _ref4$moveCursorAfter === void 0 ? true : _ref4$moveCursorAfter;
271
+ updateAttributes({
272
+ latex: newLatex
273
+ });
274
+ setShowToolbar(false);
275
+ if (moveCursorAfterNode && typeof getPos === 'function') {
276
+ var pos = getPos();
277
+ var doc = editor.state.doc;
278
+ var sel = _prosemirrorState.TextSelection.create(doc, pos + node.nodeSize);
279
+ var tr = editor.state.tr.setSelection(sel);
280
+ editor.view.dispatch(tr);
281
+ }
282
+ editor.commands.focus();
283
+ };
284
+
285
+ // Only open the toolbar when this node is *explicitly* selected
286
+ // via a NodeSelection — not when it's merely included in a broader
287
+ // TextSelection or AllSelection (e.g. click-drag across math, or Cmd+A).
233
288
  (0, _react.useEffect)(function () {
234
- if (selected) {
289
+ var _selection$node;
290
+ if (!selected) return;
291
+ var selection = editor.state.selection;
292
+ var isNodeSelected = ((_selection$node = selection.node) === null || _selection$node === void 0 || (_selection$node = _selection$node.type) === null || _selection$node === void 0 ? void 0 : _selection$node.name) === 'math';
293
+ if (isNodeSelected) {
235
294
  setShowToolbar(true);
236
295
  }
237
- }, [selected]);
296
+ }, [selected, editor]);
238
297
  (0, _react.useEffect)(function () {
239
- editor._toolbarOpened = !!showToolbar;
240
- }, [showToolbar]);
298
+ (0, _toolbar.setToolbarOpened)(editor, selected || showToolbar);
299
+ }, [editor, showToolbar, selected]);
241
300
  (0, _react.useEffect)(function () {
242
- // Calculate position relative to selection
243
- var container = (editor === null || editor === void 0 ? void 0 : editor._tiptapContainerEl) || document.body;
244
- var bodyRect = container.getBoundingClientRect();
245
- var from = editor.state.selection.from;
246
- var start = editor.view.coordsAtPos(from);
247
- setPosition({
248
- top: start.top + Math.abs(bodyRect.top) + 40,
249
- // shift above
250
- left: start.left
301
+ if (!editor || !showToolbar) {
302
+ setPosition({
303
+ top: 0,
304
+ left: 0
305
+ });
306
+ return;
307
+ }
308
+
309
+ // Clamp in viewport coordinates, then convert to portal-container-relative values
310
+ // for position: absolute (toolbar is portaled into _tiptapContainerEl or document.body).
311
+ var updatePosition = function updatePosition() {
312
+ var _nodeRef$current, _nodeRef$current$getB, _start$bottom;
313
+ if (!toolbarRef.current) {
314
+ return;
315
+ }
316
+ var from = editor.state.selection.from;
317
+ var start = editor.view.coordsAtPos(from);
318
+ var nodeRect = (_nodeRef$current = nodeRef.current) === null || _nodeRef$current === void 0 || (_nodeRef$current$getB = _nodeRef$current.getBoundingClientRect) === null || _nodeRef$current$getB === void 0 ? void 0 : _nodeRef$current$getB.call(_nodeRef$current);
319
+
320
+ // Anchor to the math node element when available; fall back to selection coords.
321
+ var anchorTop = nodeRect !== null && nodeRect !== void 0 && nodeRect.height ? nodeRect.top : start.top;
322
+ var anchorLeft = nodeRect !== null && nodeRect !== void 0 && nodeRect.width ? nodeRect.left : start.left;
323
+ var anchorBottom = nodeRect !== null && nodeRect !== void 0 && nodeRect.height ? nodeRect.bottom : (_start$bottom = start.bottom) !== null && _start$bottom !== void 0 ? _start$bottom : start.top;
324
+ var toolbarHeight = toolbarRef.current.offsetHeight;
325
+ var toolbarWidth = toolbarRef.current.offsetWidth;
326
+ var gap = 0;
327
+ var spaceBelow = window.innerHeight - (anchorBottom + gap);
328
+
329
+ // Place the toolbar's top-left corner directly below the anchor; flip above when needed.
330
+ var top = spaceBelow >= toolbarHeight ? anchorBottom + gap : anchorTop - toolbarHeight - gap;
331
+ var left = anchorLeft;
332
+ var margin = 8;
333
+ top = Math.max(margin, Math.min(top, window.innerHeight - toolbarHeight - margin));
334
+ left = Math.max(margin, Math.min(left, window.innerWidth - toolbarWidth - margin));
335
+ var portalEl = editor._tiptapContainerEl || document.body;
336
+ var containerRect = portalEl.getBoundingClientRect();
337
+ setPosition({
338
+ top: top - containerRect.top,
339
+ left: left - containerRect.left
340
+ });
341
+ };
342
+ updatePosition();
343
+ var frame = null;
344
+ var scheduleUpdate = function scheduleUpdate() {
345
+ if (frame !== null) {
346
+ return;
347
+ }
348
+ frame = requestAnimationFrame(function () {
349
+ frame = null;
350
+ updatePosition();
351
+ });
352
+ };
353
+ frame = requestAnimationFrame(function () {
354
+ frame = null;
355
+ updatePosition();
251
356
  });
357
+ window.addEventListener('scroll', scheduleUpdate, true);
358
+ window.addEventListener('resize', scheduleUpdate);
359
+ return function () {
360
+ if (frame !== null) {
361
+ cancelAnimationFrame(frame);
362
+ }
363
+ window.removeEventListener('scroll', scheduleUpdate, true);
364
+ window.removeEventListener('resize', scheduleUpdate);
365
+ };
366
+ }, [editor, showToolbar]);
367
+ (0, _react.useEffect)(function () {
252
368
  var handleClickOutside = function handleClickOutside(event) {
253
369
  var _document$querySelect, _document, _target$closest, _target$closest2, _target$closest3;
254
370
  var target = event === null || event === void 0 ? void 0 : event.target;
@@ -264,9 +380,22 @@ var MathNodeView = exports.MathNodeView = function MathNodeView(props) {
264
380
  // will keep/re-open the toolbar. Without this guard, closing and then
265
381
  // immediately clicking the math node would fire this listener in the same
266
382
  // event cycle and close the toolbar before it could open.
267
- var clickedMathNode = !!(target !== null && target !== void 0 && (_target$closest2 = target.closest) !== null && _target$closest2 !== void 0 && _target$closest2.call(target, '.math-node'));
383
+ var clickedMathNode = !!(target !== null && target !== void 0 && (_target$closest2 = target.closest) !== null && _target$closest2 !== void 0 && _target$closest2.call(target, ".math-node-".concat(timestamp.current)));
268
384
  if (toolbarRef.current && !toolbarRef.current.contains(target) && !(target !== null && target !== void 0 && (_target$closest3 = target.closest) !== null && _target$closest3 !== void 0 && _target$closest3.call(target, '[data-inline-node]')) && !equationEditorPopoverOpen && !clickedEquationEditorSelect && !clickedMathNode) {
385
+ var _editor$view;
269
386
  setShowToolbar(false);
387
+
388
+ // If the click landed inside the editable content itself, respect
389
+ // it and leave the cursor where the user clicked. If it landed
390
+ // fully outside the editor (e.g. on other page UI), there's no
391
+ // click position to preserve — falling back to "leave selection
392
+ // untouched" there renders the browser's native NodeSelection
393
+ // fallback caret at the start of the node, so explicitly move the
394
+ // cursor after it instead, same as the check-icon path.
395
+ var clickedInsideEditableContent = !!(editor !== null && editor !== void 0 && (_editor$view = editor.view) !== null && _editor$view !== void 0 && (_editor$view = _editor$view.dom) !== null && _editor$view !== void 0 && _editor$view.contains(target));
396
+ handleDone(node.attrs.latex, {
397
+ moveCursorAfterNode: !clickedInsideEditableContent
398
+ });
270
399
  }
271
400
  };
272
401
  if (showToolbar) {
@@ -279,31 +408,9 @@ var MathNodeView = exports.MathNodeView = function MathNodeView(props) {
279
408
  return function () {
280
409
  return document.removeEventListener('click', handleClickOutside);
281
410
  };
282
- }, [editor, showToolbar]);
283
- var handleChange = function handleChange(newLatex) {
284
- updateAttributes({
285
- latex: newLatex
286
- });
287
- };
288
- var handleDone = function handleDone(newLatex) {
289
- updateAttributes({
290
- latex: newLatex
291
- });
292
- setShowToolbar(false);
293
- editor._toolbarOpened = false;
294
- var _editor$state = editor.state,
295
- selection = _editor$state.selection,
296
- tr = _editor$state.tr,
297
- doc = _editor$state.doc;
298
- var sel = _prosemirrorState.TextSelection.create(doc, selection.from + 1);
299
-
300
- // Build a fresh transaction from the current state and set the selection
301
- tr.setSelection(sel);
302
- editor.view.dispatch(tr);
303
- editor.commands.focus();
304
- };
411
+ }, [editor, showToolbar, node]);
305
412
  return /*#__PURE__*/_react["default"].createElement(_react2.NodeViewWrapper, {
306
- className: "math-node",
413
+ className: "math-node-".concat(timestamp.current),
307
414
  style: {
308
415
  display: 'inline-flex',
309
416
  cursor: 'pointer',
@@ -311,6 +418,7 @@ var MathNodeView = exports.MathNodeView = function MathNodeView(props) {
311
418
  },
312
419
  "data-selected": selected
313
420
  }, /*#__PURE__*/_react["default"].createElement("div", {
421
+ ref: nodeRef,
314
422
  onClick: function onClick() {
315
423
  return setShowToolbar(true);
316
424
  },
@@ -324,7 +432,7 @@ var MathNodeView = exports.MathNodeView = function MathNodeView(props) {
324
432
  position: 'absolute',
325
433
  top: "".concat(position.top, "px"),
326
434
  left: "".concat(position.left, "px"),
327
- zIndex: 20,
435
+ zIndex: 1000,
328
436
  background: 'var(--editable-html-toolbar-bg, #efefef)',
329
437
  boxShadow: '0px 1px 5px 0px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 3px 1px -2px rgba(0, 0, 0, 0.12)'
330
438
  }