@bigbinary/neeto-editor 1.45.26 → 1.45.28

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.
@@ -108,6 +108,9 @@ var buildHeaderLinks = function buildHeaderLinks(editorContentNode) {
108
108
  var headerTags = editorContentNode.querySelectorAll("h1, h2, h3, h4, h5, h6");
109
109
  var usedIds = new Map();
110
110
  headerTags.forEach(function (heading) {
111
+ if (heading.getAttribute('data-link') === 'false') {
112
+ return;
113
+ }
111
114
  var headingId = convertTextToId(heading.textContent);
112
115
  if (usedIds.has(headingId)) {
113
116
  var count = usedIds.get(headingId);
@@ -1 +1 @@
1
- {"version":3,"file":"EditorContent.js","sources":["../src/components/EditorContent/ImagePreview.jsx","../src/components/EditorContent/utils/headers.js","../src/components/EditorContent/index.jsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\nimport classnames from \"classnames\";\nimport { useOnClickOutside } from \"neetocommons/react-utils\";\nimport { Close } from \"neetoicons\";\nimport { Button, Spinner } from \"neetoui\";\nimport { createPortal } from \"react-dom\";\nimport { useTranslation } from \"react-i18next\";\n\nconst ImagePreview = ({ imagePreviewDetails, setImagePreviewDetails }) => {\n const [isLoading, setIsLoading] = useState(true);\n\n const { t } = useTranslation();\n\n const imagePreviewRef = useRef(null);\n\n useOnClickOutside(imagePreviewRef, () => setImagePreviewDetails(null), {\n enabled: true,\n });\n\n useEffect(() => {\n if (!imagePreviewRef.current) return;\n\n imagePreviewRef.current.setAttribute(\"tabindex\", \"-1\");\n imagePreviewRef.current.focus();\n }, []);\n\n const handleKeyDown = e => {\n e.stopPropagation();\n e.key === \"Escape\" && setImagePreviewDetails(null);\n };\n\n return createPortal(\n <div className=\"ne-image-preview-wrapper active\">\n {isLoading && <Spinner className=\"ne-image-preview-wrapper__spinner\" />}\n {!isLoading && (\n <div className=\"close-button\">\n <Button\n icon={Close}\n style=\"secondary\"\n onClick={() => setImagePreviewDetails(null)}\n />\n </div>\n )}\n <div\n className={classnames(\"ne-image-preview\", {\n \"image-loaded\": !isLoading,\n })}\n >\n <img\n alt={t(\"neetoEditor.editorContent.imagePreviewAltText\")}\n ref={imagePreviewRef}\n src={imagePreviewDetails.src}\n onKeyDown={handleKeyDown}\n onLoad={() => setIsLoading(false)}\n />\n {imagePreviewDetails && (\n <p className=\"ne-image-preview__caption\">\n {imagePreviewDetails.caption}\n </p>\n )}\n </div>\n </div>,\n document.body\n );\n};\n\nexport default ImagePreview;\n","const buildLinkSVG = () => {\n const svgNS = \"http://www.w3.org/2000/svg\";\n\n const svgWrapper = document.createElement(\"span\");\n svgWrapper.classList.add(\"header-link-icon-wrapper\");\n const svg = document.createElementNS(svgNS, \"svg\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n svg.setAttribute(\"height\", \"20\");\n svg.setAttribute(\"viewBox\", \"0 0 16 16\");\n svg.setAttribute(\"width\", \"20\");\n\n const path = document.createElementNS(svgNS, \"path\");\n path.setAttribute(\n \"d\",\n \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n );\n\n svg.appendChild(path);\n svgWrapper.appendChild(svg);\n\n return svgWrapper;\n};\n\nconst convertTextToId = text =>\n text\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \"\")\n .replace(/\\s+/g, \"-\");\n\nexport const buildHeaderLinks = editorContentNode => {\n const headerTags = editorContentNode.querySelectorAll(\n \"h1, h2, h3, h4, h5, h6\"\n );\n const usedIds = new Map();\n\n headerTags.forEach(heading => {\n let headingId = convertTextToId(heading.textContent);\n if (usedIds.has(headingId)) {\n const count = usedIds.get(headingId);\n usedIds.set(headingId, count + 1);\n headingId = `${headingId}-${count}`;\n } else usedIds.set(headingId, 1);\n\n heading.setAttribute(\"id\", headingId);\n\n const anchor = document.createElement(\"a\");\n anchor.setAttribute(\"href\", `#${headingId}`);\n anchor.classList.add(\"header-wrapper-link\");\n anchor.appendChild(buildLinkSVG());\n anchor.appendChild(heading.cloneNode(true));\n\n heading.replaceWith(anchor);\n });\n};\n","import { memo, useEffect, useRef, useState } from \"react\";\n\nimport classnames from \"classnames\";\nimport DOMPurify from \"dompurify\";\nimport CopyToClipboardButton from \"neetomolecules/CopyToClipboardButton\";\nimport { isNil } from \"ramda\";\nimport { createRoot } from \"react-dom/client\";\n\nimport { EDITOR_SIZES } from \"src/common/constants\";\nimport \"src/styles/editor/editor-content.scss\";\nimport { removeEmptyTags } from \"utils\";\n\nimport {\n EDITOR_CONTENT_CLASS_NAME,\n EDITOR_CONTENT_DEFAULT_CONFIGURATION,\n SANITIZE_OPTIONS,\n} from \"./constants\";\nimport ImagePreview from \"./ImagePreview\";\nimport {\n substituteVariables,\n applyLineHighlighting,\n applySyntaxHighlightingAndLineNumbers,\n} from \"./utils\";\nimport { buildHeaderLinks } from \"./utils/headers\";\n\nconst EditorContent = ({\n content = \"\",\n variables = [],\n className,\n size = EDITOR_SIZES.SMALL,\n configuration = EDITOR_CONTENT_DEFAULT_CONFIGURATION,\n ...otherProps\n}) => {\n const [imagePreviewDetails, setImagePreviewDetails] = useState(null);\n const editorContentRef = useRef(null);\n\n const htmlContent = substituteVariables(\n applySyntaxHighlightingAndLineNumbers(removeEmptyTags(content)),\n variables\n );\n const sanitize = DOMPurify.sanitize;\n\n const injectCopyButtonToCodeBlocks = () => {\n const preTags = editorContentRef.current?.querySelectorAll(\n `.${EDITOR_CONTENT_CLASS_NAME} pre`\n );\n\n preTags.forEach(preTag => {\n const button = document.createElement(\"div\");\n button.className = \"neeto-editor-codeblock-options\";\n const root = createRoot(button);\n root.render(\n <CopyToClipboardButton\n size=\"small\"\n style=\"tertiary\"\n value={preTag.textContent}\n />\n );\n preTag.appendChild(button);\n });\n };\n\n const bindImageClickListener = () => {\n const figureTags = editorContentRef.current?.querySelectorAll(\n `.${EDITOR_CONTENT_CLASS_NAME} figure`\n );\n\n figureTags.forEach(figureTag => {\n const image = figureTag.querySelector(\"img\");\n const link = figureTag.querySelector(\"a\");\n if (isNil(image) || isNil(link)) return;\n\n figureTag.addEventListener(\"click\", event => {\n event.preventDefault();\n const caption = figureTag.querySelector(\"figcaption\").innerText;\n setImagePreviewDetails({ src: image.src, caption });\n });\n });\n };\n\n useEffect(() => {\n injectCopyButtonToCodeBlocks();\n bindImageClickListener();\n applyLineHighlighting(editorContentRef.current);\n configuration.enableHeaderLinks &&\n buildHeaderLinks(editorContentRef.current);\n }, [content]);\n\n return (\n <>\n <div\n data-cy=\"neeto-editor-content\"\n ref={editorContentRef}\n className={classnames(EDITOR_CONTENT_CLASS_NAME, {\n [className]: className,\n [`neeto-editor-size--${size}`]: true,\n })}\n dangerouslySetInnerHTML={{\n __html: sanitize(htmlContent, SANITIZE_OPTIONS),\n }}\n {...otherProps}\n />\n {imagePreviewDetails && (\n <ImagePreview {...{ imagePreviewDetails, setImagePreviewDetails }} />\n )}\n </>\n );\n};\n\nexport default memo(EditorContent);\n"],"names":["ImagePreview","_ref","imagePreviewDetails","setImagePreviewDetails","_useState","useState","_useState2","_slicedToArray","isLoading","setIsLoading","_useTranslation","useTranslation","t","imagePreviewRef","useRef","useOnClickOutside","enabled","useEffect","current","setAttribute","focus","handleKeyDown","e","stopPropagation","key","createPortal","_jsxs","className","children","_jsx","Spinner","Button","icon","Close","style","onClick","classnames","alt","ref","src","onKeyDown","onLoad","caption","document","body","buildLinkSVG","svgNS","svgWrapper","createElement","classList","add","svg","createElementNS","path","appendChild","convertTextToId","text","trim","toLowerCase","replace","buildHeaderLinks","editorContentNode","headerTags","querySelectorAll","usedIds","Map","forEach","heading","headingId","textContent","has","count","get","set","concat","anchor","cloneNode","replaceWith","EditorContent","_ref$content","content","_ref$variables","variables","_ref$size","size","EDITOR_SIZES","SMALL","_ref$configuration","configuration","EDITOR_CONTENT_DEFAULT_CONFIGURATION","otherProps","_objectWithoutProperties","_excluded","editorContentRef","htmlContent","substituteVariables","applySyntaxHighlightingAndLineNumbers","removeEmptyTags","sanitize","DOMPurify","injectCopyButtonToCodeBlocks","_editorContentRef$cur","preTags","EDITOR_CONTENT_CLASS_NAME","preTag","button","root","createRoot","render","CopyToClipboardButton","value","bindImageClickListener","_editorContentRef$cur2","figureTags","figureTag","image","querySelector","link","isNil","addEventListener","event","preventDefault","innerText","applyLineHighlighting","enableHeaderLinks","_Fragment","_objectSpread","_defineProperty","dangerouslySetInnerHTML","__html","SANITIZE_OPTIONS","memo"],"mappings":"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"}
1
+ {"version":3,"file":"EditorContent.js","sources":["../src/components/EditorContent/ImagePreview.jsx","../src/components/EditorContent/utils/headers.js","../src/components/EditorContent/index.jsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\nimport classnames from \"classnames\";\nimport { useOnClickOutside } from \"neetocommons/react-utils\";\nimport { Close } from \"neetoicons\";\nimport { Button, Spinner } from \"neetoui\";\nimport { createPortal } from \"react-dom\";\nimport { useTranslation } from \"react-i18next\";\n\nconst ImagePreview = ({ imagePreviewDetails, setImagePreviewDetails }) => {\n const [isLoading, setIsLoading] = useState(true);\n\n const { t } = useTranslation();\n\n const imagePreviewRef = useRef(null);\n\n useOnClickOutside(imagePreviewRef, () => setImagePreviewDetails(null), {\n enabled: true,\n });\n\n useEffect(() => {\n if (!imagePreviewRef.current) return;\n\n imagePreviewRef.current.setAttribute(\"tabindex\", \"-1\");\n imagePreviewRef.current.focus();\n }, []);\n\n const handleKeyDown = e => {\n e.stopPropagation();\n e.key === \"Escape\" && setImagePreviewDetails(null);\n };\n\n return createPortal(\n <div className=\"ne-image-preview-wrapper active\">\n {isLoading && <Spinner className=\"ne-image-preview-wrapper__spinner\" />}\n {!isLoading && (\n <div className=\"close-button\">\n <Button\n icon={Close}\n style=\"secondary\"\n onClick={() => setImagePreviewDetails(null)}\n />\n </div>\n )}\n <div\n className={classnames(\"ne-image-preview\", {\n \"image-loaded\": !isLoading,\n })}\n >\n <img\n alt={t(\"neetoEditor.editorContent.imagePreviewAltText\")}\n ref={imagePreviewRef}\n src={imagePreviewDetails.src}\n onKeyDown={handleKeyDown}\n onLoad={() => setIsLoading(false)}\n />\n {imagePreviewDetails && (\n <p className=\"ne-image-preview__caption\">\n {imagePreviewDetails.caption}\n </p>\n )}\n </div>\n </div>,\n document.body\n );\n};\n\nexport default ImagePreview;\n","const buildLinkSVG = () => {\n const svgNS = \"http://www.w3.org/2000/svg\";\n\n const svgWrapper = document.createElement(\"span\");\n svgWrapper.classList.add(\"header-link-icon-wrapper\");\n const svg = document.createElementNS(svgNS, \"svg\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n svg.setAttribute(\"height\", \"20\");\n svg.setAttribute(\"viewBox\", \"0 0 16 16\");\n svg.setAttribute(\"width\", \"20\");\n\n const path = document.createElementNS(svgNS, \"path\");\n path.setAttribute(\n \"d\",\n \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n );\n\n svg.appendChild(path);\n svgWrapper.appendChild(svg);\n\n return svgWrapper;\n};\n\nconst convertTextToId = text =>\n text\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \"\")\n .replace(/\\s+/g, \"-\");\n\nexport const buildHeaderLinks = editorContentNode => {\n const headerTags = editorContentNode.querySelectorAll(\n \"h1, h2, h3, h4, h5, h6\"\n );\n const usedIds = new Map();\n\n headerTags.forEach(heading => {\n if (heading.getAttribute('data-link') === 'false') {\n return;\n }\n\n let headingId = convertTextToId(heading.textContent);\n if (usedIds.has(headingId)) {\n const count = usedIds.get(headingId);\n usedIds.set(headingId, count + 1);\n headingId = `${headingId}-${count}`;\n } else usedIds.set(headingId, 1);\n\n heading.setAttribute(\"id\", headingId);\n\n const anchor = document.createElement(\"a\");\n anchor.setAttribute(\"href\", `#${headingId}`);\n anchor.classList.add(\"header-wrapper-link\");\n anchor.appendChild(buildLinkSVG());\n anchor.appendChild(heading.cloneNode(true));\n\n heading.replaceWith(anchor);\n });\n};\n","import { memo, useEffect, useRef, useState } from \"react\";\n\nimport classnames from \"classnames\";\nimport DOMPurify from \"dompurify\";\nimport CopyToClipboardButton from \"neetomolecules/CopyToClipboardButton\";\nimport { isNil } from \"ramda\";\nimport { createRoot } from \"react-dom/client\";\n\nimport { EDITOR_SIZES } from \"src/common/constants\";\nimport \"src/styles/editor/editor-content.scss\";\nimport { removeEmptyTags } from \"utils\";\n\nimport {\n EDITOR_CONTENT_CLASS_NAME,\n EDITOR_CONTENT_DEFAULT_CONFIGURATION,\n SANITIZE_OPTIONS,\n} from \"./constants\";\nimport ImagePreview from \"./ImagePreview\";\nimport {\n substituteVariables,\n applyLineHighlighting,\n applySyntaxHighlightingAndLineNumbers,\n} from \"./utils\";\nimport { buildHeaderLinks } from \"./utils/headers\";\n\nconst EditorContent = ({\n content = \"\",\n variables = [],\n className,\n size = EDITOR_SIZES.SMALL,\n configuration = EDITOR_CONTENT_DEFAULT_CONFIGURATION,\n ...otherProps\n}) => {\n const [imagePreviewDetails, setImagePreviewDetails] = useState(null);\n const editorContentRef = useRef(null);\n\n const htmlContent = substituteVariables(\n applySyntaxHighlightingAndLineNumbers(removeEmptyTags(content)),\n variables\n );\n const sanitize = DOMPurify.sanitize;\n\n const injectCopyButtonToCodeBlocks = () => {\n const preTags = editorContentRef.current?.querySelectorAll(\n `.${EDITOR_CONTENT_CLASS_NAME} pre`\n );\n\n preTags.forEach(preTag => {\n const button = document.createElement(\"div\");\n button.className = \"neeto-editor-codeblock-options\";\n const root = createRoot(button);\n root.render(\n <CopyToClipboardButton\n size=\"small\"\n style=\"tertiary\"\n value={preTag.textContent}\n />\n );\n preTag.appendChild(button);\n });\n };\n\n const bindImageClickListener = () => {\n const figureTags = editorContentRef.current?.querySelectorAll(\n `.${EDITOR_CONTENT_CLASS_NAME} figure`\n );\n\n figureTags.forEach(figureTag => {\n const image = figureTag.querySelector(\"img\");\n const link = figureTag.querySelector(\"a\");\n if (isNil(image) || isNil(link)) return;\n\n figureTag.addEventListener(\"click\", event => {\n event.preventDefault();\n const caption = figureTag.querySelector(\"figcaption\").innerText;\n setImagePreviewDetails({ src: image.src, caption });\n });\n });\n };\n\n useEffect(() => {\n injectCopyButtonToCodeBlocks();\n bindImageClickListener();\n applyLineHighlighting(editorContentRef.current);\n configuration.enableHeaderLinks &&\n buildHeaderLinks(editorContentRef.current);\n }, [content]);\n\n return (\n <>\n <div\n data-cy=\"neeto-editor-content\"\n ref={editorContentRef}\n className={classnames(EDITOR_CONTENT_CLASS_NAME, {\n [className]: className,\n [`neeto-editor-size--${size}`]: true,\n })}\n dangerouslySetInnerHTML={{\n __html: sanitize(htmlContent, SANITIZE_OPTIONS),\n }}\n {...otherProps}\n />\n {imagePreviewDetails && (\n <ImagePreview {...{ imagePreviewDetails, setImagePreviewDetails }} />\n )}\n </>\n );\n};\n\nexport default memo(EditorContent);\n"],"names":["ImagePreview","_ref","imagePreviewDetails","setImagePreviewDetails","_useState","useState","_useState2","_slicedToArray","isLoading","setIsLoading","_useTranslation","useTranslation","t","imagePreviewRef","useRef","useOnClickOutside","enabled","useEffect","current","setAttribute","focus","handleKeyDown","e","stopPropagation","key","createPortal","_jsxs","className","children","_jsx","Spinner","Button","icon","Close","style","onClick","classnames","alt","ref","src","onKeyDown","onLoad","caption","document","body","buildLinkSVG","svgNS","svgWrapper","createElement","classList","add","svg","createElementNS","path","appendChild","convertTextToId","text","trim","toLowerCase","replace","buildHeaderLinks","editorContentNode","headerTags","querySelectorAll","usedIds","Map","forEach","heading","getAttribute","headingId","textContent","has","count","get","set","concat","anchor","cloneNode","replaceWith","EditorContent","_ref$content","content","_ref$variables","variables","_ref$size","size","EDITOR_SIZES","SMALL","_ref$configuration","configuration","EDITOR_CONTENT_DEFAULT_CONFIGURATION","otherProps","_objectWithoutProperties","_excluded","editorContentRef","htmlContent","substituteVariables","applySyntaxHighlightingAndLineNumbers","removeEmptyTags","sanitize","DOMPurify","injectCopyButtonToCodeBlocks","_editorContentRef$cur","preTags","EDITOR_CONTENT_CLASS_NAME","preTag","button","root","createRoot","render","CopyToClipboardButton","value","bindImageClickListener","_editorContentRef$cur2","figureTags","figureTag","image","querySelector","link","isNil","addEventListener","event","preventDefault","innerText","applyLineHighlighting","enableHeaderLinks","_Fragment","_objectSpread","_defineProperty","dangerouslySetInnerHTML","__html","SANITIZE_OPTIONS","memo"],"mappings":"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"}
@@ -8,7 +8,7 @@ import Editor from './Editor.js';
8
8
  import { jsx } from 'react/jsx-runtime';
9
9
  import '@babel/runtime/helpers/toConsumableArray';
10
10
  import '@babel/runtime/helpers/slicedToArray';
11
- import './chunk-B_ypvaUL.js';
11
+ import './chunk-C0xZGEez.js';
12
12
  import './chunk-DmrvuTKK.js';
13
13
  import 'i18next';
14
14
  import './chunk-BQZagJsZ.js';
package/dist/Menu.js CHANGED
@@ -3,7 +3,7 @@ import '@babel/runtime/helpers/toConsumableArray';
3
3
  import '@babel/runtime/helpers/slicedToArray';
4
4
  import 'react';
5
5
  import 'ramda';
6
- export { M as default } from './chunk-B_ypvaUL.js';
6
+ export { M as default } from './chunk-C0xZGEez.js';
7
7
  import './chunk-CftSm0ZU.js';
8
8
  import 'react/jsx-runtime';
9
9
  import './chunk-DmrvuTKK.js';
@@ -12270,6 +12270,30 @@ function getMarksBetween(from, to, doc) {
12270
12270
  return marks;
12271
12271
  }
12272
12272
 
12273
+ /**
12274
+ * Finds the first node of a given type or name in the current selection.
12275
+ * @param state The editor state.
12276
+ * @param typeOrName The node type or name.
12277
+ * @param pos The position to start searching from.
12278
+ * @param maxDepth The maximum depth to search.
12279
+ * @returns The node and the depth as an array.
12280
+ */
12281
+ const getNodeAtPosition = (state, typeOrName, pos, maxDepth = 20) => {
12282
+ const $pos = state.doc.resolve(pos);
12283
+ let currentDepth = maxDepth;
12284
+ let node = null;
12285
+ while (currentDepth > 0 && node === null) {
12286
+ const currentNode = $pos.node(currentDepth);
12287
+ if ((currentNode === null || currentNode === void 0 ? void 0 : currentNode.type.name) === typeOrName) {
12288
+ node = currentNode;
12289
+ }
12290
+ else {
12291
+ currentDepth -= 1;
12292
+ }
12293
+ }
12294
+ return [node, currentDepth];
12295
+ };
12296
+
12273
12297
  /**
12274
12298
  * Return attributes of an extension that should be splitted by keepOnSplit flag
12275
12299
  * @param extensionAttributes Array of extension attributes
@@ -12367,6 +12391,33 @@ function isActive(state, name, attributes = {}) {
12367
12391
  return false;
12368
12392
  }
12369
12393
 
12394
+ const isAtEndOfNode = (state, nodeType) => {
12395
+ const { $from, $to, $anchor } = state.selection;
12396
+ if (nodeType) {
12397
+ const parentNode = findParentNode(node => node.type.name === nodeType)(state.selection);
12398
+ if (!parentNode) {
12399
+ return false;
12400
+ }
12401
+ const $parentPos = state.doc.resolve(parentNode.pos + 1);
12402
+ if ($anchor.pos + 1 === $parentPos.end()) {
12403
+ return true;
12404
+ }
12405
+ return false;
12406
+ }
12407
+ if ($to.parentOffset < $to.parent.nodeSize - 2 || $from.pos !== $to.pos) {
12408
+ return false;
12409
+ }
12410
+ return true;
12411
+ };
12412
+
12413
+ const isAtStartOfNode = (state) => {
12414
+ const { $from, $to } = state.selection;
12415
+ if ($from.parentOffset > 0 || $from.pos !== $to.pos) {
12416
+ return false;
12417
+ }
12418
+ return true;
12419
+ };
12420
+
12370
12421
  function isList(name, extensions) {
12371
12422
  const { nodeExtensions } = splitExtensions(extensions);
12372
12423
  const extension = nodeExtensions.find(item => item.name === name);
@@ -19405,5 +19456,5 @@ var Menu = function Menu(props) {
19405
19456
  }));
19406
19457
  };
19407
19458
 
19408
- export { getAttributes as A, highlightFocussedNode as B, resetFocussedNode as C, DecorationSet as D, Extension as E, findParentNodeClosestToPos as F, BubbleMenu as G, getLinkPopoverPosition as H, InputRule as I, getMarkType as J, getMarkRange as K, useEditor as L, Menu as M, Node as N, useEditorState$1 as O, PasteRule as P, EditorContent as Q, ReactNodeViewRenderer as R, MediaUploader as S, EmbedOption as T, EditorView as U, Mark as a, markInputRule as b, markPasteRule as c, Decoration as d, callOrReturn as e, getExtensionField as f, getMarkAttributes as g, findChildren as h, isNodeSelection as i, NodeViewWrapper as j, keydownHandler as k, NodeViewContent as l, mergeAttributes as m, nodeInputRule as n, escapeForRegEx as o, ReactRenderer as p, EmojiPickerMenu as q, emojiPickerApi as r, liftTarget$1 as s, textblockTypeInputRule as t, combineTransactionSteps as u, validateUrl as v, wrappingInputRule as w, getChangedRanges as x, findChildrenInRange as y, getMarksBetween as z };
19409
- //# sourceMappingURL=chunk-B_ypvaUL.js.map
19459
+ export { combineTransactionSteps as A, getChangedRanges as B, findChildrenInRange as C, DecorationSet as D, Extension as E, getMarksBetween as F, getAttributes as G, highlightFocussedNode as H, InputRule as I, resetFocussedNode as J, findParentNodeClosestToPos as K, BubbleMenu as L, Menu as M, Node as N, getLinkPopoverPosition as O, PasteRule as P, getMarkType as Q, ReactNodeViewRenderer as R, getMarkRange as S, useEditor as T, useEditorState$1 as U, EditorContent as V, MediaUploader as W, EmbedOption as X, EditorView as Y, Mark as a, markInputRule as b, markPasteRule as c, Decoration as d, isAtStartOfNode as e, isAtEndOfNode as f, getMarkAttributes as g, getNodeType$1 as h, isNodeActive as i, getNodeAtPosition as j, keydownHandler as k, callOrReturn as l, mergeAttributes as m, getExtensionField as n, isNodeSelection as o, nodeInputRule as p, findChildren as q, NodeViewWrapper as r, NodeViewContent as s, textblockTypeInputRule as t, escapeForRegEx as u, validateUrl as v, wrappingInputRule as w, ReactRenderer as x, EmojiPickerMenu as y, emojiPickerApi as z };
19460
+ //# sourceMappingURL=chunk-C0xZGEez.js.map