@pareto-engineering/design-system 4.0.0-alpha.76 → 4.0.0-alpha.78

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 (173) hide show
  1. package/dist/cjs/a/AnimatedBlobs/AnimatedBlobs.js +1 -1
  2. package/dist/cjs/a/AnimatedGradient/AnimatedGradient.js +1 -1
  3. package/dist/cjs/a/AppContext/Context.js +1 -1
  4. package/dist/cjs/a/AppContext/ContextProvider.js +1 -1
  5. package/dist/cjs/a/BlurOverlay/BlurOverlay.js +1 -1
  6. package/dist/cjs/a/ContentTree/ContentTree.js +1 -1
  7. package/dist/cjs/a/ContentTree/common/Tree/Tree.js +1 -1
  8. package/dist/cjs/a/Conversation/Context.js +1 -1
  9. package/dist/cjs/a/Conversation/Conversation.js +1 -1
  10. package/dist/cjs/a/Conversation/common/Message/Message.js +1 -1
  11. package/dist/cjs/a/DatePicker/DatePicker.js +1 -1
  12. package/dist/cjs/a/DotInfo/DotInfo.js +1 -1
  13. package/dist/cjs/a/Figure/Figure.js +1 -1
  14. package/dist/cjs/a/HamburgerButton/HamburgerButton.js +1 -1
  15. package/dist/cjs/a/IconList/IconList.js +1 -1
  16. package/dist/cjs/a/IconList/common/Item/Item.js +1 -1
  17. package/dist/cjs/a/Label/Label.js +1 -1
  18. package/dist/cjs/a/LexicalPreview/LexicalPreview.js +1 -1
  19. package/dist/cjs/a/LoadingCircle/LoadingCircle.js +1 -1
  20. package/dist/cjs/a/MetaCard/MetaCard.js +1 -1
  21. package/dist/cjs/a/People/People.js +1 -1
  22. package/dist/cjs/a/People/common/Person/Person.js +1 -1
  23. package/dist/cjs/a/People/styles.scss +1 -1
  24. package/dist/cjs/a/Popover/Popover.js +1 -1
  25. package/dist/cjs/a/ProgressBar/ProgressBar.js +1 -1
  26. package/dist/cjs/a/Quote/Quote.js +16 -6
  27. package/dist/cjs/a/Quote/styles.scss +16 -37
  28. package/dist/cjs/a/Removable/Removable.js +1 -1
  29. package/dist/cjs/a/SVG/SVG.js +1 -1
  30. package/dist/cjs/a/SVG/common/UseSVG/UseSVG.js +1 -1
  31. package/dist/cjs/a/SnapScroller/SnapScroller.js +1 -1
  32. package/dist/cjs/a/Spinner/Spinner.js +1 -1
  33. package/dist/cjs/a/TextSteps/TextSteps.js +1 -1
  34. package/dist/cjs/a/Timestamp/Timestamp.js +1 -1
  35. package/dist/cjs/a/Tip/Tip.js +1 -1
  36. package/dist/cjs/a/ToggleSwitch/ToggleSwitch.js +1 -1
  37. package/dist/cjs/a/Tooltip/Tooltip.js +71 -0
  38. package/dist/cjs/a/Tooltip/index.js +13 -0
  39. package/dist/cjs/a/Tooltip/styles.scss +53 -0
  40. package/dist/cjs/a/XMLEditor/XMLEditor.js +1 -1
  41. package/dist/cjs/a/index.js +8 -1
  42. package/dist/cjs/b/Button/Button.js +1 -1
  43. package/dist/cjs/b/Button/common/Group/Group.js +1 -1
  44. package/dist/cjs/b/Card/Card.js +1 -1
  45. package/dist/cjs/b/Card/common/Group/Group.js +1 -1
  46. package/dist/cjs/b/Card/common/Section/Section.js +1 -1
  47. package/dist/cjs/b/ExpandableLexicalPreview/ExpandableLexicalPreview.js +3 -3
  48. package/dist/cjs/b/ExpandableLexicalPreview/common/ExpandButton/ExpandButton.js +3 -3
  49. package/dist/cjs/b/Logo/Logo.js +1 -1
  50. package/dist/cjs/b/Page/Context.js +1 -1
  51. package/dist/cjs/b/Page/Page.js +1 -1
  52. package/dist/cjs/b/Page/common/PageHelmet/PageHelmet.js +1 -1
  53. package/dist/cjs/b/Page/common/Section/Section.js +1 -1
  54. package/dist/cjs/b/SocialMediaButton/SocialMediaButton.js +1 -1
  55. package/dist/cjs/b/ThemeSelector/ThemeSelector.js +1 -1
  56. package/dist/cjs/b/Title/Title.js +1 -1
  57. package/dist/cjs/c/Modal/Modal.js +1 -1
  58. package/dist/cjs/c/Modal/common/ModalHeader/ModalHeader.js +1 -1
  59. package/dist/cjs/c/Shortener/Shortener.js +1 -1
  60. package/dist/cjs/c/SocialMediaShareButton/SocialMediaShareButton.js +1 -1
  61. package/dist/cjs/f/FormInput/FormInput.js +1 -1
  62. package/dist/cjs/f/common/Debugger/Debugger.js +1 -1
  63. package/dist/cjs/f/common/Description/Description.js +1 -1
  64. package/dist/cjs/f/common/Description/styles.scss +1 -2
  65. package/dist/cjs/f/common/Label/Label.js +1 -1
  66. package/dist/cjs/f/fields/Checkbox/Checkbox.js +1 -1
  67. package/dist/cjs/f/fields/ChoicesInput/ChoicesInput.js +1 -1
  68. package/dist/cjs/f/fields/ChoicesInput/common/Choice/Choice.js +1 -1
  69. package/dist/cjs/f/fields/EditorInput/EditorInput.js +20 -9
  70. package/dist/cjs/f/fields/EditorInput/common/BlockFormatDropDown/BlockFormatDropDown.js +256 -0
  71. package/dist/cjs/f/fields/EditorInput/common/BlockFormatDropDown/index.js +13 -0
  72. package/dist/cjs/f/fields/EditorInput/common/BlockFormatDropDown/styles.scss +55 -0
  73. package/dist/cjs/f/fields/EditorInput/common/ColorPicker/ColorPicker.js +94 -0
  74. package/dist/cjs/f/fields/EditorInput/common/ColorPicker/index.js +13 -0
  75. package/dist/cjs/f/fields/EditorInput/common/ColorPicker/styles.scss +36 -0
  76. package/dist/cjs/f/fields/EditorInput/common/FontSizeDropDown/FontSizeDropDown.js +94 -0
  77. package/dist/cjs/f/fields/EditorInput/common/FontSizeDropDown/index.js +13 -0
  78. package/dist/cjs/f/fields/EditorInput/common/FontSizeDropDown/styles.scss +55 -0
  79. package/dist/cjs/f/fields/EditorInput/common/ToolbarPlugin/ToolbarPlugin.js +295 -0
  80. package/dist/cjs/f/fields/EditorInput/common/ToolbarPlugin/index.js +13 -0
  81. package/dist/cjs/f/fields/EditorInput/common/ToolbarPlugin/styles.scss +56 -0
  82. package/dist/cjs/f/fields/EditorInput/common/index.js +24 -3
  83. package/dist/cjs/f/fields/EditorInput/styles.scss +109 -25
  84. package/dist/cjs/f/fields/LinkInput/LinkInput.js +1 -1
  85. package/dist/cjs/f/fields/QueryChoices/QueryChoices.js +1 -1
  86. package/dist/cjs/f/fields/QueryCombobox/QueryCombobox.js +1 -1
  87. package/dist/cjs/f/fields/QueryCombobox/common/Combobox/Combobox.js +1 -1
  88. package/dist/cjs/f/fields/QueryCombobox/common/Menu/Menu.js +1 -1
  89. package/dist/cjs/f/fields/QueryCombobox/common/MultipleCombobox/MultipleCombobox.js +1 -1
  90. package/dist/cjs/f/fields/QuerySelect/QuerySelect.js +1 -1
  91. package/dist/cjs/f/fields/RatingsInput/RatingsInput.js +1 -1
  92. package/dist/cjs/f/fields/RatingsInput/common/Rating/Rating.js +1 -1
  93. package/dist/cjs/f/fields/SelectInput/SelectInput.js +1 -1
  94. package/dist/cjs/f/fields/SelectInput/common/Menu/Menu.js +1 -1
  95. package/dist/cjs/f/fields/SelectInput/common/Multiple/Multiple.js +1 -1
  96. package/dist/cjs/f/fields/SelectInput/common/Single/Single.js +1 -1
  97. package/dist/cjs/f/fields/TextInput/TextInput.js +1 -1
  98. package/dist/cjs/f/fields/TextInput/styles.scss +5 -2
  99. package/dist/cjs/f/fields/TextareaInput/TextareaInput.js +1 -1
  100. package/dist/cjs/test/QueryLoader/QueryLoader.js +1 -1
  101. package/dist/cjs/test/QueryLoader/common/PreloadedTestData/PreloadedTestData.js +1 -1
  102. package/dist/cjs/utils/hooks/index.js +7 -0
  103. package/dist/cjs/utils/hooks/useOutsideClick.js +25 -0
  104. package/dist/cjs/utils/index.js +6 -0
  105. package/dist/es/a/People/styles.scss +1 -1
  106. package/dist/es/a/Quote/Quote.js +15 -5
  107. package/dist/es/a/Quote/styles.scss +16 -37
  108. package/dist/es/a/Tooltip/Tooltip.js +59 -0
  109. package/dist/es/a/Tooltip/index.js +2 -0
  110. package/dist/es/a/Tooltip/styles.scss +53 -0
  111. package/dist/es/a/index.js +2 -1
  112. package/dist/es/b/ExpandableLexicalPreview/ExpandableLexicalPreview.js +1 -1
  113. package/dist/es/b/ExpandableLexicalPreview/common/ExpandButton/ExpandButton.js +1 -1
  114. package/dist/es/f/common/Description/styles.scss +1 -2
  115. package/dist/es/f/fields/EditorInput/EditorInput.js +20 -9
  116. package/dist/es/f/fields/EditorInput/common/BlockFormatDropDown/BlockFormatDropDown.js +246 -0
  117. package/dist/es/f/fields/EditorInput/common/BlockFormatDropDown/index.js +2 -0
  118. package/dist/es/f/fields/EditorInput/common/BlockFormatDropDown/styles.scss +55 -0
  119. package/dist/es/f/fields/EditorInput/common/ColorPicker/ColorPicker.js +83 -0
  120. package/dist/es/f/fields/EditorInput/common/ColorPicker/index.js +2 -0
  121. package/dist/es/f/fields/EditorInput/common/ColorPicker/styles.scss +36 -0
  122. package/dist/es/f/fields/EditorInput/common/FontSizeDropDown/FontSizeDropDown.js +81 -0
  123. package/dist/es/f/fields/EditorInput/common/FontSizeDropDown/index.js +2 -0
  124. package/dist/es/f/fields/EditorInput/common/FontSizeDropDown/styles.scss +55 -0
  125. package/dist/es/f/fields/EditorInput/common/ToolbarPlugin/ToolbarPlugin.js +283 -0
  126. package/dist/es/f/fields/EditorInput/common/ToolbarPlugin/index.js +2 -0
  127. package/dist/es/f/fields/EditorInput/common/ToolbarPlugin/styles.scss +56 -0
  128. package/dist/es/f/fields/EditorInput/common/index.js +5 -2
  129. package/dist/es/f/fields/EditorInput/styles.scss +109 -25
  130. package/dist/es/f/fields/TextInput/styles.scss +5 -2
  131. package/dist/es/utils/hooks/index.js +2 -1
  132. package/dist/es/utils/hooks/useOutsideClick.js +19 -0
  133. package/dist/es/utils/index.js +1 -1
  134. package/package.json +13 -5
  135. package/src/stories/a/Quote.stories.jsx +30 -10
  136. package/src/stories/a/Tooltip.stories.jsx +80 -0
  137. package/src/stories/a/XMLEditor.stories.jsx +6 -1
  138. package/src/ui/a/People/styles.scss +1 -1
  139. package/src/ui/a/Quote/Quote.jsx +16 -9
  140. package/src/ui/a/Quote/styles.scss +16 -37
  141. package/src/ui/a/Tooltip/Tooltip.jsx +83 -0
  142. package/src/ui/a/Tooltip/index.js +2 -0
  143. package/src/ui/a/Tooltip/styles.scss +53 -0
  144. package/src/ui/a/index.js +1 -0
  145. package/src/ui/b/ExpandableLexicalPreview/ExpandableLexicalPreview.jsx +1 -1
  146. package/src/ui/b/ExpandableLexicalPreview/common/ExpandButton/ExpandButton.jsx +1 -1
  147. package/src/ui/f/common/Description/styles.scss +1 -2
  148. package/src/ui/f/fields/EditorInput/EditorInput.jsx +21 -4
  149. package/src/ui/f/fields/EditorInput/common/BlockFormatDropDown/BlockFormatDropDown.jsx +292 -0
  150. package/src/ui/f/fields/EditorInput/common/BlockFormatDropDown/index.js +2 -0
  151. package/src/ui/f/fields/EditorInput/common/BlockFormatDropDown/styles.scss +55 -0
  152. package/src/ui/f/fields/EditorInput/common/ColorPicker/ColorPicker.jsx +110 -0
  153. package/src/ui/f/fields/EditorInput/common/ColorPicker/index.js +2 -0
  154. package/src/ui/f/fields/EditorInput/common/ColorPicker/styles.scss +36 -0
  155. package/src/ui/f/fields/EditorInput/common/FontSizeDropDown/FontSizeDropDown.jsx +134 -0
  156. package/src/ui/f/fields/EditorInput/common/FontSizeDropDown/index.js +2 -0
  157. package/src/ui/f/fields/EditorInput/common/FontSizeDropDown/styles.scss +55 -0
  158. package/src/ui/f/fields/EditorInput/common/ToolbarPlugin/ToolbarPlugin.jsx +431 -0
  159. package/src/ui/f/fields/EditorInput/common/ToolbarPlugin/index.js +2 -0
  160. package/src/ui/f/fields/EditorInput/common/ToolbarPlugin/styles.scss +56 -0
  161. package/src/ui/f/fields/EditorInput/common/index.js +6 -0
  162. package/src/ui/f/fields/EditorInput/styles.scss +109 -25
  163. package/src/ui/f/fields/TextInput/styles.scss +5 -2
  164. package/src/ui/utils/hooks/index.js +1 -0
  165. package/src/ui/utils/hooks/useOutsideClick.js +23 -0
  166. package/src/ui/utils/index.js +1 -1
  167. package/tests/__snapshots__/Storyshots.test.js.snap +777 -409
  168. package/tests/mockResizeObserver.js +9 -0
  169. package/tests/test-setup.js +3 -0
  170. package/dist/cjs/f/fields/EditorInput/common/Toolbar.js +0 -257
  171. package/dist/es/f/fields/EditorInput/common/Toolbar.js +0 -246
  172. package/src/ui/f/fields/EditorInput/common/Toolbar.jsx +0 -356
  173. package/src/ui/f/fields/EditorInput/common/index.jsx +0 -3
@@ -0,0 +1,9 @@
1
+ class MockResizeObserver {
2
+ constructor() {
3
+ this.observe = () => {}
4
+ this.unobserve = () => {}
5
+ this.disconnect = () => {}
6
+ }
7
+ }
8
+
9
+ export default MockResizeObserver
@@ -1,4 +1,7 @@
1
+ import MockResizeObserver from './mockResizeObserver'
2
+
1
3
  const noop = () => {}
2
4
  const emptyDirFunc = () => ({})
5
+ global.ResizeObserver = MockResizeObserver
3
6
  Object.defineProperty(window, 'scrollTo', { value: noop, writable: true })
4
7
  Object.defineProperty(window, 'matchMedia', { value: emptyDirFunc, writable: true })
@@ -1,257 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _react = _interopRequireWildcard(require("react"));
8
- var React = _react;
9
- var _lexical = require("lexical");
10
- var _list = require("@lexical/list");
11
- var _selection = require("@lexical/selection");
12
- var _link = require("@lexical/link");
13
- var _LexicalComposerContext = require("@lexical/react/LexicalComposerContext");
14
- var _utils = require("@lexical/utils");
15
- var _ = require("../../../..");
16
- var _exports = _interopRequireDefault(require("@pareto-engineering/bem/exports"));
17
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
19
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
20
- /* eslint-disable import/no-extraneous-dependencies -- required here */
21
-
22
- const baseClassName = _exports.default.base;
23
- const componentClassName = 'toolbar';
24
- const getSelectedNode = selection => {
25
- const {
26
- anchor,
27
- focus
28
- } = selection;
29
- const anchorNode = selection.anchor.getNode();
30
- const focusNode = selection.focus.getNode();
31
- if (anchorNode === focusNode) {
32
- return anchorNode;
33
- }
34
- const isBackward = selection.isBackward();
35
- if (isBackward) {
36
- return (0, _selection.$isAtNodeEnd)(focus) ? anchorNode : focusNode;
37
- }
38
- return (0, _selection.$isAtNodeEnd)(anchor) ? focusNode : anchorNode;
39
- };
40
- const defaultColor = 'var(--paragraph)';
41
- const colorOptions = ['red', 'blue', 'green', 'yellow', 'orange', 'purple', 'pink', 'brown'];
42
- const Toolbar = () => {
43
- const [editor] = (0, _LexicalComposerContext.useLexicalComposerContext)();
44
- const [isBold, setIsBold] = (0, _react.useState)(false);
45
- const [isItalic, setIsItalic] = (0, _react.useState)(false);
46
- const [isStrikethrough, setIsStrikethrough] = (0, _react.useState)(false);
47
- const [blockType, setBlockType] = (0, _react.useState)('paragraph');
48
- const [isLink, setIsLink] = (0, _react.useState)(false);
49
- const [isUnderline, setIsUnderline] = (0, _react.useState)(false);
50
- const [color, setColor] = (0, _react.useState)(defaultColor);
51
- const colorMenuRef = (0, _react.useRef)(false);
52
- const formatBulletList = () => {
53
- if (blockType !== 'ul') {
54
- editor.dispatchCommand(_list.INSERT_UNORDERED_LIST_COMMAND);
55
- } else {
56
- editor.dispatchCommand(_list.REMOVE_LIST_COMMAND);
57
- }
58
- };
59
- const formatNumberedList = () => {
60
- if (blockType !== 'ol') {
61
- editor.dispatchCommand(_list.INSERT_ORDERED_LIST_COMMAND);
62
- } else {
63
- editor.dispatchCommand(_list.REMOVE_LIST_COMMAND);
64
- }
65
- };
66
- const formatLink = (0, _react.useCallback)(() => {
67
- if (!isLink) {
68
- // eslint-disable-next-line no-alert
69
- const path = prompt('Enter the full URL. Ex: https://www.example.com');
70
- editor.dispatchCommand(_link.TOGGLE_LINK_COMMAND, path);
71
- } else {
72
- editor.dispatchCommand(_link.TOGGLE_LINK_COMMAND, null);
73
- }
74
- }, [editor, isLink]);
75
- const updateToolbar = (0, _react.useCallback)(() => {
76
- const selection = (0, _lexical.$getSelection)();
77
-
78
- // Check list selection
79
- if ((0, _lexical.$isRangeSelection)(selection)) {
80
- const anchorNode = selection.anchor.getNode();
81
- const element = anchorNode.getKey() === 'root' ? anchorNode : anchorNode.getTopLevelElementOrThrow();
82
- if ((0, _list.$isListNode)(element)) {
83
- const parentList = (0, _utils.$getNearestNodeOfType)(anchorNode, _list.ListNode);
84
- const type = parentList ? parentList.getTag() : element.getTag();
85
- setBlockType(type);
86
- } else {
87
- setBlockType(element);
88
- }
89
-
90
- // Check nodes for color
91
- const nodes = selection.getNodes().filter(node => node.getType() === 'text');
92
- nodes.forEach(node => {
93
- const style = node.getStyle();
94
- const colorProperty = style.match(/color: ([^;]+)/);
95
- if (colorProperty) {
96
- setColor(colorProperty[1]);
97
- return;
98
- }
99
- setColor(false);
100
- });
101
-
102
- // Check selection text styles
103
- setIsBold(selection.hasFormat('bold'));
104
- setIsItalic(selection.hasFormat('italic'));
105
- setIsStrikethrough(selection.hasFormat('strikethrough'));
106
- setIsUnderline(selection.hasFormat('underline'));
107
- setIsLink(selection.hasFormat('link'));
108
-
109
- // Check links
110
- const node = getSelectedNode(selection);
111
- const parent = node.getParent();
112
- if ((0, _link.$isLinkNode)(parent) || (0, _link.$isLinkNode)(node)) {
113
- setIsLink(true);
114
- } else {
115
- setIsLink(false);
116
- }
117
- }
118
- }, [editor]);
119
- const UPDATE_COLOR_COMMAND = (0, _lexical.createCommand)();
120
- editor.registerCommand(UPDATE_COLOR_COMMAND, payload => {
121
- const selection = (0, _lexical.$getSelection)();
122
- const nodes = selection?.extract().filter(node => node.getType() === 'text');
123
- nodes?.forEach(node => {
124
- const style = node.getStyle();
125
- const colorProperty = style?.match(/color: ([^;]+)/);
126
- if (colorProperty && color !== payload) {
127
- node.setStyle(style.replace(colorProperty[0], `color: ${payload}`));
128
- } else if (colorProperty) {
129
- node.setStyle(`color: ${defaultColor}`);
130
- } else {
131
- node.setStyle(`color: ${payload}`);
132
- }
133
- });
134
- }, _lexical.COMMAND_PRIORITY_NORMAL);
135
- (0, _react.useEffect)(() => (0, _utils.mergeRegister)(editor.registerUpdateListener(_ref => {
136
- let {
137
- editorState
138
- } = _ref;
139
- editorState.read(() => {
140
- updateToolbar();
141
- });
142
- })), [updateToolbar, editor]);
143
- const dispatchUpdateColor = (0, _react.useCallback)((e, payload) => {
144
- e.stopPropagation();
145
- editor.dispatchCommand(UPDATE_COLOR_COMMAND, payload);
146
- }, [editor]);
147
- return /*#__PURE__*/React.createElement("div", {
148
- className: `${baseClassName} ${componentClassName}`
149
- }, /*#__PURE__*/React.createElement("div", {
150
- className: "group"
151
- }, /*#__PURE__*/React.createElement("button", {
152
- type: "button",
153
- className: isBold ? 'active' : undefined,
154
- onClick: () => editor.dispatchCommand(_lexical.FORMAT_TEXT_COMMAND, 'bold')
155
- }, /*#__PURE__*/React.createElement("span", {
156
- className: "icon"
157
- }, "|")), /*#__PURE__*/React.createElement("button", {
158
- type: "button",
159
- className: isItalic ? 'active' : undefined,
160
- onClick: () => editor.dispatchCommand(_lexical.FORMAT_TEXT_COMMAND, 'italic')
161
- }, /*#__PURE__*/React.createElement("span", {
162
- className: "icon"
163
- }, "}")), /*#__PURE__*/React.createElement("button", {
164
- type: "button",
165
- className: isUnderline ? 'active' : undefined,
166
- onClick: () => editor.dispatchCommand(_lexical.FORMAT_TEXT_COMMAND, 'underline')
167
- }, /*#__PURE__*/React.createElement("span", {
168
- className: "icon"
169
- }, "~")), /*#__PURE__*/React.createElement("button", {
170
- type: "button",
171
- className: isStrikethrough ? 'active' : undefined,
172
- onClick: () => editor.dispatchCommand(_lexical.FORMAT_TEXT_COMMAND, 'strikethrough')
173
- }, /*#__PURE__*/React.createElement("span", {
174
- className: "icon"
175
- }, "?")), /*#__PURE__*/React.createElement("button", {
176
- type: "button",
177
- className: color && color !== defaultColor ? 'active color-menu-button' : 'color-menu-button',
178
- onClick: () => editor.dispatchCommand(UPDATE_COLOR_COMMAND, color !== defaultColor ? defaultColor : color),
179
- ref: colorMenuRef,
180
- style: {
181
- position: 'relative'
182
- }
183
- }, /*#__PURE__*/React.createElement("span", {
184
- className: "icon",
185
- style: {
186
- color
187
- }
188
- }, "Q"), /*#__PURE__*/React.createElement(_.Popover, {
189
- parentRef: colorMenuRef
190
- }, /*#__PURE__*/React.createElement("div", {
191
- className: "color-menu"
192
- }, colorOptions.map(option => /*#__PURE__*/React.createElement("span", {
193
- role: "button",
194
- className: "icon color-option",
195
- style: {
196
- color: option
197
- },
198
- onClick: e => dispatchUpdateColor(e, option),
199
- onKeyDown: e => dispatchUpdateColor(e, option),
200
- tabIndex: 0,
201
- key: option
202
- }, "o"))))), /*#__PURE__*/React.createElement("button", {
203
- type: "button",
204
- className: isLink ? 'active' : undefined,
205
- onClick: () => formatLink()
206
- }, /*#__PURE__*/React.createElement("span", {
207
- className: "icon"
208
- }, "]")), /*#__PURE__*/React.createElement("button", {
209
- type: "button",
210
- className: blockType === 'ul' ? 'active' : undefined,
211
- onClick: () => formatBulletList()
212
- }, /*#__PURE__*/React.createElement("span", {
213
- className: "icon"
214
- }, ".")), /*#__PURE__*/React.createElement("button", {
215
- type: "button",
216
- className: blockType === 'ol' ? 'active' : undefined,
217
- onClick: () => formatNumberedList()
218
- }, /*#__PURE__*/React.createElement("span", {
219
- className: "icon"
220
- }, "-"))), /*#__PURE__*/React.createElement("div", {
221
- className: "group"
222
- }, /*#__PURE__*/React.createElement("button", {
223
- type: "button",
224
- onClick: () => editor.dispatchCommand(_lexical.FORMAT_ELEMENT_COMMAND, 'left')
225
- }, /*#__PURE__*/React.createElement("span", {
226
- className: "icon"
227
- }, "^")), /*#__PURE__*/React.createElement("button", {
228
- type: "button",
229
- onClick: () => editor.dispatchCommand(_lexical.FORMAT_ELEMENT_COMMAND, 'center')
230
- }, /*#__PURE__*/React.createElement("span", {
231
- className: "icon"
232
- }, "_")), /*#__PURE__*/React.createElement("button", {
233
- type: "button",
234
- onClick: () => editor.dispatchCommand(_lexical.FORMAT_ELEMENT_COMMAND, 'right')
235
- }, /*#__PURE__*/React.createElement("span", {
236
- className: "icon"
237
- }, "`")), /*#__PURE__*/React.createElement("button", {
238
- type: "button",
239
- onClick: () => editor.dispatchCommand(_lexical.FORMAT_ELEMENT_COMMAND, 'justify')
240
- }, /*#__PURE__*/React.createElement("span", {
241
- className: "icon"
242
- }, "{"))), /*#__PURE__*/React.createElement("div", {
243
- className: "group"
244
- }, /*#__PURE__*/React.createElement("button", {
245
- type: "button",
246
- onClick: () => editor.dispatchCommand(_lexical.UNDO_COMMAND)
247
- }, /*#__PURE__*/React.createElement("span", {
248
- className: "icon"
249
- }, "\\")), /*#__PURE__*/React.createElement("button", {
250
- type: "button",
251
- className: "flip",
252
- onClick: () => editor.dispatchCommand(_lexical.REDO_COMMAND)
253
- }, /*#__PURE__*/React.createElement("span", {
254
- className: "icon"
255
- }, "\\"))));
256
- };
257
- var _default = exports.default = Toolbar;
@@ -1,246 +0,0 @@
1
- /* eslint-disable import/no-extraneous-dependencies -- required here */
2
- import * as React from 'react';
3
- import { useEffect, useState, useCallback, useRef } from 'react';
4
- import { $getSelection, $isRangeSelection, FORMAT_TEXT_COMMAND, FORMAT_ELEMENT_COMMAND, UNDO_COMMAND, REDO_COMMAND, COMMAND_PRIORITY_NORMAL, createCommand } from 'lexical';
5
- import { INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, REMOVE_LIST_COMMAND, $isListNode, ListNode } from '@lexical/list';
6
- import { $isAtNodeEnd } from '@lexical/selection';
7
- import { $isLinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link';
8
- import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
9
- import { mergeRegister, $getNearestNodeOfType } from '@lexical/utils';
10
- import { Popover } from "../../../..";
11
- import styleNames from '@pareto-engineering/bem/exports';
12
- const baseClassName = styleNames.base;
13
- const componentClassName = 'toolbar';
14
- const getSelectedNode = selection => {
15
- const {
16
- anchor,
17
- focus
18
- } = selection;
19
- const anchorNode = selection.anchor.getNode();
20
- const focusNode = selection.focus.getNode();
21
- if (anchorNode === focusNode) {
22
- return anchorNode;
23
- }
24
- const isBackward = selection.isBackward();
25
- if (isBackward) {
26
- return $isAtNodeEnd(focus) ? anchorNode : focusNode;
27
- }
28
- return $isAtNodeEnd(anchor) ? focusNode : anchorNode;
29
- };
30
- const defaultColor = 'var(--paragraph)';
31
- const colorOptions = ['red', 'blue', 'green', 'yellow', 'orange', 'purple', 'pink', 'brown'];
32
- const Toolbar = () => {
33
- const [editor] = useLexicalComposerContext();
34
- const [isBold, setIsBold] = useState(false);
35
- const [isItalic, setIsItalic] = useState(false);
36
- const [isStrikethrough, setIsStrikethrough] = useState(false);
37
- const [blockType, setBlockType] = useState('paragraph');
38
- const [isLink, setIsLink] = useState(false);
39
- const [isUnderline, setIsUnderline] = useState(false);
40
- const [color, setColor] = useState(defaultColor);
41
- const colorMenuRef = useRef(false);
42
- const formatBulletList = () => {
43
- if (blockType !== 'ul') {
44
- editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND);
45
- } else {
46
- editor.dispatchCommand(REMOVE_LIST_COMMAND);
47
- }
48
- };
49
- const formatNumberedList = () => {
50
- if (blockType !== 'ol') {
51
- editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND);
52
- } else {
53
- editor.dispatchCommand(REMOVE_LIST_COMMAND);
54
- }
55
- };
56
- const formatLink = useCallback(() => {
57
- if (!isLink) {
58
- // eslint-disable-next-line no-alert
59
- const path = prompt('Enter the full URL. Ex: https://www.example.com');
60
- editor.dispatchCommand(TOGGLE_LINK_COMMAND, path);
61
- } else {
62
- editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);
63
- }
64
- }, [editor, isLink]);
65
- const updateToolbar = useCallback(() => {
66
- const selection = $getSelection();
67
-
68
- // Check list selection
69
- if ($isRangeSelection(selection)) {
70
- const anchorNode = selection.anchor.getNode();
71
- const element = anchorNode.getKey() === 'root' ? anchorNode : anchorNode.getTopLevelElementOrThrow();
72
- if ($isListNode(element)) {
73
- const parentList = $getNearestNodeOfType(anchorNode, ListNode);
74
- const type = parentList ? parentList.getTag() : element.getTag();
75
- setBlockType(type);
76
- } else {
77
- setBlockType(element);
78
- }
79
-
80
- // Check nodes for color
81
- const nodes = selection.getNodes().filter(node => node.getType() === 'text');
82
- nodes.forEach(node => {
83
- const style = node.getStyle();
84
- const colorProperty = style.match(/color: ([^;]+)/);
85
- if (colorProperty) {
86
- setColor(colorProperty[1]);
87
- return;
88
- }
89
- setColor(false);
90
- });
91
-
92
- // Check selection text styles
93
- setIsBold(selection.hasFormat('bold'));
94
- setIsItalic(selection.hasFormat('italic'));
95
- setIsStrikethrough(selection.hasFormat('strikethrough'));
96
- setIsUnderline(selection.hasFormat('underline'));
97
- setIsLink(selection.hasFormat('link'));
98
-
99
- // Check links
100
- const node = getSelectedNode(selection);
101
- const parent = node.getParent();
102
- if ($isLinkNode(parent) || $isLinkNode(node)) {
103
- setIsLink(true);
104
- } else {
105
- setIsLink(false);
106
- }
107
- }
108
- }, [editor]);
109
- const UPDATE_COLOR_COMMAND = createCommand();
110
- editor.registerCommand(UPDATE_COLOR_COMMAND, payload => {
111
- const selection = $getSelection();
112
- const nodes = selection?.extract().filter(node => node.getType() === 'text');
113
- nodes?.forEach(node => {
114
- const style = node.getStyle();
115
- const colorProperty = style?.match(/color: ([^;]+)/);
116
- if (colorProperty && color !== payload) {
117
- node.setStyle(style.replace(colorProperty[0], `color: ${payload}`));
118
- } else if (colorProperty) {
119
- node.setStyle(`color: ${defaultColor}`);
120
- } else {
121
- node.setStyle(`color: ${payload}`);
122
- }
123
- });
124
- }, COMMAND_PRIORITY_NORMAL);
125
- useEffect(() => mergeRegister(editor.registerUpdateListener(({
126
- editorState
127
- }) => {
128
- editorState.read(() => {
129
- updateToolbar();
130
- });
131
- })), [updateToolbar, editor]);
132
- const dispatchUpdateColor = useCallback((e, payload) => {
133
- e.stopPropagation();
134
- editor.dispatchCommand(UPDATE_COLOR_COMMAND, payload);
135
- }, [editor]);
136
- return /*#__PURE__*/React.createElement("div", {
137
- className: `${baseClassName} ${componentClassName}`
138
- }, /*#__PURE__*/React.createElement("div", {
139
- className: "group"
140
- }, /*#__PURE__*/React.createElement("button", {
141
- type: "button",
142
- className: isBold ? 'active' : undefined,
143
- onClick: () => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold')
144
- }, /*#__PURE__*/React.createElement("span", {
145
- className: "icon"
146
- }, "|")), /*#__PURE__*/React.createElement("button", {
147
- type: "button",
148
- className: isItalic ? 'active' : undefined,
149
- onClick: () => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic')
150
- }, /*#__PURE__*/React.createElement("span", {
151
- className: "icon"
152
- }, "}")), /*#__PURE__*/React.createElement("button", {
153
- type: "button",
154
- className: isUnderline ? 'active' : undefined,
155
- onClick: () => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline')
156
- }, /*#__PURE__*/React.createElement("span", {
157
- className: "icon"
158
- }, "~")), /*#__PURE__*/React.createElement("button", {
159
- type: "button",
160
- className: isStrikethrough ? 'active' : undefined,
161
- onClick: () => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough')
162
- }, /*#__PURE__*/React.createElement("span", {
163
- className: "icon"
164
- }, "?")), /*#__PURE__*/React.createElement("button", {
165
- type: "button",
166
- className: color && color !== defaultColor ? 'active color-menu-button' : 'color-menu-button',
167
- onClick: () => editor.dispatchCommand(UPDATE_COLOR_COMMAND, color !== defaultColor ? defaultColor : color),
168
- ref: colorMenuRef,
169
- style: {
170
- position: 'relative'
171
- }
172
- }, /*#__PURE__*/React.createElement("span", {
173
- className: "icon",
174
- style: {
175
- color
176
- }
177
- }, "Q"), /*#__PURE__*/React.createElement(Popover, {
178
- parentRef: colorMenuRef
179
- }, /*#__PURE__*/React.createElement("div", {
180
- className: "color-menu"
181
- }, colorOptions.map(option => /*#__PURE__*/React.createElement("span", {
182
- role: "button",
183
- className: "icon color-option",
184
- style: {
185
- color: option
186
- },
187
- onClick: e => dispatchUpdateColor(e, option),
188
- onKeyDown: e => dispatchUpdateColor(e, option),
189
- tabIndex: 0,
190
- key: option
191
- }, "o"))))), /*#__PURE__*/React.createElement("button", {
192
- type: "button",
193
- className: isLink ? 'active' : undefined,
194
- onClick: () => formatLink()
195
- }, /*#__PURE__*/React.createElement("span", {
196
- className: "icon"
197
- }, "]")), /*#__PURE__*/React.createElement("button", {
198
- type: "button",
199
- className: blockType === 'ul' ? 'active' : undefined,
200
- onClick: () => formatBulletList()
201
- }, /*#__PURE__*/React.createElement("span", {
202
- className: "icon"
203
- }, ".")), /*#__PURE__*/React.createElement("button", {
204
- type: "button",
205
- className: blockType === 'ol' ? 'active' : undefined,
206
- onClick: () => formatNumberedList()
207
- }, /*#__PURE__*/React.createElement("span", {
208
- className: "icon"
209
- }, "-"))), /*#__PURE__*/React.createElement("div", {
210
- className: "group"
211
- }, /*#__PURE__*/React.createElement("button", {
212
- type: "button",
213
- onClick: () => editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'left')
214
- }, /*#__PURE__*/React.createElement("span", {
215
- className: "icon"
216
- }, "^")), /*#__PURE__*/React.createElement("button", {
217
- type: "button",
218
- onClick: () => editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'center')
219
- }, /*#__PURE__*/React.createElement("span", {
220
- className: "icon"
221
- }, "_")), /*#__PURE__*/React.createElement("button", {
222
- type: "button",
223
- onClick: () => editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'right')
224
- }, /*#__PURE__*/React.createElement("span", {
225
- className: "icon"
226
- }, "`")), /*#__PURE__*/React.createElement("button", {
227
- type: "button",
228
- onClick: () => editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'justify')
229
- }, /*#__PURE__*/React.createElement("span", {
230
- className: "icon"
231
- }, "{"))), /*#__PURE__*/React.createElement("div", {
232
- className: "group"
233
- }, /*#__PURE__*/React.createElement("button", {
234
- type: "button",
235
- onClick: () => editor.dispatchCommand(UNDO_COMMAND)
236
- }, /*#__PURE__*/React.createElement("span", {
237
- className: "icon"
238
- }, "\\")), /*#__PURE__*/React.createElement("button", {
239
- type: "button",
240
- className: "flip",
241
- onClick: () => editor.dispatchCommand(REDO_COMMAND)
242
- }, /*#__PURE__*/React.createElement("span", {
243
- className: "icon"
244
- }, "\\"))));
245
- };
246
- export default Toolbar;