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.
- package/dist/Markdown-BAW0cb-U.d.cts +153 -0
- package/dist/Markdown-BAW0cb-U.d.ts +153 -0
- package/dist/{chunk-4L7FHW5M.js → chunk-ABL4D65Z.js} +113 -47
- package/dist/chunk-ABL4D65Z.js.map +1 -0
- package/dist/{chunk-BVFTQKY7.js → chunk-Z2DR2FK3.js} +245 -50
- package/dist/chunk-Z2DR2FK3.js.map +1 -0
- package/dist/headless/components/editor-bubble-item.d.ts +9 -0
- package/dist/headless/components/editor-bubble-item.js +29 -0
- package/dist/headless/components/editor-bubble.d.ts +9 -0
- package/dist/headless/components/editor-bubble.js +9 -0
- package/dist/headless/components/editor-command-item.d.ts +3 -0
- package/dist/headless/components/editor-command-item.js +27 -0
- package/dist/headless/components/editor-command.d.ts +3 -0
- package/dist/headless/components/editor-command.js +136 -0
- package/dist/headless/components/editor.d.ts +24 -0
- package/dist/headless/components/editor.js +13 -0
- package/dist/headless/extensions/AISuggestion/AISuggestion.d.ts +82 -0
- package/dist/headless/extensions/AISuggestion/AISuggestion.js +244 -0
- package/dist/headless/extensions/AISuggestion/index.d.ts +2 -0
- package/dist/headless/extensions/AISuggestion/index.js +1 -0
- package/dist/headless/extensions/CodeBlock/CodeBlock.d.ts +1 -0
- package/dist/headless/extensions/CodeBlock/CodeBlock.js +6 -0
- package/dist/headless/extensions/CodeBlock/index.d.ts +1 -0
- package/dist/headless/extensions/CodeBlock/index.js +1 -0
- package/dist/headless/extensions/DragHandle/DragHandle.d.ts +9 -0
- package/dist/headless/extensions/DragHandle/DragHandle.js +47 -0
- package/dist/headless/extensions/DragHandle/index.d.ts +2 -0
- package/dist/headless/extensions/DragHandle/index.js +1 -0
- package/dist/headless/extensions/Image/Image.d.ts +6 -0
- package/dist/headless/extensions/Image/Image.js +197 -0
- package/dist/headless/extensions/ImageBlock/ImageBlock.d.ts +23 -0
- package/dist/headless/extensions/ImageBlock/ImageBlock.js +242 -0
- package/dist/headless/extensions/ImageBlock/index.d.ts +2 -0
- package/dist/headless/extensions/ImageBlock/index.js +1 -0
- package/dist/headless/extensions/Link/Link.d.ts +2 -0
- package/dist/headless/extensions/Link/Link.js +44 -0
- package/dist/headless/extensions/Link/index.d.ts +1 -0
- package/dist/headless/extensions/Link/index.js +1 -0
- package/dist/headless/extensions/Markdown.d.ts +9 -0
- package/dist/headless/extensions/Markdown.js +138 -0
- package/dist/headless/extensions/MarkdownPaste.d.ts +3 -0
- package/dist/headless/extensions/MarkdownPaste.js +168 -0
- package/dist/headless/extensions/Mention/index.d.ts +4 -0
- package/dist/headless/extensions/Mention/index.js +3 -0
- package/dist/headless/extensions/Mention/mention-command.d.ts +8 -0
- package/dist/headless/extensions/Mention/mention-command.js +165 -0
- package/dist/headless/extensions/Mention/mention-list.d.ts +8 -0
- package/dist/headless/extensions/Mention/mention-list.js +150 -0
- package/dist/headless/extensions/Mention/mention-node-view.d.ts +2 -0
- package/dist/headless/extensions/Mention/mention-node-view.js +92 -0
- package/dist/headless/extensions/Mention/mention.d.ts +46 -0
- package/dist/headless/extensions/Mention/mention.js +218 -0
- package/dist/headless/extensions/Table/index.d.ts +2 -0
- package/dist/headless/extensions/Table/index.js +2 -0
- package/dist/headless/extensions/VideoBlock/VideoBlock.d.ts +17 -0
- package/dist/headless/extensions/VideoBlock/VideoBlock.js +73 -0
- package/dist/headless/extensions/VideoBlock/index.d.ts +2 -0
- package/dist/headless/extensions/VideoBlock/index.js +1 -0
- package/dist/headless/extensions/extension-kit.d.ts +29 -0
- package/dist/headless/extensions/extension-kit.js +132 -0
- package/dist/headless/extensions/index.d.ts +16 -0
- package/dist/headless/extensions/index.js +12 -0
- package/dist/headless/extensions/slash-command.d.ts +24 -0
- package/dist/headless/extensions/slash-command.js +99 -0
- package/dist/headless/index.cjs +143 -2
- package/dist/headless/index.cjs.map +1 -1
- package/dist/headless/index.d.cts +3 -2
- package/dist/headless/index.d.ts +3 -2
- package/dist/headless/index.js +5 -1
- package/dist/headless/utils/atoms.d.ts +13 -0
- package/dist/headless/utils/atoms.js +5 -0
- package/dist/headless/utils/store.d.ts +2 -0
- package/dist/headless/utils/store.js +4 -0
- package/dist/highlight.css +77 -1
- package/dist/react/Editor.d.ts +43 -0
- package/dist/react/Editor.js +119 -0
- package/dist/react/TableOfContents.d.ts +7 -0
- package/dist/react/TableOfContents.js +96 -0
- package/dist/react/index.cjs +156 -9
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +5 -2
- package/dist/react/index.d.ts +5 -2
- package/dist/react/index.js +14 -4
- package/dist/react/index.js.map +1 -1
- package/dist/react/menus/DragHandle/BlockActionMenu.d.ts +7 -0
- package/dist/react/menus/DragHandle/BlockActionMenu.js +111 -0
- package/dist/react/menus/DragHandle/DragHandleMenu.d.ts +7 -0
- package/dist/react/menus/DragHandle/DragHandleMenu.js +97 -0
- package/dist/react/menus/ImageBlock/ImageBlockLoading.d.ts +2 -0
- package/dist/react/menus/ImageBlock/ImageBlockLoading.js +6 -0
- package/dist/react/menus/ImageBlock/ImageBlockMenu.d.ts +8 -0
- package/dist/react/menus/ImageBlock/ImageBlockMenu.js +75 -0
- package/dist/react/menus/ImageBlock/ImageBlockView.d.ts +10 -0
- package/dist/react/menus/ImageBlock/ImageBlockView.js +60 -0
- package/dist/react/menus/ImageBlock/ImageBlockWidth.d.ts +6 -0
- package/dist/react/menus/ImageBlock/ImageBlockWidth.js +29 -0
- package/dist/react/menus/ImageBlock/ImageResizeHandle.d.ts +8 -0
- package/dist/react/menus/ImageBlock/ImageResizeHandle.js +37 -0
- package/dist/react/menus/ImageBlock/ImageUploader.d.ts +7 -0
- package/dist/react/menus/ImageBlock/ImageUploader.js +73 -0
- package/dist/react/menus/ImageBlock/index.d.ts +4 -0
- package/dist/react/menus/ImageBlock/index.js +4 -0
- package/dist/react/menus/ImageMenu.d.ts +10 -0
- package/dist/react/menus/ImageMenu.js +77 -0
- package/dist/react/menus/ImagePopover.d.ts +8 -0
- package/dist/react/menus/ImagePopover.js +146 -0
- package/dist/react/menus/LinkMenu.d.ts +2 -0
- package/dist/react/menus/LinkMenu.js +69 -0
- package/dist/react/menus/MenuList.d.ts +10 -0
- package/dist/react/menus/MenuList.js +94 -0
- package/dist/react/menus/SlashMenu.d.ts +5 -0
- package/dist/react/menus/SlashMenu.js +156 -0
- package/dist/react/menus/TableMenu.d.ts +5 -0
- package/dist/react/menus/TableMenu.js +462 -0
- package/dist/react/menus/TaskItem/TaskItemView.d.ts +12 -0
- package/dist/react/menus/TaskItem/TaskItemView.js +11 -0
- package/dist/react/menus/TextMenu.d.ts +10 -0
- package/dist/react/menus/TextMenu.js +139 -0
- package/dist/react/menus/VideoBlock/VideoBlockMenu.d.ts +7 -0
- package/dist/react/menus/VideoBlock/VideoBlockMenu.js +72 -0
- package/dist/react/menus/VideoBlock/VideoBlockView.d.ts +10 -0
- package/dist/react/menus/VideoBlock/VideoBlockView.js +87 -0
- package/dist/react/menus/VideoBlock/index.d.ts +2 -0
- package/dist/react/menus/VideoBlock/index.js +2 -0
- package/dist/react/menus/index.d.ts +15 -0
- package/dist/react/menus/index.js +9 -0
- package/package.json +3 -1
- package/dist/chunk-2DWEJI45.js +0 -1296
- package/dist/chunk-2DWEJI45.js.map +0 -1
- package/dist/chunk-3CLWAYRP.js +0 -1387
- package/dist/chunk-3CLWAYRP.js.map +0 -1
- package/dist/chunk-457ETWB6.js +0 -1351
- package/dist/chunk-457ETWB6.js.map +0 -1
- package/dist/chunk-4L7FHW5M.js.map +0 -1
- package/dist/chunk-4MV3UUZN.js +0 -1073
- package/dist/chunk-4MV3UUZN.js.map +0 -1
- package/dist/chunk-62DYB7FY.js +0 -1305
- package/dist/chunk-62DYB7FY.js.map +0 -1
- package/dist/chunk-BVFTQKY7.js.map +0 -1
- package/dist/chunk-DWGPGRTQ.js +0 -1302
- package/dist/chunk-DWGPGRTQ.js.map +0 -1
- package/dist/chunk-EG7NQJRA.js +0 -1324
- package/dist/chunk-EG7NQJRA.js.map +0 -1
- package/dist/chunk-FLLPFFI5.js +0 -1296
- package/dist/chunk-FLLPFFI5.js.map +0 -1
- package/dist/chunk-FVQHB6VC.js +0 -1128
- package/dist/chunk-FVQHB6VC.js.map +0 -1
- package/dist/chunk-G5E32MLB.js +0 -1352
- package/dist/chunk-G5E32MLB.js.map +0 -1
- package/dist/chunk-GXJGZHKR.js +0 -1326
- package/dist/chunk-GXJGZHKR.js.map +0 -1
- package/dist/chunk-KCPPTLGY.js +0 -1299
- package/dist/chunk-KCPPTLGY.js.map +0 -1
- package/dist/chunk-LHG2NX6C.js +0 -1123
- package/dist/chunk-LHG2NX6C.js.map +0 -1
- package/dist/chunk-MSNTVITF.js +0 -1352
- package/dist/chunk-MSNTVITF.js.map +0 -1
- package/dist/chunk-N4RDYJ5Z.js +0 -1351
- package/dist/chunk-N4RDYJ5Z.js.map +0 -1
- package/dist/chunk-OCNM37WJ.js +0 -1289
- package/dist/chunk-OCNM37WJ.js.map +0 -1
- package/dist/chunk-P3YFYEUB.js +0 -1351
- package/dist/chunk-P3YFYEUB.js.map +0 -1
- package/dist/chunk-RW6QBMJB.js +0 -1300
- package/dist/chunk-RW6QBMJB.js.map +0 -1
- package/dist/chunk-SJQQVB3M.js +0 -1353
- package/dist/chunk-SJQQVB3M.js.map +0 -1
- package/dist/chunk-SOXTEP7H.js +0 -6705
- package/dist/chunk-SOXTEP7H.js.map +0 -1
- package/dist/chunk-VPI26I4P.js +0 -1350
- 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,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.
|
|
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
|
}
|