@toptal/picasso-rich-text-editor 4.2.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/LexicalEditor/styles.d.ts +1 -1
  2. package/LexicalEditor/styles.js +10 -3
  3. package/LexicalEditor/styles.js.map +1 -1
  4. package/LexicalEditor/utils/cleanup-html-output.js +2 -0
  5. package/LexicalEditor/utils/cleanup-html-output.js.map +1 -1
  6. package/LexicalEditor/utils/cleanup-html-output.test.js +12 -0
  7. package/LexicalEditor/utils/cleanup-html-output.test.js.map +1 -1
  8. package/LexicalEditor/utils/create-lexical-theme.js +2 -0
  9. package/LexicalEditor/utils/create-lexical-theme.js.map +1 -1
  10. package/LexicalEditor/utils/hasChildDOMNodeTag.d.ts +2 -0
  11. package/LexicalEditor/utils/hasChildDOMNodeTag.js +12 -0
  12. package/LexicalEditor/utils/hasChildDOMNodeTag.js.map +1 -0
  13. package/LexicalEditor/utils/hasChildDOMNodeTag.test.d.ts +1 -0
  14. package/LexicalEditor/utils/hasChildDOMNodeTag.test.js +39 -0
  15. package/LexicalEditor/utils/hasChildDOMNodeTag.test.js.map +1 -0
  16. package/LexicalEditor/utils/index.d.ts +1 -0
  17. package/LexicalEditor/utils/index.js +1 -0
  18. package/LexicalEditor/utils/index.js.map +1 -1
  19. package/LexicalEditorToolbarPlugin/LexicalEditorToolbarPlugin.js +16 -2
  20. package/LexicalEditorToolbarPlugin/LexicalEditorToolbarPlugin.js.map +1 -1
  21. package/RichText/components/CodeBlock.d.ts +6 -0
  22. package/RichText/components/CodeBlock.js +10 -0
  23. package/RichText/components/CodeBlock.js.map +1 -0
  24. package/RichText/components/index.d.ts +2 -0
  25. package/RichText/components/index.js +2 -0
  26. package/RichText/components/index.js.map +1 -1
  27. package/RichText/components/styles.d.ts +4 -10
  28. package/RichText/components/styles.js +17 -0
  29. package/RichText/components/styles.js.map +1 -1
  30. package/RichText/hooks/useRichText/useRichText.js +2 -2
  31. package/RichText/hooks/useRichText/useRichText.js.map +1 -1
  32. package/RichText/types.d.ts +1 -1
  33. package/RichTextEditorToolbar/RichTextEditorToolbar.js +5 -4
  34. package/RichTextEditorToolbar/RichTextEditorToolbar.js.map +1 -1
  35. package/index.d.ts +1 -1
  36. package/index.js +1 -1
  37. package/index.js.map +1 -1
  38. package/package.json +2 -2
  39. package/plugins/CodeBlockPlugin/CodeBlockButton.d.ts +6 -0
  40. package/plugins/CodeBlockPlugin/CodeBlockButton.js +98 -0
  41. package/plugins/CodeBlockPlugin/CodeBlockButton.js.map +1 -0
  42. package/plugins/CodeBlockPlugin/CodeBlockPlugin.d.ts +8 -0
  43. package/plugins/CodeBlockPlugin/CodeBlockPlugin.js +43 -0
  44. package/plugins/CodeBlockPlugin/CodeBlockPlugin.js.map +1 -0
  45. package/plugins/CodeBlockPlugin/index.d.ts +1 -0
  46. package/plugins/CodeBlockPlugin/index.js +2 -0
  47. package/plugins/CodeBlockPlugin/index.js.map +1 -0
  48. package/plugins/CodeBlockPlugin/nodes/CodeBlockNode.d.ts +18 -0
  49. package/plugins/CodeBlockPlugin/nodes/CodeBlockNode.js +135 -0
  50. package/plugins/CodeBlockPlugin/nodes/CodeBlockNode.js.map +1 -0
  51. package/plugins/CodeBlockPlugin/nodes/CodeBlockTextNode.d.ts +14 -0
  52. package/plugins/CodeBlockPlugin/nodes/CodeBlockTextNode.js +43 -0
  53. package/plugins/CodeBlockPlugin/nodes/CodeBlockTextNode.js.map +1 -0
  54. package/plugins/CodeBlockPlugin/nodes/index.d.ts +8 -0
  55. package/plugins/CodeBlockPlugin/nodes/index.js +15 -0
  56. package/plugins/CodeBlockPlugin/nodes/index.js.map +1 -0
  57. package/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.d.ts +4 -0
  58. package/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.js +12 -0
  59. package/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.js.map +1 -0
  60. package/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.test.d.ts +1 -0
  61. package/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.test.js +66 -0
  62. package/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.test.js.map +1 -0
  63. package/plugins/CodeBlockPlugin/utils/index.d.ts +1 -0
  64. package/plugins/CodeBlockPlugin/utils/index.js +2 -0
  65. package/plugins/CodeBlockPlugin/utils/index.js.map +1 -0
  66. package/plugins/CodePlugin/CodeButton.js +3 -2
  67. package/plugins/CodePlugin/CodeButton.js.map +1 -1
  68. package/plugins/ImagePlugin/components/ImagePluginButton/ImagePluginButton.js +2 -2
  69. package/plugins/ImagePlugin/components/ImagePluginButton/ImagePluginButton.js.map +1 -1
  70. package/plugins/LinkPlugin/LinkPluginButton.js +3 -2
  71. package/plugins/LinkPlugin/LinkPluginButton.js.map +1 -1
  72. package/plugins/api.d.ts +2 -0
  73. package/plugins/api.js +9 -2
  74. package/plugins/api.js.map +1 -1
  75. package/plugins/index.d.ts +1 -0
  76. package/plugins/index.js +1 -0
  77. package/plugins/index.js.map +1 -1
  78. package/utils/html-to-hast.js +1 -0
  79. package/utils/html-to-hast.js.map +1 -1
@@ -0,0 +1,98 @@
1
+ import { CodeBlock16 } from '@toptal/picasso';
2
+ import React, { useCallback, useState } from 'react';
3
+ import { $createLineBreakNode, $createParagraphNode, $getSelection, $isElementNode, $isRangeSelection, ElementNode, } from 'lexical';
4
+ import { $getNearestNodeOfType } from '@lexical/utils';
5
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
6
+ import { $setBlocksType } from '@lexical/selection';
7
+ import { useRTEPluginContext, useRTEUpdate } from '../api';
8
+ import RichTextEditorButton from '../../RichTextEditorButton';
9
+ import { $createCodeBlockTextNode, $createCodeBlockNode, $isCodeBlockNode, } from './nodes';
10
+ import { getSelectedNode } from '../../LexicalEditor/utils';
11
+ // go up through the tree and find the nearest block node (paragraph, heading, list, etc)
12
+ const getParentBlockNode = (node) => {
13
+ if (!node) {
14
+ return null;
15
+ }
16
+ const elementNode = $getNearestNodeOfType(node, ElementNode);
17
+ if (!elementNode) {
18
+ return null;
19
+ }
20
+ if (elementNode.isInline()) {
21
+ return getParentBlockNode(elementNode.getParent());
22
+ }
23
+ return elementNode;
24
+ };
25
+ const getBlockNodesInSelection = () => {
26
+ const selection = $getSelection();
27
+ if (!$isRangeSelection(selection)) {
28
+ return [];
29
+ }
30
+ let blockNodesInSelection = selection
31
+ .getNodes()
32
+ .filter($isElementNode)
33
+ .filter(node => node.isInline() === false);
34
+ const isBlockNodesEmpty = blockNodesInSelection.length === 0;
35
+ if (isBlockNodesEmpty) {
36
+ const selectedNode = getSelectedNode(selection);
37
+ const blockNode = getParentBlockNode(selectedNode);
38
+ if (!blockNode) {
39
+ return [];
40
+ }
41
+ blockNodesInSelection = [blockNode];
42
+ }
43
+ return blockNodesInSelection;
44
+ };
45
+ const appendTextToCodeBlock = (node, codeBlock, isLast) => {
46
+ const text = node.getTextContent();
47
+ if (text) {
48
+ codeBlock.append($createCodeBlockTextNode(text));
49
+ }
50
+ if (!isLast) {
51
+ codeBlock.append($createLineBreakNode());
52
+ }
53
+ };
54
+ const replaceChildrenNodesWithRawText = (selection) => {
55
+ $setBlocksType(selection, () => $createParagraphNode());
56
+ const codeBlock = $createCodeBlockNode();
57
+ const blockNodesInSelection = getBlockNodesInSelection();
58
+ if (blockNodesInSelection.length === 0) {
59
+ return;
60
+ }
61
+ blockNodesInSelection.forEach((node, index) => {
62
+ const isLast = index === blockNodesInSelection.length - 1;
63
+ appendTextToCodeBlock(node, codeBlock, isLast);
64
+ if (isLast) {
65
+ node.insertAfter(codeBlock);
66
+ }
67
+ node.remove();
68
+ });
69
+ codeBlock.select();
70
+ };
71
+ const CodeBlockButton = ({ 'data-testid': testId }) => {
72
+ const [isButtonActive, setButtonActive] = useState(false);
73
+ const [editor] = useLexicalComposerContext();
74
+ const { disabled, focused } = useRTEPluginContext();
75
+ const handleClick = useCallback(() => {
76
+ editor.update(() => {
77
+ const selection = $getSelection();
78
+ if ($isRangeSelection(selection)) {
79
+ if (isButtonActive) {
80
+ return $setBlocksType(selection, () => $createParagraphNode());
81
+ }
82
+ replaceChildrenNodesWithRawText(selection);
83
+ }
84
+ });
85
+ }, [editor, isButtonActive]);
86
+ useRTEUpdate(() => {
87
+ const selection = $getSelection();
88
+ if ($isRangeSelection(selection)) {
89
+ const node = getSelectedNode(selection);
90
+ const parent = node.getParent();
91
+ const isCodeBlockSelected = $isCodeBlockNode(parent) || $isCodeBlockNode(node);
92
+ setButtonActive(isCodeBlockSelected);
93
+ }
94
+ });
95
+ return (React.createElement(RichTextEditorButton, { icon: React.createElement(CodeBlock16, null), onClick: handleClick, active: isButtonActive, disabled: disabled || !focused, "data-testid": testId }));
96
+ };
97
+ export default CodeBlockButton;
98
+ //# sourceMappingURL=CodeBlockButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeBlockButton.js","sourceRoot":"","sources":["../../../src/plugins/CodeBlockPlugin/CodeBlockButton.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { RTEPlugin } from '../api';
2
+ export declare type Props = {
3
+ testIds?: {
4
+ button?: string;
5
+ };
6
+ };
7
+ declare const CodeBlockPlugin: RTEPlugin<Props>;
8
+ export default CodeBlockPlugin;
@@ -0,0 +1,43 @@
1
+ import React, { useEffect } from 'react';
2
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
3
+ import { mergeRegister } from '@lexical/utils';
4
+ import { $createTextNode, TextNode } from 'lexical';
5
+ import { RTEPluginMeta, Toolbar } from '../api';
6
+ import CodeBlockButton from './CodeBlockButton';
7
+ import { $isCodeBlockNode, CodeBlockNode, $createCodeBlockTextNode, CodeBlockTextNode, } from './nodes';
8
+ const PLUGIN_NAME = 'code-block';
9
+ const textNodeTransform = (node) => {
10
+ // Since CodeNode has flat children structure we only need to check
11
+ // if node's parent is a code node and run highlighting if so
12
+ const parentNode = node.getParent();
13
+ if ($isCodeBlockNode(parentNode)) {
14
+ const text = node.getTextContent();
15
+ const codeTextNode = $createCodeBlockTextNode(text);
16
+ node.replace(codeTextNode);
17
+ }
18
+ };
19
+ // when code block is converted to paragraph
20
+ const codeBlockTextNodeTransform = (node) => {
21
+ const parentNode = node.getParent();
22
+ if ($isCodeBlockNode(parentNode)) {
23
+ return;
24
+ }
25
+ node.replace($createTextNode(node.__text));
26
+ };
27
+ const CodeBlockPlugin = ({ testIds = {} }) => {
28
+ const [editor] = useLexicalComposerContext();
29
+ useEffect(() => {
30
+ return mergeRegister(editor.registerNodeTransform(TextNode, textNodeTransform), editor.registerNodeTransform(CodeBlockTextNode, codeBlockTextNodeTransform));
31
+ }, [editor]);
32
+ return (React.createElement(React.Fragment, null,
33
+ React.createElement(Toolbar, { keyName: PLUGIN_NAME },
34
+ React.createElement(CodeBlockButton, { "data-testid": testIds.button }))));
35
+ };
36
+ CodeBlockPlugin[RTEPluginMeta] = {
37
+ name: PLUGIN_NAME,
38
+ lexical: {
39
+ nodes: [CodeBlockNode, CodeBlockTextNode],
40
+ },
41
+ };
42
+ export default CodeBlockPlugin;
43
+ //# sourceMappingURL=CodeBlockPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeBlockPlugin.js","sourceRoot":"","sources":["../../../src/plugins/CodeBlockPlugin/CodeBlockPlugin.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAA;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGnD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,eAAe,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,GAAG,YAAY,CAAA;AAQhC,MAAM,iBAAiB,GAAG,CAAC,IAAc,EAAQ,EAAE;IACjD,mEAAmE;IACnE,6DAA6D;IAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;IAEnC,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QAElC,MAAM,YAAY,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAA;QAEnD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;KAC3B;AACH,CAAC,CAAA;AAED,4CAA4C;AAC5C,MAAM,0BAA0B,GAAG,CAAC,IAAuB,EAAQ,EAAE;IACnE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;IAEnC,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE;QAChC,OAAM;KACP;IAED,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;AAC5C,CAAC,CAAA;AAED,MAAM,eAAe,GAAqB,CAAC,EAAE,OAAO,GAAG,EAAE,EAAS,EAAE,EAAE;IACpE,MAAM,CAAC,MAAM,CAAC,GAAG,yBAAyB,EAAE,CAAA;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,aAAa,CAClB,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,EACzD,MAAM,CAAC,qBAAqB,CAC1B,iBAAiB,EACjB,0BAA0B,CAC3B,CACF,CAAA;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAEZ,OAAO,CACL;QACE,oBAAC,OAAO,IAAC,OAAO,EAAE,WAAW;YAC3B,oBAAC,eAAe,mBAAc,OAAO,CAAC,MAAM,GAAI,CACxC,CACT,CACJ,CAAA;AACH,CAAC,CAAA;AAED,eAAe,CAAC,aAAa,CAAC,GAAG;IAC/B,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE;QACP,KAAK,EAAE,CAAC,aAAa,EAAE,iBAAiB,CAAC;KAC1C;CACF,CAAA;AAED,eAAe,eAAe,CAAA"}
@@ -0,0 +1 @@
1
+ export { default, Props } from './CodeBlockPlugin';
@@ -0,0 +1,2 @@
1
+ export { default } from './CodeBlockPlugin';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/CodeBlockPlugin/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,18 @@
1
+ import type { DOMConversionMap, DOMExportOutput, EditorConfig, NodeKey, ParagraphNode, RangeSelection, SerializedElementNode } from 'lexical';
2
+ import { ElementNode } from 'lexical';
3
+ import type { CodeBlockTextNode } from '../nodes';
4
+ export declare class CodeBlockNode extends ElementNode {
5
+ static getType(): string;
6
+ static clone(node: CodeBlockNode): CodeBlockNode;
7
+ constructor(key?: NodeKey);
8
+ createDOM(config: EditorConfig): HTMLElement;
9
+ updateDOM(): boolean;
10
+ exportDOM(): DOMExportOutput;
11
+ static importDOM(): DOMConversionMap | null;
12
+ static importJSON(serializedNode: SerializedElementNode): CodeBlockNode;
13
+ exportJSON(): SerializedElementNode;
14
+ canIndent(): boolean;
15
+ extractWithChild(): boolean;
16
+ insertNewAfter(selection: RangeSelection, restoreSelection?: boolean): null | ParagraphNode | CodeBlockTextNode;
17
+ collapseAtStart(): boolean;
18
+ }
@@ -0,0 +1,135 @@
1
+ import { $createLineBreakNode, $createParagraphNode, ElementNode, } from 'lexical';
2
+ import { $createCodeBlockNode, $createCodeBlockTextNode, $isCodeBlockTextNode, } from '../nodes';
3
+ import hasChildDOMNodeTag from '../../../LexicalEditor/utils/hasChildDOMNodeTag';
4
+ import { getFirstCodeNodeOfLine } from '../utils';
5
+ const convertPreElement = () => {
6
+ return { node: $createCodeBlockNode() };
7
+ };
8
+ const ELEMENT_TYPE = 'code-block';
9
+ export class CodeBlockNode extends ElementNode {
10
+ static getType() {
11
+ return ELEMENT_TYPE;
12
+ }
13
+ static clone(node) {
14
+ return new CodeBlockNode(node.__key);
15
+ }
16
+ constructor(key) {
17
+ super(key);
18
+ }
19
+ createDOM(config) {
20
+ const element = document.createElement('code');
21
+ const theme = config.theme;
22
+ const className = theme.codeBlock;
23
+ if (className !== undefined) {
24
+ element.className = className;
25
+ }
26
+ return element;
27
+ }
28
+ updateDOM() {
29
+ return false;
30
+ }
31
+ exportDOM() {
32
+ const element = document.createElement('pre');
33
+ return { element };
34
+ }
35
+ static importDOM() {
36
+ return {
37
+ // Typically <pre> is used for code blocks, and <code> for inline code styles
38
+ // but if it's a multi line <code> we'll create a block. Pass through to
39
+ // inline format handled by TextNode otherwise.
40
+ code: (node) => {
41
+ const isMultiLine = node.textContent != null &&
42
+ (/\r?\n/.test(node.textContent) || hasChildDOMNodeTag(node, 'BR'));
43
+ return isMultiLine
44
+ ? {
45
+ conversion: convertPreElement,
46
+ priority: 1,
47
+ }
48
+ : null;
49
+ },
50
+ pre: () => ({
51
+ conversion: convertPreElement,
52
+ priority: 0,
53
+ }),
54
+ };
55
+ }
56
+ static importJSON(serializedNode) {
57
+ const node = $createCodeBlockNode();
58
+ node.setFormat(serializedNode.format);
59
+ node.setIndent(serializedNode.indent);
60
+ node.setDirection(serializedNode.direction);
61
+ return node;
62
+ }
63
+ exportJSON() {
64
+ return Object.assign(Object.assign({}, super.exportJSON()), { type: ELEMENT_TYPE, version: 1 });
65
+ }
66
+ canIndent() {
67
+ return false;
68
+ }
69
+ extractWithChild() {
70
+ return true;
71
+ }
72
+ // eslint-disable-next-line max-statements, complexity
73
+ insertNewAfter(selection, restoreSelection = true) {
74
+ const children = this.getChildren();
75
+ const childrenLength = children.length;
76
+ if (childrenLength >= 2 &&
77
+ children[childrenLength - 1].getTextContent() === '\n' &&
78
+ children[childrenLength - 2].getTextContent() === '\n' &&
79
+ selection.isCollapsed() &&
80
+ selection.anchor.key === this.__key &&
81
+ selection.anchor.offset === childrenLength) {
82
+ children[childrenLength - 1].remove();
83
+ children[childrenLength - 2].remove();
84
+ const newElement = $createParagraphNode();
85
+ this.insertAfter(newElement, restoreSelection);
86
+ return newElement;
87
+ }
88
+ // If the selection is within the codeblock, find all leading tabs and
89
+ // spaces of the current line. Create a new line that has all those
90
+ // tabs and spaces, such that leading indentation is preserved.
91
+ const anchor = selection.anchor;
92
+ const focus = selection.focus;
93
+ const firstPoint = anchor.isBefore(focus) ? anchor : focus;
94
+ const firstSelectionNode = firstPoint.getNode();
95
+ if ($isCodeBlockTextNode(firstSelectionNode)) {
96
+ let node = getFirstCodeNodeOfLine(firstSelectionNode);
97
+ const insertNodes = [];
98
+ // eslint-disable-next-line no-constant-condition
99
+ while (true) {
100
+ if ($isCodeBlockTextNode(node)) {
101
+ const text = node.getTextContent();
102
+ const textSize = node.getTextContentSize();
103
+ // eslint-disable-next-line max-depth
104
+ for (let spaces = 0; spaces < textSize && text[spaces] === ' '; spaces++) {
105
+ // eslint-disable-next-line max-depth
106
+ if (spaces !== 0) {
107
+ insertNodes.push($createCodeBlockTextNode(' '.repeat(spaces)));
108
+ }
109
+ // eslint-disable-next-line max-depth
110
+ if (spaces !== textSize) {
111
+ break;
112
+ }
113
+ }
114
+ node = node.getNextSibling();
115
+ }
116
+ else {
117
+ break;
118
+ }
119
+ }
120
+ if (insertNodes.length > 0) {
121
+ selection.insertNodes([$createLineBreakNode(), ...insertNodes]);
122
+ return insertNodes[insertNodes.length - 1];
123
+ }
124
+ }
125
+ return null;
126
+ }
127
+ collapseAtStart() {
128
+ const paragraph = $createParagraphNode();
129
+ const children = this.getChildren();
130
+ children.forEach(child => paragraph.append(child));
131
+ this.replace(paragraph);
132
+ return true;
133
+ }
134
+ }
135
+ //# sourceMappingURL=CodeBlockNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeBlockNode.js","sourceRoot":"","sources":["../../../../src/plugins/CodeBlockPlugin/nodes/CodeBlockNode.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { SerializedTextNode, EditorConfig, NodeKey } from 'lexical';
2
+ import { TextNode } from 'lexical';
3
+ import type { CodeBlockNode } from '../nodes';
4
+ export declare class CodeBlockTextNode extends TextNode {
5
+ constructor(text: string, key?: NodeKey);
6
+ static getType(): string;
7
+ static clone(node: CodeBlockTextNode): CodeBlockTextNode;
8
+ static importJSON(serializedNode: SerializedTextNode): CodeBlockTextNode;
9
+ createDOM(config: EditorConfig): HTMLElement;
10
+ exportJSON(): SerializedTextNode;
11
+ setFormat(): this;
12
+ isParentRequired(): boolean;
13
+ createParentElementNode(): CodeBlockNode;
14
+ }
@@ -0,0 +1,43 @@
1
+ import { TextNode } from 'lexical';
2
+ import { $createCodeBlockNode, $createCodeBlockTextNode } from '../nodes';
3
+ const ELEMENT_TYPE = 'code-block-text';
4
+ export class CodeBlockTextNode extends TextNode {
5
+ constructor(text, key) {
6
+ super(text, key);
7
+ }
8
+ static getType() {
9
+ return ELEMENT_TYPE;
10
+ }
11
+ static clone(node) {
12
+ return new CodeBlockTextNode(node.__text, node.__key);
13
+ }
14
+ static importJSON(serializedNode) {
15
+ console.log('importJSON');
16
+ const { text } = serializedNode;
17
+ const node = $createCodeBlockTextNode(text);
18
+ return node;
19
+ }
20
+ createDOM(config) {
21
+ const element = super.createDOM(config);
22
+ const theme = config.theme;
23
+ const className = theme.codeBlockText;
24
+ if (className !== undefined) {
25
+ element.className = className;
26
+ }
27
+ return element;
28
+ }
29
+ exportJSON() {
30
+ return Object.assign(Object.assign({}, super.exportJSON()), { type: ELEMENT_TYPE, version: 1 });
31
+ }
32
+ // prevent formatting
33
+ setFormat() {
34
+ return this;
35
+ }
36
+ isParentRequired() {
37
+ return true;
38
+ }
39
+ createParentElementNode() {
40
+ return $createCodeBlockNode();
41
+ }
42
+ }
43
+ //# sourceMappingURL=CodeBlockTextNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeBlockTextNode.js","sourceRoot":"","sources":["../../../../src/plugins/CodeBlockPlugin/nodes/CodeBlockTextNode.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAGzE,MAAM,YAAY,GAAG,iBAAiB,CAAA;AAEtC,MAAM,OAAO,iBAAkB,SAAQ,QAAQ;IAC7C,YAAY,IAAY,EAAE,GAAa;QACrC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAClB,CAAC;IAED,MAAM,CAAC,OAAO;QACZ,OAAO,YAAY,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAuB;QAClC,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IACvD,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,cAAkC;QAClD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QACzB,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,CAAA;QAE/B,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAA;QAE3C,OAAO,IAAI,CAAA;IACb,CAAC;IAED,SAAS,CAAC,MAAoB;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAEvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;QAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAAA;QAErC,IAAI,SAAS,KAAK,SAAS,EAAE;YAC3B,OAAO,CAAC,SAAS,GAAG,SAAS,CAAA;SAC9B;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,UAAU;QACR,uCACK,KAAK,CAAC,UAAU,EAAE,KACrB,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,CAAC,IACX;IACH,CAAC;IAED,qBAAqB;IACrB,SAAS;QACP,OAAO,IAAI,CAAA;IACb,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAA;IACb,CAAC;IAED,uBAAuB;QACrB,OAAO,oBAAoB,EAAE,CAAA;IAC/B,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { LexicalNode } from 'lexical';
2
+ import { CodeBlockNode } from './CodeBlockNode';
3
+ import { CodeBlockTextNode } from './CodeBlockTextNode';
4
+ export declare const $createCodeBlockNode: () => CodeBlockNode;
5
+ export declare const $isCodeBlockNode: (node: LexicalNode | null | undefined) => node is CodeBlockNode;
6
+ export declare const $isCodeBlockTextNode: (node: LexicalNode | CodeBlockTextNode | null | undefined) => node is CodeBlockTextNode;
7
+ export declare const $createCodeBlockTextNode: (text: string) => CodeBlockTextNode;
8
+ export { CodeBlockNode, CodeBlockTextNode };
@@ -0,0 +1,15 @@
1
+ import { $applyNodeReplacement } from 'lexical';
2
+ import { CodeBlockNode } from './CodeBlockNode';
3
+ import { CodeBlockTextNode } from './CodeBlockTextNode';
4
+ export const $createCodeBlockNode = () => $applyNodeReplacement(new CodeBlockNode());
5
+ export const $isCodeBlockNode = (node) => {
6
+ return node instanceof CodeBlockNode;
7
+ };
8
+ export const $isCodeBlockTextNode = (node) => {
9
+ return node instanceof CodeBlockTextNode;
10
+ };
11
+ export const $createCodeBlockTextNode = (text) => {
12
+ return $applyNodeReplacement(new CodeBlockTextNode(text));
13
+ };
14
+ export { CodeBlockNode, CodeBlockTextNode };
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/CodeBlockPlugin/nodes/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAkB,EAAE,CACtD,qBAAqB,CAAC,IAAI,aAAa,EAAE,CAAC,CAAA;AAE5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAoC,EACb,EAAE;IACzB,OAAO,IAAI,YAAY,aAAa,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,IAAwD,EAC7B,EAAE;IAC7B,OAAO,IAAI,YAAY,iBAAiB,CAAA;AAC1C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAAY,EAAqB,EAAE;IAC1E,OAAO,qBAAqB,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAA;AAC3D,CAAC,CAAA;AAED,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { LineBreakNode } from 'lexical';
2
+ import type { CodeBlockTextNode } from '../nodes';
3
+ declare const getFirstCodeNodeOfLine: (anchor: CodeBlockTextNode | LineBreakNode) => null | CodeBlockTextNode | LineBreakNode;
4
+ export default getFirstCodeNodeOfLine;
@@ -0,0 +1,12 @@
1
+ import { $isCodeBlockTextNode } from '../nodes';
2
+ const getFirstCodeNodeOfLine = (anchor) => {
3
+ let previousNode = anchor;
4
+ let node = anchor;
5
+ while ($isCodeBlockTextNode(node)) {
6
+ previousNode = node;
7
+ node = node.getPreviousSibling();
8
+ }
9
+ return previousNode;
10
+ };
11
+ export default getFirstCodeNodeOfLine;
12
+ //# sourceMappingURL=getFirstCodeNodeOfLine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFirstCodeNodeOfLine.js","sourceRoot":"","sources":["../../../../src/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAE/C,MAAM,sBAAsB,GAAG,CAC7B,MAAyC,EACC,EAAE;IAC5C,IAAI,YAAY,GAAG,MAAM,CAAA;IACzB,IAAI,IAAI,GAAuB,MAAM,CAAA;IAErC,OAAO,oBAAoB,CAAC,IAAI,CAAC,EAAE;QACjC,YAAY,GAAG,IAAI,CAAA;QACnB,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAA;KACjC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA;AAED,eAAe,sBAAsB,CAAA"}
@@ -0,0 +1,66 @@
1
+ import { $isCodeBlockTextNode } from '../nodes';
2
+ import getFirstCodeNodeOfLine from './getFirstCodeNodeOfLine';
3
+ jest.mock('../nodes', () => ({
4
+ __esModule: true,
5
+ $isCodeBlockTextNode: jest.fn(),
6
+ }));
7
+ // Mocking the function and methods
8
+ const getPreviousSibling = jest.fn();
9
+ const $isCodeBlockTextNodeMock = $isCodeBlockTextNode;
10
+ describe('getFirstCodeNodeOfLine', () => {
11
+ afterEach(() => {
12
+ jest.resetAllMocks();
13
+ });
14
+ describe('when the provided node is a CodeBlockTextNode', () => {
15
+ it('returns the first CodeBlockTextNode', () => {
16
+ const codeBlockTextNode = {
17
+ getPreviousSibling,
18
+ };
19
+ $isCodeBlockTextNodeMock
20
+ .mockReturnValueOnce(true)
21
+ .mockReturnValueOnce(false);
22
+ getPreviousSibling.mockReturnValueOnce(null);
23
+ const result = getFirstCodeNodeOfLine(codeBlockTextNode);
24
+ expect(result).toBe(codeBlockTextNode);
25
+ expect($isCodeBlockTextNode).toHaveBeenCalledWith(codeBlockTextNode);
26
+ expect(getPreviousSibling).toHaveBeenCalledTimes(1);
27
+ });
28
+ });
29
+ describe('when the provided node is a LineBreakNode', () => {
30
+ it('returns the provided node as it is', () => {
31
+ const lineBreakNode = {
32
+ getPreviousSibling,
33
+ };
34
+ $isCodeBlockTextNodeMock.mockReturnValue(false);
35
+ const result = getFirstCodeNodeOfLine(lineBreakNode);
36
+ expect(result).toBe(lineBreakNode);
37
+ expect($isCodeBlockTextNodeMock).toHaveBeenCalledWith(lineBreakNode);
38
+ expect(getPreviousSibling).toHaveBeenCalledTimes(0);
39
+ });
40
+ });
41
+ describe('when the provided node is a CodeBlockTextNode with a non-CodeBlockTextNode in the sibling chain', () => {
42
+ it('returns the first CodeBlockTextNode until the non-CodeBlockTextNode', () => {
43
+ const firstCodeBlockTextNode = {
44
+ getPreviousSibling,
45
+ };
46
+ const secondCodeBlockTextNode = { getPreviousSibling };
47
+ const nonCodeBlockTextNode = { getPreviousSibling };
48
+ const thirdCodeBlockTextNode = { getPreviousSibling };
49
+ $isCodeBlockTextNodeMock
50
+ .mockReturnValueOnce(true)
51
+ .mockReturnValueOnce(true)
52
+ .mockReturnValueOnce(false)
53
+ .mockReturnValueOnce(true);
54
+ getPreviousSibling
55
+ .mockReturnValueOnce(secondCodeBlockTextNode)
56
+ .mockReturnValueOnce(nonCodeBlockTextNode)
57
+ .mockReturnValueOnce(thirdCodeBlockTextNode)
58
+ .mockReturnValueOnce(null);
59
+ const result = getFirstCodeNodeOfLine(firstCodeBlockTextNode);
60
+ expect(result).toBe(secondCodeBlockTextNode);
61
+ expect($isCodeBlockTextNode).toHaveBeenCalledTimes(3);
62
+ expect(getPreviousSibling).toHaveBeenCalledTimes(2);
63
+ });
64
+ });
65
+ });
66
+ //# sourceMappingURL=getFirstCodeNodeOfLine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFirstCodeNodeOfLine.test.js","sourceRoot":"","sources":["../../../../src/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.test.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAC/C,OAAO,sBAAsB,MAAM,0BAA0B,CAAA;AAE7D,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,UAAU,EAAE,IAAI;IAChB,oBAAoB,EAAE,IAAI,CAAC,EAAE,EAAE;CAChC,CAAC,CAAC,CAAA;AACH,mCAAmC;AACnC,MAAM,kBAAkB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAA;AAEpC,MAAM,wBAAwB,GAAG,oBAEhC,CAAA;AAED,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;QAC7D,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,iBAAiB,GAAG;gBACxB,kBAAkB;aACa,CAAA;YAEjC,wBAAwB;iBACrB,mBAAmB,CAAC,IAAI,CAAC;iBACzB,mBAAmB,CAAC,KAAK,CAAC,CAAA;YAC7B,kBAAkB,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;YAE5C,MAAM,MAAM,GAAG,sBAAsB,CAAC,iBAAiB,CAAC,CAAA;YAExD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YACtC,MAAM,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAA;YACpE,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACzD,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,aAAa,GAAG;gBACpB,kBAAkB;aACS,CAAA;YAE7B,wBAAwB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;YAE/C,MAAM,MAAM,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAA;YAEpD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YAClC,MAAM,CAAC,wBAAwB,CAAC,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAA;YACpE,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,iGAAiG,EAAE,GAAG,EAAE;QAC/G,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC7E,MAAM,sBAAsB,GAAG;gBAC7B,kBAAkB;aACa,CAAA;YACjC,MAAM,uBAAuB,GAAG,EAAE,kBAAkB,EAAE,CAAA;YACtD,MAAM,oBAAoB,GAAG,EAAE,kBAAkB,EAAE,CAAA;YACnD,MAAM,sBAAsB,GAAG,EAAE,kBAAkB,EAAE,CAAA;YAErD,wBAAwB;iBACrB,mBAAmB,CAAC,IAAI,CAAC;iBACzB,mBAAmB,CAAC,IAAI,CAAC;iBACzB,mBAAmB,CAAC,KAAK,CAAC;iBAC1B,mBAAmB,CAAC,IAAI,CAAC,CAAA;YAC5B,kBAAkB;iBACf,mBAAmB,CAAC,uBAAuB,CAAC;iBAC5C,mBAAmB,CAAC,oBAAoB,CAAC;iBACzC,mBAAmB,CAAC,sBAAsB,CAAC;iBAC3C,mBAAmB,CAAC,IAAI,CAAC,CAAA;YAE5B,MAAM,MAAM,GAAG,sBAAsB,CAAC,sBAAsB,CAAC,CAAA;YAE7D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;YAC5C,MAAM,CAAC,oBAAoB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;YACrD,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export { default as getFirstCodeNodeOfLine } from './getFirstCodeNodeOfLine';
@@ -0,0 +1,2 @@
1
+ export { default as getFirstCodeNodeOfLine } from './getFirstCodeNodeOfLine';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/CodeBlockPlugin/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -7,7 +7,7 @@ import RichTextEditorButton from '../../RichTextEditorButton';
7
7
  const CodeButton = ({ 'data-testid': testId }) => {
8
8
  const [active, setActive] = useState(false);
9
9
  const [editor] = useLexicalComposerContext();
10
- const { disabled, focused } = useRTEPluginContext();
10
+ const { disabled, focused, disabledFormatting } = useRTEPluginContext();
11
11
  useRTEUpdate(() => {
12
12
  const selection = $getSelection();
13
13
  if ($isRangeSelection(selection)) {
@@ -17,7 +17,8 @@ const CodeButton = ({ 'data-testid': testId }) => {
17
17
  const handleCodeClick = () => {
18
18
  editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code');
19
19
  };
20
- return (React.createElement(RichTextEditorButton, { icon: React.createElement(Code16, null), onClick: handleCodeClick, active: active, disabled: disabled || !focused, "data-testid": testId }));
20
+ const isDisabled = disabled || !focused || disabledFormatting;
21
+ return (React.createElement(RichTextEditorButton, { icon: React.createElement(Code16, null), onClick: handleCodeClick, active: isDisabled ? false : active, disabled: isDisabled, "data-testid": testId }));
21
22
  };
22
23
  export default CodeButton;
23
24
  //# sourceMappingURL=CodeButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CodeButton.js","sourceRoot":"","sources":["../../../src/plugins/CodePlugin/CodeButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAA;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC/E,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAC1D,OAAO,oBAAoB,MAAM,4BAA4B,CAAA;AAM7D,MAAM,UAAU,GAAG,CAAC,EAAE,aAAa,EAAE,MAAM,EAAS,EAAE,EAAE;IACtD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,CAAC,MAAM,CAAC,GAAG,yBAAyB,EAAE,CAAA;IAC5C,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,mBAAmB,EAAE,CAAA;IAEnD,YAAY,CAAC,GAAG,EAAE;QAChB,MAAM,SAAS,GAAG,aAAa,EAAE,CAAA;QAEjC,IAAI,iBAAiB,CAAC,SAAS,CAAC,EAAE;YAChC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;SACvC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,MAAM,CAAC,eAAe,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAA;IACrD,CAAC,CAAA;IAED,OAAO,CACL,oBAAC,oBAAoB,IACnB,IAAI,EAAE,oBAAC,MAAM,OAAG,EAChB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,IAAI,CAAC,OAAO,iBACjB,MAAM,GACnB,CACH,CAAA;AACH,CAAC,CAAA;AAED,eAAe,UAAU,CAAA"}
1
+ {"version":3,"file":"CodeButton.js","sourceRoot":"","sources":["../../../src/plugins/CodePlugin/CodeButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAA;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC/E,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAC1D,OAAO,oBAAoB,MAAM,4BAA4B,CAAA;AAM7D,MAAM,UAAU,GAAG,CAAC,EAAE,aAAa,EAAE,MAAM,EAAS,EAAE,EAAE;IACtD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,CAAC,MAAM,CAAC,GAAG,yBAAyB,EAAE,CAAA;IAC5C,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,mBAAmB,EAAE,CAAA;IAEvE,YAAY,CAAC,GAAG,EAAE;QAChB,MAAM,SAAS,GAAG,aAAa,EAAE,CAAA;QAEjC,IAAI,iBAAiB,CAAC,SAAS,CAAC,EAAE;YAChC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;SACvC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,MAAM,CAAC,eAAe,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAA;IACrD,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,QAAQ,IAAI,CAAC,OAAO,IAAI,kBAAkB,CAAA;IAE7D,OAAO,CACL,oBAAC,oBAAoB,IACnB,IAAI,EAAE,oBAAC,MAAM,OAAG,EAChB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EACnC,QAAQ,EAAE,UAAU,iBACP,MAAM,GACnB,CACH,CAAA;AACH,CAAC,CAAA;AAED,eAAe,UAAU,CAAA"}
@@ -3,8 +3,8 @@ import React from 'react';
3
3
  import { useRTEPluginContext } from '../../../api';
4
4
  import RichTextEditorButton from '../../../../RichTextEditorButton';
5
5
  const ImagePluginButton = ({ 'data-testid': testId, onClick }) => {
6
- const { disabled, focused } = useRTEPluginContext();
7
- return (React.createElement(RichTextEditorButton, { icon: React.createElement(Image16, null), onClick: onClick, disabled: disabled || !focused, "data-testid": testId }));
6
+ const { disabled, focused, disabledFormatting } = useRTEPluginContext();
7
+ return (React.createElement(RichTextEditorButton, { icon: React.createElement(Image16, null), onClick: onClick, disabled: disabled || !focused || disabledFormatting, "data-testid": testId }));
8
8
  };
9
9
  export default ImagePluginButton;
10
10
  //# sourceMappingURL=ImagePluginButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImagePluginButton.js","sourceRoot":"","sources":["../../../../../src/plugins/ImagePlugin/components/ImagePluginButton/ImagePluginButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,oBAAoB,MAAM,kCAAkC,CAAA;AAOnE,MAAM,iBAAiB,GAAG,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAS,EAAE,EAAE;IACtE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,mBAAmB,EAAE,CAAA;IAEnD,OAAO,CACL,oBAAC,oBAAoB,IACnB,IAAI,EAAE,oBAAC,OAAO,OAAG,EACjB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,IAAI,CAAC,OAAO,iBACjB,MAAM,GACnB,CACH,CAAA;AACH,CAAC,CAAA;AAED,eAAe,iBAAiB,CAAA"}
1
+ {"version":3,"file":"ImagePluginButton.js","sourceRoot":"","sources":["../../../../../src/plugins/ImagePlugin/components/ImagePluginButton/ImagePluginButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,oBAAoB,MAAM,kCAAkC,CAAA;AAOnE,MAAM,iBAAiB,GAAG,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAS,EAAE,EAAE;IACtE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,mBAAmB,EAAE,CAAA;IAEvE,OAAO,CACL,oBAAC,oBAAoB,IACnB,IAAI,EAAE,oBAAC,OAAO,OAAG,EACjB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,IAAI,CAAC,OAAO,IAAI,kBAAkB,iBACvC,MAAM,GACnB,CACH,CAAA;AACH,CAAC,CAAA;AAED,eAAe,iBAAiB,CAAA"}
@@ -10,7 +10,7 @@ import { sanitizeUrl, validateUrl } from './utils/url';
10
10
  const LinkPluginButton = ({ 'data-testid': testId }) => {
11
11
  const [active, setActive] = useState(false);
12
12
  const [editor] = useLexicalComposerContext();
13
- const { disabled, focused } = useRTEPluginContext();
13
+ const { disabled, focused, disabledFormatting } = useRTEPluginContext();
14
14
  useRTEUpdate(() => {
15
15
  const selection = $getSelection();
16
16
  if ($isRangeSelection(selection)) {
@@ -58,7 +58,8 @@ const LinkPluginButton = ({ 'data-testid': testId }) => {
58
58
  }
59
59
  });
60
60
  }, [editor, active]);
61
- return (React.createElement(RichTextEditorButton, { icon: React.createElement(Link16, null), onClick: onLinkClick, active: active, disabled: disabled || !focused, "data-testid": testId }));
61
+ const isDisabled = disabled || !focused || disabledFormatting;
62
+ return (React.createElement(RichTextEditorButton, { icon: React.createElement(Link16, null), onClick: onLinkClick, active: isDisabled ? false : active, disabled: isDisabled, "data-testid": testId }));
62
63
  };
63
64
  export default LinkPluginButton;
64
65
  //# sourceMappingURL=LinkPluginButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LinkPluginButton.js","sourceRoot":"","sources":["../../../src/plugins/LinkPlugin/LinkPluginButton.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LinkPluginButton.js","sourceRoot":"","sources":["../../../src/plugins/LinkPlugin/LinkPluginButton.tsx"],"names":[],"mappings":"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"}