@pilotiq/tiptap 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +67 -0
- package/dist/Block.d.ts +47 -0
- package/dist/Block.d.ts.map +1 -0
- package/dist/Block.js +56 -0
- package/dist/Block.js.map +1 -0
- package/dist/MentionProvider.d.ts +97 -0
- package/dist/MentionProvider.d.ts.map +1 -0
- package/dist/MentionProvider.js +104 -0
- package/dist/MentionProvider.js.map +1 -0
- package/dist/RichTextField.d.ts +286 -0
- package/dist/RichTextField.d.ts.map +1 -0
- package/dist/RichTextField.js +369 -0
- package/dist/RichTextField.js.map +1 -0
- package/dist/extensions/BlockNodeExtension.d.ts +41 -0
- package/dist/extensions/BlockNodeExtension.d.ts.map +1 -0
- package/dist/extensions/BlockNodeExtension.js +103 -0
- package/dist/extensions/BlockNodeExtension.js.map +1 -0
- package/dist/extensions/DragHandleExtension.d.ts +19 -0
- package/dist/extensions/DragHandleExtension.d.ts.map +1 -0
- package/dist/extensions/DragHandleExtension.js +166 -0
- package/dist/extensions/DragHandleExtension.js.map +1 -0
- package/dist/extensions/GridExtension.d.ts +49 -0
- package/dist/extensions/GridExtension.d.ts.map +1 -0
- package/dist/extensions/GridExtension.js +105 -0
- package/dist/extensions/GridExtension.js.map +1 -0
- package/dist/extensions/MentionExtension.d.ts +71 -0
- package/dist/extensions/MentionExtension.d.ts.map +1 -0
- package/dist/extensions/MentionExtension.js +165 -0
- package/dist/extensions/MentionExtension.js.map +1 -0
- package/dist/extensions/MergeTagExtension.d.ts +24 -0
- package/dist/extensions/MergeTagExtension.d.ts.map +1 -0
- package/dist/extensions/MergeTagExtension.js +57 -0
- package/dist/extensions/MergeTagExtension.js.map +1 -0
- package/dist/extensions/SlashCommandExtension.d.ts +71 -0
- package/dist/extensions/SlashCommandExtension.d.ts.map +1 -0
- package/dist/extensions/SlashCommandExtension.js +244 -0
- package/dist/extensions/SlashCommandExtension.js.map +1 -0
- package/dist/extensions/TextSizeMarks.d.ts +33 -0
- package/dist/extensions/TextSizeMarks.d.ts.map +1 -0
- package/dist/extensions/TextSizeMarks.js +47 -0
- package/dist/extensions/TextSizeMarks.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +18 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +25 -0
- package/dist/plugin.js.map +1 -0
- package/dist/react/BlockNodeView.d.ts +19 -0
- package/dist/react/BlockNodeView.d.ts.map +1 -0
- package/dist/react/BlockNodeView.js +60 -0
- package/dist/react/BlockNodeView.js.map +1 -0
- package/dist/react/BlockSidePanel.d.ts +105 -0
- package/dist/react/BlockSidePanel.d.ts.map +1 -0
- package/dist/react/BlockSidePanel.js +339 -0
- package/dist/react/BlockSidePanel.js.map +1 -0
- package/dist/react/FloatingToolbar.d.ts +13 -0
- package/dist/react/FloatingToolbar.d.ts.map +1 -0
- package/dist/react/FloatingToolbar.js +113 -0
- package/dist/react/FloatingToolbar.js.map +1 -0
- package/dist/react/MentionMenu.d.ts +26 -0
- package/dist/react/MentionMenu.d.ts.map +1 -0
- package/dist/react/MentionMenu.js +64 -0
- package/dist/react/MentionMenu.js.map +1 -0
- package/dist/react/Palette.d.ts +26 -0
- package/dist/react/Palette.d.ts.map +1 -0
- package/dist/react/Palette.js +21 -0
- package/dist/react/Palette.js.map +1 -0
- package/dist/react/SlashMenu.d.ts +24 -0
- package/dist/react/SlashMenu.d.ts.map +1 -0
- package/dist/react/SlashMenu.js +74 -0
- package/dist/react/SlashMenu.js.map +1 -0
- package/dist/react/TableFloatingToolbar.d.ts +7 -0
- package/dist/react/TableFloatingToolbar.d.ts.map +1 -0
- package/dist/react/TableFloatingToolbar.js +108 -0
- package/dist/react/TableFloatingToolbar.js.map +1 -0
- package/dist/react/TiptapEditor.d.ts +20 -0
- package/dist/react/TiptapEditor.d.ts.map +1 -0
- package/dist/react/TiptapEditor.js +398 -0
- package/dist/react/TiptapEditor.js.map +1 -0
- package/dist/react/Toolbar.d.ts +45 -0
- package/dist/react/Toolbar.d.ts.map +1 -0
- package/dist/react/Toolbar.js +204 -0
- package/dist/react/Toolbar.js.map +1 -0
- package/dist/react/toolbarButtons.d.ts +36 -0
- package/dist/react/toolbarButtons.d.ts.map +1 -0
- package/dist/react/toolbarButtons.js +300 -0
- package/dist/react/toolbarButtons.js.map +1 -0
- package/dist/register.d.ts +20 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +27 -0
- package/dist/register.js.map +1 -0
- package/dist/render.d.ts +89 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +439 -0
- package/dist/render.js.map +1 -0
- package/package.json +92 -0
- package/src/Block.ts +75 -0
- package/src/MentionProvider.ts +153 -0
- package/src/RichTextField.test.ts +447 -0
- package/src/RichTextField.ts +508 -0
- package/src/extensions/BlockNodeExtension.ts +134 -0
- package/src/extensions/DragHandleExtension.ts +184 -0
- package/src/extensions/GridExtension.test.ts +31 -0
- package/src/extensions/GridExtension.ts +138 -0
- package/src/extensions/MentionExtension.ts +248 -0
- package/src/extensions/MergeTagExtension.ts +75 -0
- package/src/extensions/SlashCommandExtension.test.ts +147 -0
- package/src/extensions/SlashCommandExtension.ts +332 -0
- package/src/extensions/TextSizeMarks.ts +73 -0
- package/src/index.ts +28 -0
- package/src/plugin.test.ts +19 -0
- package/src/plugin.ts +26 -0
- package/src/react/BlockNodeView.tsx +99 -0
- package/src/react/BlockSidePanel.test.ts +412 -0
- package/src/react/BlockSidePanel.tsx +451 -0
- package/src/react/FloatingToolbar.tsx +304 -0
- package/src/react/MentionMenu.tsx +120 -0
- package/src/react/Palette.tsx +86 -0
- package/src/react/SlashMenu.tsx +129 -0
- package/src/react/TableFloatingToolbar.tsx +154 -0
- package/src/react/TiptapEditor.tsx +535 -0
- package/src/react/Toolbar.tsx +438 -0
- package/src/react/toolbarButtons.tsx +579 -0
- package/src/register.test.ts +14 -0
- package/src/register.ts +27 -0
- package/src/render.test.ts +745 -0
- package/src/render.ts +480 -0
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
+
import { useEditor, EditorContent } from '@tiptap/react';
|
|
4
|
+
import StarterKit from '@tiptap/starter-kit';
|
|
5
|
+
import Placeholder from '@tiptap/extension-placeholder';
|
|
6
|
+
import Subscript from '@tiptap/extension-subscript';
|
|
7
|
+
import Superscript from '@tiptap/extension-superscript';
|
|
8
|
+
import TextAlign from '@tiptap/extension-text-align';
|
|
9
|
+
import { TextStyle } from '@tiptap/extension-text-style';
|
|
10
|
+
import { Color } from '@tiptap/extension-color';
|
|
11
|
+
import Highlight from '@tiptap/extension-highlight';
|
|
12
|
+
import Image from '@tiptap/extension-image';
|
|
13
|
+
import { Table, TableRow, TableCell, TableHeader } from '@tiptap/extension-table';
|
|
14
|
+
import { Details, DetailsSummary, DetailsContent } from '@tiptap/extension-details';
|
|
15
|
+
import { Grid, GridColumn } from '../extensions/GridExtension.js';
|
|
16
|
+
import { Popover } from '@base-ui/react/popover';
|
|
17
|
+
import { BlockNodeExtension } from '../extensions/BlockNodeExtension.js';
|
|
18
|
+
import { SlashCommandExtension, } from '../extensions/SlashCommandExtension.js';
|
|
19
|
+
import { DragHandleExtension } from '../extensions/DragHandleExtension.js';
|
|
20
|
+
import { MergeTagExtension } from '../extensions/MergeTagExtension.js';
|
|
21
|
+
import { LeadMarkExtension, SmallMarkExtension } from '../extensions/TextSizeMarks.js';
|
|
22
|
+
import { MentionExtension, } from '../extensions/MentionExtension.js';
|
|
23
|
+
import { SlashMenu } from './SlashMenu.js';
|
|
24
|
+
import { MentionMenu } from './MentionMenu.js';
|
|
25
|
+
import { FloatingToolbar } from './FloatingToolbar.js';
|
|
26
|
+
import { TableFloatingToolbar } from './TableFloatingToolbar.js';
|
|
27
|
+
import { Toolbar, AttachFilesDialog, useEditorTick } from './Toolbar.js';
|
|
28
|
+
import { BlockSidePanel } from './BlockSidePanel.js';
|
|
29
|
+
/**
|
|
30
|
+
* The pilotiq field renderer for `RichTextField`. Registered globally via
|
|
31
|
+
* `registerTiptap()`; pilotiq's `SchemaRenderer` looks it up by `fieldType:
|
|
32
|
+
* 'richtext'` and mounts it inline inside the form.
|
|
33
|
+
*
|
|
34
|
+
* Wiring (Phase A):
|
|
35
|
+
* - StarterKit + Underline + Subscript + Superscript + TextAlign
|
|
36
|
+
* - Placeholder
|
|
37
|
+
* - BlockNodeExtension (custom-block storage + React NodeView)
|
|
38
|
+
* - SlashCommandExtension (`/` opens menu, items derived from `blocks`)
|
|
39
|
+
* - DragHandleExtension (hover gutter handle)
|
|
40
|
+
*
|
|
41
|
+
* Form integration: a hidden `<input type="hidden" name={field}>` carries
|
|
42
|
+
* the editor's serialized output. Storage format depends on the field's
|
|
43
|
+
* `.storage('json' | 'html')` setting — JSON parses on the server,
|
|
44
|
+
* HTML is passed through.
|
|
45
|
+
*/
|
|
46
|
+
export function TiptapEditor(props) {
|
|
47
|
+
// useEditor + ProseMirror touch the DOM during construction — render a
|
|
48
|
+
// static placeholder during SSR so Vike's first paint doesn't crash.
|
|
49
|
+
// Hydration mounts the real editor on the client.
|
|
50
|
+
const [mounted, setMounted] = useState(false);
|
|
51
|
+
useEffect(() => { setMounted(true); }, []);
|
|
52
|
+
if (!mounted) {
|
|
53
|
+
const storage = props.el['storage'] ?? 'json';
|
|
54
|
+
const initialValue = serializeForHidden(props.defaultValue, storage);
|
|
55
|
+
return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("input", { type: "hidden", name: props.name, value: initialValue }), _jsx("div", { className: "prose prose-sm max-w-none min-h-[180px] rounded-md border border-input bg-transparent px-10 py-3 text-sm text-muted-foreground", children: props.placeholder ?? 'Start writing…' })] }));
|
|
56
|
+
}
|
|
57
|
+
return _jsx(ClientEditor, { ...props });
|
|
58
|
+
}
|
|
59
|
+
function ClientEditor(props) {
|
|
60
|
+
const { el, name, defaultValue, placeholder, disabled } = props;
|
|
61
|
+
const blocks = el['blocks'] ?? [];
|
|
62
|
+
const slashEnabled = el['slashCommand'] ?? true;
|
|
63
|
+
const toolbarGroups = el['toolbarGroups'] ?? null;
|
|
64
|
+
const floatingEnabled = el['floatingToolbar'] ?? true;
|
|
65
|
+
const storage = el['storage'] ?? 'json';
|
|
66
|
+
const textColors = el['textColors'] ?? [];
|
|
67
|
+
const customTextColors = el['customTextColors'] ?? false;
|
|
68
|
+
const highlightColors = el['highlightColors'] ?? [];
|
|
69
|
+
const resizableImages = el['resizableImages'] ?? false;
|
|
70
|
+
const uploadUrl = el['uploadUrl'];
|
|
71
|
+
const acceptedFileTypes = el['fileAttachmentsAcceptedFileTypes'];
|
|
72
|
+
const maxAttachmentSize = el['fileAttachmentsMaxSize'];
|
|
73
|
+
const attachmentDir = el['fileAttachmentsDirectory'];
|
|
74
|
+
const attachmentVis = el['fileAttachmentsVisibility'];
|
|
75
|
+
const mergeTags = el['mergeTags'] ?? [];
|
|
76
|
+
const mentionProviders = el['mentions'] ?? [];
|
|
77
|
+
const mentionsUrl = el['mentionsUrl'];
|
|
78
|
+
const initialContent = parseInitialContent(defaultValue);
|
|
79
|
+
const [serialized, setSerialized] = useState(() => serializeForHidden(initialContent, storage));
|
|
80
|
+
const debounceRef = useRef(null);
|
|
81
|
+
// Slash-menu state. `rawState` is what the extension last emitted.
|
|
82
|
+
// `dismissed` is the Escape latch — while true, the popover stays hidden
|
|
83
|
+
// even if the suggestion plugin keeps firing onUpdate. It clears when the
|
|
84
|
+
// suggestion plugin formally exits (cursor leaves the slash range).
|
|
85
|
+
const [rawState, setRawState] = useState(null);
|
|
86
|
+
const [dismissed, setDismissed] = useState(false);
|
|
87
|
+
const slashState = dismissed ? null : rawState;
|
|
88
|
+
const slashKeyRef = useRef(null);
|
|
89
|
+
const handleStateChange = useCallback((s) => {
|
|
90
|
+
if (s === null)
|
|
91
|
+
setDismissed(false);
|
|
92
|
+
setRawState(s);
|
|
93
|
+
}, []);
|
|
94
|
+
// Mention popover state — symmetrical to slash, with its own dismiss latch
|
|
95
|
+
// so Escape closes the mention popup without affecting slash.
|
|
96
|
+
const [rawMentionState, setRawMentionState] = useState(null);
|
|
97
|
+
const [mentionDismissed, setMentionDismissed] = useState(false);
|
|
98
|
+
const mentionState = mentionDismissed ? null : rawMentionState;
|
|
99
|
+
const mentionKeyRef = useRef(null);
|
|
100
|
+
// Lifted upload-dialog state — the toolbar's `attachFiles` button and the
|
|
101
|
+
// slash menu's "Image" entry both flip this flag. Single source of truth
|
|
102
|
+
// keeps the dialog mounted in one place (inside `Toolbar`) regardless of
|
|
103
|
+
// which trigger fired.
|
|
104
|
+
const [attachOpen, setAttachOpen] = useState(false);
|
|
105
|
+
const handleMentionStateChange = useCallback((s) => {
|
|
106
|
+
if (s === null)
|
|
107
|
+
setMentionDismissed(false);
|
|
108
|
+
setRawMentionState(s);
|
|
109
|
+
}, []);
|
|
110
|
+
// Custom-block side panel — opens when a block's NodeView fires its
|
|
111
|
+
// Edit button. The NodeView lives in a separate React tree and reaches
|
|
112
|
+
// us via `BlockNodeExtension.options.onEdit` (set during configure()
|
|
113
|
+
// below). Stores `pos` + `blockType` at open-time; `BlockSidePanel`
|
|
114
|
+
// tracks the position forward through transactions and writes attrs
|
|
115
|
+
// back via setNodeMarkup. Closing nullifies the slot — re-opening
|
|
116
|
+
// remounts the panel fresh, including a re-snapshot of `blockData`.
|
|
117
|
+
const [selectedBlock, setSelectedBlock] = useState(null);
|
|
118
|
+
const handleEditBlock = useCallback((pos) => {
|
|
119
|
+
// We resolve `blockType` here against the current doc so a stale
|
|
120
|
+
// pos (e.g. the block was just deleted before the click landed)
|
|
121
|
+
// produces a no-op rather than an empty panel.
|
|
122
|
+
setSelectedBlock((prev) => {
|
|
123
|
+
// Read from the editor lazily — the editor ref isn't stable yet
|
|
124
|
+
// on the very first render where this callback is created, so
|
|
125
|
+
// defer the lookup to call time.
|
|
126
|
+
const ed = editorRef.current;
|
|
127
|
+
if (!ed)
|
|
128
|
+
return prev;
|
|
129
|
+
const node = ed.state.doc.nodeAt(pos);
|
|
130
|
+
if (!node || node.type.name !== 'pilotiqBlock')
|
|
131
|
+
return prev;
|
|
132
|
+
return { pos, blockType: String(node.attrs['blockType'] ?? '') };
|
|
133
|
+
});
|
|
134
|
+
}, []);
|
|
135
|
+
const closeBlockPanel = useCallback(() => { setSelectedBlock(null); }, []);
|
|
136
|
+
// editorRef gives the onEdit callback access to the editor instance
|
|
137
|
+
// without re-creating the callback on every render (which would force
|
|
138
|
+
// the extension config to re-evaluate, triggering a full editor reset).
|
|
139
|
+
const editorRef = useRef(null);
|
|
140
|
+
const editor = useEditor({
|
|
141
|
+
editable: !disabled,
|
|
142
|
+
extensions: [
|
|
143
|
+
// StarterKit 3.22+ ships Link AND Underline; configure through the
|
|
144
|
+
// kit rather than re-adding (else "Duplicate extension names" warns).
|
|
145
|
+
StarterKit.configure({
|
|
146
|
+
link: { openOnClick: false, autolink: true },
|
|
147
|
+
}),
|
|
148
|
+
Subscript,
|
|
149
|
+
Superscript,
|
|
150
|
+
LeadMarkExtension,
|
|
151
|
+
SmallMarkExtension,
|
|
152
|
+
// textAlign needs to be told which node types it can target. Headings
|
|
153
|
+
// + paragraphs are the standard set. Blockquote alignment is handled
|
|
154
|
+
// by aligning the inner paragraph.
|
|
155
|
+
TextAlign.configure({ types: ['heading', 'paragraph'] }),
|
|
156
|
+
// TextStyle is a no-op mark on its own, but Color decorates it with the
|
|
157
|
+
// `color` attribute so `.setColor(...)` works. Loading them as a pair
|
|
158
|
+
// keeps the extension surface complete.
|
|
159
|
+
TextStyle,
|
|
160
|
+
Color,
|
|
161
|
+
Highlight.configure({ multicolor: true }),
|
|
162
|
+
Image.configure({
|
|
163
|
+
// Inline images break under prose's `figure` margin reset; the
|
|
164
|
+
// editor uses block images by default, matching the read-side
|
|
165
|
+
// renderer's `<img>` output.
|
|
166
|
+
inline: false,
|
|
167
|
+
// Most upload adapters return URLs — base64 inflates the doc and
|
|
168
|
+
// re-uploads on every save. Opt back in only if your adapter
|
|
169
|
+
// explicitly stores data URLs.
|
|
170
|
+
allowBase64: false,
|
|
171
|
+
resize: resizableImages
|
|
172
|
+
? { enabled: true, alwaysPreserveAspectRatio: true }
|
|
173
|
+
: false,
|
|
174
|
+
}),
|
|
175
|
+
// Tables — the four nodes ship from one peer (`@tiptap/extension-table`).
|
|
176
|
+
// `resizable: true` mounts the built-in column-resize NodeView so users
|
|
177
|
+
// can drag column dividers; `lastColumnResizable: false` keeps the
|
|
178
|
+
// right-edge handle from creating an unbounded growth target when the
|
|
179
|
+
// table sits inside a constrained-width form.
|
|
180
|
+
Table.configure({ resizable: true, lastColumnResizable: false }),
|
|
181
|
+
TableRow,
|
|
182
|
+
TableHeader,
|
|
183
|
+
TableCell,
|
|
184
|
+
// Collapsible `<details>` blocks. `persist: true` round-trips the
|
|
185
|
+
// open/closed state through the document attrs so SSR + reload pick up
|
|
186
|
+
// the same state the author left it in. The default summary text on
|
|
187
|
+
// insert ("Title") gives the user something to overwrite.
|
|
188
|
+
Details.configure({ persist: true, HTMLAttributes: { class: 'details' } }),
|
|
189
|
+
DetailsSummary,
|
|
190
|
+
DetailsContent,
|
|
191
|
+
// Multi-column grid blocks (`grid` + `gridColumn`). Custom node pair —
|
|
192
|
+
// Tiptap doesn't ship a first-party grid extension. Schema constrains
|
|
193
|
+
// grids to 2 or 3 columns; consumer owns the CSS for `pilotiq-grid` /
|
|
194
|
+
// `pilotiq-grid-cols-N`.
|
|
195
|
+
Grid,
|
|
196
|
+
GridColumn,
|
|
197
|
+
Placeholder.configure({ placeholder: placeholder ?? 'Start writing…' }),
|
|
198
|
+
// BlockNodeExtension carries the block registry on its options —
|
|
199
|
+
// NodeViews mount in a separate React tree and can't see context.
|
|
200
|
+
// `onEdit` is the bridge back to the host editor's tree where the
|
|
201
|
+
// side panel lives; the NodeView's Edit button calls it with its
|
|
202
|
+
// own `getPos()`.
|
|
203
|
+
BlockNodeExtension.configure({ blocks, onEdit: handleEditBlock }),
|
|
204
|
+
...(slashEnabled ? [SlashCommandExtension.configure({
|
|
205
|
+
blocks,
|
|
206
|
+
mergeTags,
|
|
207
|
+
onStateChange: handleStateChange,
|
|
208
|
+
hasUpload: Boolean(uploadUrl),
|
|
209
|
+
onInsertImage: () => setAttachOpen(true),
|
|
210
|
+
})] : []),
|
|
211
|
+
// MergeTagExtension provides the `mergeTag` node type even when no tags
|
|
212
|
+
// are configured — the slash menu is the gate for *inserting* them, but
|
|
213
|
+
// the schema needs to know about the node either way (otherwise loading
|
|
214
|
+
// an existing doc that contains one throws a parse error).
|
|
215
|
+
MergeTagExtension,
|
|
216
|
+
...(mentionProviders.length > 0 ? [MentionExtension.configure({
|
|
217
|
+
providers: mentionProviders,
|
|
218
|
+
onStateChange: handleMentionStateChange,
|
|
219
|
+
...(mentionsUrl ? { mentionsUrl } : {}),
|
|
220
|
+
fieldName: name,
|
|
221
|
+
})] : [MentionExtension]),
|
|
222
|
+
DragHandleExtension,
|
|
223
|
+
],
|
|
224
|
+
content: initialContent ?? '',
|
|
225
|
+
onUpdate: ({ editor: ed }) => {
|
|
226
|
+
// Debounce serialization — every keystroke fires onUpdate.
|
|
227
|
+
if (debounceRef.current)
|
|
228
|
+
clearTimeout(debounceRef.current);
|
|
229
|
+
debounceRef.current = setTimeout(() => {
|
|
230
|
+
const value = storage === 'html' ? ed.getHTML() : JSON.stringify(ed.getJSON());
|
|
231
|
+
setSerialized(value);
|
|
232
|
+
}, 250);
|
|
233
|
+
},
|
|
234
|
+
editorProps: {
|
|
235
|
+
attributes: {
|
|
236
|
+
// Drop the top border-radius when the toolbar is on so the toolbar
|
|
237
|
+
// and editor body read as a single chrome.
|
|
238
|
+
class: `prose prose-sm dark:prose-invert max-w-none min-h-[180px] border border-input bg-transparent px-10 py-3 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 ${toolbarGroups && toolbarGroups.length > 0
|
|
239
|
+
? 'rounded-b-md border-t-0'
|
|
240
|
+
: 'rounded-md'}`,
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
// Document-level keyboard handler for the slash menu. Capture phase so we
|
|
245
|
+
// run before ProseMirror's `view.dom` keydown listener — that way Enter
|
|
246
|
+
// doesn't split the paragraph and Arrows don't move the cursor while
|
|
247
|
+
// navigating the menu. Listen at `document` because Base UI's focus manager
|
|
248
|
+
// can briefly pull focus into the popup when it mounts.
|
|
249
|
+
const open = slashState !== null;
|
|
250
|
+
useEffect(() => {
|
|
251
|
+
if (!open)
|
|
252
|
+
return;
|
|
253
|
+
const onKeyDown = (e) => {
|
|
254
|
+
if (e.key === 'Escape') {
|
|
255
|
+
setDismissed(true);
|
|
256
|
+
e.preventDefault();
|
|
257
|
+
e.stopPropagation();
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
if (e.key === 'ArrowUp' || e.key === 'ArrowDown' || e.key === 'Enter') {
|
|
261
|
+
const handled = slashKeyRef.current?.(e) ?? false;
|
|
262
|
+
if (handled) {
|
|
263
|
+
e.preventDefault();
|
|
264
|
+
e.stopPropagation();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
document.addEventListener('keydown', onKeyDown, true);
|
|
269
|
+
return () => document.removeEventListener('keydown', onKeyDown, true);
|
|
270
|
+
}, [open]);
|
|
271
|
+
// Mirror keyboard handling for the mention popover. Capture-phase listener
|
|
272
|
+
// anchored to `document` for the same reason the slash menu uses it —
|
|
273
|
+
// Base UI's focus manager can briefly steal focus to its popup.
|
|
274
|
+
const mentionOpen = mentionState !== null;
|
|
275
|
+
useEffect(() => {
|
|
276
|
+
if (!mentionOpen)
|
|
277
|
+
return;
|
|
278
|
+
const onKeyDown = (e) => {
|
|
279
|
+
if (e.key === 'Escape') {
|
|
280
|
+
setMentionDismissed(true);
|
|
281
|
+
e.preventDefault();
|
|
282
|
+
e.stopPropagation();
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
if (e.key === 'ArrowUp' || e.key === 'ArrowDown' || e.key === 'Enter') {
|
|
286
|
+
const handled = mentionKeyRef.current?.(e) ?? false;
|
|
287
|
+
if (handled) {
|
|
288
|
+
e.preventDefault();
|
|
289
|
+
e.stopPropagation();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
document.addEventListener('keydown', onKeyDown, true);
|
|
294
|
+
return () => document.removeEventListener('keydown', onKeyDown, true);
|
|
295
|
+
}, [mentionOpen]);
|
|
296
|
+
useEffect(() => () => {
|
|
297
|
+
if (debounceRef.current)
|
|
298
|
+
clearTimeout(debounceRef.current);
|
|
299
|
+
}, []);
|
|
300
|
+
// Mirror the editor instance into a ref so callbacks captured during
|
|
301
|
+
// `useEditor`'s extension config (notably the BlockNode `onEdit`
|
|
302
|
+
// bridge) can reach the live editor without re-creating themselves
|
|
303
|
+
// every render. Re-creation would force the editor to rebuild from
|
|
304
|
+
// scratch on every keystroke.
|
|
305
|
+
useEffect(() => { editorRef.current = editor ?? null; }, [editor]);
|
|
306
|
+
// Re-render the toolbar when the selection / marks change so active-state
|
|
307
|
+
// booleans stay fresh.
|
|
308
|
+
const tick = useEditorTick(editor);
|
|
309
|
+
return (_jsxs("div", { className: "relative flex flex-col gap-1", children: [_jsx("input", { type: "hidden", name: name, value: serialized }), editor && toolbarGroups && toolbarGroups.length > 0 && (_jsx(Toolbar, { editor: editor, groups: toolbarGroups, tick: tick, textColors: textColors, customTextColors: customTextColors, highlightColors: highlightColors, onAttachOpenChange: setAttachOpen })), editor && (_jsx(AttachFilesDialog, { open: attachOpen, onOpenChange: setAttachOpen, editor: editor, fieldName: name, ...(uploadUrl !== undefined ? { uploadUrl } : {}), ...(acceptedFileTypes !== undefined ? { acceptedFileTypes } : {}), ...(maxAttachmentSize !== undefined ? { maxFileSize: maxAttachmentSize } : {}), ...(attachmentDir !== undefined ? { directory: attachmentDir } : {}), ...(attachmentVis !== undefined ? { visibility: attachmentVis } : {}) })), _jsx(EditorContent, { editor: editor }), editor && floatingEnabled && _jsx(FloatingToolbar, { editor: editor }), editor && _jsx(TableFloatingToolbar, { editor: editor }), _jsx(SlashPopover, { state: slashState, keyHandlerRef: slashKeyRef }), _jsx(MentionPopover, { state: mentionState, keyHandlerRef: mentionKeyRef }), editor && selectedBlock && (_jsx(BlockSidePanel, { editor: editor, initialPos: selectedBlock.pos, blockType: selectedBlock.blockType, blocks: blocks, onClose: closeBlockPanel }, `${selectedBlock.pos}:${selectedBlock.blockType}`))] }));
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Cursor-anchored popover for the mention menu. Same Floating-UI / virtual-
|
|
313
|
+
* element pattern as the slash popover — a `clientRect` lambda from the
|
|
314
|
+
* Suggestion plugin powers a `getBoundingClientRect`-only anchor object.
|
|
315
|
+
*/
|
|
316
|
+
function MentionPopover({ state, keyHandlerRef, }) {
|
|
317
|
+
const open = state !== null;
|
|
318
|
+
const anchor = useMemo(() => {
|
|
319
|
+
if (!state)
|
|
320
|
+
return null;
|
|
321
|
+
return {
|
|
322
|
+
getBoundingClientRect: () => state.clientRect() ?? new DOMRect(0, 0, 0, 0),
|
|
323
|
+
};
|
|
324
|
+
}, [state]);
|
|
325
|
+
return (_jsx(Popover.Root, { open: open, onOpenChange: () => { }, children: _jsx(Popover.Portal, { children: _jsx(Popover.Positioner, { anchor: anchor, positionMethod: "fixed", side: "bottom", align: "start", sideOffset: 6, className: "isolate z-50", children: _jsx(Popover.Popup, { initialFocus: false, finalFocus: false, tabIndex: -1, className: "origin-(--transform-origin) rounded-md border bg-popover text-popover-foreground shadow-md outline-hidden data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", children: state && (_jsx(MentionMenu, { trigger: state.trigger, items: state.items, command: state.command, keyHandlerRef: keyHandlerRef })) }) }) }) }));
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Renders the slash menu inside a Base UI Popover anchored to the cursor's
|
|
329
|
+
* client rect. Floating UI under Base UI handles scroll/resize tracking and
|
|
330
|
+
* collision avoidance, so we never have to recompute position ourselves.
|
|
331
|
+
*/
|
|
332
|
+
function SlashPopover({ state, keyHandlerRef, }) {
|
|
333
|
+
const open = state !== null;
|
|
334
|
+
// Virtual element built from the suggestion plugin's clientRect lambda.
|
|
335
|
+
// The Positioner re-reads `getBoundingClientRect` on every layout tick,
|
|
336
|
+
// and `clientRect()` returns viewport-relative coords from PM, so scroll
|
|
337
|
+
// tracking is automatic.
|
|
338
|
+
const anchor = useMemo(() => {
|
|
339
|
+
if (!state)
|
|
340
|
+
return null;
|
|
341
|
+
return {
|
|
342
|
+
getBoundingClientRect: () => state.clientRect() ?? new DOMRect(0, 0, 0, 0),
|
|
343
|
+
};
|
|
344
|
+
}, [state]);
|
|
345
|
+
return (_jsx(Popover.Root, { open: open, onOpenChange: () => { }, children: _jsx(Popover.Portal, { children: _jsx(Popover.Positioner, { anchor: anchor,
|
|
346
|
+
// `fixed` makes the popup's bounding rect viewport-relative, so the
|
|
347
|
+
// initial render (before Floating UI computes the anchor position)
|
|
348
|
+
// doesn't sit at body (0,0) — that would trigger the browser to
|
|
349
|
+
// scroll the page when the popup mounts and momentarily becomes
|
|
350
|
+
// the focus target.
|
|
351
|
+
positionMethod: "fixed", side: "bottom", align: "start", sideOffset: 6, className: "isolate z-50", children: _jsx(Popover.Popup
|
|
352
|
+
// Keep focus in the editor — keyboard navigation is driven via a
|
|
353
|
+
// document-level listener in TiptapEditor, never via DOM focus.
|
|
354
|
+
, {
|
|
355
|
+
// Keep focus in the editor — keyboard navigation is driven via a
|
|
356
|
+
// document-level listener in TiptapEditor, never via DOM focus.
|
|
357
|
+
initialFocus: false, finalFocus: false, tabIndex: -1, className: "origin-(--transform-origin) rounded-md border bg-popover text-popover-foreground shadow-md outline-hidden data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", children: state && (_jsx(SlashMenu, { items: state.items, command: state.command, keyHandlerRef: keyHandlerRef })) }) }) }) }));
|
|
358
|
+
}
|
|
359
|
+
function parseInitialContent(raw) {
|
|
360
|
+
if (raw === undefined || raw === null || raw === '')
|
|
361
|
+
return undefined;
|
|
362
|
+
if (typeof raw === 'object')
|
|
363
|
+
return raw;
|
|
364
|
+
if (typeof raw === 'string') {
|
|
365
|
+
const trimmed = raw.trim();
|
|
366
|
+
// Looks like JSON — try to parse. Otherwise treat as HTML and pass to
|
|
367
|
+
// Tiptap (it accepts an HTML string as `content`).
|
|
368
|
+
if (trimmed.startsWith('{') || trimmed.startsWith('[')) {
|
|
369
|
+
try {
|
|
370
|
+
return JSON.parse(raw);
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
return raw;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return raw;
|
|
377
|
+
}
|
|
378
|
+
return undefined;
|
|
379
|
+
}
|
|
380
|
+
function serializeForHidden(content, storage) {
|
|
381
|
+
if (content === undefined || content === null) {
|
|
382
|
+
return storage === 'html' ? '' : JSON.stringify(null);
|
|
383
|
+
}
|
|
384
|
+
if (storage === 'html') {
|
|
385
|
+
return typeof content === 'string' ? content : '';
|
|
386
|
+
}
|
|
387
|
+
if (typeof content === 'object')
|
|
388
|
+
return JSON.stringify(content);
|
|
389
|
+
if (typeof content === 'string') {
|
|
390
|
+
// Best-effort: a stored JSON string from the server should round-trip.
|
|
391
|
+
const trimmed = content.trim();
|
|
392
|
+
if (trimmed.startsWith('{') || trimmed.startsWith('['))
|
|
393
|
+
return content;
|
|
394
|
+
return JSON.stringify(null);
|
|
395
|
+
}
|
|
396
|
+
return JSON.stringify(null);
|
|
397
|
+
}
|
|
398
|
+
//# sourceMappingURL=TiptapEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TiptapEditor.js","sourceRoot":"","sources":["../../src/react/TiptapEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Editor } from '@tiptap/core';
|
|
2
|
+
import type { ToolbarGroups, ToolbarButtonId, ColorSwatch } from '../RichTextField.js';
|
|
3
|
+
interface ToolbarProps {
|
|
4
|
+
editor: Editor;
|
|
5
|
+
groups: ToolbarGroups;
|
|
6
|
+
/** Force re-render when the selection / active marks change. */
|
|
7
|
+
tick: number;
|
|
8
|
+
textColors: ColorSwatch[];
|
|
9
|
+
customTextColors: boolean;
|
|
10
|
+
highlightColors: ColorSwatch[];
|
|
11
|
+
/**
|
|
12
|
+
* Open the upload dialog. The dialog itself is mounted in the parent
|
|
13
|
+
* (`ClientEditor`) so the slash menu's "Image" entry can share the
|
|
14
|
+
* same mount — Toolbar just toggles the controlled flag.
|
|
15
|
+
*/
|
|
16
|
+
onAttachOpenChange: (open: boolean) => void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Always-on toolbar rendered above the editor. Groups are joined with thin
|
|
20
|
+
* dividers; unknown / unavailable button ids are silently dropped so config
|
|
21
|
+
* can target later-phase buttons today without crashing.
|
|
22
|
+
*
|
|
23
|
+
* Inline link button opens a Base UI dialog with a URL input — kept here
|
|
24
|
+
* (not in the FloatingToolbar's dialog) because each toolbar instance owns
|
|
25
|
+
* its own React state for the modal.
|
|
26
|
+
*/
|
|
27
|
+
export declare function Toolbar({ editor, groups, tick, textColors, customTextColors, highlightColors, onAttachOpenChange, }: ToolbarProps): import("react/jsx-runtime").JSX.Element | null;
|
|
28
|
+
export declare function AttachFilesDialog({ open, onOpenChange, editor, uploadUrl, fieldName, acceptedFileTypes, maxFileSize, directory, visibility, }: {
|
|
29
|
+
open: boolean;
|
|
30
|
+
onOpenChange: (open: boolean) => void;
|
|
31
|
+
editor: Editor;
|
|
32
|
+
uploadUrl?: string;
|
|
33
|
+
fieldName: string;
|
|
34
|
+
acceptedFileTypes?: string[];
|
|
35
|
+
maxFileSize?: number;
|
|
36
|
+
directory?: string;
|
|
37
|
+
visibility?: 'public' | 'private';
|
|
38
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
39
|
+
/**
|
|
40
|
+
* Hook returning a tick that bumps on any selection / transaction change.
|
|
41
|
+
* The Toolbar renders dependent on this so active-state booleans stay fresh.
|
|
42
|
+
*/
|
|
43
|
+
export declare function useEditorTick(editor: Editor | null): number;
|
|
44
|
+
export type { ToolbarButtonId };
|
|
45
|
+
//# sourceMappingURL=Toolbar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../src/react/Toolbar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAG1C,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAItF,UAAU,YAAY;IACpB,MAAM,EAAY,MAAM,CAAA;IACxB,MAAM,EAAY,aAAa,CAAA;IAC/B,gEAAgE;IAChE,IAAI,EAAc,MAAM,CAAA;IACxB,UAAU,EAAQ,WAAW,EAAE,CAAA;IAC/B,gBAAgB,EAAE,OAAO,CAAA;IACzB,eAAe,EAAG,WAAW,EAAE,CAAA;IAC/B;;;;OAIG;IACH,kBAAkB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CAC5C;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,EACtB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EACnE,kBAAkB,GACnB,EAAE,YAAY,kDAgHd;AA+CD,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EAAE,YAAY,EAAE,MAAM,EAC1B,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,GAC5E,EAAE;IACD,IAAI,EAAgB,OAAO,CAAA;IAC3B,YAAY,EAAQ,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IAC3C,MAAM,EAAc,MAAM,CAAA;IAC1B,SAAS,CAAC,EAAU,MAAM,CAAA;IAC1B,SAAS,EAAW,MAAM,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,WAAW,CAAC,EAAQ,MAAM,CAAA;IAC1B,SAAS,CAAC,EAAU,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAS,QAAQ,GAAG,SAAS,CAAA;CACzC,2CAiIA;AA0ED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAa3D;AASD,YAAY,EAAE,eAAe,EAAE,CAAA"}
|