phx-react 1.3.648 → 1.3.650

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 (61) hide show
  1. package/dist/cjs/index.d.ts +1 -2
  2. package/dist/cjs/index.js +2 -4
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/esm/index.d.ts +1 -2
  5. package/dist/esm/index.js +1 -2
  6. package/dist/esm/index.js.map +1 -1
  7. package/package.json +1 -4
  8. package/dist/cjs/components/TextEditor/index.d.ts +0 -1
  9. package/dist/cjs/components/TextEditor/index.js +0 -5
  10. package/dist/cjs/components/TextEditor/index.js.map +0 -1
  11. package/dist/cjs/components/TextEditor/plugins/AutoLinkPlugin.d.ts +0 -2
  12. package/dist/cjs/components/TextEditor/plugins/AutoLinkPlugin.js +0 -32
  13. package/dist/cjs/components/TextEditor/plugins/AutoLinkPlugin.js.map +0 -1
  14. package/dist/cjs/components/TextEditor/plugins/CodeHighlightPlugin.d.ts +0 -1
  15. package/dist/cjs/components/TextEditor/plugins/CodeHighlightPlugin.js +0 -12
  16. package/dist/cjs/components/TextEditor/plugins/CodeHighlightPlugin.js.map +0 -1
  17. package/dist/cjs/components/TextEditor/plugins/ExtendedTextNode.d.ts +0 -8
  18. package/dist/cjs/components/TextEditor/plugins/ExtendedTextNode.js +0 -84
  19. package/dist/cjs/components/TextEditor/plugins/ExtendedTextNode.js.map +0 -1
  20. package/dist/cjs/components/TextEditor/plugins/ListMaxIndentLevelPlugin.d.ts +0 -1
  21. package/dist/cjs/components/TextEditor/plugins/ListMaxIndentLevelPlugin.js +0 -46
  22. package/dist/cjs/components/TextEditor/plugins/ListMaxIndentLevelPlugin.js.map +0 -1
  23. package/dist/cjs/components/TextEditor/plugins/ToolbarPlugin.d.ts +0 -2
  24. package/dist/cjs/components/TextEditor/plugins/ToolbarPlugin.js +0 -507
  25. package/dist/cjs/components/TextEditor/plugins/ToolbarPlugin.js.map +0 -1
  26. package/dist/cjs/components/TextEditor/textEditor.d.ts +0 -2
  27. package/dist/cjs/components/TextEditor/textEditor.js +0 -108
  28. package/dist/cjs/components/TextEditor/textEditor.js.map +0 -1
  29. package/dist/cjs/components/TextEditor/themes/ExampleTheme.d.ts +0 -68
  30. package/dist/cjs/components/TextEditor/themes/ExampleTheme.js +0 -71
  31. package/dist/cjs/components/TextEditor/themes/ExampleTheme.js.map +0 -1
  32. package/dist/cjs/components/TextEditor/ui/DropDown.d.ts +0 -17
  33. package/dist/cjs/components/TextEditor/ui/DropDown.js +0 -142
  34. package/dist/cjs/components/TextEditor/ui/DropDown.js.map +0 -1
  35. package/dist/esm/components/TextEditor/index.d.ts +0 -1
  36. package/dist/esm/components/TextEditor/index.js +0 -2
  37. package/dist/esm/components/TextEditor/index.js.map +0 -1
  38. package/dist/esm/components/TextEditor/plugins/AutoLinkPlugin.d.ts +0 -2
  39. package/dist/esm/components/TextEditor/plugins/AutoLinkPlugin.js +0 -28
  40. package/dist/esm/components/TextEditor/plugins/AutoLinkPlugin.js.map +0 -1
  41. package/dist/esm/components/TextEditor/plugins/CodeHighlightPlugin.d.ts +0 -1
  42. package/dist/esm/components/TextEditor/plugins/CodeHighlightPlugin.js +0 -9
  43. package/dist/esm/components/TextEditor/plugins/CodeHighlightPlugin.js.map +0 -1
  44. package/dist/esm/components/TextEditor/plugins/ExtendedTextNode.d.ts +0 -8
  45. package/dist/esm/components/TextEditor/plugins/ExtendedTextNode.js +0 -81
  46. package/dist/esm/components/TextEditor/plugins/ExtendedTextNode.js.map +0 -1
  47. package/dist/esm/components/TextEditor/plugins/ListMaxIndentLevelPlugin.d.ts +0 -1
  48. package/dist/esm/components/TextEditor/plugins/ListMaxIndentLevelPlugin.js +0 -43
  49. package/dist/esm/components/TextEditor/plugins/ListMaxIndentLevelPlugin.js.map +0 -1
  50. package/dist/esm/components/TextEditor/plugins/ToolbarPlugin.d.ts +0 -2
  51. package/dist/esm/components/TextEditor/plugins/ToolbarPlugin.js +0 -503
  52. package/dist/esm/components/TextEditor/plugins/ToolbarPlugin.js.map +0 -1
  53. package/dist/esm/components/TextEditor/textEditor.d.ts +0 -2
  54. package/dist/esm/components/TextEditor/textEditor.js +0 -103
  55. package/dist/esm/components/TextEditor/textEditor.js.map +0 -1
  56. package/dist/esm/components/TextEditor/themes/ExampleTheme.d.ts +0 -68
  57. package/dist/esm/components/TextEditor/themes/ExampleTheme.js +0 -69
  58. package/dist/esm/components/TextEditor/themes/ExampleTheme.js.map +0 -1
  59. package/dist/esm/components/TextEditor/ui/DropDown.d.ts +0 -17
  60. package/dist/esm/components/TextEditor/ui/DropDown.js +0 -137
  61. package/dist/esm/components/TextEditor/ui/DropDown.js.map +0 -1
@@ -1,81 +0,0 @@
1
- import { __assign, __extends } from "tslib";
2
- import { $isTextNode, TextNode, } from 'lexical';
3
- var ExtendedTextNode = /** @class */ (function (_super) {
4
- __extends(ExtendedTextNode, _super);
5
- function ExtendedTextNode(text, key) {
6
- return _super.call(this, text, key) || this;
7
- }
8
- ExtendedTextNode.getType = function () {
9
- return 'extended-text';
10
- };
11
- ExtendedTextNode.clone = function (node) {
12
- return new ExtendedTextNode(node.__text, node.__key);
13
- };
14
- ExtendedTextNode.importDOM = function () {
15
- var importers = TextNode.importDOM();
16
- return __assign(__assign({}, importers), { code: function () { return ({
17
- conversion: patchStyleConversion(importers === null || importers === void 0 ? void 0 : importers.code),
18
- priority: 1
19
- }); }, em: function () { return ({
20
- conversion: patchStyleConversion(importers === null || importers === void 0 ? void 0 : importers.em),
21
- priority: 1
22
- }); }, span: function () { return ({
23
- conversion: patchStyleConversion(importers === null || importers === void 0 ? void 0 : importers.span),
24
- priority: 1
25
- }); }, strong: function () { return ({
26
- conversion: patchStyleConversion(importers === null || importers === void 0 ? void 0 : importers.strong),
27
- priority: 1
28
- }); }, sub: function () { return ({
29
- conversion: patchStyleConversion(importers === null || importers === void 0 ? void 0 : importers.sub),
30
- priority: 1
31
- }); }, sup: function () { return ({
32
- conversion: patchStyleConversion(importers === null || importers === void 0 ? void 0 : importers.sup),
33
- priority: 1
34
- }); } });
35
- };
36
- ExtendedTextNode.importJSON = function (serializedNode) {
37
- return TextNode.importJSON(serializedNode);
38
- };
39
- return ExtendedTextNode;
40
- }(TextNode));
41
- export { ExtendedTextNode };
42
- function patchStyleConversion(originalDOMConverter) {
43
- return function (node) {
44
- var original = originalDOMConverter === null || originalDOMConverter === void 0 ? void 0 : originalDOMConverter(node);
45
- if (!original) {
46
- return null;
47
- }
48
- var originalOutput = original.conversion(node);
49
- if (!originalOutput) {
50
- return originalOutput;
51
- }
52
- var backgroundColor = node.style.backgroundColor;
53
- var color = node.style.color;
54
- var fontFamily = node.style.fontFamily;
55
- var fontWeight = node.style.fontWeight;
56
- var fontSize = node.style.fontSize;
57
- var textDecoration = node.style.textDecoration;
58
- return __assign(__assign({}, originalOutput), { forChild: function (lexicalNode, parent) {
59
- var _a;
60
- var originalForChild = (_a = originalOutput === null || originalOutput === void 0 ? void 0 : originalOutput.forChild) !== null && _a !== void 0 ? _a : (function (x) { return x; });
61
- var result = originalForChild(lexicalNode, parent);
62
- if ($isTextNode(result)) {
63
- var style = [
64
- backgroundColor ? "background-color: ".concat(backgroundColor) : null,
65
- color ? "color: ".concat(color) : null,
66
- fontFamily ? "font-family: ".concat(fontFamily) : null,
67
- fontWeight ? "font-weight: ".concat(fontWeight) : null,
68
- fontSize ? "font-size: ".concat(fontSize) : null,
69
- textDecoration ? "text-decoration: ".concat(textDecoration) : null,
70
- ]
71
- .filter(function (value) { return value != null; })
72
- .join('; ');
73
- if (style.length > 0) {
74
- return result.setStyle(style);
75
- }
76
- }
77
- return result;
78
- } });
79
- };
80
- }
81
- //# sourceMappingURL=ExtendedTextNode.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExtendedTextNode.js","sourceRoot":"","sources":["../../../../../src/components/TextEditor/plugins/ExtendedTextNode.tsx"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export default function ListMaxIndentLevelPlugin({ maxDepth }: any): null;
@@ -1,43 +0,0 @@
1
- import { $getListDepth, $isListItemNode, $isListNode } from '@lexical/list';
2
- import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
3
- import { $getSelection, $isElementNode, $isRangeSelection, INDENT_CONTENT_COMMAND, COMMAND_PRIORITY_HIGH, } from 'lexical';
4
- import { useEffect } from 'react';
5
- function getElementNodesInSelection(selection) {
6
- var nodesInSelection = selection.getNodes();
7
- if (nodesInSelection.length === 0) {
8
- return new Set([selection.anchor.getNode().getParentOrThrow(), selection.focus.getNode().getParentOrThrow()]);
9
- }
10
- return new Set(nodesInSelection.map(function (n) { return ($isElementNode(n) ? n : n.getParentOrThrow()); }));
11
- }
12
- function isIndentPermitted(maxDepth) {
13
- var selection = $getSelection();
14
- if (!$isRangeSelection(selection)) {
15
- return false;
16
- }
17
- var elementNodesInSelection = getElementNodesInSelection(selection);
18
- var totalDepth = 0;
19
- for (var _i = 0, elementNodesInSelection_1 = elementNodesInSelection; _i < elementNodesInSelection_1.length; _i++) {
20
- var elementNode = elementNodesInSelection_1[_i];
21
- if ($isListNode(elementNode)) {
22
- totalDepth = Math.max($getListDepth(elementNode) + 1, totalDepth);
23
- }
24
- else if ($isListItemNode(elementNode)) {
25
- var parent_1 = elementNode.getParent();
26
- if (!$isListNode(parent_1)) {
27
- throw new Error('ListMaxIndentLevelPlugin: A ListItemNode must have a ListNode for a parent.');
28
- }
29
- totalDepth = Math.max($getListDepth(parent_1) + 1, totalDepth);
30
- }
31
- }
32
- return totalDepth <= maxDepth;
33
- }
34
- // eslint-disable-next-line react/prop-types
35
- export default function ListMaxIndentLevelPlugin(_a) {
36
- var maxDepth = _a.maxDepth;
37
- var editor = useLexicalComposerContext()[0];
38
- useEffect(function () {
39
- return editor.registerCommand(INDENT_CONTENT_COMMAND, function () { return !isIndentPermitted(maxDepth !== null && maxDepth !== void 0 ? maxDepth : 7); }, COMMAND_PRIORITY_HIGH);
40
- }, [editor, maxDepth]);
41
- return null;
42
- }
43
- //# sourceMappingURL=ListMaxIndentLevelPlugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ListMaxIndentLevelPlugin.js","sourceRoot":"","sources":["../../../../../src/components/TextEditor/plugins/ListMaxIndentLevelPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAA;AACjF,OAAO,EACL,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,SAAS,0BAA0B,CAAC,SAAc;IAChD,IAAM,gBAAgB,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAA;IAE7C,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;QACjC,OAAO,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,gBAAgB,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAA;KAC9G;IAED,OAAO,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAC,CAAM,IAAK,OAAA,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,EAA9C,CAA8C,CAAC,CAAC,CAAA;AAClG,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAa;IACtC,IAAM,SAAS,GAAG,aAAa,EAAE,CAAA;IAEjC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE;QACjC,OAAO,KAAK,CAAA;KACb;IAED,IAAM,uBAAuB,GAAQ,0BAA0B,CAAC,SAAS,CAAC,CAAA;IAE1E,IAAI,UAAU,GAAG,CAAC,CAAA;IAElB,KAA0B,UAAuB,EAAvB,mDAAuB,EAAvB,qCAAuB,EAAvB,IAAuB,EAAE;QAA9C,IAAM,WAAW,gCAAA;QACpB,IAAI,WAAW,CAAC,WAAW,CAAC,EAAE;YAC5B,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAA;SAClE;aAAM,IAAI,eAAe,CAAC,WAAW,CAAC,EAAE;YACvC,IAAM,QAAM,GAAG,WAAW,CAAC,SAAS,EAAE,CAAA;YACtC,IAAI,CAAC,WAAW,CAAC,QAAM,CAAC,EAAE;gBACxB,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAA;aAC/F;YAED,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,QAAM,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAA;SAC7D;KACF;IAED,OAAO,UAAU,IAAI,QAAQ,CAAA;AAC/B,CAAC;AACD,4CAA4C;AAC5C,MAAM,CAAC,OAAO,UAAU,wBAAwB,CAAC,EAAiB;QAAf,QAAQ,cAAA;IAClD,IAAA,MAAM,GAAI,yBAAyB,EAAE,GAA/B,CAA+B;IAE5C,SAAS,CACP;QACE,OAAA,MAAM,CAAC,eAAe,CAAC,sBAAsB,EAAE,cAAM,OAAA,CAAC,iBAAiB,CAAC,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,CAAC,CAAC,EAAjC,CAAiC,EAAE,qBAAqB,CAAC;IAA9G,CAA8G,EAChH,CAAC,MAAM,EAAE,QAAQ,CAAC,CACnB,CAAA;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -1,2 +0,0 @@
1
- import React from 'react';
2
- export default function ToolbarPlugin(): React.JSX.Element;
@@ -1,503 +0,0 @@
1
- import { $createCodeNode, $isCodeNode, getDefaultCodeLanguage, getCodeLanguages } from '@lexical/code';
2
- import { $isLinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link';
3
- import { INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, REMOVE_LIST_COMMAND, $isListNode, ListNode, } from '@lexical/list';
4
- import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
5
- import { $createHeadingNode, $createQuoteNode, $isHeadingNode } from '@lexical/rich-text';
6
- import { $isParentElementRTL, $wrapNodes, $patchStyleText, $getSelectionStyleValueForProperty, $isAtNodeEnd, } from '@lexical/selection';
7
- import { $getNearestNodeOfType, mergeRegister } from '@lexical/utils';
8
- import { CAN_REDO_COMMAND, CAN_UNDO_COMMAND, REDO_COMMAND, UNDO_COMMAND, SELECTION_CHANGE_COMMAND, FORMAT_TEXT_COMMAND, FORMAT_ELEMENT_COMMAND, $getSelection, $isRangeSelection, $createParagraphNode, $getNodeByKey, } from 'lexical';
9
- import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
10
- import { createPortal } from 'react-dom';
11
- import DropDown, { DropDownItem } from '../ui/DropDown';
12
- var LowPriority = 1;
13
- var supportedBlockTypes = new Set(['paragraph', 'quote', 'code', 'h1', 'h2', 'ul', 'ol']);
14
- var blockTypeToBlockName = {
15
- code: 'Code Block',
16
- h1: 'Large Heading',
17
- h2: 'Small Heading',
18
- h3: 'Heading',
19
- h4: 'Heading',
20
- h5: 'Heading',
21
- ol: 'Numbered List',
22
- paragraph: 'Normal',
23
- quote: 'Quote',
24
- ul: 'Bulleted List'
25
- };
26
- var FONT_SIZE_OPTIONS = [
27
- ['10px', '10px'],
28
- ['11px', '11px'],
29
- ['12px', '12px'],
30
- ['13px', '13px'],
31
- ['14px', '14px'],
32
- ['15px', '15px'],
33
- ['16px', '16px'],
34
- ['17px', '17px'],
35
- ['18px', '18px'],
36
- ['19px', '19px'],
37
- ['20px', '20px'],
38
- ];
39
- function dropDownActiveClass(active) {
40
- if (active)
41
- return 'active dropdown-item-active';
42
- else
43
- return '';
44
- }
45
- function FontDropDown(_a) {
46
- var _b = _a.disabled, disabled = _b === void 0 ? false : _b, editor = _a.editor, style = _a.style, value = _a.value;
47
- var handleClick = useCallback(function (option) {
48
- editor.update(function () {
49
- var _a;
50
- var selection = $getSelection();
51
- if ($isRangeSelection(selection)) {
52
- $patchStyleText(selection, (_a = {},
53
- _a[style] = option,
54
- _a));
55
- }
56
- });
57
- }, [editor, style]);
58
- var buttonAriaLabel = style === 'font-family' ? 'Formatting options for font family' : 'Formatting options for font size';
59
- return (React.createElement(DropDown, { buttonAriaLabel: buttonAriaLabel, buttonClassName: 'toolbar-item ' + style, buttonIconClassName: style === 'font-family' ? 'icon block-type font-family' : '', buttonLabel: value, disabled: disabled }, FONT_SIZE_OPTIONS.map(function (_a) {
60
- var option = _a[0], text = _a[1];
61
- return (React.createElement(DropDownItem, { key: option, className: "item ".concat(dropDownActiveClass(value === option), " ").concat(style === 'font-size' ? 'fontsize-item' : ''), onClick: function () { return handleClick(option); } },
62
- React.createElement("span", { className: 'text' }, text)));
63
- })));
64
- }
65
- function Divider() {
66
- return React.createElement("div", { className: 'divider' });
67
- }
68
- function positionEditorElement(editor, rect) {
69
- if (rect === null) {
70
- editor.style.opacity = '0';
71
- editor.style.top = '-1000px';
72
- editor.style.left = '-1000px';
73
- }
74
- else {
75
- editor.style.opacity = '1';
76
- // eslint-disable-next-line no-undef
77
- editor.style.top = "".concat(rect.top + rect.height + window.pageYOffset + 10, "px");
78
- editor.style.left = "".concat(
79
- // eslint-disable-next-line no-undef
80
- rect.left + window.pageXOffset - editor.offsetWidth / 2 + rect.width / 2, "px");
81
- }
82
- }
83
- // eslint-disable-next-line react/prop-types
84
- function FloatingLinkEditor(_a) {
85
- var editor = _a.editor;
86
- var editorRef = useRef(null);
87
- var inputRef = useRef(null);
88
- var mouseDownRef = useRef(false);
89
- var _b = useState(''), linkUrl = _b[0], setLinkUrl = _b[1];
90
- var _c = useState(false), isEditMode = _c[0], setEditMode = _c[1];
91
- var _d = useState(null), lastSelection = _d[0], setLastSelection = _d[1];
92
- var updateLinkEditor = useCallback(function () {
93
- var selection = $getSelection();
94
- if ($isRangeSelection(selection)) {
95
- var node = getSelectedNode(selection);
96
- var parent_1 = node.getParent();
97
- if ($isLinkNode(parent_1)) {
98
- setLinkUrl(parent_1.getURL());
99
- }
100
- else if ($isLinkNode(node)) {
101
- setLinkUrl(node.getURL());
102
- }
103
- else {
104
- setLinkUrl('');
105
- }
106
- }
107
- var editorElem = editorRef.current;
108
- // eslint-disable-next-line no-undef
109
- var nativeSelection = window.getSelection();
110
- // eslint-disable-next-line no-undef
111
- var activeElement = document.activeElement;
112
- if (editorElem === null) {
113
- return;
114
- }
115
- // eslint-disable-next-line react/prop-types
116
- var rootElement = editor.getRootElement();
117
- if (selection !== null &&
118
- !nativeSelection.isCollapsed &&
119
- rootElement !== null &&
120
- rootElement.contains(nativeSelection.anchorNode)) {
121
- var domRange = nativeSelection.getRangeAt(0);
122
- var rect = void 0;
123
- if (nativeSelection.anchorNode === rootElement) {
124
- var inner = rootElement;
125
- while (inner.firstElementChild != null) {
126
- inner = inner.firstElementChild;
127
- }
128
- rect = inner.getBoundingClientRect();
129
- }
130
- else {
131
- rect = domRange.getBoundingClientRect();
132
- }
133
- if (!mouseDownRef.current) {
134
- positionEditorElement(editorElem, rect);
135
- }
136
- setLastSelection(selection);
137
- }
138
- else if (!activeElement || activeElement.className !== 'link-input') {
139
- positionEditorElement(editorElem, null);
140
- setLastSelection(null);
141
- setEditMode(false);
142
- setLinkUrl('');
143
- }
144
- return true;
145
- }, [editor]);
146
- useEffect(function () {
147
- return mergeRegister(editor.registerUpdateListener(function (_a) {
148
- var editorState = _a.editorState;
149
- editorState.read(function () {
150
- updateLinkEditor();
151
- });
152
- }), editor.registerCommand(SELECTION_CHANGE_COMMAND, function () {
153
- updateLinkEditor();
154
- return true;
155
- }, LowPriority));
156
- }, [editor, updateLinkEditor]);
157
- useEffect(function () {
158
- editor.getEditorState().read(function () {
159
- updateLinkEditor();
160
- });
161
- }, [editor, updateLinkEditor]);
162
- useEffect(function () {
163
- if (isEditMode && inputRef.current) {
164
- inputRef.current.focus();
165
- }
166
- }, [isEditMode]);
167
- return (React.createElement("div", { ref: editorRef, className: 'link-editor' }, isEditMode ? (React.createElement("input", { ref: inputRef, className: 'link-input', onChange: function (event) {
168
- setLinkUrl(event.target.value);
169
- }, onKeyDown: function (event) {
170
- if (event.key === 'Enter') {
171
- event.preventDefault();
172
- if (lastSelection !== null) {
173
- if (linkUrl !== '') {
174
- editor.dispatchCommand(TOGGLE_LINK_COMMAND, linkUrl);
175
- }
176
- setEditMode(false);
177
- }
178
- }
179
- else if (event.key === 'Escape') {
180
- event.preventDefault();
181
- setEditMode(false);
182
- }
183
- }, value: linkUrl })) : (React.createElement(React.Fragment, null,
184
- React.createElement("div", { className: 'link-input' },
185
- React.createElement("a", { href: linkUrl, rel: 'noopener noreferrer', target: '_blank' }, linkUrl),
186
- React.createElement("div", { className: 'link-edit', onClick: function () {
187
- setEditMode(true);
188
- }, onMouseDown: function (event) { return event.preventDefault(); }, role: 'button', tabIndex: 0 }))))));
189
- }
190
- function Select(_a) {
191
- var className = _a.className, onChange = _a.onChange, options = _a.options, value = _a.value;
192
- return (React.createElement("select", { className: className, onChange: onChange, value: value },
193
- React.createElement("option", { hidden: true, value: '' }),
194
- options.map(function (option) { return (React.createElement("option", { key: option, value: option }, option)); })));
195
- }
196
- function getSelectedNode(selection) {
197
- var anchor = selection.anchor;
198
- var focus = selection.focus;
199
- var anchorNode = selection.anchor.getNode();
200
- var focusNode = selection.focus.getNode();
201
- if (anchorNode === focusNode) {
202
- return anchorNode;
203
- }
204
- var isBackward = selection.isBackward();
205
- if (isBackward) {
206
- return $isAtNodeEnd(focus) ? anchorNode : focusNode;
207
- }
208
- else {
209
- return $isAtNodeEnd(anchor) ? focusNode : anchorNode;
210
- }
211
- }
212
- function BlockOptionsDropdownList(_a) {
213
- var blockType = _a.blockType, editor = _a.editor, setShowBlockOptionsDropDown = _a.setShowBlockOptionsDropDown, toolbarRef = _a.toolbarRef;
214
- var dropDownRef = useRef(null);
215
- useEffect(function () {
216
- var toolbar = toolbarRef.current;
217
- var dropDown = dropDownRef.current;
218
- if (toolbar !== null && dropDown !== null) {
219
- var _a = toolbar.getBoundingClientRect(), left = _a.left, top_1 = _a.top;
220
- dropDown.style.top = "".concat(top_1 + 40, "px");
221
- dropDown.style.left = "".concat(left, "px");
222
- }
223
- }, [dropDownRef, toolbarRef]);
224
- useEffect(function () {
225
- var dropDown = dropDownRef.current;
226
- var toolbar = toolbarRef.current;
227
- if (dropDown !== null && toolbar !== null) {
228
- var handle = function (event) {
229
- var target = event.target;
230
- if (!dropDown.contains(target) && !toolbar.contains(target)) {
231
- setShowBlockOptionsDropDown(false);
232
- }
233
- };
234
- document.addEventListener('click', handle);
235
- }
236
- }, [dropDownRef, setShowBlockOptionsDropDown, toolbarRef]);
237
- var formatParagraph = function () {
238
- if (blockType !== 'paragraph') {
239
- editor.update(function () {
240
- var selection = $getSelection();
241
- if ($isRangeSelection(selection)) {
242
- $wrapNodes(selection, function () { return $createParagraphNode(); });
243
- }
244
- });
245
- }
246
- setShowBlockOptionsDropDown(false);
247
- };
248
- var formatLargeHeading = function () {
249
- if (blockType !== 'h1') {
250
- editor.update(function () {
251
- var selection = $getSelection();
252
- if ($isRangeSelection(selection)) {
253
- $wrapNodes(selection, function () { return $createHeadingNode('h1'); });
254
- }
255
- });
256
- }
257
- setShowBlockOptionsDropDown(false);
258
- };
259
- var formatSmallHeading = function () {
260
- if (blockType !== 'h2') {
261
- editor.update(function () {
262
- var selection = $getSelection();
263
- if ($isRangeSelection(selection)) {
264
- $wrapNodes(selection, function () { return $createHeadingNode('h2'); });
265
- }
266
- });
267
- }
268
- setShowBlockOptionsDropDown(false);
269
- };
270
- var formatBulletList = function () {
271
- if (blockType !== 'ul') {
272
- editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND);
273
- }
274
- else {
275
- editor.dispatchCommand(REMOVE_LIST_COMMAND);
276
- }
277
- setShowBlockOptionsDropDown(false);
278
- };
279
- var formatNumberedList = function () {
280
- if (blockType !== 'ol') {
281
- editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND);
282
- }
283
- else {
284
- editor.dispatchCommand(REMOVE_LIST_COMMAND);
285
- }
286
- setShowBlockOptionsDropDown(false);
287
- };
288
- var formatQuote = function () {
289
- if (blockType !== 'quote') {
290
- editor.update(function () {
291
- var selection = $getSelection();
292
- if ($isRangeSelection(selection)) {
293
- $wrapNodes(selection, function () { return $createQuoteNode(); });
294
- }
295
- });
296
- }
297
- setShowBlockOptionsDropDown(false);
298
- };
299
- var formatCode = function () {
300
- if (blockType !== 'code') {
301
- editor.update(function () {
302
- var selection = $getSelection();
303
- if ($isRangeSelection(selection)) {
304
- $wrapNodes(selection, function () { return $createCodeNode(); });
305
- }
306
- });
307
- }
308
- setShowBlockOptionsDropDown(false);
309
- };
310
- return (React.createElement("div", { ref: dropDownRef, className: 'dropdown' },
311
- React.createElement("button", { className: 'item', onClick: formatParagraph },
312
- React.createElement("span", { className: 'icon paragraph' }),
313
- React.createElement("span", { className: 'text' }, "Normal"),
314
- blockType === 'paragraph' && React.createElement("span", { className: 'active' })),
315
- React.createElement("button", { className: 'item', onClick: formatLargeHeading },
316
- React.createElement("span", { className: 'icon large-heading' }),
317
- React.createElement("span", { className: 'text' }, "Large Heading"),
318
- blockType === 'h1' && React.createElement("span", { className: 'active' })),
319
- React.createElement("button", { className: 'item', onClick: formatSmallHeading },
320
- React.createElement("span", { className: 'icon small-heading' }),
321
- React.createElement("span", { className: 'text' }, "Small Heading"),
322
- blockType === 'h2' && React.createElement("span", { className: 'active' })),
323
- React.createElement("button", { className: 'item', onClick: formatBulletList },
324
- React.createElement("span", { className: 'icon bullet-list' }),
325
- React.createElement("span", { className: 'text' }, "Bullet List"),
326
- blockType === 'ul' && React.createElement("span", { className: 'active' })),
327
- React.createElement("button", { className: 'item', onClick: formatNumberedList },
328
- React.createElement("span", { className: 'icon numbered-list' }),
329
- React.createElement("span", { className: 'text' }, "Numbered List"),
330
- blockType === 'ol' && React.createElement("span", { className: 'active' })),
331
- React.createElement("button", { className: 'item', onClick: formatQuote },
332
- React.createElement("span", { className: 'icon quote' }),
333
- React.createElement("span", { className: 'text' }, "Quote"),
334
- blockType === 'quote' && React.createElement("span", { className: 'active' })),
335
- React.createElement("button", { className: 'item', onClick: formatCode },
336
- React.createElement("span", { className: 'icon code' }),
337
- React.createElement("span", { className: 'text' }, "Code Block"),
338
- blockType === 'code' && React.createElement("span", { className: 'active' }))));
339
- }
340
- export default function ToolbarPlugin() {
341
- var editor = useLexicalComposerContext()[0];
342
- var toolbarRef = useRef(null);
343
- var _a = useState(false), canUndo = _a[0], setCanUndo = _a[1];
344
- var _b = useState(false), canRedo = _b[0], setCanRedo = _b[1];
345
- var _c = useState('paragraph'), blockType = _c[0], setBlockType = _c[1];
346
- var _d = useState(null), selectedElementKey = _d[0], setSelectedElementKey = _d[1];
347
- var _e = useState(false), showBlockOptionsDropDown = _e[0], setShowBlockOptionsDropDown = _e[1];
348
- var _f = useState(''), codeLanguage = _f[0], setCodeLanguage = _f[1];
349
- var _g = useState(false), setIsRTL = _g[1];
350
- var _h = useState(false), isLink = _h[0], setIsLink = _h[1];
351
- var _j = useState(false), isBold = _j[0], setIsBold = _j[1];
352
- var _k = useState(false), isItalic = _k[0], setIsItalic = _k[1];
353
- var _l = useState(false), isUnderline = _l[0], setIsUnderline = _l[1];
354
- var _m = useState(false), isStrikethrough = _m[0], setIsStrikethrough = _m[1];
355
- var _o = useState(false), isCode = _o[0], setIsCode = _o[1];
356
- var _p = useState(function () { return editor.isEditable(); }), isEditable = _p[0], setIsEditable = _p[1];
357
- var _q = useState('15px'), fontSize = _q[0], setFontSize = _q[1];
358
- var updateToolbar = useCallback(function () {
359
- var selection = $getSelection();
360
- if ($isRangeSelection(selection)) {
361
- var anchorNode = selection.anchor.getNode();
362
- var element = anchorNode.getKey() === 'root' ? anchorNode : anchorNode.getTopLevelElementOrThrow();
363
- var elementKey = element.getKey();
364
- var elementDOM = editor.getElementByKey(elementKey);
365
- if (elementDOM !== null) {
366
- setSelectedElementKey(elementKey);
367
- if ($isListNode(element)) {
368
- var parentList = $getNearestNodeOfType(anchorNode, ListNode);
369
- var type = parentList ? parentList.getTag() : element.getTag();
370
- setBlockType(type);
371
- }
372
- else {
373
- var type = $isHeadingNode(element) ? element.getTag() : element.getType();
374
- setBlockType(type);
375
- if ($isCodeNode(element)) {
376
- setCodeLanguage(element.getLanguage() || getDefaultCodeLanguage());
377
- }
378
- }
379
- }
380
- setFontSize($getSelectionStyleValueForProperty(selection, 'font-size', '15px'));
381
- // Update text format
382
- setIsBold(selection.hasFormat('bold'));
383
- setIsItalic(selection.hasFormat('italic'));
384
- setIsUnderline(selection.hasFormat('underline'));
385
- setIsStrikethrough(selection.hasFormat('strikethrough'));
386
- setIsCode(selection.hasFormat('code'));
387
- setIsRTL($isParentElementRTL(selection));
388
- // Update links
389
- var node = getSelectedNode(selection);
390
- var parent_2 = node.getParent();
391
- if ($isLinkNode(parent_2) || $isLinkNode(node)) {
392
- setIsLink(true);
393
- }
394
- else {
395
- setIsLink(false);
396
- }
397
- }
398
- }, [editor]);
399
- useEffect(function () {
400
- mergeRegister(editor.registerEditableListener(function (editable) {
401
- setIsEditable(editable);
402
- }), editor.registerUpdateListener(function (_a) {
403
- var editorState = _a.editorState;
404
- editorState.read(function () {
405
- updateToolbar();
406
- });
407
- }), editor.registerCommand(SELECTION_CHANGE_COMMAND, function () {
408
- updateToolbar();
409
- return false;
410
- }, LowPriority), editor.registerCommand(CAN_UNDO_COMMAND, function (payload) {
411
- setCanUndo(payload);
412
- return false;
413
- }, LowPriority), editor.registerCommand(CAN_REDO_COMMAND, function (payload) {
414
- setCanRedo(payload);
415
- return false;
416
- }, LowPriority));
417
- }, [editor, updateToolbar]);
418
- var codeLanguges = useMemo(function () { return getCodeLanguages(); }, []);
419
- var onCodeLanguageSelect = useCallback(function (e) {
420
- editor.update(function () {
421
- if (selectedElementKey !== null) {
422
- var node = $getNodeByKey(selectedElementKey);
423
- if ($isCodeNode(node)) {
424
- node.setLanguage(e.target.value);
425
- }
426
- }
427
- });
428
- }, [editor, selectedElementKey]);
429
- var insertLink = useCallback(function () {
430
- if (!isLink) {
431
- editor.dispatchCommand(TOGGLE_LINK_COMMAND, 'https://');
432
- }
433
- else {
434
- editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);
435
- }
436
- }, [editor, isLink]);
437
- return (React.createElement(React.Fragment, null,
438
- React.createElement("div", { ref: toolbarRef, className: 'toolbar' },
439
- React.createElement("button", { "aria-label": 'Undo', className: 'toolbar-item spaced', disabled: !canUndo, onClick: function () {
440
- editor.dispatchCommand(UNDO_COMMAND);
441
- }, type: 'button' },
442
- React.createElement("i", { className: 'format undo' })),
443
- React.createElement("button", { "aria-label": 'Redo', className: 'toolbar-item', disabled: !canRedo, onClick: function () {
444
- editor.dispatchCommand(REDO_COMMAND);
445
- }, type: 'button' },
446
- React.createElement("i", { className: 'format redo' })),
447
- React.createElement(Divider, null),
448
- supportedBlockTypes.has(blockType) && (React.createElement(React.Fragment, null,
449
- React.createElement("button", { "aria-label": 'Formatting Options', className: 'toolbar-item block-controls', onClick: function () { return setShowBlockOptionsDropDown(!showBlockOptionsDropDown); }, type: 'button' },
450
- React.createElement("span", { className: 'icon block-type ' + blockType }),
451
- React.createElement("span", { className: 'text' }, blockTypeToBlockName[blockType]),
452
- React.createElement("i", { className: 'chevron-down' })),
453
- showBlockOptionsDropDown &&
454
- createPortal(React.createElement(BlockOptionsDropdownList, { blockType: blockType, editor: editor, setShowBlockOptionsDropDown: setShowBlockOptionsDropDown, toolbarRef: toolbarRef }), document.body),
455
- React.createElement(Divider, null))),
456
- React.createElement(FontDropDown, { disabled: !isEditable, editor: editor, style: 'font-size', value: fontSize }),
457
- React.createElement(Divider, null),
458
- blockType === 'code' ? (React.createElement(React.Fragment, null,
459
- React.createElement(Select, { className: 'toolbar-item code-language', onChange: onCodeLanguageSelect, options: codeLanguges, value: codeLanguage }),
460
- React.createElement("i", { className: 'chevron-down inside' }))) : (React.createElement(React.Fragment, null,
461
- React.createElement("button", { "aria-label": 'Format Bold', className: 'toolbar-item spaced ' + (isBold ? 'active' : ''), onClick: function () {
462
- editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold');
463
- }, type: 'button' },
464
- React.createElement("i", { className: 'format bold' })),
465
- React.createElement("button", { "aria-label": 'Format Italics', className: 'toolbar-item spaced ' + (isItalic ? 'active' : ''), onClick: function () {
466
- editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic');
467
- }, type: 'button' },
468
- React.createElement("i", { className: 'format italic' })),
469
- React.createElement("button", { "aria-label": 'Format Underline', className: 'toolbar-item spaced ' + (isUnderline ? 'active' : ''), onClick: function () {
470
- editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline');
471
- }, type: 'button' },
472
- React.createElement("i", { className: 'format underline' })),
473
- React.createElement("button", { "aria-label": 'Format Strikethrough', className: 'toolbar-item spaced ' + (isStrikethrough ? 'active' : ''), onClick: function () {
474
- editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough');
475
- }, type: 'button' },
476
- React.createElement("i", { className: 'format strikethrough' })),
477
- React.createElement("button", { "aria-label": 'Insert Code', className: 'toolbar-item spaced ' + (isCode ? 'active' : ''), onClick: function () {
478
- editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code');
479
- }, type: 'button' },
480
- React.createElement("i", { className: 'format code' })),
481
- React.createElement("button", { "aria-label": 'Insert Link', className: 'toolbar-item spaced ' + (isLink ? 'active' : ''), onClick: insertLink, type: 'button' },
482
- React.createElement("i", { className: 'format link' })),
483
- isLink && createPortal(React.createElement(FloatingLinkEditor, { editor: editor }), document.body),
484
- React.createElement(Divider, null),
485
- React.createElement("button", { "aria-label": 'Left Align', className: 'toolbar-item spaced', onClick: function () {
486
- editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'left');
487
- }, type: 'button' },
488
- React.createElement("i", { className: 'format left-align' })),
489
- React.createElement("button", { "aria-label": 'Center Align', className: 'toolbar-item spaced', onClick: function () {
490
- editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'center');
491
- }, type: 'button' },
492
- React.createElement("i", { className: 'format center-align' })),
493
- React.createElement("button", { "aria-label": 'Right Align', className: 'toolbar-item spaced', onClick: function () {
494
- editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'right');
495
- }, type: 'button' },
496
- React.createElement("i", { className: 'format right-align' })),
497
- React.createElement("button", { "aria-label": 'Justify Align', className: 'toolbar-item', onClick: function () {
498
- editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'justify');
499
- }, type: 'button' },
500
- React.createElement("i", { className: 'format justify-align' })),
501
- ' ')))));
502
- }
503
- //# sourceMappingURL=ToolbarPlugin.js.map