superdoc 1.0.0-beta.37 → 1.0.0-beta.39

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 (30) hide show
  1. package/dist/chunks/{PdfViewer-ioYMTqps.cjs → PdfViewer-Beeg4BCm.cjs} +1 -1
  2. package/dist/chunks/{PdfViewer-C7M9_O_G.es.js → PdfViewer-eV3LwCxv.es.js} +1 -1
  3. package/dist/chunks/{index-CVmL6SHD-DZlLqgFx.es.js → index-BqDEyWLQ-B3TrQVjX.es.js} +1 -1
  4. package/dist/chunks/{index-CVmL6SHD-LYqtvXZO.cjs → index-BqDEyWLQ-CCRXZcrp.cjs} +1 -1
  5. package/dist/chunks/{index-CEh5e5Sy.cjs → index-DdrGP1Py.cjs} +3 -3
  6. package/dist/chunks/{index-tgFI32Kk.es.js → index-DvGFHOzb.es.js} +3 -3
  7. package/dist/chunks/{super-editor.es-Bk7tbTHB.es.js → super-editor.es-CQM3jM5n.es.js} +633 -126
  8. package/dist/chunks/{super-editor.es-CqPIzvls.cjs → super-editor.es-Uiy2hAKb.cjs} +633 -126
  9. package/dist/packages/superdoc/src/core/SuperDoc.d.ts.map +1 -1
  10. package/dist/style.css +12 -12
  11. package/dist/super-editor/ai-writer.es.js +2 -2
  12. package/dist/super-editor/chunks/{converter-ubqPT9rF.js → converter-nztpWkGr.js} +31 -22
  13. package/dist/super-editor/chunks/{docx-zipper-w_7HFRZI.js → docx-zipper-DaYim92a.js} +1 -1
  14. package/dist/super-editor/chunks/{editor-Udi34-u-.js → editor-H7c-XUpw.js} +542 -66
  15. package/dist/super-editor/chunks/{index-CVmL6SHD.js → index-BqDEyWLQ.js} +1 -1
  16. package/dist/super-editor/chunks/{toolbar-CKT2hVa-.js → toolbar-MtmAPa0Z.js} +2 -2
  17. package/dist/super-editor/converter.es.js +1 -1
  18. package/dist/super-editor/docx-zipper.es.js +2 -2
  19. package/dist/super-editor/editor.es.js +3 -3
  20. package/dist/super-editor/file-zipper.es.js +1 -1
  21. package/dist/super-editor/style.css +12 -12
  22. package/dist/super-editor/super-editor.es.js +169 -46
  23. package/dist/super-editor/toolbar.es.js +2 -2
  24. package/dist/super-editor.cjs +1 -1
  25. package/dist/super-editor.es.js +1 -1
  26. package/dist/superdoc.cjs +2 -2
  27. package/dist/superdoc.es.js +2 -2
  28. package/dist/superdoc.umd.js +635 -128
  29. package/dist/superdoc.umd.js.map +1 -1
  30. package/package.json +1 -1
@@ -9,11 +9,11 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
9
9
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
10
10
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
11
11
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
12
- var _Attribute_static, getGlobalAttributes_fn, getNodeAndMarksAttributes_fn, _Schema_static, createNodesSchema_fn, createMarksSchema_fn, _events, _ExtensionService_instances, setupExtensions_fn, attachEditorEvents_fn, _editor, _stateValidators, _xmlValidators, _requiredNodeTypes, _requiredMarkTypes, _SuperValidator_instances, initializeValidators_fn, collectValidatorRequirements_fn, analyzeDocument_fn, dispatchWithFallback_fn, _commandService, _Editor_instances, initContainerElement_fn, init_fn, initRichText_fn, onFocus_fn, checkHeadless_fn, registerCopyHandler_fn, insertNewFileData_fn, getPluginKeyName_fn, createExtensionService_fn, createCommandService_fn, createConverter_fn, initMedia_fn, initFonts_fn, checkFonts_fn, determineUnsupportedFonts_fn, createSchema_fn, generatePmData_fn, createView_fn, onCollaborationReady_fn, initComments_fn, dispatchTransaction_fn, handleNodeSelection_fn, prepareDocumentForImport_fn, prepareDocumentForExport_fn, endCollaboration_fn, validateDocumentInit_fn, validateDocumentExport_fn, initDevTools_fn, _map, _editor2, _descriptors, _collections, _editorEntries, _maxCachedEditors, _editorAccessOrder, _pendingCreations, _cacheHits, _cacheMisses, _evictions, _HeaderFooterEditorManager_instances, hasConverter_fn, extractCollections_fn, collectDescriptors_fn, teardownMissingEditors_fn, teardownEditors_fn, createEditor_fn, createEditorContainer_fn, registerConverterEditor_fn, unregisterConverterEditor_fn, updateAccessOrder_fn, enforceCacheSizeLimit_fn, _manager, _mediaFiles, _blockCache, _HeaderFooterLayoutAdapter_instances, getBlocks_fn, getConverterContext_fn, _selectionOverlay, _activeEditorHost, _activeDecorationContainer, _activeRegion, _borderLine, _dimmingOverlay, _EditorOverlayManager_instances, findDecorationContainer_fn, ensureEditorHost_fn, positionEditorHost_fn, hideDimmingOverlay_fn, showHeaderFooterBorder_fn, hideHeaderFooterBorder_fn, _instances, _options, _editor3, _visibleHost, _viewportHost, _painterHost, _selectionOverlay2, _hiddenHost, _layoutOptions, _layoutState, _domPainter, _dragHandlerCleanup, _layoutError, _layoutErrorState, _errorBanner, _errorBannerMessage, _telemetryEmitter, _renderScheduled, _pendingDocChange, _isRerendering, _selectionUpdateScheduled, _remoteCursorUpdateScheduled, _rafHandle, _editorListeners, _sectionMetadata, _documentMode, _inputBridge, _trackedChangesMode, _trackedChangesEnabled, _trackedChangesOverrides, _headerFooterManager, _headerFooterAdapter, _headerFooterIdentifier, _multiSectionIdentifier, _headerLayoutResults, _footerLayoutResults, _headerLayoutsByRId, _footerLayoutsByRId, _headerDecorationProvider, _footerDecorationProvider, _headerFooterManagerCleanups, _headerRegions, _footerRegions, _session, _activeHeaderFooterEditor, _overlayManager, _hoverOverlay, _hoverTooltip, _modeBanner, _ariaLiveRegion, _hoverRegion, _clickCount, _lastClickTime, _lastClickPosition, _lastSelectedImageBlockId, _dragAnchor, _isDragging, _dragExtensionMode, _remoteCursorState, _remoteCursorElements, _remoteCursorDirty, _remoteCursorOverlay, _localSelectionLayer, _awarenessCleanup, _scrollCleanup, _scrollTimeout, _lastRemoteCursorRenderTime, _remoteCursorThrottleTimeout, _PresentationEditor_instances, collectCommentPositions_fn, aggregateLayoutBounds_fn, safeCleanup_fn, setupEditorListeners_fn, setupCollaborationCursors_fn, updateLocalAwarenessCursor_fn, normalizeAwarenessStates_fn, getFallbackColor_fn, getValidatedColor_fn, scheduleRemoteCursorUpdate_fn, scheduleRemoteCursorReRender_fn, updateRemoteCursors_fn, renderRemoteCursors_fn, renderRemoteCaret_fn, renderRemoteCursorLabel_fn, renderRemoteSelection_fn, setupPointerHandlers_fn, setupDragHandlers_fn, setupInputBridge_fn, initHeaderFooterRegistry_fn, _handlePointerDown, getFirstTextPosition_fn, registerPointerClick_fn, selectWordAt_fn, selectParagraphAt_fn, calculateExtendedSelection_fn, isWordCharacter_fn, _handlePointerMove, _handlePointerLeave, _handlePointerUp, _handleDragOver, _handleDrop, _handleDoubleClick, _handleKeyDown, focusHeaderFooterShortcut_fn, scheduleRerender_fn, flushRerenderQueue_fn, rerender_fn, ensurePainter_fn, scheduleSelectionUpdate_fn, updateSelection_fn, resolveLayoutOptions_fn, buildHeaderFooterInput_fn, computeHeaderFooterConstraints_fn, layoutPerRIdHeaderFooters_fn, updateDecorationProviders_fn, createDecorationProvider_fn, findHeaderFooterPageForPageNumber_fn, computeDecorationBox_fn, rebuildHeaderFooterRegions_fn, hitTestHeaderFooterRegion_fn, pointInRegion_fn, activateHeaderFooterRegion_fn, enterHeaderFooterMode_fn, exitHeaderFooterMode_fn, getActiveDomTarget_fn, emitHeaderFooterModeChanged_fn, emitHeaderFooterEditingContext_fn, updateAwarenessSession_fn, updateModeBanner_fn, announce_fn, validateHeaderFooterEditPermission_fn, emitHeaderFooterEditBlocked_fn, resolveDescriptorForRegion_fn, createDefaultHeaderFooter_fn, getPageElement_fn, scrollPageIntoView_fn, computeAnchorMap_fn, waitForPageMount_fn, getBodyPageHeight_fn, getHeaderFooterPageHeight_fn, renderSelectionRects_fn, renderHoverRegion_fn, clearHoverRegion_fn, renderCaretOverlay_fn, getHeaderFooterContext_fn, computeHeaderFooterSelectionRects_fn, syncTrackedChangesPreferences_fn, deriveTrackedChangesMode_fn, deriveTrackedChangesEnabled_fn, getTrackChangesPluginState_fn, computeDefaultLayoutDefaults_fn, parseColumns_fn, inchesToPx_fn, applyZoom_fn, createLayoutMetrics_fn, convertPageLocalToOverlayCoords_fn, normalizeClientPoint_fn, computeCaretLayoutRect_fn, computeCaretLayoutRectFromDOM_fn, computeTableCaretLayoutRect_fn, findLineContainingPos_fn, lineHeightBeforeIndex_fn, getCurrentPageIndex_fn, findRegionForPage_fn, handleLayoutError_fn, decorateError_fn, showLayoutErrorBanner_fn, dismissErrorBanner_fn, createHiddenHost_fn, _windowRoot, _layoutSurfaces, _getTargetDom, _isEditable, _onTargetChanged, _listeners, _currentTarget, _destroyed, _useWindowFallback, _PresentationInputBridge_instances, addListener_fn, dispatchToTarget_fn, forwardKeyboardEvent_fn, forwardTextEvent_fn, forwardCompositionEvent_fn, forwardContextMenu_fn, isEventOnActiveTarget_fn, shouldSkipSurface_fn, isInLayoutSurface_fn, getListenerTargets_fn, isPlainCharacterKey_fn, _DocumentSectionView_instances, init_fn2, addToolTip_fn, _ParagraphNodeView_instances, checkShouldUpdate_fn, updateHTMLAttributes_fn, updateDOMStyles_fn, resolveNeighborParagraphProperties_fn, updateListStyles_fn, initList_fn, checkIsList_fn, createMarker_fn, createSeparator_fn, calculateTabSeparatorStyle_fn, calculateMarkerStyle_fn, removeList_fn, getParagraphContext_fn, scheduleAnimation_fn, cancelScheduledAnimation_fn, _FieldAnnotationView_instances, createAnnotation_fn, _AutoPageNumberNodeView_instances, renderDom_fn, scheduleUpdateNodeStyle_fn, _VectorShapeView_instances, ensureParentPositioned_fn, _ShapeGroupView_instances, ensureParentPositioned_fn2;
12
+ var _Attribute_static, getGlobalAttributes_fn, getNodeAndMarksAttributes_fn, _Schema_static, createNodesSchema_fn, createMarksSchema_fn, _events, _ExtensionService_instances, setupExtensions_fn, attachEditorEvents_fn, _editor, _stateValidators, _xmlValidators, _requiredNodeTypes, _requiredMarkTypes, _SuperValidator_instances, initializeValidators_fn, collectValidatorRequirements_fn, analyzeDocument_fn, dispatchWithFallback_fn, _commandService, _Editor_instances, initContainerElement_fn, init_fn, initRichText_fn, onFocus_fn, checkHeadless_fn, registerCopyHandler_fn, insertNewFileData_fn, getPluginKeyName_fn, createExtensionService_fn, createCommandService_fn, createConverter_fn, initMedia_fn, initFonts_fn, checkFonts_fn, determineUnsupportedFonts_fn, createSchema_fn, generatePmData_fn, createView_fn, onCollaborationReady_fn, initComments_fn, dispatchTransaction_fn, handleNodeSelection_fn, prepareDocumentForImport_fn, prepareDocumentForExport_fn, endCollaboration_fn, validateDocumentInit_fn, validateDocumentExport_fn, initDevTools_fn, _map, _editor2, _descriptors, _collections, _editorEntries, _maxCachedEditors, _editorAccessOrder, _pendingCreations, _cacheHits, _cacheMisses, _evictions, _HeaderFooterEditorManager_instances, hasConverter_fn, extractCollections_fn, collectDescriptors_fn, teardownMissingEditors_fn, teardownEditors_fn, createEditor_fn, createEditorContainer_fn, registerConverterEditor_fn, unregisterConverterEditor_fn, updateAccessOrder_fn, enforceCacheSizeLimit_fn, _manager, _mediaFiles, _blockCache, _HeaderFooterLayoutAdapter_instances, getBlocks_fn, getConverterContext_fn, _selectionOverlay, _activeEditorHost, _activeDecorationContainer, _activeRegion, _borderLine, _dimmingOverlay, _EditorOverlayManager_instances, findDecorationContainer_fn, ensureEditorHost_fn, positionEditorHost_fn, hideDimmingOverlay_fn, showHeaderFooterBorder_fn, hideHeaderFooterBorder_fn, _instances, _options, _editor3, _visibleHost, _viewportHost, _painterHost, _selectionOverlay2, _hiddenHost, _layoutOptions, _layoutState, _domPainter, _dragHandlerCleanup, _layoutError, _layoutErrorState, _errorBanner, _errorBannerMessage, _telemetryEmitter, _renderScheduled, _pendingDocChange, _isRerendering, _selectionUpdateScheduled, _remoteCursorUpdateScheduled, _rafHandle, _editorListeners, _sectionMetadata, _documentMode, _inputBridge, _trackedChangesMode, _trackedChangesEnabled, _trackedChangesOverrides, _headerFooterManager, _headerFooterAdapter, _headerFooterIdentifier, _multiSectionIdentifier, _headerLayoutResults, _footerLayoutResults, _headerLayoutsByRId, _footerLayoutsByRId, _headerDecorationProvider, _footerDecorationProvider, _headerFooterManagerCleanups, _headerRegions, _footerRegions, _session, _activeHeaderFooterEditor, _overlayManager, _hoverOverlay, _hoverTooltip, _modeBanner, _ariaLiveRegion, _hoverRegion, _clickCount, _lastClickTime, _lastClickPosition, _lastSelectedImageBlockId, _dragAnchor, _isDragging, _dragExtensionMode, _remoteCursorState, _remoteCursorElements, _remoteCursorDirty, _remoteCursorOverlay, _localSelectionLayer, _awarenessCleanup, _scrollCleanup, _scrollTimeout, _lastRemoteCursorRenderTime, _remoteCursorThrottleTimeout, _PresentationEditor_instances, collectCommentPositions_fn, aggregateLayoutBounds_fn, safeCleanup_fn, setupEditorListeners_fn, setupCollaborationCursors_fn, updateLocalAwarenessCursor_fn, normalizeAwarenessStates_fn, getFallbackColor_fn, getValidatedColor_fn, scheduleRemoteCursorUpdate_fn, scheduleRemoteCursorReRender_fn, updateRemoteCursors_fn, renderRemoteCursors_fn, renderRemoteCaret_fn, renderRemoteCursorLabel_fn, renderRemoteSelection_fn, setupPointerHandlers_fn, setupDragHandlers_fn, focusEditorAfterImageSelection_fn, setupInputBridge_fn, initHeaderFooterRegistry_fn, _handlePointerDown, getFirstTextPosition_fn, registerPointerClick_fn, selectWordAt_fn, selectParagraphAt_fn, calculateExtendedSelection_fn, isWordCharacter_fn, _handlePointerMove, _handlePointerLeave, _handlePointerUp, _handleDragOver, _handleDrop, _handleDoubleClick, _handleKeyDown, focusHeaderFooterShortcut_fn, scheduleRerender_fn, flushRerenderQueue_fn, rerender_fn, ensurePainter_fn, scheduleSelectionUpdate_fn, updateSelection_fn, resolveLayoutOptions_fn, buildHeaderFooterInput_fn, computeHeaderFooterConstraints_fn, layoutPerRIdHeaderFooters_fn, updateDecorationProviders_fn, createDecorationProvider_fn, findHeaderFooterPageForPageNumber_fn, computeDecorationBox_fn, rebuildHeaderFooterRegions_fn, hitTestHeaderFooterRegion_fn, pointInRegion_fn, activateHeaderFooterRegion_fn, enterHeaderFooterMode_fn, exitHeaderFooterMode_fn, getActiveDomTarget_fn, emitHeaderFooterModeChanged_fn, emitHeaderFooterEditingContext_fn, updateAwarenessSession_fn, updateModeBanner_fn, announce_fn, validateHeaderFooterEditPermission_fn, emitHeaderFooterEditBlocked_fn, resolveDescriptorForRegion_fn, createDefaultHeaderFooter_fn, getPageElement_fn, scrollPageIntoView_fn, computeAnchorMap_fn, waitForPageMount_fn, getBodyPageHeight_fn, getHeaderFooterPageHeight_fn, renderSelectionRects_fn, renderHoverRegion_fn, clearHoverRegion_fn, renderCaretOverlay_fn, getHeaderFooterContext_fn, computeHeaderFooterSelectionRects_fn, syncTrackedChangesPreferences_fn, deriveTrackedChangesMode_fn, deriveTrackedChangesEnabled_fn, getTrackChangesPluginState_fn, computeDefaultLayoutDefaults_fn, parseColumns_fn, inchesToPx_fn, applyZoom_fn, createLayoutMetrics_fn, convertPageLocalToOverlayCoords_fn, normalizeClientPoint_fn, computeCaretLayoutRect_fn, computeCaretLayoutRectFromDOM_fn, computeTableCaretLayoutRect_fn, findLineContainingPos_fn, lineHeightBeforeIndex_fn, getCurrentPageIndex_fn, findRegionForPage_fn, handleLayoutError_fn, decorateError_fn, showLayoutErrorBanner_fn, dismissErrorBanner_fn, createHiddenHost_fn, _windowRoot, _layoutSurfaces, _getTargetDom, _isEditable, _onTargetChanged, _listeners, _currentTarget, _destroyed, _useWindowFallback, _PresentationInputBridge_instances, addListener_fn, dispatchToTarget_fn, forwardKeyboardEvent_fn, forwardTextEvent_fn, forwardCompositionEvent_fn, forwardContextMenu_fn, isEventOnActiveTarget_fn, shouldSkipSurface_fn, isInLayoutSurface_fn, getListenerTargets_fn, isPlainCharacterKey_fn, _DocumentSectionView_instances, init_fn2, addToolTip_fn, _ParagraphNodeView_instances, checkShouldUpdate_fn, updateHTMLAttributes_fn, updateDOMStyles_fn, resolveNeighborParagraphProperties_fn, updateListStyles_fn, initList_fn, checkIsList_fn, createMarker_fn, createSeparator_fn, calculateTabSeparatorStyle_fn, calculateMarkerStyle_fn, removeList_fn, getParagraphContext_fn, scheduleAnimation_fn, cancelScheduledAnimation_fn, _FieldAnnotationView_instances, createAnnotation_fn, _AutoPageNumberNodeView_instances, renderDom_fn, scheduleUpdateNodeStyle_fn, _VectorShapeView_instances, ensureParentPositioned_fn, _ShapeGroupView_instances, ensureParentPositioned_fn2;
13
13
  import * as Y from "yjs";
14
14
  import { UndoManager, Item as Item$1, ContentType, Text as Text$1, XmlElement, encodeStateAsUpdate } from "yjs";
15
- import { P as PluginKey, a as Plugin, M as Mapping, N as NodeSelection, S as Selection, T as TextSelection, b as Slice, D as DOMSerializer, F as Fragment, c as DOMParser$1, d as Mark$1, e as dropPoint, A as AllSelection, p as process$1, B as Buffer2, f as callOrGet, g as getExtensionConfigField, h as getMarkType, i as getMarksFromSelection, j as getNodeType, k as getSchemaTypeNameByName, l as Schema$1, m as cleanSchemaItem, n as canSplit, o as defaultBlockAt$1, q as liftTarget, r as canJoin, s as joinPoint, t as replaceStep$1, R as ReplaceAroundStep$1, u as isTextSelection, v as getMarkRange, w as isMarkActive, x as isNodeActive, y as deleteProps, z as processContent, C as htmlHandler, E as ReplaceStep, G as twipsToInches, H as inchesToTwips, I as ptToTwips, J as getResolvedParagraphProperties, K as linesToTwips, L as changeListLevel, O as findParentNode, Q as isList, U as updateNumberingProperties, V as ListHelpers, W as isMacOS, X as isIOS, Y as getSchemaTypeByName, Z as inputRulesPlugin, _ as TrackDeleteMarkName$1, $ as TrackInsertMarkName$1, a0 as v4, a1 as TrackFormatMarkName$1, a2 as comments_module_events, a3 as findMark, a4 as objectIncludes, a5 as AddMarkStep, a6 as RemoveMarkStep, a7 as twipsToLines, a8 as pixelsToTwips, a9 as helpers, aa as posToDOMRect, ab as CommandService, ac as SuperConverter, ad as createDocument, ae as createDocFromMarkdown, af as createDocFromHTML, ag as EditorState, ah as isActive, ai as unflattenListsInHtml, aj as resolveParagraphProperties, ak as _getReferencedTableStyles, al as parseSizeUnit, am as minMax, an as updateDOMAttributes, ao as findChildren$5, ap as generateRandomSigned32BitIntStrId, aq as decodeRPrFromMarks, ar as calculateResolvedParagraphProperties, as as encodeCSSFromPPr, at as twipsToPixels$2, au as resolveRunProperties, av as encodeCSSFromRPr, aw as generateOrderedListIndex, ax as docxNumberingHelpers, ay as InputRule, az as convertSizeToCSS, aA as SelectionRange, aB as Transform, aC as findParentNodeClosestToPos, aD as isInTable$1, aE as generateDocxRandomId, aF as insertNewRelationship, aG as inchesToPixels, aH as kebabCase, aI as getUnderlineCssString } from "./converter-ubqPT9rF.js";
16
- import { D as DocxZipper } from "./docx-zipper-w_7HFRZI.js";
15
+ import { P as PluginKey, a as Plugin, M as Mapping, N as NodeSelection, S as Selection, T as TextSelection, b as Slice, D as DOMSerializer, F as Fragment, c as DOMParser$1, d as Mark$1, e as dropPoint, A as AllSelection, p as process$1, B as Buffer2, f as callOrGet, g as getExtensionConfigField, h as getMarkType, i as getMarksFromSelection, j as getNodeType, k as getSchemaTypeNameByName, l as Schema$1, m as cleanSchemaItem, n as canSplit, o as defaultBlockAt$1, q as liftTarget, r as canJoin, s as joinPoint, t as replaceStep$1, R as ReplaceAroundStep$1, u as isTextSelection, v as getMarkRange, w as isMarkActive, x as isNodeActive, y as deleteProps, z as processContent, C as htmlHandler, E as ReplaceStep, G as twipsToInches, H as inchesToTwips, I as ptToTwips, J as getResolvedParagraphProperties, K as linesToTwips, L as changeListLevel, O as findParentNode, Q as isList, U as updateNumberingProperties, V as ListHelpers, W as isMacOS, X as isIOS, Y as getSchemaTypeByName, Z as inputRulesPlugin, _ as TrackDeleteMarkName$1, $ as TrackInsertMarkName$1, a0 as v4, a1 as TrackFormatMarkName$1, a2 as comments_module_events, a3 as findMark, a4 as objectIncludes, a5 as AddMarkStep, a6 as RemoveMarkStep, a7 as twipsToLines, a8 as pixelsToTwips, a9 as helpers, aa as posToDOMRect, ab as CommandService, ac as SuperConverter, ad as createDocument, ae as createDocFromMarkdown, af as createDocFromHTML, ag as EditorState, ah as isActive, ai as unflattenListsInHtml, aj as resolveParagraphProperties, ak as _getReferencedTableStyles, al as parseSizeUnit, am as minMax, an as updateDOMAttributes, ao as findChildren$5, ap as generateRandomSigned32BitIntStrId, aq as decodeRPrFromMarks, ar as calculateResolvedParagraphProperties, as as encodeCSSFromPPr, at as twipsToPixels$2, au as resolveRunProperties, av as encodeCSSFromRPr, aw as generateOrderedListIndex, ax as docxNumberingHelpers, ay as InputRule, az as convertSizeToCSS, aA as SelectionRange, aB as Transform, aC as findParentNodeClosestToPos, aD as isInTable$1, aE as generateDocxRandomId, aF as insertNewRelationship, aG as inchesToPixels, aH as kebabCase, aI as getUnderlineCssString } from "./converter-nztpWkGr.js";
16
+ import { D as DocxZipper } from "./docx-zipper-DaYim92a.js";
17
17
  import { ref, computed, createElementBlock, openBlock, withModifiers, Fragment as Fragment$1, renderList, normalizeClass, createCommentVNode, toDisplayString, createElementVNode, createApp } from "vue";
18
18
  var GOOD_LEAF_SIZE = 200;
19
19
  var RopeSequence = function RopeSequence2() {
@@ -8946,11 +8946,13 @@ const unsetAllMarks = () => ({ tr, dispatch, editor }) => {
8946
8946
  selection = editor.options.lastSelection;
8947
8947
  }
8948
8948
  const { empty: empty2, ranges } = selection;
8949
- if (empty2) return true;
8950
8949
  if (dispatch) {
8951
- ranges.forEach((range) => {
8952
- tr.removeMark(range.$from.pos, range.$to.pos);
8953
- });
8950
+ if (!empty2) {
8951
+ ranges.forEach((range) => {
8952
+ tr.removeMark(range.$from.pos, range.$to.pos);
8953
+ });
8954
+ }
8955
+ tr.setStoredMarks([]);
8954
8956
  }
8955
8957
  return true;
8956
8958
  };
@@ -13913,7 +13915,7 @@ const isHeadless = (editor) => {
13913
13915
  const shouldSkipNodeView = (editor) => {
13914
13916
  return isHeadless(editor);
13915
13917
  };
13916
- const summaryVersion = "1.0.0-beta.37";
13918
+ const summaryVersion = "1.0.0-beta.39";
13917
13919
  const nodeKeys = ["group", "content", "marks", "inline", "atom", "defining", "code", "tableRole", "summary"];
13918
13920
  const markKeys = ["group", "inclusive", "excludes", "spanning", "code"];
13919
13921
  function mapAttributes(attrs) {
@@ -14705,7 +14707,7 @@ const _Editor = class _Editor extends EventEmitter {
14705
14707
  { default: remarkStringify },
14706
14708
  { default: remarkGfm }
14707
14709
  ] = await Promise.all([
14708
- import("./index-CVmL6SHD.js"),
14710
+ import("./index-BqDEyWLQ.js"),
14709
14711
  import("./index-DRCvimau.js"),
14710
14712
  import("./index-C_x_N6Uh.js"),
14711
14713
  import("./index-D_sWOSiG.js"),
@@ -14910,7 +14912,7 @@ const _Editor = class _Editor extends EventEmitter {
14910
14912
  * Process collaboration migrations
14911
14913
  */
14912
14914
  processCollaborationMigrations() {
14913
- console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.37");
14915
+ console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.39");
14914
14916
  if (!this.options.ydoc) return;
14915
14917
  const metaMap = this.options.ydoc.getMap("meta");
14916
14918
  let docVersion = metaMap.get("version");
@@ -17009,7 +17011,7 @@ const applyTextStyleMark = (run, attrs, themeColors) => {
17009
17011
  const fontSizePx = normalizeFontSizePx(attrs.fontSize);
17010
17012
  if (fontSizePx !== void 0 && fontSizePx >= 1 && fontSizePx <= 1e3) {
17011
17013
  run.fontSize = fontSizePx;
17012
- }
17014
+ } else if (attrs.fontSize !== void 0) ;
17013
17015
  if (isFiniteNumber(attrs.letterSpacing)) {
17014
17016
  const spacing = Number(attrs.letterSpacing);
17015
17017
  if (spacing >= -100 && spacing <= 100) {
@@ -19688,18 +19690,18 @@ const computeParagraphAttrs = (para, styleContext, listCounterContext, converter
19688
19690
  paragraphAttrs.rtl = true;
19689
19691
  }
19690
19692
  const explicitAlignment = normalizeAlignment(attrs.alignment ?? attrs.textAlign);
19693
+ const paragraphAlignment = typeof paragraphProps.justification === "string" ? normalizeAlignment(paragraphProps.justification) : void 0;
19691
19694
  const styleAlignment = hydrated?.alignment ? normalizeAlignment(hydrated.alignment) : void 0;
19692
- const paragraphAlignment = paragraphProps.justification ? normalizeAlignment(paragraphProps.justification) : void 0;
19693
19695
  if (bidi && adjustRightInd) {
19694
19696
  paragraphAttrs.alignment = "right";
19695
19697
  } else if (explicitAlignment) {
19696
19698
  paragraphAttrs.alignment = explicitAlignment;
19699
+ } else if (paragraphAlignment) {
19700
+ paragraphAttrs.alignment = paragraphAlignment;
19697
19701
  } else if (bidi) {
19698
19702
  paragraphAttrs.alignment = "right";
19699
19703
  } else if (styleAlignment) {
19700
19704
  paragraphAttrs.alignment = styleAlignment;
19701
- } else if (paragraphAlignment) {
19702
- paragraphAttrs.alignment = paragraphAlignment;
19703
19705
  } else if (computed2.paragraph.alignment) {
19704
19706
  paragraphAttrs.alignment = computed2.paragraph.alignment;
19705
19707
  }
@@ -25419,11 +25421,26 @@ const FIELD_ANNOTATION_STYLES = `
25419
25421
  z-index: 1000;
25420
25422
  }
25421
25423
  `;
25424
+ const IMAGE_SELECTION_STYLES = `
25425
+ /* Highlight for selected images (block or inline) */
25426
+ .superdoc-image-selected {
25427
+ outline: 2px solid #4a90e2;
25428
+ outline-offset: 2px;
25429
+ border-radius: 2px;
25430
+ box-shadow: 0 0 0 1px rgba(74, 144, 226, 0.35);
25431
+ }
25432
+
25433
+ /* Ensure inline images can be targeted */
25434
+ .superdoc-inline-image.superdoc-image-selected {
25435
+ outline-offset: 2px;
25436
+ }
25437
+ `;
25422
25438
  let printStylesInjected = false;
25423
25439
  let linkStylesInjected = false;
25424
25440
  let trackChangeStylesInjected = false;
25425
25441
  let sdtContainerStylesInjected = false;
25426
25442
  let fieldAnnotationStylesInjected = false;
25443
+ let imageSelectionStylesInjected = false;
25427
25444
  const ensurePrintStyles = (doc2) => {
25428
25445
  if (printStylesInjected || !doc2) return;
25429
25446
  const styleEl = doc2.createElement("style");
@@ -25464,6 +25481,14 @@ const ensureFieldAnnotationStyles = (doc2) => {
25464
25481
  doc2.head?.appendChild(styleEl);
25465
25482
  fieldAnnotationStylesInjected = true;
25466
25483
  };
25484
+ const ensureImageSelectionStyles = (doc2) => {
25485
+ if (imageSelectionStylesInjected || !doc2) return;
25486
+ const styleEl = doc2.createElement("style");
25487
+ styleEl.setAttribute("data-superdoc-image-selection-styles", "true");
25488
+ styleEl.textContent = IMAGE_SELECTION_STYLES;
25489
+ doc2.head?.appendChild(styleEl);
25490
+ imageSelectionStylesInjected = true;
25491
+ };
25467
25492
  const DOM_CLASS_NAMES = {
25468
25493
  /**
25469
25494
  * Class name for page container elements.
@@ -26364,6 +26389,7 @@ const _DomPainter = class _DomPainter {
26364
26389
  ensureTrackChangeStyles(doc2);
26365
26390
  ensureFieldAnnotationStyles(doc2);
26366
26391
  ensureSdtContainerStyles(doc2);
26392
+ ensureImageSelectionStyles(doc2);
26367
26393
  mount.classList.add(CLASS_NAMES$1.container);
26368
26394
  if (this.mount && this.mount !== mount) {
26369
26395
  this.resetState();
@@ -26899,7 +26925,7 @@ const _DomPainter = class _DomPainter {
26899
26925
  if (fragment.continuesOnNext) {
26900
26926
  fragmentEl.dataset.continuesOnNext = "true";
26901
26927
  }
26902
- const lines = measure.lines.slice(fragment.fromLine, fragment.toLine);
26928
+ const lines = fragment.lines ?? measure.lines.slice(fragment.fromLine, fragment.toLine);
26903
26929
  applyParagraphBlockStyles(fragmentEl, block.attrs);
26904
26930
  if (block.attrs?.styleId) {
26905
26931
  fragmentEl.dataset.styleId = block.attrs.styleId;
@@ -27996,6 +28022,7 @@ const _DomPainter = class _DomPainter {
27996
28022
  return null;
27997
28023
  }
27998
28024
  const img = this.doc.createElement("img");
28025
+ img.classList.add("superdoc-inline-image");
27999
28026
  const isDataUrl = typeof run.src === "string" && run.src.startsWith("data:");
28000
28027
  if (isDataUrl) {
28001
28028
  if (run.src.length > MAX_DATA_URL_LENGTH) {
@@ -30533,6 +30560,23 @@ function layoutParagraphBlock(ctx2, anchors) {
30533
30560
  }
30534
30561
  }
30535
30562
  let lines = normalizeLines(measure);
30563
+ const measurementWidth = lines[0]?.maxWidth;
30564
+ let didRemeasureForColumnWidth = false;
30565
+ if (typeof remeasureParagraph2 === "function" && typeof measurementWidth === "number" && measurementWidth > columnWidth) {
30566
+ let firstLineIndent = 0;
30567
+ const wordLayout = block.attrs?.wordLayout;
30568
+ if (wordLayout?.marker && measure.marker) {
30569
+ const markerJustification = wordLayout.marker.justification ?? "left";
30570
+ if (markerJustification === "left") {
30571
+ const markerWidth = measure.marker.markerWidth ?? 0;
30572
+ const gutterWidth = measure.marker.gutterWidth ?? wordLayout.marker.gutterWidthPx ?? 0;
30573
+ firstLineIndent = markerWidth + gutterWidth;
30574
+ }
30575
+ }
30576
+ const newMeasure = remeasureParagraph2(block, columnWidth, firstLineIndent);
30577
+ lines = normalizeLines(newMeasure);
30578
+ didRemeasureForColumnWidth = true;
30579
+ }
30536
30580
  let fromLine = 0;
30537
30581
  const spacing = block.attrs?.spacing ?? {};
30538
30582
  const styleId = block.attrs?.styleId;
@@ -30608,7 +30652,17 @@ function layoutParagraphBlock(ctx2, anchors) {
30608
30652
  tempY += lineHeight;
30609
30653
  }
30610
30654
  if (narrowestWidth < columnWidth) {
30611
- const newMeasure = remeasureParagraph2(block, narrowestWidth);
30655
+ let firstLineIndent = 0;
30656
+ const wordLayout = block.attrs?.wordLayout;
30657
+ if (wordLayout?.marker && measure.marker) {
30658
+ const markerJustification = wordLayout.marker.justification ?? "left";
30659
+ if (markerJustification === "left") {
30660
+ const markerWidth = measure.marker.markerWidth ?? 0;
30661
+ const gutterWidth = measure.marker.gutterWidth ?? wordLayout.marker.gutterWidthPx ?? 0;
30662
+ firstLineIndent = markerWidth + gutterWidth;
30663
+ }
30664
+ }
30665
+ const newMeasure = remeasureParagraph2(block, narrowestWidth, firstLineIndent);
30612
30666
  lines = normalizeLines(newMeasure);
30613
30667
  didRemeasureForFloats = true;
30614
30668
  }
@@ -30673,6 +30727,9 @@ function layoutParagraphBlock(ctx2, anchors) {
30673
30727
  width: effectiveColumnWidth,
30674
30728
  ...computeFragmentPmRange(block, lines, fromLine, slice2.toLine)
30675
30729
  };
30730
+ if (didRemeasureForColumnWidth) {
30731
+ fragment.lines = lines.slice(fromLine, slice2.toLine);
30732
+ }
30676
30733
  if (measure.marker && fromLine === 0) {
30677
30734
  fragment.markerWidth = measure.marker.markerWidth;
30678
30735
  if (measure.marker.markerTextWidth != null) {
@@ -33401,12 +33458,14 @@ function lineHeightForRuns(runs, fromRun, toRun) {
33401
33458
  }
33402
33459
  return maxSize2 * 1.2;
33403
33460
  }
33404
- function remeasureParagraph(block, maxWidth) {
33461
+ function remeasureParagraph(block, maxWidth, firstLineIndent = 0) {
33405
33462
  const runs = block.runs ?? [];
33406
33463
  const lines = [];
33407
33464
  let currentRun = 0;
33408
33465
  let currentChar = 0;
33409
33466
  while (currentRun < runs.length) {
33467
+ const isFirstLine = lines.length === 0;
33468
+ const effectiveMaxWidth = isFirstLine ? maxWidth - firstLineIndent : maxWidth;
33410
33469
  const startRun = currentRun;
33411
33470
  const startChar = currentChar;
33412
33471
  let width = 0;
@@ -33420,7 +33479,7 @@ function remeasureParagraph(block, maxWidth) {
33420
33479
  const start2 = r2 === currentRun ? currentChar : 0;
33421
33480
  for (let c = start2; c < text.length; c += 1) {
33422
33481
  const w = measureRunSliceWidth(run, c, c + 1);
33423
- if (width + w > maxWidth && width > 0) {
33482
+ if (width + w > effectiveMaxWidth && width > 0) {
33424
33483
  if (lastBreakRun >= 0) {
33425
33484
  endRun = lastBreakRun;
33426
33485
  endChar = lastBreakChar;
@@ -33919,7 +33978,7 @@ async function incrementalLayout(previousBlocks, _previousLayout, nextBlocks, op
33919
33978
  ...options,
33920
33979
  headerContentHeights,
33921
33980
  // Pass header heights to prevent overlap
33922
- remeasureParagraph: (block, maxWidth) => remeasureParagraph(block, maxWidth)
33981
+ remeasureParagraph: (block, maxWidth, firstLineIndent) => remeasureParagraph(block, maxWidth, firstLineIndent)
33923
33982
  });
33924
33983
  const layoutEnd = performance.now();
33925
33984
  perfLog(`[Perf] 4.2 Layout document (pagination): ${(layoutEnd - layoutStart).toFixed(2)}ms`);
@@ -33967,7 +34026,7 @@ async function incrementalLayout(previousBlocks, _previousLayout, nextBlocks, op
33967
34026
  ...options,
33968
34027
  headerContentHeights,
33969
34028
  // Pass header heights to prevent overlap
33970
- remeasureParagraph: (block, maxWidth) => remeasureParagraph(block, maxWidth)
34029
+ remeasureParagraph: (block, maxWidth, firstLineIndent) => remeasureParagraph(block, maxWidth, firstLineIndent)
33971
34030
  });
33972
34031
  const relayoutEnd = performance.now();
33973
34032
  const relayoutTime = relayoutEnd - relayoutStart;
@@ -34798,6 +34857,31 @@ function findBlockIndexByFragmentId(blocks, fragmentBlockId, targetPmRange) {
34798
34857
  }
34799
34858
  return matchingIndices[0];
34800
34859
  }
34860
+ const DEFAULT_CELL_PADDING = { top: 2, bottom: 2, left: 4, right: 4 };
34861
+ const getCellPaddingFromRow = (cellIdx, row) => {
34862
+ const padding = row?.cells?.[cellIdx]?.attrs?.padding ?? {};
34863
+ return {
34864
+ top: padding.top ?? DEFAULT_CELL_PADDING.top,
34865
+ bottom: padding.bottom ?? DEFAULT_CELL_PADDING.bottom,
34866
+ left: padding.left ?? DEFAULT_CELL_PADDING.left,
34867
+ right: padding.right ?? DEFAULT_CELL_PADDING.right
34868
+ };
34869
+ };
34870
+ const getCellBlocks = (cell) => {
34871
+ if (!cell) return [];
34872
+ return cell.blocks ?? (cell.paragraph ? [cell.paragraph] : []);
34873
+ };
34874
+ const getCellMeasures = (cell) => {
34875
+ if (!cell) return [];
34876
+ return cell.blocks ?? (cell.paragraph ? [cell.paragraph] : []);
34877
+ };
34878
+ const sumLineHeights = (measure, fromLine, toLine) => {
34879
+ let height = 0;
34880
+ for (let i = fromLine; i < toLine && i < measure.lines.length; i += 1) {
34881
+ height += measure.lines[i]?.lineHeight ?? 0;
34882
+ }
34883
+ return height;
34884
+ };
34801
34885
  function selectionToRects(layout, blocks, measures, from2, to) {
34802
34886
  if (from2 === to) {
34803
34887
  return [];
@@ -34844,6 +34928,136 @@ function selectionToRects(layout, blocks, measures, from2, to) {
34844
34928
  });
34845
34929
  return;
34846
34930
  }
34931
+ if (fragment.kind === "table") {
34932
+ const blockIndex = findBlockIndexByFragmentId(blocks, fragment.blockId, { from: from2, to });
34933
+ if (blockIndex === -1) return;
34934
+ const block = blocks[blockIndex];
34935
+ const measure = measures[blockIndex];
34936
+ if (!block || block.kind !== "table" || measure?.kind !== "table") {
34937
+ return;
34938
+ }
34939
+ const tableBlock = block;
34940
+ const tableMeasure = measure;
34941
+ const tableFragment = fragment;
34942
+ const rowHeights = tableMeasure.rows.map((rowMeasure, idx) => {
34943
+ if (tableFragment.partialRow && tableFragment.partialRow.rowIndex === idx) {
34944
+ return tableFragment.partialRow.partialHeight;
34945
+ }
34946
+ return rowMeasure?.height ?? 0;
34947
+ });
34948
+ const calculateCellX = (cellIdx, cellMeasure) => {
34949
+ const gridStart = cellMeasure.gridColumnStart ?? cellIdx;
34950
+ let x = 0;
34951
+ for (let i = 0; i < gridStart && i < tableMeasure.columnWidths.length; i += 1) {
34952
+ x += tableMeasure.columnWidths[i];
34953
+ }
34954
+ return x;
34955
+ };
34956
+ const processRow = (rowIndex, rowOffset) => {
34957
+ const rowMeasure = tableMeasure.rows[rowIndex];
34958
+ const row = tableBlock.rows[rowIndex];
34959
+ if (!rowMeasure || !row) return rowOffset;
34960
+ const rowHeight = rowHeights[rowIndex] ?? rowMeasure.height;
34961
+ const isPartialRow = tableFragment.partialRow?.rowIndex === rowIndex;
34962
+ const partialRowData = isPartialRow ? tableFragment.partialRow : null;
34963
+ const totalColumns = Math.min(rowMeasure.cells.length, row.cells.length);
34964
+ for (let cellIdx = 0; cellIdx < totalColumns; cellIdx += 1) {
34965
+ const cellMeasure = rowMeasure.cells[cellIdx];
34966
+ const cell = row.cells[cellIdx];
34967
+ if (!cellMeasure || !cell) continue;
34968
+ const padding = getCellPaddingFromRow(cellIdx, row);
34969
+ const cellX = calculateCellX(cellIdx, cellMeasure);
34970
+ const cellBlocks = getCellBlocks(cell);
34971
+ const cellBlockMeasures = getCellMeasures(cellMeasure);
34972
+ const renderedBlocks = [];
34973
+ let cumulativeLine = 0;
34974
+ for (let i = 0; i < Math.min(cellBlocks.length, cellBlockMeasures.length); i += 1) {
34975
+ const paraBlock = cellBlocks[i];
34976
+ const paraMeasure = cellBlockMeasures[i];
34977
+ if (!paraBlock || !paraMeasure || paraBlock.kind !== "paragraph" || paraMeasure.kind !== "paragraph") {
34978
+ continue;
34979
+ }
34980
+ const lineCount = paraMeasure.lines.length;
34981
+ const blockStart = cumulativeLine;
34982
+ const blockEnd = cumulativeLine + lineCount;
34983
+ cumulativeLine = blockEnd;
34984
+ const allowedStart = partialRowData?.fromLineByCell?.[cellIdx] ?? 0;
34985
+ const rawAllowedEnd = partialRowData?.toLineByCell?.[cellIdx];
34986
+ const allowedEnd = rawAllowedEnd == null || rawAllowedEnd === -1 ? cumulativeLine : rawAllowedEnd;
34987
+ const renderStartGlobal = Math.max(blockStart, allowedStart);
34988
+ const renderEndGlobal = Math.min(blockEnd, allowedEnd);
34989
+ if (renderStartGlobal >= renderEndGlobal) continue;
34990
+ const startLine = renderStartGlobal - blockStart;
34991
+ const endLine = renderEndGlobal - blockStart;
34992
+ let height = sumLineHeights(paraMeasure, startLine, endLine);
34993
+ const rendersWholeBlock = startLine === 0 && endLine >= lineCount;
34994
+ if (rendersWholeBlock) {
34995
+ const totalHeight = paraMeasure.totalHeight;
34996
+ if (typeof totalHeight === "number" && totalHeight > height) {
34997
+ height = totalHeight;
34998
+ }
34999
+ const spacingAfter = paraBlock.attrs?.spacing?.after;
35000
+ if (typeof spacingAfter === "number" && spacingAfter > 0) {
35001
+ height += spacingAfter;
35002
+ }
35003
+ }
35004
+ renderedBlocks.push({ block: paraBlock, measure: paraMeasure, startLine, endLine, height });
35005
+ }
35006
+ const contentHeight = renderedBlocks.reduce((acc, info) => acc + info.height, 0);
35007
+ const contentAreaHeight = Math.max(0, rowHeight - (padding.top + padding.bottom));
35008
+ const freeSpace = Math.max(0, contentAreaHeight - contentHeight);
35009
+ let verticalOffset = 0;
35010
+ const vAlign = cell.attrs?.verticalAlign;
35011
+ if (vAlign === "center" || vAlign === "middle") {
35012
+ verticalOffset = freeSpace / 2;
35013
+ } else if (vAlign === "bottom") {
35014
+ verticalOffset = freeSpace;
35015
+ }
35016
+ let blockTopCursor = padding.top + verticalOffset;
35017
+ renderedBlocks.forEach((info) => {
35018
+ const paragraphMarkerWidth = info.measure.marker?.markerWidth ?? 0;
35019
+ const intersectingLines = findLinesIntersectingRange(info.block, info.measure, from2, to);
35020
+ intersectingLines.forEach(({ line, index: index2 }) => {
35021
+ if (index2 < info.startLine || index2 >= info.endLine) {
35022
+ return;
35023
+ }
35024
+ const range = computeLinePmRange(info.block, line);
35025
+ if (range.pmStart == null || range.pmEnd == null) return;
35026
+ const sliceFrom = Math.max(range.pmStart, from2);
35027
+ const sliceTo = Math.min(range.pmEnd, to);
35028
+ if (sliceFrom >= sliceTo) return;
35029
+ const charOffsetFrom = pmPosToCharOffset(info.block, line, sliceFrom);
35030
+ const charOffsetTo = pmPosToCharOffset(info.block, line, sliceTo);
35031
+ const availableWidth = Math.max(1, cellMeasure.width - padding.left - padding.right);
35032
+ const startX = mapPmToX(info.block, line, charOffsetFrom, availableWidth);
35033
+ const endX = mapPmToX(info.block, line, charOffsetTo, availableWidth);
35034
+ const rectX = fragment.x + cellX + padding.left + paragraphMarkerWidth + Math.min(startX, endX);
35035
+ const rectWidth = Math.max(1, Math.abs(endX - startX));
35036
+ const lineOffset = lineHeightBeforeIndex(info.measure, index2) - lineHeightBeforeIndex(info.measure, info.startLine);
35037
+ const rectY = fragment.y + rowOffset + blockTopCursor + lineOffset;
35038
+ rects.push({
35039
+ x: rectX,
35040
+ y: rectY + pageIndex * layout.pageSize.h,
35041
+ width: rectWidth,
35042
+ height: line.lineHeight,
35043
+ pageIndex
35044
+ });
35045
+ });
35046
+ blockTopCursor += info.height;
35047
+ });
35048
+ }
35049
+ return rowOffset + rowHeight;
35050
+ };
35051
+ let rowCursor = 0;
35052
+ const repeatHeaderCount = tableFragment.repeatHeaderCount ?? 0;
35053
+ for (let r2 = 0; r2 < repeatHeaderCount && r2 < tableMeasure.rows.length; r2 += 1) {
35054
+ rowCursor = processRow(r2, rowCursor);
35055
+ }
35056
+ for (let r2 = tableFragment.fromRow; r2 < tableFragment.toRow && r2 < tableMeasure.rows.length; r2 += 1) {
35057
+ rowCursor = processRow(r2, rowCursor);
35058
+ }
35059
+ return;
35060
+ }
34847
35061
  if (isAtomicFragment(fragment)) {
34848
35062
  const blockIndex = findBlockIndexByFragmentId(blocks, fragment.blockId, { from: from2, to });
34849
35063
  if (blockIndex === -1) return;
@@ -35370,7 +35584,16 @@ async function measureParagraphBlock(block, maxWidth) {
35370
35584
  const rawFirstLineOffset = suppressFirstLine ? 0 : firstLine - hanging;
35371
35585
  const firstLineOffset = isWordLayoutList ? 0 : rawFirstLineOffset;
35372
35586
  const contentWidth = Math.max(1, maxWidth - indentLeft - indentRight);
35373
- const initialAvailableWidth = Math.max(1, contentWidth - firstLineOffset);
35587
+ let leftJustifiedMarkerSpace = 0;
35588
+ if (wordLayout?.marker) {
35589
+ const markerJustification = wordLayout.marker.justification ?? "left";
35590
+ if (markerJustification === "left") {
35591
+ const markerBoxWidth = wordLayout.marker.markerBoxWidthPx ?? 0;
35592
+ const gutterWidth = wordLayout.marker.gutterWidthPx ?? LIST_MARKER_GAP;
35593
+ leftJustifiedMarkerSpace = markerBoxWidth + gutterWidth;
35594
+ }
35595
+ }
35596
+ const initialAvailableWidth = Math.max(1, contentWidth - firstLineOffset - leftJustifiedMarkerSpace);
35374
35597
  const tabStops = buildTabStopsPx(
35375
35598
  indent,
35376
35599
  block.attrs?.tabs,
@@ -37968,12 +38191,30 @@ const _PresentationEditor = class _PresentationEditor extends EventEmitter {
37968
38191
  if (linkEl) {
37969
38192
  const href = linkEl.getAttribute("href") ?? "";
37970
38193
  const isAnchorLink = href.startsWith("#") && href.length > 1;
37971
- if (isAnchorLink) {
38194
+ const isTocLink = linkEl.closest(".superdoc-toc-entry") !== null;
38195
+ if (isAnchorLink && isTocLink) {
37972
38196
  event.preventDefault();
37973
38197
  event.stopPropagation();
37974
38198
  this.goToAnchor(href);
37975
38199
  return;
37976
38200
  }
38201
+ event.preventDefault();
38202
+ event.stopPropagation();
38203
+ const linkClickEvent = new CustomEvent("superdoc-link-click", {
38204
+ bubbles: true,
38205
+ composed: true,
38206
+ detail: {
38207
+ href,
38208
+ target: linkEl.getAttribute("target"),
38209
+ rel: linkEl.getAttribute("rel"),
38210
+ tooltip: linkEl.getAttribute("title"),
38211
+ element: linkEl,
38212
+ clientX: event.clientX,
38213
+ clientY: event.clientY
38214
+ }
38215
+ });
38216
+ linkEl.dispatchEvent(linkClickEvent);
38217
+ return;
37977
38218
  }
37978
38219
  const isDraggableAnnotation = target?.closest?.('[data-draggable="true"]') != null;
37979
38220
  if (!__privateGet(this, _layoutState).layout) {
@@ -38071,6 +38312,44 @@ const _PresentationEditor = class _PresentationEditor extends EventEmitter {
38071
38312
  __privateGet(this, _layoutState).measures,
38072
38313
  hit.pos
38073
38314
  );
38315
+ const targetImg = event.target?.closest?.("img");
38316
+ const imgPmStart = targetImg?.dataset?.pmStart ? Number(targetImg.dataset.pmStart) : null;
38317
+ if (!Number.isNaN(imgPmStart) && imgPmStart != null) {
38318
+ const doc22 = __privateGet(this, _editor3).state.doc;
38319
+ if (imgPmStart < 0 || imgPmStart >= doc22.content.size) {
38320
+ if (process$1.env.NODE_ENV === "development") {
38321
+ console.warn(
38322
+ `[PresentationEditor] Invalid position ${imgPmStart} for inline image (document size: ${doc22.content.size})`
38323
+ );
38324
+ }
38325
+ return;
38326
+ }
38327
+ const newSelectionId = `inline-${imgPmStart}`;
38328
+ if (__privateGet(this, _lastSelectedImageBlockId) && __privateGet(this, _lastSelectedImageBlockId) !== newSelectionId) {
38329
+ this.emit("imageDeselected", { blockId: __privateGet(this, _lastSelectedImageBlockId) });
38330
+ }
38331
+ try {
38332
+ const tr = __privateGet(this, _editor3).state.tr.setSelection(NodeSelection.create(doc22, imgPmStart));
38333
+ __privateGet(this, _editor3).view?.dispatch(tr);
38334
+ const selector = `.superdoc-inline-image[data-pm-start="${imgPmStart}"]`;
38335
+ const targetElement = __privateGet(this, _viewportHost).querySelector(selector);
38336
+ this.emit("imageSelected", {
38337
+ element: targetElement ?? targetImg,
38338
+ blockId: null,
38339
+ pmStart: imgPmStart
38340
+ });
38341
+ __privateSet(this, _lastSelectedImageBlockId, newSelectionId);
38342
+ } catch (error) {
38343
+ if (process$1.env.NODE_ENV === "development") {
38344
+ console.warn(
38345
+ `[PresentationEditor] Failed to create NodeSelection for inline image at position ${imgPmStart}:`,
38346
+ error
38347
+ );
38348
+ }
38349
+ }
38350
+ __privateMethod(this, _PresentationEditor_instances, focusEditorAfterImageSelection_fn).call(this);
38351
+ return;
38352
+ }
38074
38353
  if (fragmentHit && (fragmentHit.fragment.kind === "image" || fragmentHit.fragment.kind === "drawing")) {
38075
38354
  const doc22 = __privateGet(this, _editor3).state.doc;
38076
38355
  try {
@@ -38097,15 +38376,7 @@ const _PresentationEditor = class _PresentationEditor extends EventEmitter {
38097
38376
  console.warn("[PresentationEditor] Failed to create NodeSelection for atomic fragment:", error);
38098
38377
  }
38099
38378
  }
38100
- __privateMethod(this, _PresentationEditor_instances, scheduleSelectionUpdate_fn).call(this);
38101
- if (document.activeElement instanceof HTMLElement) {
38102
- document.activeElement.blur();
38103
- }
38104
- const editorDom2 = __privateGet(this, _editor3).view?.dom;
38105
- if (editorDom2) {
38106
- editorDom2.focus();
38107
- __privateGet(this, _editor3).view?.focus();
38108
- }
38379
+ __privateMethod(this, _PresentationEditor_instances, focusEditorAfterImageSelection_fn).call(this);
38109
38380
  return;
38110
38381
  }
38111
38382
  if (__privateGet(this, _lastSelectedImageBlockId)) {
@@ -38721,6 +38992,47 @@ const _PresentationEditor = class _PresentationEditor extends EventEmitter {
38721
38992
  get overlayElement() {
38722
38993
  return __privateGet(this, _selectionOverlay2) ?? null;
38723
38994
  }
38995
+ /**
38996
+ * Get the current zoom level.
38997
+ *
38998
+ * The zoom level is a multiplier that controls the visual scale of the document.
38999
+ * This value is applied via CSS transform: scale() on the #viewportHost element,
39000
+ * which ensures consistent scaling between rendered content and overlay elements
39001
+ * (selections, cursors, interactive handles).
39002
+ *
39003
+ * Relationship to Centralized Zoom Architecture:
39004
+ * - PresentationEditor is the SINGLE SOURCE OF TRUTH for zoom state
39005
+ * - Zoom is applied internally via transform: scale() on #viewportHost
39006
+ * - External components (toolbar, UI controls) should use setZoom() to modify zoom
39007
+ * - The zoom value is used throughout the system for coordinate transformations
39008
+ *
39009
+ * Coordinate Space Implications:
39010
+ * - Layout coordinates: Unscaled logical pixels used by the layout engine
39011
+ * - Screen coordinates: Physical pixels affected by CSS transform: scale()
39012
+ * - Conversion: screenCoord = layoutCoord * zoom
39013
+ *
39014
+ * Zoom Scale:
39015
+ * - 1 = 100% (default, no scaling)
39016
+ * - 0.5 = 50% (zoomed out, content appears smaller)
39017
+ * - 2 = 200% (zoomed in, content appears larger)
39018
+ *
39019
+ * @returns The current zoom level multiplier (default: 1 if not configured)
39020
+ *
39021
+ * @example
39022
+ * ```typescript
39023
+ * const zoom = presentation.zoom;
39024
+ * // Convert layout coordinates to screen coordinates
39025
+ * const screenX = layoutX * zoom;
39026
+ * const screenY = layoutY * zoom;
39027
+ *
39028
+ * // Convert screen coordinates back to layout coordinates
39029
+ * const layoutX = screenX / zoom;
39030
+ * const layoutY = screenY / zoom;
39031
+ * ```
39032
+ */
39033
+ get zoom() {
39034
+ return __privateGet(this, _layoutOptions).zoom ?? 1;
39035
+ }
38724
39036
  /**
38725
39037
  * Set the document mode and update editor editability.
38726
39038
  *
@@ -38911,8 +39223,8 @@ const _PresentationEditor = class _PresentationEditor extends EventEmitter {
38911
39223
  const pageLocalY = rect.y - rect.pageIndex * pageHeight;
38912
39224
  const coords = __privateMethod(this, _PresentationEditor_instances, convertPageLocalToOverlayCoords_fn).call(this, rect.pageIndex, rect.x, pageLocalY);
38913
39225
  if (!coords) return null;
38914
- const absLeft = coords.x + overlayRect.left;
38915
- const absTop = coords.y + overlayRect.top;
39226
+ const absLeft = coords.x * zoom + overlayRect.left;
39227
+ const absTop = coords.y * zoom + overlayRect.top;
38916
39228
  const left2 = relativeRect ? absLeft - relativeRect.left : absLeft;
38917
39229
  const top2 = relativeRect ? absTop - relativeRect.top : absTop;
38918
39230
  const width = Math.max(1, rect.width * zoom);
@@ -39921,6 +40233,10 @@ renderRemoteCursors_fn = function() {
39921
40233
  const visibleClientIds = /* @__PURE__ */ new Set();
39922
40234
  sortedCursors.forEach((cursor) => {
39923
40235
  visibleClientIds.add(cursor.clientId);
40236
+ const oldSelections = __privateGet(this, _remoteCursorOverlay)?.querySelectorAll(
40237
+ `.presentation-editor__remote-selection[data-client-id="${cursor.clientId}"]`
40238
+ );
40239
+ oldSelections?.forEach((el) => el.remove());
39924
40240
  if (cursor.anchor === cursor.head) {
39925
40241
  __privateMethod(this, _PresentationEditor_instances, renderRemoteCaret_fn).call(this, cursor);
39926
40242
  } else {
@@ -39956,7 +40272,7 @@ renderRemoteCursors_fn = function() {
39956
40272
  */
39957
40273
  renderRemoteCaret_fn = function(cursor) {
39958
40274
  const caretLayout = __privateMethod(this, _PresentationEditor_instances, computeCaretLayoutRect_fn).call(this, cursor.head);
39959
- const zoom = __privateGet(this, _layoutOptions).zoom ?? 1;
40275
+ __privateGet(this, _layoutOptions).zoom ?? 1;
39960
40276
  const doc2 = __privateGet(this, _visibleHost).ownerDocument ?? document;
39961
40277
  const color = __privateMethod(this, _PresentationEditor_instances, getValidatedColor_fn).call(this, cursor);
39962
40278
  let caretEl = __privateGet(this, _remoteCursorElements).get(cursor.clientId);
@@ -39989,7 +40305,7 @@ renderRemoteCaret_fn = function(cursor) {
39989
40305
  }
39990
40306
  caretEl.style.opacity = "1";
39991
40307
  caretEl.style.transform = `translate(${coords.x}px, ${coords.y}px)`;
39992
- caretEl.style.height = `${Math.max(1, caretLayout.height * zoom)}px`;
40308
+ caretEl.style.height = `${Math.max(1, caretLayout.height)}px`;
39993
40309
  caretEl.style.borderLeftColor = color;
39994
40310
  const labelEl = caretEl.querySelector(".presentation-editor__remote-label");
39995
40311
  if (labelEl) {
@@ -40071,7 +40387,6 @@ renderRemoteSelection_fn = function(cursor) {
40071
40387
  const end2 = Math.max(cursor.anchor, cursor.head);
40072
40388
  const rects = selectionToRects(layout, blocks, measures, start2, end2) ?? [];
40073
40389
  const color = __privateMethod(this, _PresentationEditor_instances, getValidatedColor_fn).call(this, cursor);
40074
- const zoom = __privateGet(this, _layoutOptions).zoom ?? 1;
40075
40390
  const opacity = __privateGet(this, _layoutOptions).presence?.highlightOpacity ?? 0.35;
40076
40391
  const pageHeight = layout.pageSize?.h ?? __privateGet(this, _layoutOptions).pageSize?.h ?? DEFAULT_PAGE_SIZE.h;
40077
40392
  const doc2 = __privateGet(this, _visibleHost).ownerDocument ?? document;
@@ -40085,8 +40400,8 @@ renderRemoteSelection_fn = function(cursor) {
40085
40400
  selectionEl.style.position = "absolute";
40086
40401
  selectionEl.style.left = `${coords.x}px`;
40087
40402
  selectionEl.style.top = `${coords.y}px`;
40088
- selectionEl.style.width = `${Math.max(1, rect.width * zoom)}px`;
40089
- selectionEl.style.height = `${Math.max(1, rect.height * zoom)}px`;
40403
+ selectionEl.style.width = `${Math.max(1, rect.width)}px`;
40404
+ selectionEl.style.height = `${Math.max(1, rect.height)}px`;
40090
40405
  selectionEl.style.backgroundColor = color;
40091
40406
  selectionEl.style.opacity = opacity.toString();
40092
40407
  selectionEl.style.borderRadius = _PresentationEditor.CURSOR_STYLES.SELECTION_BORDER_RADIUS;
@@ -40201,6 +40516,24 @@ setupDragHandlers_fn = function() {
40201
40516
  }
40202
40517
  }));
40203
40518
  };
40519
+ /**
40520
+ * Focus the editor after image selection and schedule selection update.
40521
+ * This method encapsulates the common focus and blur logic used when
40522
+ * selecting both inline and block images.
40523
+ * @private
40524
+ * @returns {void}
40525
+ */
40526
+ focusEditorAfterImageSelection_fn = function() {
40527
+ __privateMethod(this, _PresentationEditor_instances, scheduleSelectionUpdate_fn).call(this);
40528
+ if (document.activeElement instanceof HTMLElement) {
40529
+ document.activeElement.blur();
40530
+ }
40531
+ const editorDom = __privateGet(this, _editor3).view?.dom;
40532
+ if (editorDom) {
40533
+ editorDom.focus();
40534
+ __privateGet(this, _editor3).view?.focus();
40535
+ }
40536
+ };
40204
40537
  setupInputBridge_fn = function() {
40205
40538
  __privateGet(this, _inputBridge)?.destroy();
40206
40539
  const win = __privateGet(this, _visibleHost).ownerDocument?.defaultView ?? window;
@@ -40701,10 +41034,39 @@ ensurePainter_fn = function(blocks, measures) {
40701
41034
  }
40702
41035
  return __privateGet(this, _domPainter);
40703
41036
  };
41037
+ /**
41038
+ * Schedules a cursor/selection update in the next animation frame.
41039
+ *
41040
+ * Implements guards to prevent race conditions during layout recalculation:
41041
+ * - Skips scheduling if already scheduled (prevents duplicate updates)
41042
+ * - Skips if layout is being recalculated (#isRerendering || #pendingDocChange)
41043
+ * to avoid rendering cursor before layout is ready
41044
+ *
41045
+ * The cursor will be updated at the end of #rerender() after layout completes.
41046
+ *
41047
+ * @returns {void}
41048
+ *
41049
+ * @remarks
41050
+ * Edge cases handled:
41051
+ * - Race condition guard: #isRerendering and #pendingDocChange flags prevent
41052
+ * scheduling cursor updates while layout is recalculating, avoiding stale position data.
41053
+ * - Deduplication: #selectionUpdateScheduled flag prevents multiple redundant RAF callbacks
41054
+ * from being queued when selection changes rapidly.
41055
+ *
41056
+ * Side effects:
41057
+ * - Sets #selectionUpdateScheduled flag to true
41058
+ * - Schedules a requestAnimationFrame callback that calls #updateSelection()
41059
+ * - The RAF callback automatically resets #selectionUpdateScheduled to false
41060
+ *
41061
+ * @private
41062
+ */
40704
41063
  scheduleSelectionUpdate_fn = function() {
40705
41064
  if (__privateGet(this, _selectionUpdateScheduled)) {
40706
41065
  return;
40707
41066
  }
41067
+ if (__privateGet(this, _isRerendering) || __privateGet(this, _pendingDocChange)) {
41068
+ return;
41069
+ }
40708
41070
  __privateSet(this, _selectionUpdateScheduled, true);
40709
41071
  const win = __privateGet(this, _visibleHost).ownerDocument?.defaultView ?? window;
40710
41072
  win.requestAnimationFrame(() => {
@@ -40712,6 +41074,47 @@ scheduleSelectionUpdate_fn = function() {
40712
41074
  __privateMethod(this, _PresentationEditor_instances, updateSelection_fn).call(this);
40713
41075
  });
40714
41076
  };
41077
+ /**
41078
+ * Updates the visual cursor/selection overlay to match the current editor selection.
41079
+ *
41080
+ * Handles several edge cases:
41081
+ * - Defers cursor clearing until new position is successfully computed
41082
+ * - Falls back to adjacent positions (from-1, from+1) when exact position lookup fails
41083
+ * - Preserves existing cursor visibility when position cannot be computed
41084
+ * - Skips rendering in header/footer mode and viewing mode
41085
+ *
41086
+ * This method is called after layout completes to ensure cursor positioning
41087
+ * is based on stable layout data.
41088
+ *
41089
+ * @returns {void}
41090
+ *
41091
+ * @remarks
41092
+ * Edge cases handled:
41093
+ * - Position lookup failure: When #computeCaretLayoutRect(from) returns null (e.g., cursor
41094
+ * on node boundary between paragraph and run), falls back to adjacent positions.
41095
+ * - Fallback positions (from-1, from+1): Adjacent positions typically resolve to nearest
41096
+ * text content with valid layout fragments. The fallback logic tries from-1 first
41097
+ * (safer for most text editing), then from+1 if within document bounds.
41098
+ * - Bounds validation: Explicitly checks from > 0 before trying from-1, and validates
41099
+ * from+1 <= docSize before trying from+1, preventing invalid position access.
41100
+ * - Cursor preservation: If all position lookups fail, keeps existing cursor visible
41101
+ * rather than clearing it, preventing jarring visual disappearance during edge cases.
41102
+ * - Invalid document state: If editor state or doc is missing, safely returns early
41103
+ * after clearing cursor (defensive programming for race conditions during init/destroy).
41104
+ *
41105
+ * Side effects:
41106
+ * - Mutates #localSelectionLayer.innerHTML (clears or sets cursor/selection HTML)
41107
+ * - Calls #renderCaretOverlay() or #renderSelectionRects() which mutate DOM
41108
+ * - DOM manipulation is wrapped in try/catch to prevent errors from breaking editor state
41109
+ *
41110
+ * Why fallback positions work:
41111
+ * ProseMirror positions can land on structural node boundaries (e.g., between <p> and <run>)
41112
+ * that don't correspond to renderable layout fragments. Adjacent positions ±1 typically
41113
+ * land inside text content with valid layout data. The from-1 fallback is tried first
41114
+ * because it's safer for most text editing scenarios (e.g., after backspace at start of line).
41115
+ *
41116
+ * @private
41117
+ */
40715
41118
  updateSelection_fn = function() {
40716
41119
  if (__privateGet(this, _session).mode !== "body") {
40717
41120
  return;
@@ -40720,13 +41123,26 @@ updateSelection_fn = function() {
40720
41123
  return;
40721
41124
  }
40722
41125
  if (__privateGet(this, _documentMode) === "viewing") {
40723
- __privateGet(this, _localSelectionLayer).innerHTML = "";
41126
+ try {
41127
+ __privateGet(this, _localSelectionLayer).innerHTML = "";
41128
+ } catch (error) {
41129
+ if (process$1.env.NODE_ENV === "development") {
41130
+ console.warn("[PresentationEditor] Failed to clear selection layer in viewing mode:", error);
41131
+ }
41132
+ }
40724
41133
  return;
40725
41134
  }
40726
41135
  const layout = __privateGet(this, _layoutState).layout;
40727
- const selection = this.getActiveEditor().state?.selection;
40728
- __privateGet(this, _localSelectionLayer).innerHTML = "";
41136
+ const editorState = this.getActiveEditor().state;
41137
+ const selection = editorState?.selection;
40729
41138
  if (!selection) {
41139
+ try {
41140
+ __privateGet(this, _localSelectionLayer).innerHTML = "";
41141
+ } catch (error) {
41142
+ if (process$1.env.NODE_ENV === "development") {
41143
+ console.warn("[PresentationEditor] Failed to clear selection layer (no selection):", error);
41144
+ }
41145
+ }
40730
41146
  return;
40731
41147
  }
40732
41148
  if (!layout) {
@@ -40734,15 +41150,40 @@ updateSelection_fn = function() {
40734
41150
  }
40735
41151
  const { from: from2, to } = selection;
40736
41152
  if (from2 === to) {
40737
- const caretLayout = __privateMethod(this, _PresentationEditor_instances, computeCaretLayoutRect_fn).call(this, from2);
41153
+ let caretLayout = __privateMethod(this, _PresentationEditor_instances, computeCaretLayoutRect_fn).call(this, from2);
41154
+ const doc2 = editorState?.doc;
41155
+ if (!doc2) {
41156
+ return;
41157
+ }
41158
+ const docSize = doc2.content?.size ?? 0;
41159
+ if (!caretLayout && from2 > 0) {
41160
+ caretLayout = __privateMethod(this, _PresentationEditor_instances, computeCaretLayoutRect_fn).call(this, from2 - 1);
41161
+ }
41162
+ if (!caretLayout && from2 + 1 <= docSize) {
41163
+ caretLayout = __privateMethod(this, _PresentationEditor_instances, computeCaretLayoutRect_fn).call(this, from2 + 1);
41164
+ }
40738
41165
  if (!caretLayout) {
40739
41166
  return;
40740
41167
  }
40741
- __privateMethod(this, _PresentationEditor_instances, renderCaretOverlay_fn).call(this, caretLayout);
41168
+ try {
41169
+ __privateGet(this, _localSelectionLayer).innerHTML = "";
41170
+ __privateMethod(this, _PresentationEditor_instances, renderCaretOverlay_fn).call(this, caretLayout);
41171
+ } catch (error) {
41172
+ if (process$1.env.NODE_ENV === "development") {
41173
+ console.warn("[PresentationEditor] Failed to render caret overlay:", error);
41174
+ }
41175
+ }
40742
41176
  return;
40743
41177
  }
40744
41178
  const rects = selectionToRects(layout, __privateGet(this, _layoutState).blocks, __privateGet(this, _layoutState).measures, from2, to) ?? [];
40745
- __privateMethod(this, _PresentationEditor_instances, renderSelectionRects_fn).call(this, rects);
41179
+ try {
41180
+ __privateGet(this, _localSelectionLayer).innerHTML = "";
41181
+ __privateMethod(this, _PresentationEditor_instances, renderSelectionRects_fn).call(this, rects);
41182
+ } catch (error) {
41183
+ if (process$1.env.NODE_ENV === "development") {
41184
+ console.warn("[PresentationEditor] Failed to render selection rects:", error);
41185
+ }
41186
+ }
40746
41187
  };
40747
41188
  resolveLayoutOptions_fn = function(blocks, sectionMetadata) {
40748
41189
  const defaults = __privateMethod(this, _PresentationEditor_instances, computeDefaultLayoutDefaults_fn).call(this);
@@ -41535,7 +41976,6 @@ renderSelectionRects_fn = function(rects) {
41535
41976
  return;
41536
41977
  }
41537
41978
  const pageHeight = __privateMethod(this, _PresentationEditor_instances, getBodyPageHeight_fn).call(this);
41538
- const zoom = __privateGet(this, _layoutOptions).zoom ?? 1;
41539
41979
  rects.forEach((rect, _index) => {
41540
41980
  const pageLocalY = rect.y - rect.pageIndex * pageHeight;
41541
41981
  const coords = __privateMethod(this, _PresentationEditor_instances, convertPageLocalToOverlayCoords_fn).call(this, rect.pageIndex, rect.x, pageLocalY);
@@ -41550,8 +41990,8 @@ renderSelectionRects_fn = function(rects) {
41550
41990
  highlight.style.position = "absolute";
41551
41991
  highlight.style.left = `${coords.x}px`;
41552
41992
  highlight.style.top = `${coords.y}px`;
41553
- highlight.style.width = `${Math.max(1, rect.width * zoom)}px`;
41554
- highlight.style.height = `${Math.max(1, rect.height * zoom)}px`;
41993
+ highlight.style.width = `${Math.max(1, rect.width)}px`;
41994
+ highlight.style.height = `${Math.max(1, rect.height)}px`;
41555
41995
  highlight.style.backgroundColor = "rgba(51, 132, 255, 0.35)";
41556
41996
  highlight.style.borderRadius = "2px";
41557
41997
  highlight.style.pointerEvents = "none";
@@ -41560,7 +42000,6 @@ renderSelectionRects_fn = function(rects) {
41560
42000
  };
41561
42001
  renderHoverRegion_fn = function(region) {
41562
42002
  if (!__privateGet(this, _hoverOverlay) || !__privateGet(this, _hoverTooltip)) return;
41563
- const zoom = __privateGet(this, _layoutOptions).zoom ?? 1;
41564
42003
  const coords = __privateMethod(this, _PresentationEditor_instances, convertPageLocalToOverlayCoords_fn).call(this, region.pageIndex, region.localX, region.localY);
41565
42004
  if (!coords) {
41566
42005
  __privateMethod(this, _PresentationEditor_instances, clearHoverRegion_fn).call(this);
@@ -41569,15 +42008,15 @@ renderHoverRegion_fn = function(region) {
41569
42008
  __privateGet(this, _hoverOverlay).style.display = "block";
41570
42009
  __privateGet(this, _hoverOverlay).style.left = `${coords.x}px`;
41571
42010
  __privateGet(this, _hoverOverlay).style.top = `${coords.y}px`;
41572
- __privateGet(this, _hoverOverlay).style.width = `${region.width * zoom}px`;
41573
- __privateGet(this, _hoverOverlay).style.height = `${region.height * zoom}px`;
42011
+ __privateGet(this, _hoverOverlay).style.width = `${region.width}px`;
42012
+ __privateGet(this, _hoverOverlay).style.height = `${region.height}px`;
41574
42013
  const tooltipText = `Double-click to edit ${region.kind === "header" ? "header" : "footer"}`;
41575
42014
  __privateGet(this, _hoverTooltip).textContent = tooltipText;
41576
42015
  __privateGet(this, _hoverTooltip).style.display = "block";
41577
42016
  __privateGet(this, _hoverTooltip).style.left = `${coords.x}px`;
41578
42017
  const tooltipHeight = 24;
41579
42018
  const spaceAbove = coords.y;
41580
- const regionHeight = region.height * zoom;
42019
+ const regionHeight = region.height;
41581
42020
  const tooltipY = spaceAbove < tooltipHeight + 4 ? coords.y + regionHeight + 4 : coords.y - tooltipHeight;
41582
42021
  __privateGet(this, _hoverTooltip).style.top = `${Math.max(0, tooltipY)}px`;
41583
42022
  };
@@ -41594,11 +42033,11 @@ renderCaretOverlay_fn = function(caretLayout) {
41594
42033
  if (!__privateGet(this, _localSelectionLayer)) {
41595
42034
  return;
41596
42035
  }
41597
- const zoom = __privateGet(this, _layoutOptions).zoom ?? 1;
41598
42036
  const coords = __privateMethod(this, _PresentationEditor_instances, convertPageLocalToOverlayCoords_fn).call(this, caretLayout.pageIndex, caretLayout.x, caretLayout.y);
41599
42037
  if (!coords) {
41600
42038
  return;
41601
42039
  }
42040
+ const finalHeight = Math.max(1, caretLayout.height);
41602
42041
  const caretEl = __privateGet(this, _localSelectionLayer).ownerDocument?.createElement("div");
41603
42042
  if (!caretEl) {
41604
42043
  return;
@@ -41608,7 +42047,7 @@ renderCaretOverlay_fn = function(caretLayout) {
41608
42047
  caretEl.style.left = `${coords.x}px`;
41609
42048
  caretEl.style.top = `${coords.y}px`;
41610
42049
  caretEl.style.width = "2px";
41611
- caretEl.style.height = `${Math.max(1, caretLayout.height * zoom)}px`;
42050
+ caretEl.style.height = `${finalHeight}px`;
41612
42051
  caretEl.style.backgroundColor = "#3366FF";
41613
42052
  caretEl.style.borderRadius = "1px";
41614
42053
  caretEl.style.pointerEvents = "none";
@@ -41762,7 +42201,8 @@ inchesToPx_fn = function(value) {
41762
42201
  };
41763
42202
  applyZoom_fn = function() {
41764
42203
  const zoom = __privateGet(this, _layoutOptions).zoom ?? 1;
41765
- __privateGet(this, _painterHost).style.transform = `scale(${zoom})`;
42204
+ __privateGet(this, _viewportHost).style.transformOrigin = "top left";
42205
+ __privateGet(this, _viewportHost).style.transform = zoom === 1 ? "" : `scale(${zoom})`;
41766
42206
  };
41767
42207
  createLayoutMetrics_fn = function(perf, startMark, layout, blocks) {
41768
42208
  if (!perf || startMark == null || typeof perf.now !== "function") {
@@ -41775,21 +42215,56 @@ createLayoutMetrics_fn = function(perf, startMark, layout, blocks) {
41775
42215
  pageCount: layout.pages?.length ?? 0
41776
42216
  };
41777
42217
  };
42218
+ /**
42219
+ * Convert page-local coordinates to overlay-space coordinates.
42220
+ *
42221
+ * Transforms coordinates from page-local space (x, y relative to a specific page)
42222
+ * to overlay-space coordinates (absolute position within the stacked page layout).
42223
+ * The returned coordinates are in layout space (unscaled logical pixels), not screen
42224
+ * space - the CSS transform: scale() on #viewportHost handles zoom scaling.
42225
+ *
42226
+ * Pages are rendered vertically stacked at y = pageIndex * pageHeight, so the
42227
+ * conversion involves:
42228
+ * 1. X coordinate passes through unchanged (pages are horizontally aligned)
42229
+ * 2. Y coordinate is offset by (pageIndex * pageHeight) to account for stacking
42230
+ *
42231
+ * @param pageIndex - Zero-based page index (must be finite and non-negative)
42232
+ * @param pageLocalX - X coordinate relative to page origin (must be finite)
42233
+ * @param pageLocalY - Y coordinate relative to page origin (must be finite)
42234
+ * @returns Overlay coordinates {x, y} in layout space, or null if inputs are invalid
42235
+ *
42236
+ * @example
42237
+ * ```typescript
42238
+ * // Position at (50, 100) on page 2
42239
+ * const coords = this.#convertPageLocalToOverlayCoords(2, 50, 100);
42240
+ * // Returns: { x: 50, y: 2 * 792 + 100 } = { x: 50, y: 1684 }
42241
+ * ```
42242
+ *
42243
+ * @private
42244
+ */
41778
42245
  convertPageLocalToOverlayCoords_fn = function(pageIndex, pageLocalX, pageLocalY) {
41779
- const pageEl = __privateGet(this, _painterHost).querySelector(
41780
- `.superdoc-page[data-page-index="${pageIndex}"]`
41781
- );
41782
- if (!pageEl) {
42246
+ if (!Number.isFinite(pageIndex) || pageIndex < 0) {
42247
+ console.warn(
42248
+ `[PresentationEditor] #convertPageLocalToOverlayCoords: Invalid pageIndex ${pageIndex}. Expected a finite non-negative number.`
42249
+ );
41783
42250
  return null;
41784
42251
  }
41785
- const pageRect = pageEl.getBoundingClientRect();
41786
- const overlayRect = __privateGet(this, _selectionOverlay2).getBoundingClientRect();
41787
- const layoutPageSize = __privateGet(this, _layoutState).layout?.pageSize;
41788
- const scaleX = layoutPageSize && typeof layoutPageSize.w === "number" && layoutPageSize.w > 0 ? pageRect.width / layoutPageSize.w : 1;
41789
- const scaleY = layoutPageSize && typeof layoutPageSize.h === "number" && layoutPageSize.h > 0 ? pageRect.height / layoutPageSize.h : 1;
42252
+ if (!Number.isFinite(pageLocalX)) {
42253
+ console.warn(
42254
+ `[PresentationEditor] #convertPageLocalToOverlayCoords: Invalid pageLocalX ${pageLocalX}. Expected a finite number.`
42255
+ );
42256
+ return null;
42257
+ }
42258
+ if (!Number.isFinite(pageLocalY)) {
42259
+ console.warn(
42260
+ `[PresentationEditor] #convertPageLocalToOverlayCoords: Invalid pageLocalY ${pageLocalY}. Expected a finite number.`
42261
+ );
42262
+ return null;
42263
+ }
42264
+ const pageHeight = __privateGet(this, _layoutOptions).pageSize?.h ?? DEFAULT_PAGE_SIZE.h;
41790
42265
  return {
41791
- x: pageRect.left - overlayRect.left + pageLocalX * scaleX,
41792
- y: pageRect.top - overlayRect.top + pageLocalY * scaleY
42266
+ x: pageLocalX,
42267
+ y: pageIndex * pageHeight + pageLocalY
41793
42268
  };
41794
42269
  };
41795
42270
  normalizeClientPoint_fn = function(clientX, clientY) {
@@ -56627,7 +57102,8 @@ const Strike = Mark.create({
56627
57102
  },
56628
57103
  addShortcuts() {
56629
57104
  return {
56630
- "Mod-Shift-s": () => this.editor.commands.toggleStrike()
57105
+ "Mod-Shift-x": () => this.editor.commands.toggleStrike(),
57106
+ "Mod-Shift-X": () => this.editor.commands.toggleStrike()
56631
57107
  };
56632
57108
  }
56633
57109
  });