@harbour-enterprises/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
@@ -19175,6 +19175,7 @@ function getUnderlineCssString({ type: type2 = "single", color = null, thickness
19175
19175
  return parts.join("; ");
19176
19176
  }
19177
19177
  const INLINE_OVERRIDE_PROPERTIES = ["fontSize", "bold", "italic", "strike", "underline", "letterSpacing"];
19178
+ const DEFAULT_FONT_SIZE_HALF_POINTS = 20;
19178
19179
  const resolveRunProperties = (params2, inlineRpr, resolvedPpr, isListNumber = false, numberingDefinedInline = false) => {
19179
19180
  const paragraphStyleId = resolvedPpr?.styleId;
19180
19181
  const paragraphStyleProps = resolveStyleChain$1(params2, paragraphStyleId, translator$1N);
@@ -19216,6 +19217,15 @@ const resolveRunProperties = (params2, inlineRpr, resolvedPpr, isListNumber = fa
19216
19217
  finalProps[prop] = inlineRpr[prop];
19217
19218
  }
19218
19219
  }
19220
+ if (finalProps.fontSize == null || typeof finalProps.fontSize !== "number" || !Number.isFinite(finalProps.fontSize) || finalProps.fontSize <= 0) {
19221
+ let defaultFontSize = DEFAULT_FONT_SIZE_HALF_POINTS;
19222
+ if (defaultProps2?.fontSize != null && typeof defaultProps2.fontSize === "number" && Number.isFinite(defaultProps2.fontSize) && defaultProps2.fontSize > 0) {
19223
+ defaultFontSize = defaultProps2.fontSize;
19224
+ } else if (normalProps?.fontSize != null && typeof normalProps.fontSize === "number" && Number.isFinite(normalProps.fontSize) && normalProps.fontSize > 0) {
19225
+ defaultFontSize = normalProps.fontSize;
19226
+ }
19227
+ finalProps.fontSize = defaultFontSize;
19228
+ }
19219
19229
  return finalProps;
19220
19230
  };
19221
19231
  function resolveParagraphProperties(params2, inlineProps, insideTable = false, overrideInlineStyleId = false, tableStyleId = null) {
@@ -34739,7 +34749,8 @@ const inputRulesPlugin = ({ editor, rules }) => {
34739
34749
  if (fieldAnnotationContent.length) {
34740
34750
  return false;
34741
34751
  }
34742
- return handleClipboardPaste({ editor, view }, html);
34752
+ const result = handleClipboardPaste({ editor, view }, html);
34753
+ return result;
34743
34754
  }
34744
34755
  },
34745
34756
  isInputRules: true
@@ -34754,38 +34765,36 @@ function isWordHtml(html) {
34754
34765
  function isGoogleDocsHtml(html) {
34755
34766
  return /docs-internal-guid-/.test(html);
34756
34767
  }
34768
+ function findParagraphAncestor($from) {
34769
+ for (let d2 = $from.depth; d2 >= 0; d2--) {
34770
+ const node = $from.node(d2);
34771
+ if (node.type.name === "paragraph") {
34772
+ return { node, depth: d2 };
34773
+ }
34774
+ }
34775
+ return { node: null, depth: -1 };
34776
+ }
34757
34777
  function handleHtmlPaste(html, editor, source) {
34758
34778
  let cleanedHtml;
34759
34779
  cleanedHtml = htmlHandler(html, editor);
34760
34780
  let doc2 = DOMParser$1.fromSchema(editor.schema).parse(cleanedHtml);
34761
34781
  doc2 = wrapTextsInRuns(doc2);
34762
34782
  const { dispatch, state: state2 } = editor.view;
34763
- if (!dispatch) return false;
34783
+ if (!dispatch) {
34784
+ return false;
34785
+ }
34764
34786
  const { $from } = state2.selection;
34765
- const isInParagraph = $from.parent.type.name === "paragraph";
34766
- const isParagraphEmpty = $from.parent.content.size === 0;
34787
+ const { node: paragraphNode } = findParagraphAncestor($from);
34788
+ const isInParagraph = paragraphNode !== null;
34767
34789
  const isSingleParagraph = doc2.childCount === 1 && doc2.firstChild.type.name === "paragraph";
34768
34790
  if (isInParagraph && isSingleParagraph) {
34769
34791
  const paragraphContent = doc2.firstChild.content;
34770
34792
  const tr = state2.tr.replaceSelectionWith(paragraphContent, false);
34771
34793
  dispatch(tr);
34772
- } else if (isInParagraph && state2.doc.textContent && !isParagraphEmpty) {
34773
- const allContent = [];
34774
- doc2.content.forEach((node, index2) => {
34775
- if (node.type.name === "paragraph") {
34776
- allContent.push(...node.content.content);
34777
- if (index2 < doc2.content.childCount - 1) {
34778
- allContent.push(editor.schema.text("\n"));
34779
- }
34780
- }
34781
- });
34782
- if (allContent.length > 0) {
34783
- const fragment = Fragment.from(allContent);
34784
- const tr = state2.tr.replaceSelectionWith(fragment, false);
34785
- dispatch(tr);
34786
- } else {
34787
- dispatch(state2.tr.replaceSelectionWith(doc2, true));
34788
- }
34794
+ } else if (isInParagraph) {
34795
+ const slice2 = new Slice(doc2.content, 0, 0);
34796
+ const tr = state2.tr.replaceSelection(slice2);
34797
+ dispatch(tr);
34789
34798
  } else {
34790
34799
  dispatch(state2.tr.replaceSelectionWith(doc2, true));
34791
34800
  }
@@ -41841,7 +41850,7 @@ const _SuperConverter = class _SuperConverter2 {
41841
41850
  static getStoredSuperdocVersion(docx) {
41842
41851
  return _SuperConverter2.getStoredCustomProperty(docx, "SuperdocVersion");
41843
41852
  }
41844
- static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "1.0.0-beta.37") {
41853
+ static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "1.0.0-beta.39") {
41845
41854
  return _SuperConverter2.setStoredCustomProperty(docx, "SuperdocVersion", version2, false);
41846
41855
  }
41847
41856
  /**
@@ -45147,7 +45156,7 @@ var __privateGet$1 = (obj, member, getter) => (__accessCheck$1(obj, member, "rea
45147
45156
  var __privateAdd$1 = (obj, member, value) => member.has(obj) ? __typeError$1("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
45148
45157
  var __privateSet = (obj, member, value, setter) => (__accessCheck$1(obj, member, "write to private field"), member.set(obj, value), value);
45149
45158
  var __privateMethod$1 = (obj, member, method) => (__accessCheck$1(obj, member, "access private method"), method);
45150
- 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, 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;
45159
+ 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, 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;
45151
45160
  var GOOD_LEAF_SIZE = 200;
45152
45161
  var RopeSequence = function RopeSequence2() {
45153
45162
  };
@@ -54079,11 +54088,13 @@ const unsetAllMarks = () => ({ tr, dispatch, editor }) => {
54079
54088
  selection = editor.options.lastSelection;
54080
54089
  }
54081
54090
  const { empty: empty2, ranges } = selection;
54082
- if (empty2) return true;
54083
54091
  if (dispatch) {
54084
- ranges.forEach((range2) => {
54085
- tr.removeMark(range2.$from.pos, range2.$to.pos);
54086
- });
54092
+ if (!empty2) {
54093
+ ranges.forEach((range2) => {
54094
+ tr.removeMark(range2.$from.pos, range2.$to.pos);
54095
+ });
54096
+ }
54097
+ tr.setStoredMarks([]);
54087
54098
  }
54088
54099
  return true;
54089
54100
  };
@@ -59014,7 +59025,7 @@ const isHeadless = (editor) => {
59014
59025
  const shouldSkipNodeView = (editor) => {
59015
59026
  return isHeadless(editor);
59016
59027
  };
59017
- const summaryVersion = "1.0.0-beta.37";
59028
+ const summaryVersion = "1.0.0-beta.39";
59018
59029
  const nodeKeys = ["group", "content", "marks", "inline", "atom", "defining", "code", "tableRole", "summary"];
59019
59030
  const markKeys = ["group", "inclusive", "excludes", "spanning", "code"];
59020
59031
  function mapAttributes(attrs) {
@@ -59803,7 +59814,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
59803
59814
  { default: remarkStringify },
59804
59815
  { default: remarkGfm }
59805
59816
  ] = await Promise.all([
59806
- import("./index-CVmL6SHD-DZlLqgFx.es.js"),
59817
+ import("./index-BqDEyWLQ-B3TrQVjX.es.js"),
59807
59818
  import("./index-DRCvimau-Cw339678.es.js"),
59808
59819
  import("./index-C_x_N6Uh-DJn8hIEt.es.js"),
59809
59820
  import("./index-D_sWOSiG-DE96TaT5.es.js"),
@@ -60008,7 +60019,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
60008
60019
  * Process collaboration migrations
60009
60020
  */
60010
60021
  processCollaborationMigrations() {
60011
- console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.37");
60022
+ console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.39");
60012
60023
  if (!this.options.ydoc) return;
60013
60024
  const metaMap = this.options.ydoc.getMap("meta");
60014
60025
  let docVersion = metaMap.get("version");
@@ -62019,7 +62030,7 @@ const applyTextStyleMark = (run2, attrs, themeColors) => {
62019
62030
  const fontSizePx = normalizeFontSizePx(attrs.fontSize);
62020
62031
  if (fontSizePx !== void 0 && fontSizePx >= 1 && fontSizePx <= 1e3) {
62021
62032
  run2.fontSize = fontSizePx;
62022
- }
62033
+ } else if (attrs.fontSize !== void 0) ;
62023
62034
  if (isFiniteNumber(attrs.letterSpacing)) {
62024
62035
  const spacing = Number(attrs.letterSpacing);
62025
62036
  if (spacing >= -100 && spacing <= 100) {
@@ -64698,18 +64709,18 @@ const computeParagraphAttrs = (para, styleContext, listCounterContext, converter
64698
64709
  paragraphAttrs.rtl = true;
64699
64710
  }
64700
64711
  const explicitAlignment = normalizeAlignment(attrs.alignment ?? attrs.textAlign);
64712
+ const paragraphAlignment = typeof paragraphProps.justification === "string" ? normalizeAlignment(paragraphProps.justification) : void 0;
64701
64713
  const styleAlignment = hydrated?.alignment ? normalizeAlignment(hydrated.alignment) : void 0;
64702
- const paragraphAlignment = paragraphProps.justification ? normalizeAlignment(paragraphProps.justification) : void 0;
64703
64714
  if (bidi && adjustRightInd) {
64704
64715
  paragraphAttrs.alignment = "right";
64705
64716
  } else if (explicitAlignment) {
64706
64717
  paragraphAttrs.alignment = explicitAlignment;
64718
+ } else if (paragraphAlignment) {
64719
+ paragraphAttrs.alignment = paragraphAlignment;
64707
64720
  } else if (bidi) {
64708
64721
  paragraphAttrs.alignment = "right";
64709
64722
  } else if (styleAlignment) {
64710
64723
  paragraphAttrs.alignment = styleAlignment;
64711
- } else if (paragraphAlignment) {
64712
- paragraphAttrs.alignment = paragraphAlignment;
64713
64724
  } else if (computed2.paragraph.alignment) {
64714
64725
  paragraphAttrs.alignment = computed2.paragraph.alignment;
64715
64726
  }
@@ -70429,11 +70440,26 @@ const FIELD_ANNOTATION_STYLES = `
70429
70440
  z-index: 1000;
70430
70441
  }
70431
70442
  `;
70443
+ const IMAGE_SELECTION_STYLES = `
70444
+ /* Highlight for selected images (block or inline) */
70445
+ .superdoc-image-selected {
70446
+ outline: 2px solid #4a90e2;
70447
+ outline-offset: 2px;
70448
+ border-radius: 2px;
70449
+ box-shadow: 0 0 0 1px rgba(74, 144, 226, 0.35);
70450
+ }
70451
+
70452
+ /* Ensure inline images can be targeted */
70453
+ .superdoc-inline-image.superdoc-image-selected {
70454
+ outline-offset: 2px;
70455
+ }
70456
+ `;
70432
70457
  let printStylesInjected = false;
70433
70458
  let linkStylesInjected = false;
70434
70459
  let trackChangeStylesInjected = false;
70435
70460
  let sdtContainerStylesInjected = false;
70436
70461
  let fieldAnnotationStylesInjected = false;
70462
+ let imageSelectionStylesInjected = false;
70437
70463
  const ensurePrintStyles = (doc2) => {
70438
70464
  if (printStylesInjected || !doc2) return;
70439
70465
  const styleEl = doc2.createElement("style");
@@ -70474,6 +70500,14 @@ const ensureFieldAnnotationStyles = (doc2) => {
70474
70500
  doc2.head?.appendChild(styleEl);
70475
70501
  fieldAnnotationStylesInjected = true;
70476
70502
  };
70503
+ const ensureImageSelectionStyles = (doc2) => {
70504
+ if (imageSelectionStylesInjected || !doc2) return;
70505
+ const styleEl = doc2.createElement("style");
70506
+ styleEl.setAttribute("data-superdoc-image-selection-styles", "true");
70507
+ styleEl.textContent = IMAGE_SELECTION_STYLES;
70508
+ doc2.head?.appendChild(styleEl);
70509
+ imageSelectionStylesInjected = true;
70510
+ };
70477
70511
  const DOM_CLASS_NAMES = {
70478
70512
  /**
70479
70513
  * Class name for page container elements.
@@ -71374,6 +71408,7 @@ const _DomPainter = class _DomPainter2 {
71374
71408
  ensureTrackChangeStyles(doc2);
71375
71409
  ensureFieldAnnotationStyles(doc2);
71376
71410
  ensureSdtContainerStyles(doc2);
71411
+ ensureImageSelectionStyles(doc2);
71377
71412
  mount2.classList.add(CLASS_NAMES$1.container);
71378
71413
  if (this.mount && this.mount !== mount2) {
71379
71414
  this.resetState();
@@ -71909,7 +71944,7 @@ const _DomPainter = class _DomPainter2 {
71909
71944
  if (fragment.continuesOnNext) {
71910
71945
  fragmentEl.dataset.continuesOnNext = "true";
71911
71946
  }
71912
- const lines = measure.lines.slice(fragment.fromLine, fragment.toLine);
71947
+ const lines = fragment.lines ?? measure.lines.slice(fragment.fromLine, fragment.toLine);
71913
71948
  applyParagraphBlockStyles(fragmentEl, block.attrs);
71914
71949
  if (block.attrs?.styleId) {
71915
71950
  fragmentEl.dataset.styleId = block.attrs.styleId;
@@ -73006,6 +73041,7 @@ const _DomPainter = class _DomPainter2 {
73006
73041
  return null;
73007
73042
  }
73008
73043
  const img = this.doc.createElement("img");
73044
+ img.classList.add("superdoc-inline-image");
73009
73045
  const isDataUrl = typeof run2.src === "string" && run2.src.startsWith("data:");
73010
73046
  if (isDataUrl) {
73011
73047
  if (run2.src.length > MAX_DATA_URL_LENGTH) {
@@ -75543,6 +75579,23 @@ function layoutParagraphBlock(ctx2, anchors) {
75543
75579
  }
75544
75580
  }
75545
75581
  let lines = normalizeLines(measure);
75582
+ const measurementWidth = lines[0]?.maxWidth;
75583
+ let didRemeasureForColumnWidth = false;
75584
+ if (typeof remeasureParagraph2 === "function" && typeof measurementWidth === "number" && measurementWidth > columnWidth) {
75585
+ let firstLineIndent = 0;
75586
+ const wordLayout = block.attrs?.wordLayout;
75587
+ if (wordLayout?.marker && measure.marker) {
75588
+ const markerJustification = wordLayout.marker.justification ?? "left";
75589
+ if (markerJustification === "left") {
75590
+ const markerWidth = measure.marker.markerWidth ?? 0;
75591
+ const gutterWidth = measure.marker.gutterWidth ?? wordLayout.marker.gutterWidthPx ?? 0;
75592
+ firstLineIndent = markerWidth + gutterWidth;
75593
+ }
75594
+ }
75595
+ const newMeasure = remeasureParagraph2(block, columnWidth, firstLineIndent);
75596
+ lines = normalizeLines(newMeasure);
75597
+ didRemeasureForColumnWidth = true;
75598
+ }
75546
75599
  let fromLine = 0;
75547
75600
  const spacing = block.attrs?.spacing ?? {};
75548
75601
  const styleId = block.attrs?.styleId;
@@ -75618,7 +75671,17 @@ function layoutParagraphBlock(ctx2, anchors) {
75618
75671
  tempY += lineHeight2;
75619
75672
  }
75620
75673
  if (narrowestWidth < columnWidth) {
75621
- const newMeasure = remeasureParagraph2(block, narrowestWidth);
75674
+ let firstLineIndent = 0;
75675
+ const wordLayout = block.attrs?.wordLayout;
75676
+ if (wordLayout?.marker && measure.marker) {
75677
+ const markerJustification = wordLayout.marker.justification ?? "left";
75678
+ if (markerJustification === "left") {
75679
+ const markerWidth = measure.marker.markerWidth ?? 0;
75680
+ const gutterWidth = measure.marker.gutterWidth ?? wordLayout.marker.gutterWidthPx ?? 0;
75681
+ firstLineIndent = markerWidth + gutterWidth;
75682
+ }
75683
+ }
75684
+ const newMeasure = remeasureParagraph2(block, narrowestWidth, firstLineIndent);
75622
75685
  lines = normalizeLines(newMeasure);
75623
75686
  didRemeasureForFloats = true;
75624
75687
  }
@@ -75683,6 +75746,9 @@ function layoutParagraphBlock(ctx2, anchors) {
75683
75746
  width: effectiveColumnWidth,
75684
75747
  ...computeFragmentPmRange(block, lines, fromLine, slice2.toLine)
75685
75748
  };
75749
+ if (didRemeasureForColumnWidth) {
75750
+ fragment.lines = lines.slice(fromLine, slice2.toLine);
75751
+ }
75686
75752
  if (measure.marker && fromLine === 0) {
75687
75753
  fragment.markerWidth = measure.marker.markerWidth;
75688
75754
  if (measure.marker.markerTextWidth != null) {
@@ -78411,12 +78477,14 @@ function lineHeightForRuns(runs, fromRun, toRun) {
78411
78477
  }
78412
78478
  return maxSize2 * 1.2;
78413
78479
  }
78414
- function remeasureParagraph(block, maxWidth) {
78480
+ function remeasureParagraph(block, maxWidth, firstLineIndent = 0) {
78415
78481
  const runs = block.runs ?? [];
78416
78482
  const lines = [];
78417
78483
  let currentRun = 0;
78418
78484
  let currentChar = 0;
78419
78485
  while (currentRun < runs.length) {
78486
+ const isFirstLine = lines.length === 0;
78487
+ const effectiveMaxWidth = isFirstLine ? maxWidth - firstLineIndent : maxWidth;
78420
78488
  const startRun = currentRun;
78421
78489
  const startChar = currentChar;
78422
78490
  let width = 0;
@@ -78430,7 +78498,7 @@ function remeasureParagraph(block, maxWidth) {
78430
78498
  const start2 = r2 === currentRun ? currentChar : 0;
78431
78499
  for (let c2 = start2; c2 < text.length; c2 += 1) {
78432
78500
  const w2 = measureRunSliceWidth(run2, c2, c2 + 1);
78433
- if (width + w2 > maxWidth && width > 0) {
78501
+ if (width + w2 > effectiveMaxWidth && width > 0) {
78434
78502
  if (lastBreakRun >= 0) {
78435
78503
  endRun = lastBreakRun;
78436
78504
  endChar = lastBreakChar;
@@ -78929,7 +78997,7 @@ async function incrementalLayout(previousBlocks, _previousLayout, nextBlocks, op
78929
78997
  ...options,
78930
78998
  headerContentHeights,
78931
78999
  // Pass header heights to prevent overlap
78932
- remeasureParagraph: (block, maxWidth) => remeasureParagraph(block, maxWidth)
79000
+ remeasureParagraph: (block, maxWidth, firstLineIndent) => remeasureParagraph(block, maxWidth, firstLineIndent)
78933
79001
  });
78934
79002
  const layoutEnd = performance.now();
78935
79003
  perfLog(`[Perf] 4.2 Layout document (pagination): ${(layoutEnd - layoutStart).toFixed(2)}ms`);
@@ -78977,7 +79045,7 @@ async function incrementalLayout(previousBlocks, _previousLayout, nextBlocks, op
78977
79045
  ...options,
78978
79046
  headerContentHeights,
78979
79047
  // Pass header heights to prevent overlap
78980
- remeasureParagraph: (block, maxWidth) => remeasureParagraph(block, maxWidth)
79048
+ remeasureParagraph: (block, maxWidth, firstLineIndent) => remeasureParagraph(block, maxWidth, firstLineIndent)
78981
79049
  });
78982
79050
  const relayoutEnd = performance.now();
78983
79051
  const relayoutTime = relayoutEnd - relayoutStart;
@@ -79808,6 +79876,31 @@ function findBlockIndexByFragmentId(blocks, fragmentBlockId, targetPmRange) {
79808
79876
  }
79809
79877
  return matchingIndices[0];
79810
79878
  }
79879
+ const DEFAULT_CELL_PADDING = { top: 2, bottom: 2, left: 4, right: 4 };
79880
+ const getCellPaddingFromRow = (cellIdx, row) => {
79881
+ const padding = row?.cells?.[cellIdx]?.attrs?.padding ?? {};
79882
+ return {
79883
+ top: padding.top ?? DEFAULT_CELL_PADDING.top,
79884
+ bottom: padding.bottom ?? DEFAULT_CELL_PADDING.bottom,
79885
+ left: padding.left ?? DEFAULT_CELL_PADDING.left,
79886
+ right: padding.right ?? DEFAULT_CELL_PADDING.right
79887
+ };
79888
+ };
79889
+ const getCellBlocks = (cell) => {
79890
+ if (!cell) return [];
79891
+ return cell.blocks ?? (cell.paragraph ? [cell.paragraph] : []);
79892
+ };
79893
+ const getCellMeasures = (cell) => {
79894
+ if (!cell) return [];
79895
+ return cell.blocks ?? (cell.paragraph ? [cell.paragraph] : []);
79896
+ };
79897
+ const sumLineHeights = (measure, fromLine, toLine) => {
79898
+ let height = 0;
79899
+ for (let i = fromLine; i < toLine && i < measure.lines.length; i += 1) {
79900
+ height += measure.lines[i]?.lineHeight ?? 0;
79901
+ }
79902
+ return height;
79903
+ };
79811
79904
  function selectionToRects(layout, blocks, measures, from2, to) {
79812
79905
  if (from2 === to) {
79813
79906
  return [];
@@ -79854,6 +79947,136 @@ function selectionToRects(layout, blocks, measures, from2, to) {
79854
79947
  });
79855
79948
  return;
79856
79949
  }
79950
+ if (fragment.kind === "table") {
79951
+ const blockIndex = findBlockIndexByFragmentId(blocks, fragment.blockId, { from: from2, to });
79952
+ if (blockIndex === -1) return;
79953
+ const block = blocks[blockIndex];
79954
+ const measure = measures[blockIndex];
79955
+ if (!block || block.kind !== "table" || measure?.kind !== "table") {
79956
+ return;
79957
+ }
79958
+ const tableBlock = block;
79959
+ const tableMeasure = measure;
79960
+ const tableFragment = fragment;
79961
+ const rowHeights = tableMeasure.rows.map((rowMeasure, idx) => {
79962
+ if (tableFragment.partialRow && tableFragment.partialRow.rowIndex === idx) {
79963
+ return tableFragment.partialRow.partialHeight;
79964
+ }
79965
+ return rowMeasure?.height ?? 0;
79966
+ });
79967
+ const calculateCellX = (cellIdx, cellMeasure) => {
79968
+ const gridStart = cellMeasure.gridColumnStart ?? cellIdx;
79969
+ let x2 = 0;
79970
+ for (let i = 0; i < gridStart && i < tableMeasure.columnWidths.length; i += 1) {
79971
+ x2 += tableMeasure.columnWidths[i];
79972
+ }
79973
+ return x2;
79974
+ };
79975
+ const processRow = (rowIndex, rowOffset) => {
79976
+ const rowMeasure = tableMeasure.rows[rowIndex];
79977
+ const row = tableBlock.rows[rowIndex];
79978
+ if (!rowMeasure || !row) return rowOffset;
79979
+ const rowHeight = rowHeights[rowIndex] ?? rowMeasure.height;
79980
+ const isPartialRow = tableFragment.partialRow?.rowIndex === rowIndex;
79981
+ const partialRowData = isPartialRow ? tableFragment.partialRow : null;
79982
+ const totalColumns = Math.min(rowMeasure.cells.length, row.cells.length);
79983
+ for (let cellIdx = 0; cellIdx < totalColumns; cellIdx += 1) {
79984
+ const cellMeasure = rowMeasure.cells[cellIdx];
79985
+ const cell = row.cells[cellIdx];
79986
+ if (!cellMeasure || !cell) continue;
79987
+ const padding = getCellPaddingFromRow(cellIdx, row);
79988
+ const cellX = calculateCellX(cellIdx, cellMeasure);
79989
+ const cellBlocks = getCellBlocks(cell);
79990
+ const cellBlockMeasures = getCellMeasures(cellMeasure);
79991
+ const renderedBlocks = [];
79992
+ let cumulativeLine = 0;
79993
+ for (let i = 0; i < Math.min(cellBlocks.length, cellBlockMeasures.length); i += 1) {
79994
+ const paraBlock = cellBlocks[i];
79995
+ const paraMeasure = cellBlockMeasures[i];
79996
+ if (!paraBlock || !paraMeasure || paraBlock.kind !== "paragraph" || paraMeasure.kind !== "paragraph") {
79997
+ continue;
79998
+ }
79999
+ const lineCount = paraMeasure.lines.length;
80000
+ const blockStart = cumulativeLine;
80001
+ const blockEnd = cumulativeLine + lineCount;
80002
+ cumulativeLine = blockEnd;
80003
+ const allowedStart = partialRowData?.fromLineByCell?.[cellIdx] ?? 0;
80004
+ const rawAllowedEnd = partialRowData?.toLineByCell?.[cellIdx];
80005
+ const allowedEnd = rawAllowedEnd == null || rawAllowedEnd === -1 ? cumulativeLine : rawAllowedEnd;
80006
+ const renderStartGlobal = Math.max(blockStart, allowedStart);
80007
+ const renderEndGlobal = Math.min(blockEnd, allowedEnd);
80008
+ if (renderStartGlobal >= renderEndGlobal) continue;
80009
+ const startLine = renderStartGlobal - blockStart;
80010
+ const endLine = renderEndGlobal - blockStart;
80011
+ let height = sumLineHeights(paraMeasure, startLine, endLine);
80012
+ const rendersWholeBlock = startLine === 0 && endLine >= lineCount;
80013
+ if (rendersWholeBlock) {
80014
+ const totalHeight = paraMeasure.totalHeight;
80015
+ if (typeof totalHeight === "number" && totalHeight > height) {
80016
+ height = totalHeight;
80017
+ }
80018
+ const spacingAfter = paraBlock.attrs?.spacing?.after;
80019
+ if (typeof spacingAfter === "number" && spacingAfter > 0) {
80020
+ height += spacingAfter;
80021
+ }
80022
+ }
80023
+ renderedBlocks.push({ block: paraBlock, measure: paraMeasure, startLine, endLine, height });
80024
+ }
80025
+ const contentHeight = renderedBlocks.reduce((acc, info) => acc + info.height, 0);
80026
+ const contentAreaHeight = Math.max(0, rowHeight - (padding.top + padding.bottom));
80027
+ const freeSpace = Math.max(0, contentAreaHeight - contentHeight);
80028
+ let verticalOffset = 0;
80029
+ const vAlign = cell.attrs?.verticalAlign;
80030
+ if (vAlign === "center" || vAlign === "middle") {
80031
+ verticalOffset = freeSpace / 2;
80032
+ } else if (vAlign === "bottom") {
80033
+ verticalOffset = freeSpace;
80034
+ }
80035
+ let blockTopCursor = padding.top + verticalOffset;
80036
+ renderedBlocks.forEach((info) => {
80037
+ const paragraphMarkerWidth = info.measure.marker?.markerWidth ?? 0;
80038
+ const intersectingLines = findLinesIntersectingRange(info.block, info.measure, from2, to);
80039
+ intersectingLines.forEach(({ line, index: index2 }) => {
80040
+ if (index2 < info.startLine || index2 >= info.endLine) {
80041
+ return;
80042
+ }
80043
+ const range2 = computeLinePmRange(info.block, line);
80044
+ if (range2.pmStart == null || range2.pmEnd == null) return;
80045
+ const sliceFrom = Math.max(range2.pmStart, from2);
80046
+ const sliceTo = Math.min(range2.pmEnd, to);
80047
+ if (sliceFrom >= sliceTo) return;
80048
+ const charOffsetFrom = pmPosToCharOffset(info.block, line, sliceFrom);
80049
+ const charOffsetTo = pmPosToCharOffset(info.block, line, sliceTo);
80050
+ const availableWidth = Math.max(1, cellMeasure.width - padding.left - padding.right);
80051
+ const startX = mapPmToX(info.block, line, charOffsetFrom, availableWidth);
80052
+ const endX = mapPmToX(info.block, line, charOffsetTo, availableWidth);
80053
+ const rectX = fragment.x + cellX + padding.left + paragraphMarkerWidth + Math.min(startX, endX);
80054
+ const rectWidth = Math.max(1, Math.abs(endX - startX));
80055
+ const lineOffset = lineHeightBeforeIndex(info.measure, index2) - lineHeightBeforeIndex(info.measure, info.startLine);
80056
+ const rectY = fragment.y + rowOffset + blockTopCursor + lineOffset;
80057
+ rects.push({
80058
+ x: rectX,
80059
+ y: rectY + pageIndex * layout.pageSize.h,
80060
+ width: rectWidth,
80061
+ height: line.lineHeight,
80062
+ pageIndex
80063
+ });
80064
+ });
80065
+ blockTopCursor += info.height;
80066
+ });
80067
+ }
80068
+ return rowOffset + rowHeight;
80069
+ };
80070
+ let rowCursor = 0;
80071
+ const repeatHeaderCount = tableFragment.repeatHeaderCount ?? 0;
80072
+ for (let r2 = 0; r2 < repeatHeaderCount && r2 < tableMeasure.rows.length; r2 += 1) {
80073
+ rowCursor = processRow(r2, rowCursor);
80074
+ }
80075
+ for (let r2 = tableFragment.fromRow; r2 < tableFragment.toRow && r2 < tableMeasure.rows.length; r2 += 1) {
80076
+ rowCursor = processRow(r2, rowCursor);
80077
+ }
80078
+ return;
80079
+ }
79857
80080
  if (isAtomicFragment(fragment)) {
79858
80081
  const blockIndex = findBlockIndexByFragmentId(blocks, fragment.blockId, { from: from2, to });
79859
80082
  if (blockIndex === -1) return;
@@ -80380,7 +80603,16 @@ async function measureParagraphBlock(block, maxWidth) {
80380
80603
  const rawFirstLineOffset = suppressFirstLine ? 0 : firstLine - hanging;
80381
80604
  const firstLineOffset = isWordLayoutList ? 0 : rawFirstLineOffset;
80382
80605
  const contentWidth = Math.max(1, maxWidth - indentLeft - indentRight);
80383
- const initialAvailableWidth = Math.max(1, contentWidth - firstLineOffset);
80606
+ let leftJustifiedMarkerSpace = 0;
80607
+ if (wordLayout?.marker) {
80608
+ const markerJustification = wordLayout.marker.justification ?? "left";
80609
+ if (markerJustification === "left") {
80610
+ const markerBoxWidth = wordLayout.marker.markerBoxWidthPx ?? 0;
80611
+ const gutterWidth = wordLayout.marker.gutterWidthPx ?? LIST_MARKER_GAP;
80612
+ leftJustifiedMarkerSpace = markerBoxWidth + gutterWidth;
80613
+ }
80614
+ }
80615
+ const initialAvailableWidth = Math.max(1, contentWidth - firstLineOffset - leftJustifiedMarkerSpace);
80384
80616
  const tabStops = buildTabStopsPx(
80385
80617
  indent,
80386
80618
  block.attrs?.tabs,
@@ -82856,12 +83088,30 @@ const _PresentationEditor = class _PresentationEditor2 extends EventEmitter$1 {
82856
83088
  if (linkEl) {
82857
83089
  const href = linkEl.getAttribute("href") ?? "";
82858
83090
  const isAnchorLink = href.startsWith("#") && href.length > 1;
82859
- if (isAnchorLink) {
83091
+ const isTocLink = linkEl.closest(".superdoc-toc-entry") !== null;
83092
+ if (isAnchorLink && isTocLink) {
82860
83093
  event.preventDefault();
82861
83094
  event.stopPropagation();
82862
83095
  this.goToAnchor(href);
82863
83096
  return;
82864
83097
  }
83098
+ event.preventDefault();
83099
+ event.stopPropagation();
83100
+ const linkClickEvent = new CustomEvent("superdoc-link-click", {
83101
+ bubbles: true,
83102
+ composed: true,
83103
+ detail: {
83104
+ href,
83105
+ target: linkEl.getAttribute("target"),
83106
+ rel: linkEl.getAttribute("rel"),
83107
+ tooltip: linkEl.getAttribute("title"),
83108
+ element: linkEl,
83109
+ clientX: event.clientX,
83110
+ clientY: event.clientY
83111
+ }
83112
+ });
83113
+ linkEl.dispatchEvent(linkClickEvent);
83114
+ return;
82865
83115
  }
82866
83116
  const isDraggableAnnotation = target?.closest?.('[data-draggable="true"]') != null;
82867
83117
  if (!__privateGet$1(this, _layoutState).layout) {
@@ -82959,6 +83209,44 @@ const _PresentationEditor = class _PresentationEditor2 extends EventEmitter$1 {
82959
83209
  __privateGet$1(this, _layoutState).measures,
82960
83210
  hit.pos
82961
83211
  );
83212
+ const targetImg = event.target?.closest?.("img");
83213
+ const imgPmStart = targetImg?.dataset?.pmStart ? Number(targetImg.dataset.pmStart) : null;
83214
+ if (!Number.isNaN(imgPmStart) && imgPmStart != null) {
83215
+ const doc222 = __privateGet$1(this, _editor3).state.doc;
83216
+ if (imgPmStart < 0 || imgPmStart >= doc222.content.size) {
83217
+ if (process$1$1.env.NODE_ENV === "development") {
83218
+ console.warn(
83219
+ `[PresentationEditor] Invalid position ${imgPmStart} for inline image (document size: ${doc222.content.size})`
83220
+ );
83221
+ }
83222
+ return;
83223
+ }
83224
+ const newSelectionId = `inline-${imgPmStart}`;
83225
+ if (__privateGet$1(this, _lastSelectedImageBlockId) && __privateGet$1(this, _lastSelectedImageBlockId) !== newSelectionId) {
83226
+ this.emit("imageDeselected", { blockId: __privateGet$1(this, _lastSelectedImageBlockId) });
83227
+ }
83228
+ try {
83229
+ const tr = __privateGet$1(this, _editor3).state.tr.setSelection(NodeSelection.create(doc222, imgPmStart));
83230
+ __privateGet$1(this, _editor3).view?.dispatch(tr);
83231
+ const selector = `.superdoc-inline-image[data-pm-start="${imgPmStart}"]`;
83232
+ const targetElement = __privateGet$1(this, _viewportHost).querySelector(selector);
83233
+ this.emit("imageSelected", {
83234
+ element: targetElement ?? targetImg,
83235
+ blockId: null,
83236
+ pmStart: imgPmStart
83237
+ });
83238
+ __privateSet(this, _lastSelectedImageBlockId, newSelectionId);
83239
+ } catch (error) {
83240
+ if (process$1$1.env.NODE_ENV === "development") {
83241
+ console.warn(
83242
+ `[PresentationEditor] Failed to create NodeSelection for inline image at position ${imgPmStart}:`,
83243
+ error
83244
+ );
83245
+ }
83246
+ }
83247
+ __privateMethod$1(this, _PresentationEditor_instances, focusEditorAfterImageSelection_fn).call(this);
83248
+ return;
83249
+ }
82962
83250
  if (fragmentHit && (fragmentHit.fragment.kind === "image" || fragmentHit.fragment.kind === "drawing")) {
82963
83251
  const doc222 = __privateGet$1(this, _editor3).state.doc;
82964
83252
  try {
@@ -82985,15 +83273,7 @@ const _PresentationEditor = class _PresentationEditor2 extends EventEmitter$1 {
82985
83273
  console.warn("[PresentationEditor] Failed to create NodeSelection for atomic fragment:", error);
82986
83274
  }
82987
83275
  }
82988
- __privateMethod$1(this, _PresentationEditor_instances, scheduleSelectionUpdate_fn).call(this);
82989
- if (document.activeElement instanceof HTMLElement) {
82990
- document.activeElement.blur();
82991
- }
82992
- const editorDom2 = __privateGet$1(this, _editor3).view?.dom;
82993
- if (editorDom2) {
82994
- editorDom2.focus();
82995
- __privateGet$1(this, _editor3).view?.focus();
82996
- }
83276
+ __privateMethod$1(this, _PresentationEditor_instances, focusEditorAfterImageSelection_fn).call(this);
82997
83277
  return;
82998
83278
  }
82999
83279
  if (__privateGet$1(this, _lastSelectedImageBlockId)) {
@@ -83566,6 +83846,47 @@ const _PresentationEditor = class _PresentationEditor2 extends EventEmitter$1 {
83566
83846
  get overlayElement() {
83567
83847
  return __privateGet$1(this, _selectionOverlay2) ?? null;
83568
83848
  }
83849
+ /**
83850
+ * Get the current zoom level.
83851
+ *
83852
+ * The zoom level is a multiplier that controls the visual scale of the document.
83853
+ * This value is applied via CSS transform: scale() on the #viewportHost element,
83854
+ * which ensures consistent scaling between rendered content and overlay elements
83855
+ * (selections, cursors, interactive handles).
83856
+ *
83857
+ * Relationship to Centralized Zoom Architecture:
83858
+ * - PresentationEditor is the SINGLE SOURCE OF TRUTH for zoom state
83859
+ * - Zoom is applied internally via transform: scale() on #viewportHost
83860
+ * - External components (toolbar, UI controls) should use setZoom() to modify zoom
83861
+ * - The zoom value is used throughout the system for coordinate transformations
83862
+ *
83863
+ * Coordinate Space Implications:
83864
+ * - Layout coordinates: Unscaled logical pixels used by the layout engine
83865
+ * - Screen coordinates: Physical pixels affected by CSS transform: scale()
83866
+ * - Conversion: screenCoord = layoutCoord * zoom
83867
+ *
83868
+ * Zoom Scale:
83869
+ * - 1 = 100% (default, no scaling)
83870
+ * - 0.5 = 50% (zoomed out, content appears smaller)
83871
+ * - 2 = 200% (zoomed in, content appears larger)
83872
+ *
83873
+ * @returns The current zoom level multiplier (default: 1 if not configured)
83874
+ *
83875
+ * @example
83876
+ * ```typescript
83877
+ * const zoom = presentation.zoom;
83878
+ * // Convert layout coordinates to screen coordinates
83879
+ * const screenX = layoutX * zoom;
83880
+ * const screenY = layoutY * zoom;
83881
+ *
83882
+ * // Convert screen coordinates back to layout coordinates
83883
+ * const layoutX = screenX / zoom;
83884
+ * const layoutY = screenY / zoom;
83885
+ * ```
83886
+ */
83887
+ get zoom() {
83888
+ return __privateGet$1(this, _layoutOptions).zoom ?? 1;
83889
+ }
83569
83890
  /**
83570
83891
  * Set the document mode and update editor editability.
83571
83892
  *
@@ -83756,8 +84077,8 @@ const _PresentationEditor = class _PresentationEditor2 extends EventEmitter$1 {
83756
84077
  const pageLocalY = rect.y - rect.pageIndex * pageHeight;
83757
84078
  const coords = __privateMethod$1(this, _PresentationEditor_instances, convertPageLocalToOverlayCoords_fn).call(this, rect.pageIndex, rect.x, pageLocalY);
83758
84079
  if (!coords) return null;
83759
- const absLeft = coords.x + overlayRect.left;
83760
- const absTop = coords.y + overlayRect.top;
84080
+ const absLeft = coords.x * zoom + overlayRect.left;
84081
+ const absTop = coords.y * zoom + overlayRect.top;
83761
84082
  const left2 = relativeRect ? absLeft - relativeRect.left : absLeft;
83762
84083
  const top2 = relativeRect ? absTop - relativeRect.top : absTop;
83763
84084
  const width = Math.max(1, rect.width * zoom);
@@ -84655,6 +84976,10 @@ renderRemoteCursors_fn = function() {
84655
84976
  const visibleClientIds = /* @__PURE__ */ new Set();
84656
84977
  sortedCursors.forEach((cursor) => {
84657
84978
  visibleClientIds.add(cursor.clientId);
84979
+ const oldSelections = __privateGet$1(this, _remoteCursorOverlay)?.querySelectorAll(
84980
+ `.presentation-editor__remote-selection[data-client-id="${cursor.clientId}"]`
84981
+ );
84982
+ oldSelections?.forEach((el) => el.remove());
84658
84983
  if (cursor.anchor === cursor.head) {
84659
84984
  __privateMethod$1(this, _PresentationEditor_instances, renderRemoteCaret_fn).call(this, cursor);
84660
84985
  } else {
@@ -84670,7 +84995,7 @@ renderRemoteCursors_fn = function() {
84670
84995
  };
84671
84996
  renderRemoteCaret_fn = function(cursor) {
84672
84997
  const caretLayout = __privateMethod$1(this, _PresentationEditor_instances, computeCaretLayoutRect_fn).call(this, cursor.head);
84673
- const zoom = __privateGet$1(this, _layoutOptions).zoom ?? 1;
84998
+ __privateGet$1(this, _layoutOptions).zoom ?? 1;
84674
84999
  const doc2 = __privateGet$1(this, _visibleHost).ownerDocument ?? document;
84675
85000
  const color = __privateMethod$1(this, _PresentationEditor_instances, getValidatedColor_fn).call(this, cursor);
84676
85001
  let caretEl = __privateGet$1(this, _remoteCursorElements).get(cursor.clientId);
@@ -84703,7 +85028,7 @@ renderRemoteCaret_fn = function(cursor) {
84703
85028
  }
84704
85029
  caretEl.style.opacity = "1";
84705
85030
  caretEl.style.transform = `translate(${coords.x}px, ${coords.y}px)`;
84706
- caretEl.style.height = `${Math.max(1, caretLayout.height * zoom)}px`;
85031
+ caretEl.style.height = `${Math.max(1, caretLayout.height)}px`;
84707
85032
  caretEl.style.borderLeftColor = color;
84708
85033
  const labelEl = caretEl.querySelector(".presentation-editor__remote-label");
84709
85034
  if (labelEl) {
@@ -84743,7 +85068,6 @@ renderRemoteSelection_fn = function(cursor) {
84743
85068
  const end2 = Math.max(cursor.anchor, cursor.head);
84744
85069
  const rects = selectionToRects(layout, blocks, measures, start2, end2) ?? [];
84745
85070
  const color = __privateMethod$1(this, _PresentationEditor_instances, getValidatedColor_fn).call(this, cursor);
84746
- const zoom = __privateGet$1(this, _layoutOptions).zoom ?? 1;
84747
85071
  const opacity = __privateGet$1(this, _layoutOptions).presence?.highlightOpacity ?? 0.35;
84748
85072
  const pageHeight = layout.pageSize?.h ?? __privateGet$1(this, _layoutOptions).pageSize?.h ?? DEFAULT_PAGE_SIZE.h;
84749
85073
  const doc2 = __privateGet$1(this, _visibleHost).ownerDocument ?? document;
@@ -84757,8 +85081,8 @@ renderRemoteSelection_fn = function(cursor) {
84757
85081
  selectionEl.style.position = "absolute";
84758
85082
  selectionEl.style.left = `${coords.x}px`;
84759
85083
  selectionEl.style.top = `${coords.y}px`;
84760
- selectionEl.style.width = `${Math.max(1, rect.width * zoom)}px`;
84761
- selectionEl.style.height = `${Math.max(1, rect.height * zoom)}px`;
85084
+ selectionEl.style.width = `${Math.max(1, rect.width)}px`;
85085
+ selectionEl.style.height = `${Math.max(1, rect.height)}px`;
84762
85086
  selectionEl.style.backgroundColor = color;
84763
85087
  selectionEl.style.opacity = opacity.toString();
84764
85088
  selectionEl.style.borderRadius = _PresentationEditor.CURSOR_STYLES.SELECTION_BORDER_RADIUS;
@@ -84868,6 +85192,17 @@ setupDragHandlers_fn = function() {
84868
85192
  }
84869
85193
  }));
84870
85194
  };
85195
+ focusEditorAfterImageSelection_fn = function() {
85196
+ __privateMethod$1(this, _PresentationEditor_instances, scheduleSelectionUpdate_fn).call(this);
85197
+ if (document.activeElement instanceof HTMLElement) {
85198
+ document.activeElement.blur();
85199
+ }
85200
+ const editorDom = __privateGet$1(this, _editor3).view?.dom;
85201
+ if (editorDom) {
85202
+ editorDom.focus();
85203
+ __privateGet$1(this, _editor3).view?.focus();
85204
+ }
85205
+ };
84871
85206
  setupInputBridge_fn = function() {
84872
85207
  __privateGet$1(this, _inputBridge)?.destroy();
84873
85208
  const win = __privateGet$1(this, _visibleHost).ownerDocument?.defaultView ?? window;
@@ -85291,6 +85626,9 @@ scheduleSelectionUpdate_fn = function() {
85291
85626
  if (__privateGet$1(this, _selectionUpdateScheduled)) {
85292
85627
  return;
85293
85628
  }
85629
+ if (__privateGet$1(this, _isRerendering) || __privateGet$1(this, _pendingDocChange)) {
85630
+ return;
85631
+ }
85294
85632
  __privateSet(this, _selectionUpdateScheduled, true);
85295
85633
  const win = __privateGet$1(this, _visibleHost).ownerDocument?.defaultView ?? window;
85296
85634
  win.requestAnimationFrame(() => {
@@ -85306,13 +85644,26 @@ updateSelection_fn = function() {
85306
85644
  return;
85307
85645
  }
85308
85646
  if (__privateGet$1(this, _documentMode) === "viewing") {
85309
- __privateGet$1(this, _localSelectionLayer).innerHTML = "";
85647
+ try {
85648
+ __privateGet$1(this, _localSelectionLayer).innerHTML = "";
85649
+ } catch (error) {
85650
+ if (process$1$1.env.NODE_ENV === "development") {
85651
+ console.warn("[PresentationEditor] Failed to clear selection layer in viewing mode:", error);
85652
+ }
85653
+ }
85310
85654
  return;
85311
85655
  }
85312
85656
  const layout = __privateGet$1(this, _layoutState).layout;
85313
- const selection = this.getActiveEditor().state?.selection;
85314
- __privateGet$1(this, _localSelectionLayer).innerHTML = "";
85657
+ const editorState = this.getActiveEditor().state;
85658
+ const selection = editorState?.selection;
85315
85659
  if (!selection) {
85660
+ try {
85661
+ __privateGet$1(this, _localSelectionLayer).innerHTML = "";
85662
+ } catch (error) {
85663
+ if (process$1$1.env.NODE_ENV === "development") {
85664
+ console.warn("[PresentationEditor] Failed to clear selection layer (no selection):", error);
85665
+ }
85666
+ }
85316
85667
  return;
85317
85668
  }
85318
85669
  if (!layout) {
@@ -85320,15 +85671,40 @@ updateSelection_fn = function() {
85320
85671
  }
85321
85672
  const { from: from2, to } = selection;
85322
85673
  if (from2 === to) {
85323
- const caretLayout = __privateMethod$1(this, _PresentationEditor_instances, computeCaretLayoutRect_fn).call(this, from2);
85674
+ let caretLayout = __privateMethod$1(this, _PresentationEditor_instances, computeCaretLayoutRect_fn).call(this, from2);
85675
+ const doc2 = editorState?.doc;
85676
+ if (!doc2) {
85677
+ return;
85678
+ }
85679
+ const docSize = doc2.content?.size ?? 0;
85680
+ if (!caretLayout && from2 > 0) {
85681
+ caretLayout = __privateMethod$1(this, _PresentationEditor_instances, computeCaretLayoutRect_fn).call(this, from2 - 1);
85682
+ }
85683
+ if (!caretLayout && from2 + 1 <= docSize) {
85684
+ caretLayout = __privateMethod$1(this, _PresentationEditor_instances, computeCaretLayoutRect_fn).call(this, from2 + 1);
85685
+ }
85324
85686
  if (!caretLayout) {
85325
85687
  return;
85326
85688
  }
85327
- __privateMethod$1(this, _PresentationEditor_instances, renderCaretOverlay_fn).call(this, caretLayout);
85689
+ try {
85690
+ __privateGet$1(this, _localSelectionLayer).innerHTML = "";
85691
+ __privateMethod$1(this, _PresentationEditor_instances, renderCaretOverlay_fn).call(this, caretLayout);
85692
+ } catch (error) {
85693
+ if (process$1$1.env.NODE_ENV === "development") {
85694
+ console.warn("[PresentationEditor] Failed to render caret overlay:", error);
85695
+ }
85696
+ }
85328
85697
  return;
85329
85698
  }
85330
85699
  const rects = selectionToRects(layout, __privateGet$1(this, _layoutState).blocks, __privateGet$1(this, _layoutState).measures, from2, to) ?? [];
85331
- __privateMethod$1(this, _PresentationEditor_instances, renderSelectionRects_fn).call(this, rects);
85700
+ try {
85701
+ __privateGet$1(this, _localSelectionLayer).innerHTML = "";
85702
+ __privateMethod$1(this, _PresentationEditor_instances, renderSelectionRects_fn).call(this, rects);
85703
+ } catch (error) {
85704
+ if (process$1$1.env.NODE_ENV === "development") {
85705
+ console.warn("[PresentationEditor] Failed to render selection rects:", error);
85706
+ }
85707
+ }
85332
85708
  };
85333
85709
  resolveLayoutOptions_fn = function(blocks, sectionMetadata) {
85334
85710
  const defaults = __privateMethod$1(this, _PresentationEditor_instances, computeDefaultLayoutDefaults_fn).call(this);
@@ -86074,7 +86450,6 @@ renderSelectionRects_fn = function(rects) {
86074
86450
  return;
86075
86451
  }
86076
86452
  const pageHeight = __privateMethod$1(this, _PresentationEditor_instances, getBodyPageHeight_fn).call(this);
86077
- const zoom = __privateGet$1(this, _layoutOptions).zoom ?? 1;
86078
86453
  rects.forEach((rect, _index) => {
86079
86454
  const pageLocalY = rect.y - rect.pageIndex * pageHeight;
86080
86455
  const coords = __privateMethod$1(this, _PresentationEditor_instances, convertPageLocalToOverlayCoords_fn).call(this, rect.pageIndex, rect.x, pageLocalY);
@@ -86089,8 +86464,8 @@ renderSelectionRects_fn = function(rects) {
86089
86464
  highlight.style.position = "absolute";
86090
86465
  highlight.style.left = `${coords.x}px`;
86091
86466
  highlight.style.top = `${coords.y}px`;
86092
- highlight.style.width = `${Math.max(1, rect.width * zoom)}px`;
86093
- highlight.style.height = `${Math.max(1, rect.height * zoom)}px`;
86467
+ highlight.style.width = `${Math.max(1, rect.width)}px`;
86468
+ highlight.style.height = `${Math.max(1, rect.height)}px`;
86094
86469
  highlight.style.backgroundColor = "rgba(51, 132, 255, 0.35)";
86095
86470
  highlight.style.borderRadius = "2px";
86096
86471
  highlight.style.pointerEvents = "none";
@@ -86099,7 +86474,6 @@ renderSelectionRects_fn = function(rects) {
86099
86474
  };
86100
86475
  renderHoverRegion_fn = function(region) {
86101
86476
  if (!__privateGet$1(this, _hoverOverlay) || !__privateGet$1(this, _hoverTooltip)) return;
86102
- const zoom = __privateGet$1(this, _layoutOptions).zoom ?? 1;
86103
86477
  const coords = __privateMethod$1(this, _PresentationEditor_instances, convertPageLocalToOverlayCoords_fn).call(this, region.pageIndex, region.localX, region.localY);
86104
86478
  if (!coords) {
86105
86479
  __privateMethod$1(this, _PresentationEditor_instances, clearHoverRegion_fn).call(this);
@@ -86108,15 +86482,15 @@ renderHoverRegion_fn = function(region) {
86108
86482
  __privateGet$1(this, _hoverOverlay).style.display = "block";
86109
86483
  __privateGet$1(this, _hoverOverlay).style.left = `${coords.x}px`;
86110
86484
  __privateGet$1(this, _hoverOverlay).style.top = `${coords.y}px`;
86111
- __privateGet$1(this, _hoverOverlay).style.width = `${region.width * zoom}px`;
86112
- __privateGet$1(this, _hoverOverlay).style.height = `${region.height * zoom}px`;
86485
+ __privateGet$1(this, _hoverOverlay).style.width = `${region.width}px`;
86486
+ __privateGet$1(this, _hoverOverlay).style.height = `${region.height}px`;
86113
86487
  const tooltipText = `Double-click to edit ${region.kind === "header" ? "header" : "footer"}`;
86114
86488
  __privateGet$1(this, _hoverTooltip).textContent = tooltipText;
86115
86489
  __privateGet$1(this, _hoverTooltip).style.display = "block";
86116
86490
  __privateGet$1(this, _hoverTooltip).style.left = `${coords.x}px`;
86117
86491
  const tooltipHeight = 24;
86118
86492
  const spaceAbove = coords.y;
86119
- const regionHeight = region.height * zoom;
86493
+ const regionHeight = region.height;
86120
86494
  const tooltipY = spaceAbove < tooltipHeight + 4 ? coords.y + regionHeight + 4 : coords.y - tooltipHeight;
86121
86495
  __privateGet$1(this, _hoverTooltip).style.top = `${Math.max(0, tooltipY)}px`;
86122
86496
  };
@@ -86133,11 +86507,11 @@ renderCaretOverlay_fn = function(caretLayout) {
86133
86507
  if (!__privateGet$1(this, _localSelectionLayer)) {
86134
86508
  return;
86135
86509
  }
86136
- const zoom = __privateGet$1(this, _layoutOptions).zoom ?? 1;
86137
86510
  const coords = __privateMethod$1(this, _PresentationEditor_instances, convertPageLocalToOverlayCoords_fn).call(this, caretLayout.pageIndex, caretLayout.x, caretLayout.y);
86138
86511
  if (!coords) {
86139
86512
  return;
86140
86513
  }
86514
+ const finalHeight = Math.max(1, caretLayout.height);
86141
86515
  const caretEl = __privateGet$1(this, _localSelectionLayer).ownerDocument?.createElement("div");
86142
86516
  if (!caretEl) {
86143
86517
  return;
@@ -86147,7 +86521,7 @@ renderCaretOverlay_fn = function(caretLayout) {
86147
86521
  caretEl.style.left = `${coords.x}px`;
86148
86522
  caretEl.style.top = `${coords.y}px`;
86149
86523
  caretEl.style.width = "2px";
86150
- caretEl.style.height = `${Math.max(1, caretLayout.height * zoom)}px`;
86524
+ caretEl.style.height = `${finalHeight}px`;
86151
86525
  caretEl.style.backgroundColor = "#3366FF";
86152
86526
  caretEl.style.borderRadius = "1px";
86153
86527
  caretEl.style.pointerEvents = "none";
@@ -86301,7 +86675,8 @@ inchesToPx_fn = function(value) {
86301
86675
  };
86302
86676
  applyZoom_fn = function() {
86303
86677
  const zoom = __privateGet$1(this, _layoutOptions).zoom ?? 1;
86304
- __privateGet$1(this, _painterHost).style.transform = `scale(${zoom})`;
86678
+ __privateGet$1(this, _viewportHost).style.transformOrigin = "top left";
86679
+ __privateGet$1(this, _viewportHost).style.transform = zoom === 1 ? "" : `scale(${zoom})`;
86305
86680
  };
86306
86681
  createLayoutMetrics_fn = function(perf, startMark, layout, blocks) {
86307
86682
  if (!perf || startMark == null || typeof perf.now !== "function") {
@@ -86315,20 +86690,28 @@ createLayoutMetrics_fn = function(perf, startMark, layout, blocks) {
86315
86690
  };
86316
86691
  };
86317
86692
  convertPageLocalToOverlayCoords_fn = function(pageIndex, pageLocalX, pageLocalY) {
86318
- const pageEl = __privateGet$1(this, _painterHost).querySelector(
86319
- `.superdoc-page[data-page-index="${pageIndex}"]`
86320
- );
86321
- if (!pageEl) {
86693
+ if (!Number.isFinite(pageIndex) || pageIndex < 0) {
86694
+ console.warn(
86695
+ `[PresentationEditor] #convertPageLocalToOverlayCoords: Invalid pageIndex ${pageIndex}. Expected a finite non-negative number.`
86696
+ );
86322
86697
  return null;
86323
86698
  }
86324
- const pageRect = pageEl.getBoundingClientRect();
86325
- const overlayRect = __privateGet$1(this, _selectionOverlay2).getBoundingClientRect();
86326
- const layoutPageSize = __privateGet$1(this, _layoutState).layout?.pageSize;
86327
- const scaleX = layoutPageSize && typeof layoutPageSize.w === "number" && layoutPageSize.w > 0 ? pageRect.width / layoutPageSize.w : 1;
86328
- const scaleY = layoutPageSize && typeof layoutPageSize.h === "number" && layoutPageSize.h > 0 ? pageRect.height / layoutPageSize.h : 1;
86699
+ if (!Number.isFinite(pageLocalX)) {
86700
+ console.warn(
86701
+ `[PresentationEditor] #convertPageLocalToOverlayCoords: Invalid pageLocalX ${pageLocalX}. Expected a finite number.`
86702
+ );
86703
+ return null;
86704
+ }
86705
+ if (!Number.isFinite(pageLocalY)) {
86706
+ console.warn(
86707
+ `[PresentationEditor] #convertPageLocalToOverlayCoords: Invalid pageLocalY ${pageLocalY}. Expected a finite number.`
86708
+ );
86709
+ return null;
86710
+ }
86711
+ const pageHeight = __privateGet$1(this, _layoutOptions).pageSize?.h ?? DEFAULT_PAGE_SIZE.h;
86329
86712
  return {
86330
- x: pageRect.left - overlayRect.left + pageLocalX * scaleX,
86331
- y: pageRect.top - overlayRect.top + pageLocalY * scaleY
86713
+ x: pageLocalX,
86714
+ y: pageIndex * pageHeight + pageLocalY
86332
86715
  };
86333
86716
  };
86334
86717
  normalizeClientPoint_fn = function(clientX, clientY) {
@@ -100993,7 +101376,8 @@ const Strike = Mark2.create({
100993
101376
  },
100994
101377
  addShortcuts() {
100995
101378
  return {
100996
- "Mod-Shift-s": () => this.editor.commands.toggleStrike()
101379
+ "Mod-Shift-x": () => this.editor.commands.toggleStrike(),
101380
+ "Mod-Shift-X": () => this.editor.commands.toggleStrike()
100997
101381
  };
100998
101382
  }
100999
101383
  });
@@ -118991,16 +119375,6 @@ const _SuperToolbar = class _SuperToolbar2 extends EventEmitter2 {
118991
119375
  if (!argument) return;
118992
119376
  item.onActivate({ zoom: argument });
118993
119377
  this.emit("superdoc-command", { item, argument });
118994
- const layers = this.superdoc.element?.querySelector(".layers");
118995
- if (!layers) return;
118996
- const isMobileDevice = typeof screen.orientation !== "undefined";
118997
- const isSmallScreen = window.matchMedia("(max-width: 834px)").matches;
118998
- if (isMobileDevice && isSmallScreen) {
118999
- layers.style.transformOrigin = "0 0";
119000
- layers.style.transform = `scale(${parseInt(argument, 10) / 100})`;
119001
- } else {
119002
- layers.style.zoom = parseInt(argument, 10) / 100;
119003
- }
119004
119378
  this.superdoc.superdocStore.activeZoom = parseInt(argument, 10);
119005
119379
  },
119006
119380
  /**
@@ -121271,6 +121645,19 @@ const _sfc_main$4 = {
121271
121645
  const emit = __emit;
121272
121646
  const overlayRect = ref$1(null);
121273
121647
  const tableMetadata = ref$1(null);
121648
+ const getZoom = () => {
121649
+ const editor = props.editor;
121650
+ if (editor && typeof editor.zoom === "number") {
121651
+ return editor.zoom;
121652
+ }
121653
+ if (editor?.presentationEditor && typeof editor.presentationEditor.zoom === "number") {
121654
+ return editor.presentationEditor.zoom;
121655
+ }
121656
+ console.warn(
121657
+ "[TableResizeOverlay] getZoom: Unable to retrieve zoom from editor instance, using fallback value of 1. This may indicate the editor is not fully initialized or is not a PresentationEditor instance. Table resize handles may be misaligned."
121658
+ );
121659
+ return 1;
121660
+ };
121274
121661
  const dragState = ref$1(null);
121275
121662
  const forcedCleanup = ref$1(false);
121276
121663
  let rafId = null;
@@ -121380,12 +121767,16 @@ const _sfc_main$4 = {
121380
121767
  }));
121381
121768
  }
121382
121769
  function getSegmentHandleStyle(boundary, segment) {
121770
+ const zoom = getZoom();
121771
+ const scaledX = boundary.x * zoom;
121772
+ const scaledY = segment.y != null ? segment.y * zoom : null;
121773
+ const scaledH = segment.h != null ? segment.h * zoom : null;
121383
121774
  return {
121384
121775
  position: "absolute",
121385
- left: `${boundary.x}px`,
121386
- top: segment.y != null ? `${segment.y}px` : "0",
121776
+ left: `${scaledX}px`,
121777
+ top: scaledY != null ? `${scaledY}px` : "0",
121387
121778
  width: `${RESIZE_HANDLE_WIDTH_PX}px`,
121388
- height: segment.h != null ? `${segment.h}px` : "100%",
121779
+ height: scaledH != null ? `${scaledH}px` : "100%",
121389
121780
  transform: `translateX(-${RESIZE_HANDLE_OFFSET_PX}px)`,
121390
121781
  cursor: "col-resize",
121391
121782
  pointerEvents: "auto"
@@ -121395,7 +121786,8 @@ const _sfc_main$4 = {
121395
121786
  if (!dragState.value || !tableMetadata.value) return { display: "none" };
121396
121787
  const initialBoundary = resizableBoundaries.value[dragState.value.resizableBoundaryIndex];
121397
121788
  if (!initialBoundary) return { display: "none" };
121398
- const newX = initialBoundary.x + dragState.value.constrainedDelta;
121789
+ const zoom = getZoom();
121790
+ const newX = (initialBoundary.x + dragState.value.constrainedDelta) * zoom;
121399
121791
  return {
121400
121792
  position: "absolute",
121401
121793
  left: `${newX}px`,
@@ -121523,7 +121915,9 @@ const _sfc_main$4 = {
121523
121915
  }
121524
121916
  const mouseMoveThrottle = throttle2((event) => {
121525
121917
  if (isUnmounted || !dragState.value) return;
121526
- const delta = event.clientX - dragState.value.initialX;
121918
+ const zoom = getZoom();
121919
+ const screenDelta = event.clientX - dragState.value.initialX;
121920
+ const delta = screenDelta / zoom;
121527
121921
  const minDelta = -(dragState.value.leftColumn.width - dragState.value.leftColumn.minWidth);
121528
121922
  let maxDelta;
121529
121923
  if (dragState.value.isRightEdge) {
@@ -121534,7 +121928,7 @@ const _sfc_main$4 = {
121534
121928
  const tableLeftInPage = tableRect.left - pageRect.left;
121535
121929
  const rightMargin = tableLeftInPage;
121536
121930
  const maxRightPosition = pageRect.right - rightMargin;
121537
- const availableSpace = maxRightPosition - tableRect.right;
121931
+ const availableSpace = (maxRightPosition - tableRect.right) / zoom;
121538
121932
  maxDelta = Math.max(0, availableSpace);
121539
121933
  } else {
121540
121934
  maxDelta = Infinity;
@@ -121770,7 +122164,7 @@ const _sfc_main$4 = {
121770
122164
  };
121771
122165
  }
121772
122166
  };
121773
- const TableResizeOverlay = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-2fdf7836"]]);
122167
+ const TableResizeOverlay = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-814384b6"]]);
121774
122168
  const _hoisted_1$2 = ["data-handle-position", "onMousedown"];
121775
122169
  const OVERLAY_EXPANSION_PX = 2e3;
121776
122170
  const RESIZE_HANDLE_SIZE_PX = 12;
@@ -122204,6 +122598,8 @@ const _sfc_main$3 = {
122204
122598
  }
122205
122599
  };
122206
122600
  const ImageResizeOverlay = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-e66ec7bb"]]);
122601
+ const LINK_CLICK_DEBOUNCE_MS = 300;
122602
+ const CURSOR_UPDATE_TIMEOUT_MS = 10;
122207
122603
  const _sfc_main$2 = {
122208
122604
  __name: "LinkClickHandler",
122209
122605
  props: {
@@ -122226,7 +122622,15 @@ const _sfc_main$2 = {
122226
122622
  },
122227
122623
  setup(__props) {
122228
122624
  const props = __props;
122625
+ let lastLinkClickTime = 0;
122229
122626
  const handleLinkClick = (event) => {
122627
+ const detail = event?.detail ?? {};
122628
+ const linkElement = detail.element;
122629
+ const now = Date.now();
122630
+ if (now - lastLinkClickTime < LINK_CLICK_DEBOUNCE_MS) {
122631
+ return;
122632
+ }
122633
+ lastLinkClickTime = now;
122230
122634
  if (props.popoverVisible) {
122231
122635
  props.closePopover();
122232
122636
  return;
@@ -122238,12 +122642,34 @@ const _sfc_main$2 = {
122238
122642
  if (!surface) {
122239
122643
  return;
122240
122644
  }
122241
- const detail = event?.detail ?? {};
122242
- moveCursorToMouseEvent(detail, props.editor);
122645
+ const pmStart = linkElement?.dataset?.pmStart;
122646
+ if (pmStart != null) {
122647
+ const pos = parseInt(pmStart, 10);
122648
+ const state2 = props.editor.state;
122649
+ const doc2 = state2.doc;
122650
+ if (!isNaN(pos) && pos >= 0 && pos <= doc2.content.size) {
122651
+ const tr = state2.tr.setSelection(TextSelection$1.create(doc2, pos));
122652
+ props.editor.dispatch(tr);
122653
+ } else {
122654
+ console.warn(`Invalid PM position from data-pm-start: ${pmStart}, falling back to coordinate-based positioning`);
122655
+ moveCursorToMouseEvent(detail, props.editor);
122656
+ }
122657
+ } else {
122658
+ moveCursorToMouseEvent(detail, props.editor);
122659
+ }
122243
122660
  setTimeout(() => {
122244
122661
  const currentState = props.editor.state;
122662
+ const $from = currentState.selection.$from;
122663
+ const linkMarkType = currentState.schema.marks.link;
122664
+ const nodeAfter = $from.nodeAfter;
122665
+ const nodeBefore = $from.nodeBefore;
122666
+ const marksOnNodeAfter = nodeAfter?.marks || [];
122667
+ const marksOnNodeBefore = nodeBefore?.marks || [];
122668
+ const linkOnNodeAfter = linkMarkType && marksOnNodeAfter.some((m2) => m2.type === linkMarkType);
122669
+ const linkOnNodeBefore = linkMarkType && marksOnNodeBefore.some((m2) => m2.type === linkMarkType);
122670
+ const hasLinkAdjacent = linkOnNodeAfter || linkOnNodeBefore;
122245
122671
  const hasLink = selectionHasNodeOrMark(currentState, "link", { requireEnds: true });
122246
- if (hasLink) {
122672
+ if (hasLink || hasLinkAdjacent) {
122247
122673
  const surfaceRect = surface.getBoundingClientRect();
122248
122674
  if (!surfaceRect) return;
122249
122675
  props.openPopover(
@@ -122259,7 +122685,7 @@ const _sfc_main$2 = {
122259
122685
  }
122260
122686
  );
122261
122687
  }
122262
- }, 10);
122688
+ }, CURSOR_UPDATE_TIMEOUT_MS);
122263
122689
  };
122264
122690
  let surfaceElement = null;
122265
122691
  onMounted(() => {
@@ -122305,7 +122731,7 @@ const _hoisted_3 = { class: "placeholder-title" };
122305
122731
  const DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
122306
122732
  const TABLE_RESIZE_HOVER_THRESHOLD = 8;
122307
122733
  const TABLE_RESIZE_THROTTLE_MS = 16;
122308
- const _sfc_main$1 = {
122734
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
122309
122735
  __name: "SuperEditor",
122310
122736
  props: {
122311
122737
  documentId: {
@@ -122374,6 +122800,24 @@ const _sfc_main$1 = {
122374
122800
  imageElement: null,
122375
122801
  blockId: null
122376
122802
  });
122803
+ const selectedImageState = reactive({
122804
+ element: null,
122805
+ blockId: null,
122806
+ pmStart: null
122807
+ });
122808
+ const getEditorZoom = () => {
122809
+ const active = activeEditor.value;
122810
+ if (active && typeof active.zoom === "number") {
122811
+ return active.zoom;
122812
+ }
122813
+ if (active?.presentationEditor && typeof active.presentationEditor.zoom === "number") {
122814
+ return active.presentationEditor.zoom;
122815
+ }
122816
+ console.warn(
122817
+ "[SuperEditor] getEditorZoom: Unable to retrieve zoom from editor instance, using fallback value of 1. This may indicate the editor is not fully initialized or is not a PresentationEditor instance."
122818
+ );
122819
+ return 1;
122820
+ };
122377
122821
  let lastUpdateTableResizeTimestamp = 0;
122378
122822
  const isNearColumnBoundary = (event, tableElement) => {
122379
122823
  if (!event || typeof event.clientX !== "number" || typeof event.clientY !== "number") {
@@ -122389,13 +122833,26 @@ const _sfc_main$1 = {
122389
122833
  try {
122390
122834
  const metadata = JSON.parse(boundariesAttr);
122391
122835
  if (!metadata.columns || !Array.isArray(metadata.columns)) return false;
122836
+ const zoom = getEditorZoom();
122392
122837
  const tableRect = tableElement.getBoundingClientRect();
122393
- const mouseX = event.clientX - tableRect.left;
122394
- const mouseY = event.clientY - tableRect.top;
122838
+ const mouseXScreen = event.clientX - tableRect.left;
122839
+ const mouseYScreen = event.clientY - tableRect.top;
122395
122840
  for (let i2 = 0; i2 < metadata.columns.length; i2++) {
122396
122841
  const col = metadata.columns[i2];
122397
- const boundaryX = col.x + col.w;
122398
- if (Math.abs(mouseX - boundaryX) <= TABLE_RESIZE_HOVER_THRESHOLD) {
122842
+ if (!col || typeof col !== "object") {
122843
+ console.warn(`[isNearColumnBoundary] Invalid column at index ${i2}: not an object`, col);
122844
+ continue;
122845
+ }
122846
+ if (typeof col.x !== "number" || !Number.isFinite(col.x)) {
122847
+ console.warn(`[isNearColumnBoundary] Invalid column.x at index ${i2}:`, col.x);
122848
+ continue;
122849
+ }
122850
+ if (typeof col.w !== "number" || !Number.isFinite(col.w) || col.w <= 0) {
122851
+ console.warn(`[isNearColumnBoundary] Invalid column.w at index ${i2}:`, col.w);
122852
+ continue;
122853
+ }
122854
+ const boundaryXScreen = (col.x + col.w) * zoom;
122855
+ if (Math.abs(mouseXScreen - boundaryXScreen) <= TABLE_RESIZE_HOVER_THRESHOLD) {
122399
122856
  const segmentColIndex = i2 + 1;
122400
122857
  const segments = metadata.segments?.[segmentColIndex];
122401
122858
  if (!segments || segments.length === 0) {
@@ -122403,15 +122860,15 @@ const _sfc_main$1 = {
122403
122860
  continue;
122404
122861
  }
122405
122862
  for (const seg of segments) {
122406
- const segTop = seg.y || 0;
122407
- const segBottom = seg.h != null ? segTop + seg.h : tableRect.height;
122408
- if (mouseY >= segTop && mouseY <= segBottom) {
122863
+ const segTopScreen = (seg.y || 0) * zoom;
122864
+ const segBottomScreen = seg.h != null ? segTopScreen + seg.h * zoom : tableRect.height;
122865
+ if (mouseYScreen >= segTopScreen && mouseYScreen <= segBottomScreen) {
122409
122866
  return true;
122410
122867
  }
122411
122868
  }
122412
122869
  }
122413
122870
  }
122414
- if (Math.abs(mouseX) <= TABLE_RESIZE_HOVER_THRESHOLD) {
122871
+ if (Math.abs(mouseXScreen) <= TABLE_RESIZE_HOVER_THRESHOLD) {
122415
122872
  return true;
122416
122873
  }
122417
122874
  return false;
@@ -122475,6 +122932,27 @@ const _sfc_main$1 = {
122475
122932
  imageResizeState.imageElement = null;
122476
122933
  imageResizeState.blockId = null;
122477
122934
  };
122935
+ const clearSelectedImage = () => {
122936
+ if (selectedImageState.element?.classList?.contains("superdoc-image-selected")) {
122937
+ selectedImageState.element.classList.remove("superdoc-image-selected");
122938
+ }
122939
+ selectedImageState.element = null;
122940
+ selectedImageState.blockId = null;
122941
+ selectedImageState.pmStart = null;
122942
+ };
122943
+ const setSelectedImage = (element, blockId, pmStart) => {
122944
+ if (selectedImageState.element && selectedImageState.element !== element) {
122945
+ selectedImageState.element.classList.remove("superdoc-image-selected");
122946
+ }
122947
+ if (element && element.classList) {
122948
+ element.classList.add("superdoc-image-selected");
122949
+ selectedImageState.element = element;
122950
+ selectedImageState.blockId = blockId ?? null;
122951
+ selectedImageState.pmStart = typeof pmStart === "number" ? pmStart : null;
122952
+ } else {
122953
+ clearSelectedImage();
122954
+ }
122955
+ };
122478
122956
  const handleOverlayUpdates = (event) => {
122479
122957
  updateTableResizeOverlay(event);
122480
122958
  updateImageResizeOverlay(event);
@@ -122565,6 +123043,7 @@ const _sfc_main$1 = {
122565
123043
  const initEditor = async ({ content, media = {}, mediaFiles = {}, fonts = {} } = {}) => {
122566
123044
  const { editorCtor, ...editorOptions } = props.options || {};
122567
123045
  const EditorCtor = editorCtor ?? Editor;
123046
+ clearSelectedImage();
122568
123047
  editor.value = new EditorCtor({
122569
123048
  mode: "docx",
122570
123049
  element: editorElem.value,
@@ -122581,17 +123060,19 @@ const _sfc_main$1 = {
122581
123060
  editor: activeEditor.value,
122582
123061
  presentationEditor: editor.value instanceof PresentationEditor ? editor.value : null
122583
123062
  });
122584
- editor.value.on("paginationUpdate", () => {
122585
- const base2 = activeEditor.value;
122586
- if (isHeadless(base2)) return;
122587
- const paginationTarget = editor.value?.editor ? { value: base2 } : editor;
122588
- adjustPaginationBreaks(editorElem, paginationTarget);
122589
- });
122590
123063
  if (editor.value instanceof PresentationEditor) {
122591
- editor.value.on("layoutUpdated", () => {
123064
+ const presentationEditor = editor.value;
123065
+ presentationEditor.on("imageSelected", ({ element, blockId, pmStart }) => {
123066
+ setSelectedImage(element, blockId ?? null, pmStart);
123067
+ });
123068
+ presentationEditor.on("imageDeselected", () => {
123069
+ clearSelectedImage();
123070
+ });
123071
+ presentationEditor.on("layoutUpdated", () => {
122592
123072
  if (imageResizeState.visible && imageResizeState.blockId) {
123073
+ const escapedBlockId = CSS.escape(imageResizeState.blockId);
122593
123074
  const newElement = editorElem.value?.querySelector(
122594
- `.superdoc-image-fragment[data-sd-block-id="${imageResizeState.blockId}"]`
123075
+ `.superdoc-image-fragment[data-sd-block-id="${escapedBlockId}"]`
122595
123076
  );
122596
123077
  if (newElement) {
122597
123078
  imageResizeState.imageElement = newElement;
@@ -122601,8 +123082,33 @@ const _sfc_main$1 = {
122601
123082
  imageResizeState.blockId = null;
122602
123083
  }
122603
123084
  }
123085
+ if (selectedImageState.blockId) {
123086
+ const escapedBlockId = CSS.escape(selectedImageState.blockId);
123087
+ const refreshed = editorElem.value?.querySelector(
123088
+ `.superdoc-image-fragment[data-sd-block-id="${escapedBlockId}"]`
123089
+ );
123090
+ if (refreshed) {
123091
+ setSelectedImage(refreshed, selectedImageState.blockId, selectedImageState.pmStart);
123092
+ } else {
123093
+ if (selectedImageState.pmStart != null) {
123094
+ const pmSelector = `.superdoc-image-fragment[data-pm-start="${selectedImageState.pmStart}"], .superdoc-inline-image[data-pm-start="${selectedImageState.pmStart}"]`;
123095
+ const pmElement = editorElem.value?.querySelector(pmSelector);
123096
+ if (pmElement) {
123097
+ setSelectedImage(pmElement, selectedImageState.blockId, selectedImageState.pmStart);
123098
+ return;
123099
+ }
123100
+ }
123101
+ clearSelectedImage();
123102
+ }
123103
+ }
122604
123104
  });
122605
123105
  }
123106
+ editor.value.on("paginationUpdate", () => {
123107
+ const base2 = activeEditor.value;
123108
+ if (isHeadless(base2)) return;
123109
+ const paginationTarget = editor.value?.editor ? { value: base2 } : editor;
123110
+ adjustPaginationBreaks(editorElem, paginationTarget);
123111
+ });
122606
123112
  editor.value.on("collaborationReady", () => {
122607
123113
  setTimeout(() => {
122608
123114
  editorReady.value = true;
@@ -122669,6 +123175,7 @@ const _sfc_main$1 = {
122669
123175
  };
122670
123176
  onBeforeUnmount(() => {
122671
123177
  stopPolling();
123178
+ clearSelectedImage();
122672
123179
  editor.value?.destroy();
122673
123180
  editor.value = null;
122674
123181
  });
@@ -122783,8 +123290,8 @@ const _sfc_main$1 = {
122783
123290
  ]);
122784
123291
  };
122785
123292
  }
122786
- };
122787
- const SuperEditor = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-6cfd3305"]]);
123293
+ });
123294
+ const SuperEditor = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-a935d3e2"]]);
122788
123295
  const _hoisted_1 = ["innerHTML"];
122789
123296
  const _sfc_main = {
122790
123297
  __name: "SuperInput",