@rtif-sdk/web 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Context menu — right-click menu with Cut/Copy/Paste/Select All.
3
+ *
4
+ * Shows a positioned menu on `contextmenu` events with keyboard navigation,
5
+ * viewport clamping, and ARIA roles. Items are configurable via
6
+ * `ContextMenuConfig` on {@link WebEditorConfig}.
7
+ *
8
+ * @module
9
+ */
10
+ import type { IEditorEngine } from '@rtif-sdk/engine';
11
+ import type { WebEditor, ContextMenuItem, ContextMenuHandle } from './types.js';
12
+ /**
13
+ * Get the default context menu items (Cut, Copy, Paste, Paste as Plain Text,
14
+ * separator, Select All).
15
+ *
16
+ * @returns An array of default context menu items
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * const items = getDefaultItems();
21
+ * ```
22
+ */
23
+ export declare function getDefaultItems(): ContextMenuItem[];
24
+ /**
25
+ * Dependencies for creating a context menu. Internal — not exported as a
26
+ * public type. The `createWebEditor` factory wires these from its own scope.
27
+ */
28
+ interface ContextMenuDeps {
29
+ readonly editor: WebEditor;
30
+ readonly root: HTMLElement;
31
+ readonly engine: IEditorEngine;
32
+ readonly isReadOnly: () => boolean;
33
+ readonly items?: ReadonlyArray<ContextMenuItem>;
34
+ readonly additionalItems?: ReadonlyArray<ContextMenuItem>;
35
+ }
36
+ /**
37
+ * Create a context menu attached to the editor root.
38
+ *
39
+ * Intercepts the `contextmenu` event, builds the menu DOM, and manages
40
+ * keyboard navigation plus outside-click dismissal.
41
+ *
42
+ * @param deps - Dependencies injected by the editor factory
43
+ * @returns A {@link ContextMenuHandle} for programmatic control and cleanup
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * const handle = createContextMenu({ editor, root, engine, isReadOnly: () => false });
48
+ * // later:
49
+ * handle.dispose();
50
+ * ```
51
+ */
52
+ export declare function createContextMenu(deps: ContextMenuDeps): ContextMenuHandle;
53
+ export {};
54
+ //# sourceMappingURL=context-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-menu.d.ts","sourceRoot":"","sources":["../src/context-menu.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EAGf,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAcpB;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI,eAAe,EAAE,CA6DnD;AA0GD;;;GAGG;AACH,UAAU,eAAe;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAChD,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;CAC3D;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,iBAAiB,CAyS1E"}
@@ -0,0 +1,470 @@
1
+ /**
2
+ * Context menu — right-click menu with Cut/Copy/Paste/Select All.
3
+ *
4
+ * Shows a positioned menu on `contextmenu` events with keyboard navigation,
5
+ * viewport clamping, and ARIA roles. Items are configurable via
6
+ * `ContextMenuConfig` on {@link WebEditorConfig}.
7
+ *
8
+ * @module
9
+ */
10
+ import { docLength } from '@rtif-sdk/core';
11
+ import { isMac } from './cursor-nav.js';
12
+ import { deleteSelectionOps } from './clipboard.js';
13
+ // ---------------------------------------------------------------------------
14
+ // Module-scoped counter for unique IDs
15
+ // ---------------------------------------------------------------------------
16
+ let instanceCounter = 0;
17
+ // ---------------------------------------------------------------------------
18
+ // Default items
19
+ // ---------------------------------------------------------------------------
20
+ /**
21
+ * Get the default context menu items (Cut, Copy, Paste, Paste as Plain Text,
22
+ * separator, Select All).
23
+ *
24
+ * @returns An array of default context menu items
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * const items = getDefaultItems();
29
+ * ```
30
+ */
31
+ export function getDefaultItems() {
32
+ const mac = isMac();
33
+ const mod = mac ? '\u2318' : 'Ctrl+';
34
+ return [
35
+ {
36
+ type: 'action',
37
+ id: 'cut',
38
+ label: 'Cut',
39
+ shortcutHint: `${mod}X`,
40
+ // execCommand('cut') triggers a ClipboardEvent which the RTIF
41
+ // ClipboardHandler intercepts — writing RTIF JSON + plain text
42
+ // to the clipboard and deleting the selection via ops.
43
+ action: () => { document.execCommand('cut'); },
44
+ isDisabled: (ctx) => ctx.isCollapsed || ctx.readOnly,
45
+ },
46
+ {
47
+ type: 'action',
48
+ id: 'copy',
49
+ label: 'Copy',
50
+ shortcutHint: `${mod}C`,
51
+ // Same as cut — the ClipboardHandler writes RTIF JSON + plain text.
52
+ action: () => { document.execCommand('copy'); },
53
+ isDisabled: (ctx) => ctx.isCollapsed,
54
+ },
55
+ {
56
+ type: 'action',
57
+ id: 'paste',
58
+ label: 'Paste',
59
+ shortcutHint: `${mod}V`,
60
+ action: (editor) => {
61
+ // Read from navigator.clipboard and feed through the content
62
+ // pipeline. This preserves RTIF JSON if available, otherwise
63
+ // falls back to HTML → plain text.
64
+ pasteViaClipboardApi(editor);
65
+ },
66
+ isDisabled: (ctx) => ctx.readOnly,
67
+ },
68
+ {
69
+ type: 'action',
70
+ id: 'paste-plain',
71
+ label: 'Paste as Plain Text',
72
+ shortcutHint: mac ? '\u21e7\u2318V' : 'Ctrl+Shift+V',
73
+ action: (editor) => { pasteAsPlainText(editor); },
74
+ isDisabled: (ctx) => ctx.readOnly,
75
+ },
76
+ { type: 'separator' },
77
+ {
78
+ type: 'action',
79
+ id: 'select-all',
80
+ label: 'Select All',
81
+ shortcutHint: `${mod}A`,
82
+ action: (editor) => {
83
+ const len = docLength(editor.engine.state.doc);
84
+ editor.engine.setSelection({
85
+ anchor: { offset: 0 },
86
+ focus: { offset: len },
87
+ });
88
+ },
89
+ },
90
+ ];
91
+ }
92
+ // ---------------------------------------------------------------------------
93
+ // Paste helpers
94
+ // ---------------------------------------------------------------------------
95
+ /**
96
+ * Read clipboard contents and feed through the content pipeline.
97
+ * Uses the async Clipboard API (`navigator.clipboard.read()`) when available,
98
+ * falling back to `readText()` for plain text only.
99
+ */
100
+ function pasteViaClipboardApi(editor) {
101
+ // Try the full ClipboardItem API first for rich paste
102
+ if (typeof navigator.clipboard?.read === 'function') {
103
+ void navigator.clipboard.read().then((clipboardItems) => {
104
+ const items = [];
105
+ for (const ci of clipboardItems) {
106
+ for (const type of ci.types) {
107
+ items.push({
108
+ type,
109
+ source: 'paste',
110
+ getString: async () => {
111
+ try {
112
+ const blob = await ci.getType(type);
113
+ return await blob.text();
114
+ }
115
+ catch {
116
+ return null;
117
+ }
118
+ },
119
+ getFile: async () => null,
120
+ getBlob: async () => {
121
+ try {
122
+ return await ci.getType(type);
123
+ }
124
+ catch {
125
+ return null;
126
+ }
127
+ },
128
+ });
129
+ }
130
+ }
131
+ if (items.length > 0) {
132
+ void editor.content.process(items, {
133
+ engine: editor.engine,
134
+ commands: editor.commandBus,
135
+ source: 'paste',
136
+ generateBlockId: () => `b_cm_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
137
+ });
138
+ }
139
+ }).catch(() => {
140
+ // Clipboard API denied — fall back to plain text
141
+ pasteAsPlainText(editor);
142
+ });
143
+ return;
144
+ }
145
+ // Fallback: plain text only
146
+ pasteAsPlainText(editor);
147
+ }
148
+ /**
149
+ * Read plain text from the clipboard and insert it, stripping all formatting.
150
+ * Handles selection deletion and newline splitting.
151
+ */
152
+ function pasteAsPlainText(editor) {
153
+ if (typeof navigator.clipboard?.readText !== 'function')
154
+ return;
155
+ void navigator.clipboard.readText().then((text) => {
156
+ if (!text)
157
+ return;
158
+ const doc = editor.engine.state.doc;
159
+ const sel = editor.engine.state.selection;
160
+ const ops = [];
161
+ const start = Math.min(sel.anchor.offset, sel.focus.offset);
162
+ // Delete selection if non-collapsed
163
+ if (sel.anchor.offset !== sel.focus.offset) {
164
+ ops.push(...deleteSelectionOps(doc, sel));
165
+ }
166
+ // Insert plain text — split on newlines into insert_text + split_block
167
+ const lines = text.split('\n');
168
+ let offset = start;
169
+ for (let i = 0; i < lines.length; i++) {
170
+ if (i > 0) {
171
+ ops.push({
172
+ type: 'split_block',
173
+ offset,
174
+ newBlockId: `b_cm_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
175
+ });
176
+ offset += 1;
177
+ }
178
+ const line = lines[i];
179
+ if (line.length > 0) {
180
+ ops.push({ type: 'insert_text', offset, text: line });
181
+ offset += line.length;
182
+ }
183
+ }
184
+ if (ops.length > 0) {
185
+ editor.engine.dispatch(ops);
186
+ }
187
+ });
188
+ }
189
+ // ---------------------------------------------------------------------------
190
+ // Factory
191
+ // ---------------------------------------------------------------------------
192
+ /**
193
+ * Create a context menu attached to the editor root.
194
+ *
195
+ * Intercepts the `contextmenu` event, builds the menu DOM, and manages
196
+ * keyboard navigation plus outside-click dismissal.
197
+ *
198
+ * @param deps - Dependencies injected by the editor factory
199
+ * @returns A {@link ContextMenuHandle} for programmatic control and cleanup
200
+ *
201
+ * @example
202
+ * ```ts
203
+ * const handle = createContextMenu({ editor, root, engine, isReadOnly: () => false });
204
+ * // later:
205
+ * handle.dispose();
206
+ * ```
207
+ */
208
+ export function createContextMenu(deps) {
209
+ const { editor, root, engine, isReadOnly } = deps;
210
+ const id = ++instanceCounter;
211
+ let menuEl = null;
212
+ let isMenuOpen = false;
213
+ let justShown = false;
214
+ let highlightIndex = -1;
215
+ let actionItems = [];
216
+ let itemEls = [];
217
+ // Resolve items
218
+ const resolvedItems = deps.items
219
+ ? deps.items
220
+ : [...getDefaultItems(), ...(deps.additionalItems ?? [])];
221
+ // -------------------------------------------------------------------
222
+ // Context building
223
+ // -------------------------------------------------------------------
224
+ function buildContext() {
225
+ const sel = engine.state.selection;
226
+ const isCollapsed = sel.anchor.offset === sel.focus.offset;
227
+ const block = engine.getBlockAtOffset(sel.focus.offset);
228
+ const marks = engine.getMarksAtOffset(sel.focus.offset);
229
+ return {
230
+ isCollapsed,
231
+ readOnly: isReadOnly(),
232
+ blockType: block?.type ?? 'text',
233
+ marks,
234
+ };
235
+ }
236
+ // -------------------------------------------------------------------
237
+ // DOM creation
238
+ // -------------------------------------------------------------------
239
+ function createMenuElement(x, y) {
240
+ const ctx = buildContext();
241
+ const container = document.createElement('div');
242
+ container.className = 'rtif-context-menu';
243
+ container.setAttribute('role', 'menu');
244
+ container.setAttribute('aria-label', 'Context menu');
245
+ actionItems = [];
246
+ itemEls = [];
247
+ let itemCounter = 0;
248
+ for (const item of resolvedItems) {
249
+ if (item.type === 'separator') {
250
+ const sep = document.createElement('div');
251
+ sep.setAttribute('role', 'separator');
252
+ sep.className = 'rtif-context-menu-separator';
253
+ container.appendChild(sep);
254
+ continue;
255
+ }
256
+ // Action item
257
+ if (item.canShow && !item.canShow(ctx))
258
+ continue;
259
+ const disabled = item.isDisabled ? item.isDisabled(ctx) : false;
260
+ const itemEl = document.createElement('div');
261
+ itemEl.className = 'rtif-context-menu-item';
262
+ itemEl.id = `rtif-cm-item-${id}-${itemCounter++}`;
263
+ itemEl.setAttribute('role', 'menuitem');
264
+ if (disabled) {
265
+ itemEl.setAttribute('aria-disabled', 'true');
266
+ }
267
+ // Label
268
+ const label = document.createElement('span');
269
+ label.className = 'rtif-context-menu-item-label';
270
+ label.textContent = item.label;
271
+ itemEl.appendChild(label);
272
+ // Shortcut hint
273
+ if (item.shortcutHint) {
274
+ const hint = document.createElement('span');
275
+ hint.className = 'rtif-context-menu-item-shortcut';
276
+ hint.textContent = item.shortcutHint;
277
+ itemEl.appendChild(hint);
278
+ }
279
+ // Click handler
280
+ if (!disabled) {
281
+ itemEl.addEventListener('mousedown', (e) => {
282
+ e.preventDefault();
283
+ e.stopPropagation();
284
+ item.action(editor);
285
+ hide();
286
+ editor.focus();
287
+ });
288
+ }
289
+ else {
290
+ // Prevent focus steal on disabled items
291
+ itemEl.addEventListener('mousedown', (e) => {
292
+ e.preventDefault();
293
+ });
294
+ }
295
+ // Hover highlight
296
+ itemEl.addEventListener('mouseenter', () => {
297
+ if (!disabled) {
298
+ const idx = actionItems.indexOf(item);
299
+ if (idx !== -1) {
300
+ highlightIndex = idx;
301
+ updateHighlight();
302
+ }
303
+ }
304
+ });
305
+ container.appendChild(itemEl);
306
+ actionItems.push(item);
307
+ itemEls.push(itemEl);
308
+ }
309
+ // Prevent editor focus loss when interacting with menu
310
+ container.addEventListener('mousedown', (e) => {
311
+ e.preventDefault();
312
+ });
313
+ // Position with viewport clamping
314
+ document.body.appendChild(container);
315
+ const menuRect = container.getBoundingClientRect();
316
+ let left = x;
317
+ let top = y;
318
+ // Clamp right edge
319
+ if (left + menuRect.width > window.innerWidth - 4) {
320
+ left = window.innerWidth - menuRect.width - 4;
321
+ }
322
+ if (left < 4) {
323
+ left = 4;
324
+ }
325
+ // Flip above if near bottom
326
+ if (top + menuRect.height > window.innerHeight - 4) {
327
+ top = y - menuRect.height;
328
+ }
329
+ if (top < 4) {
330
+ top = 4;
331
+ }
332
+ container.style.left = `${left}px`;
333
+ container.style.top = `${top}px`;
334
+ return container;
335
+ }
336
+ // -------------------------------------------------------------------
337
+ // Show / hide
338
+ // -------------------------------------------------------------------
339
+ function show(x, y) {
340
+ hide();
341
+ menuEl = createMenuElement(x, y);
342
+ isMenuOpen = true;
343
+ highlightIndex = -1;
344
+ // Prevent the same-tick outside-click from immediately closing
345
+ justShown = true;
346
+ requestAnimationFrame(() => { justShown = false; });
347
+ // Attach dismiss listeners
348
+ document.addEventListener('mousedown', onDocumentMouseDown);
349
+ document.addEventListener('keydown', onKeyDown, true);
350
+ }
351
+ function hide() {
352
+ if (!menuEl)
353
+ return;
354
+ menuEl.remove();
355
+ menuEl = null;
356
+ isMenuOpen = false;
357
+ highlightIndex = -1;
358
+ actionItems = [];
359
+ itemEls = [];
360
+ document.removeEventListener('mousedown', onDocumentMouseDown);
361
+ document.removeEventListener('keydown', onKeyDown, true);
362
+ }
363
+ // -------------------------------------------------------------------
364
+ // Keyboard navigation
365
+ // -------------------------------------------------------------------
366
+ function findNextEnabledIndex(from, direction) {
367
+ const len = actionItems.length;
368
+ if (len === 0)
369
+ return -1;
370
+ let idx = from;
371
+ for (let i = 0; i < len; i++) {
372
+ idx = ((idx + direction) % len + len) % len;
373
+ const item = actionItems[idx];
374
+ const ctx = buildContext();
375
+ const disabled = item.isDisabled ? item.isDisabled(ctx) : false;
376
+ if (!disabled)
377
+ return idx;
378
+ }
379
+ return -1;
380
+ }
381
+ function updateHighlight() {
382
+ for (let i = 0; i < itemEls.length; i++) {
383
+ const el = itemEls[i];
384
+ if (i === highlightIndex) {
385
+ el.classList.add('rtif-context-menu-item-highlighted');
386
+ }
387
+ else {
388
+ el.classList.remove('rtif-context-menu-item-highlighted');
389
+ }
390
+ }
391
+ if (highlightIndex >= 0 && highlightIndex < itemEls.length) {
392
+ menuEl?.setAttribute('aria-activedescendant', itemEls[highlightIndex].id);
393
+ }
394
+ else {
395
+ menuEl?.removeAttribute('aria-activedescendant');
396
+ }
397
+ }
398
+ function onKeyDown(e) {
399
+ if (!isMenuOpen)
400
+ return;
401
+ switch (e.key) {
402
+ case 'ArrowDown': {
403
+ e.preventDefault();
404
+ e.stopPropagation();
405
+ highlightIndex = findNextEnabledIndex(highlightIndex, 1);
406
+ updateHighlight();
407
+ break;
408
+ }
409
+ case 'ArrowUp': {
410
+ e.preventDefault();
411
+ e.stopPropagation();
412
+ highlightIndex = findNextEnabledIndex(highlightIndex, -1);
413
+ updateHighlight();
414
+ break;
415
+ }
416
+ case 'Enter': {
417
+ e.preventDefault();
418
+ e.stopPropagation();
419
+ if (highlightIndex >= 0 && highlightIndex < actionItems.length) {
420
+ const item = actionItems[highlightIndex];
421
+ item.action(editor);
422
+ hide();
423
+ editor.focus();
424
+ }
425
+ break;
426
+ }
427
+ case 'Escape': {
428
+ e.preventDefault();
429
+ e.stopPropagation();
430
+ hide();
431
+ editor.focus();
432
+ break;
433
+ }
434
+ }
435
+ }
436
+ // -------------------------------------------------------------------
437
+ // Event handlers
438
+ // -------------------------------------------------------------------
439
+ function onDocumentMouseDown(e) {
440
+ if (!menuEl)
441
+ return;
442
+ if (justShown)
443
+ return;
444
+ if (menuEl.contains(e.target))
445
+ return;
446
+ hide();
447
+ }
448
+ function onContextMenu(e) {
449
+ e.preventDefault();
450
+ show(e.clientX, e.clientY);
451
+ }
452
+ // -------------------------------------------------------------------
453
+ // Attach
454
+ // -------------------------------------------------------------------
455
+ root.addEventListener('contextmenu', onContextMenu);
456
+ // -------------------------------------------------------------------
457
+ // Handle
458
+ // -------------------------------------------------------------------
459
+ const handle = {
460
+ get isOpen() { return isMenuOpen; },
461
+ show,
462
+ hide,
463
+ dispose() {
464
+ hide();
465
+ root.removeEventListener('contextmenu', onContextMenu);
466
+ },
467
+ };
468
+ return handle;
469
+ }
470
+ //# sourceMappingURL=context-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-menu.js","sourceRoot":"","sources":["../src/context-menu.ts"],"names":[],"mappings":"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"}
package/dist/editor.d.ts CHANGED
@@ -14,7 +14,7 @@ import type { WebEditorConfig, WebEditor } from './types.js';
14
14
  * Create a web editor instance backed by the RTIF engine.
15
15
  *
16
16
  * Sets up `contenteditable`, attaches all event handlers, performs the initial
17
- * render, and optionally auto-focuses. Returns a {@link WebEditor} handle.
17
+ * render, and optionally auto-focuses. Returns a {@link WebEditor} instance with imperative control methods.
18
18
  *
19
19
  * @param config - Editor configuration (root element, engine, options)
20
20
  * @returns A WebEditor instance with imperative control methods
@@ -1 +1 @@
1
- {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAwB,MAAM,YAAY,CAAC;AAmDnF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAy0BlE"}
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EAKV,MAAM,YAAY,CAAC;AAgIpB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAq5BlE"}