@cyberyozh/text-editor 0.1.6 → 0.1.8

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 (37) hide show
  1. package/dist/editor.css +46 -20
  2. package/dist/editor.css.map +1 -1
  3. package/dist/editor.js +483 -456
  4. package/dist/editor.js.map +1 -1
  5. package/dist/editor.mjs +481 -454
  6. package/dist/editor.mjs.map +1 -1
  7. package/dist/render.js +68 -29
  8. package/dist/render.js.map +1 -1
  9. package/dist/render.mjs +68 -29
  10. package/dist/render.mjs.map +1 -1
  11. package/dist/styles/index.css +46 -20
  12. package/package.json +5 -3
  13. package/src/editor/commands/items.ts +1 -1
  14. package/src/editor/components/common-modal/common-modal.css +2 -1
  15. package/src/editor/context/dialog-command.tsx +0 -2
  16. package/src/editor/controls/bubble-menu-content.tsx +6 -2
  17. package/src/editor/controls/commands-list.tsx +7 -0
  18. package/src/editor/dialogs/add-video-dialog/add-video-dialog.tsx +2 -5
  19. package/src/editor/dialogs/image-dialog/image-dialog.tsx +0 -1
  20. package/src/editor/editor.tsx +68 -44
  21. package/src/editor/handlers/dialog-handlers.ts +74 -62
  22. package/src/editor/handlers/index.ts +1 -2
  23. package/src/extensions/views/components/index.ts +1 -0
  24. package/src/extensions/views/components/table.tsx +48 -0
  25. package/src/render/static-renderer-config.tsx +16 -2
  26. package/src/styles/editor/base.css +7 -5
  27. package/src/styles/editor/states.css +4 -3
  28. package/src/styles/editor/typography.css +10 -2
  29. package/src/styles/editor/variables.css +1 -0
  30. package/src/styles/extensions/callout.css +5 -2
  31. package/src/styles/extensions/code-block.css +2 -1
  32. package/src/styles/extensions/commands-list.css +5 -1
  33. package/src/styles/extensions/custom-quote.css +5 -0
  34. package/src/styles/extensions/details.css +4 -4
  35. package/src/styles/extensions/myth-reality.css +3 -1
  36. package/src/styles/extensions/prompt.css +4 -1
  37. package/src/editor/handlers/create-image-upload-handler.ts +0 -24
package/dist/editor.mjs CHANGED
@@ -749,7 +749,6 @@ var BubbleMenuContent = ({ editor, onLinkClick }) => {
749
749
  } = useEditorState({
750
750
  editor,
751
751
  selector: (ctx) => {
752
- if (!editor) return {};
753
752
  return {
754
753
  canUndo: ctx.editor.can().undo(),
755
754
  canRedo: ctx.editor.can().redo(),
@@ -789,320 +788,329 @@ var BubbleMenuContent = ({ editor, onLinkClick }) => {
789
788
  onLinkClick?.(selectedText, linkUrl);
790
789
  openDialogCommand("link");
791
790
  };
792
- return /* @__PURE__ */ jsxs10("div", { className: `bubble-menu ${textColor || highlightColor ? "hide-text-selection" : ""}`, children: [
793
- /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
794
- /* @__PURE__ */ jsx58(
795
- "button",
796
- {
797
- className: "tiptap-control-button",
798
- onClick: () => editor.chain().focus().undo().run(),
799
- disabled: !canUndo,
800
- title: translations2.history.undo,
801
- type: "button",
802
- children: /* @__PURE__ */ jsx58(Undo_default, {})
803
- }
804
- ),
805
- /* @__PURE__ */ jsx58(
806
- "button",
807
- {
808
- className: "tiptap-control-button",
809
- onClick: () => editor.chain().focus().redo().run(),
810
- disabled: !canRedo,
811
- type: "button",
812
- title: translations2.history.redo,
813
- children: /* @__PURE__ */ jsx58(Redo_default, {})
814
- }
815
- )
816
- ] }),
817
- /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
818
- /* @__PURE__ */ jsx58(
819
- "button",
820
- {
821
- type: "button",
822
- title: translations2.headings.h2,
823
- onClick: () => editor.chain().focus().toggleHeading({ level: 2 }).run(),
824
- className: `tiptap-control-button ${isHeading2 ? "is-active" : ""}`,
825
- children: /* @__PURE__ */ jsx58(H2_default, {})
826
- }
827
- ),
828
- /* @__PURE__ */ jsx58(
829
- "button",
830
- {
831
- type: "button",
832
- title: translations2.headings.h3,
833
- onClick: () => editor.chain().focus().toggleHeading({ level: 3 }).run(),
834
- className: `tiptap-control-button ${isHeading3 ? "is-active" : ""}`,
835
- children: /* @__PURE__ */ jsx58(H3_default, {})
836
- }
837
- ),
838
- /* @__PURE__ */ jsx58(
839
- "button",
840
- {
841
- type: "button",
842
- title: translations2.headings.h4,
843
- onClick: () => editor.chain().focus().toggleHeading({ level: 4 }).run(),
844
- className: `tiptap-control-button ${isHeading4 ? "is-active" : ""}`,
845
- children: /* @__PURE__ */ jsx58(H4_default, {})
846
- }
847
- ),
848
- /* @__PURE__ */ jsx58(
849
- "button",
850
- {
851
- type: "button",
852
- title: translations2.headings.h5,
853
- onClick: () => editor.chain().focus().toggleHeading({ level: 5 }).run(),
854
- className: `tiptap-control-button ${isHeading5 ? "is-active" : ""}`,
855
- children: /* @__PURE__ */ jsx58(H5_default, {})
856
- }
857
- ),
858
- /* @__PURE__ */ jsx58(
859
- "button",
860
- {
861
- type: "button",
862
- title: translations2.headings.h6,
863
- onClick: () => editor.chain().focus().toggleHeading({ level: 6 }).run(),
864
- className: `tiptap-control-button ${isHeading6 ? "is-active" : ""}`,
865
- children: /* @__PURE__ */ jsx58(H6_default, {})
866
- }
867
- )
868
- ] }),
869
- /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
870
- /* @__PURE__ */ jsx58(
871
- "button",
872
- {
873
- onClick: () => editor.chain().focus().toggleBold().run(),
874
- className: `${isBold ? "is-active" : ""} tiptap-control-button`,
875
- title: translations2.textFormatting.bold,
876
- type: "button",
877
- children: /* @__PURE__ */ jsx58(Bold_default, {})
878
- }
879
- ),
880
- /* @__PURE__ */ jsx58(
881
- "button",
882
- {
883
- onClick: () => editor.chain().focus().toggleItalic().run(),
884
- className: `${isItalic ? "is-active" : ""} tiptap-control-button`,
885
- title: translations2.textFormatting.italic,
886
- type: "button",
887
- children: /* @__PURE__ */ jsx58(Italic_default, {})
888
- }
889
- ),
890
- /* @__PURE__ */ jsx58(
891
- "button",
892
- {
893
- onClick: () => editor.chain().focus().toggleUnderline().run(),
894
- className: `${isUnderline ? "is-active" : ""} tiptap-control-button`,
895
- title: translations2.textFormatting.underline,
896
- type: "button",
897
- children: /* @__PURE__ */ jsx58(Underline_default, {})
898
- }
899
- ),
900
- /* @__PURE__ */ jsx58(
901
- "button",
902
- {
903
- onClick: () => editor.chain().focus().toggleStrike().run(),
904
- className: `${isStrikethrough ? "is-active" : ""} tiptap-control-button`,
905
- title: translations2.textFormatting.strikethrough,
906
- type: "button",
907
- children: /* @__PURE__ */ jsx58(Strikethrough_default, {})
908
- }
909
- )
910
- ] }),
911
- isTable && /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
912
- /* @__PURE__ */ jsx58(
913
- "button",
914
- {
915
- className: "tiptap-control-button",
916
- type: "button",
917
- title: translations2.table.mergeCells,
918
- onClick: () => editor.chain().focus().mergeCells().run(),
919
- children: /* @__PURE__ */ jsx58(MergeCells_default, {})
920
- }
921
- ),
922
- /* @__PURE__ */ jsx58(
923
- "button",
924
- {
925
- className: "tiptap-control-button",
926
- type: "button",
927
- title: translations2.table.splitCell,
928
- onClick: () => editor.chain().focus().splitCell().run(),
929
- children: /* @__PURE__ */ jsx58(SplitCells_default, {})
930
- }
931
- )
932
- ] }),
933
- /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
934
- /* @__PURE__ */ jsxs10("div", { style: { position: "relative" }, children: [
935
- /* @__PURE__ */ jsx58(
791
+ return /* @__PURE__ */ jsxs10(
792
+ "div",
793
+ {
794
+ className: `bubble-menu ${textColor || highlightColor ? "hide-text-selection" : ""}`,
795
+ onMouseDown: (e) => {
796
+ e.preventDefault();
797
+ },
798
+ children: [
799
+ /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
800
+ /* @__PURE__ */ jsx58(
801
+ "button",
802
+ {
803
+ className: "tiptap-control-button",
804
+ onClick: () => editor.chain().focus().undo().run(),
805
+ disabled: !canUndo,
806
+ title: translations2.history.undo,
807
+ type: "button",
808
+ children: /* @__PURE__ */ jsx58(Undo_default, {})
809
+ }
810
+ ),
811
+ /* @__PURE__ */ jsx58(
812
+ "button",
813
+ {
814
+ className: "tiptap-control-button",
815
+ onClick: () => editor.chain().focus().redo().run(),
816
+ disabled: !canRedo,
817
+ type: "button",
818
+ title: translations2.history.redo,
819
+ children: /* @__PURE__ */ jsx58(Redo_default, {})
820
+ }
821
+ )
822
+ ] }),
823
+ /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
824
+ /* @__PURE__ */ jsx58(
825
+ "button",
826
+ {
827
+ type: "button",
828
+ title: translations2.headings.h2,
829
+ onClick: () => editor.chain().focus().toggleHeading({ level: 2 }).run(),
830
+ className: `tiptap-control-button ${isHeading2 ? "is-active" : ""}`,
831
+ children: /* @__PURE__ */ jsx58(H2_default, {})
832
+ }
833
+ ),
834
+ /* @__PURE__ */ jsx58(
835
+ "button",
836
+ {
837
+ type: "button",
838
+ title: translations2.headings.h3,
839
+ onClick: () => editor.chain().focus().toggleHeading({ level: 3 }).run(),
840
+ className: `tiptap-control-button ${isHeading3 ? "is-active" : ""}`,
841
+ children: /* @__PURE__ */ jsx58(H3_default, {})
842
+ }
843
+ ),
844
+ /* @__PURE__ */ jsx58(
845
+ "button",
846
+ {
847
+ type: "button",
848
+ title: translations2.headings.h4,
849
+ onClick: () => editor.chain().focus().toggleHeading({ level: 4 }).run(),
850
+ className: `tiptap-control-button ${isHeading4 ? "is-active" : ""}`,
851
+ children: /* @__PURE__ */ jsx58(H4_default, {})
852
+ }
853
+ ),
854
+ /* @__PURE__ */ jsx58(
855
+ "button",
856
+ {
857
+ type: "button",
858
+ title: translations2.headings.h5,
859
+ onClick: () => editor.chain().focus().toggleHeading({ level: 5 }).run(),
860
+ className: `tiptap-control-button ${isHeading5 ? "is-active" : ""}`,
861
+ children: /* @__PURE__ */ jsx58(H5_default, {})
862
+ }
863
+ ),
864
+ /* @__PURE__ */ jsx58(
865
+ "button",
866
+ {
867
+ type: "button",
868
+ title: translations2.headings.h6,
869
+ onClick: () => editor.chain().focus().toggleHeading({ level: 6 }).run(),
870
+ className: `tiptap-control-button ${isHeading6 ? "is-active" : ""}`,
871
+ children: /* @__PURE__ */ jsx58(H6_default, {})
872
+ }
873
+ )
874
+ ] }),
875
+ /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
876
+ /* @__PURE__ */ jsx58(
877
+ "button",
878
+ {
879
+ onClick: () => editor.chain().focus().toggleBold().run(),
880
+ className: `${isBold ? "is-active" : ""} tiptap-control-button`,
881
+ title: translations2.textFormatting.bold,
882
+ type: "button",
883
+ children: /* @__PURE__ */ jsx58(Bold_default, {})
884
+ }
885
+ ),
886
+ /* @__PURE__ */ jsx58(
887
+ "button",
888
+ {
889
+ onClick: () => editor.chain().focus().toggleItalic().run(),
890
+ className: `${isItalic ? "is-active" : ""} tiptap-control-button`,
891
+ title: translations2.textFormatting.italic,
892
+ type: "button",
893
+ children: /* @__PURE__ */ jsx58(Italic_default, {})
894
+ }
895
+ ),
896
+ /* @__PURE__ */ jsx58(
897
+ "button",
898
+ {
899
+ onClick: () => editor.chain().focus().toggleUnderline().run(),
900
+ className: `${isUnderline ? "is-active" : ""} tiptap-control-button`,
901
+ title: translations2.textFormatting.underline,
902
+ type: "button",
903
+ children: /* @__PURE__ */ jsx58(Underline_default, {})
904
+ }
905
+ ),
906
+ /* @__PURE__ */ jsx58(
907
+ "button",
908
+ {
909
+ onClick: () => editor.chain().focus().toggleStrike().run(),
910
+ className: `${isStrikethrough ? "is-active" : ""} tiptap-control-button`,
911
+ title: translations2.textFormatting.strikethrough,
912
+ type: "button",
913
+ children: /* @__PURE__ */ jsx58(Strikethrough_default, {})
914
+ }
915
+ )
916
+ ] }),
917
+ isTable && /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
918
+ /* @__PURE__ */ jsx58(
919
+ "button",
920
+ {
921
+ className: "tiptap-control-button",
922
+ type: "button",
923
+ title: translations2.table.mergeCells,
924
+ onClick: () => editor.chain().focus().mergeCells().run(),
925
+ children: /* @__PURE__ */ jsx58(MergeCells_default, {})
926
+ }
927
+ ),
928
+ /* @__PURE__ */ jsx58(
929
+ "button",
930
+ {
931
+ className: "tiptap-control-button",
932
+ type: "button",
933
+ title: translations2.table.splitCell,
934
+ onClick: () => editor.chain().focus().splitCell().run(),
935
+ children: /* @__PURE__ */ jsx58(SplitCells_default, {})
936
+ }
937
+ )
938
+ ] }),
939
+ /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
940
+ /* @__PURE__ */ jsxs10("div", { style: { position: "relative" }, children: [
941
+ /* @__PURE__ */ jsx58(
942
+ "button",
943
+ {
944
+ onClick: () => {
945
+ textColorInputRef.current?.click();
946
+ },
947
+ className: "tiptap-control-button",
948
+ type: "button",
949
+ title: translations2.textFormatting.textColor,
950
+ style: { color: textColor },
951
+ children: /* @__PURE__ */ jsx58(TextColor_default, {})
952
+ }
953
+ ),
954
+ /* @__PURE__ */ jsx58(
955
+ "input",
956
+ {
957
+ ref: textColorInputRef,
958
+ type: "color",
959
+ value: textColor,
960
+ onChange: (e) => {
961
+ editor.chain().focus().setColor(e.target.value).run();
962
+ },
963
+ style: {
964
+ position: "absolute",
965
+ top: 0,
966
+ left: 0,
967
+ width: "100%",
968
+ height: "100%",
969
+ opacity: 0,
970
+ pointerEvents: "none"
971
+ }
972
+ }
973
+ )
974
+ ] }),
975
+ /* @__PURE__ */ jsxs10("div", { style: { position: "relative" }, children: [
976
+ /* @__PURE__ */ jsx58(
977
+ "button",
978
+ {
979
+ onClick: () => {
980
+ highlightColorInputRef.current?.click();
981
+ },
982
+ className: "tiptap-control-button",
983
+ type: "button",
984
+ title: translations2.textFormatting.highlightColor,
985
+ style: { color: highlightColor },
986
+ children: /* @__PURE__ */ jsx58(Highlight_default, {})
987
+ }
988
+ ),
989
+ /* @__PURE__ */ jsx58(
990
+ "input",
991
+ {
992
+ ref: highlightColorInputRef,
993
+ type: "color",
994
+ value: highlightColor,
995
+ onChange: (e) => {
996
+ editor.chain().focus().setHighlight({ color: e.target.value }).run();
997
+ },
998
+ style: {
999
+ position: "absolute",
1000
+ top: 0,
1001
+ left: 0,
1002
+ width: "100%",
1003
+ height: "100%",
1004
+ opacity: 0,
1005
+ pointerEvents: "none"
1006
+ }
1007
+ }
1008
+ )
1009
+ ] })
1010
+ ] }),
1011
+ /* @__PURE__ */ jsx58("div", { className: "tiptap-controls-group", children: /* @__PURE__ */ jsx58(
936
1012
  "button",
937
1013
  {
938
- onClick: () => {
939
- textColorInputRef.current?.click();
940
- },
941
- className: "tiptap-control-button",
942
1014
  type: "button",
943
- title: translations2.textFormatting.textColor,
944
- style: { color: textColor },
945
- children: /* @__PURE__ */ jsx58(TextColor_default, {})
1015
+ onClick: () => editor.chain().focus().toggleCopyable().run(),
1016
+ className: `${isCopyable ? "is-active" : ""} tiptap-control-button`,
1017
+ title: translations2.textFormatting.copyableText,
1018
+ children: /* @__PURE__ */ jsx58(Copyable_default, {})
946
1019
  }
947
- ),
948
- /* @__PURE__ */ jsx58(
949
- "input",
950
- {
951
- ref: textColorInputRef,
952
- type: "color",
953
- value: textColor,
954
- onChange: (e) => {
955
- editor.chain().focus().setColor(e.target.value).run();
956
- },
957
- style: {
958
- position: "absolute",
959
- top: 0,
960
- left: 0,
961
- width: "100%",
962
- height: "100%",
963
- opacity: 0,
964
- pointerEvents: "none"
1020
+ ) }),
1021
+ /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
1022
+ /* @__PURE__ */ jsx58(
1023
+ "button",
1024
+ {
1025
+ title: isLink ? translations2.link.editLink : translations2.link.addLinkTitle,
1026
+ onClick: handleLinkClick,
1027
+ className: `${isLink ? "is-active" : ""} tiptap-control-button`,
1028
+ type: "button",
1029
+ children: /* @__PURE__ */ jsx58(Link_default, {})
965
1030
  }
966
- }
967
- )
968
- ] }),
969
- /* @__PURE__ */ jsxs10("div", { style: { position: "relative" }, children: [
970
- /* @__PURE__ */ jsx58(
1031
+ ),
1032
+ isLink && /* @__PURE__ */ jsx58(
1033
+ "button",
1034
+ {
1035
+ onClick: () => editor.chain().focus().unsetLink().run(),
1036
+ className: "tiptap-control-button tiptap-control-button--delete",
1037
+ type: "button",
1038
+ title: translations2.link.removeLinkTitle,
1039
+ children: /* @__PURE__ */ jsx58(LinkOff_default, {})
1040
+ }
1041
+ )
1042
+ ] }),
1043
+ /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
1044
+ /* @__PURE__ */ jsx58(
1045
+ "button",
1046
+ {
1047
+ onClick: () => editor.chain().focus().setTextAlign("left").run(),
1048
+ className: `${isTextAlignLeft ? "is-active" : ""} tiptap-control-button`,
1049
+ title: translations2.alignment.alignLeft,
1050
+ type: "button",
1051
+ children: /* @__PURE__ */ jsx58(AlignLeft_default, {})
1052
+ }
1053
+ ),
1054
+ /* @__PURE__ */ jsx58(
1055
+ "button",
1056
+ {
1057
+ onClick: () => editor.chain().focus().setTextAlign("center").run(),
1058
+ className: `${isTextAlignCenter ? "is-active" : ""} tiptap-control-button`,
1059
+ title: translations2.alignment.alignCenter,
1060
+ type: "button",
1061
+ children: /* @__PURE__ */ jsx58(AlignCenter_default, {})
1062
+ }
1063
+ ),
1064
+ /* @__PURE__ */ jsx58(
1065
+ "button",
1066
+ {
1067
+ onClick: () => editor.chain().focus().setTextAlign("right").run(),
1068
+ className: `${isTextAlignRight ? "is-active" : ""} tiptap-control-button`,
1069
+ title: translations2.alignment.alignRight,
1070
+ type: "button",
1071
+ children: /* @__PURE__ */ jsx58(AlignRight_default, {})
1072
+ }
1073
+ )
1074
+ ] }),
1075
+ /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
1076
+ /* @__PURE__ */ jsx58(
1077
+ "button",
1078
+ {
1079
+ type: "button",
1080
+ onClick: () => editor.chain().focus().toggleSuperscript().run(),
1081
+ className: `${isSuperscript ? "is-active" : ""} tiptap-control-button`,
1082
+ title: translations2.textFormatting.superscript,
1083
+ children: /* @__PURE__ */ jsx58(Superscript_default, {})
1084
+ }
1085
+ ),
1086
+ /* @__PURE__ */ jsx58(
1087
+ "button",
1088
+ {
1089
+ type: "button",
1090
+ onClick: () => editor.chain().focus().toggleSubscript().run(),
1091
+ className: `${isSubscript ? "is-active" : ""} tiptap-control-button`,
1092
+ title: translations2.textFormatting.subscript,
1093
+ children: /* @__PURE__ */ jsx58(Subscript_default, {})
1094
+ }
1095
+ )
1096
+ ] }),
1097
+ /* @__PURE__ */ jsx58("div", { className: "tiptap-controls-group", children: /* @__PURE__ */ jsx58(
971
1098
  "button",
972
1099
  {
1100
+ type: "button",
973
1101
  onClick: () => {
974
- highlightColorInputRef.current?.click();
1102
+ editor.chain().focus().clearNodes().run();
1103
+ editor.chain().focus().unsetAllMarks().run();
975
1104
  },
1105
+ disabled: !canClearMarks,
976
1106
  className: "tiptap-control-button",
977
- type: "button",
978
- title: translations2.textFormatting.highlightColor,
979
- style: { color: highlightColor },
980
- children: /* @__PURE__ */ jsx58(Highlight_default, {})
1107
+ title: translations2.textFormatting.clearFormatting,
1108
+ children: /* @__PURE__ */ jsx58(ClearFormatting_default, {})
981
1109
  }
982
- ),
983
- /* @__PURE__ */ jsx58(
984
- "input",
985
- {
986
- ref: highlightColorInputRef,
987
- type: "color",
988
- value: highlightColor,
989
- onChange: (e) => {
990
- editor.chain().focus().setHighlight({ color: e.target.value }).run();
991
- },
992
- style: {
993
- position: "absolute",
994
- top: 0,
995
- left: 0,
996
- width: "100%",
997
- height: "100%",
998
- opacity: 0,
999
- pointerEvents: "none"
1000
- }
1001
- }
1002
- )
1003
- ] })
1004
- ] }),
1005
- /* @__PURE__ */ jsx58("div", { className: "tiptap-controls-group", children: /* @__PURE__ */ jsx58(
1006
- "button",
1007
- {
1008
- type: "button",
1009
- onClick: () => editor.chain().focus().toggleCopyable().run(),
1010
- className: `${isCopyable ? "is-active" : ""} tiptap-control-button`,
1011
- title: translations2.textFormatting.copyableText,
1012
- children: /* @__PURE__ */ jsx58(Copyable_default, {})
1013
- }
1014
- ) }),
1015
- /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
1016
- /* @__PURE__ */ jsx58(
1017
- "button",
1018
- {
1019
- title: isLink ? translations2.link.editLink : translations2.link.addLinkTitle,
1020
- onClick: handleLinkClick,
1021
- className: `${isLink ? "is-active" : ""} tiptap-control-button`,
1022
- type: "button",
1023
- children: /* @__PURE__ */ jsx58(Link_default, {})
1024
- }
1025
- ),
1026
- isLink && /* @__PURE__ */ jsx58(
1027
- "button",
1028
- {
1029
- onClick: () => editor.chain().focus().unsetLink().run(),
1030
- className: "tiptap-control-button tiptap-control-button--delete",
1031
- type: "button",
1032
- title: translations2.link.removeLinkTitle,
1033
- children: /* @__PURE__ */ jsx58(LinkOff_default, {})
1034
- }
1035
- )
1036
- ] }),
1037
- /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
1038
- /* @__PURE__ */ jsx58(
1039
- "button",
1040
- {
1041
- onClick: () => editor.chain().focus().setTextAlign("left").run(),
1042
- className: `${isTextAlignLeft ? "is-active" : ""} tiptap-control-button`,
1043
- title: translations2.alignment.alignLeft,
1044
- type: "button",
1045
- children: /* @__PURE__ */ jsx58(AlignLeft_default, {})
1046
- }
1047
- ),
1048
- /* @__PURE__ */ jsx58(
1049
- "button",
1050
- {
1051
- onClick: () => editor.chain().focus().setTextAlign("center").run(),
1052
- className: `${isTextAlignCenter ? "is-active" : ""} tiptap-control-button`,
1053
- title: translations2.alignment.alignCenter,
1054
- type: "button",
1055
- children: /* @__PURE__ */ jsx58(AlignCenter_default, {})
1056
- }
1057
- ),
1058
- /* @__PURE__ */ jsx58(
1059
- "button",
1060
- {
1061
- onClick: () => editor.chain().focus().setTextAlign("right").run(),
1062
- className: `${isTextAlignRight ? "is-active" : ""} tiptap-control-button`,
1063
- title: translations2.alignment.alignRight,
1064
- type: "button",
1065
- children: /* @__PURE__ */ jsx58(AlignRight_default, {})
1066
- }
1067
- )
1068
- ] }),
1069
- /* @__PURE__ */ jsxs10("div", { className: "tiptap-controls-group", children: [
1070
- /* @__PURE__ */ jsx58(
1071
- "button",
1072
- {
1073
- type: "button",
1074
- onClick: () => editor.chain().focus().toggleSuperscript().run(),
1075
- className: `${isSuperscript ? "is-active" : ""} tiptap-control-button`,
1076
- title: translations2.textFormatting.superscript,
1077
- children: /* @__PURE__ */ jsx58(Superscript_default, {})
1078
- }
1079
- ),
1080
- /* @__PURE__ */ jsx58(
1081
- "button",
1082
- {
1083
- type: "button",
1084
- onClick: () => editor.chain().focus().toggleSubscript().run(),
1085
- className: `${isSubscript ? "is-active" : ""} tiptap-control-button`,
1086
- title: translations2.textFormatting.subscript,
1087
- children: /* @__PURE__ */ jsx58(Subscript_default, {})
1088
- }
1089
- )
1090
- ] }),
1091
- /* @__PURE__ */ jsx58("div", { className: "tiptap-controls-group", children: /* @__PURE__ */ jsx58(
1092
- "button",
1093
- {
1094
- type: "button",
1095
- onClick: () => {
1096
- editor.chain().focus().clearNodes().run();
1097
- editor.chain().focus().unsetAllMarks().run();
1098
- },
1099
- disabled: !canClearMarks,
1100
- className: "tiptap-control-button",
1101
- title: translations2.textFormatting.clearFormatting,
1102
- children: /* @__PURE__ */ jsx58(ClearFormatting_default, {})
1103
- }
1104
- ) })
1105
- ] });
1110
+ ) })
1111
+ ]
1112
+ }
1113
+ );
1106
1114
  };
1107
1115
 
1108
1116
  // src/editor/controls/drag-handle.tsx
@@ -1379,7 +1387,9 @@ var CommandsList = forwardRef(({ items, command }, ref) => {
1379
1387
  if (item) {
1380
1388
  if (item.dialogCommand) {
1381
1389
  openDialogCommand(item.dialogCommand);
1390
+ command(item);
1382
1391
  } else {
1392
+ console.log("open video");
1383
1393
  command(item);
1384
1394
  }
1385
1395
  }
@@ -1392,6 +1402,10 @@ var CommandsList = forwardRef(({ items, command }, ref) => {
1392
1402
  {
1393
1403
  ref: listRef,
1394
1404
  className: "commands-list-container",
1405
+ onMouseDown: (e) => {
1406
+ e.preventDefault();
1407
+ e.stopPropagation();
1408
+ },
1395
1409
  children: items.map((item, index) => /* @__PURE__ */ jsxs13(
1396
1410
  "button",
1397
1411
  {
@@ -2442,11 +2456,7 @@ var SUPPORTED_PLATFORMS = {
2442
2456
  ["rutube" /* Rutube */]: "Rutube",
2443
2457
  ["vk" /* VK */]: "VK"
2444
2458
  };
2445
- var AddVideoDialog = ({
2446
- open,
2447
- onClose,
2448
- onVideoAdd
2449
- }) => {
2459
+ var AddVideoDialog = ({ open, onClose, onVideoAdd }) => {
2450
2460
  const translations2 = useTiptapTranslations();
2451
2461
  const [url, setUrl] = useState9("");
2452
2462
  const [error, setError] = useState9("");
@@ -2529,6 +2539,7 @@ var AddVideoDialog = ({
2529
2539
  {
2530
2540
  ref: urlInputRef,
2531
2541
  id: "video-url",
2542
+ autoComplete: "off",
2532
2543
  type: "text",
2533
2544
  className: "video-dialog-input",
2534
2545
  placeholder: translations2.videoUpload.urlPlaceholder,
@@ -4243,23 +4254,26 @@ var PromptContent = ({ children, isEmpty, placeholder }) => /* @__PURE__ */ jsx8
4243
4254
  }
4244
4255
  ) });
4245
4256
 
4246
- // src/extensions/views/components/video.tsx
4257
+ // src/extensions/views/components/table.tsx
4247
4258
  import { jsx as jsx82, jsxs as jsxs33 } from "react/jsx-runtime";
4259
+
4260
+ // src/extensions/views/components/video.tsx
4261
+ import { jsx as jsx83, jsxs as jsxs34 } from "react/jsx-runtime";
4248
4262
  var Video = ({ src, children }) => {
4249
4263
  const videoInfo = detectVideoHosting(src);
4250
4264
  if (!videoInfo?.embedUrl) {
4251
- return /* @__PURE__ */ jsxs33("div", { className: "video-node", children: [
4252
- /* @__PURE__ */ jsx82("div", { className: "video-error", children: /* @__PURE__ */ jsx82("span", { children: "Unsupported or invalid video URL" }) }),
4265
+ return /* @__PURE__ */ jsxs34("div", { className: "video-node", children: [
4266
+ /* @__PURE__ */ jsx83("div", { className: "video-error", children: /* @__PURE__ */ jsx83("span", { children: "Unsupported or invalid video URL" }) }),
4253
4267
  children
4254
4268
  ] });
4255
4269
  }
4256
- return /* @__PURE__ */ jsxs33(
4270
+ return /* @__PURE__ */ jsxs34(
4257
4271
  "div",
4258
4272
  {
4259
4273
  className: "video-node",
4260
4274
  "data-video": "",
4261
4275
  children: [
4262
- /* @__PURE__ */ jsx82("div", { className: "video-player-wrapper", children: /* @__PURE__ */ jsx82(
4276
+ /* @__PURE__ */ jsx83("div", { className: "video-player-wrapper", children: /* @__PURE__ */ jsx83(
4263
4277
  "iframe",
4264
4278
  {
4265
4279
  className: "video-iframe",
@@ -4278,7 +4292,7 @@ var Video = ({ src, children }) => {
4278
4292
  // src/editor/controls/emoji-picker.tsx
4279
4293
  import { useEffect as useEffect8, useRef as useRef10 } from "react";
4280
4294
  import EmojiPicker from "emoji-picker-react";
4281
- import { jsx as jsx83 } from "react/jsx-runtime";
4295
+ import { jsx as jsx84 } from "react/jsx-runtime";
4282
4296
  var EmojiPickerComponent = ({ isOpen, onClose, onEmojiSelect }) => {
4283
4297
  const pickerRef = useRef10(null);
4284
4298
  const translations2 = useTiptapTranslations();
@@ -4296,12 +4310,12 @@ var EmojiPickerComponent = ({ isOpen, onClose, onEmojiSelect }) => {
4296
4310
  };
4297
4311
  }, [isOpen, onClose]);
4298
4312
  if (!isOpen) return null;
4299
- return /* @__PURE__ */ jsx83(
4313
+ return /* @__PURE__ */ jsx84(
4300
4314
  "div",
4301
4315
  {
4302
4316
  ref: pickerRef,
4303
4317
  className: "tiptap__emoji-picker-wrapper",
4304
- children: /* @__PURE__ */ jsx83(
4318
+ children: /* @__PURE__ */ jsx84(
4305
4319
  EmojiPicker,
4306
4320
  {
4307
4321
  skinTonesDisabled: true,
@@ -4326,7 +4340,7 @@ var EmojiPickerComponent = ({ isOpen, onClose, onEmojiSelect }) => {
4326
4340
  };
4327
4341
 
4328
4342
  // src/extensions/views/node-views/callout.tsx
4329
- import { jsx as jsx84, jsxs as jsxs34 } from "react/jsx-runtime";
4343
+ import { jsx as jsx85, jsxs as jsxs35 } from "react/jsx-runtime";
4330
4344
  var CalloutView = (props) => {
4331
4345
  const type = props.node.attrs.type || "info";
4332
4346
  const bgColor = props.node.attrs.bgColor;
@@ -4341,23 +4355,23 @@ var CalloutView = (props) => {
4341
4355
  props.updateAttributes({ emoji: newEmoji });
4342
4356
  setShowEmojiPicker(false);
4343
4357
  };
4344
- return /* @__PURE__ */ jsx84(NodeViewWrapper, { children: /* @__PURE__ */ jsx84(
4358
+ return /* @__PURE__ */ jsx85(NodeViewWrapper, { children: /* @__PURE__ */ jsx85(
4345
4359
  Callout,
4346
4360
  {
4347
4361
  type,
4348
4362
  bgColor,
4349
4363
  emoji,
4350
- iconWrapper: (icon) => /* @__PURE__ */ jsxs34("div", { className: "callout-icon-wrapper", children: [
4351
- /* @__PURE__ */ jsx84(
4364
+ iconWrapper: (icon) => /* @__PURE__ */ jsxs35("div", { className: "callout-icon-wrapper", children: [
4365
+ /* @__PURE__ */ jsx85(
4352
4366
  "button",
4353
4367
  {
4354
4368
  className: "callout-icon-button",
4355
4369
  onClick: handleIconClick,
4356
4370
  type: "button",
4357
- children: /* @__PURE__ */ jsx84("div", { className: "callout-icon", children: icon })
4371
+ children: /* @__PURE__ */ jsx85("div", { className: "callout-icon", children: icon })
4358
4372
  }
4359
4373
  ),
4360
- /* @__PURE__ */ jsx84(
4374
+ /* @__PURE__ */ jsx85(
4361
4375
  EmojiPickerComponent,
4362
4376
  {
4363
4377
  isOpen: showEmojiPicker,
@@ -4366,7 +4380,7 @@ var CalloutView = (props) => {
4366
4380
  }
4367
4381
  )
4368
4382
  ] }),
4369
- children: /* @__PURE__ */ jsx84(NodeViewContent, { as: "div" })
4383
+ children: /* @__PURE__ */ jsx85(NodeViewContent, { as: "div" })
4370
4384
  }
4371
4385
  ) });
4372
4386
  };
@@ -4374,7 +4388,7 @@ var CalloutView = (props) => {
4374
4388
  // src/extensions/views/node-views/code-block.tsx
4375
4389
  import { useState as useState11 } from "react";
4376
4390
  import { NodeViewContent as NodeViewContent2, NodeViewWrapper as NodeViewWrapper2 } from "@tiptap/react";
4377
- import { jsx as jsx85 } from "react/jsx-runtime";
4391
+ import { jsx as jsx86 } from "react/jsx-runtime";
4378
4392
  var CodeBlockView = (props) => {
4379
4393
  const [selectedLanguage, setSelectedLanguage] = useState11(props.node.attrs.language ?? "");
4380
4394
  const translations2 = useTiptapTranslations();
@@ -4382,71 +4396,71 @@ var CodeBlockView = (props) => {
4382
4396
  props.updateAttributes({ language });
4383
4397
  setSelectedLanguage(language);
4384
4398
  };
4385
- return /* @__PURE__ */ jsx85(NodeViewWrapper2, { children: /* @__PURE__ */ jsx85(
4399
+ return /* @__PURE__ */ jsx86(NodeViewWrapper2, { children: /* @__PURE__ */ jsx86(
4386
4400
  CodeBlock,
4387
4401
  {
4388
4402
  language: selectedLanguage,
4389
4403
  isEditable: props.editor.isEditable,
4390
4404
  onLanguageChange: handleLanguageChange,
4391
4405
  translations: translations2,
4392
- children: /* @__PURE__ */ jsx85(NodeViewContent2, {})
4406
+ children: /* @__PURE__ */ jsx86(NodeViewContent2, {})
4393
4407
  }
4394
4408
  ) });
4395
4409
  };
4396
4410
 
4397
4411
  // src/extensions/views/node-views/copyable-text.tsx
4398
4412
  import { MarkViewContent } from "@tiptap/react";
4399
- import { jsx as jsx86 } from "react/jsx-runtime";
4413
+ import { jsx as jsx87 } from "react/jsx-runtime";
4400
4414
  var CopyableTextView = () => {
4401
- return /* @__PURE__ */ jsx86(CopyableText2, { children: /* @__PURE__ */ jsx86(MarkViewContent, {}) });
4415
+ return /* @__PURE__ */ jsx87(CopyableText2, { children: /* @__PURE__ */ jsx87(MarkViewContent, {}) });
4402
4416
  };
4403
4417
 
4404
4418
  // src/extensions/views/node-views/custom-quote.tsx
4405
4419
  import { NodeViewContent as NodeViewContent3, NodeViewWrapper as NodeViewWrapper3 } from "@tiptap/react";
4406
- import { jsx as jsx87 } from "react/jsx-runtime";
4420
+ import { jsx as jsx88 } from "react/jsx-runtime";
4407
4421
  var CustomQuoteView = () => {
4408
- return /* @__PURE__ */ jsx87(NodeViewWrapper3, { children: /* @__PURE__ */ jsx87(CustomQuote, { children: /* @__PURE__ */ jsx87(NodeViewContent3, {}) }) });
4422
+ return /* @__PURE__ */ jsx88(NodeViewWrapper3, { children: /* @__PURE__ */ jsx88(CustomQuote, { children: /* @__PURE__ */ jsx88(NodeViewContent3, {}) }) });
4409
4423
  };
4410
4424
  var CustomQuoteTextView = (props) => {
4411
4425
  const isEmpty = !props.node.content.size;
4412
4426
  const translations2 = useTiptapTranslations();
4413
- return /* @__PURE__ */ jsx87(NodeViewWrapper3, { children: /* @__PURE__ */ jsx87(
4427
+ return /* @__PURE__ */ jsx88(NodeViewWrapper3, { children: /* @__PURE__ */ jsx88(
4414
4428
  CustomQuoteText,
4415
4429
  {
4416
4430
  isEmpty,
4417
4431
  placeholder: translations2.customQuote.textPlaceholder,
4418
- children: /* @__PURE__ */ jsx87(NodeViewContent3, { className: isEmpty ? "is-empty" : "" })
4432
+ children: /* @__PURE__ */ jsx88(NodeViewContent3, { className: isEmpty ? "is-empty" : "" })
4419
4433
  }
4420
4434
  ) });
4421
4435
  };
4422
4436
  var CustomQuoteAuthorView = (props) => {
4423
4437
  const isEmpty = !props.node.content.size;
4424
4438
  const translations2 = useTiptapTranslations();
4425
- return /* @__PURE__ */ jsx87(NodeViewWrapper3, { children: /* @__PURE__ */ jsx87(
4439
+ return /* @__PURE__ */ jsx88(NodeViewWrapper3, { children: /* @__PURE__ */ jsx88(
4426
4440
  CustomQuoteAuthor,
4427
4441
  {
4428
4442
  isEmpty,
4429
4443
  placeholder: translations2.customQuote.authorPlaceholder,
4430
- children: /* @__PURE__ */ jsx87(NodeViewContent3, { className: isEmpty ? "is-empty" : "" })
4444
+ children: /* @__PURE__ */ jsx88(NodeViewContent3, { className: isEmpty ? "is-empty" : "" })
4431
4445
  }
4432
4446
  ) });
4433
4447
  };
4434
4448
  var CustomQuoteSignView = (props) => {
4435
4449
  const isEmpty = !props.node.content.size;
4436
4450
  const translations2 = useTiptapTranslations();
4437
- return /* @__PURE__ */ jsx87(NodeViewWrapper3, { children: /* @__PURE__ */ jsx87(
4451
+ return /* @__PURE__ */ jsx88(NodeViewWrapper3, { children: /* @__PURE__ */ jsx88(
4438
4452
  CustomQuoteSign,
4439
4453
  {
4440
4454
  isEmpty,
4441
4455
  placeholder: translations2.customQuote.signPlaceholder,
4442
- children: /* @__PURE__ */ jsx87(NodeViewContent3, { className: isEmpty ? "is-empty" : "" })
4456
+ children: /* @__PURE__ */ jsx88(NodeViewContent3, { className: isEmpty ? "is-empty" : "" })
4443
4457
  }
4444
4458
  ) });
4445
4459
  };
4446
4460
 
4447
4461
  // src/extensions/views/node-views/figure.tsx
4448
4462
  import { NodeViewWrapper as NodeViewWrapper4 } from "@tiptap/react";
4449
- import { jsx as jsx88 } from "react/jsx-runtime";
4463
+ import { jsx as jsx89 } from "react/jsx-runtime";
4450
4464
  var FigureView = ({ node, getPos, editor }) => {
4451
4465
  const { fileId, src, alt, title, caption, width, height } = node.attrs;
4452
4466
  const imageExtension = editor.extensionManager.extensions.find((ext) => ext.name === "image");
@@ -4455,12 +4469,12 @@ var FigureView = ({ node, getPos, editor }) => {
4455
4469
  const handleEditClick = () => {
4456
4470
  onFigureClick?.(node.attrs, getPos());
4457
4471
  };
4458
- return /* @__PURE__ */ jsx88(
4472
+ return /* @__PURE__ */ jsx89(
4459
4473
  NodeViewWrapper4,
4460
4474
  {
4461
4475
  className: "figure-node-view",
4462
4476
  "data-drag-handle": true,
4463
- children: /* @__PURE__ */ jsx88(
4477
+ children: /* @__PURE__ */ jsx89(
4464
4478
  Figure,
4465
4479
  {
4466
4480
  fileId,
@@ -4481,38 +4495,38 @@ var FigureView = ({ node, getPos, editor }) => {
4481
4495
 
4482
4496
  // src/extensions/views/node-views/prompt.tsx
4483
4497
  import { NodeViewContent as NodeViewContent4, NodeViewWrapper as NodeViewWrapper5 } from "@tiptap/react";
4484
- import { jsx as jsx89 } from "react/jsx-runtime";
4498
+ import { jsx as jsx90 } from "react/jsx-runtime";
4485
4499
  var PromptHeaderView = (props) => {
4486
4500
  const isEmpty = !props.node.content.size;
4487
4501
  const translations2 = useTiptapTranslations();
4488
- return /* @__PURE__ */ jsx89(NodeViewWrapper5, { children: /* @__PURE__ */ jsx89(
4502
+ return /* @__PURE__ */ jsx90(NodeViewWrapper5, { children: /* @__PURE__ */ jsx90(
4489
4503
  PromptHeader,
4490
4504
  {
4491
4505
  isEmpty,
4492
4506
  placeholder: translations2.prompt.headerPlaceholder,
4493
- children: /* @__PURE__ */ jsx89(NodeViewContent4, { className: isEmpty ? "is-empty" : "" })
4507
+ children: /* @__PURE__ */ jsx90(NodeViewContent4, { className: isEmpty ? "is-empty" : "" })
4494
4508
  }
4495
4509
  ) });
4496
4510
  };
4497
4511
  var PromptContentView = (props) => {
4498
4512
  const isEmpty = !props.node.content.size;
4499
4513
  const translations2 = useTiptapTranslations();
4500
- return /* @__PURE__ */ jsx89(NodeViewWrapper5, { children: /* @__PURE__ */ jsx89(
4514
+ return /* @__PURE__ */ jsx90(NodeViewWrapper5, { children: /* @__PURE__ */ jsx90(
4501
4515
  PromptContent,
4502
4516
  {
4503
4517
  isEmpty,
4504
4518
  placeholder: translations2.prompt.contentPlaceholder,
4505
- children: /* @__PURE__ */ jsx89(NodeViewContent4, { className: isEmpty ? "is-empty" : "" })
4519
+ children: /* @__PURE__ */ jsx90(NodeViewContent4, { className: isEmpty ? "is-empty" : "" })
4506
4520
  }
4507
4521
  ) });
4508
4522
  };
4509
4523
 
4510
4524
  // src/extensions/views/node-views/video.tsx
4511
4525
  import { NodeViewContent as NodeViewContent5, NodeViewWrapper as NodeViewWrapper6 } from "@tiptap/react";
4512
- import { jsx as jsx90 } from "react/jsx-runtime";
4526
+ import { jsx as jsx91 } from "react/jsx-runtime";
4513
4527
  var VideoView = (props) => {
4514
4528
  const { src } = props.node.attrs;
4515
- return /* @__PURE__ */ jsx90(NodeViewWrapper6, { children: /* @__PURE__ */ jsx90(Video, { src, children: /* @__PURE__ */ jsx90(
4529
+ return /* @__PURE__ */ jsx91(NodeViewWrapper6, { children: /* @__PURE__ */ jsx91(Video, { src, children: /* @__PURE__ */ jsx91(
4516
4530
  NodeViewContent5,
4517
4531
  {
4518
4532
  as: "div",
@@ -5115,48 +5129,56 @@ function getEditorExtensions(options) {
5115
5129
  }
5116
5130
 
5117
5131
  // src/editor/handlers/dialog-handlers.ts
5118
- var createHandleImageAdd = (editor, closeDialogCommand) => {
5132
+ import { TextSelection as TextSelection5 } from "@tiptap/pm/state";
5133
+ var createHandleImageAdd = (editor, closeDialogCommand, savedPos) => {
5119
5134
  return (attrs) => {
5120
5135
  if (!editor) return;
5121
5136
  const { state } = editor;
5122
- const { $from } = state.selection;
5123
- const text = $from.parent.textContent;
5124
- if (text.lastIndexOf("/") !== -1) {
5125
- editor.chain().focus().command(({ tr }) => {
5126
- const node = editor.schema.nodes.image.create({ ...attrs });
5127
- tr.replaceWith($from.before(), $from.after(), node);
5128
- return true;
5129
- }).run();
5130
- } else {
5131
- editor?.chain().focus().setFigure(attrs).run();
5132
- }
5137
+ const insertPos = savedPos ?? state.selection.from;
5138
+ editor.chain().focus().command(({ tr, state: state2 }) => {
5139
+ const $pos = state2.doc.resolve(insertPos);
5140
+ const imageNode = state2.schema.nodes.image.create({ ...attrs });
5141
+ if ($pos.parent.type.name === "paragraph" && $pos.parent.textContent === "") {
5142
+ tr.replaceWith($pos.before(), $pos.after(), imageNode);
5143
+ tr.setSelection(TextSelection5.near(tr.doc.resolve($pos.before())));
5144
+ } else {
5145
+ tr.insert(insertPos, imageNode);
5146
+ tr.setSelection(TextSelection5.near(tr.doc.resolve(insertPos)));
5147
+ }
5148
+ return true;
5149
+ }).run();
5133
5150
  closeDialogCommand();
5134
5151
  };
5135
5152
  };
5136
5153
  var createHandleImageEdit = (editor, closeDialogCommand, pos) => {
5137
5154
  return (attrs) => {
5155
+ console.log("\u{1F440} ~ createHandleImageEdit ~ attrs:", attrs);
5138
5156
  if (!editor || pos === void 0) return;
5139
5157
  editor.chain().focus().setNodeSelection(pos).updateFigure(attrs).run();
5140
5158
  closeDialogCommand();
5141
5159
  };
5142
5160
  };
5143
- var createHandleVideoAdd = (editor, closeDialogCommand) => {
5161
+ var createHandleVideoAdd = (editor, closeDialogCommand, savedPos) => {
5144
5162
  return (url) => {
5145
5163
  if (!editor) return;
5146
5164
  const { state } = editor;
5147
- const { $from } = state.selection;
5148
- editor.chain().focus().command(({ tr }) => {
5149
- tr.replaceWith(
5150
- $from.before(),
5151
- $from.after(),
5152
- editor.schema.nodes.video.create({ src: url })
5153
- );
5165
+ const insertPos = savedPos ?? state.selection.from;
5166
+ editor.chain().focus().command(({ tr, state: state2 }) => {
5167
+ const $pos = state2.doc.resolve(insertPos);
5168
+ const videoNode = state2.schema.nodes.video.create({ src: url });
5169
+ if ($pos.parent.type.name === "paragraph" && $pos.parent.textContent === "") {
5170
+ tr.replaceWith($pos.before(), $pos.after(), videoNode);
5171
+ tr.setSelection(TextSelection5.near(tr.doc.resolve($pos.before())));
5172
+ } else {
5173
+ tr.insert(insertPos, videoNode);
5174
+ tr.setSelection(TextSelection5.near(tr.doc.resolve(insertPos)));
5175
+ }
5154
5176
  return true;
5155
5177
  }).run();
5156
5178
  closeDialogCommand();
5157
5179
  };
5158
5180
  };
5159
- var createHandleLinkAdd = (editor, closeDialogCommand) => {
5181
+ var createHandleLinkAdd = (editor, closeDialogCommand, savedPos) => {
5160
5182
  return (title, url) => {
5161
5183
  if (!editor) return;
5162
5184
  const hasSelection = !editor.state.selection.empty;
@@ -5168,44 +5190,33 @@ var createHandleLinkAdd = (editor, closeDialogCommand) => {
5168
5190
  return true;
5169
5191
  }).run();
5170
5192
  } else {
5171
- editor.chain().focus().command(({ tr, state }) => {
5172
- const { $from } = state.selection;
5173
- const text = $from.parent.textContent;
5174
- const nodeStart = $from.start();
5175
- const beforeCursor = text.substring(0, $from.pos - nodeStart);
5176
- const slashIndex = beforeCursor.lastIndexOf("/");
5177
- if (slashIndex !== -1) {
5178
- tr.delete(nodeStart + slashIndex, $from.pos);
5179
- }
5193
+ const { state } = editor;
5194
+ const insertPos = savedPos ?? state.selection.from;
5195
+ editor.chain().focus().command(({ tr }) => {
5196
+ const linkMark = editor.schema.marks.link.create({ href: url });
5197
+ const textNode = editor.schema.text(title, [linkMark]);
5198
+ tr.insert(insertPos, textNode);
5199
+ tr.setSelection(TextSelection5.create(tr.doc, insertPos, insertPos + title.length));
5180
5200
  return true;
5181
- }).extendMarkRange("link").setLink({ href: url }).insertContent(title).run();
5201
+ }).run();
5182
5202
  }
5183
5203
  closeDialogCommand();
5184
5204
  };
5185
5205
  };
5186
- var createHandleKatexAdd = (editor, closeDialogCommand) => {
5206
+ var createHandleKatexAdd = (editor, closeDialogCommand, savedPos) => {
5187
5207
  return (latex, pos) => {
5188
5208
  if (!editor) return;
5189
5209
  if (pos !== void 0) {
5190
5210
  editor.chain().setNodeSelection(pos).updateInlineMath({ latex }).focus().run();
5191
5211
  } else {
5192
5212
  const { state } = editor;
5193
- const { $from } = state.selection;
5194
- const text = $from.parent.textContent;
5195
- const nodeStart = $from.start();
5196
- const beforeCursor = text.substring(0, $from.pos - nodeStart);
5197
- const slashIndex = beforeCursor.lastIndexOf("/");
5198
- if (slashIndex !== -1) {
5199
- const deleteFrom = nodeStart + slashIndex;
5200
- const deleteTo = $from.pos;
5201
- editor.chain().focus().command(({ tr, state: state2 }) => {
5202
- const inlineMathNode = state2.schema.nodes.inlineMath.create({ latex });
5203
- tr.replaceRangeWith(deleteFrom, deleteTo, inlineMathNode);
5204
- return true;
5205
- }).run();
5206
- } else {
5207
- editor.chain().insertInlineMath({ latex }).focus().run();
5208
- }
5213
+ const insertPos = savedPos ?? state.selection.from;
5214
+ editor.chain().focus().command(({ tr, state: state2 }) => {
5215
+ const inlineMathNode = state2.schema.nodes.inlineMath.create({ latex });
5216
+ tr.insert(insertPos, inlineMathNode);
5217
+ tr.setSelection(TextSelection5.near(tr.doc.resolve(insertPos)));
5218
+ return true;
5219
+ }).run();
5209
5220
  }
5210
5221
  closeDialogCommand();
5211
5222
  };
@@ -5349,7 +5360,7 @@ var getCommandItems = (translations2, hasImageHandlers) => [
5349
5360
  onClick: (editor) => {
5350
5361
  editor.chain().focus().insertContent({
5351
5362
  type: "callout",
5352
- attrs: { type: "", bgColor: "#F7F7F8" },
5363
+ attrs: { type: "", bgColor: "#F7F7F8", emoji: "callout-info" },
5353
5364
  content: [
5354
5365
  {
5355
5366
  type: "paragraph",
@@ -5515,7 +5526,7 @@ var filterCommandItems = (items, query) => {
5515
5526
  };
5516
5527
 
5517
5528
  // src/editor/commands/suggestion.tsx
5518
- import { jsx as jsx91 } from "react/jsx-runtime";
5529
+ import { jsx as jsx92 } from "react/jsx-runtime";
5519
5530
  var component = null;
5520
5531
  var closeMenu = () => {
5521
5532
  if (component) {
@@ -5529,7 +5540,7 @@ var mapCommandMenuItemToCommandItem = (item) => {
5529
5540
  const IconComponent = item.icon;
5530
5541
  return {
5531
5542
  title: item.title,
5532
- icon: /* @__PURE__ */ jsx91(IconComponent, {}),
5543
+ icon: /* @__PURE__ */ jsx92(IconComponent, {}),
5533
5544
  command: ({ editor, range }) => {
5534
5545
  editor.chain().focus().deleteRange(range).run();
5535
5546
  item.onClick(editor);
@@ -5952,7 +5963,7 @@ function getTranslations(lang) {
5952
5963
  }
5953
5964
 
5954
5965
  // src/editor/editor.tsx
5955
- import { Fragment as Fragment3, jsx as jsx92, jsxs as jsxs35 } from "react/jsx-runtime";
5966
+ import { Fragment as Fragment3, jsx as jsx93, jsxs as jsxs36 } from "react/jsx-runtime";
5956
5967
  function TiptapContent({
5957
5968
  content,
5958
5969
  handleChange,
@@ -5967,6 +5978,7 @@ function TiptapContent({
5967
5978
  null
5968
5979
  );
5969
5980
  const [editFigureContext, setEditFigureContext] = useState12(null);
5981
+ const [savedDialogCursorPos, setSavedDialogCursorPos] = useState12(void 0);
5970
5982
  const { activeDialog, closeDialogCommand, openDialogCommand } = useDialogCommand();
5971
5983
  const translations2 = useTiptapTranslations();
5972
5984
  let safeContent;
@@ -6016,18 +6028,31 @@ function TiptapContent({
6016
6028
  },
6017
6029
  [lang]
6018
6030
  );
6031
+ useEffect9(() => {
6032
+ if (activeDialog && editor && !editor.isDestroyed) {
6033
+ const pos = editor.state.selection.from;
6034
+ setSavedDialogCursorPos(pos);
6035
+ }
6036
+ }, [activeDialog, editor]);
6019
6037
  const handleCloseDialog = () => {
6020
6038
  setLinkDialogContext(null);
6021
6039
  setKatexDialogContext(null);
6022
6040
  setEditFigureContext(null);
6041
+ setSavedDialogCursorPos(void 0);
6023
6042
  closeDialogCommand();
6024
6043
  };
6025
- const handleImageAdd = createHandleImageAdd(editor, handleCloseDialog);
6044
+ const handleImageAdd = (attrs) => {
6045
+ createHandleImageAdd(editor, handleCloseDialog, savedDialogCursorPos)(attrs);
6046
+ };
6026
6047
  const handleImageEdit = createHandleImageEdit(editor, handleCloseDialog, editFigureContext?.pos);
6027
- const handleVideoAdd = createHandleVideoAdd(editor, handleCloseDialog);
6028
- const handleLinkAdd = createHandleLinkAdd(editor, handleCloseDialog);
6048
+ const handleVideoAdd = (url) => {
6049
+ createHandleVideoAdd(editor, handleCloseDialog, savedDialogCursorPos)(url);
6050
+ };
6051
+ const handleLinkAdd = (title, url) => {
6052
+ createHandleLinkAdd(editor, handleCloseDialog, savedDialogCursorPos)(title, url);
6053
+ };
6029
6054
  const handleKatexAdd = (latex) => {
6030
- const katexHandler = createHandleKatexAdd(editor, handleCloseDialog);
6055
+ const katexHandler = createHandleKatexAdd(editor, handleCloseDialog, savedDialogCursorPos);
6031
6056
  katexHandler(latex, katexDialogContext?.pos);
6032
6057
  };
6033
6058
  useEffect9(() => {
@@ -6036,7 +6061,6 @@ function TiptapContent({
6036
6061
  emitUpdate: false
6037
6062
  });
6038
6063
  }, [content, editor]);
6039
- if (!editor) return null;
6040
6064
  const shouldBubbleMenuShow = ({ state }) => {
6041
6065
  if (state.selection instanceof NodeSelection) {
6042
6066
  return false;
@@ -6049,16 +6073,17 @@ function TiptapContent({
6049
6073
  }
6050
6074
  return true;
6051
6075
  };
6052
- return /* @__PURE__ */ jsxs35(Fragment3, { children: [
6053
- !isDisabled && /* @__PURE__ */ jsx92(DragHandle, { editor }),
6054
- isEditable && !isDisabled && /* @__PURE__ */ jsx92(TableMenu, { editor }),
6055
- !isDisabled && /* @__PURE__ */ jsx92(
6076
+ if (!editor) return null;
6077
+ return /* @__PURE__ */ jsxs36(Fragment3, { children: [
6078
+ /* @__PURE__ */ jsx93(DragHandle, { editor }),
6079
+ isEditable && !isDisabled && /* @__PURE__ */ jsx93(TableMenu, { editor }),
6080
+ isEditable && !isDisabled && /* @__PURE__ */ jsx93(
6056
6081
  BubbleMenu,
6057
6082
  {
6058
6083
  shouldShow: shouldBubbleMenuShow,
6059
6084
  editor,
6060
6085
  options: { placement: "bottom", offset: 8, flip: true },
6061
- children: /* @__PURE__ */ jsx92(
6086
+ children: /* @__PURE__ */ jsx93(
6062
6087
  BubbleMenuContent,
6063
6088
  {
6064
6089
  editor,
@@ -6067,63 +6092,65 @@ function TiptapContent({
6067
6092
  )
6068
6093
  }
6069
6094
  ),
6070
- /* @__PURE__ */ jsxs35(
6095
+ /* @__PURE__ */ jsxs36(
6071
6096
  "div",
6072
6097
  {
6073
6098
  className: `tiptap-content-wrapper ${!!error ? "has-error" : ""} ${isDisabled ? "is-disabled" : ""}`,
6074
6099
  children: [
6075
- /* @__PURE__ */ jsx92(EditorContent, { editor }),
6076
- isEditable && !isDisabled && /* @__PURE__ */ jsx92(CharacterCount, { editor })
6100
+ /* @__PURE__ */ jsx93(EditorContent, { editor }),
6101
+ isEditable && !isDisabled && /* @__PURE__ */ jsx93(CharacterCount, { editor })
6077
6102
  ]
6078
6103
  }
6079
6104
  ),
6080
- !!error && /* @__PURE__ */ jsx92("p", { className: "tiptap-error-message", children: error }),
6081
- activeDialog === "image" && isEditable && /* @__PURE__ */ jsx92(
6082
- ImageDialog,
6083
- {
6084
- open: true,
6085
- onClose: handleCloseDialog,
6086
- onImageAdd: handleImageAdd,
6087
- onImageEdit: handleImageEdit,
6088
- uploadHandler: imageHandlers?.upload,
6089
- getImageById: imageHandlers?.getImage,
6090
- initialAttrs: editFigureContext?.attrs || void 0,
6091
- mode: editFigureContext ? "edit" : "add"
6092
- }
6093
- ),
6094
- activeDialog === "link" && /* @__PURE__ */ jsx92(
6095
- AddLinkDialog,
6096
- {
6097
- open: true,
6098
- onClose: handleCloseDialog,
6099
- onLinkAdd: handleLinkAdd,
6100
- initialTitle: linkDialogContext?.selectedText || "",
6101
- initialUrl: linkDialogContext?.url || ""
6102
- }
6103
- ),
6104
- activeDialog === "video" && /* @__PURE__ */ jsx92(
6105
- AddVideoDialog,
6106
- {
6107
- open: true,
6108
- onClose: handleCloseDialog,
6109
- onVideoAdd: handleVideoAdd
6110
- }
6111
- ),
6112
- activeDialog === "katex" && /* @__PURE__ */ jsx92(
6113
- AddKatexDialog,
6114
- {
6115
- open: true,
6116
- onClose: handleCloseDialog,
6117
- onKatexAdd: handleKatexAdd,
6118
- initialContent: katexDialogContext?.latex || ""
6119
- }
6120
- )
6105
+ !!error && /* @__PURE__ */ jsx93("p", { className: "tiptap-error-message", children: error }),
6106
+ isEditable && /* @__PURE__ */ jsxs36(Fragment3, { children: [
6107
+ activeDialog === "image" && /* @__PURE__ */ jsx93(
6108
+ ImageDialog,
6109
+ {
6110
+ open: true,
6111
+ onClose: handleCloseDialog,
6112
+ onImageAdd: handleImageAdd,
6113
+ onImageEdit: handleImageEdit,
6114
+ uploadHandler: imageHandlers?.upload,
6115
+ getImageById: imageHandlers?.getImage,
6116
+ initialAttrs: editFigureContext?.attrs || void 0,
6117
+ mode: editFigureContext ? "edit" : "add"
6118
+ }
6119
+ ),
6120
+ activeDialog === "link" && /* @__PURE__ */ jsx93(
6121
+ AddLinkDialog,
6122
+ {
6123
+ open: true,
6124
+ onClose: handleCloseDialog,
6125
+ onLinkAdd: handleLinkAdd,
6126
+ initialTitle: linkDialogContext?.selectedText || "",
6127
+ initialUrl: linkDialogContext?.url || ""
6128
+ }
6129
+ ),
6130
+ activeDialog === "video" && /* @__PURE__ */ jsx93(
6131
+ AddVideoDialog,
6132
+ {
6133
+ open: true,
6134
+ onClose: handleCloseDialog,
6135
+ onVideoAdd: handleVideoAdd
6136
+ }
6137
+ ),
6138
+ activeDialog === "katex" && /* @__PURE__ */ jsx93(
6139
+ AddKatexDialog,
6140
+ {
6141
+ open: true,
6142
+ onClose: handleCloseDialog,
6143
+ onKatexAdd: handleKatexAdd,
6144
+ initialContent: katexDialogContext?.latex || ""
6145
+ }
6146
+ )
6147
+ ] })
6121
6148
  ] });
6122
6149
  }
6123
6150
  var Tiptap = (props) => {
6124
6151
  const { lang = "ru" } = props;
6125
6152
  const translations2 = getTranslations(lang);
6126
- return /* @__PURE__ */ jsx92(TiptapTranslationsProvider, { translations: translations2, children: /* @__PURE__ */ jsx92(DialogCommandProvider, { children: /* @__PURE__ */ jsx92(TiptapContent, { ...props }) }) });
6153
+ return /* @__PURE__ */ jsx93(TiptapTranslationsProvider, { translations: translations2, children: /* @__PURE__ */ jsx93(DialogCommandProvider, { children: /* @__PURE__ */ jsx93(TiptapContent, { ...props }) }) });
6127
6154
  };
6128
6155
  export {
6129
6156
  Tiptap