@rtif-sdk/web 1.1.0 → 1.4.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.
Files changed (52) hide show
  1. package/dist/block-drag-handler.js +4 -1
  2. package/dist/block-drag-handler.js.map +1 -1
  3. package/dist/content-handler-html.d.ts +28 -0
  4. package/dist/content-handler-html.d.ts.map +1 -0
  5. package/dist/content-handler-html.js +49 -0
  6. package/dist/content-handler-html.js.map +1 -0
  7. package/dist/content-handlers.d.ts +20 -19
  8. package/dist/content-handlers.d.ts.map +1 -1
  9. package/dist/content-handlers.js +4 -43
  10. package/dist/content-handlers.js.map +1 -1
  11. package/dist/editor.d.ts.map +1 -1
  12. package/dist/editor.js +119 -5
  13. package/dist/editor.js.map +1 -1
  14. package/dist/index.d.ts +12 -4
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +15 -3
  17. package/dist/index.js.map +1 -1
  18. package/dist/preset-basic.d.ts +20 -0
  19. package/dist/preset-basic.d.ts.map +1 -0
  20. package/dist/preset-basic.js +28 -0
  21. package/dist/preset-basic.js.map +1 -0
  22. package/dist/preset-full.d.ts +22 -0
  23. package/dist/preset-full.d.ts.map +1 -0
  24. package/dist/preset-full.js +66 -0
  25. package/dist/preset-full.js.map +1 -0
  26. package/dist/preset-plaintext.d.ts +20 -0
  27. package/dist/preset-plaintext.d.ts.map +1 -0
  28. package/dist/preset-plaintext.js +19 -0
  29. package/dist/preset-plaintext.js.map +1 -0
  30. package/dist/preset-standard.d.ts +22 -0
  31. package/dist/preset-standard.d.ts.map +1 -0
  32. package/dist/preset-standard.js +47 -0
  33. package/dist/preset-standard.js.map +1 -0
  34. package/dist/presets.d.ts +7 -88
  35. package/dist/presets.d.ts.map +1 -1
  36. package/dist/presets.js +7 -152
  37. package/dist/presets.js.map +1 -1
  38. package/dist/renderer.d.ts +29 -0
  39. package/dist/renderer.d.ts.map +1 -1
  40. package/dist/renderer.js +107 -77
  41. package/dist/renderer.js.map +1 -1
  42. package/dist/spatial-index.d.ts +203 -0
  43. package/dist/spatial-index.d.ts.map +1 -0
  44. package/dist/spatial-index.js +211 -0
  45. package/dist/spatial-index.js.map +1 -0
  46. package/dist/types.d.ts +82 -0
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/virtual-viewport.d.ts +241 -0
  49. package/dist/virtual-viewport.d.ts.map +1 -0
  50. package/dist/virtual-viewport.js +584 -0
  51. package/dist/virtual-viewport.js.map +1 -0
  52. package/package.json +1 -1
@@ -0,0 +1,584 @@
1
+ /**
2
+ * Virtual viewport for block-level DOM virtualization.
3
+ *
4
+ * Manages which blocks are rendered into the DOM based on scroll position,
5
+ * using spacer elements to maintain correct scroll height. Only blocks
6
+ * within the visible range (plus a configurable buffer) are present in the
7
+ * DOM at any time, enabling smooth editing of documents with thousands of
8
+ * blocks.
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ import { createSpatialIndex } from './spatial-index.js';
13
+ import { createBlockElement, reconcileBlock } from './renderer.js';
14
+ // ---------------------------------------------------------------------------
15
+ // Helpers
16
+ // ---------------------------------------------------------------------------
17
+ /**
18
+ * Walk DOM ancestors of an element to find the nearest scrollable container.
19
+ *
20
+ * Checks `getComputedStyle(el).overflowY` for `auto` or `scroll`. If no
21
+ * scrollable ancestor is found (including `document.body` and
22
+ * `document.documentElement`), returns `window`.
23
+ *
24
+ * @param el - The element to start searching from
25
+ * @returns The nearest scrollable ancestor, or `window`
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * const scroller = findScrollParent(editorRoot);
30
+ * scroller.addEventListener('scroll', onScroll);
31
+ * ```
32
+ */
33
+ export function findScrollParent(el) {
34
+ let current = el.parentElement;
35
+ while (current && current !== document.body && current !== document.documentElement) {
36
+ const overflow = getComputedStyle(current).overflowY;
37
+ if (overflow === 'auto' || overflow === 'scroll') {
38
+ return current;
39
+ }
40
+ current = current.parentElement;
41
+ }
42
+ return window;
43
+ }
44
+ /**
45
+ * Create a spacer div element for the virtual viewport.
46
+ *
47
+ * Spacers are invisible, non-interactive, non-editable elements that
48
+ * maintain scroll height for blocks not rendered in the DOM.
49
+ */
50
+ function createSpacer(position) {
51
+ const el = document.createElement('div');
52
+ el.setAttribute('data-rtif-spacer', position);
53
+ el.setAttribute('contenteditable', 'false');
54
+ el.setAttribute('aria-hidden', 'true');
55
+ el.style.visibility = 'hidden';
56
+ el.style.overflow = 'hidden';
57
+ el.style.pointerEvents = 'none';
58
+ el.style.height = '0px';
59
+ return el;
60
+ }
61
+ /**
62
+ * Read scroll metrics from a scroll container, adjusted for the root
63
+ * element's offset within the container.
64
+ *
65
+ * When the root has siblings above it (e.g., a toolbar), we subtract
66
+ * the root's top offset so that scrollTop=0 corresponds to the top of
67
+ * the editor content, not the top of the scroll container.
68
+ */
69
+ function getScrollMetrics(scrollContainer, root) {
70
+ if (scrollContainer === window) {
71
+ // Root's top in viewport coordinates; negative means scrolled past the top
72
+ const rootRect = root.getBoundingClientRect();
73
+ return {
74
+ scrollTop: Math.max(0, -rootRect.top),
75
+ viewportHeight: window.innerHeight,
76
+ };
77
+ }
78
+ const el = scrollContainer;
79
+ // Compute root's offset relative to the scroll container's content origin
80
+ const rootOffset = root.offsetTop - el.offsetTop;
81
+ return {
82
+ scrollTop: Math.max(0, el.scrollTop - rootOffset),
83
+ viewportHeight: el.clientHeight,
84
+ };
85
+ }
86
+ /**
87
+ * Update spacer element heights based on the current rendered range
88
+ * and spatial index.
89
+ */
90
+ function updateSpacerHeights(topSpacer, bottomSpacer, renderedRange, spatialIndex) {
91
+ const blockCount = spatialIndex.blockCount();
92
+ const topHeight = renderedRange.start > 0
93
+ ? spatialIndex.blockTop(renderedRange.start)
94
+ : 0;
95
+ const bottomHeight = renderedRange.end < blockCount
96
+ ? spatialIndex.totalHeight() - spatialIndex.blockTop(renderedRange.end)
97
+ : 0;
98
+ topSpacer.style.height = `${topHeight}px`;
99
+ bottomSpacer.style.height = `${bottomHeight}px`;
100
+ }
101
+ // ---------------------------------------------------------------------------
102
+ // Factory
103
+ // ---------------------------------------------------------------------------
104
+ /**
105
+ * Create a virtual viewport for block-level DOM virtualization.
106
+ *
107
+ * The viewport renders only blocks within the visible scroll region (plus
108
+ * a configurable buffer), using spacer elements to maintain correct scroll
109
+ * height. As the user scrolls, blocks entering the viewport are created
110
+ * and blocks leaving are removed.
111
+ *
112
+ * @param config - Viewport configuration (root element, buffer size, etc.)
113
+ * @param doc - The initial RTIF document
114
+ * @returns A {@link VirtualViewport} instance
115
+ *
116
+ * @example
117
+ * ```ts
118
+ * import { createVirtualViewport } from '@rtif-sdk/web';
119
+ *
120
+ * const vp = createVirtualViewport({ root: editorEl, bufferSize: 15 }, doc);
121
+ * vp.renderInitial(doc, markRenderers, blockRenderers, blockElementMap);
122
+ *
123
+ * // On document change:
124
+ * vp.reconcile(prevDoc, nextDoc, null, markRenderers, blockRenderers, blockElementMap);
125
+ *
126
+ * // Cleanup:
127
+ * vp.destroy();
128
+ * ```
129
+ */
130
+ export function createVirtualViewport(config, doc) {
131
+ const root = config.root;
132
+ const bufferSize = config.bufferSize ?? 10;
133
+ // Hysteresis: blocks are removed when they're this many blocks beyond the
134
+ // buffer, but added at the normal buffer distance. Prevents DOM thrashing
135
+ // at scroll boundaries.
136
+ const evictMargin = 5;
137
+ // Build spatial index
138
+ const spatialIndex = createSpatialIndex(doc, {
139
+ estimatedBlockHeight: config.estimatedBlockHeight,
140
+ blockTypeHeights: config.blockTypeHeights,
141
+ });
142
+ // Internal state
143
+ let _doc = doc;
144
+ let _renderedRange = { start: 0, end: 0 };
145
+ const _pinnedBlockIds = new Set();
146
+ let _topSpacer = createSpacer('top');
147
+ let _bottomSpacer = createSpacer('bottom');
148
+ let _scrollRAF = null;
149
+ let _destroyed = false;
150
+ let _expanded = false;
151
+ // Stored renderer references (updated on renderInitial/reconcile calls)
152
+ let _markRenderers;
153
+ let _blockRenderers;
154
+ let _blockElementMap;
155
+ // Persistent blockId → index map. Rebuilt when _doc changes.
156
+ // Avoids O(n) map construction in measureRenderedHeights and reconcile.
157
+ let _blockIdToIndex = new Map();
158
+ function rebuildBlockIdToIndex() {
159
+ _blockIdToIndex = new Map();
160
+ for (let i = 0; i < _doc.blocks.length; i++) {
161
+ _blockIdToIndex.set(_doc.blocks[i].id, i);
162
+ }
163
+ }
164
+ // Build the initial index
165
+ rebuildBlockIdToIndex();
166
+ // Scroll container
167
+ const _scrollContainer = config.scrollContainer ?? findScrollParent(root);
168
+ // -------------------------------------------------------------------
169
+ // Scroll listener
170
+ // -------------------------------------------------------------------
171
+ function handleScroll() {
172
+ if (_destroyed || _expanded)
173
+ return;
174
+ if (_scrollRAF !== null)
175
+ return;
176
+ _scrollRAF = requestAnimationFrame(() => {
177
+ _scrollRAF = null;
178
+ if (_destroyed || _expanded)
179
+ return;
180
+ applyVisibleRange();
181
+ });
182
+ }
183
+ // Attach scroll listener
184
+ _scrollContainer.addEventListener('scroll', handleScroll, { passive: true });
185
+ // -------------------------------------------------------------------
186
+ // O(1) insertion helper
187
+ // -------------------------------------------------------------------
188
+ /**
189
+ * Insert a block element at the correct position in the root, maintaining
190
+ * document order. Uses the rendered range and blockElementMap to find the
191
+ * insertion point in O(1) for the common case (sequential insertion at
192
+ * range edges), falling back to O(k) scan of rendered blocks for
193
+ * out-of-order insertions.
194
+ */
195
+ function insertBlockElement(el, blockIndex) {
196
+ // Fast path: inserting at the end of the rendered range — insert before
197
+ // the bottom spacer.
198
+ if (blockIndex >= _renderedRange.end - 1) {
199
+ root.insertBefore(el, _bottomSpacer);
200
+ return;
201
+ }
202
+ // Fast path: inserting at the start of the rendered range — insert after
203
+ // the top spacer.
204
+ if (blockIndex <= _renderedRange.start) {
205
+ const afterTopSpacer = _topSpacer.nextSibling;
206
+ root.insertBefore(el, afterTopSpacer);
207
+ return;
208
+ }
209
+ // General case: find the first rendered block after this index.
210
+ // Only scan within the rendered range (not the full doc).
211
+ const scanEnd = Math.min(_renderedRange.end, _doc.blocks.length);
212
+ for (let i = blockIndex + 1; i < scanEnd; i++) {
213
+ const block = _doc.blocks[i];
214
+ const existingEl = _blockElementMap?.get(block.id);
215
+ if (existingEl && existingEl.parentNode === root) {
216
+ root.insertBefore(el, existingEl);
217
+ return;
218
+ }
219
+ }
220
+ // No later block found in DOM -- insert before bottom spacer
221
+ root.insertBefore(el, _bottomSpacer);
222
+ }
223
+ // -------------------------------------------------------------------
224
+ // Core range computation and DOM sync
225
+ // -------------------------------------------------------------------
226
+ /**
227
+ * Compute the visible range and synchronize the DOM accordingly.
228
+ * Adds blocks entering the range, removes blocks leaving the range
229
+ * (with hysteresis to prevent thrashing), and updates spacer heights.
230
+ */
231
+ function applyVisibleRange() {
232
+ const { scrollTop, viewportHeight } = getScrollMetrics(_scrollContainer, root);
233
+ const newRange = spatialIndex.computeVisibleRange(scrollTop, viewportHeight, bufferSize);
234
+ const prevStart = _renderedRange.start;
235
+ const prevEnd = _renderedRange.end;
236
+ const nextStart = newRange.start;
237
+ const nextEnd = newRange.end;
238
+ // Hysteresis: only remove blocks that are evictMargin beyond the new range.
239
+ // This prevents DOM thrashing when scrolling right at the buffer boundary.
240
+ const evictStart = Math.max(0, nextStart - evictMargin);
241
+ const evictEnd = Math.min(_doc.blocks.length, nextEnd + evictMargin);
242
+ // Remove blocks that have scrolled far out of range (from the top)
243
+ for (let i = prevStart; i < Math.min(prevEnd, evictStart); i++) {
244
+ removeBlockAtIndex(i);
245
+ }
246
+ // Remove blocks that have scrolled far out of range (from the bottom)
247
+ for (let i = Math.max(prevStart, evictEnd); i < prevEnd; i++) {
248
+ removeBlockAtIndex(i);
249
+ }
250
+ // Add blocks that have scrolled into range (at the top)
251
+ for (let i = nextStart; i < Math.min(nextEnd, prevStart); i++) {
252
+ addBlockAtIndex(i);
253
+ }
254
+ // Add blocks that have scrolled into range (at the bottom)
255
+ for (let i = Math.max(nextStart, prevEnd); i < nextEnd; i++) {
256
+ addBlockAtIndex(i);
257
+ }
258
+ _renderedRange = { start: nextStart, end: nextEnd };
259
+ updateSpacerHeights(_topSpacer, _bottomSpacer, _renderedRange, spatialIndex);
260
+ measureRenderedHeights();
261
+ }
262
+ /**
263
+ * Remove a block element at the given document index from the DOM,
264
+ * unless it is pinned.
265
+ */
266
+ function removeBlockAtIndex(index) {
267
+ if (index < 0 || index >= _doc.blocks.length)
268
+ return;
269
+ const block = _doc.blocks[index];
270
+ if (_pinnedBlockIds.has(block.id))
271
+ return;
272
+ const el = _blockElementMap?.get(block.id);
273
+ if (el && el.parentNode === root) {
274
+ root.removeChild(el);
275
+ _blockElementMap?.delete(block.id);
276
+ }
277
+ }
278
+ /**
279
+ * Create and insert a block element at the given document index.
280
+ * Skips if the block is already in the DOM.
281
+ */
282
+ function addBlockAtIndex(index) {
283
+ if (index < 0 || index >= _doc.blocks.length)
284
+ return;
285
+ const block = _doc.blocks[index];
286
+ // Skip if already rendered
287
+ if (_blockElementMap?.get(block.id)?.parentNode === root)
288
+ return;
289
+ const el = createBlockElement(block, _markRenderers, _blockRenderers);
290
+ insertBlockElement(el, index);
291
+ _blockElementMap?.set(block.id, el);
292
+ }
293
+ /**
294
+ * Measure DOM heights of all currently rendered block elements and
295
+ * update the spatial index. Uses the persistent _blockIdToIndex map
296
+ * to avoid O(n) map construction on every call.
297
+ */
298
+ function measureRenderedHeights() {
299
+ if (!_blockElementMap)
300
+ return;
301
+ const updates = [];
302
+ for (const [blockId, el] of _blockElementMap) {
303
+ if (el.parentNode !== root)
304
+ continue;
305
+ const idx = _blockIdToIndex.get(blockId);
306
+ if (idx === undefined)
307
+ continue;
308
+ const height = el.offsetHeight;
309
+ if (height > 0 && height !== spatialIndex.blockHeight(idx)) {
310
+ updates.push({ index: idx, height });
311
+ }
312
+ }
313
+ if (updates.length > 0) {
314
+ spatialIndex.setBlockHeights(updates);
315
+ }
316
+ }
317
+ // -------------------------------------------------------------------
318
+ // Public API
319
+ // -------------------------------------------------------------------
320
+ const viewport = {
321
+ get spatialIndex() {
322
+ return spatialIndex;
323
+ },
324
+ get renderedRange() {
325
+ return _renderedRange;
326
+ },
327
+ get pinnedBlockIds() {
328
+ return _pinnedBlockIds;
329
+ },
330
+ renderInitial(doc, markRenderers, blockRenderers, blockElementMap) {
331
+ _doc = doc;
332
+ _markRenderers = markRenderers;
333
+ _blockRenderers = blockRenderers;
334
+ _blockElementMap = blockElementMap;
335
+ // Rebuild spatial index and block ID map for the new document
336
+ spatialIndex.rebuild(doc);
337
+ rebuildBlockIdToIndex();
338
+ // Clear root children
339
+ while (root.firstChild) {
340
+ root.removeChild(root.firstChild);
341
+ }
342
+ if (_blockElementMap) {
343
+ _blockElementMap.clear();
344
+ }
345
+ // Create spacers
346
+ _topSpacer = createSpacer('top');
347
+ _bottomSpacer = createSpacer('bottom');
348
+ root.appendChild(_topSpacer);
349
+ root.appendChild(_bottomSpacer);
350
+ // Compute initial visible range
351
+ const { scrollTop, viewportHeight } = getScrollMetrics(_scrollContainer, root);
352
+ const range = spatialIndex.computeVisibleRange(scrollTop, viewportHeight, bufferSize);
353
+ _renderedRange = { start: range.start, end: range.end };
354
+ // Render blocks in the visible range
355
+ for (let i = range.start; i < range.end; i++) {
356
+ const block = doc.blocks[i];
357
+ const el = createBlockElement(block, markRenderers, blockRenderers);
358
+ root.insertBefore(el, _bottomSpacer);
359
+ if (_blockElementMap) {
360
+ _blockElementMap.set(block.id, el);
361
+ }
362
+ }
363
+ // Update spacer heights
364
+ updateSpacerHeights(_topSpacer, _bottomSpacer, _renderedRange, spatialIndex);
365
+ // Measure actual heights and update spatial index
366
+ measureRenderedHeights();
367
+ },
368
+ reconcile(prevDoc, nextDoc, composingBlockId, markRenderers, blockRenderers, blockElementMap) {
369
+ // Update stored references
370
+ _markRenderers = markRenderers;
371
+ _blockRenderers = blockRenderers;
372
+ _blockElementMap = blockElementMap;
373
+ // Build a map of measured heights from prevDoc blocks for preservation.
374
+ // Uses the still-valid _blockIdToIndex from the previous doc.
375
+ const preserveHeights = new Map();
376
+ for (let i = 0; i < prevDoc.blocks.length; i++) {
377
+ const block = prevDoc.blocks[i];
378
+ const idx = _blockIdToIndex.get(block.id);
379
+ if (idx !== undefined && idx < spatialIndex.blockCount()) {
380
+ preserveHeights.set(block.id, spatialIndex.blockHeight(idx));
381
+ }
382
+ }
383
+ // Rebuild spatial index and block ID map from nextDoc
384
+ spatialIndex.rebuild(nextDoc, preserveHeights);
385
+ _doc = nextDoc;
386
+ rebuildBlockIdToIndex();
387
+ // Build prev block lookup
388
+ const prevBlockById = new Map();
389
+ for (const block of prevDoc.blocks) {
390
+ prevBlockById.set(block.id, block);
391
+ }
392
+ // Compute new visible range
393
+ const { scrollTop, viewportHeight } = getScrollMetrics(_scrollContainer, root);
394
+ const newRange = _expanded
395
+ ? { start: 0, end: nextDoc.blocks.length }
396
+ : spatialIndex.computeVisibleRange(scrollTop, viewportHeight, bufferSize);
397
+ // Build set of block IDs that should be rendered
398
+ const shouldRender = new Set();
399
+ for (let i = newRange.start; i < newRange.end; i++) {
400
+ shouldRender.add(nextDoc.blocks[i].id);
401
+ }
402
+ // Also include pinned blocks and the composing block
403
+ for (const pinnedId of _pinnedBlockIds) {
404
+ shouldRender.add(pinnedId);
405
+ }
406
+ if (composingBlockId !== null) {
407
+ shouldRender.add(composingBlockId);
408
+ }
409
+ // Build set of next doc block IDs for removal detection
410
+ const nextBlockIds = _blockIdToIndex; // reuse — same keys
411
+ // Remove blocks no longer in the document or outside the render range
412
+ if (_blockElementMap) {
413
+ const toRemove = [];
414
+ for (const [blockId] of _blockElementMap) {
415
+ if (!nextBlockIds.has(blockId) || !shouldRender.has(blockId)) {
416
+ toRemove.push(blockId);
417
+ }
418
+ }
419
+ for (const blockId of toRemove) {
420
+ // Don't remove pinned blocks even if outside range
421
+ if (_pinnedBlockIds.has(blockId) && nextBlockIds.has(blockId))
422
+ continue;
423
+ const el = _blockElementMap.get(blockId);
424
+ if (el && el.parentNode === root) {
425
+ root.removeChild(el);
426
+ }
427
+ _blockElementMap.delete(blockId);
428
+ }
429
+ }
430
+ // Reconcile or create blocks in the rendered range
431
+ for (let i = newRange.start; i < newRange.end; i++) {
432
+ const nextBlock = nextDoc.blocks[i];
433
+ const prevBlock = prevBlockById.get(nextBlock.id);
434
+ const existingEl = _blockElementMap?.get(nextBlock.id);
435
+ if (existingEl && existingEl.parentNode === root) {
436
+ // Block exists -- reconcile it
437
+ const result = reconcileBlock(root, existingEl, prevBlock, nextBlock, composingBlockId, markRenderers, blockRenderers);
438
+ if (result !== existingEl) {
439
+ _blockElementMap?.set(nextBlock.id, result);
440
+ }
441
+ // Ensure correct position
442
+ insertBlockElement(result, i);
443
+ }
444
+ else {
445
+ // New block or block re-entering range -- create and insert
446
+ const el = createBlockElement(nextBlock, markRenderers, blockRenderers);
447
+ insertBlockElement(el, i);
448
+ _blockElementMap?.set(nextBlock.id, el);
449
+ }
450
+ }
451
+ // Also reconcile pinned blocks that are outside the newRange
452
+ for (const pinnedId of _pinnedBlockIds) {
453
+ if (!nextBlockIds.has(pinnedId))
454
+ continue;
455
+ const pinnedIndex = _blockIdToIndex.get(pinnedId);
456
+ if (pinnedIndex === undefined)
457
+ continue;
458
+ if (pinnedIndex >= newRange.start && pinnedIndex < newRange.end)
459
+ continue; // Already handled
460
+ const nextBlock = nextDoc.blocks[pinnedIndex];
461
+ const prevBlock = prevBlockById.get(pinnedId);
462
+ const existingEl = _blockElementMap?.get(pinnedId);
463
+ if (existingEl && existingEl.parentNode === root) {
464
+ const result = reconcileBlock(root, existingEl, prevBlock, nextBlock, composingBlockId, markRenderers, blockRenderers);
465
+ if (result !== existingEl) {
466
+ _blockElementMap?.set(pinnedId, result);
467
+ }
468
+ }
469
+ else {
470
+ const el = createBlockElement(nextBlock, markRenderers, blockRenderers);
471
+ insertBlockElement(el, pinnedIndex);
472
+ _blockElementMap?.set(pinnedId, el);
473
+ }
474
+ }
475
+ _renderedRange = { start: newRange.start, end: newRange.end };
476
+ // Update spacer heights
477
+ if (!_expanded) {
478
+ updateSpacerHeights(_topSpacer, _bottomSpacer, _renderedRange, spatialIndex);
479
+ }
480
+ // Measure heights
481
+ measureRenderedHeights();
482
+ },
483
+ ensureRendered(blockIndex) {
484
+ if (blockIndex < 0 || blockIndex >= _doc.blocks.length) {
485
+ return null;
486
+ }
487
+ const block = _doc.blocks[blockIndex];
488
+ // Already rendered?
489
+ const existing = _blockElementMap?.get(block.id);
490
+ if (existing && existing.parentNode === root) {
491
+ return existing;
492
+ }
493
+ // Create and insert
494
+ const el = createBlockElement(block, _markRenderers, _blockRenderers);
495
+ insertBlockElement(el, blockIndex);
496
+ _blockElementMap?.set(block.id, el);
497
+ // Expand rendered range to include this index
498
+ const newStart = Math.min(_renderedRange.start, blockIndex);
499
+ const newEnd = Math.max(_renderedRange.end, blockIndex + 1);
500
+ _renderedRange = { start: newStart, end: newEnd };
501
+ // Update spacers to account for the expanded range
502
+ if (!_expanded) {
503
+ updateSpacerHeights(_topSpacer, _bottomSpacer, _renderedRange, spatialIndex);
504
+ }
505
+ return el;
506
+ },
507
+ pin(blockId) {
508
+ _pinnedBlockIds.add(blockId);
509
+ },
510
+ unpin(blockId) {
511
+ _pinnedBlockIds.delete(blockId);
512
+ },
513
+ onScroll() {
514
+ handleScroll();
515
+ },
516
+ measureHeights() {
517
+ measureRenderedHeights();
518
+ },
519
+ expandAll() {
520
+ if (_expanded) {
521
+ // Already expanded -- return no-op restore
522
+ return () => { };
523
+ }
524
+ _expanded = true;
525
+ // Use a DocumentFragment to batch all new block insertions,
526
+ // avoiding per-element reflow during the expand.
527
+ const fragment = document.createDocumentFragment();
528
+ const blocksToInsert = [];
529
+ for (let i = 0; i < _doc.blocks.length; i++) {
530
+ const block = _doc.blocks[i];
531
+ const existing = _blockElementMap?.get(block.id);
532
+ if (existing && existing.parentNode === root)
533
+ continue;
534
+ const el = createBlockElement(block, _markRenderers, _blockRenderers);
535
+ blocksToInsert.push({ el, index: i });
536
+ _blockElementMap?.set(block.id, el);
537
+ }
538
+ // Insert blocks in document order. Since we're using a fragment,
539
+ // we need to insert each batch at the correct position.
540
+ // For simplicity and correctness, insert directly (the fragment
541
+ // approach is complex with interleaved existing elements).
542
+ // Instead, batch by collecting all new elements and inserting them
543
+ // at their correct positions.
544
+ for (const { el, index } of blocksToInsert) {
545
+ insertBlockElement(el, index);
546
+ }
547
+ _renderedRange = { start: 0, end: _doc.blocks.length };
548
+ // Zero out spacers since all blocks are rendered
549
+ _topSpacer.style.height = '0px';
550
+ _bottomSpacer.style.height = '0px';
551
+ // Measure all heights
552
+ measureRenderedHeights();
553
+ // Return restore function
554
+ return () => {
555
+ _expanded = false;
556
+ // Recompute visible range and remove non-visible blocks
557
+ const { scrollTop, viewportHeight } = getScrollMetrics(_scrollContainer, root);
558
+ const newRange = spatialIndex.computeVisibleRange(scrollTop, viewportHeight, bufferSize);
559
+ // Remove blocks outside the new range (unless pinned)
560
+ for (let i = 0; i < _doc.blocks.length; i++) {
561
+ if (i >= newRange.start && i < newRange.end)
562
+ continue;
563
+ removeBlockAtIndex(i);
564
+ }
565
+ _renderedRange = { start: newRange.start, end: newRange.end };
566
+ updateSpacerHeights(_topSpacer, _bottomSpacer, _renderedRange, spatialIndex);
567
+ };
568
+ },
569
+ destroy() {
570
+ _destroyed = true;
571
+ // Cancel pending rAF
572
+ if (_scrollRAF !== null) {
573
+ cancelAnimationFrame(_scrollRAF);
574
+ _scrollRAF = null;
575
+ }
576
+ // Remove scroll listener
577
+ _scrollContainer.removeEventListener('scroll', handleScroll);
578
+ // Clear pinned set
579
+ _pinnedBlockIds.clear();
580
+ },
581
+ };
582
+ return viewport;
583
+ }
584
+ //# sourceMappingURL=virtual-viewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-viewport.js","sourceRoot":"","sources":["../src/virtual-viewport.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rtif-sdk/web",
3
- "version": "1.1.0",
3
+ "version": "1.4.0",
4
4
  "description": "RTIF web platform implementation (contenteditable)",
5
5
  "author": "coryrobinson42@gmail.com",
6
6
  "type": "module",