neuphlo-editor 2.5.0 → 2.6.0

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 (171) hide show
  1. package/dist/Markdown-BAW0cb-U.d.cts +153 -0
  2. package/dist/Markdown-BAW0cb-U.d.ts +153 -0
  3. package/dist/{chunk-4L7FHW5M.js → chunk-ABL4D65Z.js} +113 -47
  4. package/dist/chunk-ABL4D65Z.js.map +1 -0
  5. package/dist/{chunk-BVFTQKY7.js → chunk-Z2DR2FK3.js} +245 -50
  6. package/dist/chunk-Z2DR2FK3.js.map +1 -0
  7. package/dist/headless/components/editor-bubble-item.d.ts +9 -0
  8. package/dist/headless/components/editor-bubble-item.js +29 -0
  9. package/dist/headless/components/editor-bubble.d.ts +9 -0
  10. package/dist/headless/components/editor-bubble.js +9 -0
  11. package/dist/headless/components/editor-command-item.d.ts +3 -0
  12. package/dist/headless/components/editor-command-item.js +27 -0
  13. package/dist/headless/components/editor-command.d.ts +3 -0
  14. package/dist/headless/components/editor-command.js +136 -0
  15. package/dist/headless/components/editor.d.ts +24 -0
  16. package/dist/headless/components/editor.js +13 -0
  17. package/dist/headless/extensions/AISuggestion/AISuggestion.d.ts +82 -0
  18. package/dist/headless/extensions/AISuggestion/AISuggestion.js +244 -0
  19. package/dist/headless/extensions/AISuggestion/index.d.ts +2 -0
  20. package/dist/headless/extensions/AISuggestion/index.js +1 -0
  21. package/dist/headless/extensions/CodeBlock/CodeBlock.d.ts +1 -0
  22. package/dist/headless/extensions/CodeBlock/CodeBlock.js +6 -0
  23. package/dist/headless/extensions/CodeBlock/index.d.ts +1 -0
  24. package/dist/headless/extensions/CodeBlock/index.js +1 -0
  25. package/dist/headless/extensions/DragHandle/DragHandle.d.ts +9 -0
  26. package/dist/headless/extensions/DragHandle/DragHandle.js +47 -0
  27. package/dist/headless/extensions/DragHandle/index.d.ts +2 -0
  28. package/dist/headless/extensions/DragHandle/index.js +1 -0
  29. package/dist/headless/extensions/Image/Image.d.ts +6 -0
  30. package/dist/headless/extensions/Image/Image.js +197 -0
  31. package/dist/headless/extensions/ImageBlock/ImageBlock.d.ts +23 -0
  32. package/dist/headless/extensions/ImageBlock/ImageBlock.js +242 -0
  33. package/dist/headless/extensions/ImageBlock/index.d.ts +2 -0
  34. package/dist/headless/extensions/ImageBlock/index.js +1 -0
  35. package/dist/headless/extensions/Link/Link.d.ts +2 -0
  36. package/dist/headless/extensions/Link/Link.js +44 -0
  37. package/dist/headless/extensions/Link/index.d.ts +1 -0
  38. package/dist/headless/extensions/Link/index.js +1 -0
  39. package/dist/headless/extensions/Markdown.d.ts +9 -0
  40. package/dist/headless/extensions/Markdown.js +138 -0
  41. package/dist/headless/extensions/MarkdownPaste.d.ts +3 -0
  42. package/dist/headless/extensions/MarkdownPaste.js +168 -0
  43. package/dist/headless/extensions/Mention/index.d.ts +4 -0
  44. package/dist/headless/extensions/Mention/index.js +3 -0
  45. package/dist/headless/extensions/Mention/mention-command.d.ts +8 -0
  46. package/dist/headless/extensions/Mention/mention-command.js +165 -0
  47. package/dist/headless/extensions/Mention/mention-list.d.ts +8 -0
  48. package/dist/headless/extensions/Mention/mention-list.js +150 -0
  49. package/dist/headless/extensions/Mention/mention-node-view.d.ts +2 -0
  50. package/dist/headless/extensions/Mention/mention-node-view.js +92 -0
  51. package/dist/headless/extensions/Mention/mention.d.ts +46 -0
  52. package/dist/headless/extensions/Mention/mention.js +218 -0
  53. package/dist/headless/extensions/Table/index.d.ts +2 -0
  54. package/dist/headless/extensions/Table/index.js +2 -0
  55. package/dist/headless/extensions/VideoBlock/VideoBlock.d.ts +17 -0
  56. package/dist/headless/extensions/VideoBlock/VideoBlock.js +73 -0
  57. package/dist/headless/extensions/VideoBlock/index.d.ts +2 -0
  58. package/dist/headless/extensions/VideoBlock/index.js +1 -0
  59. package/dist/headless/extensions/extension-kit.d.ts +29 -0
  60. package/dist/headless/extensions/extension-kit.js +132 -0
  61. package/dist/headless/extensions/index.d.ts +16 -0
  62. package/dist/headless/extensions/index.js +12 -0
  63. package/dist/headless/extensions/slash-command.d.ts +24 -0
  64. package/dist/headless/extensions/slash-command.js +99 -0
  65. package/dist/headless/index.cjs +143 -2
  66. package/dist/headless/index.cjs.map +1 -1
  67. package/dist/headless/index.d.cts +3 -2
  68. package/dist/headless/index.d.ts +3 -2
  69. package/dist/headless/index.js +5 -1
  70. package/dist/headless/utils/atoms.d.ts +13 -0
  71. package/dist/headless/utils/atoms.js +5 -0
  72. package/dist/headless/utils/store.d.ts +2 -0
  73. package/dist/headless/utils/store.js +4 -0
  74. package/dist/highlight.css +77 -1
  75. package/dist/react/Editor.d.ts +43 -0
  76. package/dist/react/Editor.js +119 -0
  77. package/dist/react/TableOfContents.d.ts +7 -0
  78. package/dist/react/TableOfContents.js +96 -0
  79. package/dist/react/index.cjs +156 -9
  80. package/dist/react/index.cjs.map +1 -1
  81. package/dist/react/index.d.cts +5 -2
  82. package/dist/react/index.d.ts +5 -2
  83. package/dist/react/index.js +14 -4
  84. package/dist/react/index.js.map +1 -1
  85. package/dist/react/menus/DragHandle/BlockActionMenu.d.ts +7 -0
  86. package/dist/react/menus/DragHandle/BlockActionMenu.js +111 -0
  87. package/dist/react/menus/DragHandle/DragHandleMenu.d.ts +7 -0
  88. package/dist/react/menus/DragHandle/DragHandleMenu.js +97 -0
  89. package/dist/react/menus/ImageBlock/ImageBlockLoading.d.ts +2 -0
  90. package/dist/react/menus/ImageBlock/ImageBlockLoading.js +6 -0
  91. package/dist/react/menus/ImageBlock/ImageBlockMenu.d.ts +8 -0
  92. package/dist/react/menus/ImageBlock/ImageBlockMenu.js +75 -0
  93. package/dist/react/menus/ImageBlock/ImageBlockView.d.ts +10 -0
  94. package/dist/react/menus/ImageBlock/ImageBlockView.js +60 -0
  95. package/dist/react/menus/ImageBlock/ImageBlockWidth.d.ts +6 -0
  96. package/dist/react/menus/ImageBlock/ImageBlockWidth.js +29 -0
  97. package/dist/react/menus/ImageBlock/ImageResizeHandle.d.ts +8 -0
  98. package/dist/react/menus/ImageBlock/ImageResizeHandle.js +37 -0
  99. package/dist/react/menus/ImageBlock/ImageUploader.d.ts +7 -0
  100. package/dist/react/menus/ImageBlock/ImageUploader.js +73 -0
  101. package/dist/react/menus/ImageBlock/index.d.ts +4 -0
  102. package/dist/react/menus/ImageBlock/index.js +4 -0
  103. package/dist/react/menus/ImageMenu.d.ts +10 -0
  104. package/dist/react/menus/ImageMenu.js +77 -0
  105. package/dist/react/menus/ImagePopover.d.ts +8 -0
  106. package/dist/react/menus/ImagePopover.js +146 -0
  107. package/dist/react/menus/LinkMenu.d.ts +2 -0
  108. package/dist/react/menus/LinkMenu.js +69 -0
  109. package/dist/react/menus/MenuList.d.ts +10 -0
  110. package/dist/react/menus/MenuList.js +94 -0
  111. package/dist/react/menus/SlashMenu.d.ts +5 -0
  112. package/dist/react/menus/SlashMenu.js +156 -0
  113. package/dist/react/menus/TableMenu.d.ts +5 -0
  114. package/dist/react/menus/TableMenu.js +462 -0
  115. package/dist/react/menus/TaskItem/TaskItemView.d.ts +12 -0
  116. package/dist/react/menus/TaskItem/TaskItemView.js +11 -0
  117. package/dist/react/menus/TextMenu.d.ts +10 -0
  118. package/dist/react/menus/TextMenu.js +139 -0
  119. package/dist/react/menus/VideoBlock/VideoBlockMenu.d.ts +7 -0
  120. package/dist/react/menus/VideoBlock/VideoBlockMenu.js +72 -0
  121. package/dist/react/menus/VideoBlock/VideoBlockView.d.ts +10 -0
  122. package/dist/react/menus/VideoBlock/VideoBlockView.js +87 -0
  123. package/dist/react/menus/VideoBlock/index.d.ts +2 -0
  124. package/dist/react/menus/VideoBlock/index.js +2 -0
  125. package/dist/react/menus/index.d.ts +15 -0
  126. package/dist/react/menus/index.js +9 -0
  127. package/package.json +3 -1
  128. package/dist/chunk-2DWEJI45.js +0 -1296
  129. package/dist/chunk-2DWEJI45.js.map +0 -1
  130. package/dist/chunk-3CLWAYRP.js +0 -1387
  131. package/dist/chunk-3CLWAYRP.js.map +0 -1
  132. package/dist/chunk-457ETWB6.js +0 -1351
  133. package/dist/chunk-457ETWB6.js.map +0 -1
  134. package/dist/chunk-4L7FHW5M.js.map +0 -1
  135. package/dist/chunk-4MV3UUZN.js +0 -1073
  136. package/dist/chunk-4MV3UUZN.js.map +0 -1
  137. package/dist/chunk-62DYB7FY.js +0 -1305
  138. package/dist/chunk-62DYB7FY.js.map +0 -1
  139. package/dist/chunk-BVFTQKY7.js.map +0 -1
  140. package/dist/chunk-DWGPGRTQ.js +0 -1302
  141. package/dist/chunk-DWGPGRTQ.js.map +0 -1
  142. package/dist/chunk-EG7NQJRA.js +0 -1324
  143. package/dist/chunk-EG7NQJRA.js.map +0 -1
  144. package/dist/chunk-FLLPFFI5.js +0 -1296
  145. package/dist/chunk-FLLPFFI5.js.map +0 -1
  146. package/dist/chunk-FVQHB6VC.js +0 -1128
  147. package/dist/chunk-FVQHB6VC.js.map +0 -1
  148. package/dist/chunk-G5E32MLB.js +0 -1352
  149. package/dist/chunk-G5E32MLB.js.map +0 -1
  150. package/dist/chunk-GXJGZHKR.js +0 -1326
  151. package/dist/chunk-GXJGZHKR.js.map +0 -1
  152. package/dist/chunk-KCPPTLGY.js +0 -1299
  153. package/dist/chunk-KCPPTLGY.js.map +0 -1
  154. package/dist/chunk-LHG2NX6C.js +0 -1123
  155. package/dist/chunk-LHG2NX6C.js.map +0 -1
  156. package/dist/chunk-MSNTVITF.js +0 -1352
  157. package/dist/chunk-MSNTVITF.js.map +0 -1
  158. package/dist/chunk-N4RDYJ5Z.js +0 -1351
  159. package/dist/chunk-N4RDYJ5Z.js.map +0 -1
  160. package/dist/chunk-OCNM37WJ.js +0 -1289
  161. package/dist/chunk-OCNM37WJ.js.map +0 -1
  162. package/dist/chunk-P3YFYEUB.js +0 -1351
  163. package/dist/chunk-P3YFYEUB.js.map +0 -1
  164. package/dist/chunk-RW6QBMJB.js +0 -1300
  165. package/dist/chunk-RW6QBMJB.js.map +0 -1
  166. package/dist/chunk-SJQQVB3M.js +0 -1353
  167. package/dist/chunk-SJQQVB3M.js.map +0 -1
  168. package/dist/chunk-SOXTEP7H.js +0 -6705
  169. package/dist/chunk-SOXTEP7H.js.map +0 -1
  170. package/dist/chunk-VPI26I4P.js +0 -1350
  171. package/dist/chunk-VPI26I4P.js.map +0 -1
@@ -0,0 +1,72 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { NodeSelection } from "@tiptap/pm/state";
3
+ import { useEditorState } from "@tiptap/react";
4
+ import { useCallback, useRef } from "react";
5
+ import { ImageBlockWidth } from "../ImageBlock/ImageBlockWidth";
6
+ import { IconAlignLeft, IconAlignCenter, IconAlignRight, IconTrash, } from "@tabler/icons-react";
7
+ export const VideoBlockMenu = ({ editor, getPos }) => {
8
+ const menuRef = useRef(null);
9
+ const { isVisible, align, width } = useEditorState({
10
+ editor,
11
+ selector: (ctx) => {
12
+ if (!ctx.editor)
13
+ return { isVisible: false, align: "center", width: 100 };
14
+ const { state } = ctx.editor;
15
+ const { selection } = state;
16
+ if (!ctx.editor.isEditable)
17
+ return { isVisible: false, align: "center", width: 100 };
18
+ const isNodeSel = selection instanceof NodeSelection;
19
+ const isThisNode = isNodeSel && selection.from === getPos();
20
+ let currentAlign = "center";
21
+ let currentWidth = 100;
22
+ if (isThisNode) {
23
+ const attrs = ctx.editor.getAttributes("videoBlock");
24
+ currentAlign = attrs.align || "center";
25
+ const widthStr = attrs.width || "100%";
26
+ currentWidth = parseInt(widthStr) || 100;
27
+ }
28
+ return { isVisible: isThisNode, align: currentAlign, width: currentWidth };
29
+ },
30
+ });
31
+ const onAlignLeft = useCallback(() => {
32
+ editor
33
+ .chain()
34
+ .focus(undefined, { scrollIntoView: false })
35
+ .setVideoBlockAlign("left")
36
+ .run();
37
+ }, [editor]);
38
+ const onAlignCenter = useCallback(() => {
39
+ editor
40
+ .chain()
41
+ .focus(undefined, { scrollIntoView: false })
42
+ .setVideoBlockAlign("center")
43
+ .run();
44
+ }, [editor]);
45
+ const onAlignRight = useCallback(() => {
46
+ editor
47
+ .chain()
48
+ .focus(undefined, { scrollIntoView: false })
49
+ .setVideoBlockAlign("right")
50
+ .run();
51
+ }, [editor]);
52
+ const onWidthChange = useCallback((value) => {
53
+ editor
54
+ .chain()
55
+ .focus(undefined, { scrollIntoView: false })
56
+ .setVideoBlockWidth(value)
57
+ .run();
58
+ }, [editor]);
59
+ const onRemove = useCallback(() => {
60
+ editor.chain().focus(undefined, { scrollIntoView: false }).deleteSelection().run();
61
+ }, [editor]);
62
+ if (!isVisible)
63
+ return null;
64
+ return (_jsxs("div", { className: "bubble-menu", ref: menuRef, style: {
65
+ position: "absolute",
66
+ top: "-40px",
67
+ left: "50%",
68
+ transform: "translateX(-50%)",
69
+ zIndex: "var(--nph-z, 50)",
70
+ }, children: [_jsx("button", { type: "button", className: `nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === "left" ? " is-active" : ""}`, title: "Align left", onMouseDown: (e) => e.preventDefault(), onClick: onAlignLeft, children: _jsx(IconAlignLeft, { size: 16 }) }), _jsx("button", { type: "button", className: `nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === "center" ? " is-active" : ""}`, title: "Align center", onMouseDown: (e) => e.preventDefault(), onClick: onAlignCenter, children: _jsx(IconAlignCenter, { size: 16 }) }), _jsx("button", { type: "button", className: `nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon${align === "right" ? " is-active" : ""}`, title: "Align right", onMouseDown: (e) => e.preventDefault(), onClick: onAlignRight, children: _jsx(IconAlignRight, { size: 16 }) }), _jsx("div", { className: "nph-link-popover__divider", style: { margin: "0 4px" } }), _jsx(ImageBlockWidth, { onChange: onWidthChange, value: width }), _jsx("div", { className: "nph-link-popover__divider", style: { margin: "0 4px" } }), _jsx("button", { type: "button", className: "nph-btn nph-btn-ghost nph-btn-xs nph-btn-icon", title: "Remove video", onMouseDown: (e) => e.preventDefault(), onClick: onRemove, children: _jsx(IconTrash, { size: 16 }) })] }));
71
+ };
72
+ export default VideoBlockMenu;
@@ -0,0 +1,10 @@
1
+ import { Node } from "@tiptap/pm/model";
2
+ import { Editor } from "@tiptap/react";
3
+ interface VideoBlockViewProps {
4
+ editor: Editor;
5
+ getPos: () => number;
6
+ node: Node;
7
+ updateAttributes: (attrs: Record<string, any>) => void;
8
+ }
9
+ export declare const VideoBlockView: (props: VideoBlockViewProps) => import("react/jsx-runtime").JSX.Element;
10
+ export default VideoBlockView;
@@ -0,0 +1,87 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { NodeSelection } from "@tiptap/pm/state";
3
+ import { NodeViewWrapper, useEditorState } from "@tiptap/react";
4
+ import { useCallback, useRef, useState } from "react";
5
+ import { VideoBlockMenu } from "./VideoBlockMenu";
6
+ import { IconVideo, IconVideoOff } from "@tabler/icons-react";
7
+ function toEmbedUrl(url) {
8
+ // Already an embed URL — return as-is
9
+ if (url.includes("/embed/") || url.includes("player.vimeo.com") || url.includes("loom.com/embed")) {
10
+ return url;
11
+ }
12
+ // YouTube: youtube.com/watch?v=ID, youtu.be/ID, youtube.com/shorts/ID
13
+ const ytMatch = url.match(/(?:youtube\.com\/(?:watch\?v=|shorts\/)|youtu\.be\/)([\w-]+)/);
14
+ if (ytMatch) {
15
+ return `https://www.youtube.com/embed/${ytMatch[1]}`;
16
+ }
17
+ // Vimeo: vimeo.com/ID or vimeo.com/channels/.../ID
18
+ const vimeoMatch = url.match(/vimeo\.com\/(?:channels\/[\w-]+\/)?(\d+)/);
19
+ if (vimeoMatch) {
20
+ return `https://player.vimeo.com/video/${vimeoMatch[1]}`;
21
+ }
22
+ // Loom: loom.com/share/ID
23
+ const loomMatch = url.match(/loom\.com\/share\/([\w-]+)/);
24
+ if (loomMatch) {
25
+ return `https://www.loom.com/embed/${loomMatch[1]}`;
26
+ }
27
+ return url;
28
+ }
29
+ export const VideoBlockView = (props) => {
30
+ const { editor, getPos, node, updateAttributes } = props;
31
+ const wrapperRef = useRef(null);
32
+ const { src, width, align } = node.attrs;
33
+ const [inputUrl, setInputUrl] = useState("");
34
+ const [videoError, setVideoError] = useState(false);
35
+ const isSelected = useEditorState({
36
+ editor,
37
+ selector: (ctx) => {
38
+ if (!ctx.editor)
39
+ return false;
40
+ const { selection } = ctx.editor.state;
41
+ return selection instanceof NodeSelection && selection.from === getPos();
42
+ },
43
+ });
44
+ const handleEmbed = useCallback(() => {
45
+ if (!inputUrl.trim())
46
+ return;
47
+ const embedUrl = toEmbedUrl(inputUrl.trim());
48
+ updateAttributes({ src: embedUrl });
49
+ }, [inputUrl, updateAttributes]);
50
+ const handleKeyDown = useCallback((e) => {
51
+ if (e.key === "Enter") {
52
+ e.preventDefault();
53
+ handleEmbed();
54
+ }
55
+ }, [handleEmbed]);
56
+ const onClick = useCallback(() => {
57
+ editor.commands.setNodeSelection(getPos());
58
+ }, [getPos, editor.commands]);
59
+ const getWrapperStyle = () => {
60
+ const baseStyle = {
61
+ width: width || "100%",
62
+ maxWidth: "100%",
63
+ };
64
+ if (align === "left") {
65
+ return { ...baseStyle, marginLeft: 0, marginRight: "auto" };
66
+ }
67
+ else if (align === "right") {
68
+ return { ...baseStyle, marginLeft: "auto", marginRight: 0 };
69
+ }
70
+ else {
71
+ return { ...baseStyle, marginLeft: "auto", marginRight: "auto" };
72
+ }
73
+ };
74
+ // Show URL input if no src (only when editable)
75
+ if (!src || src === "") {
76
+ if (!editor.isEditable)
77
+ return _jsx(NodeViewWrapper, {});
78
+ return (_jsx(NodeViewWrapper, { style: getWrapperStyle(), children: _jsx("div", { ref: wrapperRef, children: _jsxs("div", { className: "nph-video-placeholder", onClick: onClick, children: [_jsx("div", { className: "nph-video-placeholder__icon", children: _jsx(IconVideo, { size: 28, stroke: 1.5 }) }), _jsxs("div", { style: { display: "flex", flexDirection: "column", alignItems: "center", gap: "2px" }, children: [_jsx("div", { style: { fontSize: "14px", fontWeight: 600, lineHeight: "20px" }, children: "Add a video" }), _jsx("div", { style: { fontSize: "13px", opacity: 0.5, lineHeight: "18px" }, children: "Paste a URL to embed" })] }), _jsxs("div", { className: "nph-video-placeholder__input", children: [_jsx("input", { type: "text", className: "nph-video-input__field", placeholder: "YouTube, Vimeo, or Loom URL...", value: inputUrl, onChange: (e) => setInputUrl(e.target.value), onKeyDown: handleKeyDown, onClick: (e) => e.stopPropagation() }), _jsx("button", { type: "button", className: "nph-video-input__button", onClick: (e) => { e.stopPropagation(); handleEmbed(); }, disabled: !inputUrl.trim(), children: "Embed" })] })] }) }) }));
79
+ }
80
+ // Show error state for broken video
81
+ if (videoError) {
82
+ return (_jsx(NodeViewWrapper, { style: getWrapperStyle(), children: _jsxs("div", { contentEditable: false, ref: wrapperRef, style: { position: "relative" }, children: [_jsxs("div", { className: "nph-video-block-error", onClick: onClick, children: [_jsx(IconVideoOff, { size: 32 }), _jsx("span", { children: "Video could not be loaded" }), _jsx("span", { className: "nph-video-block-error__url", children: src })] }), editor.isEditable && _jsx(VideoBlockMenu, { editor: editor, getPos: getPos })] }) }));
83
+ }
84
+ // Show the embedded video
85
+ return (_jsx(NodeViewWrapper, { style: getWrapperStyle(), children: _jsxs("div", { contentEditable: false, ref: wrapperRef, style: { position: "relative" }, children: [_jsxs("div", { className: "nph-video-block", children: [_jsx("iframe", { src: src, className: "nph-video-block__iframe", allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture", allowFullScreen: true, onError: () => setVideoError(true) }), !isSelected && (_jsx("div", { className: "nph-video-block__overlay", onClick: onClick }))] }), editor.isEditable && _jsx(VideoBlockMenu, { editor: editor, getPos: getPos })] }) }));
86
+ };
87
+ export default VideoBlockView;
@@ -0,0 +1,2 @@
1
+ export { VideoBlockView } from "./VideoBlockView";
2
+ export { VideoBlockMenu } from "./VideoBlockMenu";
@@ -0,0 +1,2 @@
1
+ export { VideoBlockView } from "./VideoBlockView";
2
+ export { VideoBlockMenu } from "./VideoBlockMenu";
@@ -0,0 +1,15 @@
1
+ export { TextMenu } from "./TextMenu";
2
+ export type { TextMenuProps } from "./TextMenu";
3
+ export { SlashMenu } from "./SlashMenu";
4
+ export type { SlashMenuProps } from "./SlashMenu";
5
+ export { LinkMenu } from "./LinkMenu";
6
+ export { ImagePopover } from "./ImagePopover";
7
+ export type { ImagePopoverProps } from "./ImagePopover";
8
+ export { ImageMenu } from "./ImageMenu";
9
+ export type { ImageMenuProps } from "./ImageMenu";
10
+ export { ImageBlockView, ImageBlockMenu, ImageBlockWidth, ImageUploader } from "./ImageBlock";
11
+ export { VideoBlockView, VideoBlockMenu } from "./VideoBlock";
12
+ export { BlockActionMenu } from "./DragHandle/BlockActionMenu";
13
+ export type { BlockActionMenuProps } from "./DragHandle/BlockActionMenu";
14
+ export { TableMenu } from "./TableMenu";
15
+ export type { TableMenuProps } from "./TableMenu";
@@ -0,0 +1,9 @@
1
+ export { TextMenu } from "./TextMenu";
2
+ export { SlashMenu } from "./SlashMenu";
3
+ export { LinkMenu } from "./LinkMenu";
4
+ export { ImagePopover } from "./ImagePopover";
5
+ export { ImageMenu } from "./ImageMenu";
6
+ export { ImageBlockView, ImageBlockMenu, ImageBlockWidth, ImageUploader } from "./ImageBlock";
7
+ export { VideoBlockView, VideoBlockMenu } from "./VideoBlock";
8
+ export { BlockActionMenu } from "./DragHandle/BlockActionMenu";
9
+ export { TableMenu } from "./TableMenu";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neuphlo-editor",
3
- "version": "2.5.0",
3
+ "version": "2.6.0",
4
4
  "private": false,
5
5
  "description": "A lightweight React wrapper around Tiptap with sensible defaults and image upload support.",
6
6
  "type": "module",
@@ -72,6 +72,7 @@
72
72
  "@tiptap/pm": "3.20.2",
73
73
  "@tiptap/react": "3.20.2",
74
74
  "@tiptap/suggestion": "3.20.2",
75
+ "@types/markdown-it": "^14.1.2",
75
76
  "@types/node": "^20.0.0",
76
77
  "@types/react": "^19.1.12",
77
78
  "@types/react-dom": "^19.1.5",
@@ -121,6 +122,7 @@
121
122
  "highlight.js": "^11.11.1",
122
123
  "jotai": "^2.11.0",
123
124
  "lowlight": "^3.3.0",
125
+ "markdown-it": "^14.1.0",
124
126
  "tunnel-rat": "^0.1.2",
125
127
  "yjs": "^13.6.0"
126
128
  }