@rtif-sdk/web 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/block-drag-handler.d.ts +26 -0
- package/dist/block-drag-handler.d.ts.map +1 -1
- package/dist/block-drag-handler.js +33 -23
- package/dist/block-drag-handler.js.map +1 -1
- package/dist/block-gutter.d.ts +81 -0
- package/dist/block-gutter.d.ts.map +1 -0
- package/dist/block-gutter.js +331 -0
- package/dist/block-gutter.js.map +1 -0
- package/dist/content-handler-html.d.ts +28 -0
- package/dist/content-handler-html.d.ts.map +1 -0
- package/dist/content-handler-html.js +49 -0
- package/dist/content-handler-html.js.map +1 -0
- package/dist/content-handlers.d.ts +20 -19
- package/dist/content-handlers.d.ts.map +1 -1
- package/dist/content-handlers.js +4 -43
- package/dist/content-handlers.js.map +1 -1
- package/dist/drop-indicator.d.ts.map +1 -1
- package/dist/drop-indicator.js +8 -34
- package/dist/drop-indicator.js.map +1 -1
- package/dist/editor.d.ts.map +1 -1
- package/dist/editor.js +33 -13
- package/dist/editor.js.map +1 -1
- package/dist/floating-toolbar.d.ts.map +1 -1
- package/dist/floating-toolbar.js +4 -7
- package/dist/floating-toolbar.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/link-popover.d.ts.map +1 -1
- package/dist/link-popover.js +2 -43
- package/dist/link-popover.js.map +1 -1
- package/dist/preset-basic.d.ts +20 -0
- package/dist/preset-basic.d.ts.map +1 -0
- package/dist/preset-basic.js +28 -0
- package/dist/preset-basic.js.map +1 -0
- package/dist/preset-full.d.ts +22 -0
- package/dist/preset-full.d.ts.map +1 -0
- package/dist/preset-full.js +66 -0
- package/dist/preset-full.js.map +1 -0
- package/dist/preset-plaintext.d.ts +20 -0
- package/dist/preset-plaintext.d.ts.map +1 -0
- package/dist/preset-plaintext.js +19 -0
- package/dist/preset-plaintext.js.map +1 -0
- package/dist/preset-standard.d.ts +22 -0
- package/dist/preset-standard.d.ts.map +1 -0
- package/dist/preset-standard.js +47 -0
- package/dist/preset-standard.js.map +1 -0
- package/dist/presets.d.ts +7 -88
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +7 -152
- package/dist/presets.js.map +1 -1
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +27 -5
- package/dist/renderer.js.map +1 -1
- package/dist/selection-sync.d.ts.map +1 -1
- package/dist/selection-sync.js +20 -3
- package/dist/selection-sync.js.map +1 -1
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -4
- package/styles/all.css +20 -0
- package/styles/base.css +33 -0
- package/styles/block-gutter.css +76 -0
- package/styles/blocks.css +199 -0
- package/styles/drop-indicator.css +37 -0
- package/styles/floating-toolbar.css +51 -0
- package/styles/link-popover.css +64 -0
- package/styles/marks.css +27 -0
- package/styles/mention.css +17 -0
- package/styles/pickers.css +317 -0
- package/styles/toolbar.css +151 -0
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Block gutter toolbar — a Notion-style hover-revealed toolbar to the left
|
|
3
|
+
* of blocks with a "+" button (add block below) and a drag handle (reorder).
|
|
4
|
+
*
|
|
5
|
+
* The gutter owns hover detection and DOM elements. Drag-and-drop logic is
|
|
6
|
+
* delegated to {@link BlockDragHandler} in external handle mode.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import { blockTextLength } from '@rtif-sdk/core';
|
|
11
|
+
import { BlockDragHandler, findBlockElement } from './block-drag-handler.js';
|
|
12
|
+
import { getBlockStartOffset } from './plugins/block-utils.js';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// CSS class names
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
const CSS_GUTTER = 'rtif-block-gutter';
|
|
17
|
+
const CSS_ADD = 'rtif-gutter-add';
|
|
18
|
+
const CSS_HANDLE = 'rtif-drag-handle';
|
|
19
|
+
const CSS_HIDDEN = 'rtif-hidden';
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Factory
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
/**
|
|
24
|
+
* Create a block gutter toolbar.
|
|
25
|
+
*
|
|
26
|
+
* The gutter appears on hover or when the keyboard cursor enters a block.
|
|
27
|
+
* It provides a "+" button to add a new block below and a drag handle
|
|
28
|
+
* for block reordering.
|
|
29
|
+
*
|
|
30
|
+
* @param deps - Injected dependencies
|
|
31
|
+
* @returns A handle to attach/detach the gutter
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* const gutter = createBlockGutter({
|
|
36
|
+
* root: editorRoot,
|
|
37
|
+
* engine,
|
|
38
|
+
* isReadOnly: () => false,
|
|
39
|
+
* getBlockElementMap: () => blockElementMap,
|
|
40
|
+
* generateBlockId: () => generateId(),
|
|
41
|
+
* focusAtOffset: (offset) => { ... },
|
|
42
|
+
* });
|
|
43
|
+
* gutter.attach();
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export function createBlockGutter(deps) {
|
|
47
|
+
let attached = false;
|
|
48
|
+
// Active block state
|
|
49
|
+
let activeBlockId = null;
|
|
50
|
+
let mouseIsActive = false;
|
|
51
|
+
let isDragging = false;
|
|
52
|
+
let hideTimeout = null;
|
|
53
|
+
let rafId = null;
|
|
54
|
+
// -------------------------------------------------------------------------
|
|
55
|
+
// DOM creation
|
|
56
|
+
// -------------------------------------------------------------------------
|
|
57
|
+
const gutterEl = document.createElement('div');
|
|
58
|
+
gutterEl.className = CSS_GUTTER;
|
|
59
|
+
gutterEl.setAttribute('role', 'toolbar');
|
|
60
|
+
gutterEl.setAttribute('aria-label', 'Block actions');
|
|
61
|
+
gutterEl.setAttribute('contenteditable', 'false');
|
|
62
|
+
gutterEl.classList.add(CSS_HIDDEN);
|
|
63
|
+
// + button
|
|
64
|
+
const addButton = document.createElement('button');
|
|
65
|
+
addButton.className = CSS_ADD;
|
|
66
|
+
addButton.type = 'button';
|
|
67
|
+
addButton.setAttribute('aria-label', 'Add block below');
|
|
68
|
+
addButton.textContent = '+';
|
|
69
|
+
// Drag handle
|
|
70
|
+
const dragHandle = document.createElement('div');
|
|
71
|
+
dragHandle.className = CSS_HANDLE;
|
|
72
|
+
dragHandle.setAttribute('draggable', 'true');
|
|
73
|
+
dragHandle.setAttribute('role', 'button');
|
|
74
|
+
dragHandle.setAttribute('tabindex', '-1');
|
|
75
|
+
dragHandle.setAttribute('aria-label', 'Drag to reorder');
|
|
76
|
+
dragHandle.textContent = '\u2807'; // BRAILLE PATTERN DOTS-123
|
|
77
|
+
gutterEl.appendChild(addButton);
|
|
78
|
+
gutterEl.appendChild(dragHandle);
|
|
79
|
+
// -------------------------------------------------------------------------
|
|
80
|
+
// BlockDragHandler in external handle mode
|
|
81
|
+
// -------------------------------------------------------------------------
|
|
82
|
+
const blockDragHandler = new BlockDragHandler({
|
|
83
|
+
root: deps.root,
|
|
84
|
+
getDoc: () => deps.engine.state.doc,
|
|
85
|
+
dispatch: (ops) => deps.engine.dispatch(ops),
|
|
86
|
+
isReadOnly: deps.isReadOnly,
|
|
87
|
+
getBlockElementMap: () => deps.getBlockElementMap(),
|
|
88
|
+
externalHandleMode: true,
|
|
89
|
+
getHandleEl: () => dragHandle,
|
|
90
|
+
});
|
|
91
|
+
// -------------------------------------------------------------------------
|
|
92
|
+
// Gutter positioning
|
|
93
|
+
// -------------------------------------------------------------------------
|
|
94
|
+
function showGutter(blockEl) {
|
|
95
|
+
if (deps.isReadOnly())
|
|
96
|
+
return;
|
|
97
|
+
if (isDragging)
|
|
98
|
+
return;
|
|
99
|
+
const blockId = blockEl.getAttribute('data-rtif-block');
|
|
100
|
+
if (!blockId)
|
|
101
|
+
return;
|
|
102
|
+
activeBlockId = blockId;
|
|
103
|
+
dragHandle.setAttribute('data-drag-block-id', blockId);
|
|
104
|
+
const rootRect = deps.root.getBoundingClientRect();
|
|
105
|
+
const blockRect = blockEl.getBoundingClientRect();
|
|
106
|
+
// Account for scroll offset: getBoundingClientRect is viewport-relative,
|
|
107
|
+
// but absolute positioning is relative to the offsetParent (root).
|
|
108
|
+
// When the root is scrolled, we need to add scrollTop to compensate.
|
|
109
|
+
gutterEl.style.top = `${blockRect.top - rootRect.top + deps.root.scrollTop}px`;
|
|
110
|
+
gutterEl.style.height = `${blockRect.height}px`;
|
|
111
|
+
gutterEl.classList.remove(CSS_HIDDEN);
|
|
112
|
+
}
|
|
113
|
+
function hideGutter() {
|
|
114
|
+
gutterEl.classList.add(CSS_HIDDEN);
|
|
115
|
+
activeBlockId = null;
|
|
116
|
+
}
|
|
117
|
+
function clearHideTimeout() {
|
|
118
|
+
if (hideTimeout !== null) {
|
|
119
|
+
clearTimeout(hideTimeout);
|
|
120
|
+
hideTimeout = null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function scheduleHide() {
|
|
124
|
+
clearHideTimeout();
|
|
125
|
+
hideTimeout = setTimeout(() => {
|
|
126
|
+
hideTimeout = null;
|
|
127
|
+
hideGutter();
|
|
128
|
+
mouseIsActive = false;
|
|
129
|
+
}, 150);
|
|
130
|
+
}
|
|
131
|
+
// -------------------------------------------------------------------------
|
|
132
|
+
// Hover detection (event delegation on root)
|
|
133
|
+
// -------------------------------------------------------------------------
|
|
134
|
+
function onMouseOver(e) {
|
|
135
|
+
const blockEl = findBlockElement(e.target, deps.root);
|
|
136
|
+
if (blockEl) {
|
|
137
|
+
clearHideTimeout();
|
|
138
|
+
mouseIsActive = true;
|
|
139
|
+
showGutter(blockEl);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function onMouseOut(e) {
|
|
143
|
+
const relatedTarget = e.relatedTarget;
|
|
144
|
+
if (relatedTarget) {
|
|
145
|
+
// Moving to gutter → grace
|
|
146
|
+
if (gutterEl.contains(relatedTarget))
|
|
147
|
+
return;
|
|
148
|
+
// Moving to another block → will trigger mouseover
|
|
149
|
+
if (deps.root.contains(relatedTarget)) {
|
|
150
|
+
const blockEl = findBlockElement(relatedTarget, deps.root);
|
|
151
|
+
if (blockEl)
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
scheduleHide();
|
|
156
|
+
}
|
|
157
|
+
function onGutterMouseEnter() {
|
|
158
|
+
clearHideTimeout();
|
|
159
|
+
}
|
|
160
|
+
function onGutterMouseLeave(e) {
|
|
161
|
+
const relatedTarget = e.relatedTarget;
|
|
162
|
+
if (relatedTarget && deps.root.contains(relatedTarget)) {
|
|
163
|
+
const blockEl = findBlockElement(relatedTarget, deps.root);
|
|
164
|
+
if (blockEl)
|
|
165
|
+
return; // Moving back to a block
|
|
166
|
+
}
|
|
167
|
+
scheduleHide();
|
|
168
|
+
}
|
|
169
|
+
// -------------------------------------------------------------------------
|
|
170
|
+
// Drag state tracking — hide gutter during active drag
|
|
171
|
+
// -------------------------------------------------------------------------
|
|
172
|
+
function onDragStart() {
|
|
173
|
+
isDragging = true;
|
|
174
|
+
hideGutter();
|
|
175
|
+
}
|
|
176
|
+
function onDragEnd() {
|
|
177
|
+
isDragging = false;
|
|
178
|
+
}
|
|
179
|
+
// -------------------------------------------------------------------------
|
|
180
|
+
// Keyboard focus tracking (rAF-throttled)
|
|
181
|
+
// -------------------------------------------------------------------------
|
|
182
|
+
let prevFocusBlockId = null;
|
|
183
|
+
let unsubChange = null;
|
|
184
|
+
let unsubSelection = null;
|
|
185
|
+
function updateGutterForSelection() {
|
|
186
|
+
if (deps.isReadOnly())
|
|
187
|
+
return;
|
|
188
|
+
// Mouse hover takes priority
|
|
189
|
+
if (mouseIsActive)
|
|
190
|
+
return;
|
|
191
|
+
if (isDragging)
|
|
192
|
+
return;
|
|
193
|
+
const { selection, doc } = deps.engine.state;
|
|
194
|
+
const offset = selection.focus.offset;
|
|
195
|
+
try {
|
|
196
|
+
const block = deps.engine.getBlockAtOffset(offset);
|
|
197
|
+
if (block.id === prevFocusBlockId)
|
|
198
|
+
return;
|
|
199
|
+
prevFocusBlockId = block.id;
|
|
200
|
+
const blockEl = deps.getBlockElementMap().get(block.id);
|
|
201
|
+
if (!blockEl)
|
|
202
|
+
return; // Virtualized away
|
|
203
|
+
showGutter(blockEl);
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
// Offset out of range — hide
|
|
207
|
+
hideGutter();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function scheduleSelectionUpdate() {
|
|
211
|
+
if (rafId !== null)
|
|
212
|
+
return; // Already scheduled
|
|
213
|
+
rafId = requestAnimationFrame(() => {
|
|
214
|
+
rafId = null;
|
|
215
|
+
updateGutterForSelection();
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
// -------------------------------------------------------------------------
|
|
219
|
+
// + button handler
|
|
220
|
+
// -------------------------------------------------------------------------
|
|
221
|
+
function onAddMouseDown(e) {
|
|
222
|
+
e.preventDefault(); // Preserve editor focus
|
|
223
|
+
}
|
|
224
|
+
function onAddClick() {
|
|
225
|
+
if (deps.isReadOnly())
|
|
226
|
+
return;
|
|
227
|
+
if (!activeBlockId)
|
|
228
|
+
return;
|
|
229
|
+
const doc = deps.engine.state.doc;
|
|
230
|
+
const block = doc.blocks.find((b) => b.id === activeBlockId);
|
|
231
|
+
if (!block)
|
|
232
|
+
return;
|
|
233
|
+
const blockStart = getBlockStartOffset(doc, activeBlockId);
|
|
234
|
+
const blockLen = blockTextLength(block);
|
|
235
|
+
const splitOffset = blockStart + blockLen;
|
|
236
|
+
const newBlockId = deps.generateBlockId();
|
|
237
|
+
deps.engine.dispatch({
|
|
238
|
+
type: 'split_block',
|
|
239
|
+
offset: splitOffset,
|
|
240
|
+
newBlockId,
|
|
241
|
+
});
|
|
242
|
+
// Cursor at start of new block (splitOffset + 1 for virtual \n)
|
|
243
|
+
deps.focusAtOffset(splitOffset + 1);
|
|
244
|
+
}
|
|
245
|
+
// Drag handle also needs focus preservation
|
|
246
|
+
function onDragHandleMouseDown(e) {
|
|
247
|
+
e.preventDefault();
|
|
248
|
+
}
|
|
249
|
+
// -------------------------------------------------------------------------
|
|
250
|
+
// Blur handler
|
|
251
|
+
// -------------------------------------------------------------------------
|
|
252
|
+
function onBlur() {
|
|
253
|
+
clearHideTimeout();
|
|
254
|
+
hideGutter();
|
|
255
|
+
mouseIsActive = false;
|
|
256
|
+
prevFocusBlockId = null;
|
|
257
|
+
}
|
|
258
|
+
// -------------------------------------------------------------------------
|
|
259
|
+
// Lifecycle
|
|
260
|
+
// -------------------------------------------------------------------------
|
|
261
|
+
return {
|
|
262
|
+
attach() {
|
|
263
|
+
if (attached)
|
|
264
|
+
return;
|
|
265
|
+
attached = true;
|
|
266
|
+
// Append gutter to root
|
|
267
|
+
deps.root.appendChild(gutterEl);
|
|
268
|
+
// Hover listeners
|
|
269
|
+
deps.root.addEventListener('mouseover', onMouseOver);
|
|
270
|
+
deps.root.addEventListener('mouseout', onMouseOut);
|
|
271
|
+
gutterEl.addEventListener('mouseenter', onGutterMouseEnter);
|
|
272
|
+
gutterEl.addEventListener('mouseleave', onGutterMouseLeave);
|
|
273
|
+
// Button listeners
|
|
274
|
+
addButton.addEventListener('mousedown', onAddMouseDown);
|
|
275
|
+
addButton.addEventListener('click', onAddClick);
|
|
276
|
+
dragHandle.addEventListener('mousedown', onDragHandleMouseDown);
|
|
277
|
+
// Drag state listeners
|
|
278
|
+
deps.root.addEventListener('dragstart', onDragStart);
|
|
279
|
+
deps.root.addEventListener('dragend', onDragEnd);
|
|
280
|
+
// Blur
|
|
281
|
+
deps.root.addEventListener('blur', onBlur);
|
|
282
|
+
// Keyboard tracking (rAF-throttled)
|
|
283
|
+
unsubChange = deps.engine.onChange(() => scheduleSelectionUpdate());
|
|
284
|
+
unsubSelection = deps.engine.onSelectionChange(() => scheduleSelectionUpdate());
|
|
285
|
+
// Drag handler
|
|
286
|
+
blockDragHandler.attach();
|
|
287
|
+
},
|
|
288
|
+
detach() {
|
|
289
|
+
if (!attached)
|
|
290
|
+
return;
|
|
291
|
+
attached = false;
|
|
292
|
+
// Hover listeners
|
|
293
|
+
deps.root.removeEventListener('mouseover', onMouseOver);
|
|
294
|
+
deps.root.removeEventListener('mouseout', onMouseOut);
|
|
295
|
+
gutterEl.removeEventListener('mouseenter', onGutterMouseEnter);
|
|
296
|
+
gutterEl.removeEventListener('mouseleave', onGutterMouseLeave);
|
|
297
|
+
// Button listeners
|
|
298
|
+
addButton.removeEventListener('mousedown', onAddMouseDown);
|
|
299
|
+
addButton.removeEventListener('click', onAddClick);
|
|
300
|
+
dragHandle.removeEventListener('mousedown', onDragHandleMouseDown);
|
|
301
|
+
// Drag state listeners
|
|
302
|
+
deps.root.removeEventListener('dragstart', onDragStart);
|
|
303
|
+
deps.root.removeEventListener('dragend', onDragEnd);
|
|
304
|
+
// Blur
|
|
305
|
+
deps.root.removeEventListener('blur', onBlur);
|
|
306
|
+
// Keyboard tracking
|
|
307
|
+
unsubChange?.();
|
|
308
|
+
unsubSelection?.();
|
|
309
|
+
unsubChange = null;
|
|
310
|
+
unsubSelection = null;
|
|
311
|
+
// Cancel pending rAF
|
|
312
|
+
if (rafId !== null) {
|
|
313
|
+
cancelAnimationFrame(rafId);
|
|
314
|
+
rafId = null;
|
|
315
|
+
}
|
|
316
|
+
// Drag handler
|
|
317
|
+
blockDragHandler.detach();
|
|
318
|
+
// Remove DOM
|
|
319
|
+
if (gutterEl.parentNode) {
|
|
320
|
+
gutterEl.parentNode.removeChild(gutterEl);
|
|
321
|
+
}
|
|
322
|
+
// Clear state
|
|
323
|
+
clearHideTimeout();
|
|
324
|
+
activeBlockId = null;
|
|
325
|
+
mouseIsActive = false;
|
|
326
|
+
isDragging = false;
|
|
327
|
+
prevFocusBlockId = null;
|
|
328
|
+
},
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=block-gutter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-gutter.js","sourceRoot":"","sources":["../src/block-gutter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML content handler for the RTIF content pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Separated into its own module so that `@rtif-sdk/format-html` is only
|
|
5
|
+
* bundled when this handler is imported. Consumers who don't need HTML
|
|
6
|
+
* paste can omit this handler to save ~4.8 KB minified.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import type { ContentHandler } from './content-pipeline.js';
|
|
11
|
+
/**
|
|
12
|
+
* Create a content handler for HTML paste.
|
|
13
|
+
*
|
|
14
|
+
* Accepts `text/html` content and deserializes it via `@rtif-sdk/format-html`,
|
|
15
|
+
* preserving formatting (bold, italic, links, headings, lists, code blocks, etc.).
|
|
16
|
+
*
|
|
17
|
+
* Priority: -90 (between RTIF JSON and plain text).
|
|
18
|
+
*
|
|
19
|
+
* @returns A ContentHandler for HTML paste
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* const handler = createHtmlPasteHandler();
|
|
24
|
+
* pipeline.register(handler);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function createHtmlPasteHandler(): ContentHandler;
|
|
28
|
+
//# sourceMappingURL=content-handler-html.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-handler-html.d.ts","sourceRoot":"","sources":["../src/content-handler-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,uBAAuB,CAAC;AAG/B;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,IAAI,cAAc,CA6BvD"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML content handler for the RTIF content pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Separated into its own module so that `@rtif-sdk/format-html` is only
|
|
5
|
+
* bundled when this handler is imported. Consumers who don't need HTML
|
|
6
|
+
* paste can omit this handler to save ~4.8 KB minified.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import { deserialize as deserializeHtml } from '@rtif-sdk/format-html';
|
|
11
|
+
import { insertBlocksAsOps } from './content-handlers.js';
|
|
12
|
+
/**
|
|
13
|
+
* Create a content handler for HTML paste.
|
|
14
|
+
*
|
|
15
|
+
* Accepts `text/html` content and deserializes it via `@rtif-sdk/format-html`,
|
|
16
|
+
* preserving formatting (bold, italic, links, headings, lists, code blocks, etc.).
|
|
17
|
+
*
|
|
18
|
+
* Priority: -90 (between RTIF JSON and plain text).
|
|
19
|
+
*
|
|
20
|
+
* @returns A ContentHandler for HTML paste
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* const handler = createHtmlPasteHandler();
|
|
25
|
+
* pipeline.register(handler);
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function createHtmlPasteHandler() {
|
|
29
|
+
return {
|
|
30
|
+
id: 'rtif:html',
|
|
31
|
+
accept: ['text/html'],
|
|
32
|
+
priority: -90,
|
|
33
|
+
async handle(item, context) {
|
|
34
|
+
const html = await item.getString();
|
|
35
|
+
if (html === null || html === '')
|
|
36
|
+
return false;
|
|
37
|
+
const doc = deserializeHtml(html);
|
|
38
|
+
// Check if deserialization produced only a single empty block
|
|
39
|
+
if (doc.blocks.length === 1 &&
|
|
40
|
+
doc.blocks[0].spans.length === 1 &&
|
|
41
|
+
doc.blocks[0].spans[0].text === '') {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
insertBlocksAsOps(doc.blocks, context);
|
|
45
|
+
return true;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=content-handler-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-handler-html.js","sourceRoot":"","sources":["../src/content-handler-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAMvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,EAAE,EAAE,WAAW;QACf,MAAM,EAAE,CAAC,WAAW,CAAC;QACrB,QAAQ,EAAE,CAAC,EAAE;QAEb,KAAK,CAAC,MAAM,CACV,IAAiB,EACjB,OAAuB;YAEvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE;gBAAE,OAAO,KAAK,CAAC;YAE/C,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YAElC,8DAA8D;YAC9D,IACE,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;gBACvB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;gBACjC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,EAAE,EACpC,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAEvC,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -4,11 +4,14 @@
|
|
|
4
4
|
* Provides handlers for:
|
|
5
5
|
* - Plain text (`text/plain`) — splits on newlines, creates blocks
|
|
6
6
|
* - RTIF JSON (`application/x-rtif+json`) — preserves marks and block attrs
|
|
7
|
-
*
|
|
7
|
+
*
|
|
8
|
+
* The HTML handler lives in `content-handler-html.ts` to isolate the
|
|
9
|
+
* `@rtif-sdk/format-html` dependency (tree-shaking friendly).
|
|
8
10
|
*
|
|
9
11
|
* @module
|
|
10
12
|
*/
|
|
11
|
-
import type {
|
|
13
|
+
import type { Block } from '@rtif-sdk/core';
|
|
14
|
+
import type { ContentHandler, ContentContext } from './content-pipeline.js';
|
|
12
15
|
/**
|
|
13
16
|
* Create a content handler for plain text paste/drop.
|
|
14
17
|
*
|
|
@@ -28,6 +31,21 @@ import type { ContentHandler } from './content-pipeline.js';
|
|
|
28
31
|
* ```
|
|
29
32
|
*/
|
|
30
33
|
export declare function createPlainTextHandler(generateBlockId: () => string): ContentHandler;
|
|
34
|
+
/**
|
|
35
|
+
* Convert an array of RTIF blocks into operations and dispatch them.
|
|
36
|
+
*
|
|
37
|
+
* Generates a 4-phase operation sequence:
|
|
38
|
+
* 1. Insert text + split blocks
|
|
39
|
+
* 2. Apply span marks
|
|
40
|
+
* 3. Apply block attrs on new blocks
|
|
41
|
+
* 4. Apply block type on new blocks
|
|
42
|
+
*
|
|
43
|
+
* Used by both the RTIF JSON and HTML paste handlers.
|
|
44
|
+
*
|
|
45
|
+
* @param blocks - Source blocks to insert
|
|
46
|
+
* @param context - The content pipeline context
|
|
47
|
+
*/
|
|
48
|
+
export declare function insertBlocksAsOps(blocks: readonly Block[], context: ContentContext): void;
|
|
31
49
|
/**
|
|
32
50
|
* Create a content handler for RTIF JSON paste.
|
|
33
51
|
*
|
|
@@ -46,21 +64,4 @@ export declare function createPlainTextHandler(generateBlockId: () => string): C
|
|
|
46
64
|
* ```
|
|
47
65
|
*/
|
|
48
66
|
export declare function createRtifPasteHandler(): ContentHandler;
|
|
49
|
-
/**
|
|
50
|
-
* Create a content handler for HTML paste.
|
|
51
|
-
*
|
|
52
|
-
* Accepts `text/html` content and deserializes it via `@rtif-sdk/format-html`,
|
|
53
|
-
* preserving formatting (bold, italic, links, headings, lists, code blocks, etc.).
|
|
54
|
-
*
|
|
55
|
-
* Priority: -90 (between RTIF JSON and plain text).
|
|
56
|
-
*
|
|
57
|
-
* @returns A ContentHandler for HTML paste
|
|
58
|
-
*
|
|
59
|
-
* @example
|
|
60
|
-
* ```ts
|
|
61
|
-
* const handler = createHtmlPasteHandler();
|
|
62
|
-
* pipeline.register(handler);
|
|
63
|
-
* ```
|
|
64
|
-
*/
|
|
65
|
-
export declare function createHtmlPasteHandler(): ContentHandler;
|
|
66
67
|
//# sourceMappingURL=content-handlers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-handlers.d.ts","sourceRoot":"","sources":["../src/content-handlers.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"content-handlers.d.ts","sourceRoot":"","sources":["../src/content-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAa,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EACV,cAAc,EAEd,cAAc,EACf,MAAM,uBAAuB,CAAC;AAM/B;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,MAAM,MAAM,GAC5B,cAAc,CA+ChB;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,OAAO,EAAE,cAAc,GACtB,IAAI,CAqGN;AAcD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,IAAI,cAAc,CAsBvD"}
|
package/dist/content-handlers.js
CHANGED
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
* Provides handlers for:
|
|
5
5
|
* - Plain text (`text/plain`) — splits on newlines, creates blocks
|
|
6
6
|
* - RTIF JSON (`application/x-rtif+json`) — preserves marks and block attrs
|
|
7
|
-
*
|
|
7
|
+
*
|
|
8
|
+
* The HTML handler lives in `content-handler-html.ts` to isolate the
|
|
9
|
+
* `@rtif-sdk/format-html` dependency (tree-shaking friendly).
|
|
8
10
|
*
|
|
9
11
|
* @module
|
|
10
12
|
*/
|
|
11
|
-
import { deserialize as deserializeHtml } from '@rtif-sdk/format-html';
|
|
12
13
|
// ---------------------------------------------------------------------------
|
|
13
14
|
// Plain text handler
|
|
14
15
|
// ---------------------------------------------------------------------------
|
|
@@ -86,7 +87,7 @@ export function createPlainTextHandler(generateBlockId) {
|
|
|
86
87
|
* @param blocks - Source blocks to insert
|
|
87
88
|
* @param context - The content pipeline context
|
|
88
89
|
*/
|
|
89
|
-
function insertBlocksAsOps(blocks, context) {
|
|
90
|
+
export function insertBlocksAsOps(blocks, context) {
|
|
90
91
|
let insertOffset = context.deleteSelectionAndGetOffset();
|
|
91
92
|
const ops = [];
|
|
92
93
|
// Track the offsets where each new block starts, for set_span_marks later
|
|
@@ -249,44 +250,4 @@ function parseRtifPayload(jsonStr) {
|
|
|
249
250
|
return null;
|
|
250
251
|
}
|
|
251
252
|
}
|
|
252
|
-
// ---------------------------------------------------------------------------
|
|
253
|
-
// HTML paste handler
|
|
254
|
-
// ---------------------------------------------------------------------------
|
|
255
|
-
/**
|
|
256
|
-
* Create a content handler for HTML paste.
|
|
257
|
-
*
|
|
258
|
-
* Accepts `text/html` content and deserializes it via `@rtif-sdk/format-html`,
|
|
259
|
-
* preserving formatting (bold, italic, links, headings, lists, code blocks, etc.).
|
|
260
|
-
*
|
|
261
|
-
* Priority: -90 (between RTIF JSON and plain text).
|
|
262
|
-
*
|
|
263
|
-
* @returns A ContentHandler for HTML paste
|
|
264
|
-
*
|
|
265
|
-
* @example
|
|
266
|
-
* ```ts
|
|
267
|
-
* const handler = createHtmlPasteHandler();
|
|
268
|
-
* pipeline.register(handler);
|
|
269
|
-
* ```
|
|
270
|
-
*/
|
|
271
|
-
export function createHtmlPasteHandler() {
|
|
272
|
-
return {
|
|
273
|
-
id: 'rtif:html',
|
|
274
|
-
accept: ['text/html'],
|
|
275
|
-
priority: -90,
|
|
276
|
-
async handle(item, context) {
|
|
277
|
-
const html = await item.getString();
|
|
278
|
-
if (html === null || html === '')
|
|
279
|
-
return false;
|
|
280
|
-
const doc = deserializeHtml(html);
|
|
281
|
-
// Check if deserialization produced only a single empty block
|
|
282
|
-
if (doc.blocks.length === 1 &&
|
|
283
|
-
doc.blocks[0].spans.length === 1 &&
|
|
284
|
-
doc.blocks[0].spans[0].text === '') {
|
|
285
|
-
return false;
|
|
286
|
-
}
|
|
287
|
-
insertBlocksAsOps(doc.blocks, context);
|
|
288
|
-
return true;
|
|
289
|
-
},
|
|
290
|
-
};
|
|
291
|
-
}
|
|
292
253
|
//# sourceMappingURL=content-handlers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-handlers.js","sourceRoot":"","sources":["../src/content-handlers.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"content-handlers.js","sourceRoot":"","sources":["../src/content-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drop-indicator.d.ts","sourceRoot":"","sources":["../src/drop-indicator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"drop-indicator.d.ts","sourceRoot":"","sources":["../src/drop-indicator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAcH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;;;;;;;OAYG;gBACS,SAAS,EAAE,WAAW;IAmBlC;;;;;;;;;;OAUG;IACH,WAAW,IAAI,IAAI;IAcnB;;;;;;;;;;;;;;OAcG;IACH,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI;IAwBvE;;;;;;;OAOG;IACH,IAAI,IAAI,IAAI;IAMZ;;;;;;;;;;OAUG;IACH,OAAO,IAAI,IAAI;IAmBf,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,YAAY;CAKrB"}
|