@sparrowengg/twigs-editor-react 0.0.3 → 0.0.5

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.
@@ -80,6 +80,7 @@ function useDialogLinkEditorToolbar(editor, anchorElem, options) {
80
80
  );
81
81
  }, [editor]);
82
82
  const updateLinkEditor = react.useCallback(() => {
83
+ var _a2;
83
84
  const selection = lexical.$getSelection();
84
85
  if (lexical.$isRangeSelection(selection)) {
85
86
  const node = getSelectedNode.getSelectedNode(selection);
@@ -95,13 +96,13 @@ function useDialogLinkEditorToolbar(editor, anchorElem, options) {
95
96
  setLinkUrl("");
96
97
  }
97
98
  }
98
- const nativeSelection = window.getSelection();
99
+ const nativeSelection = lexical.getDOMSelection((_a2 = editor._window) != null ? _a2 : window);
99
100
  const { activeElement } = document;
100
101
  const rootElement = editor.getRootElement();
101
102
  if (selection !== null && nativeSelection !== null && rootElement !== null && rootElement.contains(nativeSelection.anchorNode) && editor.isEditable()) {
102
103
  setTimeout(() => {
103
- var _a2, _b2;
104
- const domRect = (_b2 = (_a2 = nativeSelection.focusNode) == null ? void 0 : _a2.parentElement) == null ? void 0 : _b2.getBoundingClientRect();
104
+ var _a3, _b2;
105
+ const domRect = (_b2 = (_a3 = nativeSelection.focusNode) == null ? void 0 : _a3.parentElement) == null ? void 0 : _b2.getBoundingClientRect();
105
106
  if (domRect && anchorElem && containerRef.current) {
106
107
  setFloatingElemPositionForLinkEditor.setFloatingElemPositionForLinkEditor(
107
108
  domRect,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/dialog-link-editor/index.tsx"],"sourcesContent":["import {\n $isAutoLinkNode,\n $isLinkNode,\n TOGGLE_LINK_COMMAND\n} from '@lexical/link';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils';\nimport { ADD_BLANK_LINK } from '@src/utils/commands';\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n BaseSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n KEY_ESCAPE_COMMAND,\n LexicalEditor,\n NodeSelection,\n RangeSelection,\n SELECTION_CHANGE_COMMAND\n} from 'lexical';\nimport {\n useCallback, useEffect, useRef, useState\n} from 'react';\nimport isURL from 'validator/es/lib/isURL';\nimport { getSelectedNode } from '@src/utils/get-selected-node';\nimport { setFloatingElemPositionForLinkEditor } from '@src/utils/set-floating-elem-position-for-link-editor';\nimport { LinkEditorDialog } from './link-editor-dialog';\nimport { LinkTooltip } from './link-tooltip';\n\nfunction useDialogLinkEditorToolbar(\n editor: LexicalEditor,\n anchorElem: HTMLElement | null,\n options?: DialogLinkEditorOptions\n) {\n const [linkUrl, setLinkUrl] = useState('');\n const [linkText, setLinkText] = useState('');\n const [isLink, setIsLink] = useState(false);\n const [lastSelection, setLastSelection] = useState<\n RangeSelection | NodeSelection | BaseSelection | null\n >(null);\n const [isLinkEditMode, setIsLinkEditMode] = useState(false);\n const [isUpdate, setIsUpdate] = useState(false);\n const [errors, setErrors] = useState({\n text: false,\n url: false\n });\n\n const isNewLink = useRef(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const containerElem = containerRef.current;\n\n useEffect(() => {\n function updateToolbar() {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode);\n if (linkParent !== null && autoLinkParent === null) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n }\n }\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateToolbar();\n });\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n ),\n editor.registerCommand(\n CLICK_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkNode = $findMatchingParent(node, $isLinkNode);\n if ($isLinkNode(linkNode)) {\n const url = linkNode.getURL();\n setLinkUrl(url);\n setLinkText(linkNode.getTextContent());\n }\n if ($isLinkNode(linkNode) && (payload.metaKey || payload.ctrlKey)) {\n window.open(linkNode.getURL(), '_blank');\n return true;\n }\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n )\n );\n }, [editor]);\n\n const updateLinkEditor = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n if ($isLinkNode(parent)) {\n setLinkText(parent.getTextContent().trim());\n setLinkUrl(parent.getURL());\n } else if ($isLinkNode(node)) {\n setLinkText(node.getTextContent().trim());\n setLinkUrl(node.getURL());\n } else {\n setLinkText('');\n setLinkUrl('');\n }\n }\n\n const nativeSelection = window.getSelection();\n const { activeElement } = document;\n\n const rootElement = editor.getRootElement();\n\n if (\n selection !== null\n && nativeSelection !== null\n && rootElement !== null\n && rootElement.contains(nativeSelection.anchorNode)\n && editor.isEditable()\n ) {\n setTimeout(() => {\n const domRect: DOMRect | undefined = nativeSelection.focusNode?.parentElement?.getBoundingClientRect();\n if (domRect && anchorElem && containerRef.current) {\n setFloatingElemPositionForLinkEditor(\n domRect,\n containerRef.current,\n anchorElem,\n 10\n );\n }\n }, 10);\n setLastSelection(selection);\n } else if (!activeElement || activeElement.className !== 'link-input') {\n setTimeout(() => {\n if (rootElement !== null && anchorElem && containerElem) {\n setFloatingElemPositionForLinkEditor(null, containerElem, anchorElem);\n }\n }, 10);\n setLastSelection(null);\n setLinkUrl('');\n }\n\n // eslint-disable-next-line consistent-return\n return true;\n }, [anchorElem, editor, setIsLinkEditMode]);\n\n useEffect(() => {\n if (!isLinkEditMode) {\n isNewLink.current = false;\n }\n }, [isLinkEditMode]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateLinkEditor();\n });\n }),\n\n editor.registerCommand(\n ADD_BLANK_LINK,\n () => {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n\n editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n (payload: string | { url: string } | null) => {\n if (typeof payload === 'string' || payload?.url) {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n } else {\n setIsLinkEditMode(false);\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateLinkEditor();\n return true;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setIsLink(false);\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n )\n );\n }, [editor, updateLinkEditor, setIsLink, isLink]);\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n updateLinkEditor();\n });\n }, [editor, updateLinkEditor]);\n\n const handleLinkSubmission = ({\n text,\n url\n }: {\n text: string;\n url: string;\n }) => {\n if (lastSelection !== null) {\n const isValidUrl = isURL(url);\n const isValidText = text.trim().length > 0;\n\n if (isValidUrl && isValidText) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n url,\n rel: options?.anchorOptions?.rel,\n target: options?.anchorOptions?.target,\n title: options?.anchorOptions?.title\n });\n editor.update(() => {\n if ($isRangeSelection(lastSelection)) {\n const textNode = getSelectedNode(lastSelection);\n if ($isTextNode(textNode)) {\n textNode.setTextContent(text);\n }\n }\n });\n setErrors({\n text: false,\n url: false\n });\n setTimeout(() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n }, 50);\n } else {\n setErrors({\n text: !isValidText,\n url: !isValidUrl\n });\n }\n }\n };\n\n if (!anchorElem) return null;\n\n return (\n <>\n {isLink && !isLinkEditMode && (\n <LinkTooltip\n anchorElem={anchorElem}\n containerRef={containerRef}\n handleDelete={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n handleEdit={() => {\n setIsLinkEditMode(true);\n setIsUpdate(true);\n }}\n linkUrl={linkUrl}\n https={options?.anchorOptions?.https || false}\n />\n )}\n {isLinkEditMode && (\n <LinkEditorDialog\n handleLinkSubmission={handleLinkSubmission}\n linkText={linkText}\n linkUrl={linkUrl}\n open={isLink && isLinkEditMode}\n closeModal={() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n if (isNewLink.current) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n isUpdate={isUpdate}\n setIsLinkEditMode={setIsLinkEditMode}\n textLabel={options?.dialogProps?.textLabel || 'Link text'}\n urlLabel={options?.dialogProps?.urlLabel || 'Link URL'}\n removeLink={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n errors={errors}\n saveLabel={options?.dialogProps?.saveLabel || 'Save'}\n cancelLabel={options?.dialogProps?.cancelLabel || 'Cancel'}\n updateLabel={options?.dialogProps?.updateLabel || 'Update'}\n title={options?.dialogProps?.title || 'Add Link'}\n errorLabels={options?.dialogProps?.errorLabels}\n />\n )}\n </>\n );\n}\n\nexport type DialogLinkEditorOptions = {\n dialogProps?: {\n textLabel?: string;\n urlLabel?: string;\n saveLabel?: string;\n cancelLabel?: string;\n updateLabel?: string;\n title?: string;\n errorLabels?: {\n text?: string;\n url?: string;\n };\n };\n anchorOptions?: {\n rel?: string;\n target?: string;\n title?: string;\n https?: boolean;\n };\n};\n\nexport function DialogLinkEditor({\n anchorElem = document.body,\n options\n}: {\n anchorElem?: HTMLElement | null;\n options?: DialogLinkEditorOptions;\n}) {\n const [editor] = useLexicalComposerContext();\n return useDialogLinkEditorToolbar(editor, anchorElem, options);\n}\n"],"names":["useState","useRef","useEffect","$getSelection","$isRangeSelection","getSelectedNode","$findMatchingParent","$isLinkNode","$isAutoLinkNode","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_CRITICAL","CLICK_COMMAND","COMMAND_PRIORITY_LOW","useCallback","_a","_b","setFloatingElemPositionForLinkEditor","ADD_BLANK_LINK","COMMAND_PRIORITY_HIGH","TOGGLE_LINK_COMMAND","KEY_ESCAPE_COMMAND","_c","isURL","$isTextNode","jsxs","Fragment","jsx","LinkTooltip","LinkEditorDialog","useLexicalComposerContext"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/dialog-link-editor/index.tsx"],"sourcesContent":["import {\n $isAutoLinkNode,\n $isLinkNode,\n TOGGLE_LINK_COMMAND\n} from '@lexical/link';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils';\nimport { ADD_BLANK_LINK } from '@src/utils/commands';\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n BaseSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n KEY_ESCAPE_COMMAND,\n LexicalEditor,\n NodeSelection,\n RangeSelection,\n SELECTION_CHANGE_COMMAND,\n getDOMSelection\n} from 'lexical';\nimport {\n useCallback, useEffect, useRef, useState\n} from 'react';\nimport isURL from 'validator/es/lib/isURL';\nimport { getSelectedNode } from '@src/utils/get-selected-node';\nimport { setFloatingElemPositionForLinkEditor } from '@src/utils/set-floating-elem-position-for-link-editor';\nimport { LinkEditorDialog } from './link-editor-dialog';\nimport { LinkTooltip } from './link-tooltip';\n\nfunction useDialogLinkEditorToolbar(\n editor: LexicalEditor,\n anchorElem: HTMLElement | null,\n options?: DialogLinkEditorOptions\n) {\n const [linkUrl, setLinkUrl] = useState('');\n const [linkText, setLinkText] = useState('');\n const [isLink, setIsLink] = useState(false);\n const [lastSelection, setLastSelection] = useState<\n RangeSelection | NodeSelection | BaseSelection | null\n >(null);\n const [isLinkEditMode, setIsLinkEditMode] = useState(false);\n const [isUpdate, setIsUpdate] = useState(false);\n const [errors, setErrors] = useState({\n text: false,\n url: false\n });\n\n const isNewLink = useRef(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const containerElem = containerRef.current;\n\n useEffect(() => {\n function updateToolbar() {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode);\n if (linkParent !== null && autoLinkParent === null) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n }\n }\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateToolbar();\n });\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n ),\n editor.registerCommand(\n CLICK_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkNode = $findMatchingParent(node, $isLinkNode);\n if ($isLinkNode(linkNode)) {\n const url = linkNode.getURL();\n setLinkUrl(url);\n setLinkText(linkNode.getTextContent());\n }\n if ($isLinkNode(linkNode) && (payload.metaKey || payload.ctrlKey)) {\n window.open(linkNode.getURL(), '_blank');\n return true;\n }\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n )\n );\n }, [editor]);\n\n const updateLinkEditor = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n if ($isLinkNode(parent)) {\n setLinkText(parent.getTextContent().trim());\n setLinkUrl(parent.getURL());\n } else if ($isLinkNode(node)) {\n setLinkText(node.getTextContent().trim());\n setLinkUrl(node.getURL());\n } else {\n setLinkText('');\n setLinkUrl('');\n }\n }\n\n const nativeSelection = getDOMSelection(editor._window ?? window);\n const { activeElement } = document;\n\n const rootElement = editor.getRootElement();\n\n if (\n selection !== null\n && nativeSelection !== null\n && rootElement !== null\n && rootElement.contains(nativeSelection.anchorNode)\n && editor.isEditable()\n ) {\n setTimeout(() => {\n const domRect: DOMRect | undefined = nativeSelection.focusNode?.parentElement?.getBoundingClientRect();\n if (domRect && anchorElem && containerRef.current) {\n setFloatingElemPositionForLinkEditor(\n domRect,\n containerRef.current,\n anchorElem,\n 10\n );\n }\n }, 10);\n setLastSelection(selection);\n } else if (!activeElement || activeElement.className !== 'link-input') {\n setTimeout(() => {\n if (rootElement !== null && anchorElem && containerElem) {\n setFloatingElemPositionForLinkEditor(null, containerElem, anchorElem);\n }\n }, 10);\n setLastSelection(null);\n setLinkUrl('');\n }\n\n // eslint-disable-next-line consistent-return\n return true;\n }, [anchorElem, editor, setIsLinkEditMode]);\n\n useEffect(() => {\n if (!isLinkEditMode) {\n isNewLink.current = false;\n }\n }, [isLinkEditMode]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateLinkEditor();\n });\n }),\n\n editor.registerCommand(\n ADD_BLANK_LINK,\n () => {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n\n editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n (payload: string | { url: string } | null) => {\n if (typeof payload === 'string' || payload?.url) {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n } else {\n setIsLinkEditMode(false);\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateLinkEditor();\n return true;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setIsLink(false);\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n )\n );\n }, [editor, updateLinkEditor, setIsLink, isLink]);\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n updateLinkEditor();\n });\n }, [editor, updateLinkEditor]);\n\n const handleLinkSubmission = ({\n text,\n url\n }: {\n text: string;\n url: string;\n }) => {\n if (lastSelection !== null) {\n const isValidUrl = isURL(url);\n const isValidText = text.trim().length > 0;\n\n if (isValidUrl && isValidText) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n url,\n rel: options?.anchorOptions?.rel,\n target: options?.anchorOptions?.target,\n title: options?.anchorOptions?.title\n });\n editor.update(() => {\n if ($isRangeSelection(lastSelection)) {\n const textNode = getSelectedNode(lastSelection);\n if ($isTextNode(textNode)) {\n textNode.setTextContent(text);\n }\n }\n });\n setErrors({\n text: false,\n url: false\n });\n setTimeout(() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n }, 50);\n } else {\n setErrors({\n text: !isValidText,\n url: !isValidUrl\n });\n }\n }\n };\n\n if (!anchorElem) return null;\n\n return (\n <>\n {isLink && !isLinkEditMode && (\n <LinkTooltip\n anchorElem={anchorElem}\n containerRef={containerRef}\n handleDelete={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n handleEdit={() => {\n setIsLinkEditMode(true);\n setIsUpdate(true);\n }}\n linkUrl={linkUrl}\n https={options?.anchorOptions?.https || false}\n />\n )}\n {isLinkEditMode && (\n <LinkEditorDialog\n handleLinkSubmission={handleLinkSubmission}\n linkText={linkText}\n linkUrl={linkUrl}\n open={isLink && isLinkEditMode}\n closeModal={() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n if (isNewLink.current) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n isUpdate={isUpdate}\n setIsLinkEditMode={setIsLinkEditMode}\n textLabel={options?.dialogProps?.textLabel || 'Link text'}\n urlLabel={options?.dialogProps?.urlLabel || 'Link URL'}\n removeLink={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n errors={errors}\n saveLabel={options?.dialogProps?.saveLabel || 'Save'}\n cancelLabel={options?.dialogProps?.cancelLabel || 'Cancel'}\n updateLabel={options?.dialogProps?.updateLabel || 'Update'}\n title={options?.dialogProps?.title || 'Add Link'}\n errorLabels={options?.dialogProps?.errorLabels}\n />\n )}\n </>\n );\n}\n\nexport type DialogLinkEditorOptions = {\n dialogProps?: {\n textLabel?: string;\n urlLabel?: string;\n saveLabel?: string;\n cancelLabel?: string;\n updateLabel?: string;\n title?: string;\n errorLabels?: {\n text?: string;\n url?: string;\n };\n };\n anchorOptions?: {\n rel?: string;\n target?: string;\n title?: string;\n https?: boolean;\n };\n};\n\nexport function DialogLinkEditor({\n anchorElem = document.body,\n options\n}: {\n anchorElem?: HTMLElement | null;\n options?: DialogLinkEditorOptions;\n}) {\n const [editor] = useLexicalComposerContext();\n return useDialogLinkEditorToolbar(editor, anchorElem, options);\n}\n"],"names":["useState","useRef","useEffect","$getSelection","$isRangeSelection","getSelectedNode","$findMatchingParent","$isLinkNode","$isAutoLinkNode","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_CRITICAL","CLICK_COMMAND","COMMAND_PRIORITY_LOW","useCallback","_a","getDOMSelection","_b","setFloatingElemPositionForLinkEditor","ADD_BLANK_LINK","COMMAND_PRIORITY_HIGH","TOGGLE_LINK_COMMAND","KEY_ESCAPE_COMMAND","_c","isURL","$isTextNode","jsxs","Fragment","jsx","LinkTooltip","LinkEditorDialog","useLexicalComposerContext"],"mappings":"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"}
@@ -65,6 +65,9 @@ const RichEditor = ({
65
65
  listStyle: "disc",
66
66
  marginLeft: "$7",
67
67
  ul: {
68
+ listStyle: "square"
69
+ },
70
+ "&.level-2": {
68
71
  listStyle: "circle"
69
72
  }
70
73
  },
@@ -75,6 +78,9 @@ const RichEditor = ({
75
78
  listStyle: "lower-alpha"
76
79
  }
77
80
  },
81
+ ".block-nested-listitem": {
82
+ listStyle: "none"
83
+ },
78
84
  ".text-code": {
79
85
  color: "#F97316",
80
86
  padding: "0 $2",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/rich-editor/index.tsx"],"sourcesContent":["import { ContentEditable } from '@lexical/react/LexicalContentEditable';\nimport { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary';\nimport { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin';\nimport { ReactNode, RefObject, isValidElement } from 'react';\nimport { Box, BoxProps } from '@sparrowengg/twigs-react';\n\nexport const RichEditor = ({\n containerRef,\n placeholder,\n editorContainerProps\n}: {\n containerRef?:\n | ((instance: HTMLDivElement | null) => void)\n | RefObject<HTMLDivElement>;\n placeholder?: ReactNode | string;\n editorContainerProps?: BoxProps;\n}) => {\n return (\n <Box\n {...editorContainerProps}\n css={{\n position: 'relative',\n ...editorContainerProps?.css\n }}\n >\n <RichTextPlugin\n contentEditable={(\n <Box className=\"editor-container\">\n <Box\n className=\"editor\"\n css={{\n position: 'relative',\n borderRadius: '$md',\n border: '1px solid $neutral200',\n textAlign: 'left',\n\n '& .text-bold': {\n fontWeight: 'bold'\n },\n '& .text-italic': {\n fontStyle: 'italic'\n },\n '& .text-underline': {\n textDecoration: 'underline'\n },\n p: {\n margin: '$1 0'\n },\n ul: {\n listStyle: 'disc',\n marginLeft: '$7',\n\n ul: {\n listStyle: 'circle'\n }\n },\n ol: {\n listStyle: 'decimal',\n marginLeft: '$7',\n\n ol: {\n listStyle: 'lower-alpha'\n }\n },\n '.text-code': {\n color: '#F97316',\n padding: '0 $2',\n backgroundColor: '$neutral100',\n border: '1px solid $neutral200',\n borderRadius: '$sm',\n\n '&, & *': {\n fontFamily: 'monospace'\n }\n },\n '.block-code': {\n padding: '$4',\n display: 'block',\n color: '$neutral900',\n backgroundColor: '$neutral100',\n border: '1px solid $neutral200',\n borderRadius: '$md',\n\n '&, & *': {\n fontFamily: 'monospace'\n }\n },\n '.block-h1': {\n fontSize: '$xl'\n },\n '.block-h2': {\n fontSize: '$lg'\n },\n '.block-h3, .block-h4, .block-h5, .block-h6': {\n fontSize: '$md'\n }\n }}\n ref={containerRef}\n >\n <ContentEditable\n style={{\n minHeight: '120px',\n padding: '12px'\n }}\n />\n </Box>\n </Box>\n )}\n ErrorBoundary={LexicalErrorBoundary}\n placeholder={\n !isValidElement(placeholder) ? (\n <Box\n css={{\n position: 'absolute',\n top: '12px',\n left: '12px',\n color: '$black500',\n pointerEvents: 'none'\n }}\n >\n {placeholder}\n </Box>\n ) : (\n placeholder\n )\n }\n />\n </Box>\n );\n};\n"],"names":["jsx","Box","RichTextPlugin","ContentEditable","LexicalErrorBoundary","isValidElement"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMO,MAAM,aAAa,CAAC;AAAA,EACzB,YAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAMM,KAAA;AACJ,EACE,uBAAAA,cAAA;AAAA,IAACC,cAAA;AAAA,IAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACK,oBADL,CAAA,EAAA;AAAA,MAEC,GAAK,EAAA,cAAA,CAAA;AAAA,QACH,QAAU,EAAA;AAAA,OAAA,EACP,oBAAsB,IAAA,IAAA,GAAA,MAAA,GAAA,oBAAA,CAAA,GAAA,CAAA;AAAA,MAG3B,QAAA,kBAAAD,cAAA;AAAA,QAACE,oCAAA;AAAA,QAAA;AAAA,UACC,eACE,kBAAAF,cAAA,CAACC,cAAI,EAAA,EAAA,SAAA,EAAU,kBACb,EAAA,QAAA,kBAAAD,cAAA;AAAA,YAACC,cAAA;AAAA,YAAA;AAAA,cACC,SAAU,EAAA,QAAA;AAAA,cACV,GAAK,EAAA;AAAA,gBACH,QAAU,EAAA,UAAA;AAAA,gBACV,YAAc,EAAA,KAAA;AAAA,gBACd,MAAQ,EAAA,uBAAA;AAAA,gBACR,SAAW,EAAA,MAAA;AAAA,gBAEX,cAAgB,EAAA;AAAA,kBACd,UAAY,EAAA;AAAA,iBACd;AAAA,gBACA,gBAAkB,EAAA;AAAA,kBAChB,SAAW,EAAA;AAAA,iBACb;AAAA,gBACA,mBAAqB,EAAA;AAAA,kBACnB,cAAgB,EAAA;AAAA,iBAClB;AAAA,gBACA,CAAG,EAAA;AAAA,kBACD,MAAQ,EAAA;AAAA,iBACV;AAAA,gBACA,EAAI,EAAA;AAAA,kBACF,SAAW,EAAA,MAAA;AAAA,kBACX,UAAY,EAAA,IAAA;AAAA,kBAEZ,EAAI,EAAA;AAAA,oBACF,SAAW,EAAA;AAAA;AACb,iBACF;AAAA,gBACA,EAAI,EAAA;AAAA,kBACF,SAAW,EAAA,SAAA;AAAA,kBACX,UAAY,EAAA,IAAA;AAAA,kBAEZ,EAAI,EAAA;AAAA,oBACF,SAAW,EAAA;AAAA;AACb,iBACF;AAAA,gBACA,YAAc,EAAA;AAAA,kBACZ,KAAO,EAAA,SAAA;AAAA,kBACP,OAAS,EAAA,MAAA;AAAA,kBACT,eAAiB,EAAA,aAAA;AAAA,kBACjB,MAAQ,EAAA,uBAAA;AAAA,kBACR,YAAc,EAAA,KAAA;AAAA,kBAEd,QAAU,EAAA;AAAA,oBACR,UAAY,EAAA;AAAA;AACd,iBACF;AAAA,gBACA,aAAe,EAAA;AAAA,kBACb,OAAS,EAAA,IAAA;AAAA,kBACT,OAAS,EAAA,OAAA;AAAA,kBACT,KAAO,EAAA,aAAA;AAAA,kBACP,eAAiB,EAAA,aAAA;AAAA,kBACjB,MAAQ,EAAA,uBAAA;AAAA,kBACR,YAAc,EAAA,KAAA;AAAA,kBAEd,QAAU,EAAA;AAAA,oBACR,UAAY,EAAA;AAAA;AACd,iBACF;AAAA,gBACA,WAAa,EAAA;AAAA,kBACX,QAAU,EAAA;AAAA,iBACZ;AAAA,gBACA,WAAa,EAAA;AAAA,kBACX,QAAU,EAAA;AAAA,iBACZ;AAAA,gBACA,4CAA8C,EAAA;AAAA,kBAC5C,QAAU,EAAA;AAAA;AACZ,eACF;AAAA,cACA,GAAK,EAAA,YAAA;AAAA,cAEL,QAAA,kBAAAD,cAAA;AAAA,gBAACG,sCAAA;AAAA,gBAAA;AAAA,kBACC,KAAO,EAAA;AAAA,oBACL,SAAW,EAAA,OAAA;AAAA,oBACX,OAAS,EAAA;AAAA;AACX;AAAA;AACF;AAAA,WAEJ,EAAA,CAAA;AAAA,UAEF,aAAe,EAAAC,yCAAA;AAAA,UACf,WACE,EAAA,CAACC,oBAAe,CAAA,WAAW,CACzB,mBAAAL,cAAA;AAAA,YAACC,cAAA;AAAA,YAAA;AAAA,cACC,GAAK,EAAA;AAAA,gBACH,QAAU,EAAA,UAAA;AAAA,gBACV,GAAK,EAAA,MAAA;AAAA,gBACL,IAAM,EAAA,MAAA;AAAA,gBACN,KAAO,EAAA,WAAA;AAAA,gBACP,aAAe,EAAA;AAAA,eACjB;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WAGH,GAAA;AAAA;AAAA;AAGN,KAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/rich-editor/index.tsx"],"sourcesContent":["import { ContentEditable } from '@lexical/react/LexicalContentEditable';\nimport { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary';\nimport { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin';\nimport { ReactNode, RefObject, isValidElement } from 'react';\nimport { Box, BoxProps } from '@sparrowengg/twigs-react';\n\nexport const RichEditor = ({\n containerRef,\n placeholder,\n editorContainerProps\n}: {\n containerRef?:\n | ((instance: HTMLDivElement | null) => void)\n | RefObject<HTMLDivElement>;\n placeholder?: ReactNode | string;\n editorContainerProps?: BoxProps;\n}) => {\n return (\n <Box\n {...editorContainerProps}\n css={{\n position: 'relative',\n ...editorContainerProps?.css\n }}\n >\n <RichTextPlugin\n contentEditable={(\n <Box className=\"editor-container\">\n <Box\n className=\"editor\"\n css={{\n position: 'relative',\n borderRadius: '$md',\n border: '1px solid $neutral200',\n textAlign: 'left',\n\n '& .text-bold': {\n fontWeight: 'bold'\n },\n '& .text-italic': {\n fontStyle: 'italic'\n },\n '& .text-underline': {\n textDecoration: 'underline'\n },\n p: {\n margin: '$1 0'\n },\n ul: {\n listStyle: 'disc',\n marginLeft: '$7',\n\n ul: {\n listStyle: 'square'\n },\n\n '&.level-2': {\n listStyle: 'circle'\n }\n },\n ol: {\n listStyle: 'decimal',\n marginLeft: '$7',\n\n ol: {\n listStyle: 'lower-alpha'\n }\n },\n '.block-nested-listitem': {\n listStyle: 'none'\n },\n '.text-code': {\n color: '#F97316',\n padding: '0 $2',\n backgroundColor: '$neutral100',\n border: '1px solid $neutral200',\n borderRadius: '$sm',\n\n '&, & *': {\n fontFamily: 'monospace'\n }\n },\n '.block-code': {\n padding: '$4',\n display: 'block',\n color: '$neutral900',\n backgroundColor: '$neutral100',\n border: '1px solid $neutral200',\n borderRadius: '$md',\n\n '&, & *': {\n fontFamily: 'monospace'\n }\n },\n '.block-h1': {\n fontSize: '$xl'\n },\n '.block-h2': {\n fontSize: '$lg'\n },\n '.block-h3, .block-h4, .block-h5, .block-h6': {\n fontSize: '$md'\n }\n }}\n ref={containerRef}\n >\n <ContentEditable\n style={{\n minHeight: '120px',\n padding: '12px'\n }}\n />\n </Box>\n </Box>\n )}\n ErrorBoundary={LexicalErrorBoundary}\n placeholder={\n !isValidElement(placeholder) ? (\n <Box\n css={{\n position: 'absolute',\n top: '12px',\n left: '12px',\n color: '$black500',\n pointerEvents: 'none'\n }}\n >\n {placeholder}\n </Box>\n ) : (\n placeholder\n )\n }\n />\n </Box>\n );\n};\n"],"names":["jsx","Box","RichTextPlugin","ContentEditable","LexicalErrorBoundary","isValidElement"],"mappings":"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"}
@@ -78,7 +78,13 @@ const initialConfig = {
78
78
  list: {
79
79
  ol: "block-ol",
80
80
  ul: "block-ul",
81
- listitem: "block-listitem"
81
+ listitem: "block-listitem",
82
+ nested: {
83
+ list: "block-nested-list",
84
+ listitem: "block-nested-listitem"
85
+ },
86
+ olDepth: ["level-1", "level-2", "level-3", "level-4", "level-5", "level-6", "level-7", "level-8", "level-9", "level-10"],
87
+ ulDepth: ["level-1", "level-2", "level-3", "level-4", "level-5", "level-6", "level-7", "level-8", "level-9", "level-10"]
82
88
  }
83
89
  },
84
90
  onError: (err) => {
@@ -1 +1 @@
1
- {"version":3,"file":"editor.js","sources":["../../src/editor.tsx"],"sourcesContent":["import { AutoLinkNode, LinkNode } from '@lexical/link';\nimport { ListItemNode, ListNode } from '@lexical/list';\nimport { ClearEditorPlugin } from '@lexical/react/LexicalClearEditorPlugin';\nimport {\n InitialConfigType,\n InitialEditorStateType,\n LexicalComposer\n} from '@lexical/react/LexicalComposer';\nimport { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin';\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin';\nimport { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin';\nimport { HeadingNode } from '@lexical/rich-text';\n\nimport { CodeNode } from '@lexical/code';\nimport { EditorState, LexicalEditor } from 'lexical';\nimport {\n Fragment, ReactNode, RefObject, useMemo\n} from 'react';\nimport {\n AutoLinkPlugin,\n DataManagementPlugin,\n DataManagementPluginHandle,\n LinkPlugin,\n TabFocusPlugin\n} from './plugins';\n\nimport { ToolbarContextPlugin } from './components';\n\nconst initialConfig: InitialConfigType = {\n namespace: 'TwigsEditor',\n theme: {\n text: {\n bold: 'text-bold',\n italic: 'text-italic',\n underline: 'text-underline',\n code: 'text-code',\n base: 'text-base',\n highlight: 'text-highlight',\n strikethrough: 'text-strikethrough',\n subscript: 'text-subscript',\n superscript: 'text-superscript',\n underlineStrikethrough: 'text-underline-strikethrough'\n },\n code: 'block-code',\n quote: 'block-quote',\n heading: {\n h1: 'block-h1',\n h2: 'block-h2',\n h3: 'block-h3',\n h4: 'block-h4',\n h5: 'block-h5',\n h6: 'block-h6'\n },\n list: {\n ol: 'block-ol',\n ul: 'block-ul',\n listitem: 'block-listitem'\n }\n },\n onError: (err) => {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n};\n\nlet featureId = 0;\n\nconst featuresToNodeMapping = {\n heading: {\n node: HeadingNode,\n component: null\n },\n list: {\n node: [ListNode, ListItemNode],\n component: ListPlugin\n },\n link: {\n node: [LinkNode, AutoLinkNode],\n component: [AutoLinkPlugin, LinkPlugin]\n },\n code: {\n node: [CodeNode],\n component: null\n }\n};\n\nexport interface EditorProps {\n initialEditorState?: InitialEditorStateType;\n onChange?: (\n newEditorState: EditorState,\n editor: LexicalEditor,\n tags: Set<string>\n ) => void;\n editable?: boolean;\n children?: ReactNode;\n nodes?: InitialConfigType['nodes'];\n features?: (keyof typeof featuresToNodeMapping)[];\n dataManagementRef?: RefObject<DataManagementPluginHandle>;\n onChangePluginProps?: {\n ignoreHistoryMergeTagChange?: boolean;\n ignoreSelectionChange?: boolean;\n };\n}\n\nexport const Editor = ({\n nodes,\n onChange,\n editable,\n features,\n children,\n initialEditorState,\n dataManagementRef,\n onChangePluginProps\n}: EditorProps) => {\n const supportedFeatures = useMemo(() => {\n if (features) {\n const selectedNodes = features\n .map((item) => featuresToNodeMapping[item].node)\n .flat();\n\n const selectedPlugins = features\n .map((item) => featuresToNodeMapping[item].component)\n .flat()\n .map((item) => ({ component: item, id: featureId++ }));\n\n return { nodes: selectedNodes, components: selectedPlugins };\n }\n\n const defaultFeatures = {\n nodes: Object.values(featuresToNodeMapping)\n .map((item) => item.node)\n .flat(),\n components: Object.values(featuresToNodeMapping)\n .map((item) => item.component)\n .flat()\n .map((item) => ({ component: item, id: featureId++ }))\n };\n\n return defaultFeatures;\n }, [features]);\n\n return (\n <LexicalComposer\n initialConfig={{\n ...initialConfig,\n editorState: initialEditorState,\n editable,\n nodes: [...supportedFeatures.nodes, ...(nodes ?? [])]\n }}\n >\n <ToolbarContextPlugin>\n <HistoryPlugin />\n <ClearEditorPlugin />\n <DataManagementPlugin ref={dataManagementRef} />\n <TabFocusPlugin />\n <>\n {onChange && (\n <OnChangePlugin onChange={onChange} {...onChangePluginProps} />\n )}\n </>\n <>\n {supportedFeatures.components.map((comp) => {\n const ToolComponent = comp.component;\n if (ToolComponent) {\n return <ToolComponent key={comp.id} />;\n }\n\n return <Fragment key={comp.id} />;\n })}\n </>\n <>{children}</>\n </ToolbarContextPlugin>\n </LexicalComposer>\n );\n};\n"],"names":["HeadingNode","ListNode","ListItemNode","ListPlugin","LinkNode","AutoLinkNode","AutoLinkPlugin","LinkPlugin","CodeNode","useMemo","jsx","LexicalComposer","ToolbarContextPlugin","HistoryPlugin","ClearEditorPlugin","DataManagementPlugin","TabFocusPlugin","OnChangePlugin","Fragment"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAM,aAAmC,GAAA;AAAA,EACvC,SAAW,EAAA,aAAA;AAAA,EACX,KAAO,EAAA;AAAA,IACL,IAAM,EAAA;AAAA,MACJ,IAAM,EAAA,WAAA;AAAA,MACN,MAAQ,EAAA,aAAA;AAAA,MACR,SAAW,EAAA,gBAAA;AAAA,MACX,IAAM,EAAA,WAAA;AAAA,MACN,IAAM,EAAA,WAAA;AAAA,MACN,SAAW,EAAA,gBAAA;AAAA,MACX,aAAe,EAAA,oBAAA;AAAA,MACf,SAAW,EAAA,gBAAA;AAAA,MACX,WAAa,EAAA,kBAAA;AAAA,MACb,sBAAwB,EAAA;AAAA,KAC1B;AAAA,IACA,IAAM,EAAA,YAAA;AAAA,IACN,KAAO,EAAA,aAAA;AAAA,IACP,OAAS,EAAA;AAAA,MACP,EAAI,EAAA,UAAA;AAAA,MACJ,EAAI,EAAA,UAAA;AAAA,MACJ,EAAI,EAAA,UAAA;AAAA,MACJ,EAAI,EAAA,UAAA;AAAA,MACJ,EAAI,EAAA,UAAA;AAAA,MACJ,EAAI,EAAA;AAAA,KACN;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,EAAI,EAAA,UAAA;AAAA,MACJ,EAAI,EAAA,UAAA;AAAA,MACJ,QAAU,EAAA;AAAA;AACZ,GACF;AAAA,EACA,OAAA,EAAS,CAAC,GAAQ,KAAA;AAEhB,IAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA;AAErB,CAAA;AAEA,IAAI,SAAY,GAAA,CAAA;AAEhB,MAAM,qBAAwB,GAAA;AAAA,EAC5B,OAAS,EAAA;AAAA,IACP,IAAM,EAAAA,oBAAA;AAAA,IACN,SAAW,EAAA;AAAA,GACb;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,IAAA,EAAM,CAACC,aAAA,EAAUC,iBAAY,CAAA;AAAA,IAC7B,SAAW,EAAAC;AAAA,GACb;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,IAAA,EAAM,CAACC,eAAA,EAAUC,mBAAY,CAAA;AAAA,IAC7B,SAAA,EAAW,CAACC,uBAAA,EAAgBC,eAAU;AAAA,GACxC;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,IAAA,EAAM,CAACC,aAAQ,CAAA;AAAA,IACf,SAAW,EAAA;AAAA;AAEf,CAAA;AAoBO,MAAM,SAAS,CAAC;AAAA,EACrB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAmB,KAAA;AACjB,EAAM,MAAA,iBAAA,GAAoBC,cAAQ,MAAM;AACtC,IAAA,IAAI,QAAU,EAAA;AACZ,MAAM,MAAA,aAAA,GAAgB,QACnB,CAAA,GAAA,CAAI,CAAC,IAAA,KAAS,sBAAsB,IAAI,CAAA,CAAE,IAAI,CAAA,CAC9C,IAAK,EAAA;AAER,MAAM,MAAA,eAAA,GAAkB,SACrB,GAAI,CAAA,CAAC,SAAS,qBAAsB,CAAA,IAAI,EAAE,SAAS,CAAA,CACnD,MACA,CAAA,GAAA,CAAI,CAAC,IAAU,MAAA,EAAE,WAAW,IAAM,EAAA,EAAA,EAAI,aAAc,CAAA,CAAA;AAEvD,MAAA,OAAO,EAAE,KAAA,EAAO,aAAe,EAAA,UAAA,EAAY,eAAgB,EAAA;AAAA;AAG7D,IAAA,MAAM,eAAkB,GAAA;AAAA,MACtB,KAAA,EAAO,MAAO,CAAA,MAAA,CAAO,qBAAqB,CAAA,CACvC,GAAI,CAAA,CAAC,IAAS,KAAA,IAAA,CAAK,IAAI,CAAA,CACvB,IAAK,EAAA;AAAA,MACR,UAAA,EAAY,OAAO,MAAO,CAAA,qBAAqB,EAC5C,GAAI,CAAA,CAAC,SAAS,IAAK,CAAA,SAAS,EAC5B,IAAK,EAAA,CACL,IAAI,CAAC,IAAA,MAAU,EAAE,SAAW,EAAA,IAAA,EAAM,EAAI,EAAA,SAAA,EAAA,EAAc,CAAA;AAAA,KACzD;AAEA,IAAO,OAAA,eAAA;AAAA,GACT,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EACE,uBAAAC,cAAA;AAAA,IAACC,+BAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAe,iCACV,aADU,CAAA,EAAA;AAAA,QAEb,WAAa,EAAA,kBAAA;AAAA,QACb,QAAA;AAAA,QACA,KAAA,EAAO,CAAC,GAAG,iBAAA,CAAkB,OAAO,GAAI,KAAA,IAAA,IAAA,GAAA,KAAA,GAAS,EAAG;AAAA,OACtD,CAAA;AAAA,MAEA,0CAACC,4BACC,EAAA,EAAA,QAAA,EAAA;AAAA,wBAAAF,cAAA,CAACG,kCAAc,EAAA,EAAA,CAAA;AAAA,uCACdC,0CAAkB,EAAA,EAAA,CAAA;AAAA,wBACnBJ,cAAA,CAACK,0BAAqB,EAAA,EAAA,GAAA,EAAK,iBAAmB,EAAA,CAAA;AAAA,uCAC7CC,sBAAe,EAAA,EAAA,CAAA;AAAA,8DAEb,QACC,EAAA,QAAA,oBAAAN,cAAA,CAACO,oCAAe,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,EAAwB,oBAAqB,CAEjE,EAAA,CAAA;AAAA,wBAEGP,cAAA,CAAAQ,mBAAA,EAAA,EAAA,QAAA,EAAA,iBAAA,CAAkB,UAAW,CAAA,GAAA,CAAI,CAAC,IAAS,KAAA;AAC1C,UAAA,MAAM,gBAAgB,IAAK,CAAA,SAAA;AAC3B,UAAA,IAAI,aAAe,EAAA;AACjB,YAAO,uBAAAR,cAAA,CAAC,aAAmB,EAAA,EAAA,EAAA,IAAA,CAAK,EAAI,CAAA;AAAA;AAGtC,UAAA,uBAAQQ,cAAAA,CAAAA,cAAAA,EAAA,EAAc,EAAA,IAAA,CAAK,EAAI,CAAA;AAAA,SAChC,CACH,EAAA,CAAA;AAAA,8DACG,QAAS,EAAA;AAAA,OACd,EAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"editor.js","sources":["../../src/editor.tsx"],"sourcesContent":["import { AutoLinkNode, LinkNode } from '@lexical/link';\nimport { ListItemNode, ListNode } from '@lexical/list';\nimport { ClearEditorPlugin } from '@lexical/react/LexicalClearEditorPlugin';\nimport {\n InitialConfigType,\n InitialEditorStateType,\n LexicalComposer\n} from '@lexical/react/LexicalComposer';\nimport { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin';\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin';\nimport { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin';\nimport { HeadingNode } from '@lexical/rich-text';\n\nimport { CodeNode } from '@lexical/code';\nimport { EditorState, LexicalEditor } from 'lexical';\nimport {\n Fragment, ReactNode, RefObject, useMemo\n} from 'react';\nimport {\n AutoLinkPlugin,\n DataManagementPlugin,\n DataManagementPluginHandle,\n LinkPlugin,\n TabFocusPlugin\n} from './plugins';\n\nimport { ToolbarContextPlugin } from './components';\n\nconst initialConfig: InitialConfigType = {\n namespace: 'TwigsEditor',\n theme: {\n text: {\n bold: 'text-bold',\n italic: 'text-italic',\n underline: 'text-underline',\n code: 'text-code',\n base: 'text-base',\n highlight: 'text-highlight',\n strikethrough: 'text-strikethrough',\n subscript: 'text-subscript',\n superscript: 'text-superscript',\n underlineStrikethrough: 'text-underline-strikethrough'\n },\n code: 'block-code',\n quote: 'block-quote',\n heading: {\n h1: 'block-h1',\n h2: 'block-h2',\n h3: 'block-h3',\n h4: 'block-h4',\n h5: 'block-h5',\n h6: 'block-h6'\n },\n list: {\n ol: 'block-ol',\n ul: 'block-ul',\n listitem: 'block-listitem',\n nested: {\n list: 'block-nested-list',\n listitem: 'block-nested-listitem'\n },\n olDepth: ['level-1', 'level-2', 'level-3', 'level-4', 'level-5', 'level-6', 'level-7', 'level-8', 'level-9', 'level-10'],\n ulDepth: ['level-1', 'level-2', 'level-3', 'level-4', 'level-5', 'level-6', 'level-7', 'level-8', 'level-9', 'level-10']\n }\n },\n onError: (err) => {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n};\n\nlet featureId = 0;\n\nconst featuresToNodeMapping = {\n heading: {\n node: HeadingNode,\n component: null\n },\n list: {\n node: [ListNode, ListItemNode],\n component: ListPlugin\n },\n link: {\n node: [LinkNode, AutoLinkNode],\n component: [AutoLinkPlugin, LinkPlugin]\n },\n code: {\n node: [CodeNode],\n component: null\n }\n};\n\nexport interface EditorProps {\n initialEditorState?: InitialEditorStateType;\n onChange?: (\n newEditorState: EditorState,\n editor: LexicalEditor,\n tags: Set<string>\n ) => void;\n editable?: boolean;\n children?: ReactNode;\n nodes?: InitialConfigType['nodes'];\n features?: (keyof typeof featuresToNodeMapping)[];\n dataManagementRef?: RefObject<DataManagementPluginHandle>;\n onChangePluginProps?: {\n ignoreHistoryMergeTagChange?: boolean;\n ignoreSelectionChange?: boolean;\n };\n}\n\nexport const Editor = ({\n nodes,\n onChange,\n editable,\n features,\n children,\n initialEditorState,\n dataManagementRef,\n onChangePluginProps\n}: EditorProps) => {\n const supportedFeatures = useMemo(() => {\n if (features) {\n const selectedNodes = features\n .map((item) => featuresToNodeMapping[item].node)\n .flat();\n\n const selectedPlugins = features\n .map((item) => featuresToNodeMapping[item].component)\n .flat()\n .map((item) => ({ component: item, id: featureId++ }));\n\n return { nodes: selectedNodes, components: selectedPlugins };\n }\n\n const defaultFeatures = {\n nodes: Object.values(featuresToNodeMapping)\n .map((item) => item.node)\n .flat(),\n components: Object.values(featuresToNodeMapping)\n .map((item) => item.component)\n .flat()\n .map((item) => ({ component: item, id: featureId++ }))\n };\n\n return defaultFeatures;\n }, [features]);\n\n return (\n <LexicalComposer\n initialConfig={{\n ...initialConfig,\n editorState: initialEditorState,\n editable,\n nodes: [...supportedFeatures.nodes, ...(nodes ?? [])]\n }}\n >\n <ToolbarContextPlugin>\n <HistoryPlugin />\n <ClearEditorPlugin />\n <DataManagementPlugin ref={dataManagementRef} />\n <TabFocusPlugin />\n <>\n {onChange && (\n <OnChangePlugin onChange={onChange} {...onChangePluginProps} />\n )}\n </>\n <>\n {supportedFeatures.components.map((comp) => {\n const ToolComponent = comp.component;\n if (ToolComponent) {\n return <ToolComponent key={comp.id} />;\n }\n\n return <Fragment key={comp.id} />;\n })}\n </>\n <>{children}</>\n </ToolbarContextPlugin>\n </LexicalComposer>\n );\n};\n"],"names":["HeadingNode","ListNode","ListItemNode","ListPlugin","LinkNode","AutoLinkNode","AutoLinkPlugin","LinkPlugin","CodeNode","useMemo","jsx","LexicalComposer","ToolbarContextPlugin","HistoryPlugin","ClearEditorPlugin","DataManagementPlugin","TabFocusPlugin","OnChangePlugin","Fragment"],"mappings":"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"}
@@ -4,7 +4,6 @@ var LexicalComposerContext = require('@lexical/react/LexicalComposerContext');
4
4
  var lexical = require('lexical');
5
5
  var react = require('react');
6
6
 
7
- const COMMAND_PRIORITY_LOW = 1;
8
7
  const TAB_TO_FOCUS_INTERVAL = 100;
9
8
  let lastTabKeyDownTimestamp = 0;
10
9
  let hasRegisteredKeyDownListener = false;
@@ -37,14 +36,7 @@ const TabFocusPlugin = () => {
37
36
  }
38
37
  return false;
39
38
  },
40
- COMMAND_PRIORITY_LOW
41
- );
42
- }, [editor]);
43
- react.useEffect(() => {
44
- return editor.registerCommand(
45
- lexical.INDENT_CONTENT_COMMAND,
46
- () => true,
47
- lexical.COMMAND_PRIORITY_CRITICAL
39
+ lexical.COMMAND_PRIORITY_LOW
48
40
  );
49
41
  }, [editor]);
50
42
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/plugins/tab-focus/index.tsx"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport {\n $getSelection,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_CRITICAL,\n FOCUS_COMMAND,\n INDENT_CONTENT_COMMAND\n} from 'lexical';\nimport { useEffect } from 'react';\n\nconst COMMAND_PRIORITY_LOW = 1;\nconst TAB_TO_FOCUS_INTERVAL = 100;\n\nlet lastTabKeyDownTimestamp = 0;\nlet hasRegisteredKeyDownListener = false;\n\nfunction registerKeyTimeStampTracker() {\n window.addEventListener(\n 'keydown',\n (event: KeyboardEvent) => {\n // Tab\n if (event.key === 'Tab') {\n lastTabKeyDownTimestamp = event.timeStamp;\n }\n },\n true\n );\n}\n\nexport const TabFocusPlugin = () => {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!hasRegisteredKeyDownListener) {\n registerKeyTimeStampTracker();\n hasRegisteredKeyDownListener = true;\n }\n\n return editor.registerCommand(\n FOCUS_COMMAND,\n (event: FocusEvent) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n if (\n lastTabKeyDownTimestamp + TAB_TO_FOCUS_INTERVAL\n > event.timeStamp\n ) {\n $setSelection(selection.clone());\n }\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n );\n }, [editor]);\n\n useEffect(() => {\n return editor.registerCommand(\n INDENT_CONTENT_COMMAND,\n () => true,\n COMMAND_PRIORITY_CRITICAL\n );\n }, [editor]);\n\n return null;\n};\n"],"names":["useLexicalComposerContext","useEffect","FOCUS_COMMAND","$getSelection","$isRangeSelection","$setSelection","INDENT_CONTENT_COMMAND","COMMAND_PRIORITY_CRITICAL"],"mappings":";;;;;;AAmBA,MAAM,oBAAuB,GAAA,CAAA;AAC7B,MAAM,qBAAwB,GAAA,GAAA;AAE9B,IAAI,uBAA0B,GAAA,CAAA;AAC9B,IAAI,4BAA+B,GAAA,KAAA;AAEnC,SAAS,2BAA8B,GAAA;AACrC,EAAO,MAAA,CAAA,gBAAA;AAAA,IACL,SAAA;AAAA,IACA,CAAC,KAAyB,KAAA;AAExB,MAAI,IAAA,KAAA,CAAM,QAAQ,KAAO,EAAA;AACvB,QAAA,uBAAA,GAA0B,KAAM,CAAA,SAAA;AAAA;AAClC,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEO,MAAM,iBAAiB,MAAM;AAClC,EAAM,MAAA,CAAC,MAAM,CAAA,GAAIA,gDAA0B,EAAA;AAE3C,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,4BAA8B,EAAA;AACjC,MAA4B,2BAAA,EAAA;AAC5B,MAA+B,4BAAA,GAAA,IAAA;AAAA;AAGjC,IAAA,OAAO,MAAO,CAAA,eAAA;AAAA,MACZC,qBAAA;AAAA,MACA,CAAC,KAAsB,KAAA;AACrB,QAAA,MAAM,YAAYC,qBAAc,EAAA;AAChC,QAAI,IAAAC,yBAAA,CAAkB,SAAS,CAAG,EAAA;AAChC,UACE,IAAA,uBAAA,GAA0B,qBACxB,GAAA,KAAA,CAAM,SACR,EAAA;AACA,YAAcC,qBAAA,CAAA,SAAA,CAAU,OAAO,CAAA;AAAA;AACjC;AAEF,QAAO,OAAA,KAAA;AAAA,OACT;AAAA,MACA;AAAA,KACF;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAAJ,eAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAO,CAAA,eAAA;AAAA,MACZK,8BAAA;AAAA,MACA,MAAM,IAAA;AAAA,MACNC;AAAA,KACF;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAO,OAAA,IAAA;AACT;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/plugins/tab-focus/index.tsx"],"sourcesContent":["import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport {\n $getSelection,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_LOW,\n FOCUS_COMMAND\n} from 'lexical';\nimport { useEffect } from 'react';\n\nconst TAB_TO_FOCUS_INTERVAL = 100;\n\nlet lastTabKeyDownTimestamp = 0;\nlet hasRegisteredKeyDownListener = false;\n\nfunction registerKeyTimeStampTracker() {\n window.addEventListener(\n 'keydown',\n (event: KeyboardEvent) => {\n // Tab\n if (event.key === 'Tab') {\n lastTabKeyDownTimestamp = event.timeStamp;\n }\n },\n true\n );\n}\n\nexport const TabFocusPlugin = (): null => {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!hasRegisteredKeyDownListener) {\n registerKeyTimeStampTracker();\n hasRegisteredKeyDownListener = true;\n }\n\n return editor.registerCommand(\n FOCUS_COMMAND,\n (event: FocusEvent) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n if (\n lastTabKeyDownTimestamp + TAB_TO_FOCUS_INTERVAL\n > event.timeStamp\n ) {\n $setSelection(selection.clone());\n }\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n );\n }, [editor]);\n\n return null;\n};\n"],"names":["useLexicalComposerContext","useEffect","FOCUS_COMMAND","$getSelection","$isRangeSelection","$setSelection","COMMAND_PRIORITY_LOW"],"mappings":";;;;;;AAUA,MAAM,qBAAwB,GAAA,GAAA;AAE9B,IAAI,uBAA0B,GAAA,CAAA;AAC9B,IAAI,4BAA+B,GAAA,KAAA;AAEnC,SAAS,2BAA8B,GAAA;AACrC,EAAO,MAAA,CAAA,gBAAA;AAAA,IACL,SAAA;AAAA,IACA,CAAC,KAAyB,KAAA;AAExB,MAAI,IAAA,KAAA,CAAM,QAAQ,KAAO,EAAA;AACvB,QAAA,uBAAA,GAA0B,KAAM,CAAA,SAAA;AAAA;AAClC,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEO,MAAM,iBAAiB,MAAY;AACxC,EAAM,MAAA,CAAC,MAAM,CAAA,GAAIA,gDAA0B,EAAA;AAE3C,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,4BAA8B,EAAA;AACjC,MAA4B,2BAAA,EAAA;AAC5B,MAA+B,4BAAA,GAAA,IAAA;AAAA;AAGjC,IAAA,OAAO,MAAO,CAAA,eAAA;AAAA,MACZC,qBAAA;AAAA,MACA,CAAC,KAAsB,KAAA;AACrB,QAAA,MAAM,YAAYC,qBAAc,EAAA;AAChC,QAAI,IAAAC,yBAAA,CAAkB,SAAS,CAAG,EAAA;AAChC,UACE,IAAA,uBAAA,GAA0B,qBACxB,GAAA,KAAA,CAAM,SACR,EAAA;AACA,YAAcC,qBAAA,CAAA,SAAA,CAAU,OAAO,CAAA;AAAA;AACjC;AAEF,QAAO,OAAA,KAAA;AAAA,OACT;AAAA,MACAC;AAAA,KACF;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAO,OAAA,IAAA;AACT;;;;"}
@@ -3,7 +3,7 @@ import { $isLinkNode, TOGGLE_LINK_COMMAND, $isAutoLinkNode } from '@lexical/link
3
3
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
4
4
  import { mergeRegister, $findMatchingParent } from '@lexical/utils';
5
5
  import { ADD_BLANK_LINK } from '../../utils/commands.js';
6
- import { SELECTION_CHANGE_COMMAND, COMMAND_PRIORITY_CRITICAL, CLICK_COMMAND, $getSelection, $isRangeSelection, COMMAND_PRIORITY_LOW, COMMAND_PRIORITY_HIGH, KEY_ESCAPE_COMMAND, $isTextNode } from 'lexical';
6
+ import { SELECTION_CHANGE_COMMAND, COMMAND_PRIORITY_CRITICAL, CLICK_COMMAND, $getSelection, $isRangeSelection, COMMAND_PRIORITY_LOW, getDOMSelection, COMMAND_PRIORITY_HIGH, KEY_ESCAPE_COMMAND, $isTextNode } from 'lexical';
7
7
  import { useState, useRef, useEffect, useCallback } from 'react';
8
8
  import isURL from '../../node_modules/validator/es/lib/isURL.js';
9
9
  import { getSelectedNode } from '../../utils/get-selected-node.js';
@@ -78,6 +78,7 @@ function useDialogLinkEditorToolbar(editor, anchorElem, options) {
78
78
  );
79
79
  }, [editor]);
80
80
  const updateLinkEditor = useCallback(() => {
81
+ var _a2;
81
82
  const selection = $getSelection();
82
83
  if ($isRangeSelection(selection)) {
83
84
  const node = getSelectedNode(selection);
@@ -93,13 +94,13 @@ function useDialogLinkEditorToolbar(editor, anchorElem, options) {
93
94
  setLinkUrl("");
94
95
  }
95
96
  }
96
- const nativeSelection = window.getSelection();
97
+ const nativeSelection = getDOMSelection((_a2 = editor._window) != null ? _a2 : window);
97
98
  const { activeElement } = document;
98
99
  const rootElement = editor.getRootElement();
99
100
  if (selection !== null && nativeSelection !== null && rootElement !== null && rootElement.contains(nativeSelection.anchorNode) && editor.isEditable()) {
100
101
  setTimeout(() => {
101
- var _a2, _b2;
102
- const domRect = (_b2 = (_a2 = nativeSelection.focusNode) == null ? void 0 : _a2.parentElement) == null ? void 0 : _b2.getBoundingClientRect();
102
+ var _a3, _b2;
103
+ const domRect = (_b2 = (_a3 = nativeSelection.focusNode) == null ? void 0 : _a3.parentElement) == null ? void 0 : _b2.getBoundingClientRect();
103
104
  if (domRect && anchorElem && containerRef.current) {
104
105
  setFloatingElemPositionForLinkEditor(
105
106
  domRect,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/dialog-link-editor/index.tsx"],"sourcesContent":["import {\n $isAutoLinkNode,\n $isLinkNode,\n TOGGLE_LINK_COMMAND\n} from '@lexical/link';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils';\nimport { ADD_BLANK_LINK } from '@src/utils/commands';\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n BaseSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n KEY_ESCAPE_COMMAND,\n LexicalEditor,\n NodeSelection,\n RangeSelection,\n SELECTION_CHANGE_COMMAND\n} from 'lexical';\nimport {\n useCallback, useEffect, useRef, useState\n} from 'react';\nimport isURL from 'validator/es/lib/isURL';\nimport { getSelectedNode } from '@src/utils/get-selected-node';\nimport { setFloatingElemPositionForLinkEditor } from '@src/utils/set-floating-elem-position-for-link-editor';\nimport { LinkEditorDialog } from './link-editor-dialog';\nimport { LinkTooltip } from './link-tooltip';\n\nfunction useDialogLinkEditorToolbar(\n editor: LexicalEditor,\n anchorElem: HTMLElement | null,\n options?: DialogLinkEditorOptions\n) {\n const [linkUrl, setLinkUrl] = useState('');\n const [linkText, setLinkText] = useState('');\n const [isLink, setIsLink] = useState(false);\n const [lastSelection, setLastSelection] = useState<\n RangeSelection | NodeSelection | BaseSelection | null\n >(null);\n const [isLinkEditMode, setIsLinkEditMode] = useState(false);\n const [isUpdate, setIsUpdate] = useState(false);\n const [errors, setErrors] = useState({\n text: false,\n url: false\n });\n\n const isNewLink = useRef(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const containerElem = containerRef.current;\n\n useEffect(() => {\n function updateToolbar() {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode);\n if (linkParent !== null && autoLinkParent === null) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n }\n }\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateToolbar();\n });\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n ),\n editor.registerCommand(\n CLICK_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkNode = $findMatchingParent(node, $isLinkNode);\n if ($isLinkNode(linkNode)) {\n const url = linkNode.getURL();\n setLinkUrl(url);\n setLinkText(linkNode.getTextContent());\n }\n if ($isLinkNode(linkNode) && (payload.metaKey || payload.ctrlKey)) {\n window.open(linkNode.getURL(), '_blank');\n return true;\n }\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n )\n );\n }, [editor]);\n\n const updateLinkEditor = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n if ($isLinkNode(parent)) {\n setLinkText(parent.getTextContent().trim());\n setLinkUrl(parent.getURL());\n } else if ($isLinkNode(node)) {\n setLinkText(node.getTextContent().trim());\n setLinkUrl(node.getURL());\n } else {\n setLinkText('');\n setLinkUrl('');\n }\n }\n\n const nativeSelection = window.getSelection();\n const { activeElement } = document;\n\n const rootElement = editor.getRootElement();\n\n if (\n selection !== null\n && nativeSelection !== null\n && rootElement !== null\n && rootElement.contains(nativeSelection.anchorNode)\n && editor.isEditable()\n ) {\n setTimeout(() => {\n const domRect: DOMRect | undefined = nativeSelection.focusNode?.parentElement?.getBoundingClientRect();\n if (domRect && anchorElem && containerRef.current) {\n setFloatingElemPositionForLinkEditor(\n domRect,\n containerRef.current,\n anchorElem,\n 10\n );\n }\n }, 10);\n setLastSelection(selection);\n } else if (!activeElement || activeElement.className !== 'link-input') {\n setTimeout(() => {\n if (rootElement !== null && anchorElem && containerElem) {\n setFloatingElemPositionForLinkEditor(null, containerElem, anchorElem);\n }\n }, 10);\n setLastSelection(null);\n setLinkUrl('');\n }\n\n // eslint-disable-next-line consistent-return\n return true;\n }, [anchorElem, editor, setIsLinkEditMode]);\n\n useEffect(() => {\n if (!isLinkEditMode) {\n isNewLink.current = false;\n }\n }, [isLinkEditMode]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateLinkEditor();\n });\n }),\n\n editor.registerCommand(\n ADD_BLANK_LINK,\n () => {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n\n editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n (payload: string | { url: string } | null) => {\n if (typeof payload === 'string' || payload?.url) {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n } else {\n setIsLinkEditMode(false);\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateLinkEditor();\n return true;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setIsLink(false);\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n )\n );\n }, [editor, updateLinkEditor, setIsLink, isLink]);\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n updateLinkEditor();\n });\n }, [editor, updateLinkEditor]);\n\n const handleLinkSubmission = ({\n text,\n url\n }: {\n text: string;\n url: string;\n }) => {\n if (lastSelection !== null) {\n const isValidUrl = isURL(url);\n const isValidText = text.trim().length > 0;\n\n if (isValidUrl && isValidText) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n url,\n rel: options?.anchorOptions?.rel,\n target: options?.anchorOptions?.target,\n title: options?.anchorOptions?.title\n });\n editor.update(() => {\n if ($isRangeSelection(lastSelection)) {\n const textNode = getSelectedNode(lastSelection);\n if ($isTextNode(textNode)) {\n textNode.setTextContent(text);\n }\n }\n });\n setErrors({\n text: false,\n url: false\n });\n setTimeout(() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n }, 50);\n } else {\n setErrors({\n text: !isValidText,\n url: !isValidUrl\n });\n }\n }\n };\n\n if (!anchorElem) return null;\n\n return (\n <>\n {isLink && !isLinkEditMode && (\n <LinkTooltip\n anchorElem={anchorElem}\n containerRef={containerRef}\n handleDelete={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n handleEdit={() => {\n setIsLinkEditMode(true);\n setIsUpdate(true);\n }}\n linkUrl={linkUrl}\n https={options?.anchorOptions?.https || false}\n />\n )}\n {isLinkEditMode && (\n <LinkEditorDialog\n handleLinkSubmission={handleLinkSubmission}\n linkText={linkText}\n linkUrl={linkUrl}\n open={isLink && isLinkEditMode}\n closeModal={() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n if (isNewLink.current) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n isUpdate={isUpdate}\n setIsLinkEditMode={setIsLinkEditMode}\n textLabel={options?.dialogProps?.textLabel || 'Link text'}\n urlLabel={options?.dialogProps?.urlLabel || 'Link URL'}\n removeLink={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n errors={errors}\n saveLabel={options?.dialogProps?.saveLabel || 'Save'}\n cancelLabel={options?.dialogProps?.cancelLabel || 'Cancel'}\n updateLabel={options?.dialogProps?.updateLabel || 'Update'}\n title={options?.dialogProps?.title || 'Add Link'}\n errorLabels={options?.dialogProps?.errorLabels}\n />\n )}\n </>\n );\n}\n\nexport type DialogLinkEditorOptions = {\n dialogProps?: {\n textLabel?: string;\n urlLabel?: string;\n saveLabel?: string;\n cancelLabel?: string;\n updateLabel?: string;\n title?: string;\n errorLabels?: {\n text?: string;\n url?: string;\n };\n };\n anchorOptions?: {\n rel?: string;\n target?: string;\n title?: string;\n https?: boolean;\n };\n};\n\nexport function DialogLinkEditor({\n anchorElem = document.body,\n options\n}: {\n anchorElem?: HTMLElement | null;\n options?: DialogLinkEditorOptions;\n}) {\n const [editor] = useLexicalComposerContext();\n return useDialogLinkEditorToolbar(editor, anchorElem, options);\n}\n"],"names":["_a","_b","_c"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/dialog-link-editor/index.tsx"],"sourcesContent":["import {\n $isAutoLinkNode,\n $isLinkNode,\n TOGGLE_LINK_COMMAND\n} from '@lexical/link';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils';\nimport { ADD_BLANK_LINK } from '@src/utils/commands';\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n BaseSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n KEY_ESCAPE_COMMAND,\n LexicalEditor,\n NodeSelection,\n RangeSelection,\n SELECTION_CHANGE_COMMAND,\n getDOMSelection\n} from 'lexical';\nimport {\n useCallback, useEffect, useRef, useState\n} from 'react';\nimport isURL from 'validator/es/lib/isURL';\nimport { getSelectedNode } from '@src/utils/get-selected-node';\nimport { setFloatingElemPositionForLinkEditor } from '@src/utils/set-floating-elem-position-for-link-editor';\nimport { LinkEditorDialog } from './link-editor-dialog';\nimport { LinkTooltip } from './link-tooltip';\n\nfunction useDialogLinkEditorToolbar(\n editor: LexicalEditor,\n anchorElem: HTMLElement | null,\n options?: DialogLinkEditorOptions\n) {\n const [linkUrl, setLinkUrl] = useState('');\n const [linkText, setLinkText] = useState('');\n const [isLink, setIsLink] = useState(false);\n const [lastSelection, setLastSelection] = useState<\n RangeSelection | NodeSelection | BaseSelection | null\n >(null);\n const [isLinkEditMode, setIsLinkEditMode] = useState(false);\n const [isUpdate, setIsUpdate] = useState(false);\n const [errors, setErrors] = useState({\n text: false,\n url: false\n });\n\n const isNewLink = useRef(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const containerElem = containerRef.current;\n\n useEffect(() => {\n function updateToolbar() {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode);\n if (linkParent !== null && autoLinkParent === null) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n }\n }\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateToolbar();\n });\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n ),\n editor.registerCommand(\n CLICK_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkNode = $findMatchingParent(node, $isLinkNode);\n if ($isLinkNode(linkNode)) {\n const url = linkNode.getURL();\n setLinkUrl(url);\n setLinkText(linkNode.getTextContent());\n }\n if ($isLinkNode(linkNode) && (payload.metaKey || payload.ctrlKey)) {\n window.open(linkNode.getURL(), '_blank');\n return true;\n }\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n )\n );\n }, [editor]);\n\n const updateLinkEditor = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n if ($isLinkNode(parent)) {\n setLinkText(parent.getTextContent().trim());\n setLinkUrl(parent.getURL());\n } else if ($isLinkNode(node)) {\n setLinkText(node.getTextContent().trim());\n setLinkUrl(node.getURL());\n } else {\n setLinkText('');\n setLinkUrl('');\n }\n }\n\n const nativeSelection = getDOMSelection(editor._window ?? window);\n const { activeElement } = document;\n\n const rootElement = editor.getRootElement();\n\n if (\n selection !== null\n && nativeSelection !== null\n && rootElement !== null\n && rootElement.contains(nativeSelection.anchorNode)\n && editor.isEditable()\n ) {\n setTimeout(() => {\n const domRect: DOMRect | undefined = nativeSelection.focusNode?.parentElement?.getBoundingClientRect();\n if (domRect && anchorElem && containerRef.current) {\n setFloatingElemPositionForLinkEditor(\n domRect,\n containerRef.current,\n anchorElem,\n 10\n );\n }\n }, 10);\n setLastSelection(selection);\n } else if (!activeElement || activeElement.className !== 'link-input') {\n setTimeout(() => {\n if (rootElement !== null && anchorElem && containerElem) {\n setFloatingElemPositionForLinkEditor(null, containerElem, anchorElem);\n }\n }, 10);\n setLastSelection(null);\n setLinkUrl('');\n }\n\n // eslint-disable-next-line consistent-return\n return true;\n }, [anchorElem, editor, setIsLinkEditMode]);\n\n useEffect(() => {\n if (!isLinkEditMode) {\n isNewLink.current = false;\n }\n }, [isLinkEditMode]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateLinkEditor();\n });\n }),\n\n editor.registerCommand(\n ADD_BLANK_LINK,\n () => {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n\n editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n (payload: string | { url: string } | null) => {\n if (typeof payload === 'string' || payload?.url) {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n } else {\n setIsLinkEditMode(false);\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateLinkEditor();\n return true;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setIsLink(false);\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n )\n );\n }, [editor, updateLinkEditor, setIsLink, isLink]);\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n updateLinkEditor();\n });\n }, [editor, updateLinkEditor]);\n\n const handleLinkSubmission = ({\n text,\n url\n }: {\n text: string;\n url: string;\n }) => {\n if (lastSelection !== null) {\n const isValidUrl = isURL(url);\n const isValidText = text.trim().length > 0;\n\n if (isValidUrl && isValidText) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n url,\n rel: options?.anchorOptions?.rel,\n target: options?.anchorOptions?.target,\n title: options?.anchorOptions?.title\n });\n editor.update(() => {\n if ($isRangeSelection(lastSelection)) {\n const textNode = getSelectedNode(lastSelection);\n if ($isTextNode(textNode)) {\n textNode.setTextContent(text);\n }\n }\n });\n setErrors({\n text: false,\n url: false\n });\n setTimeout(() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n }, 50);\n } else {\n setErrors({\n text: !isValidText,\n url: !isValidUrl\n });\n }\n }\n };\n\n if (!anchorElem) return null;\n\n return (\n <>\n {isLink && !isLinkEditMode && (\n <LinkTooltip\n anchorElem={anchorElem}\n containerRef={containerRef}\n handleDelete={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n handleEdit={() => {\n setIsLinkEditMode(true);\n setIsUpdate(true);\n }}\n linkUrl={linkUrl}\n https={options?.anchorOptions?.https || false}\n />\n )}\n {isLinkEditMode && (\n <LinkEditorDialog\n handleLinkSubmission={handleLinkSubmission}\n linkText={linkText}\n linkUrl={linkUrl}\n open={isLink && isLinkEditMode}\n closeModal={() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n if (isNewLink.current) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n isUpdate={isUpdate}\n setIsLinkEditMode={setIsLinkEditMode}\n textLabel={options?.dialogProps?.textLabel || 'Link text'}\n urlLabel={options?.dialogProps?.urlLabel || 'Link URL'}\n removeLink={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n errors={errors}\n saveLabel={options?.dialogProps?.saveLabel || 'Save'}\n cancelLabel={options?.dialogProps?.cancelLabel || 'Cancel'}\n updateLabel={options?.dialogProps?.updateLabel || 'Update'}\n title={options?.dialogProps?.title || 'Add Link'}\n errorLabels={options?.dialogProps?.errorLabels}\n />\n )}\n </>\n );\n}\n\nexport type DialogLinkEditorOptions = {\n dialogProps?: {\n textLabel?: string;\n urlLabel?: string;\n saveLabel?: string;\n cancelLabel?: string;\n updateLabel?: string;\n title?: string;\n errorLabels?: {\n text?: string;\n url?: string;\n };\n };\n anchorOptions?: {\n rel?: string;\n target?: string;\n title?: string;\n https?: boolean;\n };\n};\n\nexport function DialogLinkEditor({\n anchorElem = document.body,\n options\n}: {\n anchorElem?: HTMLElement | null;\n options?: DialogLinkEditorOptions;\n}) {\n const [editor] = useLexicalComposerContext();\n return useDialogLinkEditorToolbar(editor, anchorElem, options);\n}\n"],"names":["_a","_b","_c"],"mappings":"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"}
@@ -63,6 +63,9 @@ const RichEditor = ({
63
63
  listStyle: "disc",
64
64
  marginLeft: "$7",
65
65
  ul: {
66
+ listStyle: "square"
67
+ },
68
+ "&.level-2": {
66
69
  listStyle: "circle"
67
70
  }
68
71
  },
@@ -73,6 +76,9 @@ const RichEditor = ({
73
76
  listStyle: "lower-alpha"
74
77
  }
75
78
  },
79
+ ".block-nested-listitem": {
80
+ listStyle: "none"
81
+ },
76
82
  ".text-code": {
77
83
  color: "#F97316",
78
84
  padding: "0 $2",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/rich-editor/index.tsx"],"sourcesContent":["import { ContentEditable } from '@lexical/react/LexicalContentEditable';\nimport { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary';\nimport { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin';\nimport { ReactNode, RefObject, isValidElement } from 'react';\nimport { Box, BoxProps } from '@sparrowengg/twigs-react';\n\nexport const RichEditor = ({\n containerRef,\n placeholder,\n editorContainerProps\n}: {\n containerRef?:\n | ((instance: HTMLDivElement | null) => void)\n | RefObject<HTMLDivElement>;\n placeholder?: ReactNode | string;\n editorContainerProps?: BoxProps;\n}) => {\n return (\n <Box\n {...editorContainerProps}\n css={{\n position: 'relative',\n ...editorContainerProps?.css\n }}\n >\n <RichTextPlugin\n contentEditable={(\n <Box className=\"editor-container\">\n <Box\n className=\"editor\"\n css={{\n position: 'relative',\n borderRadius: '$md',\n border: '1px solid $neutral200',\n textAlign: 'left',\n\n '& .text-bold': {\n fontWeight: 'bold'\n },\n '& .text-italic': {\n fontStyle: 'italic'\n },\n '& .text-underline': {\n textDecoration: 'underline'\n },\n p: {\n margin: '$1 0'\n },\n ul: {\n listStyle: 'disc',\n marginLeft: '$7',\n\n ul: {\n listStyle: 'circle'\n }\n },\n ol: {\n listStyle: 'decimal',\n marginLeft: '$7',\n\n ol: {\n listStyle: 'lower-alpha'\n }\n },\n '.text-code': {\n color: '#F97316',\n padding: '0 $2',\n backgroundColor: '$neutral100',\n border: '1px solid $neutral200',\n borderRadius: '$sm',\n\n '&, & *': {\n fontFamily: 'monospace'\n }\n },\n '.block-code': {\n padding: '$4',\n display: 'block',\n color: '$neutral900',\n backgroundColor: '$neutral100',\n border: '1px solid $neutral200',\n borderRadius: '$md',\n\n '&, & *': {\n fontFamily: 'monospace'\n }\n },\n '.block-h1': {\n fontSize: '$xl'\n },\n '.block-h2': {\n fontSize: '$lg'\n },\n '.block-h3, .block-h4, .block-h5, .block-h6': {\n fontSize: '$md'\n }\n }}\n ref={containerRef}\n >\n <ContentEditable\n style={{\n minHeight: '120px',\n padding: '12px'\n }}\n />\n </Box>\n </Box>\n )}\n ErrorBoundary={LexicalErrorBoundary}\n placeholder={\n !isValidElement(placeholder) ? (\n <Box\n css={{\n position: 'absolute',\n top: '12px',\n left: '12px',\n color: '$black500',\n pointerEvents: 'none'\n }}\n >\n {placeholder}\n </Box>\n ) : (\n placeholder\n )\n }\n />\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/rich-editor/index.tsx"],"sourcesContent":["import { ContentEditable } from '@lexical/react/LexicalContentEditable';\nimport { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary';\nimport { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin';\nimport { ReactNode, RefObject, isValidElement } from 'react';\nimport { Box, BoxProps } from '@sparrowengg/twigs-react';\n\nexport const RichEditor = ({\n containerRef,\n placeholder,\n editorContainerProps\n}: {\n containerRef?:\n | ((instance: HTMLDivElement | null) => void)\n | RefObject<HTMLDivElement>;\n placeholder?: ReactNode | string;\n editorContainerProps?: BoxProps;\n}) => {\n return (\n <Box\n {...editorContainerProps}\n css={{\n position: 'relative',\n ...editorContainerProps?.css\n }}\n >\n <RichTextPlugin\n contentEditable={(\n <Box className=\"editor-container\">\n <Box\n className=\"editor\"\n css={{\n position: 'relative',\n borderRadius: '$md',\n border: '1px solid $neutral200',\n textAlign: 'left',\n\n '& .text-bold': {\n fontWeight: 'bold'\n },\n '& .text-italic': {\n fontStyle: 'italic'\n },\n '& .text-underline': {\n textDecoration: 'underline'\n },\n p: {\n margin: '$1 0'\n },\n ul: {\n listStyle: 'disc',\n marginLeft: '$7',\n\n ul: {\n listStyle: 'square'\n },\n\n '&.level-2': {\n listStyle: 'circle'\n }\n },\n ol: {\n listStyle: 'decimal',\n marginLeft: '$7',\n\n ol: {\n listStyle: 'lower-alpha'\n }\n },\n '.block-nested-listitem': {\n listStyle: 'none'\n },\n '.text-code': {\n color: '#F97316',\n padding: '0 $2',\n backgroundColor: '$neutral100',\n border: '1px solid $neutral200',\n borderRadius: '$sm',\n\n '&, & *': {\n fontFamily: 'monospace'\n }\n },\n '.block-code': {\n padding: '$4',\n display: 'block',\n color: '$neutral900',\n backgroundColor: '$neutral100',\n border: '1px solid $neutral200',\n borderRadius: '$md',\n\n '&, & *': {\n fontFamily: 'monospace'\n }\n },\n '.block-h1': {\n fontSize: '$xl'\n },\n '.block-h2': {\n fontSize: '$lg'\n },\n '.block-h3, .block-h4, .block-h5, .block-h6': {\n fontSize: '$md'\n }\n }}\n ref={containerRef}\n >\n <ContentEditable\n style={{\n minHeight: '120px',\n padding: '12px'\n }}\n />\n </Box>\n </Box>\n )}\n ErrorBoundary={LexicalErrorBoundary}\n placeholder={\n !isValidElement(placeholder) ? (\n <Box\n css={{\n position: 'absolute',\n top: '12px',\n left: '12px',\n color: '$black500',\n pointerEvents: 'none'\n }}\n >\n {placeholder}\n </Box>\n ) : (\n placeholder\n )\n }\n />\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
package/dist/es/editor.js CHANGED
@@ -76,7 +76,13 @@ const initialConfig = {
76
76
  list: {
77
77
  ol: "block-ol",
78
78
  ul: "block-ul",
79
- listitem: "block-listitem"
79
+ listitem: "block-listitem",
80
+ nested: {
81
+ list: "block-nested-list",
82
+ listitem: "block-nested-listitem"
83
+ },
84
+ olDepth: ["level-1", "level-2", "level-3", "level-4", "level-5", "level-6", "level-7", "level-8", "level-9", "level-10"],
85
+ ulDepth: ["level-1", "level-2", "level-3", "level-4", "level-5", "level-6", "level-7", "level-8", "level-9", "level-10"]
80
86
  }
81
87
  },
82
88
  onError: (err) => {
@@ -1 +1 @@
1
- {"version":3,"file":"editor.js","sources":["../../src/editor.tsx"],"sourcesContent":["import { AutoLinkNode, LinkNode } from '@lexical/link';\nimport { ListItemNode, ListNode } from '@lexical/list';\nimport { ClearEditorPlugin } from '@lexical/react/LexicalClearEditorPlugin';\nimport {\n InitialConfigType,\n InitialEditorStateType,\n LexicalComposer\n} from '@lexical/react/LexicalComposer';\nimport { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin';\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin';\nimport { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin';\nimport { HeadingNode } from '@lexical/rich-text';\n\nimport { CodeNode } from '@lexical/code';\nimport { EditorState, LexicalEditor } from 'lexical';\nimport {\n Fragment, ReactNode, RefObject, useMemo\n} from 'react';\nimport {\n AutoLinkPlugin,\n DataManagementPlugin,\n DataManagementPluginHandle,\n LinkPlugin,\n TabFocusPlugin\n} from './plugins';\n\nimport { ToolbarContextPlugin } from './components';\n\nconst initialConfig: InitialConfigType = {\n namespace: 'TwigsEditor',\n theme: {\n text: {\n bold: 'text-bold',\n italic: 'text-italic',\n underline: 'text-underline',\n code: 'text-code',\n base: 'text-base',\n highlight: 'text-highlight',\n strikethrough: 'text-strikethrough',\n subscript: 'text-subscript',\n superscript: 'text-superscript',\n underlineStrikethrough: 'text-underline-strikethrough'\n },\n code: 'block-code',\n quote: 'block-quote',\n heading: {\n h1: 'block-h1',\n h2: 'block-h2',\n h3: 'block-h3',\n h4: 'block-h4',\n h5: 'block-h5',\n h6: 'block-h6'\n },\n list: {\n ol: 'block-ol',\n ul: 'block-ul',\n listitem: 'block-listitem'\n }\n },\n onError: (err) => {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n};\n\nlet featureId = 0;\n\nconst featuresToNodeMapping = {\n heading: {\n node: HeadingNode,\n component: null\n },\n list: {\n node: [ListNode, ListItemNode],\n component: ListPlugin\n },\n link: {\n node: [LinkNode, AutoLinkNode],\n component: [AutoLinkPlugin, LinkPlugin]\n },\n code: {\n node: [CodeNode],\n component: null\n }\n};\n\nexport interface EditorProps {\n initialEditorState?: InitialEditorStateType;\n onChange?: (\n newEditorState: EditorState,\n editor: LexicalEditor,\n tags: Set<string>\n ) => void;\n editable?: boolean;\n children?: ReactNode;\n nodes?: InitialConfigType['nodes'];\n features?: (keyof typeof featuresToNodeMapping)[];\n dataManagementRef?: RefObject<DataManagementPluginHandle>;\n onChangePluginProps?: {\n ignoreHistoryMergeTagChange?: boolean;\n ignoreSelectionChange?: boolean;\n };\n}\n\nexport const Editor = ({\n nodes,\n onChange,\n editable,\n features,\n children,\n initialEditorState,\n dataManagementRef,\n onChangePluginProps\n}: EditorProps) => {\n const supportedFeatures = useMemo(() => {\n if (features) {\n const selectedNodes = features\n .map((item) => featuresToNodeMapping[item].node)\n .flat();\n\n const selectedPlugins = features\n .map((item) => featuresToNodeMapping[item].component)\n .flat()\n .map((item) => ({ component: item, id: featureId++ }));\n\n return { nodes: selectedNodes, components: selectedPlugins };\n }\n\n const defaultFeatures = {\n nodes: Object.values(featuresToNodeMapping)\n .map((item) => item.node)\n .flat(),\n components: Object.values(featuresToNodeMapping)\n .map((item) => item.component)\n .flat()\n .map((item) => ({ component: item, id: featureId++ }))\n };\n\n return defaultFeatures;\n }, [features]);\n\n return (\n <LexicalComposer\n initialConfig={{\n ...initialConfig,\n editorState: initialEditorState,\n editable,\n nodes: [...supportedFeatures.nodes, ...(nodes ?? [])]\n }}\n >\n <ToolbarContextPlugin>\n <HistoryPlugin />\n <ClearEditorPlugin />\n <DataManagementPlugin ref={dataManagementRef} />\n <TabFocusPlugin />\n <>\n {onChange && (\n <OnChangePlugin onChange={onChange} {...onChangePluginProps} />\n )}\n </>\n <>\n {supportedFeatures.components.map((comp) => {\n const ToolComponent = comp.component;\n if (ToolComponent) {\n return <ToolComponent key={comp.id} />;\n }\n\n return <Fragment key={comp.id} />;\n })}\n </>\n <>{children}</>\n </ToolbarContextPlugin>\n </LexicalComposer>\n );\n};\n"],"names":["Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"editor.js","sources":["../../src/editor.tsx"],"sourcesContent":["import { AutoLinkNode, LinkNode } from '@lexical/link';\nimport { ListItemNode, ListNode } from '@lexical/list';\nimport { ClearEditorPlugin } from '@lexical/react/LexicalClearEditorPlugin';\nimport {\n InitialConfigType,\n InitialEditorStateType,\n LexicalComposer\n} from '@lexical/react/LexicalComposer';\nimport { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin';\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin';\nimport { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin';\nimport { HeadingNode } from '@lexical/rich-text';\n\nimport { CodeNode } from '@lexical/code';\nimport { EditorState, LexicalEditor } from 'lexical';\nimport {\n Fragment, ReactNode, RefObject, useMemo\n} from 'react';\nimport {\n AutoLinkPlugin,\n DataManagementPlugin,\n DataManagementPluginHandle,\n LinkPlugin,\n TabFocusPlugin\n} from './plugins';\n\nimport { ToolbarContextPlugin } from './components';\n\nconst initialConfig: InitialConfigType = {\n namespace: 'TwigsEditor',\n theme: {\n text: {\n bold: 'text-bold',\n italic: 'text-italic',\n underline: 'text-underline',\n code: 'text-code',\n base: 'text-base',\n highlight: 'text-highlight',\n strikethrough: 'text-strikethrough',\n subscript: 'text-subscript',\n superscript: 'text-superscript',\n underlineStrikethrough: 'text-underline-strikethrough'\n },\n code: 'block-code',\n quote: 'block-quote',\n heading: {\n h1: 'block-h1',\n h2: 'block-h2',\n h3: 'block-h3',\n h4: 'block-h4',\n h5: 'block-h5',\n h6: 'block-h6'\n },\n list: {\n ol: 'block-ol',\n ul: 'block-ul',\n listitem: 'block-listitem',\n nested: {\n list: 'block-nested-list',\n listitem: 'block-nested-listitem'\n },\n olDepth: ['level-1', 'level-2', 'level-3', 'level-4', 'level-5', 'level-6', 'level-7', 'level-8', 'level-9', 'level-10'],\n ulDepth: ['level-1', 'level-2', 'level-3', 'level-4', 'level-5', 'level-6', 'level-7', 'level-8', 'level-9', 'level-10']\n }\n },\n onError: (err) => {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n};\n\nlet featureId = 0;\n\nconst featuresToNodeMapping = {\n heading: {\n node: HeadingNode,\n component: null\n },\n list: {\n node: [ListNode, ListItemNode],\n component: ListPlugin\n },\n link: {\n node: [LinkNode, AutoLinkNode],\n component: [AutoLinkPlugin, LinkPlugin]\n },\n code: {\n node: [CodeNode],\n component: null\n }\n};\n\nexport interface EditorProps {\n initialEditorState?: InitialEditorStateType;\n onChange?: (\n newEditorState: EditorState,\n editor: LexicalEditor,\n tags: Set<string>\n ) => void;\n editable?: boolean;\n children?: ReactNode;\n nodes?: InitialConfigType['nodes'];\n features?: (keyof typeof featuresToNodeMapping)[];\n dataManagementRef?: RefObject<DataManagementPluginHandle>;\n onChangePluginProps?: {\n ignoreHistoryMergeTagChange?: boolean;\n ignoreSelectionChange?: boolean;\n };\n}\n\nexport const Editor = ({\n nodes,\n onChange,\n editable,\n features,\n children,\n initialEditorState,\n dataManagementRef,\n onChangePluginProps\n}: EditorProps) => {\n const supportedFeatures = useMemo(() => {\n if (features) {\n const selectedNodes = features\n .map((item) => featuresToNodeMapping[item].node)\n .flat();\n\n const selectedPlugins = features\n .map((item) => featuresToNodeMapping[item].component)\n .flat()\n .map((item) => ({ component: item, id: featureId++ }));\n\n return { nodes: selectedNodes, components: selectedPlugins };\n }\n\n const defaultFeatures = {\n nodes: Object.values(featuresToNodeMapping)\n .map((item) => item.node)\n .flat(),\n components: Object.values(featuresToNodeMapping)\n .map((item) => item.component)\n .flat()\n .map((item) => ({ component: item, id: featureId++ }))\n };\n\n return defaultFeatures;\n }, [features]);\n\n return (\n <LexicalComposer\n initialConfig={{\n ...initialConfig,\n editorState: initialEditorState,\n editable,\n nodes: [...supportedFeatures.nodes, ...(nodes ?? [])]\n }}\n >\n <ToolbarContextPlugin>\n <HistoryPlugin />\n <ClearEditorPlugin />\n <DataManagementPlugin ref={dataManagementRef} />\n <TabFocusPlugin />\n <>\n {onChange && (\n <OnChangePlugin onChange={onChange} {...onChangePluginProps} />\n )}\n </>\n <>\n {supportedFeatures.components.map((comp) => {\n const ToolComponent = comp.component;\n if (ToolComponent) {\n return <ToolComponent key={comp.id} />;\n }\n\n return <Fragment key={comp.id} />;\n })}\n </>\n <>{children}</>\n </ToolbarContextPlugin>\n </LexicalComposer>\n );\n};\n"],"names":["Fragment"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAM,aAAmC,GAAA;AAAA,EACvC,SAAW,EAAA,aAAA;AAAA,EACX,KAAO,EAAA;AAAA,IACL,IAAM,EAAA;AAAA,MACJ,IAAM,EAAA,WAAA;AAAA,MACN,MAAQ,EAAA,aAAA;AAAA,MACR,SAAW,EAAA,gBAAA;AAAA,MACX,IAAM,EAAA,WAAA;AAAA,MACN,IAAM,EAAA,WAAA;AAAA,MACN,SAAW,EAAA,gBAAA;AAAA,MACX,aAAe,EAAA,oBAAA;AAAA,MACf,SAAW,EAAA,gBAAA;AAAA,MACX,WAAa,EAAA,kBAAA;AAAA,MACb,sBAAwB,EAAA;AAAA,KAC1B;AAAA,IACA,IAAM,EAAA,YAAA;AAAA,IACN,KAAO,EAAA,aAAA;AAAA,IACP,OAAS,EAAA;AAAA,MACP,EAAI,EAAA,UAAA;AAAA,MACJ,EAAI,EAAA,UAAA;AAAA,MACJ,EAAI,EAAA,UAAA;AAAA,MACJ,EAAI,EAAA,UAAA;AAAA,MACJ,EAAI,EAAA,UAAA;AAAA,MACJ,EAAI,EAAA;AAAA,KACN;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,EAAI,EAAA,UAAA;AAAA,MACJ,EAAI,EAAA,UAAA;AAAA,MACJ,QAAU,EAAA,gBAAA;AAAA,MACV,MAAQ,EAAA;AAAA,QACN,IAAM,EAAA,mBAAA;AAAA,QACN,QAAU,EAAA;AAAA,OACZ;AAAA,MACA,OAAA,EAAS,CAAC,SAAA,EAAW,SAAW,EAAA,SAAA,EAAW,SAAW,EAAA,SAAA,EAAW,SAAW,EAAA,SAAA,EAAW,SAAW,EAAA,SAAA,EAAW,UAAU,CAAA;AAAA,MACvH,OAAA,EAAS,CAAC,SAAA,EAAW,SAAW,EAAA,SAAA,EAAW,SAAW,EAAA,SAAA,EAAW,SAAW,EAAA,SAAA,EAAW,SAAW,EAAA,SAAA,EAAW,UAAU;AAAA;AACzH,GACF;AAAA,EACA,OAAA,EAAS,CAAC,GAAQ,KAAA;AAEhB,IAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA;AAErB,CAAA;AAEA,IAAI,SAAY,GAAA,CAAA;AAEhB,MAAM,qBAAwB,GAAA;AAAA,EAC5B,OAAS,EAAA;AAAA,IACP,IAAM,EAAA,WAAA;AAAA,IACN,SAAW,EAAA;AAAA,GACb;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,IAAA,EAAM,CAAC,QAAA,EAAU,YAAY,CAAA;AAAA,IAC7B,SAAW,EAAA;AAAA,GACb;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,IAAA,EAAM,CAAC,QAAA,EAAU,YAAY,CAAA;AAAA,IAC7B,SAAA,EAAW,CAAC,cAAA,EAAgB,UAAU;AAAA,GACxC;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,IAAA,EAAM,CAAC,QAAQ,CAAA;AAAA,IACf,SAAW,EAAA;AAAA;AAEf,CAAA;AAoBO,MAAM,SAAS,CAAC;AAAA,EACrB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAmB,KAAA;AACjB,EAAM,MAAA,iBAAA,GAAoB,QAAQ,MAAM;AACtC,IAAA,IAAI,QAAU,EAAA;AACZ,MAAM,MAAA,aAAA,GAAgB,QACnB,CAAA,GAAA,CAAI,CAAC,IAAA,KAAS,sBAAsB,IAAI,CAAA,CAAE,IAAI,CAAA,CAC9C,IAAK,EAAA;AAER,MAAM,MAAA,eAAA,GAAkB,SACrB,GAAI,CAAA,CAAC,SAAS,qBAAsB,CAAA,IAAI,EAAE,SAAS,CAAA,CACnD,MACA,CAAA,GAAA,CAAI,CAAC,IAAU,MAAA,EAAE,WAAW,IAAM,EAAA,EAAA,EAAI,aAAc,CAAA,CAAA;AAEvD,MAAA,OAAO,EAAE,KAAA,EAAO,aAAe,EAAA,UAAA,EAAY,eAAgB,EAAA;AAAA;AAG7D,IAAA,MAAM,eAAkB,GAAA;AAAA,MACtB,KAAA,EAAO,MAAO,CAAA,MAAA,CAAO,qBAAqB,CAAA,CACvC,GAAI,CAAA,CAAC,IAAS,KAAA,IAAA,CAAK,IAAI,CAAA,CACvB,IAAK,EAAA;AAAA,MACR,UAAA,EAAY,OAAO,MAAO,CAAA,qBAAqB,EAC5C,GAAI,CAAA,CAAC,SAAS,IAAK,CAAA,SAAS,EAC5B,IAAK,EAAA,CACL,IAAI,CAAC,IAAA,MAAU,EAAE,SAAW,EAAA,IAAA,EAAM,EAAI,EAAA,SAAA,EAAA,EAAc,CAAA;AAAA,KACzD;AAEA,IAAO,OAAA,eAAA;AAAA,GACT,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EACE,uBAAA,GAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAe,iCACV,aADU,CAAA,EAAA;AAAA,QAEb,WAAa,EAAA,kBAAA;AAAA,QACb,QAAA;AAAA,QACA,KAAA,EAAO,CAAC,GAAG,iBAAA,CAAkB,OAAO,GAAI,KAAA,IAAA,IAAA,GAAA,KAAA,GAAS,EAAG;AAAA,OACtD,CAAA;AAAA,MAEA,+BAAC,oBACC,EAAA,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,aAAc,EAAA,EAAA,CAAA;AAAA,4BACd,iBAAkB,EAAA,EAAA,CAAA;AAAA,wBACnB,GAAA,CAAC,oBAAqB,EAAA,EAAA,GAAA,EAAK,iBAAmB,EAAA,CAAA;AAAA,4BAC7C,cAAe,EAAA,EAAA,CAAA;AAAA,wCAEb,QACC,EAAA,QAAA,oBAAA,GAAA,CAAC,cAAe,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,EAAwB,oBAAqB,CAEjE,EAAA,CAAA;AAAA,wBAEG,GAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA,iBAAA,CAAkB,UAAW,CAAA,GAAA,CAAI,CAAC,IAAS,KAAA;AAC1C,UAAA,MAAM,gBAAgB,IAAK,CAAA,SAAA;AAC3B,UAAA,IAAI,aAAe,EAAA;AACjB,YAAO,uBAAA,GAAA,CAAC,aAAmB,EAAA,EAAA,EAAA,IAAA,CAAK,EAAI,CAAA;AAAA;AAGtC,UAAA,uBAAQA,GAAAA,CAAAA,UAAAA,EAAA,EAAc,EAAA,IAAA,CAAK,EAAI,CAAA;AAAA,SAChC,CACH,EAAA,CAAA;AAAA,wCACG,QAAS,EAAA;AAAA,OACd,EAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -1,8 +1,7 @@
1
1
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
2
- import { FOCUS_COMMAND, $getSelection, $isRangeSelection, $setSelection, INDENT_CONTENT_COMMAND, COMMAND_PRIORITY_CRITICAL } from 'lexical';
2
+ import { FOCUS_COMMAND, $getSelection, $isRangeSelection, $setSelection, COMMAND_PRIORITY_LOW } from 'lexical';
3
3
  import { useEffect } from 'react';
4
4
 
5
- const COMMAND_PRIORITY_LOW = 1;
6
5
  const TAB_TO_FOCUS_INTERVAL = 100;
7
6
  let lastTabKeyDownTimestamp = 0;
8
7
  let hasRegisteredKeyDownListener = false;
@@ -38,13 +37,6 @@ const TabFocusPlugin = () => {
38
37
  COMMAND_PRIORITY_LOW
39
38
  );
40
39
  }, [editor]);
41
- useEffect(() => {
42
- return editor.registerCommand(
43
- INDENT_CONTENT_COMMAND,
44
- () => true,
45
- COMMAND_PRIORITY_CRITICAL
46
- );
47
- }, [editor]);
48
40
  return null;
49
41
  };
50
42
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/plugins/tab-focus/index.tsx"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport {\n $getSelection,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_CRITICAL,\n FOCUS_COMMAND,\n INDENT_CONTENT_COMMAND\n} from 'lexical';\nimport { useEffect } from 'react';\n\nconst COMMAND_PRIORITY_LOW = 1;\nconst TAB_TO_FOCUS_INTERVAL = 100;\n\nlet lastTabKeyDownTimestamp = 0;\nlet hasRegisteredKeyDownListener = false;\n\nfunction registerKeyTimeStampTracker() {\n window.addEventListener(\n 'keydown',\n (event: KeyboardEvent) => {\n // Tab\n if (event.key === 'Tab') {\n lastTabKeyDownTimestamp = event.timeStamp;\n }\n },\n true\n );\n}\n\nexport const TabFocusPlugin = () => {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!hasRegisteredKeyDownListener) {\n registerKeyTimeStampTracker();\n hasRegisteredKeyDownListener = true;\n }\n\n return editor.registerCommand(\n FOCUS_COMMAND,\n (event: FocusEvent) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n if (\n lastTabKeyDownTimestamp + TAB_TO_FOCUS_INTERVAL\n > event.timeStamp\n ) {\n $setSelection(selection.clone());\n }\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n );\n }, [editor]);\n\n useEffect(() => {\n return editor.registerCommand(\n INDENT_CONTENT_COMMAND,\n () => true,\n COMMAND_PRIORITY_CRITICAL\n );\n }, [editor]);\n\n return null;\n};\n"],"names":[],"mappings":";;;;AAmBA,MAAM,oBAAuB,GAAA,CAAA;AAC7B,MAAM,qBAAwB,GAAA,GAAA;AAE9B,IAAI,uBAA0B,GAAA,CAAA;AAC9B,IAAI,4BAA+B,GAAA,KAAA;AAEnC,SAAS,2BAA8B,GAAA;AACrC,EAAO,MAAA,CAAA,gBAAA;AAAA,IACL,SAAA;AAAA,IACA,CAAC,KAAyB,KAAA;AAExB,MAAI,IAAA,KAAA,CAAM,QAAQ,KAAO,EAAA;AACvB,QAAA,uBAAA,GAA0B,KAAM,CAAA,SAAA;AAAA;AAClC,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEO,MAAM,iBAAiB,MAAM;AAClC,EAAM,MAAA,CAAC,MAAM,CAAA,GAAI,yBAA0B,EAAA;AAE3C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,4BAA8B,EAAA;AACjC,MAA4B,2BAAA,EAAA;AAC5B,MAA+B,4BAAA,GAAA,IAAA;AAAA;AAGjC,IAAA,OAAO,MAAO,CAAA,eAAA;AAAA,MACZ,aAAA;AAAA,MACA,CAAC,KAAsB,KAAA;AACrB,QAAA,MAAM,YAAY,aAAc,EAAA;AAChC,QAAI,IAAA,iBAAA,CAAkB,SAAS,CAAG,EAAA;AAChC,UACE,IAAA,uBAAA,GAA0B,qBACxB,GAAA,KAAA,CAAM,SACR,EAAA;AACA,YAAc,aAAA,CAAA,SAAA,CAAU,OAAO,CAAA;AAAA;AACjC;AAEF,QAAO,OAAA,KAAA;AAAA,OACT;AAAA,MACA;AAAA,KACF;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAO,CAAA,eAAA;AAAA,MACZ,sBAAA;AAAA,MACA,MAAM,IAAA;AAAA,MACN;AAAA,KACF;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAO,OAAA,IAAA;AACT;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/plugins/tab-focus/index.tsx"],"sourcesContent":["import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport {\n $getSelection,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_LOW,\n FOCUS_COMMAND\n} from 'lexical';\nimport { useEffect } from 'react';\n\nconst TAB_TO_FOCUS_INTERVAL = 100;\n\nlet lastTabKeyDownTimestamp = 0;\nlet hasRegisteredKeyDownListener = false;\n\nfunction registerKeyTimeStampTracker() {\n window.addEventListener(\n 'keydown',\n (event: KeyboardEvent) => {\n // Tab\n if (event.key === 'Tab') {\n lastTabKeyDownTimestamp = event.timeStamp;\n }\n },\n true\n );\n}\n\nexport const TabFocusPlugin = (): null => {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!hasRegisteredKeyDownListener) {\n registerKeyTimeStampTracker();\n hasRegisteredKeyDownListener = true;\n }\n\n return editor.registerCommand(\n FOCUS_COMMAND,\n (event: FocusEvent) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n if (\n lastTabKeyDownTimestamp + TAB_TO_FOCUS_INTERVAL\n > event.timeStamp\n ) {\n $setSelection(selection.clone());\n }\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n );\n }, [editor]);\n\n return null;\n};\n"],"names":[],"mappings":";;;;AAUA,MAAM,qBAAwB,GAAA,GAAA;AAE9B,IAAI,uBAA0B,GAAA,CAAA;AAC9B,IAAI,4BAA+B,GAAA,KAAA;AAEnC,SAAS,2BAA8B,GAAA;AACrC,EAAO,MAAA,CAAA,gBAAA;AAAA,IACL,SAAA;AAAA,IACA,CAAC,KAAyB,KAAA;AAExB,MAAI,IAAA,KAAA,CAAM,QAAQ,KAAO,EAAA;AACvB,QAAA,uBAAA,GAA0B,KAAM,CAAA,SAAA;AAAA;AAClC,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEO,MAAM,iBAAiB,MAAY;AACxC,EAAM,MAAA,CAAC,MAAM,CAAA,GAAI,yBAA0B,EAAA;AAE3C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,4BAA8B,EAAA;AACjC,MAA4B,2BAAA,EAAA;AAC5B,MAA+B,4BAAA,GAAA,IAAA;AAAA;AAGjC,IAAA,OAAO,MAAO,CAAA,eAAA;AAAA,MACZ,aAAA;AAAA,MACA,CAAC,KAAsB,KAAA;AACrB,QAAA,MAAM,YAAY,aAAc,EAAA;AAChC,QAAI,IAAA,iBAAA,CAAkB,SAAS,CAAG,EAAA;AAChC,UACE,IAAA,uBAAA,GAA0B,qBACxB,GAAA,KAAA,CAAM,SACR,EAAA;AACA,YAAc,aAAA,CAAA,SAAA,CAAU,OAAO,CAAA;AAAA;AACjC;AAEF,QAAO,OAAA,KAAA;AAAA,OACT;AAAA,MACA;AAAA,KACF;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAO,OAAA,IAAA;AACT;;;;"}
package/dist/index.d.ts CHANGED
@@ -291,13 +291,6 @@ declare const MentionsPlugin: ({ getResults, triggerStringLength, ...props }: Pa
291
291
  triggerStringLength?: number;
292
292
  }) => react_jsx_runtime.JSX.Element;
293
293
 
294
- /**
295
- * Copyright (c) Meta Platforms, Inc. and affiliates.
296
- *
297
- * This source code is licensed under the MIT license found in the
298
- * LICENSE file in the root directory of this source tree.
299
- *
300
- */
301
294
  declare const TabFocusPlugin: () => null;
302
295
 
303
296
  type Emoji = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sparrowengg/twigs-editor-react",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "Rich text editor built on top of Lexical",
5
5
  "module": "dist/es/index.js",
6
6
  "main": "dist/cjs/index.js",