@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.
- package/dist/editor.css +46 -20
- package/dist/editor.css.map +1 -1
- package/dist/editor.js +483 -456
- package/dist/editor.js.map +1 -1
- package/dist/editor.mjs +481 -454
- package/dist/editor.mjs.map +1 -1
- package/dist/render.js +68 -29
- package/dist/render.js.map +1 -1
- package/dist/render.mjs +68 -29
- package/dist/render.mjs.map +1 -1
- package/dist/styles/index.css +46 -20
- package/package.json +5 -3
- package/src/editor/commands/items.ts +1 -1
- package/src/editor/components/common-modal/common-modal.css +2 -1
- package/src/editor/context/dialog-command.tsx +0 -2
- package/src/editor/controls/bubble-menu-content.tsx +6 -2
- package/src/editor/controls/commands-list.tsx +7 -0
- package/src/editor/dialogs/add-video-dialog/add-video-dialog.tsx +2 -5
- package/src/editor/dialogs/image-dialog/image-dialog.tsx +0 -1
- package/src/editor/editor.tsx +68 -44
- package/src/editor/handlers/dialog-handlers.ts +74 -62
- package/src/editor/handlers/index.ts +1 -2
- package/src/extensions/views/components/index.ts +1 -0
- package/src/extensions/views/components/table.tsx +48 -0
- package/src/render/static-renderer-config.tsx +16 -2
- package/src/styles/editor/base.css +7 -5
- package/src/styles/editor/states.css +4 -3
- package/src/styles/editor/typography.css +10 -2
- package/src/styles/editor/variables.css +1 -0
- package/src/styles/extensions/callout.css +5 -2
- package/src/styles/extensions/code-block.css +2 -1
- package/src/styles/extensions/commands-list.css +5 -1
- package/src/styles/extensions/custom-quote.css +5 -0
- package/src/styles/extensions/details.css +4 -4
- package/src/styles/extensions/myth-reality.css +3 -1
- package/src/styles/extensions/prompt.css +4 -1
- 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(
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
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
|
-
|
|
944
|
-
|
|
945
|
-
|
|
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__ */
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
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
|
-
|
|
970
|
-
|
|
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
|
-
|
|
1102
|
+
editor.chain().focus().clearNodes().run();
|
|
1103
|
+
editor.chain().focus().unsetAllMarks().run();
|
|
975
1104
|
},
|
|
1105
|
+
disabled: !canClearMarks,
|
|
976
1106
|
className: "tiptap-control-button",
|
|
977
|
-
|
|
978
|
-
|
|
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
|
-
|
|
984
|
-
|
|
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/
|
|
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__ */
|
|
4252
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4270
|
+
return /* @__PURE__ */ jsxs34(
|
|
4257
4271
|
"div",
|
|
4258
4272
|
{
|
|
4259
4273
|
className: "video-node",
|
|
4260
4274
|
"data-video": "",
|
|
4261
4275
|
children: [
|
|
4262
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
4313
|
+
return /* @__PURE__ */ jsx84(
|
|
4300
4314
|
"div",
|
|
4301
4315
|
{
|
|
4302
4316
|
ref: pickerRef,
|
|
4303
4317
|
className: "tiptap__emoji-picker-wrapper",
|
|
4304
|
-
children: /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
4351
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4371
|
+
children: /* @__PURE__ */ jsx85("div", { className: "callout-icon", children: icon })
|
|
4358
4372
|
}
|
|
4359
4373
|
),
|
|
4360
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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
|
|
4413
|
+
import { jsx as jsx87 } from "react/jsx-runtime";
|
|
4400
4414
|
var CopyableTextView = () => {
|
|
4401
|
-
return /* @__PURE__ */
|
|
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
|
|
4420
|
+
import { jsx as jsx88 } from "react/jsx-runtime";
|
|
4407
4421
|
var CustomQuoteView = () => {
|
|
4408
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
4472
|
+
return /* @__PURE__ */ jsx89(
|
|
4459
4473
|
NodeViewWrapper4,
|
|
4460
4474
|
{
|
|
4461
4475
|
className: "figure-node-view",
|
|
4462
4476
|
"data-drag-handle": true,
|
|
4463
|
-
children: /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
4526
|
+
import { jsx as jsx91 } from "react/jsx-runtime";
|
|
4513
4527
|
var VideoView = (props) => {
|
|
4514
4528
|
const { src } = props.node.attrs;
|
|
4515
|
-
return /* @__PURE__ */
|
|
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
|
-
|
|
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
|
|
5123
|
-
|
|
5124
|
-
|
|
5125
|
-
|
|
5126
|
-
|
|
5127
|
-
tr.replaceWith($
|
|
5128
|
-
|
|
5129
|
-
}
|
|
5130
|
-
|
|
5131
|
-
|
|
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
|
|
5148
|
-
editor.chain().focus().command(({ tr }) => {
|
|
5149
|
-
|
|
5150
|
-
|
|
5151
|
-
|
|
5152
|
-
|
|
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
|
-
|
|
5172
|
-
|
|
5173
|
-
|
|
5174
|
-
const
|
|
5175
|
-
const
|
|
5176
|
-
|
|
5177
|
-
|
|
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
|
-
}).
|
|
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
|
|
5194
|
-
|
|
5195
|
-
|
|
5196
|
-
|
|
5197
|
-
|
|
5198
|
-
|
|
5199
|
-
|
|
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
|
|
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__ */
|
|
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
|
|
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 =
|
|
6044
|
+
const handleImageAdd = (attrs) => {
|
|
6045
|
+
createHandleImageAdd(editor, handleCloseDialog, savedDialogCursorPos)(attrs);
|
|
6046
|
+
};
|
|
6026
6047
|
const handleImageEdit = createHandleImageEdit(editor, handleCloseDialog, editFigureContext?.pos);
|
|
6027
|
-
const handleVideoAdd =
|
|
6028
|
-
|
|
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
|
-
|
|
6053
|
-
|
|
6054
|
-
|
|
6055
|
-
!isDisabled && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
6076
|
-
isEditable && !isDisabled && /* @__PURE__ */
|
|
6100
|
+
/* @__PURE__ */ jsx93(EditorContent, { editor }),
|
|
6101
|
+
isEditable && !isDisabled && /* @__PURE__ */ jsx93(CharacterCount, { editor })
|
|
6077
6102
|
]
|
|
6078
6103
|
}
|
|
6079
6104
|
),
|
|
6080
|
-
!!error && /* @__PURE__ */
|
|
6081
|
-
|
|
6082
|
-
|
|
6083
|
-
|
|
6084
|
-
|
|
6085
|
-
|
|
6086
|
-
|
|
6087
|
-
|
|
6088
|
-
|
|
6089
|
-
|
|
6090
|
-
|
|
6091
|
-
|
|
6092
|
-
|
|
6093
|
-
|
|
6094
|
-
|
|
6095
|
-
|
|
6096
|
-
|
|
6097
|
-
|
|
6098
|
-
|
|
6099
|
-
|
|
6100
|
-
|
|
6101
|
-
|
|
6102
|
-
|
|
6103
|
-
|
|
6104
|
-
|
|
6105
|
-
|
|
6106
|
-
|
|
6107
|
-
|
|
6108
|
-
|
|
6109
|
-
|
|
6110
|
-
|
|
6111
|
-
|
|
6112
|
-
|
|
6113
|
-
|
|
6114
|
-
|
|
6115
|
-
|
|
6116
|
-
|
|
6117
|
-
|
|
6118
|
-
|
|
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__ */
|
|
6153
|
+
return /* @__PURE__ */ jsx93(TiptapTranslationsProvider, { translations: translations2, children: /* @__PURE__ */ jsx93(DialogCommandProvider, { children: /* @__PURE__ */ jsx93(TiptapContent, { ...props }) }) });
|
|
6127
6154
|
};
|
|
6128
6155
|
export {
|
|
6129
6156
|
Tiptap
|