@openeditor/react 0.0.12 → 0.0.14
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/README.md +2 -0
- package/dist/index.d.ts +13 -8
- package/dist/index.js +295 -91
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Headless React bindings for OpenEditor's web editor runtime.
|
|
4
4
|
|
|
5
|
+
Pass `attachmentRuntime` to `useOpenEditorController` for editable attachments and to `OpenEditorViewer` for identity-based resolution/opening. Progress, cancellation, retry input, and errors remain transient node-view state and are never emitted through document JSON.
|
|
6
|
+
|
|
5
7
|
## Public surface
|
|
6
8
|
|
|
7
9
|
- `useOpenEditorController` for editor state, commands, document exports, and selection state
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ReactNode, ComponentType } from 'react';
|
|
3
|
-
import { OpenEditorDocument, BlockSpec, ProseMirrorNode } from '@openeditor/core';
|
|
3
|
+
import { OpenEditorDocument, BlockSpec, ProseMirrorNode, OpenEditorAttachmentRuntime } from '@openeditor/core';
|
|
4
4
|
import { toExportBundle, OpenEditorExporters } from '@openeditor/exporters';
|
|
5
5
|
export { seedDocument } from '@openeditor/extensions';
|
|
6
6
|
import { Editor, AnyExtension, NodeConfig } from '@tiptap/core';
|
|
@@ -20,6 +20,7 @@ type OpenEditorPageRuntime = {
|
|
|
20
20
|
}) => Promise<OpenEditorPageSnapshot>;
|
|
21
21
|
resolvePage?: (pageId: string) => Promise<OpenEditorPageSnapshot | null>;
|
|
22
22
|
renamePage?: (pageId: string, title: string) => Promise<void> | void;
|
|
23
|
+
updatePageIcon?: (pageId: string, icon: string) => Promise<void> | void;
|
|
23
24
|
openPage?: (page: OpenEditorPageSnapshot) => Promise<void> | void;
|
|
24
25
|
};
|
|
25
26
|
type OpenEditorReactProps = {
|
|
@@ -29,6 +30,7 @@ type OpenEditorReactProps = {
|
|
|
29
30
|
onChange?: (document: OpenEditorDocument) => void;
|
|
30
31
|
onFilePasteDrop?: (file: File) => boolean;
|
|
31
32
|
pageRuntime?: OpenEditorPageRuntime;
|
|
33
|
+
attachmentRuntime?: OpenEditorAttachmentRuntime<any>;
|
|
32
34
|
slashMenuItems?: readonly OpenEditorSlashMenuItem[];
|
|
33
35
|
/** Consumer-owned blocks. Extension names and node types must be unique. */
|
|
34
36
|
extensions?: readonly OpenEditorReactExtension[];
|
|
@@ -58,7 +60,7 @@ type OpenEditorController = {
|
|
|
58
60
|
toggleCodeBlock: () => void;
|
|
59
61
|
undo: () => void;
|
|
60
62
|
redo: () => void;
|
|
61
|
-
insertBlock: (blockName?: string, range?: InsertRange) =>
|
|
63
|
+
insertBlock: (blockName?: string, range?: InsertRange) => boolean;
|
|
62
64
|
setLink: (url?: string | null) => void;
|
|
63
65
|
getActiveLink: () => string | undefined;
|
|
64
66
|
moveSelectedBlock: (direction: -1 | 1) => void;
|
|
@@ -67,6 +69,7 @@ type OpenEditorController = {
|
|
|
67
69
|
slashMenuItems: readonly OpenEditorSlashMenuItem[];
|
|
68
70
|
extensions: readonly OpenEditorReactExtension[];
|
|
69
71
|
pageRuntime?: OpenEditorPageRuntime;
|
|
72
|
+
attachmentRuntime?: OpenEditorAttachmentRuntime<any>;
|
|
70
73
|
slashState: SlashState | null;
|
|
71
74
|
selectionBubbleState: SelectionBubbleState | null;
|
|
72
75
|
};
|
|
@@ -104,10 +107,10 @@ type OpenEditorSlashMenuItem = {
|
|
|
104
107
|
label: string;
|
|
105
108
|
group: string;
|
|
106
109
|
keywords?: readonly string[];
|
|
107
|
-
|
|
110
|
+
execute: (context: {
|
|
108
111
|
controller: OpenEditorController;
|
|
109
112
|
range: InsertRange;
|
|
110
|
-
}) =>
|
|
113
|
+
}) => boolean;
|
|
111
114
|
};
|
|
112
115
|
type OpenEditorViewerRenderer = (context: {
|
|
113
116
|
node: ProseMirrorNode;
|
|
@@ -143,6 +146,7 @@ type OpenEditorViewerProps = {
|
|
|
143
146
|
renderers?: Partial<Record<string, OpenEditorViewerRenderer>>;
|
|
144
147
|
extensions?: readonly OpenEditorReactExtension[];
|
|
145
148
|
pageRuntime?: OpenEditorPageRuntime;
|
|
149
|
+
attachmentRuntime?: OpenEditorAttachmentRuntime<any>;
|
|
146
150
|
};
|
|
147
151
|
declare module "@tiptap/core" {
|
|
148
152
|
interface Commands<ReturnType> {
|
|
@@ -151,10 +155,11 @@ declare module "@tiptap/core" {
|
|
|
151
155
|
};
|
|
152
156
|
}
|
|
153
157
|
}
|
|
154
|
-
declare const
|
|
158
|
+
declare const formatAttachmentSize: (size: number | null) => string;
|
|
159
|
+
declare const useOpenEditorController: ({ initialDocument, editable, placeholder, onChange, onFilePasteDrop, pageRuntime, attachmentRuntime, slashMenuItems, extensions, }?: OpenEditorReactProps) => OpenEditorController;
|
|
155
160
|
declare const getDefaultSlashMenuItems: (controller: OpenEditorController) => OpenEditorSlashMenuItem[];
|
|
156
161
|
declare const OpenEditorContent: ({ controller, className, }: OpenEditorContentProps) => react.JSX.Element;
|
|
157
|
-
declare const OpenEditorViewer: ({ document, className, renderers, extensions, pageRuntime, }: OpenEditorViewerProps) => react.JSX.Element;
|
|
158
|
-
declare const useOpenEditor: ({ initialDocument, editable, placeholder, onChange, onFilePasteDrop, pageRuntime, slashMenuItems, extensions, }?: OpenEditorReactProps) => OpenEditorController;
|
|
162
|
+
declare const OpenEditorViewer: ({ document, className, renderers, extensions, pageRuntime, attachmentRuntime, }: OpenEditorViewerProps) => react.JSX.Element;
|
|
163
|
+
declare const useOpenEditor: ({ initialDocument, editable, placeholder, onChange, onFilePasteDrop, pageRuntime, attachmentRuntime, slashMenuItems, extensions, }?: OpenEditorReactProps) => OpenEditorController;
|
|
159
164
|
|
|
160
|
-
export { type InsertRange, OpenEditorContent, type OpenEditorContentProps, type OpenEditorController, type OpenEditorExtensionMenu, type OpenEditorOverlayRect, type OpenEditorPageRuntime, type OpenEditorPageSnapshot, type OpenEditorReactConfig, type OpenEditorReactExtension, type OpenEditorReactNodeExtension, type OpenEditorReactProps, type OpenEditorSlashMenuItem, OpenEditorViewer, type OpenEditorViewerProps, type OpenEditorViewerRenderer, type SelectionBubbleState, type SlashState, defineOpenEditorReactExtension, defineOpenEditorReactNode, getDefaultSlashMenuItems, useOpenEditor, useOpenEditorController };
|
|
165
|
+
export { type InsertRange, OpenEditorContent, type OpenEditorContentProps, type OpenEditorController, type OpenEditorExtensionMenu, type OpenEditorOverlayRect, type OpenEditorPageRuntime, type OpenEditorPageSnapshot, type OpenEditorReactConfig, type OpenEditorReactExtension, type OpenEditorReactNodeExtension, type OpenEditorReactProps, type OpenEditorSlashMenuItem, OpenEditorViewer, type OpenEditorViewerProps, type OpenEditorViewerRenderer, type SelectionBubbleState, type SlashState, defineOpenEditorReactExtension, defineOpenEditorReactNode, formatAttachmentSize, getDefaultSlashMenuItems, useOpenEditor, useOpenEditorController };
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { normalizeDocument, fromProseMirrorDocument, toProseMirrorDocument, moveTopLevelBlock, duplicateTopLevelBlock, deleteTopLevelBlock, createBlockRegistry, findBlockSpecForNode } from '@openeditor/core';
|
|
1
|
+
import { DEFAULT_CALLOUT_EMOJI, normalizeEmoji, DEFAULT_PAGE_EMOJI, normalizeDocument, fromProseMirrorDocument, toProseMirrorDocument, moveTopLevelBlock, duplicateTopLevelBlock, deleteTopLevelBlock, createBlockRegistry, findBlockSpecForNode } from '@openeditor/core';
|
|
2
2
|
import { Checkbox } from '@base-ui/react/checkbox';
|
|
3
|
+
import { OpenEditorEmojiPicker } from '@openeditor/emoji';
|
|
3
4
|
import { renderMermaidSVG } from 'beautiful-mermaid';
|
|
4
5
|
import { toExportBundle } from '@openeditor/exporters';
|
|
5
|
-
import { seedDocument, openEditorInsertPresets,
|
|
6
|
+
import { seedDocument, openEditorInsertPresets, resolveOpenEditorInsertBlock, defaultBlockRegistry } from '@openeditor/extensions';
|
|
6
7
|
export { seedDocument } from '@openeditor/extensions';
|
|
7
8
|
import { Node, mergeAttributes, InputRule } from '@tiptap/core';
|
|
8
9
|
import HorizontalRule from '@tiptap/extension-horizontal-rule';
|
|
@@ -22,11 +23,12 @@ import { ReplaceStep } from '@tiptap/pm/transform';
|
|
|
22
23
|
import { ReactNodeViewRenderer, NodeViewWrapper, NodeViewContent, useEditor, EditorContent } from '@tiptap/react';
|
|
23
24
|
export { NodeViewContent, NodeViewWrapper } from '@tiptap/react';
|
|
24
25
|
import StarterKit from '@tiptap/starter-kit';
|
|
25
|
-
import { createContext, use, useState,
|
|
26
|
+
import { createContext, use, useState, useRef, useEffect, useMemo, Fragment } from 'react';
|
|
26
27
|
import { jsxs, jsx, Fragment as Fragment$1 } from 'react/jsx-runtime';
|
|
27
28
|
|
|
28
29
|
// src/index.tsx
|
|
29
30
|
var OpenEditorPageRuntimeContext = createContext(void 0);
|
|
31
|
+
var OpenEditorAttachmentRuntimeContext = createContext(void 0);
|
|
30
32
|
var defineOpenEditorReactExtension = (extension) => extension;
|
|
31
33
|
var defineOpenEditorReactNode = ({
|
|
32
34
|
block,
|
|
@@ -302,7 +304,7 @@ var OpenEditorToggleListItemNodeView = ({ editor, node, updateAttributes }) => {
|
|
|
302
304
|
disabled: !editor.isEditable,
|
|
303
305
|
onClick: () => updateAttributes({ open: !open }),
|
|
304
306
|
type: "button",
|
|
305
|
-
children: /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "oe-toggle-list-chevron"
|
|
307
|
+
children: /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "oe-toggle-list-chevron" })
|
|
306
308
|
}
|
|
307
309
|
),
|
|
308
310
|
/* @__PURE__ */ jsx(NodeViewContent, { as: "div", className: "oe-toggle-list-content" })
|
|
@@ -323,21 +325,17 @@ var ToggleListItem = Node.create({
|
|
|
323
325
|
return ReactNodeViewRenderer(OpenEditorToggleListItemNodeView);
|
|
324
326
|
}
|
|
325
327
|
});
|
|
326
|
-
var
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
/* @__PURE__ */ jsx(
|
|
330
|
-
"select",
|
|
328
|
+
var OpenEditorCalloutNodeView = ({ editor, node, updateAttributes }) => /* @__PURE__ */ jsxs(NodeViewWrapper, { as: "aside", className: "oe-callout", children: [
|
|
329
|
+
/* @__PURE__ */ jsx("span", { className: "oe-callout-emoji", contentEditable: false, children: /* @__PURE__ */ jsx(
|
|
330
|
+
OpenEditorEmojiPicker,
|
|
331
331
|
{
|
|
332
|
-
|
|
333
|
-
className: "oe-callout-tone",
|
|
334
|
-
contentEditable: false,
|
|
332
|
+
className: "oe-callout-emoji-trigger",
|
|
335
333
|
disabled: !editor.isEditable,
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
334
|
+
emoji: normalizeEmoji(node.attrs.emoji, DEFAULT_CALLOUT_EMOJI),
|
|
335
|
+
label: "Change callout emoji",
|
|
336
|
+
onEmojiSelect: (emoji) => updateAttributes({ emoji })
|
|
339
337
|
}
|
|
340
|
-
),
|
|
338
|
+
) }),
|
|
341
339
|
/* @__PURE__ */ jsx(NodeViewContent, { as: "div", className: "oe-callout-content" })
|
|
342
340
|
] });
|
|
343
341
|
var Callout = Node.create({
|
|
@@ -345,7 +343,13 @@ var Callout = Node.create({
|
|
|
345
343
|
group: "block",
|
|
346
344
|
content: "block+",
|
|
347
345
|
defining: true,
|
|
348
|
-
addAttributes: () => ({
|
|
346
|
+
addAttributes: () => ({
|
|
347
|
+
emoji: {
|
|
348
|
+
default: DEFAULT_CALLOUT_EMOJI,
|
|
349
|
+
parseHTML: (element) => element.getAttribute("data-emoji") || DEFAULT_CALLOUT_EMOJI,
|
|
350
|
+
renderHTML: (attributes) => ({ "data-emoji": normalizeEmoji(attributes.emoji, DEFAULT_CALLOUT_EMOJI) })
|
|
351
|
+
}
|
|
352
|
+
}),
|
|
349
353
|
parseHTML: () => [{ tag: "aside[data-openeditor-callout]" }],
|
|
350
354
|
renderHTML: ({ HTMLAttributes }) => [
|
|
351
355
|
"aside",
|
|
@@ -356,13 +360,183 @@ var Callout = Node.create({
|
|
|
356
360
|
return ReactNodeViewRenderer(OpenEditorCalloutNodeView);
|
|
357
361
|
}
|
|
358
362
|
});
|
|
363
|
+
var attachmentSnapshotFromNode = (node) => ({
|
|
364
|
+
attachmentId: typeof node.attrs?.attachmentId === "string" ? node.attrs.attachmentId : null,
|
|
365
|
+
name: typeof node.attrs?.name === "string" ? node.attrs.name : "",
|
|
366
|
+
mimeType: typeof node.attrs?.mimeType === "string" ? node.attrs.mimeType : null,
|
|
367
|
+
size: typeof node.attrs?.size === "number" ? node.attrs.size : null,
|
|
368
|
+
url: typeof node.attrs?.url === "string" ? node.attrs.url : null
|
|
369
|
+
});
|
|
370
|
+
var formatAttachmentSize = (size) => {
|
|
371
|
+
if (size === null || !Number.isFinite(size) || size < 0) return "";
|
|
372
|
+
if (size < 1024) return `${size} B`;
|
|
373
|
+
const units = ["KB", "MB", "GB", "TB"];
|
|
374
|
+
let value = size / 1024;
|
|
375
|
+
let unit = 0;
|
|
376
|
+
while (value >= 1024 && unit < units.length - 1) {
|
|
377
|
+
value /= 1024;
|
|
378
|
+
unit += 1;
|
|
379
|
+
}
|
|
380
|
+
return `${value >= 10 ? value.toFixed(0) : value.toFixed(1)} ${units[unit]}`;
|
|
381
|
+
};
|
|
382
|
+
var attachmentTypeLabel = (snapshot) => {
|
|
383
|
+
if (snapshot.mimeType) return snapshot.mimeType.split("/").at(-1)?.toUpperCase() ?? snapshot.mimeType;
|
|
384
|
+
const extension = snapshot.name.includes(".") ? snapshot.name.split(".").at(-1) : null;
|
|
385
|
+
return extension?.toUpperCase() ?? "FILE";
|
|
386
|
+
};
|
|
387
|
+
var AttachmentIcon = ({ snapshot }) => /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "oe-attachment-icon", children: /* @__PURE__ */ jsx("span", { children: attachmentTypeLabel(snapshot).slice(0, 4) }) });
|
|
388
|
+
var OpenEditorAttachmentNodeView = ({ editor, node, updateAttributes, deleteNode }) => {
|
|
389
|
+
const runtime = use(OpenEditorAttachmentRuntimeContext);
|
|
390
|
+
const durable = attachmentSnapshotFromNode(node);
|
|
391
|
+
const [phase, setPhase] = useState(durable.attachmentId || durable.url ? "ready" : "idle");
|
|
392
|
+
const [progress, setProgress] = useState(0);
|
|
393
|
+
const [error, setError] = useState(null);
|
|
394
|
+
const [input, setInput] = useState(null);
|
|
395
|
+
const operationRef = useRef(0);
|
|
396
|
+
const abortRef = useRef(null);
|
|
397
|
+
const isCurrent = (operation) => operationRef.current === operation;
|
|
398
|
+
const stopCurrent = () => {
|
|
399
|
+
operationRef.current += 1;
|
|
400
|
+
abortRef.current?.abort();
|
|
401
|
+
abortRef.current = null;
|
|
402
|
+
};
|
|
403
|
+
useEffect(() => () => stopCurrent(), []);
|
|
404
|
+
const upload = async (selected, replacing) => {
|
|
405
|
+
if (!runtime?.uploadAttachment) return;
|
|
406
|
+
stopCurrent();
|
|
407
|
+
const operation = operationRef.current;
|
|
408
|
+
const controller = new AbortController();
|
|
409
|
+
abortRef.current = controller;
|
|
410
|
+
setInput(selected);
|
|
411
|
+
setProgress(0);
|
|
412
|
+
setError(null);
|
|
413
|
+
setPhase("uploading");
|
|
414
|
+
try {
|
|
415
|
+
const validation = await runtime.validateAttachment?.(selected);
|
|
416
|
+
if (!isCurrent(operation)) return;
|
|
417
|
+
if (validation && !validation.accepted) throw new Error(validation.message);
|
|
418
|
+
const callback = { signal: controller.signal, onProgress: (value) => {
|
|
419
|
+
if (isCurrent(operation)) setProgress(Math.max(0, Math.min(1, value)));
|
|
420
|
+
} };
|
|
421
|
+
const uploaded = replacing && durable.attachmentId && runtime.replaceAttachment ? await runtime.replaceAttachment(durable.attachmentId, selected, callback) : await runtime.uploadAttachment(selected, callback);
|
|
422
|
+
if (!isCurrent(operation)) return;
|
|
423
|
+
updateAttributes(uploaded);
|
|
424
|
+
setInput(null);
|
|
425
|
+
setProgress(1);
|
|
426
|
+
setPhase("ready");
|
|
427
|
+
} catch (cause) {
|
|
428
|
+
if (!isCurrent(operation) || controller.signal.aborted) return;
|
|
429
|
+
setError(cause instanceof Error ? cause.message : "Upload failed.");
|
|
430
|
+
setPhase("error");
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
const selectAndUpload = async (replacing = false) => {
|
|
434
|
+
if (!runtime?.selectAttachment || !runtime.uploadAttachment) return;
|
|
435
|
+
stopCurrent();
|
|
436
|
+
const operation = operationRef.current;
|
|
437
|
+
const controller = new AbortController();
|
|
438
|
+
abortRef.current = controller;
|
|
439
|
+
setError(null);
|
|
440
|
+
setPhase("selecting");
|
|
441
|
+
try {
|
|
442
|
+
const selected = await runtime.selectAttachment({ signal: controller.signal });
|
|
443
|
+
if (!isCurrent(operation)) return;
|
|
444
|
+
if (!selected) {
|
|
445
|
+
setPhase(durable.attachmentId || durable.url ? "ready" : "idle");
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
await upload(selected, replacing);
|
|
449
|
+
} catch (cause) {
|
|
450
|
+
if (!isCurrent(operation) || controller.signal.aborted) return;
|
|
451
|
+
setError(cause instanceof Error ? cause.message : "Could not select a file.");
|
|
452
|
+
setPhase("error");
|
|
453
|
+
}
|
|
454
|
+
};
|
|
455
|
+
useEffect(() => {
|
|
456
|
+
if (phase === "idle" && editor.isEditable && runtime?.selectAttachment && runtime.uploadAttachment) {
|
|
457
|
+
void selectAndUpload();
|
|
458
|
+
}
|
|
459
|
+
}, []);
|
|
460
|
+
const cancel = () => {
|
|
461
|
+
stopCurrent();
|
|
462
|
+
setPhase(durable.attachmentId || durable.url ? "ready" : "idle");
|
|
463
|
+
};
|
|
464
|
+
const remove = () => {
|
|
465
|
+
stopCurrent();
|
|
466
|
+
deleteNode();
|
|
467
|
+
};
|
|
468
|
+
const name = durable.name || input?.name || "Choose a file";
|
|
469
|
+
const display = durable.name ? durable : { ...durable, name, mimeType: input?.mimeType ?? null, size: input?.size ?? null };
|
|
470
|
+
const open = () => {
|
|
471
|
+
if (runtime?.openAttachment) void runtime.openAttachment(durable);
|
|
472
|
+
else if (durable.url) window.open(durable.url, "_blank", "noopener,noreferrer");
|
|
473
|
+
};
|
|
474
|
+
return /* @__PURE__ */ jsxs(NodeViewWrapper, { className: "oe-attachment", "data-state": phase, children: [
|
|
475
|
+
/* @__PURE__ */ jsx(AttachmentIcon, { snapshot: display }),
|
|
476
|
+
/* @__PURE__ */ jsxs("div", { className: "oe-attachment-body", children: [
|
|
477
|
+
/* @__PURE__ */ jsx("input", { "aria-label": "File name", className: "oe-attachment-name", disabled: !editor.isEditable || phase === "uploading", value: name, onChange: (event) => updateAttributes({ name: event.target.value }), onBlur: () => {
|
|
478
|
+
if (durable.attachmentId && durable.name) void runtime?.renameAttachment?.(durable.attachmentId, durable.name);
|
|
479
|
+
} }),
|
|
480
|
+
/* @__PURE__ */ jsx("div", { className: "oe-attachment-meta", children: [formatAttachmentSize(display.size), attachmentTypeLabel(display)].filter(Boolean).join(" \xB7 ") }),
|
|
481
|
+
phase === "uploading" ? /* @__PURE__ */ jsx("div", { className: "oe-attachment-progress", role: "progressbar", "aria-label": `Uploading ${name}`, "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": Math.round(progress * 100), children: /* @__PURE__ */ jsx("span", { style: { width: `${progress * 100}%` } }) }) : null,
|
|
482
|
+
error ? /* @__PURE__ */ jsx("div", { className: "oe-attachment-error", role: "alert", children: error }) : null
|
|
483
|
+
] }),
|
|
484
|
+
/* @__PURE__ */ jsxs("div", { className: "oe-attachment-actions", contentEditable: false, children: [
|
|
485
|
+
phase === "uploading" || phase === "selecting" ? /* @__PURE__ */ jsx("button", { onClick: cancel, type: "button", children: "Cancel" }) : null,
|
|
486
|
+
phase === "error" && input ? /* @__PURE__ */ jsx("button", { onClick: () => void upload(input, Boolean(durable.attachmentId)), type: "button", children: "Retry" }) : null,
|
|
487
|
+
(durable.attachmentId || durable.url) && phase !== "uploading" ? /* @__PURE__ */ jsx("button", { onClick: open, type: "button", children: "Open" }) : null,
|
|
488
|
+
editor.isEditable && runtime?.selectAttachment && runtime.uploadAttachment && phase !== "uploading" ? /* @__PURE__ */ jsx("button", { onClick: () => void selectAndUpload(Boolean(durable.attachmentId)), type: "button", children: "Replace" }) : null,
|
|
489
|
+
editor.isEditable ? /* @__PURE__ */ jsx("button", { "aria-label": `Remove ${name}`, onClick: remove, type: "button", children: "Remove" }) : null
|
|
490
|
+
] })
|
|
491
|
+
] });
|
|
492
|
+
};
|
|
493
|
+
var Attachment = Node.create({
|
|
494
|
+
name: "attachment",
|
|
495
|
+
group: "block",
|
|
496
|
+
atom: true,
|
|
497
|
+
draggable: true,
|
|
498
|
+
addAttributes: () => ({ attachmentId: { default: null }, name: { default: "" }, mimeType: { default: null }, size: { default: null }, url: { default: null } }),
|
|
499
|
+
parseHTML: () => [{ tag: "a[data-openeditor-attachment]" }, { tag: "div[data-openeditor-attachment]" }],
|
|
500
|
+
renderHTML: ({ node, HTMLAttributes }) => ["a", mergeAttributes(HTMLAttributes, { "data-openeditor-attachment": "", href: node.attrs.url ?? void 0, download: node.attrs.name || void 0 }), node.attrs.name || "Attachment"],
|
|
501
|
+
addNodeView() {
|
|
502
|
+
return ReactNodeViewRenderer(OpenEditorAttachmentNodeView);
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
var OpenEditorAttachmentViewer = ({ node }) => {
|
|
506
|
+
const runtime = use(OpenEditorAttachmentRuntimeContext);
|
|
507
|
+
const cached = attachmentSnapshotFromNode(node);
|
|
508
|
+
const [state, setState] = useState({ phase: cached.attachmentId && runtime?.resolveAttachment ? "resolving" : cached.url ? "ready" : "missing", snapshot: cached });
|
|
509
|
+
useEffect(() => {
|
|
510
|
+
const controller = new AbortController();
|
|
511
|
+
if (cached.attachmentId && runtime?.resolveAttachment) {
|
|
512
|
+
setState({ phase: "resolving", snapshot: cached });
|
|
513
|
+
void runtime.resolveAttachment(cached.attachmentId, { signal: controller.signal }).then((snapshot2) => {
|
|
514
|
+
if (!controller.signal.aborted) setState({ phase: snapshot2 ? "ready" : "missing", snapshot: snapshot2 });
|
|
515
|
+
}).catch(() => {
|
|
516
|
+
if (!controller.signal.aborted) setState({ phase: "missing", snapshot: null });
|
|
517
|
+
});
|
|
518
|
+
} else setState({ phase: cached.url ? "ready" : "missing", snapshot: cached });
|
|
519
|
+
return () => controller.abort();
|
|
520
|
+
}, [cached.attachmentId, cached.url, runtime]);
|
|
521
|
+
const snapshot = state.snapshot ?? cached;
|
|
522
|
+
const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
523
|
+
/* @__PURE__ */ jsx(AttachmentIcon, { snapshot }),
|
|
524
|
+
/* @__PURE__ */ jsxs("span", { className: "oe-attachment-body", children: [
|
|
525
|
+
/* @__PURE__ */ jsx("strong", { className: "oe-attachment-name", children: snapshot.name || "Attachment unavailable" }),
|
|
526
|
+
/* @__PURE__ */ jsx("span", { className: "oe-attachment-meta", children: state.phase === "resolving" ? "Loading\u2026" : state.phase === "missing" ? "Missing or inaccessible" : [formatAttachmentSize(snapshot.size), attachmentTypeLabel(snapshot)].filter(Boolean).join(" \xB7 ") })
|
|
527
|
+
] })
|
|
528
|
+
] });
|
|
529
|
+
if (state.phase === "ready" && runtime?.openAttachment) return /* @__PURE__ */ jsx("button", { className: "oe-attachment oe-attachment-viewer", onClick: () => void runtime.openAttachment?.(snapshot), type: "button", children: content });
|
|
530
|
+
if (state.phase === "ready" && snapshot.url) return /* @__PURE__ */ jsx("a", { className: "oe-attachment oe-attachment-viewer", href: snapshot.url, rel: "noreferrer", target: "_blank", children: content });
|
|
531
|
+
return /* @__PURE__ */ jsx("div", { className: "oe-attachment oe-attachment-viewer", "data-state": state.phase, children: content });
|
|
532
|
+
};
|
|
359
533
|
var pageSnapshotFromNode = (node) => {
|
|
360
534
|
const pageId = typeof node.attrs?.pageId === "string" ? node.attrs.pageId : "";
|
|
361
535
|
if (!pageId) return null;
|
|
362
536
|
return {
|
|
363
537
|
pageId,
|
|
364
538
|
title: node.textContent || getNodeText(node) || "Untitled",
|
|
365
|
-
icon:
|
|
539
|
+
icon: normalizeEmoji(node.attrs?.icon, DEFAULT_PAGE_EMOJI),
|
|
366
540
|
href: typeof node.attrs?.href === "string" ? node.attrs.href : null
|
|
367
541
|
};
|
|
368
542
|
};
|
|
@@ -371,7 +545,10 @@ var OpenEditorPageNodeView = ({ editor, node, updateAttributes }) => {
|
|
|
371
545
|
const [creating, setCreating] = useState(false);
|
|
372
546
|
const [error, setError] = useState(null);
|
|
373
547
|
const snapshot = pageSnapshotFromNode(node);
|
|
374
|
-
const icon =
|
|
548
|
+
const icon = normalizeEmoji(node.attrs.icon, DEFAULT_PAGE_EMOJI);
|
|
549
|
+
const openPage = () => {
|
|
550
|
+
if (snapshot) void runtime?.openPage?.(snapshot);
|
|
551
|
+
};
|
|
375
552
|
const createPage = async () => {
|
|
376
553
|
if (!runtime?.createPage || creating) return;
|
|
377
554
|
setCreating(true);
|
|
@@ -385,55 +562,68 @@ var OpenEditorPageNodeView = ({ editor, node, updateAttributes }) => {
|
|
|
385
562
|
setCreating(false);
|
|
386
563
|
}
|
|
387
564
|
};
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
565
|
+
const updateIcon = async (nextIcon) => {
|
|
566
|
+
updateAttributes({ icon: nextIcon });
|
|
567
|
+
if (!snapshot?.pageId || !runtime?.updatePageIcon) return;
|
|
568
|
+
setError(null);
|
|
569
|
+
try {
|
|
570
|
+
await runtime.updatePageIcon(snapshot.pageId, nextIcon);
|
|
571
|
+
} catch (cause) {
|
|
572
|
+
setError(cause instanceof Error ? cause.message : "Could not update the page icon.");
|
|
573
|
+
}
|
|
574
|
+
};
|
|
575
|
+
return /* @__PURE__ */ jsxs(
|
|
576
|
+
NodeViewWrapper,
|
|
577
|
+
{
|
|
578
|
+
"aria-label": snapshot ? `Open ${snapshot.title}` : void 0,
|
|
579
|
+
className: "oe-page",
|
|
580
|
+
"data-page-id": snapshot?.pageId ?? "",
|
|
581
|
+
onClick: (event) => {
|
|
582
|
+
if (event.target.closest(".oe-emoji-trigger")) return;
|
|
583
|
+
openPage();
|
|
584
|
+
},
|
|
585
|
+
onKeyDown: (event) => {
|
|
586
|
+
if (snapshot && (event.key === "Enter" || event.key === " ")) {
|
|
587
|
+
event.preventDefault();
|
|
588
|
+
openPage();
|
|
408
589
|
}
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
590
|
+
},
|
|
591
|
+
role: snapshot ? "button" : void 0,
|
|
592
|
+
tabIndex: snapshot ? 0 : void 0,
|
|
593
|
+
children: [
|
|
594
|
+
/* @__PURE__ */ jsx("span", { contentEditable: false, children: /* @__PURE__ */ jsx(
|
|
595
|
+
OpenEditorEmojiPicker,
|
|
596
|
+
{
|
|
597
|
+
className: "oe-page-icon-trigger",
|
|
598
|
+
disabled: !editor.isEditable,
|
|
599
|
+
emoji: icon,
|
|
600
|
+
label: "Change page emoji",
|
|
601
|
+
onEmojiSelect: (nextIcon) => void updateIcon(nextIcon)
|
|
602
|
+
}
|
|
603
|
+
) }),
|
|
604
|
+
/* @__PURE__ */ jsx(
|
|
605
|
+
NodeViewContent,
|
|
606
|
+
{
|
|
607
|
+
as: "div",
|
|
608
|
+
className: "oe-page-title",
|
|
609
|
+
contentEditable: false
|
|
610
|
+
}
|
|
611
|
+
),
|
|
612
|
+
!snapshot && runtime?.createPage && editor.isEditable ? /* @__PURE__ */ jsx(
|
|
613
|
+
"button",
|
|
614
|
+
{
|
|
615
|
+
className: "oe-page-action",
|
|
616
|
+
contentEditable: false,
|
|
617
|
+
disabled: creating,
|
|
618
|
+
onClick: () => void createPage(),
|
|
619
|
+
type: "button",
|
|
620
|
+
children: creating ? "Creating\u2026" : "Create page"
|
|
621
|
+
}
|
|
622
|
+
) : null,
|
|
623
|
+
error ? /* @__PURE__ */ jsx("span", { className: "oe-page-error", contentEditable: false, role: "alert", children: error }) : null
|
|
624
|
+
]
|
|
625
|
+
}
|
|
626
|
+
);
|
|
437
627
|
};
|
|
438
628
|
var Page = Node.create({
|
|
439
629
|
name: "page",
|
|
@@ -442,7 +632,7 @@ var Page = Node.create({
|
|
|
442
632
|
defining: true,
|
|
443
633
|
addAttributes: () => ({
|
|
444
634
|
pageId: { default: null },
|
|
445
|
-
icon: { default:
|
|
635
|
+
icon: { default: DEFAULT_PAGE_EMOJI },
|
|
446
636
|
href: { default: null }
|
|
447
637
|
}),
|
|
448
638
|
parseHTML: () => [{ tag: "div[data-openeditor-page]" }, { tag: "a[data-openeditor-page]" }],
|
|
@@ -474,7 +664,7 @@ var OpenEditorPageViewer = ({ node }) => {
|
|
|
474
664
|
const page = resolved ?? cached;
|
|
475
665
|
const title = page?.title ?? (getNodeText(node) || "Untitled");
|
|
476
666
|
const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
477
|
-
/* @__PURE__ */ jsx("span", { className: "oe-page-icon", "aria-hidden": "true", children: page?.icon
|
|
667
|
+
/* @__PURE__ */ jsx("span", { className: "oe-page-icon", "aria-hidden": "true", children: normalizeEmoji(page?.icon, DEFAULT_PAGE_EMOJI) }),
|
|
478
668
|
/* @__PURE__ */ jsx("span", { className: "oe-page-title", children: title }),
|
|
479
669
|
/* @__PURE__ */ jsx("span", { className: "oe-page-arrow", "aria-hidden": "true", children: "\u2192" })
|
|
480
670
|
] });
|
|
@@ -566,7 +756,10 @@ var createEditorExtensions = (placeholder, customExtensions) => [
|
|
|
566
756
|
Underline,
|
|
567
757
|
TaskList,
|
|
568
758
|
BaseUiTaskItem.configure({ nested: true }),
|
|
569
|
-
Table.configure({
|
|
759
|
+
Table.configure({
|
|
760
|
+
resizable: true,
|
|
761
|
+
HTMLAttributes: { "data-openeditor-table": "" }
|
|
762
|
+
}),
|
|
570
763
|
TableRow,
|
|
571
764
|
TableHeader,
|
|
572
765
|
TableCell,
|
|
@@ -578,6 +771,7 @@ var createEditorExtensions = (placeholder, customExtensions) => [
|
|
|
578
771
|
ToggleListItem,
|
|
579
772
|
Callout,
|
|
580
773
|
Page,
|
|
774
|
+
Attachment,
|
|
581
775
|
MermaidDiagram,
|
|
582
776
|
...customExtensions.flatMap((extension) => extension.tiptapExtensions)
|
|
583
777
|
];
|
|
@@ -673,6 +867,7 @@ var useOpenEditorController = ({
|
|
|
673
867
|
onChange,
|
|
674
868
|
onFilePasteDrop,
|
|
675
869
|
pageRuntime,
|
|
870
|
+
attachmentRuntime,
|
|
676
871
|
slashMenuItems = [],
|
|
677
872
|
extensions = EMPTY_EXTENSIONS
|
|
678
873
|
} = {}) => {
|
|
@@ -768,19 +963,17 @@ var useOpenEditorController = ({
|
|
|
768
963
|
}, [editor]);
|
|
769
964
|
const insertBlock = (blockName = selectedBlock, range) => {
|
|
770
965
|
if (!editor) {
|
|
771
|
-
return;
|
|
772
|
-
}
|
|
773
|
-
const preset = openEditorInsertPresets.find((item) => item.key === blockName);
|
|
774
|
-
const spec = registry.get(blockName);
|
|
775
|
-
if (!spec) {
|
|
776
|
-
return;
|
|
966
|
+
return false;
|
|
777
967
|
}
|
|
968
|
+
const block = resolveOpenEditorInsertBlock(blockName, registry);
|
|
969
|
+
if (!block) return false;
|
|
778
970
|
const chain = () => {
|
|
779
971
|
const commandChain = editor.chain().focus();
|
|
780
972
|
return range ? commandChain.deleteRange(range) : commandChain;
|
|
781
973
|
};
|
|
782
|
-
chain().insertContent(
|
|
783
|
-
setSlashState(null);
|
|
974
|
+
const inserted = chain().insertContent(block).run();
|
|
975
|
+
if (inserted) setSlashState(null);
|
|
976
|
+
return inserted;
|
|
784
977
|
};
|
|
785
978
|
const setDocumentContent = (content) => {
|
|
786
979
|
if (!editor) {
|
|
@@ -907,6 +1100,7 @@ var useOpenEditorController = ({
|
|
|
907
1100
|
slashMenuItems,
|
|
908
1101
|
extensions,
|
|
909
1102
|
pageRuntime,
|
|
1103
|
+
attachmentRuntime,
|
|
910
1104
|
slashState,
|
|
911
1105
|
selectionBubbleState
|
|
912
1106
|
};
|
|
@@ -920,24 +1114,28 @@ var getDefaultSlashMenuItems = (controller) => {
|
|
|
920
1114
|
label: preset.label,
|
|
921
1115
|
group: preset.group,
|
|
922
1116
|
keywords: [preset.key],
|
|
923
|
-
|
|
1117
|
+
execute: ({ controller: current, range }) => current.insertBlock(preset.key, range)
|
|
924
1118
|
})),
|
|
925
1119
|
{
|
|
926
1120
|
key: "moveBlockUp",
|
|
927
1121
|
label: "Move Block Up",
|
|
928
1122
|
group: "block",
|
|
929
|
-
|
|
930
|
-
internalController.editor
|
|
1123
|
+
execute: ({ range }) => {
|
|
1124
|
+
if (!internalController.editor) return false;
|
|
1125
|
+
internalController.editor.chain().focus().deleteRange(range).run();
|
|
931
1126
|
controller.moveSelectedBlock(-1);
|
|
1127
|
+
return true;
|
|
932
1128
|
}
|
|
933
1129
|
},
|
|
934
1130
|
{
|
|
935
1131
|
key: "moveBlockDown",
|
|
936
1132
|
label: "Move Block Down",
|
|
937
1133
|
group: "block",
|
|
938
|
-
|
|
939
|
-
internalController.editor
|
|
1134
|
+
execute: ({ range }) => {
|
|
1135
|
+
if (!internalController.editor) return false;
|
|
1136
|
+
internalController.editor.chain().focus().deleteRange(range).run();
|
|
940
1137
|
controller.moveSelectedBlock(1);
|
|
1138
|
+
return true;
|
|
941
1139
|
}
|
|
942
1140
|
},
|
|
943
1141
|
...controller.extensions.filter((extension) => extension.slashMenu !== false).map((extension) => {
|
|
@@ -947,7 +1145,7 @@ var getDefaultSlashMenuItems = (controller) => {
|
|
|
947
1145
|
label: menu?.label ?? extension.block.label,
|
|
948
1146
|
group: menu?.group ?? extension.block.group,
|
|
949
1147
|
keywords: menu?.keywords ?? [extension.block.name],
|
|
950
|
-
|
|
1148
|
+
execute: ({ controller: current, range }) => current.insertBlock(extension.block.name, range)
|
|
951
1149
|
};
|
|
952
1150
|
}),
|
|
953
1151
|
...controller.slashMenuItems
|
|
@@ -1019,17 +1217,22 @@ var renderViewerNode = (node, key, renderers, registry = defaultBlockRegistry) =
|
|
|
1019
1217
|
case "columns":
|
|
1020
1218
|
return /* @__PURE__ */ jsx("section", { children }, key);
|
|
1021
1219
|
case "table":
|
|
1022
|
-
return /* @__PURE__ */ jsx("table", { children: /* @__PURE__ */ jsx("tbody", { children }) }, key);
|
|
1220
|
+
return /* @__PURE__ */ jsx("table", { "data-openeditor-table": "", children: /* @__PURE__ */ jsx("tbody", { children }) }, key);
|
|
1023
1221
|
case "toggleList":
|
|
1024
1222
|
return /* @__PURE__ */ jsx("ul", { "data-openeditor-toggle-list": true, children }, key);
|
|
1025
1223
|
case "callout":
|
|
1026
|
-
return /* @__PURE__ */
|
|
1224
|
+
return /* @__PURE__ */ jsxs("aside", { className: "oe-callout", children: [
|
|
1225
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "oe-callout-emoji", children: normalizeEmoji(node.attrs?.emoji, DEFAULT_CALLOUT_EMOJI) }),
|
|
1226
|
+
/* @__PURE__ */ jsx("div", { className: "oe-callout-content", children })
|
|
1227
|
+
] }, key);
|
|
1027
1228
|
case "diagram": {
|
|
1028
1229
|
const code = typeof node.attrs?.code === "string" ? node.attrs.code : "";
|
|
1029
1230
|
return /* @__PURE__ */ jsx("figure", { className: "oe-diagram", children: /* @__PURE__ */ jsx(MermaidPreview, { code }) }, key);
|
|
1030
1231
|
}
|
|
1031
1232
|
case "page":
|
|
1032
1233
|
return /* @__PURE__ */ jsx(OpenEditorPageViewer, { node }, key);
|
|
1234
|
+
case "attachment":
|
|
1235
|
+
return /* @__PURE__ */ jsx(OpenEditorAttachmentViewer, { node }, key);
|
|
1033
1236
|
default:
|
|
1034
1237
|
if (node.type === "column") {
|
|
1035
1238
|
return /* @__PURE__ */ jsx("div", { children }, key);
|
|
@@ -1067,26 +1270,27 @@ var OpenEditorContent = ({
|
|
|
1067
1270
|
className = "oe-canvas"
|
|
1068
1271
|
}) => {
|
|
1069
1272
|
const internalController = controller;
|
|
1070
|
-
return /* @__PURE__ */ jsx(OpenEditorPageRuntimeContext.Provider, { value: internalController.pageRuntime, children: /* @__PURE__ */ jsx(EditorContent, { editor: internalController.editor, className }) });
|
|
1273
|
+
return /* @__PURE__ */ jsx(OpenEditorAttachmentRuntimeContext.Provider, { value: internalController.attachmentRuntime, children: /* @__PURE__ */ jsx(OpenEditorPageRuntimeContext.Provider, { value: internalController.pageRuntime, children: /* @__PURE__ */ jsx(EditorContent, { editor: internalController.editor, className }) }) });
|
|
1071
1274
|
};
|
|
1072
1275
|
var OpenEditorViewer = ({
|
|
1073
1276
|
document,
|
|
1074
1277
|
className = "oe-viewer",
|
|
1075
1278
|
renderers,
|
|
1076
1279
|
extensions = EMPTY_EXTENSIONS,
|
|
1077
|
-
pageRuntime
|
|
1280
|
+
pageRuntime,
|
|
1281
|
+
attachmentRuntime
|
|
1078
1282
|
}) => {
|
|
1079
1283
|
const registry = createReactBlockRegistry(extensions);
|
|
1080
1284
|
const extensionRenderers = Object.fromEntries(
|
|
1081
1285
|
extensions.map((extension) => [extension.block.name, extension.viewer])
|
|
1082
1286
|
);
|
|
1083
1287
|
const mergedRenderers = { ...extensionRenderers, ...renderers };
|
|
1084
|
-
return /* @__PURE__ */ jsx(OpenEditorPageRuntimeContext.Provider, { value: pageRuntime, children: /* @__PURE__ */ jsx("div", { className, children: normalizeDocument(document).content.map(
|
|
1288
|
+
return /* @__PURE__ */ jsx(OpenEditorAttachmentRuntimeContext.Provider, { value: attachmentRuntime, children: /* @__PURE__ */ jsx(OpenEditorPageRuntimeContext.Provider, { value: pageRuntime, children: /* @__PURE__ */ jsx("div", { className, children: normalizeDocument(document).content.map(
|
|
1085
1289
|
(node, index) => renderViewerNode(node, `viewer-${index}`, mergedRenderers, registry)
|
|
1086
|
-
) }) });
|
|
1290
|
+
) }) }) });
|
|
1087
1291
|
};
|
|
1088
1292
|
var useOpenEditor = useOpenEditorController;
|
|
1089
1293
|
|
|
1090
|
-
export { OpenEditorContent, OpenEditorViewer, defineOpenEditorReactExtension, defineOpenEditorReactNode, getDefaultSlashMenuItems, useOpenEditor, useOpenEditorController };
|
|
1294
|
+
export { OpenEditorContent, OpenEditorViewer, defineOpenEditorReactExtension, defineOpenEditorReactNode, formatAttachmentSize, getDefaultSlashMenuItems, useOpenEditor, useOpenEditorController };
|
|
1091
1295
|
//# sourceMappingURL=index.js.map
|
|
1092
1296
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx"],"names":["page","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["import {\n createBlockRegistry,\n deleteTopLevelBlock,\n duplicateTopLevelBlock,\n findBlockSpecForNode,\n fromProseMirrorDocument,\n moveTopLevelBlock,\n normalizeDocument,\n toProseMirrorDocument,\n type ProseMirrorMark,\n type ProseMirrorNode,\n type OpenEditorDocument,\n type BlockRegistry,\n type BlockSpec,\n} from \"@openeditor/core\";\nimport { Checkbox } from \"@base-ui/react/checkbox\";\nimport { renderMermaidSVG } from \"beautiful-mermaid\";\nimport { toExportBundle, type OpenEditorExporters } from \"@openeditor/exporters\";\nimport {\n defaultBlockRegistry,\n createOpenEditorInsertBlock,\n openEditorInsertPresets,\n seedDocument,\n} from \"@openeditor/extensions\";\nimport { InputRule, mergeAttributes, Node, type AnyExtension, type Editor, type NodeConfig } from \"@tiptap/core\";\nimport HorizontalRule from \"@tiptap/extension-horizontal-rule\";\nimport Image from \"@tiptap/extension-image\";\nimport Link from \"@tiptap/extension-link\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport { Table } from \"@tiptap/extension-table\";\nimport TableCell from \"@tiptap/extension-table-cell\";\nimport TableHeader from \"@tiptap/extension-table-header\";\nimport TableRow from \"@tiptap/extension-table-row\";\nimport TaskItem from \"@tiptap/extension-task-item\";\nimport TaskList from \"@tiptap/extension-task-list\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport Underline from \"@tiptap/extension-underline\";\nimport { NodeSelection, Plugin } from \"@tiptap/pm/state\";\nimport { ReplaceStep } from \"@tiptap/pm/transform\";\nimport {\n EditorContent,\n NodeViewContent,\n NodeViewWrapper,\n ReactNodeViewRenderer,\n useEditor,\n type ReactNodeViewProps,\n} from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport { Fragment, createContext, use, useEffect, useMemo, useRef, useState, type ComponentType, type ReactNode } from \"react\";\n\nexport type OpenEditorPageSnapshot = {\n pageId: string;\n title: string;\n icon?: string | null;\n href?: string | null;\n};\n\nexport type OpenEditorPageRuntime = {\n createPage?: (input: { title: string; icon?: string | null }) => Promise<OpenEditorPageSnapshot>;\n resolvePage?: (pageId: string) => Promise<OpenEditorPageSnapshot | null>;\n renamePage?: (pageId: string, title: string) => Promise<void> | void;\n openPage?: (page: OpenEditorPageSnapshot) => Promise<void> | void;\n};\n\nconst OpenEditorPageRuntimeContext = createContext<OpenEditorPageRuntime | undefined>(undefined);\n\nexport type OpenEditorReactProps = {\n initialDocument?: OpenEditorDocument;\n editable?: boolean;\n placeholder?: string;\n onChange?: (document: OpenEditorDocument) => void;\n onFilePasteDrop?: (file: File) => boolean;\n pageRuntime?: OpenEditorPageRuntime;\n slashMenuItems?: readonly OpenEditorSlashMenuItem[];\n /** Consumer-owned blocks. Extension names and node types must be unique. */\n extensions?: readonly OpenEditorReactExtension[];\n};\n\nexport type OpenEditorReactConfig = OpenEditorReactProps;\n\nexport type OpenEditorController = {\n editor: Editor | null;\n document: OpenEditorDocument;\n exports: ReturnType<typeof toExportBundle>;\n editable: boolean;\n placeholder: string;\n selectedBlock: string;\n setSelectedBlock: (blockName: string) => void;\n getContent: () => OpenEditorDocument;\n setContent: (document: OpenEditorDocument) => void;\n setParagraph: () => void;\n toggleHeading: (level: 1 | 2 | 3 | 4 | 5 | 6) => void;\n toggleBold: () => void;\n toggleItalic: () => void;\n toggleUnderline: () => void;\n toggleStrike: () => void;\n toggleInlineCode: () => void;\n toggleBulletList: () => void;\n toggleOrderedList: () => void;\n toggleTaskList: () => void;\n toggleBlockquote: () => void;\n toggleCodeBlock: () => void;\n undo: () => void;\n redo: () => void;\n insertBlock: (blockName?: string, range?: InsertRange) => void;\n setLink: (url?: string | null) => void;\n getActiveLink: () => string | undefined;\n moveSelectedBlock: (direction: -1 | 1) => void;\n duplicateSelectedBlock: () => void;\n deleteSelectedBlock: () => void;\n slashMenuItems: readonly OpenEditorSlashMenuItem[];\n extensions: readonly OpenEditorReactExtension[];\n pageRuntime?: OpenEditorPageRuntime;\n slashState: SlashState | null;\n selectionBubbleState: SelectionBubbleState | null;\n};\n\nexport type OpenEditorContentProps = {\n controller: OpenEditorController;\n className?: string;\n};\n\ntype InternalOpenEditorController = OpenEditorController & {\n editor: Editor | null;\n};\n\ntype RenderAttributes = Record<string, string | number | boolean | null | undefined>;\nexport type InsertRange = { from: number; to: number };\nexport type OpenEditorOverlayRect = {\n left: number;\n right: number;\n top: number;\n bottom: number;\n width: number;\n height: number;\n};\nexport type SlashState = {\n query: string;\n from: number;\n to: number;\n left: number;\n top: number;\n anchorRect?: OpenEditorOverlayRect;\n};\nexport type SelectionBubbleState = {\n left: number;\n top: number;\n anchorRect?: OpenEditorOverlayRect;\n};\nexport type OpenEditorSlashMenuItem = {\n key: string;\n label: string;\n group: string;\n keywords?: readonly string[];\n run: (context: { controller: OpenEditorController; range: InsertRange }) => void;\n};\n\nexport type OpenEditorViewerRenderer = (context: {\n node: ProseMirrorNode;\n children: ReactNode;\n}) => ReactNode;\n\nexport type OpenEditorExtensionMenu = {\n label?: string;\n group?: string;\n keywords?: readonly string[];\n};\n\n/**\n * Complete web integration for a consumer-owned block. The portable `block`\n * contract is shared by commands and platform support; the other fields are\n * adapters for the React/Tiptap runtime and non-interactive output.\n */\nexport type OpenEditorReactExtension = {\n block: BlockSpec;\n tiptapExtensions: readonly AnyExtension[];\n slashMenu?: false | OpenEditorExtensionMenu;\n viewer: OpenEditorViewerRenderer;\n exporters?: OpenEditorExporters;\n};\n\nexport const defineOpenEditorReactExtension = <T extends OpenEditorReactExtension>(extension: T): T => extension;\n\nexport type OpenEditorReactNodeExtension = Omit<OpenEditorReactExtension, \"tiptapExtensions\"> & {\n node: Omit<Partial<NodeConfig>, \"name\" | \"addNodeView\">;\n component: ComponentType<ReactNodeViewProps>;\n};\n\n/** Creates the common case: one custom ProseMirror node rendered by one React node view. */\nexport const defineOpenEditorReactNode = ({\n block,\n node,\n component,\n ...extension\n}: OpenEditorReactNodeExtension): OpenEditorReactExtension => ({\n ...extension,\n block,\n tiptapExtensions: [\n Node.create({\n ...node,\n name: block.nodeType ?? block.name,\n addNodeView() {\n return ReactNodeViewRenderer(component);\n },\n }),\n ],\n});\n\nexport type OpenEditorViewerProps = {\n document: OpenEditorDocument;\n className?: string;\n renderers?: Partial<Record<string, OpenEditorViewerRenderer>>;\n extensions?: readonly OpenEditorReactExtension[];\n pageRuntime?: OpenEditorPageRuntime;\n};\n\nconst EMPTY_EXTENSIONS: readonly OpenEditorReactExtension[] = [];\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n columns: {\n insertColumns: (count?: 2 | 3 | 4) => ReturnType;\n };\n }\n}\n\nconst COMMON_HTML_ATTRIBUTES = [\"id\", \"class\", \"title\", \"lang\", \"dir\", \"data-id\", \"style\"] as const;\nconst LAYOUT_ATTRIBUTES = [\"align\", \"width\", \"height\"] as const;\nconst URL_ATTRIBUTES = new Set([\"href\", \"src\"]);\nconst FORBIDDEN_PASTE_TAGS = new Set([\"script\", \"iframe\", \"object\", \"embed\", \"meta\", \"base\"]);\n\nconst createStandardAttributes = (attributeNames: readonly string[]) =>\n Object.fromEntries(\n attributeNames.map((attribute) => [\n attribute,\n {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute(attribute),\n renderHTML: (attributes: Record<string, unknown>) =>\n attributes[attribute] ? { [attribute]: attributes[attribute] } : {},\n },\n ]),\n );\n\nconst isSafeUrl = (value: string, allowDataImage: boolean) => {\n const normalized = value.trim().toLowerCase();\n\n if (normalized.startsWith(\"javascript:\") || normalized.startsWith(\"vbscript:\")) {\n return false;\n }\n\n if (normalized.startsWith(\"data:\")) {\n return allowDataImage && normalized.startsWith(\"data:image/\");\n }\n\n return true;\n};\n\nconst sanitizePastedHtml = (html: string) => {\n const parser = new DOMParser();\n const parsed = parser.parseFromString(html, \"text/html\");\n const isFromOpenEditor = /data-openeditor-|oe-|node-/.test(html);\n const preservedAttributes: Record<string, string[]> = {\n a: [\"href\", \"target\", \"rel\"],\n img: [\"src\", \"alt\", \"width\", \"height\"],\n td: [\"colspan\", \"rowspan\"],\n th: [\"colspan\", \"rowspan\", \"scope\"],\n table: [\"border\", \"cellpadding\", \"cellspacing\"],\n \"*\": [\"id\"],\n };\n\n for (const tag of FORBIDDEN_PASTE_TAGS) {\n for (const element of Array.from(parsed.body.getElementsByTagName(tag))) {\n element.remove();\n }\n }\n\n for (const element of Array.from(parsed.body.querySelectorAll<HTMLElement>(\"[href], [src]\"))) {\n const allowDataImage = element.tagName.toLowerCase() === \"img\";\n\n for (const attribute of URL_ATTRIBUTES) {\n const value = element.getAttribute(attribute);\n if (value !== null && !isSafeUrl(value, allowDataImage)) {\n element.removeAttribute(attribute);\n }\n }\n }\n\n if (isFromOpenEditor) {\n return parsed.body.innerHTML;\n }\n\n const sanitizeElement = (node: globalThis.Node) => {\n if (node.nodeType === window.Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n const tagName = element.tagName.toLowerCase();\n const allowed = new Set([...(preservedAttributes[tagName] ?? []), ...(preservedAttributes[\"*\"] ?? [])]);\n\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.name.startsWith(\"data-\") || !allowed.has(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n }\n }\n\n for (const child of Array.from(node.childNodes)) {\n sanitizeElement(child);\n }\n };\n\n sanitizeElement(parsed.body);\n return parsed.body.innerHTML;\n};\n\nconst Columns = Node.create({\n name: \"columns\",\n group: \"block\",\n content: \"column+\",\n isolating: true,\n defining: true,\n addAttributes() {\n return createStandardAttributes([...COMMON_HTML_ATTRIBUTES, ...LAYOUT_ATTRIBUTES, \"cellspacing\"]);\n },\n parseHTML() {\n return [{ tag: \"section[data-openeditor-columns]\" }];\n },\n renderHTML({ node, HTMLAttributes }) {\n const count = node.childCount;\n return [\n \"section\",\n mergeAttributes(\n {\n class: \"oe-columns\",\n \"data-openeditor-columns\": count,\n style: `--oe-column-count:${Math.min(Math.max(count, 2), 4)};${HTMLAttributes.style ?? \"\"}`,\n },\n HTMLAttributes,\n ),\n 0,\n ];\n },\n addCommands() {\n return {\n insertColumns:\n (count: 2 | 3 | 4 = 2) =>\n ({ commands }) =>\n commands.insertContent({\n type: \"columns\",\n content: Array.from({ length: count }, (_, index) => ({\n type: \"column\",\n content: [\n {\n type: \"paragraph\",\n content: [{ type: \"text\", text: `Column ${index + 1}` }],\n },\n ],\n })),\n }),\n };\n },\n addKeyboardShortcuts() {\n return {\n Backspace: ({ editor }) => {\n const { selection } = editor.state;\n\n if (!(selection instanceof NodeSelection) || selection.node.type.name !== \"columns\") {\n return false;\n }\n\n const allColumnsEmpty = Array.from({ length: selection.node.childCount }, (_, index) =>\n selection.node.child(index),\n ).every(\n (column) =>\n column.childCount === 1 &&\n column.firstChild?.type.name === \"paragraph\" &&\n column.firstChild.childCount === 0,\n );\n\n if (!allColumnsEmpty) {\n return false;\n }\n\n editor.view.dispatch(\n editor.state.tr.replaceWith(selection.from, selection.to, editor.state.schema.nodes.paragraph.create()),\n );\n return true;\n },\n };\n },\n});\n\nconst Column = Node.create({\n name: \"column\",\n content: \"block+\",\n isolating: true,\n defining: true,\n addAttributes() {\n return createStandardAttributes([...COMMON_HTML_ATTRIBUTES, ...LAYOUT_ATTRIBUTES]);\n },\n parseHTML() {\n return [{ tag: \"div[data-openeditor-column]\" }];\n },\n renderHTML({ HTMLAttributes }: { HTMLAttributes: RenderAttributes }) {\n return [\"div\", mergeAttributes({ \"data-openeditor-column\": \"\", class: \"oe-column\" }, HTMLAttributes), 0];\n },\n});\n\nconst Divider = HorizontalRule.extend({\n addAttributes() {\n return {\n ...createStandardAttributes([\"class\", \"style\"]),\n class: {\n default: \"oe-divider\",\n },\n };\n },\n addInputRules() {\n return [\n new InputRule({\n find: /^(?:---|___|\\*\\*\\*)$/,\n handler: ({ state, range }) => {\n const { tr } = state;\n tr.insert(range.from - 1, this.type.create()).delete(tr.mapping.map(range.from), tr.mapping.map(range.to));\n },\n }),\n ];\n },\n addProseMirrorPlugins() {\n return [\n new Plugin({\n filterTransaction(transaction, state) {\n const { selection } = state;\n const isDividerSelection = selection instanceof NodeSelection && selection.node.type.name === \"horizontalRule\";\n const isTypingOverDivider = transaction.steps.some(\n (step) => step instanceof ReplaceStep && step.slice.content.size > 0,\n );\n\n return !(isDividerSelection && transaction.docChanged && isTypingOverDivider);\n },\n }),\n ];\n },\n});\n\nconst OpenEditorTaskCheckbox = ({\n checked,\n label,\n readOnly = false,\n tabIndex,\n onCheckedChange,\n}: {\n checked: boolean;\n label: string;\n readOnly?: boolean;\n tabIndex?: number;\n onCheckedChange?: (checked: boolean) => void;\n}) => (\n <Checkbox.Root\n aria-label={label}\n checked={checked}\n className=\"oe-task-checkbox\"\n onCheckedChange={onCheckedChange}\n onMouseDown={(event) => event.preventDefault()}\n readOnly={readOnly}\n tabIndex={tabIndex}\n >\n <Checkbox.Indicator className=\"oe-task-checkbox-indicator\" keepMounted />\n </Checkbox.Root>\n);\n\nconst OpenEditorTaskItemNodeView = ({ editor, node, updateAttributes }: ReactNodeViewProps) => {\n const checked = Boolean(node.attrs.checked);\n\n return (\n <NodeViewWrapper as=\"li\" data-checked={checked ? \"true\" : \"false\"}>\n <span className=\"oe-task-item-checkbox\" contentEditable={false}>\n <OpenEditorTaskCheckbox\n checked={checked}\n label={`Task item checkbox for ${node.textContent || \"empty task item\"}`}\n onCheckedChange={(nextChecked) => {\n if (editor.isEditable) {\n updateAttributes({ checked: nextChecked });\n }\n }}\n readOnly={!editor.isEditable}\n />\n </span>\n <NodeViewContent as=\"div\" />\n </NodeViewWrapper>\n );\n};\n\nconst BaseUiTaskItem = TaskItem.extend({\n addNodeView() {\n return ReactNodeViewRenderer(OpenEditorTaskItemNodeView);\n },\n});\n\nconst ToggleList = Node.create({\n name: \"toggleList\",\n group: \"block\",\n content: \"toggleListItem+\",\n parseHTML: () => [{ tag: \"ul[data-openeditor-toggle-list]\" }],\n renderHTML: ({ HTMLAttributes }) => [\n \"ul\",\n mergeAttributes(HTMLAttributes, { \"data-openeditor-toggle-list\": \"\" }),\n 0,\n ],\n});\n\nconst OpenEditorToggleListItemNodeView = ({ editor, node, updateAttributes }: ReactNodeViewProps) => {\n const open = Boolean(node.attrs.open);\n\n return (\n <NodeViewWrapper as=\"li\" className=\"oe-toggle-list-item\" data-open={open ? \"true\" : \"false\"}>\n <button\n aria-expanded={open}\n aria-label={open ? \"Collapse toggle item\" : \"Expand toggle item\"}\n className=\"oe-toggle-list-trigger\"\n contentEditable={false}\n disabled={!editor.isEditable}\n onClick={() => updateAttributes({ open: !open })}\n type=\"button\"\n >\n <span aria-hidden=\"true\" className=\"oe-toggle-list-chevron\">›</span>\n </button>\n <NodeViewContent as=\"div\" className=\"oe-toggle-list-content\" />\n </NodeViewWrapper>\n );\n};\n\nconst ToggleListItem = Node.create({\n name: \"toggleListItem\",\n content: \"paragraph block*\",\n defining: true,\n addAttributes: () => ({ open: { default: true } }),\n parseHTML: () => [{ tag: \"li[data-openeditor-toggle-list-item]\" }],\n renderHTML: ({ HTMLAttributes }) => [\n \"li\",\n mergeAttributes(HTMLAttributes, { \"data-openeditor-toggle-list-item\": \"\" }),\n 0,\n ],\n addNodeView() {\n return ReactNodeViewRenderer(OpenEditorToggleListItemNodeView);\n },\n});\n\nconst CALLOUT_TONES = [\"info\", \"success\", \"warning\", \"danger\"] as const;\n\nconst normalizeCalloutTone = (value: unknown) =>\n CALLOUT_TONES.includes(value as (typeof CALLOUT_TONES)[number]) ? String(value) : \"info\";\n\nconst OpenEditorCalloutNodeView = ({ editor, node, updateAttributes }: ReactNodeViewProps) => (\n <NodeViewWrapper as=\"aside\" className=\"oe-callout\" data-tone={normalizeCalloutTone(node.attrs.tone)}>\n <select\n aria-label=\"Callout tone\"\n className=\"oe-callout-tone\"\n contentEditable={false}\n disabled={!editor.isEditable}\n onChange={(event) => updateAttributes({ tone: event.target.value })}\n value={normalizeCalloutTone(node.attrs.tone)}\n >\n {CALLOUT_TONES.map((tone) => <option key={tone} value={tone}>{tone}</option>)}\n </select>\n <NodeViewContent as=\"div\" className=\"oe-callout-content\" />\n </NodeViewWrapper>\n);\n\nconst Callout = Node.create({\n name: \"callout\",\n group: \"block\",\n content: \"block+\",\n defining: true,\n addAttributes: () => ({ tone: { default: \"info\" } }),\n parseHTML: () => [{ tag: \"aside[data-openeditor-callout]\" }],\n renderHTML: ({ HTMLAttributes }) => [\n \"aside\",\n mergeAttributes(HTMLAttributes, { \"data-openeditor-callout\": \"\" }),\n 0,\n ],\n addNodeView() {\n return ReactNodeViewRenderer(OpenEditorCalloutNodeView);\n },\n});\n\nconst pageSnapshotFromNode = (node: {\n attrs?: Record<string, unknown>;\n content?: unknown;\n textContent?: string;\n}): OpenEditorPageSnapshot | null => {\n const pageId = typeof node.attrs?.pageId === \"string\" ? node.attrs.pageId : \"\";\n if (!pageId) return null;\n return {\n pageId,\n title: node.textContent || getNodeText(node as { content?: unknown[] }) || \"Untitled\",\n icon: typeof node.attrs?.icon === \"string\" ? node.attrs.icon : \"📄\",\n href: typeof node.attrs?.href === \"string\" ? node.attrs.href : null,\n };\n};\n\nconst OpenEditorPageNodeView = ({ editor, node, updateAttributes }: ReactNodeViewProps) => {\n const runtime = use(OpenEditorPageRuntimeContext);\n const [creating, setCreating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const snapshot = pageSnapshotFromNode(node);\n const icon = typeof node.attrs.icon === \"string\" ? node.attrs.icon : \"📄\";\n\n const createPage = async () => {\n if (!runtime?.createPage || creating) return;\n setCreating(true);\n setError(null);\n try {\n const created = await runtime.createPage({ title: node.textContent || \"Untitled\", icon });\n updateAttributes({ pageId: created.pageId, icon: created.icon ?? icon, href: created.href ?? null });\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"Could not create the page.\");\n } finally {\n setCreating(false);\n }\n };\n\n return (\n <NodeViewWrapper className=\"oe-page\" data-page-id={snapshot?.pageId ?? \"\"}>\n <input\n aria-label=\"Page icon\"\n className=\"oe-page-icon-input\"\n contentEditable={false}\n disabled={!editor.isEditable}\n maxLength={8}\n onChange={(event) => updateAttributes({ icon: event.target.value || \"📄\" })}\n value={icon}\n />\n <NodeViewContent\n as=\"div\"\n className=\"oe-page-title\"\n onBlur={() => {\n if (snapshot?.pageId) void runtime?.renamePage?.(snapshot.pageId, node.textContent || \"Untitled\");\n }}\n />\n {snapshot ? (\n <button\n aria-label={`Open ${snapshot.title}`}\n className=\"oe-page-action\"\n contentEditable={false}\n onClick={() => void runtime?.openPage?.(snapshot)}\n type=\"button\"\n >\n Open <span aria-hidden=\"true\">→</span>\n </button>\n ) : runtime?.createPage && editor.isEditable ? (\n <button\n className=\"oe-page-action\"\n contentEditable={false}\n disabled={creating}\n onClick={() => void createPage()}\n type=\"button\"\n >\n {creating ? \"Creating…\" : \"Create page\"}\n </button>\n ) : null}\n {error ? <span className=\"oe-page-error\" contentEditable={false} role=\"alert\">{error}</span> : null}\n </NodeViewWrapper>\n );\n};\n\nconst Page = Node.create({\n name: \"page\",\n group: \"block\",\n content: \"inline*\",\n defining: true,\n addAttributes: () => ({\n pageId: { default: null },\n icon: { default: \"📄\" },\n href: { default: null },\n }),\n parseHTML: () => [{ tag: \"div[data-openeditor-page]\" }, { tag: \"a[data-openeditor-page]\" }],\n renderHTML: ({ HTMLAttributes }) => [\n \"div\",\n mergeAttributes(HTMLAttributes, { \"data-openeditor-page\": \"\" }),\n 0,\n ],\n addNodeView() {\n return ReactNodeViewRenderer(OpenEditorPageNodeView);\n },\n});\n\nconst OpenEditorPageViewer = ({ node }: { node: ProseMirrorNode }) => {\n const runtime = use(OpenEditorPageRuntimeContext);\n const cached = pageSnapshotFromNode(node);\n const [resolved, setResolved] = useState<OpenEditorPageSnapshot | null>(null);\n\n useEffect(() => {\n let active = true;\n setResolved(null);\n if (cached?.pageId && runtime?.resolvePage) {\n void runtime.resolvePage(cached.pageId).then((page) => {\n if (active && page) setResolved(page);\n });\n }\n return () => { active = false; };\n }, [cached?.pageId, runtime]);\n\n const page = resolved ?? cached;\n const title = page?.title ?? (getNodeText(node) || \"Untitled\");\n const content = <><span className=\"oe-page-icon\" aria-hidden=\"true\">{page?.icon ?? \"📄\"}</span><span className=\"oe-page-title\">{title}</span><span className=\"oe-page-arrow\" aria-hidden=\"true\">→</span></>;\n if (page && runtime?.openPage) {\n return <button className=\"oe-page oe-page-viewer\" onClick={() => void runtime.openPage?.(page)} type=\"button\">{content}</button>;\n }\n if (page?.href) {\n return <a className=\"oe-page oe-page-viewer\" href={page.href}>{content}</a>;\n }\n return <div className=\"oe-page oe-page-viewer\">{content}</div>;\n};\n\nconst MermaidPreview = ({ code }: { code: string }) => {\n const rendered = useMemo(() => {\n try {\n return {\n error: null,\n svg: renderMermaidSVG(code, {\n bg: \"var(--oe-surface, #ffffff)\",\n fg: \"var(--oe-text, #171717)\",\n accent: \"var(--oe-accent-strong, #171717)\",\n border: \"var(--oe-border-strong, #d4d4d4)\",\n muted: \"var(--oe-muted, #737373)\",\n surface: \"var(--oe-surface-muted, #f5f5f5)\",\n transparent: true,\n }),\n };\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : String(error),\n svg: null,\n };\n }\n }, [code]);\n\n return rendered.error ? (\n <pre className=\"oe-diagram-error\" role=\"alert\">{rendered.error}</pre>\n ) : (\n <div className=\"oe-diagram-preview\" dangerouslySetInnerHTML={{ __html: rendered.svg ?? \"\" }} />\n );\n};\n\nconst ToggleListViewerItem = ({ children, initiallyOpen }: { children: ReactNode; initiallyOpen: boolean }) => {\n const [open, setOpen] = useState(initiallyOpen);\n return (\n <li className=\"oe-toggle-list-item\" data-open={open ? \"true\" : \"false\"}>\n <button\n aria-expanded={open}\n aria-label={open ? \"Collapse toggle item\" : \"Expand toggle item\"}\n className=\"oe-toggle-list-trigger\"\n onClick={() => setOpen((current) => !current)}\n type=\"button\"\n >\n <span aria-hidden=\"true\" className=\"oe-toggle-list-chevron\">›</span>\n </button>\n <div className=\"oe-toggle-list-content\">{children}</div>\n </li>\n );\n};\n\nconst OpenEditorDiagramNodeView = ({ editor, node, updateAttributes }: ReactNodeViewProps) => {\n const code = typeof node.attrs.code === \"string\" ? node.attrs.code : \"\";\n return (\n <NodeViewWrapper className=\"oe-diagram\" contentEditable={false}>\n <MermaidPreview code={code} />\n {editor.isEditable ? (\n <textarea\n aria-label=\"Mermaid diagram source\"\n className=\"oe-diagram-source\"\n onChange={(event) => updateAttributes({ code: event.target.value })}\n spellCheck={false}\n value={code}\n />\n ) : null}\n </NodeViewWrapper>\n );\n};\n\nconst MermaidDiagram = Node.create({\n name: \"mermaidDiagram\",\n group: \"block\",\n atom: true,\n draggable: true,\n addAttributes: () => ({ code: { default: \"\" } }),\n parseHTML: () => [{ tag: \"figure[data-openeditor-diagram]\" }],\n renderHTML: ({ HTMLAttributes }) => [\n \"figure\",\n mergeAttributes(HTMLAttributes, { \"data-openeditor-diagram\": \"\" }),\n ],\n addNodeView() {\n return ReactNodeViewRenderer(OpenEditorDiagramNodeView);\n },\n});\n\nconst createEditorExtensions = (\n placeholder: string,\n customExtensions: readonly OpenEditorReactExtension[],\n) => [\n StarterKit.configure({ horizontalRule: false, link: false, underline: false }),\n Divider,\n Image.configure({ allowBase64: true }),\n Link.configure({ openOnClick: false }),\n Underline,\n TaskList,\n BaseUiTaskItem.configure({ nested: true }),\n Table.configure({ resizable: true }),\n TableRow,\n TableHeader,\n TableCell,\n TextAlign.configure({ types: [\"heading\", \"paragraph\"] }),\n Placeholder.configure({ placeholder }),\n Columns,\n Column,\n ToggleList,\n ToggleListItem,\n Callout,\n Page,\n MermaidDiagram,\n ...customExtensions.flatMap((extension) => extension.tiptapExtensions),\n];\n\nconst createReactBlockRegistry = (extensions: readonly OpenEditorReactExtension[]): BlockRegistry =>\n createBlockRegistry([\n ...defaultBlockRegistry.values(),\n ...extensions.map((extension) => extension.block),\n ]);\n\nconst createReactExporters = (extensions: readonly OpenEditorReactExtension[]): OpenEditorExporters => ({\n html: Object.assign({}, ...extensions.map((extension) => extension.exporters?.html ?? {})),\n text: Object.assign({}, ...extensions.map((extension) => extension.exporters?.text ?? {})),\n});\n\nconst getNodeText = (node: { text?: string; content?: unknown[] }): string =>\n node.text ?? node.content?.map((child) => getNodeText(child as { text?: string; content?: unknown[] })).join(\"\") ?? \"\";\n\nconst toOverlayRect = (coordinates: { left: number; right: number; top: number; bottom: number }): OpenEditorOverlayRect => ({\n left: coordinates.left,\n right: coordinates.right,\n top: coordinates.top,\n bottom: coordinates.bottom,\n width: coordinates.right - coordinates.left,\n height: coordinates.bottom - coordinates.top,\n});\n\nconst getSlashState = (editor: NonNullable<ReturnType<typeof useEditor>>): SlashState | null => {\n const { selection } = editor.state;\n\n if (!selection.empty) {\n return null;\n }\n\n const { $from } = selection;\n const textBeforeCursor = $from.parent.textBetween(0, $from.parentOffset, \"\\n\", \"\\n\");\n const match = /(?:^|\\s)\\/([\\w -]*)$/.exec(textBeforeCursor);\n\n if (!match) {\n return null;\n }\n\n const query = match[1] ?? \"\";\n const from = $from.pos - query.length - 1;\n const to = $from.pos;\n const coordinates = editor.view.coordsAtPos(to);\n const anchorRect = toOverlayRect(coordinates);\n\n return {\n query,\n from,\n to,\n left: coordinates.left,\n top: coordinates.bottom + 8,\n anchorRect,\n };\n};\n\nconst getSelectionBubbleState = (editor: NonNullable<ReturnType<typeof useEditor>>): SelectionBubbleState | null => {\n const { selection } = editor.state;\n\n if (selection instanceof NodeSelection && selection.node.type.name === \"horizontalRule\") {\n return null;\n }\n\n if (selection.empty) {\n return null;\n }\n\n const domSelection = typeof window === \"undefined\" ? null : window.getSelection();\n const selectedRange = domSelection?.rangeCount ? domSelection.getRangeAt(0) : null;\n const selectedRect = selectedRange?.getBoundingClientRect();\n\n if (\n selectedRange &&\n editor.view.dom.contains(selectedRange.commonAncestorContainer) &&\n selectedRect &&\n selectedRect.width > 0 &&\n selectedRect.height > 0\n ) {\n return {\n left: selectedRect.left + selectedRect.width / 2,\n top: selectedRect.top,\n anchorRect: toOverlayRect(selectedRect),\n };\n }\n\n const fromCoordinates = editor.view.coordsAtPos(selection.from);\n const toCoordinates = editor.view.coordsAtPos(selection.to);\n const anchorRect = toOverlayRect({\n left: Math.min(fromCoordinates.left, toCoordinates.left),\n right: Math.max(fromCoordinates.right, toCoordinates.right),\n top: Math.min(fromCoordinates.top, toCoordinates.top),\n bottom: Math.max(fromCoordinates.bottom, toCoordinates.bottom),\n });\n\n return {\n left: (fromCoordinates.left + toCoordinates.right) / 2,\n top: Math.min(fromCoordinates.top, toCoordinates.top) - 8,\n anchorRect,\n };\n};\n\nconst getSelectedTopLevelIndex = (editor: NonNullable<ReturnType<typeof useEditor>>) => {\n const { $from } = editor.state.selection;\n const selectedTopLevelPosition = $from.depth > 0 ? $from.before(1) : 0;\n let selectedIndex = 0;\n\n editor.state.doc.forEach((_, offset, index) => {\n if (offset <= selectedTopLevelPosition) {\n selectedIndex = index;\n }\n });\n\n return selectedIndex;\n};\n\nexport const useOpenEditorController = ({\n initialDocument = seedDocument,\n editable = true,\n placeholder = \"Start writing...\",\n onChange,\n onFilePasteDrop,\n pageRuntime,\n slashMenuItems = [],\n extensions = EMPTY_EXTENSIONS,\n}: OpenEditorReactProps = {}): OpenEditorController => {\n const [document, setDocument] = useState(normalizeDocument(initialDocument));\n const [selectedBlock, setSelectedBlock] = useState(\"paragraph\");\n const [slashState, setSlashState] = useState<SlashState | null>(null);\n const [selectionBubbleState, setSelectionBubbleState] = useState<SelectionBubbleState | null>(null);\n const slashStateRef = useRef<SlashState | null>(null);\n const selectionBubbleStateRef = useRef<SelectionBubbleState | null>(null);\n const registry = useMemo(() => createReactBlockRegistry(extensions), [extensions]);\n const exporters = useMemo(() => createReactExporters(extensions), [extensions]);\n const editor = useEditor({\n immediatelyRender: false,\n extensions: createEditorExtensions(placeholder, extensions),\n content: toProseMirrorDocument(normalizeDocument(initialDocument)),\n editable,\n editorProps: {\n attributes: {\n class: \"oe-prosemirror\",\n \"aria-label\": \"OpenEditor document\",\n },\n transformPastedHTML: sanitizePastedHtml,\n handlePaste: (_view, event) => {\n const file = event.clipboardData?.files?.[0];\n\n if (!file || !onFilePasteDrop?.(file)) {\n return false;\n }\n\n event.preventDefault();\n return true;\n },\n handleDrop: (_view, event, _slice, moved) => {\n const file = event.dataTransfer?.files?.[0];\n\n if (moved || !file || !onFilePasteDrop?.(file)) {\n return false;\n }\n\n event.preventDefault();\n return true;\n },\n },\n onUpdate: ({ editor: currentEditor }) => {\n const nextDocument = normalizeDocument(\n fromProseMirrorDocument(\n currentEditor.getJSON(),\n initialDocument.meta,\n ),\n );\n setDocument(nextDocument);\n onChange?.(nextDocument);\n setSlashState(getSlashState(currentEditor));\n setSelectionBubbleState(getSelectionBubbleState(currentEditor));\n },\n onSelectionUpdate: ({ editor: currentEditor }) => {\n setSlashState(getSlashState(currentEditor));\n setSelectionBubbleState(getSelectionBubbleState(currentEditor));\n },\n }, [extensions]);\n const exports = useMemo(\n () => toExportBundle(document, exporters),\n [document, exporters],\n );\n\n useEffect(() => {\n slashStateRef.current = slashState;\n }, [slashState]);\n\n useEffect(() => {\n selectionBubbleStateRef.current = selectionBubbleState;\n }, [selectionBubbleState]);\n\n useEffect(() => {\n if (!editor || typeof window === \"undefined\") {\n return;\n }\n\n let animationFrame = 0;\n\n const refreshOverlayAnchors = () => {\n if (!slashStateRef.current && !selectionBubbleStateRef.current) {\n return;\n }\n\n window.cancelAnimationFrame(animationFrame);\n animationFrame = window.requestAnimationFrame(() => {\n if (slashStateRef.current) {\n setSlashState(getSlashState(editor));\n }\n\n if (selectionBubbleStateRef.current) {\n setSelectionBubbleState(getSelectionBubbleState(editor));\n }\n });\n };\n\n window.addEventListener(\"scroll\", refreshOverlayAnchors, true);\n window.addEventListener(\"resize\", refreshOverlayAnchors);\n\n return () => {\n window.cancelAnimationFrame(animationFrame);\n window.removeEventListener(\"scroll\", refreshOverlayAnchors, true);\n window.removeEventListener(\"resize\", refreshOverlayAnchors);\n };\n }, [editor]);\n\n const insertBlock = (blockName = selectedBlock, range?: InsertRange) => {\n if (!editor) {\n return;\n }\n\n const preset = openEditorInsertPresets.find((item) => item.key === blockName);\n const spec = registry.get(blockName);\n if (!spec) {\n return;\n }\n\n const chain = () => {\n const commandChain = editor.chain().focus();\n return range ? commandChain.deleteRange(range) : commandChain;\n };\n\n chain().insertContent(preset ? createOpenEditorInsertBlock(preset.key) : spec.defaultNode()).run();\n setSlashState(null);\n };\n\n const setDocumentContent = (content: OpenEditorDocument[\"content\"]) => {\n if (!editor) {\n return;\n }\n\n editor.commands.setContent(toProseMirrorDocument(normalizeDocument({ ...document, content })));\n };\n\n const setContent = (nextDocument: OpenEditorDocument) => {\n if (!editor) {\n return;\n }\n\n editor.commands.setContent(toProseMirrorDocument(normalizeDocument(nextDocument)));\n };\n\n const moveSelectedBlock = (direction: -1 | 1) => {\n if (!editor) {\n return;\n }\n\n const currentDocument = normalizeDocument(fromProseMirrorDocument(editor.getJSON(), document.meta));\n const selectedIndex = getSelectedTopLevelIndex(editor);\n const nextIndex = selectedIndex + direction;\n\n if (nextIndex < 0 || nextIndex >= currentDocument.content.length) {\n return;\n }\n\n setDocumentContent(moveTopLevelBlock(currentDocument, selectedIndex, nextIndex).content);\n };\n\n const duplicateSelectedBlock = () => {\n if (!editor) {\n return;\n }\n\n const currentDocument = normalizeDocument(fromProseMirrorDocument(editor.getJSON(), document.meta));\n const selectedIndex = getSelectedTopLevelIndex(editor);\n setDocumentContent(duplicateTopLevelBlock(currentDocument, selectedIndex).content);\n };\n\n const deleteSelectedBlock = () => {\n if (!editor) {\n return;\n }\n\n const currentDocument = normalizeDocument(fromProseMirrorDocument(editor.getJSON(), document.meta));\n const selectedIndex = getSelectedTopLevelIndex(editor);\n setDocumentContent(deleteTopLevelBlock(currentDocument, selectedIndex).content);\n };\n\n const setLink = (url?: string | null) => {\n if (!editor) {\n return;\n }\n\n if (!url) {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n return;\n }\n\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href: url }).run();\n };\n\n const setParagraph = () => {\n editor?.chain().focus().setParagraph().run();\n };\n\n const toggleHeading = (level: 1 | 2 | 3 | 4 | 5 | 6) => {\n editor?.chain().focus().toggleHeading({ level }).run();\n };\n\n const toggleBold = () => {\n editor?.chain().focus().toggleBold().run();\n };\n\n const toggleItalic = () => {\n editor?.chain().focus().toggleItalic().run();\n };\n\n const toggleUnderline = () => {\n editor?.chain().focus().toggleUnderline().run();\n };\n\n const toggleStrike = () => {\n editor?.chain().focus().toggleStrike().run();\n };\n\n const toggleInlineCode = () => {\n editor?.chain().focus().toggleCode().run();\n };\n\n const toggleBulletList = () => {\n editor?.chain().focus().toggleBulletList().run();\n };\n\n const toggleOrderedList = () => {\n editor?.chain().focus().toggleOrderedList().run();\n };\n\n const toggleTaskList = () => {\n editor?.chain().focus().toggleTaskList().run();\n };\n\n const toggleBlockquote = () => {\n editor?.chain().focus().toggleBlockquote().run();\n };\n\n const toggleCodeBlock = () => {\n editor?.chain().focus().toggleCodeBlock().run();\n };\n\n const undo = () => {\n editor?.chain().focus().undo().run();\n };\n\n const redo = () => {\n editor?.chain().focus().redo().run();\n };\n\n const controller: InternalOpenEditorController = {\n document,\n editor,\n exports,\n editable,\n placeholder,\n selectedBlock,\n setSelectedBlock,\n getContent: () => document,\n setContent,\n setParagraph,\n toggleHeading,\n toggleBold,\n toggleItalic,\n toggleUnderline,\n toggleStrike,\n toggleInlineCode,\n toggleBulletList,\n toggleOrderedList,\n toggleTaskList,\n toggleBlockquote,\n toggleCodeBlock,\n undo,\n redo,\n insertBlock,\n setLink,\n getActiveLink: () => editor?.getAttributes(\"link\").href as string | undefined,\n moveSelectedBlock,\n duplicateSelectedBlock,\n deleteSelectedBlock,\n slashMenuItems,\n extensions,\n pageRuntime,\n slashState,\n selectionBubbleState,\n };\n\n return controller;\n};\n\nexport const getDefaultSlashMenuItems = (controller: OpenEditorController): OpenEditorSlashMenuItem[] => {\n const internalController = controller as InternalOpenEditorController;\n\n return [\n ...openEditorInsertPresets.map((preset) => ({\n key: preset.key,\n label: preset.label,\n group: preset.group,\n keywords: [preset.key],\n run: ({ controller: current, range }: { controller: OpenEditorController; range: InsertRange }) =>\n current.insertBlock(preset.key, range),\n })),\n {\n key: \"moveBlockUp\",\n label: \"Move Block Up\",\n group: \"block\",\n run: ({ range }) => {\n internalController.editor?.chain().focus().deleteRange(range).run();\n controller.moveSelectedBlock(-1);\n },\n },\n {\n key: \"moveBlockDown\",\n label: \"Move Block Down\",\n group: \"block\",\n run: ({ range }) => {\n internalController.editor?.chain().focus().deleteRange(range).run();\n controller.moveSelectedBlock(1);\n },\n },\n ...controller.extensions\n .filter((extension) => extension.slashMenu !== false)\n .map((extension) => {\n const menu = extension.slashMenu || undefined;\n return {\n key: extension.block.name,\n label: menu?.label ?? extension.block.label,\n group: menu?.group ?? extension.block.group,\n keywords: menu?.keywords ?? [extension.block.name],\n run: ({ controller: current, range }: { controller: OpenEditorController; range: InsertRange }) =>\n current.insertBlock(extension.block.name, range),\n };\n }),\n ...controller.slashMenuItems,\n ];\n};\n\nconst renderTextWithMarks = (\n text: string,\n marks: readonly ProseMirrorMark[] = [],\n key: string,\n): ReactNode =>\n marks.reduceRight<ReactNode>((children, mark, index) => {\n const nodeKey = `${key}-${mark.type}-${index}`;\n switch (mark.type) {\n case \"bold\":\n return <strong key={nodeKey}>{children}</strong>;\n case \"italic\":\n return <em key={nodeKey}>{children}</em>;\n case \"underline\":\n return <u key={nodeKey}>{children}</u>;\n case \"strike\":\n return <s key={nodeKey}>{children}</s>;\n case \"code\":\n return <code key={nodeKey}>{children}</code>;\n case \"link\":\n return (\n <a key={nodeKey} href={typeof mark.attrs?.href === \"string\" ? mark.attrs.href : undefined}>\n {children}\n </a>\n );\n default:\n return children;\n }\n }, text);\n\nconst renderViewerNode = (\n node: ProseMirrorNode,\n key: string,\n renderers?: Partial<Record<string, OpenEditorViewerRenderer>>,\n registry: BlockRegistry = defaultBlockRegistry,\n): ReactNode => {\n if (node.type === \"text\") {\n return renderTextWithMarks(node.text ?? \"\", node.marks, key);\n }\n\n const children = node.content?.map((child, index) => renderViewerNode(child, `${key}-${index}`, renderers, registry)) ?? null;\n const blockKey = findBlockSpecForNode(registry, node)?.name ?? node.type;\n const customRenderer = renderers?.[blockKey];\n if (customRenderer) {\n return <Fragment key={key}>{customRenderer({ node, children })}</Fragment>;\n }\n\n switch (blockKey) {\n case \"paragraph\":\n return <p key={key}>{children}</p>;\n case \"heading\": {\n const level = typeof node.attrs?.level === \"number\" ? Math.min(Math.max(node.attrs.level, 1), 6) : 2;\n switch (level) {\n case 1:\n return <h1 key={key}>{children}</h1>;\n case 2:\n return <h2 key={key}>{children}</h2>;\n case 3:\n return <h3 key={key}>{children}</h3>;\n case 4:\n return <h4 key={key}>{children}</h4>;\n case 5:\n return <h5 key={key}>{children}</h5>;\n default:\n return <h6 key={key}>{children}</h6>;\n }\n }\n case \"bulletList\":\n return <ul key={key}>{children}</ul>;\n case \"orderedList\":\n return <ol key={key}>{children}</ol>;\n case \"taskList\":\n return <ul key={key} data-type=\"taskList\">{children}</ul>;\n case \"blockquote\":\n return <blockquote key={key}>{children}</blockquote>;\n case \"codeBlock\":\n return <pre key={key}><code>{node.content?.map((child) => child.text ?? \"\").join(\"\")}</code></pre>;\n case \"divider\":\n return <hr key={key} />;\n case \"image\":\n return <img key={key} src={typeof node.attrs?.src === \"string\" ? node.attrs.src : \"\"} alt={typeof node.attrs?.alt === \"string\" ? node.attrs.alt : \"\"} />;\n case \"columns\":\n return <section key={key}>{children}</section>;\n case \"table\":\n return <table key={key}><tbody>{children}</tbody></table>;\n case \"toggleList\":\n return <ul key={key} data-openeditor-toggle-list>{children}</ul>;\n case \"callout\":\n return <aside key={key} className=\"oe-callout\" data-tone={normalizeCalloutTone(node.attrs?.tone)}>{children}</aside>;\n case \"diagram\": {\n const code = typeof node.attrs?.code === \"string\" ? node.attrs.code : \"\";\n return <figure key={key} className=\"oe-diagram\"><MermaidPreview code={code} /></figure>;\n }\n case \"page\":\n return <OpenEditorPageViewer key={key} node={node} />;\n default:\n if (node.type === \"column\") {\n return <div key={key}>{children}</div>;\n }\n if (node.type === \"tableRow\") {\n return <tr key={key}>{children}</tr>;\n }\n if (node.type === \"tableHeader\") {\n return <th key={key}>{children}</th>;\n }\n if (node.type === \"tableCell\") {\n return <td key={key}>{children}</td>;\n }\n if (node.type === \"listItem\") {\n return <li key={key}>{children}</li>;\n }\n if (node.type === \"taskItem\") {\n const checked = Boolean(node.attrs?.checked);\n return (\n <li key={key} data-checked={checked ? \"true\" : \"false\"}>\n <span className=\"oe-task-item-checkbox\" aria-hidden=\"true\">\n <OpenEditorTaskCheckbox checked={checked} label=\"Task item checkbox\" readOnly tabIndex={-1} />\n </span>\n <div>{children}</div>\n </li>\n );\n }\n if (node.type === \"toggleListItem\") {\n return <ToggleListViewerItem initiallyOpen={node.attrs?.open !== false} key={key}>{children}</ToggleListViewerItem>;\n }\n if (node.type === \"hardBreak\") {\n return <br key={key} />;\n }\n return <div key={key}>{children}</div>;\n }\n};\n\nexport const OpenEditorContent = ({\n controller,\n className = \"oe-canvas\",\n}: OpenEditorContentProps) => {\n const internalController = controller as InternalOpenEditorController;\n return (\n <OpenEditorPageRuntimeContext.Provider value={internalController.pageRuntime}>\n <EditorContent editor={internalController.editor} className={className} />\n </OpenEditorPageRuntimeContext.Provider>\n );\n};\n\nexport const OpenEditorViewer = ({\n document,\n className = \"oe-viewer\",\n renderers,\n extensions = EMPTY_EXTENSIONS,\n pageRuntime,\n}: OpenEditorViewerProps) => {\n const registry = createReactBlockRegistry(extensions);\n const extensionRenderers = Object.fromEntries(\n extensions.map((extension) => [extension.block.name, extension.viewer]),\n );\n const mergedRenderers = { ...extensionRenderers, ...renderers };\n\n return (\n <OpenEditorPageRuntimeContext.Provider value={pageRuntime}>\n <div className={className}>\n {normalizeDocument(document).content.map((node, index) =>\n renderViewerNode(node, `viewer-${index}`, mergedRenderers, registry),\n )}\n </div>\n </OpenEditorPageRuntimeContext.Provider>\n );\n};\n\nexport const useOpenEditor = useOpenEditorController;\nexport { seedDocument };\nexport { NodeViewContent, NodeViewWrapper };\nexport type { ReactNodeViewProps as OpenEditorNodeViewProps };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx"],"names":["snapshot","Fragment","page"],"mappings":"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","file":"index.js","sourcesContent":["import {\n DEFAULT_CALLOUT_EMOJI,\n DEFAULT_PAGE_EMOJI,\n createBlockRegistry,\n deleteTopLevelBlock,\n duplicateTopLevelBlock,\n findBlockSpecForNode,\n fromProseMirrorDocument,\n moveTopLevelBlock,\n normalizeDocument,\n normalizeEmoji,\n toProseMirrorDocument,\n type ProseMirrorMark,\n type ProseMirrorNode,\n type OpenEditorDocument,\n type BlockRegistry,\n type BlockSpec,\n type OpenEditorAttachmentRuntime,\n type OpenEditorAttachmentSnapshot,\n type OpenEditorAttachmentUploadInput,\n} from \"@openeditor/core\";\nimport { Checkbox } from \"@base-ui/react/checkbox\";\nimport { OpenEditorEmojiPicker } from \"@openeditor/emoji\";\nimport { renderMermaidSVG } from \"beautiful-mermaid\";\nimport { toExportBundle, type OpenEditorExporters } from \"@openeditor/exporters\";\nimport {\n defaultBlockRegistry,\n openEditorInsertPresets,\n resolveOpenEditorInsertBlock,\n seedDocument,\n} from \"@openeditor/extensions\";\nimport { InputRule, mergeAttributes, Node, type AnyExtension, type Editor, type NodeConfig } from \"@tiptap/core\";\nimport HorizontalRule from \"@tiptap/extension-horizontal-rule\";\nimport Image from \"@tiptap/extension-image\";\nimport Link from \"@tiptap/extension-link\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport { Table } from \"@tiptap/extension-table\";\nimport TableCell from \"@tiptap/extension-table-cell\";\nimport TableHeader from \"@tiptap/extension-table-header\";\nimport TableRow from \"@tiptap/extension-table-row\";\nimport TaskItem from \"@tiptap/extension-task-item\";\nimport TaskList from \"@tiptap/extension-task-list\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport Underline from \"@tiptap/extension-underline\";\nimport { NodeSelection, Plugin } from \"@tiptap/pm/state\";\nimport { ReplaceStep } from \"@tiptap/pm/transform\";\nimport {\n EditorContent,\n NodeViewContent,\n NodeViewWrapper,\n ReactNodeViewRenderer,\n useEditor,\n type ReactNodeViewProps,\n} from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport { Fragment, createContext, use, useEffect, useMemo, useRef, useState, type ComponentType, type KeyboardEvent, type MouseEvent, type ReactNode } from \"react\";\n\nexport type OpenEditorPageSnapshot = {\n pageId: string;\n title: string;\n icon?: string | null;\n href?: string | null;\n};\n\nexport type OpenEditorPageRuntime = {\n createPage?: (input: { title: string; icon?: string | null }) => Promise<OpenEditorPageSnapshot>;\n resolvePage?: (pageId: string) => Promise<OpenEditorPageSnapshot | null>;\n renamePage?: (pageId: string, title: string) => Promise<void> | void;\n updatePageIcon?: (pageId: string, icon: string) => Promise<void> | void;\n openPage?: (page: OpenEditorPageSnapshot) => Promise<void> | void;\n};\n\nconst OpenEditorPageRuntimeContext = createContext<OpenEditorPageRuntime | undefined>(undefined);\nconst OpenEditorAttachmentRuntimeContext = createContext<OpenEditorAttachmentRuntime<any> | undefined>(undefined);\n\nexport type OpenEditorReactProps = {\n initialDocument?: OpenEditorDocument;\n editable?: boolean;\n placeholder?: string;\n onChange?: (document: OpenEditorDocument) => void;\n onFilePasteDrop?: (file: File) => boolean;\n pageRuntime?: OpenEditorPageRuntime;\n attachmentRuntime?: OpenEditorAttachmentRuntime<any>;\n slashMenuItems?: readonly OpenEditorSlashMenuItem[];\n /** Consumer-owned blocks. Extension names and node types must be unique. */\n extensions?: readonly OpenEditorReactExtension[];\n};\n\nexport type OpenEditorReactConfig = OpenEditorReactProps;\n\nexport type OpenEditorController = {\n editor: Editor | null;\n document: OpenEditorDocument;\n exports: ReturnType<typeof toExportBundle>;\n editable: boolean;\n placeholder: string;\n selectedBlock: string;\n setSelectedBlock: (blockName: string) => void;\n getContent: () => OpenEditorDocument;\n setContent: (document: OpenEditorDocument) => void;\n setParagraph: () => void;\n toggleHeading: (level: 1 | 2 | 3 | 4 | 5 | 6) => void;\n toggleBold: () => void;\n toggleItalic: () => void;\n toggleUnderline: () => void;\n toggleStrike: () => void;\n toggleInlineCode: () => void;\n toggleBulletList: () => void;\n toggleOrderedList: () => void;\n toggleTaskList: () => void;\n toggleBlockquote: () => void;\n toggleCodeBlock: () => void;\n undo: () => void;\n redo: () => void;\n insertBlock: (blockName?: string, range?: InsertRange) => boolean;\n setLink: (url?: string | null) => void;\n getActiveLink: () => string | undefined;\n moveSelectedBlock: (direction: -1 | 1) => void;\n duplicateSelectedBlock: () => void;\n deleteSelectedBlock: () => void;\n slashMenuItems: readonly OpenEditorSlashMenuItem[];\n extensions: readonly OpenEditorReactExtension[];\n pageRuntime?: OpenEditorPageRuntime;\n attachmentRuntime?: OpenEditorAttachmentRuntime<any>;\n slashState: SlashState | null;\n selectionBubbleState: SelectionBubbleState | null;\n};\n\nexport type OpenEditorContentProps = {\n controller: OpenEditorController;\n className?: string;\n};\n\ntype InternalOpenEditorController = OpenEditorController & {\n editor: Editor | null;\n};\n\ntype RenderAttributes = Record<string, string | number | boolean | null | undefined>;\nexport type InsertRange = { from: number; to: number };\nexport type OpenEditorOverlayRect = {\n left: number;\n right: number;\n top: number;\n bottom: number;\n width: number;\n height: number;\n};\nexport type SlashState = {\n query: string;\n from: number;\n to: number;\n left: number;\n top: number;\n anchorRect?: OpenEditorOverlayRect;\n};\nexport type SelectionBubbleState = {\n left: number;\n top: number;\n anchorRect?: OpenEditorOverlayRect;\n};\nexport type OpenEditorSlashMenuItem = {\n key: string;\n label: string;\n group: string;\n keywords?: readonly string[];\n execute: (context: { controller: OpenEditorController; range: InsertRange }) => boolean;\n};\n\nexport type OpenEditorViewerRenderer = (context: {\n node: ProseMirrorNode;\n children: ReactNode;\n}) => ReactNode;\n\nexport type OpenEditorExtensionMenu = {\n label?: string;\n group?: string;\n keywords?: readonly string[];\n};\n\n/**\n * Complete web integration for a consumer-owned block. The portable `block`\n * contract is shared by commands and platform support; the other fields are\n * adapters for the React/Tiptap runtime and non-interactive output.\n */\nexport type OpenEditorReactExtension = {\n block: BlockSpec;\n tiptapExtensions: readonly AnyExtension[];\n slashMenu?: false | OpenEditorExtensionMenu;\n viewer: OpenEditorViewerRenderer;\n exporters?: OpenEditorExporters;\n};\n\nexport const defineOpenEditorReactExtension = <T extends OpenEditorReactExtension>(extension: T): T => extension;\n\nexport type OpenEditorReactNodeExtension = Omit<OpenEditorReactExtension, \"tiptapExtensions\"> & {\n node: Omit<Partial<NodeConfig>, \"name\" | \"addNodeView\">;\n component: ComponentType<ReactNodeViewProps>;\n};\n\n/** Creates the common case: one custom ProseMirror node rendered by one React node view. */\nexport const defineOpenEditorReactNode = ({\n block,\n node,\n component,\n ...extension\n}: OpenEditorReactNodeExtension): OpenEditorReactExtension => ({\n ...extension,\n block,\n tiptapExtensions: [\n Node.create({\n ...node,\n name: block.nodeType ?? block.name,\n addNodeView() {\n return ReactNodeViewRenderer(component);\n },\n }),\n ],\n});\n\nexport type OpenEditorViewerProps = {\n document: OpenEditorDocument;\n className?: string;\n renderers?: Partial<Record<string, OpenEditorViewerRenderer>>;\n extensions?: readonly OpenEditorReactExtension[];\n pageRuntime?: OpenEditorPageRuntime;\n attachmentRuntime?: OpenEditorAttachmentRuntime<any>;\n};\n\nconst EMPTY_EXTENSIONS: readonly OpenEditorReactExtension[] = [];\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n columns: {\n insertColumns: (count?: 2 | 3 | 4) => ReturnType;\n };\n }\n}\n\nconst COMMON_HTML_ATTRIBUTES = [\"id\", \"class\", \"title\", \"lang\", \"dir\", \"data-id\", \"style\"] as const;\nconst LAYOUT_ATTRIBUTES = [\"align\", \"width\", \"height\"] as const;\nconst URL_ATTRIBUTES = new Set([\"href\", \"src\"]);\nconst FORBIDDEN_PASTE_TAGS = new Set([\"script\", \"iframe\", \"object\", \"embed\", \"meta\", \"base\"]);\n\nconst createStandardAttributes = (attributeNames: readonly string[]) =>\n Object.fromEntries(\n attributeNames.map((attribute) => [\n attribute,\n {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute(attribute),\n renderHTML: (attributes: Record<string, unknown>) =>\n attributes[attribute] ? { [attribute]: attributes[attribute] } : {},\n },\n ]),\n );\n\nconst isSafeUrl = (value: string, allowDataImage: boolean) => {\n const normalized = value.trim().toLowerCase();\n\n if (normalized.startsWith(\"javascript:\") || normalized.startsWith(\"vbscript:\")) {\n return false;\n }\n\n if (normalized.startsWith(\"data:\")) {\n return allowDataImage && normalized.startsWith(\"data:image/\");\n }\n\n return true;\n};\n\nconst sanitizePastedHtml = (html: string) => {\n const parser = new DOMParser();\n const parsed = parser.parseFromString(html, \"text/html\");\n const isFromOpenEditor = /data-openeditor-|oe-|node-/.test(html);\n const preservedAttributes: Record<string, string[]> = {\n a: [\"href\", \"target\", \"rel\"],\n img: [\"src\", \"alt\", \"width\", \"height\"],\n td: [\"colspan\", \"rowspan\"],\n th: [\"colspan\", \"rowspan\", \"scope\"],\n table: [\"border\", \"cellpadding\", \"cellspacing\"],\n \"*\": [\"id\"],\n };\n\n for (const tag of FORBIDDEN_PASTE_TAGS) {\n for (const element of Array.from(parsed.body.getElementsByTagName(tag))) {\n element.remove();\n }\n }\n\n for (const element of Array.from(parsed.body.querySelectorAll<HTMLElement>(\"[href], [src]\"))) {\n const allowDataImage = element.tagName.toLowerCase() === \"img\";\n\n for (const attribute of URL_ATTRIBUTES) {\n const value = element.getAttribute(attribute);\n if (value !== null && !isSafeUrl(value, allowDataImage)) {\n element.removeAttribute(attribute);\n }\n }\n }\n\n if (isFromOpenEditor) {\n return parsed.body.innerHTML;\n }\n\n const sanitizeElement = (node: globalThis.Node) => {\n if (node.nodeType === window.Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n const tagName = element.tagName.toLowerCase();\n const allowed = new Set([...(preservedAttributes[tagName] ?? []), ...(preservedAttributes[\"*\"] ?? [])]);\n\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.name.startsWith(\"data-\") || !allowed.has(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n }\n }\n\n for (const child of Array.from(node.childNodes)) {\n sanitizeElement(child);\n }\n };\n\n sanitizeElement(parsed.body);\n return parsed.body.innerHTML;\n};\n\nconst Columns = Node.create({\n name: \"columns\",\n group: \"block\",\n content: \"column+\",\n isolating: true,\n defining: true,\n addAttributes() {\n return createStandardAttributes([...COMMON_HTML_ATTRIBUTES, ...LAYOUT_ATTRIBUTES, \"cellspacing\"]);\n },\n parseHTML() {\n return [{ tag: \"section[data-openeditor-columns]\" }];\n },\n renderHTML({ node, HTMLAttributes }) {\n const count = node.childCount;\n return [\n \"section\",\n mergeAttributes(\n {\n class: \"oe-columns\",\n \"data-openeditor-columns\": count,\n style: `--oe-column-count:${Math.min(Math.max(count, 2), 4)};${HTMLAttributes.style ?? \"\"}`,\n },\n HTMLAttributes,\n ),\n 0,\n ];\n },\n addCommands() {\n return {\n insertColumns:\n (count: 2 | 3 | 4 = 2) =>\n ({ commands }) =>\n commands.insertContent({\n type: \"columns\",\n content: Array.from({ length: count }, (_, index) => ({\n type: \"column\",\n content: [\n {\n type: \"paragraph\",\n content: [{ type: \"text\", text: `Column ${index + 1}` }],\n },\n ],\n })),\n }),\n };\n },\n addKeyboardShortcuts() {\n return {\n Backspace: ({ editor }) => {\n const { selection } = editor.state;\n\n if (!(selection instanceof NodeSelection) || selection.node.type.name !== \"columns\") {\n return false;\n }\n\n const allColumnsEmpty = Array.from({ length: selection.node.childCount }, (_, index) =>\n selection.node.child(index),\n ).every(\n (column) =>\n column.childCount === 1 &&\n column.firstChild?.type.name === \"paragraph\" &&\n column.firstChild.childCount === 0,\n );\n\n if (!allColumnsEmpty) {\n return false;\n }\n\n editor.view.dispatch(\n editor.state.tr.replaceWith(selection.from, selection.to, editor.state.schema.nodes.paragraph.create()),\n );\n return true;\n },\n };\n },\n});\n\nconst Column = Node.create({\n name: \"column\",\n content: \"block+\",\n isolating: true,\n defining: true,\n addAttributes() {\n return createStandardAttributes([...COMMON_HTML_ATTRIBUTES, ...LAYOUT_ATTRIBUTES]);\n },\n parseHTML() {\n return [{ tag: \"div[data-openeditor-column]\" }];\n },\n renderHTML({ HTMLAttributes }: { HTMLAttributes: RenderAttributes }) {\n return [\"div\", mergeAttributes({ \"data-openeditor-column\": \"\", class: \"oe-column\" }, HTMLAttributes), 0];\n },\n});\n\nconst Divider = HorizontalRule.extend({\n addAttributes() {\n return {\n ...createStandardAttributes([\"class\", \"style\"]),\n class: {\n default: \"oe-divider\",\n },\n };\n },\n addInputRules() {\n return [\n new InputRule({\n find: /^(?:---|___|\\*\\*\\*)$/,\n handler: ({ state, range }) => {\n const { tr } = state;\n tr.insert(range.from - 1, this.type.create()).delete(tr.mapping.map(range.from), tr.mapping.map(range.to));\n },\n }),\n ];\n },\n addProseMirrorPlugins() {\n return [\n new Plugin({\n filterTransaction(transaction, state) {\n const { selection } = state;\n const isDividerSelection = selection instanceof NodeSelection && selection.node.type.name === \"horizontalRule\";\n const isTypingOverDivider = transaction.steps.some(\n (step) => step instanceof ReplaceStep && step.slice.content.size > 0,\n );\n\n return !(isDividerSelection && transaction.docChanged && isTypingOverDivider);\n },\n }),\n ];\n },\n});\n\nconst OpenEditorTaskCheckbox = ({\n checked,\n label,\n readOnly = false,\n tabIndex,\n onCheckedChange,\n}: {\n checked: boolean;\n label: string;\n readOnly?: boolean;\n tabIndex?: number;\n onCheckedChange?: (checked: boolean) => void;\n}) => (\n <Checkbox.Root\n aria-label={label}\n checked={checked}\n className=\"oe-task-checkbox\"\n onCheckedChange={onCheckedChange}\n onMouseDown={(event) => event.preventDefault()}\n readOnly={readOnly}\n tabIndex={tabIndex}\n >\n <Checkbox.Indicator className=\"oe-task-checkbox-indicator\" keepMounted />\n </Checkbox.Root>\n);\n\nconst OpenEditorTaskItemNodeView = ({ editor, node, updateAttributes }: ReactNodeViewProps) => {\n const checked = Boolean(node.attrs.checked);\n\n return (\n <NodeViewWrapper as=\"li\" data-checked={checked ? \"true\" : \"false\"}>\n <span className=\"oe-task-item-checkbox\" contentEditable={false}>\n <OpenEditorTaskCheckbox\n checked={checked}\n label={`Task item checkbox for ${node.textContent || \"empty task item\"}`}\n onCheckedChange={(nextChecked) => {\n if (editor.isEditable) {\n updateAttributes({ checked: nextChecked });\n }\n }}\n readOnly={!editor.isEditable}\n />\n </span>\n <NodeViewContent as=\"div\" />\n </NodeViewWrapper>\n );\n};\n\nconst BaseUiTaskItem = TaskItem.extend({\n addNodeView() {\n return ReactNodeViewRenderer(OpenEditorTaskItemNodeView);\n },\n});\n\nconst ToggleList = Node.create({\n name: \"toggleList\",\n group: \"block\",\n content: \"toggleListItem+\",\n parseHTML: () => [{ tag: \"ul[data-openeditor-toggle-list]\" }],\n renderHTML: ({ HTMLAttributes }) => [\n \"ul\",\n mergeAttributes(HTMLAttributes, { \"data-openeditor-toggle-list\": \"\" }),\n 0,\n ],\n});\n\nconst OpenEditorToggleListItemNodeView = ({ editor, node, updateAttributes }: ReactNodeViewProps) => {\n const open = Boolean(node.attrs.open);\n\n return (\n <NodeViewWrapper as=\"li\" className=\"oe-toggle-list-item\" data-open={open ? \"true\" : \"false\"}>\n <button\n aria-expanded={open}\n aria-label={open ? \"Collapse toggle item\" : \"Expand toggle item\"}\n className=\"oe-toggle-list-trigger\"\n contentEditable={false}\n disabled={!editor.isEditable}\n onClick={() => updateAttributes({ open: !open })}\n type=\"button\"\n >\n <span aria-hidden=\"true\" className=\"oe-toggle-list-chevron\" />\n </button>\n <NodeViewContent as=\"div\" className=\"oe-toggle-list-content\" />\n </NodeViewWrapper>\n );\n};\n\nconst ToggleListItem = Node.create({\n name: \"toggleListItem\",\n content: \"paragraph block*\",\n defining: true,\n addAttributes: () => ({ open: { default: true } }),\n parseHTML: () => [{ tag: \"li[data-openeditor-toggle-list-item]\" }],\n renderHTML: ({ HTMLAttributes }) => [\n \"li\",\n mergeAttributes(HTMLAttributes, { \"data-openeditor-toggle-list-item\": \"\" }),\n 0,\n ],\n addNodeView() {\n return ReactNodeViewRenderer(OpenEditorToggleListItemNodeView);\n },\n});\n\nconst OpenEditorCalloutNodeView = ({ editor, node, updateAttributes }: ReactNodeViewProps) => (\n <NodeViewWrapper as=\"aside\" className=\"oe-callout\">\n <span className=\"oe-callout-emoji\" contentEditable={false}>\n <OpenEditorEmojiPicker\n className=\"oe-callout-emoji-trigger\"\n disabled={!editor.isEditable}\n emoji={normalizeEmoji(node.attrs.emoji, DEFAULT_CALLOUT_EMOJI)}\n label=\"Change callout emoji\"\n onEmojiSelect={(emoji) => updateAttributes({ emoji })}\n />\n </span>\n <NodeViewContent as=\"div\" className=\"oe-callout-content\" />\n </NodeViewWrapper>\n);\n\nconst Callout = Node.create({\n name: \"callout\",\n group: \"block\",\n content: \"block+\",\n defining: true,\n addAttributes: () => ({\n emoji: {\n default: DEFAULT_CALLOUT_EMOJI,\n parseHTML: (element) => element.getAttribute(\"data-emoji\") || DEFAULT_CALLOUT_EMOJI,\n renderHTML: (attributes) => ({ \"data-emoji\": normalizeEmoji(attributes.emoji, DEFAULT_CALLOUT_EMOJI) }),\n },\n }),\n parseHTML: () => [{ tag: \"aside[data-openeditor-callout]\" }],\n renderHTML: ({ HTMLAttributes }) => [\n \"aside\",\n mergeAttributes(HTMLAttributes, { \"data-openeditor-callout\": \"\" }),\n 0,\n ],\n addNodeView() {\n return ReactNodeViewRenderer(OpenEditorCalloutNodeView);\n },\n});\n\ntype AttachmentPhase = \"idle\" | \"selecting\" | \"uploading\" | \"resolving\" | \"ready\" | \"missing\" | \"error\";\n\nconst attachmentSnapshotFromNode = (node: { attrs?: Record<string, unknown> }): OpenEditorAttachmentSnapshot => ({\n attachmentId: typeof node.attrs?.attachmentId === \"string\" ? node.attrs.attachmentId : null,\n name: typeof node.attrs?.name === \"string\" ? node.attrs.name : \"\",\n mimeType: typeof node.attrs?.mimeType === \"string\" ? node.attrs.mimeType : null,\n size: typeof node.attrs?.size === \"number\" ? node.attrs.size : null,\n url: typeof node.attrs?.url === \"string\" ? node.attrs.url : null,\n});\n\nexport const formatAttachmentSize = (size: number | null) => {\n if (size === null || !Number.isFinite(size) || size < 0) return \"\";\n if (size < 1024) return `${size} B`;\n const units = [\"KB\", \"MB\", \"GB\", \"TB\"];\n let value = size / 1024;\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) { value /= 1024; unit += 1; }\n return `${value >= 10 ? value.toFixed(0) : value.toFixed(1)} ${units[unit]}`;\n};\n\nconst attachmentTypeLabel = (snapshot: OpenEditorAttachmentSnapshot) => {\n if (snapshot.mimeType) return snapshot.mimeType.split(\"/\").at(-1)?.toUpperCase() ?? snapshot.mimeType;\n const extension = snapshot.name.includes(\".\") ? snapshot.name.split(\".\").at(-1) : null;\n return extension?.toUpperCase() ?? \"FILE\";\n};\n\nconst AttachmentIcon = ({ snapshot }: { snapshot: OpenEditorAttachmentSnapshot }) => (\n <span aria-hidden=\"true\" className=\"oe-attachment-icon\"><span>{attachmentTypeLabel(snapshot).slice(0, 4)}</span></span>\n);\n\nconst OpenEditorAttachmentNodeView = ({ editor, node, updateAttributes, deleteNode }: ReactNodeViewProps) => {\n const runtime = use(OpenEditorAttachmentRuntimeContext);\n const durable = attachmentSnapshotFromNode(node);\n const [phase, setPhase] = useState<AttachmentPhase>(durable.attachmentId || durable.url ? \"ready\" : \"idle\");\n const [progress, setProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n const [input, setInput] = useState<OpenEditorAttachmentUploadInput | null>(null);\n const operationRef = useRef(0);\n const abortRef = useRef<AbortController | null>(null);\n\n const isCurrent = (operation: number) => operationRef.current === operation;\n const stopCurrent = () => { operationRef.current += 1; abortRef.current?.abort(); abortRef.current = null; };\n\n useEffect(() => () => stopCurrent(), []);\n\n const upload = async (selected: OpenEditorAttachmentUploadInput, replacing: boolean) => {\n if (!runtime?.uploadAttachment) return;\n stopCurrent();\n const operation = operationRef.current;\n const controller = new AbortController();\n abortRef.current = controller;\n setInput(selected);\n setProgress(0);\n setError(null);\n setPhase(\"uploading\");\n try {\n const validation = await runtime.validateAttachment?.(selected);\n if (!isCurrent(operation)) return;\n if (validation && !validation.accepted) throw new Error(validation.message);\n const callback = { signal: controller.signal, onProgress: (value: number) => {\n if (isCurrent(operation)) setProgress(Math.max(0, Math.min(1, value)));\n } };\n const uploaded = replacing && durable.attachmentId && runtime.replaceAttachment\n ? await runtime.replaceAttachment(durable.attachmentId, selected, callback)\n : await runtime.uploadAttachment(selected, callback);\n if (!isCurrent(operation)) return;\n updateAttributes(uploaded);\n setInput(null);\n setProgress(1);\n setPhase(\"ready\");\n } catch (cause) {\n if (!isCurrent(operation) || controller.signal.aborted) return;\n setError(cause instanceof Error ? cause.message : \"Upload failed.\");\n setPhase(\"error\");\n }\n };\n\n const selectAndUpload = async (replacing = false) => {\n if (!runtime?.selectAttachment || !runtime.uploadAttachment) return;\n stopCurrent();\n const operation = operationRef.current;\n const controller = new AbortController();\n abortRef.current = controller;\n setError(null);\n setPhase(\"selecting\");\n try {\n const selected = await runtime.selectAttachment({ signal: controller.signal });\n if (!isCurrent(operation)) return;\n if (!selected) { setPhase(durable.attachmentId || durable.url ? \"ready\" : \"idle\"); return; }\n await upload(selected, replacing);\n } catch (cause) {\n if (!isCurrent(operation) || controller.signal.aborted) return;\n setError(cause instanceof Error ? cause.message : \"Could not select a file.\");\n setPhase(\"error\");\n }\n };\n\n useEffect(() => {\n if (phase === \"idle\" && editor.isEditable && runtime?.selectAttachment && runtime.uploadAttachment) {\n void selectAndUpload();\n }\n }, []);\n\n const cancel = () => { stopCurrent(); setPhase(durable.attachmentId || durable.url ? \"ready\" : \"idle\"); };\n const remove = () => { stopCurrent(); deleteNode(); };\n const name = durable.name || input?.name || \"Choose a file\";\n const display = durable.name ? durable : { ...durable, name, mimeType: input?.mimeType ?? null, size: input?.size ?? null };\n const open = () => {\n if (runtime?.openAttachment) void runtime.openAttachment(durable);\n else if (durable.url) window.open(durable.url, \"_blank\", \"noopener,noreferrer\");\n };\n\n return <NodeViewWrapper className=\"oe-attachment\" data-state={phase}>\n <AttachmentIcon snapshot={display} />\n <div className=\"oe-attachment-body\">\n <input aria-label=\"File name\" className=\"oe-attachment-name\" disabled={!editor.isEditable || phase === \"uploading\"} value={name} onChange={(event) => updateAttributes({ name: event.target.value })} onBlur={() => {\n if (durable.attachmentId && durable.name) void runtime?.renameAttachment?.(durable.attachmentId, durable.name);\n }} />\n <div className=\"oe-attachment-meta\">{[formatAttachmentSize(display.size), attachmentTypeLabel(display)].filter(Boolean).join(\" · \")}</div>\n {phase === \"uploading\" ? <div className=\"oe-attachment-progress\" role=\"progressbar\" aria-label={`Uploading ${name}`} aria-valuemin={0} aria-valuemax={100} aria-valuenow={Math.round(progress * 100)}><span style={{ width: `${progress * 100}%` }} /></div> : null}\n {error ? <div className=\"oe-attachment-error\" role=\"alert\">{error}</div> : null}\n </div>\n <div className=\"oe-attachment-actions\" contentEditable={false}>\n {phase === \"uploading\" || phase === \"selecting\" ? <button onClick={cancel} type=\"button\">Cancel</button> : null}\n {phase === \"error\" && input ? <button onClick={() => void upload(input, Boolean(durable.attachmentId))} type=\"button\">Retry</button> : null}\n {(durable.attachmentId || durable.url) && phase !== \"uploading\" ? <button onClick={open} type=\"button\">Open</button> : null}\n {editor.isEditable && runtime?.selectAttachment && runtime.uploadAttachment && phase !== \"uploading\" ? <button onClick={() => void selectAndUpload(Boolean(durable.attachmentId))} type=\"button\">Replace</button> : null}\n {editor.isEditable ? <button aria-label={`Remove ${name}`} onClick={remove} type=\"button\">Remove</button> : null}\n </div>\n </NodeViewWrapper>;\n};\n\nconst Attachment = Node.create({\n name: \"attachment\",\n group: \"block\",\n atom: true,\n draggable: true,\n addAttributes: () => ({ attachmentId: { default: null }, name: { default: \"\" }, mimeType: { default: null }, size: { default: null }, url: { default: null } }),\n parseHTML: () => [{ tag: \"a[data-openeditor-attachment]\" }, { tag: \"div[data-openeditor-attachment]\" }],\n renderHTML: ({ node, HTMLAttributes }) => [\"a\", mergeAttributes(HTMLAttributes, { \"data-openeditor-attachment\": \"\", href: node.attrs.url ?? undefined, download: node.attrs.name || undefined }), node.attrs.name || \"Attachment\"],\n addNodeView() { return ReactNodeViewRenderer(OpenEditorAttachmentNodeView); },\n});\n\nconst OpenEditorAttachmentViewer = ({ node }: { node: ProseMirrorNode }) => {\n const runtime = use(OpenEditorAttachmentRuntimeContext);\n const cached = attachmentSnapshotFromNode(node);\n const [state, setState] = useState<{ phase: AttachmentPhase; snapshot: OpenEditorAttachmentSnapshot | null }>({ phase: cached.attachmentId && runtime?.resolveAttachment ? \"resolving\" : cached.url ? \"ready\" : \"missing\", snapshot: cached });\n useEffect(() => {\n const controller = new AbortController();\n if (cached.attachmentId && runtime?.resolveAttachment) {\n setState({ phase: \"resolving\", snapshot: cached });\n void runtime.resolveAttachment(cached.attachmentId, { signal: controller.signal }).then((snapshot) => {\n if (!controller.signal.aborted) setState({ phase: snapshot ? \"ready\" : \"missing\", snapshot });\n }).catch(() => { if (!controller.signal.aborted) setState({ phase: \"missing\", snapshot: null }); });\n } else setState({ phase: cached.url ? \"ready\" : \"missing\", snapshot: cached });\n return () => controller.abort();\n }, [cached.attachmentId, cached.url, runtime]);\n const snapshot = state.snapshot ?? cached;\n const content = <><AttachmentIcon snapshot={snapshot} /><span className=\"oe-attachment-body\"><strong className=\"oe-attachment-name\">{snapshot.name || \"Attachment unavailable\"}</strong><span className=\"oe-attachment-meta\">{state.phase === \"resolving\" ? \"Loading…\" : state.phase === \"missing\" ? \"Missing or inaccessible\" : [formatAttachmentSize(snapshot.size), attachmentTypeLabel(snapshot)].filter(Boolean).join(\" · \")}</span></span></>;\n if (state.phase === \"ready\" && runtime?.openAttachment) return <button className=\"oe-attachment oe-attachment-viewer\" onClick={() => void runtime.openAttachment?.(snapshot)} type=\"button\">{content}</button>;\n if (state.phase === \"ready\" && snapshot.url) return <a className=\"oe-attachment oe-attachment-viewer\" href={snapshot.url} rel=\"noreferrer\" target=\"_blank\">{content}</a>;\n return <div className=\"oe-attachment oe-attachment-viewer\" data-state={state.phase}>{content}</div>;\n};\n\nconst pageSnapshotFromNode = (node: {\n attrs?: Record<string, unknown>;\n content?: unknown;\n textContent?: string;\n}): OpenEditorPageSnapshot | null => {\n const pageId = typeof node.attrs?.pageId === \"string\" ? node.attrs.pageId : \"\";\n if (!pageId) return null;\n return {\n pageId,\n title: node.textContent || getNodeText(node as { content?: unknown[] }) || \"Untitled\",\n icon: normalizeEmoji(node.attrs?.icon, DEFAULT_PAGE_EMOJI),\n href: typeof node.attrs?.href === \"string\" ? node.attrs.href : null,\n };\n};\n\nconst OpenEditorPageNodeView = ({ editor, node, updateAttributes }: ReactNodeViewProps) => {\n const runtime = use(OpenEditorPageRuntimeContext);\n const [creating, setCreating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const snapshot = pageSnapshotFromNode(node);\n const icon = normalizeEmoji(node.attrs.icon, DEFAULT_PAGE_EMOJI);\n\n const openPage = () => {\n if (snapshot) void runtime?.openPage?.(snapshot);\n };\n\n const createPage = async () => {\n if (!runtime?.createPage || creating) return;\n setCreating(true);\n setError(null);\n try {\n const created = await runtime.createPage({ title: node.textContent || \"Untitled\", icon });\n updateAttributes({ pageId: created.pageId, icon: created.icon ?? icon, href: created.href ?? null });\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"Could not create the page.\");\n } finally {\n setCreating(false);\n }\n };\n\n const updateIcon = async (nextIcon: string) => {\n updateAttributes({ icon: nextIcon });\n if (!snapshot?.pageId || !runtime?.updatePageIcon) return;\n setError(null);\n try {\n await runtime.updatePageIcon(snapshot.pageId, nextIcon);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"Could not update the page icon.\");\n }\n };\n\n return (\n <NodeViewWrapper\n aria-label={snapshot ? `Open ${snapshot.title}` : undefined}\n className=\"oe-page\"\n data-page-id={snapshot?.pageId ?? \"\"}\n onClick={(event: MouseEvent<HTMLElement>) => {\n if ((event.target as Element).closest(\".oe-emoji-trigger\")) return;\n openPage();\n }}\n onKeyDown={(event: KeyboardEvent<HTMLElement>) => {\n if (snapshot && (event.key === \"Enter\" || event.key === \" \")) {\n event.preventDefault();\n openPage();\n }\n }}\n role={snapshot ? \"button\" : undefined}\n tabIndex={snapshot ? 0 : undefined}\n >\n <span contentEditable={false}>\n <OpenEditorEmojiPicker\n className=\"oe-page-icon-trigger\"\n disabled={!editor.isEditable}\n emoji={icon}\n label=\"Change page emoji\"\n onEmojiSelect={(nextIcon) => void updateIcon(nextIcon)}\n />\n </span>\n <NodeViewContent\n as=\"div\"\n className=\"oe-page-title\"\n contentEditable={false}\n />\n {!snapshot && runtime?.createPage && editor.isEditable ? (\n <button\n className=\"oe-page-action\"\n contentEditable={false}\n disabled={creating}\n onClick={() => void createPage()}\n type=\"button\"\n >\n {creating ? \"Creating…\" : \"Create page\"}\n </button>\n ) : null}\n {error ? <span className=\"oe-page-error\" contentEditable={false} role=\"alert\">{error}</span> : null}\n </NodeViewWrapper>\n );\n};\n\nconst Page = Node.create({\n name: \"page\",\n group: \"block\",\n content: \"inline*\",\n defining: true,\n addAttributes: () => ({\n pageId: { default: null },\n icon: { default: DEFAULT_PAGE_EMOJI },\n href: { default: null },\n }),\n parseHTML: () => [{ tag: \"div[data-openeditor-page]\" }, { tag: \"a[data-openeditor-page]\" }],\n renderHTML: ({ HTMLAttributes }) => [\n \"div\",\n mergeAttributes(HTMLAttributes, { \"data-openeditor-page\": \"\" }),\n 0,\n ],\n addNodeView() {\n return ReactNodeViewRenderer(OpenEditorPageNodeView);\n },\n});\n\nconst OpenEditorPageViewer = ({ node }: { node: ProseMirrorNode }) => {\n const runtime = use(OpenEditorPageRuntimeContext);\n const cached = pageSnapshotFromNode(node);\n const [resolved, setResolved] = useState<OpenEditorPageSnapshot | null>(null);\n\n useEffect(() => {\n let active = true;\n setResolved(null);\n if (cached?.pageId && runtime?.resolvePage) {\n void runtime.resolvePage(cached.pageId).then((page) => {\n if (active && page) setResolved(page);\n });\n }\n return () => { active = false; };\n }, [cached?.pageId, runtime]);\n\n const page = resolved ?? cached;\n const title = page?.title ?? (getNodeText(node) || \"Untitled\");\n const content = <><span className=\"oe-page-icon\" aria-hidden=\"true\">{normalizeEmoji(page?.icon, DEFAULT_PAGE_EMOJI)}</span><span className=\"oe-page-title\">{title}</span><span className=\"oe-page-arrow\" aria-hidden=\"true\">→</span></>;\n if (page && runtime?.openPage) {\n return <button className=\"oe-page oe-page-viewer\" onClick={() => void runtime.openPage?.(page)} type=\"button\">{content}</button>;\n }\n if (page?.href) {\n return <a className=\"oe-page oe-page-viewer\" href={page.href}>{content}</a>;\n }\n return <div className=\"oe-page oe-page-viewer\">{content}</div>;\n};\n\nconst MermaidPreview = ({ code }: { code: string }) => {\n const rendered = useMemo(() => {\n try {\n return {\n error: null,\n svg: renderMermaidSVG(code, {\n bg: \"var(--oe-surface, #ffffff)\",\n fg: \"var(--oe-text, #171717)\",\n accent: \"var(--oe-accent-strong, #171717)\",\n border: \"var(--oe-border-strong, #d4d4d4)\",\n muted: \"var(--oe-muted, #737373)\",\n surface: \"var(--oe-surface-muted, #f5f5f5)\",\n transparent: true,\n }),\n };\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : String(error),\n svg: null,\n };\n }\n }, [code]);\n\n return rendered.error ? (\n <pre className=\"oe-diagram-error\" role=\"alert\">{rendered.error}</pre>\n ) : (\n <div className=\"oe-diagram-preview\" dangerouslySetInnerHTML={{ __html: rendered.svg ?? \"\" }} />\n );\n};\n\nconst ToggleListViewerItem = ({ children, initiallyOpen }: { children: ReactNode; initiallyOpen: boolean }) => {\n const [open, setOpen] = useState(initiallyOpen);\n return (\n <li className=\"oe-toggle-list-item\" data-open={open ? \"true\" : \"false\"}>\n <button\n aria-expanded={open}\n aria-label={open ? \"Collapse toggle item\" : \"Expand toggle item\"}\n className=\"oe-toggle-list-trigger\"\n onClick={() => setOpen((current) => !current)}\n type=\"button\"\n >\n <span aria-hidden=\"true\" className=\"oe-toggle-list-chevron\">›</span>\n </button>\n <div className=\"oe-toggle-list-content\">{children}</div>\n </li>\n );\n};\n\nconst OpenEditorDiagramNodeView = ({ editor, node, updateAttributes }: ReactNodeViewProps) => {\n const code = typeof node.attrs.code === \"string\" ? node.attrs.code : \"\";\n return (\n <NodeViewWrapper className=\"oe-diagram\" contentEditable={false}>\n <MermaidPreview code={code} />\n {editor.isEditable ? (\n <textarea\n aria-label=\"Mermaid diagram source\"\n className=\"oe-diagram-source\"\n onChange={(event) => updateAttributes({ code: event.target.value })}\n spellCheck={false}\n value={code}\n />\n ) : null}\n </NodeViewWrapper>\n );\n};\n\nconst MermaidDiagram = Node.create({\n name: \"mermaidDiagram\",\n group: \"block\",\n atom: true,\n draggable: true,\n addAttributes: () => ({ code: { default: \"\" } }),\n parseHTML: () => [{ tag: \"figure[data-openeditor-diagram]\" }],\n renderHTML: ({ HTMLAttributes }) => [\n \"figure\",\n mergeAttributes(HTMLAttributes, { \"data-openeditor-diagram\": \"\" }),\n ],\n addNodeView() {\n return ReactNodeViewRenderer(OpenEditorDiagramNodeView);\n },\n});\n\nconst createEditorExtensions = (\n placeholder: string,\n customExtensions: readonly OpenEditorReactExtension[],\n) => [\n StarterKit.configure({ horizontalRule: false, link: false, underline: false }),\n Divider,\n Image.configure({ allowBase64: true }),\n Link.configure({ openOnClick: false }),\n Underline,\n TaskList,\n BaseUiTaskItem.configure({ nested: true }),\n Table.configure({\n resizable: true,\n HTMLAttributes: { \"data-openeditor-table\": \"\" },\n }),\n TableRow,\n TableHeader,\n TableCell,\n TextAlign.configure({ types: [\"heading\", \"paragraph\"] }),\n Placeholder.configure({ placeholder }),\n Columns,\n Column,\n ToggleList,\n ToggleListItem,\n Callout,\n Page,\n Attachment,\n MermaidDiagram,\n ...customExtensions.flatMap((extension) => extension.tiptapExtensions),\n];\n\nconst createReactBlockRegistry = (extensions: readonly OpenEditorReactExtension[]): BlockRegistry =>\n createBlockRegistry([\n ...defaultBlockRegistry.values(),\n ...extensions.map((extension) => extension.block),\n ]);\n\nconst createReactExporters = (extensions: readonly OpenEditorReactExtension[]): OpenEditorExporters => ({\n html: Object.assign({}, ...extensions.map((extension) => extension.exporters?.html ?? {})),\n text: Object.assign({}, ...extensions.map((extension) => extension.exporters?.text ?? {})),\n});\n\nconst getNodeText = (node: { text?: string; content?: unknown[] }): string =>\n node.text ?? node.content?.map((child) => getNodeText(child as { text?: string; content?: unknown[] })).join(\"\") ?? \"\";\n\nconst toOverlayRect = (coordinates: { left: number; right: number; top: number; bottom: number }): OpenEditorOverlayRect => ({\n left: coordinates.left,\n right: coordinates.right,\n top: coordinates.top,\n bottom: coordinates.bottom,\n width: coordinates.right - coordinates.left,\n height: coordinates.bottom - coordinates.top,\n});\n\nconst getSlashState = (editor: NonNullable<ReturnType<typeof useEditor>>): SlashState | null => {\n const { selection } = editor.state;\n\n if (!selection.empty) {\n return null;\n }\n\n const { $from } = selection;\n const textBeforeCursor = $from.parent.textBetween(0, $from.parentOffset, \"\\n\", \"\\n\");\n const match = /(?:^|\\s)\\/([\\w -]*)$/.exec(textBeforeCursor);\n\n if (!match) {\n return null;\n }\n\n const query = match[1] ?? \"\";\n const from = $from.pos - query.length - 1;\n const to = $from.pos;\n const coordinates = editor.view.coordsAtPos(to);\n const anchorRect = toOverlayRect(coordinates);\n\n return {\n query,\n from,\n to,\n left: coordinates.left,\n top: coordinates.bottom + 8,\n anchorRect,\n };\n};\n\nconst getSelectionBubbleState = (editor: NonNullable<ReturnType<typeof useEditor>>): SelectionBubbleState | null => {\n const { selection } = editor.state;\n\n if (selection instanceof NodeSelection && selection.node.type.name === \"horizontalRule\") {\n return null;\n }\n\n if (selection.empty) {\n return null;\n }\n\n const domSelection = typeof window === \"undefined\" ? null : window.getSelection();\n const selectedRange = domSelection?.rangeCount ? domSelection.getRangeAt(0) : null;\n const selectedRect = selectedRange?.getBoundingClientRect();\n\n if (\n selectedRange &&\n editor.view.dom.contains(selectedRange.commonAncestorContainer) &&\n selectedRect &&\n selectedRect.width > 0 &&\n selectedRect.height > 0\n ) {\n return {\n left: selectedRect.left + selectedRect.width / 2,\n top: selectedRect.top,\n anchorRect: toOverlayRect(selectedRect),\n };\n }\n\n const fromCoordinates = editor.view.coordsAtPos(selection.from);\n const toCoordinates = editor.view.coordsAtPos(selection.to);\n const anchorRect = toOverlayRect({\n left: Math.min(fromCoordinates.left, toCoordinates.left),\n right: Math.max(fromCoordinates.right, toCoordinates.right),\n top: Math.min(fromCoordinates.top, toCoordinates.top),\n bottom: Math.max(fromCoordinates.bottom, toCoordinates.bottom),\n });\n\n return {\n left: (fromCoordinates.left + toCoordinates.right) / 2,\n top: Math.min(fromCoordinates.top, toCoordinates.top) - 8,\n anchorRect,\n };\n};\n\nconst getSelectedTopLevelIndex = (editor: NonNullable<ReturnType<typeof useEditor>>) => {\n const { $from } = editor.state.selection;\n const selectedTopLevelPosition = $from.depth > 0 ? $from.before(1) : 0;\n let selectedIndex = 0;\n\n editor.state.doc.forEach((_, offset, index) => {\n if (offset <= selectedTopLevelPosition) {\n selectedIndex = index;\n }\n });\n\n return selectedIndex;\n};\n\nexport const useOpenEditorController = ({\n initialDocument = seedDocument,\n editable = true,\n placeholder = \"Start writing...\",\n onChange,\n onFilePasteDrop,\n pageRuntime,\n attachmentRuntime,\n slashMenuItems = [],\n extensions = EMPTY_EXTENSIONS,\n}: OpenEditorReactProps = {}): OpenEditorController => {\n const [document, setDocument] = useState(normalizeDocument(initialDocument));\n const [selectedBlock, setSelectedBlock] = useState(\"paragraph\");\n const [slashState, setSlashState] = useState<SlashState | null>(null);\n const [selectionBubbleState, setSelectionBubbleState] = useState<SelectionBubbleState | null>(null);\n const slashStateRef = useRef<SlashState | null>(null);\n const selectionBubbleStateRef = useRef<SelectionBubbleState | null>(null);\n const registry = useMemo(() => createReactBlockRegistry(extensions), [extensions]);\n const exporters = useMemo(() => createReactExporters(extensions), [extensions]);\n const editor = useEditor({\n immediatelyRender: false,\n extensions: createEditorExtensions(placeholder, extensions),\n content: toProseMirrorDocument(normalizeDocument(initialDocument)),\n editable,\n editorProps: {\n attributes: {\n class: \"oe-prosemirror\",\n \"aria-label\": \"OpenEditor document\",\n },\n transformPastedHTML: sanitizePastedHtml,\n handlePaste: (_view, event) => {\n const file = event.clipboardData?.files?.[0];\n\n if (!file || !onFilePasteDrop?.(file)) {\n return false;\n }\n\n event.preventDefault();\n return true;\n },\n handleDrop: (_view, event, _slice, moved) => {\n const file = event.dataTransfer?.files?.[0];\n\n if (moved || !file || !onFilePasteDrop?.(file)) {\n return false;\n }\n\n event.preventDefault();\n return true;\n },\n },\n onUpdate: ({ editor: currentEditor }) => {\n const nextDocument = normalizeDocument(\n fromProseMirrorDocument(\n currentEditor.getJSON(),\n initialDocument.meta,\n ),\n );\n setDocument(nextDocument);\n onChange?.(nextDocument);\n setSlashState(getSlashState(currentEditor));\n setSelectionBubbleState(getSelectionBubbleState(currentEditor));\n },\n onSelectionUpdate: ({ editor: currentEditor }) => {\n setSlashState(getSlashState(currentEditor));\n setSelectionBubbleState(getSelectionBubbleState(currentEditor));\n },\n }, [extensions]);\n const exports = useMemo(\n () => toExportBundle(document, exporters),\n [document, exporters],\n );\n\n useEffect(() => {\n slashStateRef.current = slashState;\n }, [slashState]);\n\n useEffect(() => {\n selectionBubbleStateRef.current = selectionBubbleState;\n }, [selectionBubbleState]);\n\n useEffect(() => {\n if (!editor || typeof window === \"undefined\") {\n return;\n }\n\n let animationFrame = 0;\n\n const refreshOverlayAnchors = () => {\n if (!slashStateRef.current && !selectionBubbleStateRef.current) {\n return;\n }\n\n window.cancelAnimationFrame(animationFrame);\n animationFrame = window.requestAnimationFrame(() => {\n if (slashStateRef.current) {\n setSlashState(getSlashState(editor));\n }\n\n if (selectionBubbleStateRef.current) {\n setSelectionBubbleState(getSelectionBubbleState(editor));\n }\n });\n };\n\n window.addEventListener(\"scroll\", refreshOverlayAnchors, true);\n window.addEventListener(\"resize\", refreshOverlayAnchors);\n\n return () => {\n window.cancelAnimationFrame(animationFrame);\n window.removeEventListener(\"scroll\", refreshOverlayAnchors, true);\n window.removeEventListener(\"resize\", refreshOverlayAnchors);\n };\n }, [editor]);\n\n const insertBlock = (blockName = selectedBlock, range?: InsertRange) => {\n if (!editor) {\n return false;\n }\n\n const block = resolveOpenEditorInsertBlock(blockName, registry);\n if (!block) return false;\n\n const chain = () => {\n const commandChain = editor.chain().focus();\n return range ? commandChain.deleteRange(range) : commandChain;\n };\n\n const inserted = chain().insertContent(block).run();\n if (inserted) setSlashState(null);\n return inserted;\n };\n\n const setDocumentContent = (content: OpenEditorDocument[\"content\"]) => {\n if (!editor) {\n return;\n }\n\n editor.commands.setContent(toProseMirrorDocument(normalizeDocument({ ...document, content })));\n };\n\n const setContent = (nextDocument: OpenEditorDocument) => {\n if (!editor) {\n return;\n }\n\n editor.commands.setContent(toProseMirrorDocument(normalizeDocument(nextDocument)));\n };\n\n const moveSelectedBlock = (direction: -1 | 1) => {\n if (!editor) {\n return;\n }\n\n const currentDocument = normalizeDocument(fromProseMirrorDocument(editor.getJSON(), document.meta));\n const selectedIndex = getSelectedTopLevelIndex(editor);\n const nextIndex = selectedIndex + direction;\n\n if (nextIndex < 0 || nextIndex >= currentDocument.content.length) {\n return;\n }\n\n setDocumentContent(moveTopLevelBlock(currentDocument, selectedIndex, nextIndex).content);\n };\n\n const duplicateSelectedBlock = () => {\n if (!editor) {\n return;\n }\n\n const currentDocument = normalizeDocument(fromProseMirrorDocument(editor.getJSON(), document.meta));\n const selectedIndex = getSelectedTopLevelIndex(editor);\n setDocumentContent(duplicateTopLevelBlock(currentDocument, selectedIndex).content);\n };\n\n const deleteSelectedBlock = () => {\n if (!editor) {\n return;\n }\n\n const currentDocument = normalizeDocument(fromProseMirrorDocument(editor.getJSON(), document.meta));\n const selectedIndex = getSelectedTopLevelIndex(editor);\n setDocumentContent(deleteTopLevelBlock(currentDocument, selectedIndex).content);\n };\n\n const setLink = (url?: string | null) => {\n if (!editor) {\n return;\n }\n\n if (!url) {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n return;\n }\n\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href: url }).run();\n };\n\n const setParagraph = () => {\n editor?.chain().focus().setParagraph().run();\n };\n\n const toggleHeading = (level: 1 | 2 | 3 | 4 | 5 | 6) => {\n editor?.chain().focus().toggleHeading({ level }).run();\n };\n\n const toggleBold = () => {\n editor?.chain().focus().toggleBold().run();\n };\n\n const toggleItalic = () => {\n editor?.chain().focus().toggleItalic().run();\n };\n\n const toggleUnderline = () => {\n editor?.chain().focus().toggleUnderline().run();\n };\n\n const toggleStrike = () => {\n editor?.chain().focus().toggleStrike().run();\n };\n\n const toggleInlineCode = () => {\n editor?.chain().focus().toggleCode().run();\n };\n\n const toggleBulletList = () => {\n editor?.chain().focus().toggleBulletList().run();\n };\n\n const toggleOrderedList = () => {\n editor?.chain().focus().toggleOrderedList().run();\n };\n\n const toggleTaskList = () => {\n editor?.chain().focus().toggleTaskList().run();\n };\n\n const toggleBlockquote = () => {\n editor?.chain().focus().toggleBlockquote().run();\n };\n\n const toggleCodeBlock = () => {\n editor?.chain().focus().toggleCodeBlock().run();\n };\n\n const undo = () => {\n editor?.chain().focus().undo().run();\n };\n\n const redo = () => {\n editor?.chain().focus().redo().run();\n };\n\n const controller: InternalOpenEditorController = {\n document,\n editor,\n exports,\n editable,\n placeholder,\n selectedBlock,\n setSelectedBlock,\n getContent: () => document,\n setContent,\n setParagraph,\n toggleHeading,\n toggleBold,\n toggleItalic,\n toggleUnderline,\n toggleStrike,\n toggleInlineCode,\n toggleBulletList,\n toggleOrderedList,\n toggleTaskList,\n toggleBlockquote,\n toggleCodeBlock,\n undo,\n redo,\n insertBlock,\n setLink,\n getActiveLink: () => editor?.getAttributes(\"link\").href as string | undefined,\n moveSelectedBlock,\n duplicateSelectedBlock,\n deleteSelectedBlock,\n slashMenuItems,\n extensions,\n pageRuntime,\n attachmentRuntime,\n slashState,\n selectionBubbleState,\n };\n\n return controller;\n};\n\nexport const getDefaultSlashMenuItems = (controller: OpenEditorController): OpenEditorSlashMenuItem[] => {\n const internalController = controller as InternalOpenEditorController;\n\n return [\n ...openEditorInsertPresets.map((preset) => ({\n key: preset.key,\n label: preset.label,\n group: preset.group,\n keywords: [preset.key],\n execute: ({ controller: current, range }: { controller: OpenEditorController; range: InsertRange }) =>\n current.insertBlock(preset.key, range),\n })),\n {\n key: \"moveBlockUp\",\n label: \"Move Block Up\",\n group: \"block\",\n execute: ({ range }) => {\n if (!internalController.editor) return false;\n internalController.editor.chain().focus().deleteRange(range).run();\n controller.moveSelectedBlock(-1);\n return true;\n },\n },\n {\n key: \"moveBlockDown\",\n label: \"Move Block Down\",\n group: \"block\",\n execute: ({ range }) => {\n if (!internalController.editor) return false;\n internalController.editor.chain().focus().deleteRange(range).run();\n controller.moveSelectedBlock(1);\n return true;\n },\n },\n ...controller.extensions\n .filter((extension) => extension.slashMenu !== false)\n .map((extension) => {\n const menu = extension.slashMenu || undefined;\n return {\n key: extension.block.name,\n label: menu?.label ?? extension.block.label,\n group: menu?.group ?? extension.block.group,\n keywords: menu?.keywords ?? [extension.block.name],\n execute: ({ controller: current, range }: { controller: OpenEditorController; range: InsertRange }) =>\n current.insertBlock(extension.block.name, range),\n };\n }),\n ...controller.slashMenuItems,\n ];\n};\n\nconst renderTextWithMarks = (\n text: string,\n marks: readonly ProseMirrorMark[] = [],\n key: string,\n): ReactNode =>\n marks.reduceRight<ReactNode>((children, mark, index) => {\n const nodeKey = `${key}-${mark.type}-${index}`;\n switch (mark.type) {\n case \"bold\":\n return <strong key={nodeKey}>{children}</strong>;\n case \"italic\":\n return <em key={nodeKey}>{children}</em>;\n case \"underline\":\n return <u key={nodeKey}>{children}</u>;\n case \"strike\":\n return <s key={nodeKey}>{children}</s>;\n case \"code\":\n return <code key={nodeKey}>{children}</code>;\n case \"link\":\n return (\n <a key={nodeKey} href={typeof mark.attrs?.href === \"string\" ? mark.attrs.href : undefined}>\n {children}\n </a>\n );\n default:\n return children;\n }\n }, text);\n\nconst renderViewerNode = (\n node: ProseMirrorNode,\n key: string,\n renderers?: Partial<Record<string, OpenEditorViewerRenderer>>,\n registry: BlockRegistry = defaultBlockRegistry,\n): ReactNode => {\n if (node.type === \"text\") {\n return renderTextWithMarks(node.text ?? \"\", node.marks, key);\n }\n\n const children = node.content?.map((child, index) => renderViewerNode(child, `${key}-${index}`, renderers, registry)) ?? null;\n const blockKey = findBlockSpecForNode(registry, node)?.name ?? node.type;\n const customRenderer = renderers?.[blockKey];\n if (customRenderer) {\n return <Fragment key={key}>{customRenderer({ node, children })}</Fragment>;\n }\n\n switch (blockKey) {\n case \"paragraph\":\n return <p key={key}>{children}</p>;\n case \"heading\": {\n const level = typeof node.attrs?.level === \"number\" ? Math.min(Math.max(node.attrs.level, 1), 6) : 2;\n switch (level) {\n case 1:\n return <h1 key={key}>{children}</h1>;\n case 2:\n return <h2 key={key}>{children}</h2>;\n case 3:\n return <h3 key={key}>{children}</h3>;\n case 4:\n return <h4 key={key}>{children}</h4>;\n case 5:\n return <h5 key={key}>{children}</h5>;\n default:\n return <h6 key={key}>{children}</h6>;\n }\n }\n case \"bulletList\":\n return <ul key={key}>{children}</ul>;\n case \"orderedList\":\n return <ol key={key}>{children}</ol>;\n case \"taskList\":\n return <ul key={key} data-type=\"taskList\">{children}</ul>;\n case \"blockquote\":\n return <blockquote key={key}>{children}</blockquote>;\n case \"codeBlock\":\n return <pre key={key}><code>{node.content?.map((child) => child.text ?? \"\").join(\"\")}</code></pre>;\n case \"divider\":\n return <hr key={key} />;\n case \"image\":\n return <img key={key} src={typeof node.attrs?.src === \"string\" ? node.attrs.src : \"\"} alt={typeof node.attrs?.alt === \"string\" ? node.attrs.alt : \"\"} />;\n case \"columns\":\n return <section key={key}>{children}</section>;\n case \"table\":\n return <table data-openeditor-table=\"\" key={key}><tbody>{children}</tbody></table>;\n case \"toggleList\":\n return <ul key={key} data-openeditor-toggle-list>{children}</ul>;\n case \"callout\":\n return <aside key={key} className=\"oe-callout\"><span aria-hidden=\"true\" className=\"oe-callout-emoji\">{normalizeEmoji(node.attrs?.emoji, DEFAULT_CALLOUT_EMOJI)}</span><div className=\"oe-callout-content\">{children}</div></aside>;\n case \"diagram\": {\n const code = typeof node.attrs?.code === \"string\" ? node.attrs.code : \"\";\n return <figure key={key} className=\"oe-diagram\"><MermaidPreview code={code} /></figure>;\n }\n case \"page\":\n return <OpenEditorPageViewer key={key} node={node} />;\n case \"attachment\":\n return <OpenEditorAttachmentViewer key={key} node={node} />;\n default:\n if (node.type === \"column\") {\n return <div key={key}>{children}</div>;\n }\n if (node.type === \"tableRow\") {\n return <tr key={key}>{children}</tr>;\n }\n if (node.type === \"tableHeader\") {\n return <th key={key}>{children}</th>;\n }\n if (node.type === \"tableCell\") {\n return <td key={key}>{children}</td>;\n }\n if (node.type === \"listItem\") {\n return <li key={key}>{children}</li>;\n }\n if (node.type === \"taskItem\") {\n const checked = Boolean(node.attrs?.checked);\n return (\n <li key={key} data-checked={checked ? \"true\" : \"false\"}>\n <span className=\"oe-task-item-checkbox\" aria-hidden=\"true\">\n <OpenEditorTaskCheckbox checked={checked} label=\"Task item checkbox\" readOnly tabIndex={-1} />\n </span>\n <div>{children}</div>\n </li>\n );\n }\n if (node.type === \"toggleListItem\") {\n return <ToggleListViewerItem initiallyOpen={node.attrs?.open !== false} key={key}>{children}</ToggleListViewerItem>;\n }\n if (node.type === \"hardBreak\") {\n return <br key={key} />;\n }\n return <div key={key}>{children}</div>;\n }\n};\n\nexport const OpenEditorContent = ({\n controller,\n className = \"oe-canvas\",\n}: OpenEditorContentProps) => {\n const internalController = controller as InternalOpenEditorController;\n return (\n <OpenEditorAttachmentRuntimeContext.Provider value={internalController.attachmentRuntime}>\n <OpenEditorPageRuntimeContext.Provider value={internalController.pageRuntime}>\n <EditorContent editor={internalController.editor} className={className} />\n </OpenEditorPageRuntimeContext.Provider>\n </OpenEditorAttachmentRuntimeContext.Provider>\n );\n};\n\nexport const OpenEditorViewer = ({\n document,\n className = \"oe-viewer\",\n renderers,\n extensions = EMPTY_EXTENSIONS,\n pageRuntime,\n attachmentRuntime,\n}: OpenEditorViewerProps) => {\n const registry = createReactBlockRegistry(extensions);\n const extensionRenderers = Object.fromEntries(\n extensions.map((extension) => [extension.block.name, extension.viewer]),\n );\n const mergedRenderers = { ...extensionRenderers, ...renderers };\n\n return (\n <OpenEditorAttachmentRuntimeContext.Provider value={attachmentRuntime}>\n <OpenEditorPageRuntimeContext.Provider value={pageRuntime}>\n <div className={className}>\n {normalizeDocument(document).content.map((node, index) =>\n renderViewerNode(node, `viewer-${index}`, mergedRenderers, registry),\n )}\n </div>\n </OpenEditorPageRuntimeContext.Provider>\n </OpenEditorAttachmentRuntimeContext.Provider>\n );\n};\n\nexport const useOpenEditor = useOpenEditorController;\nexport { seedDocument };\nexport { NodeViewContent, NodeViewWrapper };\nexport type { ReactNodeViewProps as OpenEditorNodeViewProps };\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openeditor/react",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.14",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"repository": {
|
|
@@ -25,9 +25,10 @@
|
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@base-ui/react": "^1.6.0",
|
|
28
|
-
"@openeditor/core": "0.0.
|
|
29
|
-
"@openeditor/
|
|
30
|
-
"@openeditor/
|
|
28
|
+
"@openeditor/core": "0.0.14",
|
|
29
|
+
"@openeditor/emoji": "0.0.14",
|
|
30
|
+
"@openeditor/exporters": "0.0.14",
|
|
31
|
+
"@openeditor/extensions": "0.0.14",
|
|
31
32
|
"@tiptap/core": "3.27.1",
|
|
32
33
|
"@tiptap/extension-horizontal-rule": "3.27.1",
|
|
33
34
|
"@tiptap/extension-image": "3.27.1",
|