@baasix/lexical 0.0.2 → 0.0.4

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.
package/dist/index.js CHANGED
@@ -67,7 +67,7 @@ import { LexicalComposer as LexicalComposer2 } from "@lexical/react/LexicalCompo
67
67
  import { OnChangePlugin as OnChangePlugin2 } from "@lexical/react/LexicalOnChangePlugin";
68
68
  import { useLexicalComposerContext as useLexicalComposerContext46 } from "@lexical/react/LexicalComposerContext";
69
69
  import { $generateHtmlFromNodes, $generateNodesFromDOM } from "@lexical/html";
70
- import { $getRoot as $getRoot3, $insertNodes as $insertNodes6 } from "lexical";
70
+ import { $getRoot as $getRoot3, $insertNodes as $insertNodes6, $setSelection as $setSelection7 } from "lexical";
71
71
 
72
72
  // src/Editor.tsx
73
73
  import { CharacterLimitPlugin } from "@lexical/react/LexicalCharacterLimitPlugin";
@@ -102,7 +102,8 @@ import {
102
102
  $getRoot,
103
103
  $isParagraphNode as $isParagraphNode2,
104
104
  CLEAR_EDITOR_COMMAND,
105
- HISTORIC_TAG
105
+ HISTORIC_TAG,
106
+ SELECTION_CHANGE_COMMAND
106
107
  } from "lexical";
107
108
  import { useCallback as useCallback4, useEffect as useEffect4, useState as useState4 } from "react";
108
109
 
@@ -752,6 +753,8 @@ function ActionsPlugin({
752
753
  const [isEditable, setIsEditable] = useState4(() => editor.isEditable());
753
754
  const [isSpeechToText, setIsSpeechToText] = useState4(false);
754
755
  const [isEditorEmpty, setIsEditorEmpty] = useState4(true);
756
+ const [isConverting, setIsConverting] = useState4(false);
757
+ const [isMarkdown, setIsMarkdown] = useState4(false);
755
758
  const [modal, showModal] = useModal();
756
759
  const { isFullscreen, toggleFullscreen } = useFullscreen();
757
760
  useEffect4(() => {
@@ -770,11 +773,15 @@ function ActionsPlugin({
770
773
  editor.getEditorState().read(() => {
771
774
  const root = $getRoot();
772
775
  const children = root.getChildren();
776
+ const firstChild = children[0];
777
+ setIsMarkdown(
778
+ children.length === 1 && $isCodeNode(firstChild) && firstChild.getLanguage() === "markdown"
779
+ );
773
780
  if (children.length > 1) {
774
781
  setIsEditorEmpty(false);
775
782
  } else {
776
- if ($isParagraphNode2(children[0])) {
777
- const paragraphChildren = children[0].getChildren();
783
+ if ($isParagraphNode2(firstChild)) {
784
+ const paragraphChildren = firstChild.getChildren();
778
785
  setIsEditorEmpty(paragraphChildren.length === 0);
779
786
  } else {
780
787
  setIsEditorEmpty(false);
@@ -785,33 +792,73 @@ function ActionsPlugin({
785
792
  );
786
793
  }, [editor, isEditable]);
787
794
  const handleMarkdownToggle = useCallback4(() => {
788
- editor.update(() => {
795
+ if (isConverting) return;
796
+ const currentlyMarkdown = editor.getEditorState().read(() => {
789
797
  const root = $getRoot();
790
798
  const firstChild = root.getFirstChild();
791
- if ($isCodeNode(firstChild) && firstChild.getLanguage() === "markdown") {
792
- $convertFromMarkdownString2(
793
- firstChild.getTextContent(),
794
- PLAYGROUND_TRANSFORMERS,
795
- void 0,
796
- // node
797
- shouldPreserveNewLinesInMarkdown
798
- );
799
- } else {
800
- const markdown = $convertToMarkdownString2(
801
- PLAYGROUND_TRANSFORMERS,
802
- void 0,
803
- //node
804
- shouldPreserveNewLinesInMarkdown
805
- );
806
- const codeNode = $createCodeNode("markdown");
807
- codeNode.append($createTextNode2(markdown));
808
- root.clear().append(codeNode);
809
- if (markdown.length === 0) {
810
- codeNode.select();
811
- }
812
- }
799
+ return $isCodeNode(firstChild) && firstChild.getLanguage() === "markdown";
813
800
  });
814
- }, [editor, shouldPreserveNewLinesInMarkdown]);
801
+ if (currentlyMarkdown) {
802
+ setIsConverting(true);
803
+ requestAnimationFrame(() => {
804
+ requestAnimationFrame(() => {
805
+ try {
806
+ const markdownText = editor.getEditorState().read(() => {
807
+ const root = $getRoot();
808
+ const firstChild = root.getFirstChild();
809
+ return $isCodeNode(firstChild) ? firstChild.getTextContent() : "";
810
+ });
811
+ editor.update(
812
+ () => {
813
+ const root = $getRoot();
814
+ root.clear();
815
+ $convertFromMarkdownString2(
816
+ markdownText,
817
+ PLAYGROUND_TRANSFORMERS,
818
+ void 0,
819
+ // operate on $getRoot()
820
+ shouldPreserveNewLinesInMarkdown
821
+ );
822
+ $getRoot().selectEnd();
823
+ },
824
+ { tag: "historic" }
825
+ );
826
+ editor.dispatchCommand(SELECTION_CHANGE_COMMAND, void 0);
827
+ } finally {
828
+ setIsConverting(false);
829
+ }
830
+ });
831
+ });
832
+ } else {
833
+ setIsConverting(true);
834
+ requestAnimationFrame(() => {
835
+ requestAnimationFrame(() => {
836
+ try {
837
+ const markdown = editor.getEditorState().read(
838
+ () => $convertToMarkdownString2(
839
+ PLAYGROUND_TRANSFORMERS,
840
+ void 0,
841
+ shouldPreserveNewLinesInMarkdown
842
+ )
843
+ );
844
+ editor.update(
845
+ () => {
846
+ const root = $getRoot();
847
+ const codeNode = $createCodeNode("markdown");
848
+ codeNode.append($createTextNode2(markdown));
849
+ root.clear().append(codeNode);
850
+ codeNode.select();
851
+ },
852
+ { tag: "historic" }
853
+ );
854
+ editor.dispatchCommand(SELECTION_CHANGE_COMMAND, void 0);
855
+ } finally {
856
+ setIsConverting(false);
857
+ }
858
+ });
859
+ });
860
+ }
861
+ }, [editor, shouldPreserveNewLinesInMarkdown, isConverting]);
815
862
  return /* @__PURE__ */ jsxs2("div", { className: "actions", children: [
816
863
  /* @__PURE__ */ jsx3(
817
864
  "button",
@@ -872,11 +919,11 @@ function ActionsPlugin({
872
919
  "button",
873
920
  {
874
921
  type: "button",
875
- className: "action-button",
922
+ className: `action-button ${isMarkdown ? "active" : ""}`,
876
923
  onClick: handleMarkdownToggle,
877
- title: "Convert From Markdown",
878
- "aria-label": "Convert from markdown",
879
- children: /* @__PURE__ */ jsx3("i", { className: "markdown" })
924
+ title: isMarkdown ? "Convert to Rich Text" : "Convert to Markdown",
925
+ "aria-label": isMarkdown ? "Convert to rich text" : "Convert to markdown",
926
+ children: isConverting ? /* @__PURE__ */ jsx3("span", { className: "action-button-spinner" }) : /* @__PURE__ */ jsx3("i", { className: "markdown" })
880
927
  }
881
928
  ),
882
929
  modal
@@ -9833,7 +9880,7 @@ import {
9833
9880
  COMMAND_PRIORITY_LOW as COMMAND_PRIORITY_LOW8,
9834
9881
  getDOMSelection as getDOMSelection2,
9835
9882
  KEY_ESCAPE_COMMAND as KEY_ESCAPE_COMMAND2,
9836
- SELECTION_CHANGE_COMMAND
9883
+ SELECTION_CHANGE_COMMAND as SELECTION_CHANGE_COMMAND2
9837
9884
  } from "lexical";
9838
9885
  import { useCallback as useCallback20, useEffect as useEffect31, useRef as useRef10, useState as useState28 } from "react";
9839
9886
  import { createPortal as createPortal8 } from "react-dom";
@@ -9996,7 +10043,7 @@ function FloatingLinkEditor({
9996
10043
  });
9997
10044
  }),
9998
10045
  editor.registerCommand(
9999
- SELECTION_CHANGE_COMMAND,
10046
+ SELECTION_CHANGE_COMMAND2,
10000
10047
  () => {
10001
10048
  $updateLinkEditor();
10002
10049
  return true;
@@ -10203,7 +10250,7 @@ function useFloatingLinkEditorToolbar(editor, anchorElem, isLinkEditMode, setIsL
10203
10250
  });
10204
10251
  }),
10205
10252
  editor.registerCommand(
10206
- SELECTION_CHANGE_COMMAND,
10253
+ SELECTION_CHANGE_COMMAND2,
10207
10254
  (_payload, newEditor) => {
10208
10255
  $updateToolbar();
10209
10256
  setActiveEditor(newEditor);
@@ -10271,7 +10318,7 @@ import {
10271
10318
  COMMAND_PRIORITY_LOW as COMMAND_PRIORITY_LOW9,
10272
10319
  FORMAT_TEXT_COMMAND,
10273
10320
  getDOMSelection as getDOMSelection3,
10274
- SELECTION_CHANGE_COMMAND as SELECTION_CHANGE_COMMAND2
10321
+ SELECTION_CHANGE_COMMAND as SELECTION_CHANGE_COMMAND3
10275
10322
  } from "lexical";
10276
10323
  import { useCallback as useCallback21, useEffect as useEffect32, useRef as useRef11, useState as useState29 } from "react";
10277
10324
  import { createPortal as createPortal9 } from "react-dom";
@@ -10441,7 +10488,7 @@ function TextFormatFloatingToolbar({
10441
10488
  });
10442
10489
  }),
10443
10490
  editor.registerCommand(
10444
- SELECTION_CHANGE_COMMAND2,
10491
+ SELECTION_CHANGE_COMMAND3,
10445
10492
  () => {
10446
10493
  $updateTextFormatFloatingToolbar();
10447
10494
  return false;
@@ -11494,7 +11541,7 @@ import {
11494
11541
  COMMAND_PRIORITY_CRITICAL as COMMAND_PRIORITY_CRITICAL2,
11495
11542
  getDOMSelection as getDOMSelection4,
11496
11543
  isDOMNode as isDOMNode2,
11497
- SELECTION_CHANGE_COMMAND as SELECTION_CHANGE_COMMAND3
11544
+ SELECTION_CHANGE_COMMAND as SELECTION_CHANGE_COMMAND4
11498
11545
  } from "lexical";
11499
11546
  import { useCallback as useCallback22, useEffect as useEffect37, useRef as useRef13, useState as useState31 } from "react";
11500
11547
  import { createPortal as createPortal10 } from "react-dom";
@@ -12501,7 +12548,7 @@ function TableCellActionMenuContainer({
12501
12548
  return mergeRegister12(
12502
12549
  editor.registerUpdateListener(delayedCallback),
12503
12550
  editor.registerCommand(
12504
- SELECTION_CHANGE_COMMAND3,
12551
+ SELECTION_CHANGE_COMMAND4,
12505
12552
  delayedCallback,
12506
12553
  COMMAND_PRIORITY_CRITICAL2
12507
12554
  ),
@@ -13831,7 +13878,7 @@ import {
13831
13878
  INDENT_CONTENT_COMMAND as INDENT_CONTENT_COMMAND2,
13832
13879
  OUTDENT_CONTENT_COMMAND as OUTDENT_CONTENT_COMMAND2,
13833
13880
  REDO_COMMAND as REDO_COMMAND2,
13834
- SELECTION_CHANGE_COMMAND as SELECTION_CHANGE_COMMAND4,
13881
+ SELECTION_CHANGE_COMMAND as SELECTION_CHANGE_COMMAND5,
13835
13882
  SKIP_DOM_SELECTION_TAG as SKIP_DOM_SELECTION_TAG2,
13836
13883
  SKIP_SELECTION_FOCUS_TAG as SKIP_SELECTION_FOCUS_TAG2,
13837
13884
  UNDO_COMMAND as UNDO_COMMAND2
@@ -14516,8 +14563,9 @@ function ToolbarPlugin({
14516
14563
  );
14517
14564
  const theme2 = element.getTheme();
14518
14565
  updateToolbarState("codeTheme", theme2 || "");
14519
- return;
14566
+ return true;
14520
14567
  }
14568
+ return false;
14521
14569
  },
14522
14570
  [updateToolbarState, isCodeHighlighted, isCodeShiki]
14523
14571
  );
@@ -14561,7 +14609,9 @@ function ToolbarPlugin({
14561
14609
  updateToolbarState("blockType", type);
14562
14610
  } else {
14563
14611
  $handleHeadingNode(element);
14564
- $handleCodeNode(element);
14612
+ if ($handleCodeNode(element)) {
14613
+ return;
14614
+ }
14565
14615
  }
14566
14616
  }
14567
14617
  updateToolbarState(
@@ -14644,7 +14694,7 @@ function ToolbarPlugin({
14644
14694
  ]);
14645
14695
  useEffect43(() => {
14646
14696
  return editor.registerCommand(
14647
- SELECTION_CHANGE_COMMAND4,
14697
+ SELECTION_CHANGE_COMMAND5,
14648
14698
  (_payload, newEditor) => {
14649
14699
  setActiveEditor(newEditor);
14650
14700
  $updateToolbar();
@@ -15924,6 +15974,7 @@ function HtmlPlugin({
15924
15974
  lastExternalValue.current = value;
15925
15975
  editor.update(
15926
15976
  () => {
15977
+ $setSelection7(null);
15927
15978
  const root = $getRoot3();
15928
15979
  if (!value || value === "<p></p>" || value === "<p><br></p>") {
15929
15980
  root.clear();