@harbour-enterprises/superdoc 1.0.0-beta.79 → 1.0.0-beta.80

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 (29) hide show
  1. package/dist/chunks/{PdfViewer-DLPMtoVD.es.js → PdfViewer-Cl8-bF2d.es.js} +1 -1
  2. package/dist/chunks/{PdfViewer-Dn5MoKhX.cjs → PdfViewer-otVXTOCF.cjs} +1 -1
  3. package/dist/chunks/{index-X_javC2m.es.js → index-Da8gsiup.es.js} +3 -3
  4. package/dist/chunks/{index-DLvHMUJi.cjs → index-DvRDR0Q1.cjs} +3 -3
  5. package/dist/chunks/{index-lIKPN00V-Bn76jN3g.es.js → index-dhmURjT9-C4FbtHG8.es.js} +1 -1
  6. package/dist/chunks/{index-lIKPN00V-dYKYHttm.cjs → index-dhmURjT9-eBXRY_y8.cjs} +1 -1
  7. package/dist/chunks/{super-editor.es-37HP4-SX.cjs → super-editor.es-BPfJzTNn.cjs} +50 -8
  8. package/dist/chunks/{super-editor.es-eQ24GmlY.es.js → super-editor.es-Bo6Jt_tq.es.js} +50 -8
  9. package/dist/style.css +6 -6
  10. package/dist/super-editor/ai-writer.es.js +2 -2
  11. package/dist/super-editor/chunks/{converter-DqebDh5Y.js → converter-Cww1mCyd.js} +1 -1
  12. package/dist/super-editor/chunks/{docx-zipper-DNBbqIUN.js → docx-zipper-BlOp_CYx.js} +1 -1
  13. package/dist/super-editor/chunks/{editor-BHqPITqs.js → editor-D3MjMYeX.js} +38 -8
  14. package/dist/super-editor/chunks/{index-lIKPN00V.js → index-dhmURjT9.js} +1 -1
  15. package/dist/super-editor/chunks/{toolbar-gYGrkDSx.js → toolbar-CuJJlHlv.js} +2 -2
  16. package/dist/super-editor/converter.es.js +1 -1
  17. package/dist/super-editor/docx-zipper.es.js +2 -2
  18. package/dist/super-editor/editor.es.js +3 -3
  19. package/dist/super-editor/file-zipper.es.js +1 -1
  20. package/dist/super-editor/style.css +6 -6
  21. package/dist/super-editor/super-editor.es.js +19 -7
  22. package/dist/super-editor/toolbar.es.js +2 -2
  23. package/dist/super-editor.cjs +1 -1
  24. package/dist/super-editor.es.js +1 -1
  25. package/dist/superdoc.cjs +2 -2
  26. package/dist/superdoc.es.js +2 -2
  27. package/dist/superdoc.umd.js +52 -10
  28. package/dist/superdoc.umd.js.map +1 -1
  29. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { y as defineComponent, z as h, O as Transition, a0 as process$1, J as watchEffect, a as computed, r as ref, j as onMounted, W as onUnmounted, b as createElementBlock, o as openBlock, f as createBaseVNode, e as createCommentVNode, u as createVNode, v as unref } from "./vue-Dysv_7z5.es.js";
2
- import { d as derived, c, a as cB, f as fadeInTransition, b as cM, N as NBaseLoading, w as warnOnce, u as useConfig, e as useTheme, p as pxfy, g as createKey, h as useThemeClass, i as useCompitable, _ as _export_sfc, j as useSuperdocStore, s as storeToRefs, k as useSelection } from "./index-X_javC2m.es.js";
2
+ import { d as derived, c, a as cB, f as fadeInTransition, b as cM, N as NBaseLoading, w as warnOnce, u as useConfig, e as useTheme, p as pxfy, g as createKey, h as useThemeClass, i as useCompitable, _ as _export_sfc, j as useSuperdocStore, s as storeToRefs, k as useSelection } from "./index-Da8gsiup.es.js";
3
3
  function self(vars) {
4
4
  const {
5
5
  opacityDisabled,
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const vue = require("./vue-jWLMl8Ts.cjs");
4
- const superdoc = require("./index-DLvHMUJi.cjs");
4
+ const superdoc = require("./index-DvRDR0Q1.cjs");
5
5
  function self(vars) {
6
6
  const {
7
7
  opacityDisabled,
@@ -1,4 +1,4 @@
1
- import { q as index, C as CommentsPluginKey, h as TrackChangesBasePluginKey, E as Editor, n as getRichTextExtensions, f as SuperInput, P as PresentationEditor, e as SuperEditor, A as AIWriter, g as SuperToolbar, i as createZip } from "./super-editor.es-eQ24GmlY.es.js";
1
+ import { q as index, C as CommentsPluginKey, h as TrackChangesBasePluginKey, E as Editor, n as getRichTextExtensions, f as SuperInput, P as PresentationEditor, e as SuperEditor, A as AIWriter, g as SuperToolbar, i as createZip } from "./super-editor.es-Bo6Jt_tq.es.js";
2
2
  import { B as BlankDOCX } from "./blank-docx-ABm6XYAA.es.js";
3
3
  import { E as EventEmitter } from "./eventemitter3-CcXAdeql.es.js";
4
4
  import { HocuspocusProvider, HocuspocusProviderWebsocket } from "@hocuspocus/provider";
@@ -17251,7 +17251,7 @@ const _sfc_main = {
17251
17251
  __name: "SuperDoc",
17252
17252
  emits: ["selection-update"],
17253
17253
  setup(__props, { emit: __emit }) {
17254
- const PdfViewer = defineAsyncComponent(() => import("./PdfViewer-DLPMtoVD.es.js"));
17254
+ const PdfViewer = defineAsyncComponent(() => import("./PdfViewer-Cl8-bF2d.es.js"));
17255
17255
  const superdocStore = useSuperdocStore();
17256
17256
  const commentsStore = useCommentsStore();
17257
17257
  const {
@@ -18140,7 +18140,7 @@ class SuperDoc extends EventEmitter {
18140
18140
  this.config.colors = shuffleArray(this.config.colors);
18141
18141
  this.userColorMap = /* @__PURE__ */ new Map();
18142
18142
  this.colorIndex = 0;
18143
- this.version = "1.0.0-beta.79";
18143
+ this.version = "1.0.0-beta.80";
18144
18144
  this.#log("🦋 [superdoc] Using SuperDoc version:", this.version);
18145
18145
  this.superdocId = config.superdocId || v4();
18146
18146
  this.colors = this.config.colors;
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- const superEditor_es = require("./super-editor.es-37HP4-SX.cjs");
2
+ const superEditor_es = require("./super-editor.es-BPfJzTNn.cjs");
3
3
  const blankDocx = require("./blank-docx-DfW3Eeh2.cjs");
4
4
  const eventemitter3 = require("./eventemitter3-DQmQUge-.cjs");
5
5
  const provider = require("@hocuspocus/provider");
@@ -17268,7 +17268,7 @@ const _sfc_main = {
17268
17268
  __name: "SuperDoc",
17269
17269
  emits: ["selection-update"],
17270
17270
  setup(__props, { emit: __emit }) {
17271
- const PdfViewer = vue.defineAsyncComponent(() => Promise.resolve().then(() => require("./PdfViewer-Dn5MoKhX.cjs")));
17271
+ const PdfViewer = vue.defineAsyncComponent(() => Promise.resolve().then(() => require("./PdfViewer-otVXTOCF.cjs")));
17272
17272
  const superdocStore = useSuperdocStore();
17273
17273
  const commentsStore = useCommentsStore();
17274
17274
  const {
@@ -18157,7 +18157,7 @@ class SuperDoc extends eventemitter3.EventEmitter {
18157
18157
  this.config.colors = shuffleArray(this.config.colors);
18158
18158
  this.userColorMap = /* @__PURE__ */ new Map();
18159
18159
  this.colorIndex = 0;
18160
- this.version = "1.0.0-beta.79";
18160
+ this.version = "1.0.0-beta.80";
18161
18161
  this.#log("🦋 [superdoc] Using SuperDoc version:", this.version);
18162
18162
  this.superdocId = config.superdocId || uuid.v4();
18163
18163
  this.colors = this.config.colors;
@@ -1,4 +1,4 @@
1
- import { s as getDefaultExportFromCjs$2 } from "./super-editor.es-eQ24GmlY.es.js";
1
+ import { s as getDefaultExportFromCjs$2 } from "./super-editor.es-Bo6Jt_tq.es.js";
2
2
  import { V as VFile } from "./index-CvBqQJbG-CvBqQJbG.es.js";
3
3
  function bail(error) {
4
4
  if (error) {
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const superEditor_es = require("./super-editor.es-37HP4-SX.cjs");
3
+ const superEditor_es = require("./super-editor.es-BPfJzTNn.cjs");
4
4
  const indexCvBqQJbG = require("./index-CvBqQJbG-Dwm0THD7.cjs");
5
5
  function bail(error) {
6
6
  if (error) {
@@ -42326,7 +42326,7 @@ const _SuperConverter = class _SuperConverter2 {
42326
42326
  static getStoredSuperdocVersion(docx) {
42327
42327
  return _SuperConverter2.getStoredCustomProperty(docx, "SuperdocVersion");
42328
42328
  }
42329
- static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "1.0.0-beta.79") {
42329
+ static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "1.0.0-beta.80") {
42330
42330
  return _SuperConverter2.setStoredCustomProperty(docx, "SuperdocVersion", version2, false);
42331
42331
  }
42332
42332
  /**
@@ -59515,7 +59515,7 @@ const isHeadless = (editor) => {
59515
59515
  const shouldSkipNodeView = (editor) => {
59516
59516
  return isHeadless(editor);
59517
59517
  };
59518
- const summaryVersion = "1.0.0-beta.79";
59518
+ const summaryVersion = "1.0.0-beta.80";
59519
59519
  const nodeKeys = ["group", "content", "marks", "inline", "atom", "defining", "code", "tableRole", "summary"];
59520
59520
  const markKeys = ["group", "inclusive", "excludes", "spanning", "code"];
59521
59521
  function mapAttributes(attrs) {
@@ -60304,7 +60304,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
60304
60304
  { default: remarkStringify },
60305
60305
  { default: remarkGfm }
60306
60306
  ] = await Promise.all([
60307
- Promise.resolve().then(() => require("./index-lIKPN00V-dYKYHttm.cjs")),
60307
+ Promise.resolve().then(() => require("./index-dhmURjT9-eBXRY_y8.cjs")),
60308
60308
  Promise.resolve().then(() => require("./index-DRCvimau-H4Ck3S9a.cjs")),
60309
60309
  Promise.resolve().then(() => require("./index-C_x_N6Uh-Db3CUJMX.cjs")),
60310
60310
  Promise.resolve().then(() => require("./index-D_sWOSiG-BtDZzJ6I.cjs")),
@@ -60509,7 +60509,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
60509
60509
  * Process collaboration migrations
60510
60510
  */
60511
60511
  processCollaborationMigrations() {
60512
- console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.79");
60512
+ console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.80");
60513
60513
  if (!this.options.ydoc) return;
60514
60514
  const metaMap = this.options.ydoc.getMap("meta");
60515
60515
  let docVersion = metaMap.get("version");
@@ -72207,6 +72207,9 @@ const MAX_HREF_LENGTH = 2048;
72207
72207
  const SAFE_ANCHOR_PATTERN = /^[A-Za-z0-9._-]+$/;
72208
72208
  const MAX_DATA_URL_LENGTH = 10 * 1024 * 1024;
72209
72209
  const VALID_IMAGE_DATA_URL = /^data:image\/(png|jpeg|jpg|gif|svg\+xml|webp|bmp|ico|tiff?);base64,/i;
72210
+ const MAX_RESIZE_MULTIPLIER = 3;
72211
+ const FALLBACK_MAX_DIMENSION = 1e3;
72212
+ const MIN_IMAGE_DIMENSION = 20;
72210
72213
  const AMBIGUOUS_LINK_PATTERNS = /^(click here|read more|more|link|here|this|download|view)$/i;
72211
72214
  const TRACK_CHANGE_BASE_CLASS = {
72212
72215
  insert: "track-insert-dec",
@@ -74153,14 +74156,25 @@ const _DomPainter = class _DomPainter2 {
74153
74156
  * - Only allows safe image MIME types (png, jpeg, gif, etc.) with base64 encoding
74154
74157
  * - Non-data URLs are sanitized through sanitizeUrl to prevent XSS
74155
74158
  *
74159
+ * METADATA ATTRIBUTE:
74160
+ * - Adds `data-image-metadata` attribute to enable interactive resizing via ImageResizeOverlay
74161
+ * - Metadata includes: originalWidth, originalHeight, aspectRatio, min/max dimensions
74162
+ * - Only added when run.width > 0 && run.height > 0 to prevent invalid metadata
74163
+ * - Max dimensions: 3x original size or 1000px (whichever is larger)
74164
+ * - Min dimensions: 20px to ensure visibility and interactivity
74165
+ *
74156
74166
  * @param run - The ImageRun to render containing image source, dimensions, and spacing
74157
74167
  * @returns HTMLElement (img) or null if src is missing or invalid
74158
74168
  *
74159
74169
  * @example
74160
74170
  * ```typescript
74161
- * // Valid data URL
74171
+ * // Valid data URL with metadata
74162
74172
  * renderImageRun({ kind: 'image', src: 'data:image/png;base64,iVBORw...', width: 100, height: 100 })
74163
- * // Returns: <img> element
74173
+ * // Returns: <img> element with data-image-metadata attribute
74174
+ *
74175
+ * // Invalid dimensions - no metadata
74176
+ * renderImageRun({ kind: 'image', src: 'data:image/png;base64,iVBORw...', width: 0, height: 0 })
74177
+ * // Returns: <img> element WITHOUT data-image-metadata attribute
74164
74178
  *
74165
74179
  * // Invalid MIME type
74166
74180
  * renderImageRun({ kind: 'image', src: 'data:text/html;base64,PHNjcmlwdD4...', width: 100, height: 100 })
@@ -74168,7 +74182,7 @@ const _DomPainter = class _DomPainter2 {
74168
74182
  *
74169
74183
  * // HTTP URL
74170
74184
  * renderImageRun({ kind: 'image', src: 'https://example.com/image.png', width: 100, height: 100 })
74171
- * // Returns: <img> element (after sanitization)
74185
+ * // Returns: <img> element (after sanitization) with data-image-metadata attribute
74172
74186
  * ```
74173
74187
  */
74174
74188
  renderImageRun(run2) {
@@ -74196,6 +74210,22 @@ const _DomPainter = class _DomPainter2 {
74196
74210
  }
74197
74211
  img.width = run2.width;
74198
74212
  img.height = run2.height;
74213
+ if (run2.width > 0 && run2.height > 0) {
74214
+ const aspectRatio = run2.width / run2.height;
74215
+ const inlineImageMetadata = {
74216
+ originalWidth: run2.width,
74217
+ originalHeight: run2.height,
74218
+ // Max dimensions: MAX_RESIZE_MULTIPLIER x original size or FALLBACK_MAX_DIMENSION, whichever is larger
74219
+ // This provides generous constraints while preventing excessive scaling
74220
+ maxWidth: Math.max(run2.width * MAX_RESIZE_MULTIPLIER, FALLBACK_MAX_DIMENSION),
74221
+ maxHeight: Math.max(run2.height * MAX_RESIZE_MULTIPLIER, FALLBACK_MAX_DIMENSION),
74222
+ aspectRatio,
74223
+ // Min dimensions: MIN_IMAGE_DIMENSION to ensure images remain visible and interactive
74224
+ minWidth: MIN_IMAGE_DIMENSION,
74225
+ minHeight: MIN_IMAGE_DIMENSION
74226
+ };
74227
+ img.setAttribute("data-image-metadata", JSON.stringify(inlineImageMetadata));
74228
+ }
74199
74229
  img.alt = run2.alt ?? "";
74200
74230
  if (run2.title) {
74201
74231
  img.title = run2.title;
@@ -124991,6 +125021,12 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
124991
125021
  };
124992
125022
  const updateImageResizeOverlay = (event) => {
124993
125023
  if (!editorElem.value) return;
125024
+ if (!(event.target instanceof Element)) {
125025
+ imageResizeState.visible = false;
125026
+ imageResizeState.imageElement = null;
125027
+ imageResizeState.blockId = null;
125028
+ return;
125029
+ }
124994
125030
  let target = event.target;
124995
125031
  while (target && target !== document.body) {
124996
125032
  if (target.classList?.contains("superdoc-image-resize-overlay") || target.closest?.(".superdoc-image-resize-overlay")) {
@@ -125002,6 +125038,12 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
125002
125038
  imageResizeState.blockId = target.getAttribute("data-sd-block-id");
125003
125039
  return;
125004
125040
  }
125041
+ if (target.classList?.contains("superdoc-inline-image") && target.hasAttribute("data-image-metadata")) {
125042
+ imageResizeState.visible = true;
125043
+ imageResizeState.imageElement = target;
125044
+ imageResizeState.blockId = target.getAttribute("data-pm-start");
125045
+ return;
125046
+ }
125005
125047
  target = target.parentElement;
125006
125048
  }
125007
125049
  imageResizeState.visible = false;
@@ -125381,7 +125423,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
125381
125423
  };
125382
125424
  }
125383
125425
  });
125384
- const SuperEditor = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-cb3fe66f"]]);
125426
+ const SuperEditor = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-209a1e8b"]]);
125385
125427
  const _hoisted_1 = ["innerHTML"];
125386
125428
  const _sfc_main = {
125387
125429
  __name: "SuperInput",
@@ -42309,7 +42309,7 @@ const _SuperConverter = class _SuperConverter2 {
42309
42309
  static getStoredSuperdocVersion(docx) {
42310
42310
  return _SuperConverter2.getStoredCustomProperty(docx, "SuperdocVersion");
42311
42311
  }
42312
- static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "1.0.0-beta.79") {
42312
+ static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "1.0.0-beta.80") {
42313
42313
  return _SuperConverter2.setStoredCustomProperty(docx, "SuperdocVersion", version2, false);
42314
42314
  }
42315
42315
  /**
@@ -59498,7 +59498,7 @@ const isHeadless = (editor) => {
59498
59498
  const shouldSkipNodeView = (editor) => {
59499
59499
  return isHeadless(editor);
59500
59500
  };
59501
- const summaryVersion = "1.0.0-beta.79";
59501
+ const summaryVersion = "1.0.0-beta.80";
59502
59502
  const nodeKeys = ["group", "content", "marks", "inline", "atom", "defining", "code", "tableRole", "summary"];
59503
59503
  const markKeys = ["group", "inclusive", "excludes", "spanning", "code"];
59504
59504
  function mapAttributes(attrs) {
@@ -60287,7 +60287,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
60287
60287
  { default: remarkStringify },
60288
60288
  { default: remarkGfm }
60289
60289
  ] = await Promise.all([
60290
- import("./index-lIKPN00V-Bn76jN3g.es.js"),
60290
+ import("./index-dhmURjT9-C4FbtHG8.es.js"),
60291
60291
  import("./index-DRCvimau-Cw339678.es.js"),
60292
60292
  import("./index-C_x_N6Uh-DJn8hIEt.es.js"),
60293
60293
  import("./index-D_sWOSiG-DE96TaT5.es.js"),
@@ -60492,7 +60492,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
60492
60492
  * Process collaboration migrations
60493
60493
  */
60494
60494
  processCollaborationMigrations() {
60495
- console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.79");
60495
+ console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.80");
60496
60496
  if (!this.options.ydoc) return;
60497
60497
  const metaMap = this.options.ydoc.getMap("meta");
60498
60498
  let docVersion = metaMap.get("version");
@@ -72190,6 +72190,9 @@ const MAX_HREF_LENGTH = 2048;
72190
72190
  const SAFE_ANCHOR_PATTERN = /^[A-Za-z0-9._-]+$/;
72191
72191
  const MAX_DATA_URL_LENGTH = 10 * 1024 * 1024;
72192
72192
  const VALID_IMAGE_DATA_URL = /^data:image\/(png|jpeg|jpg|gif|svg\+xml|webp|bmp|ico|tiff?);base64,/i;
72193
+ const MAX_RESIZE_MULTIPLIER = 3;
72194
+ const FALLBACK_MAX_DIMENSION = 1e3;
72195
+ const MIN_IMAGE_DIMENSION = 20;
72193
72196
  const AMBIGUOUS_LINK_PATTERNS = /^(click here|read more|more|link|here|this|download|view)$/i;
72194
72197
  const TRACK_CHANGE_BASE_CLASS = {
72195
72198
  insert: "track-insert-dec",
@@ -74136,14 +74139,25 @@ const _DomPainter = class _DomPainter2 {
74136
74139
  * - Only allows safe image MIME types (png, jpeg, gif, etc.) with base64 encoding
74137
74140
  * - Non-data URLs are sanitized through sanitizeUrl to prevent XSS
74138
74141
  *
74142
+ * METADATA ATTRIBUTE:
74143
+ * - Adds `data-image-metadata` attribute to enable interactive resizing via ImageResizeOverlay
74144
+ * - Metadata includes: originalWidth, originalHeight, aspectRatio, min/max dimensions
74145
+ * - Only added when run.width > 0 && run.height > 0 to prevent invalid metadata
74146
+ * - Max dimensions: 3x original size or 1000px (whichever is larger)
74147
+ * - Min dimensions: 20px to ensure visibility and interactivity
74148
+ *
74139
74149
  * @param run - The ImageRun to render containing image source, dimensions, and spacing
74140
74150
  * @returns HTMLElement (img) or null if src is missing or invalid
74141
74151
  *
74142
74152
  * @example
74143
74153
  * ```typescript
74144
- * // Valid data URL
74154
+ * // Valid data URL with metadata
74145
74155
  * renderImageRun({ kind: 'image', src: 'data:image/png;base64,iVBORw...', width: 100, height: 100 })
74146
- * // Returns: <img> element
74156
+ * // Returns: <img> element with data-image-metadata attribute
74157
+ *
74158
+ * // Invalid dimensions - no metadata
74159
+ * renderImageRun({ kind: 'image', src: 'data:image/png;base64,iVBORw...', width: 0, height: 0 })
74160
+ * // Returns: <img> element WITHOUT data-image-metadata attribute
74147
74161
  *
74148
74162
  * // Invalid MIME type
74149
74163
  * renderImageRun({ kind: 'image', src: 'data:text/html;base64,PHNjcmlwdD4...', width: 100, height: 100 })
@@ -74151,7 +74165,7 @@ const _DomPainter = class _DomPainter2 {
74151
74165
  *
74152
74166
  * // HTTP URL
74153
74167
  * renderImageRun({ kind: 'image', src: 'https://example.com/image.png', width: 100, height: 100 })
74154
- * // Returns: <img> element (after sanitization)
74168
+ * // Returns: <img> element (after sanitization) with data-image-metadata attribute
74155
74169
  * ```
74156
74170
  */
74157
74171
  renderImageRun(run2) {
@@ -74179,6 +74193,22 @@ const _DomPainter = class _DomPainter2 {
74179
74193
  }
74180
74194
  img.width = run2.width;
74181
74195
  img.height = run2.height;
74196
+ if (run2.width > 0 && run2.height > 0) {
74197
+ const aspectRatio = run2.width / run2.height;
74198
+ const inlineImageMetadata = {
74199
+ originalWidth: run2.width,
74200
+ originalHeight: run2.height,
74201
+ // Max dimensions: MAX_RESIZE_MULTIPLIER x original size or FALLBACK_MAX_DIMENSION, whichever is larger
74202
+ // This provides generous constraints while preventing excessive scaling
74203
+ maxWidth: Math.max(run2.width * MAX_RESIZE_MULTIPLIER, FALLBACK_MAX_DIMENSION),
74204
+ maxHeight: Math.max(run2.height * MAX_RESIZE_MULTIPLIER, FALLBACK_MAX_DIMENSION),
74205
+ aspectRatio,
74206
+ // Min dimensions: MIN_IMAGE_DIMENSION to ensure images remain visible and interactive
74207
+ minWidth: MIN_IMAGE_DIMENSION,
74208
+ minHeight: MIN_IMAGE_DIMENSION
74209
+ };
74210
+ img.setAttribute("data-image-metadata", JSON.stringify(inlineImageMetadata));
74211
+ }
74182
74212
  img.alt = run2.alt ?? "";
74183
74213
  if (run2.title) {
74184
74214
  img.title = run2.title;
@@ -124974,6 +125004,12 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
124974
125004
  };
124975
125005
  const updateImageResizeOverlay = (event) => {
124976
125006
  if (!editorElem.value) return;
125007
+ if (!(event.target instanceof Element)) {
125008
+ imageResizeState.visible = false;
125009
+ imageResizeState.imageElement = null;
125010
+ imageResizeState.blockId = null;
125011
+ return;
125012
+ }
124977
125013
  let target = event.target;
124978
125014
  while (target && target !== document.body) {
124979
125015
  if (target.classList?.contains("superdoc-image-resize-overlay") || target.closest?.(".superdoc-image-resize-overlay")) {
@@ -124985,6 +125021,12 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
124985
125021
  imageResizeState.blockId = target.getAttribute("data-sd-block-id");
124986
125022
  return;
124987
125023
  }
125024
+ if (target.classList?.contains("superdoc-inline-image") && target.hasAttribute("data-image-metadata")) {
125025
+ imageResizeState.visible = true;
125026
+ imageResizeState.imageElement = target;
125027
+ imageResizeState.blockId = target.getAttribute("data-pm-start");
125028
+ return;
125029
+ }
124988
125030
  target = target.parentElement;
124989
125031
  }
124990
125032
  imageResizeState.visible = false;
@@ -125364,7 +125406,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
125364
125406
  };
125365
125407
  }
125366
125408
  });
125367
- const SuperEditor = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-cb3fe66f"]]);
125409
+ const SuperEditor = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-209a1e8b"]]);
125368
125410
  const _hoisted_1 = ["innerHTML"];
125369
125411
  const _sfc_main = {
125370
125412
  __name: "SuperInput",
package/dist/style.css CHANGED
@@ -2330,10 +2330,10 @@ https://github.com/ProseMirror/prosemirror-tables/blob/master/demo/index.html
2330
2330
  box-shadow: 0 0 4px rgba(74, 144, 226, 0.5);
2331
2331
  }
2332
2332
 
2333
- .editor-element[data-v-cb3fe66f] {
2333
+ .editor-element[data-v-209a1e8b] {
2334
2334
  position: relative;
2335
2335
  }
2336
- .super-editor-container[data-v-cb3fe66f] {
2336
+ .super-editor-container[data-v-209a1e8b] {
2337
2337
  width: auto;
2338
2338
  height: auto;
2339
2339
  min-width: 8in;
@@ -2342,14 +2342,14 @@ https://github.com/ProseMirror/prosemirror-tables/blob/master/demo/index.html
2342
2342
  display: flex;
2343
2343
  flex-direction: column;
2344
2344
  }
2345
- .ruler[data-v-cb3fe66f] {
2345
+ .ruler[data-v-209a1e8b] {
2346
2346
  margin-bottom: 2px;
2347
2347
  }
2348
- .super-editor[data-v-cb3fe66f] {
2348
+ .super-editor[data-v-209a1e8b] {
2349
2349
  color: initial;
2350
2350
  overflow: hidden;
2351
2351
  }
2352
- .placeholder-editor[data-v-cb3fe66f] {
2352
+ .placeholder-editor[data-v-209a1e8b] {
2353
2353
  position: absolute;
2354
2354
  top: 0;
2355
2355
  left: 0;
@@ -2361,7 +2361,7 @@ https://github.com/ProseMirror/prosemirror-tables/blob/master/demo/index.html
2361
2361
  background-color: white;
2362
2362
  box-sizing: border-box;
2363
2363
  }
2364
- .placeholder-title[data-v-cb3fe66f] {
2364
+ .placeholder-title[data-v-209a1e8b] {
2365
2365
  display: flex;
2366
2366
  justify-content: center;
2367
2367
  margin-bottom: 40px;
@@ -1,6 +1,6 @@
1
1
  import { ref, onMounted, onUnmounted, computed, createElementBlock, openBlock, withModifiers, createElementVNode, withDirectives, unref, vModelText, createCommentVNode, nextTick } from "vue";
2
- import { T as TextSelection } from "./chunks/converter-DqebDh5Y.js";
3
- import { _ as _export_sfc } from "./chunks/editor-BHqPITqs.js";
2
+ import { T as TextSelection } from "./chunks/converter-Cww1mCyd.js";
3
+ import { _ as _export_sfc } from "./chunks/editor-D3MjMYeX.js";
4
4
  const DEFAULT_API_ENDPOINT = "https://sd-dev-express-gateway-i6xtm.ondigitalocean.app/insights";
5
5
  const SYSTEM_PROMPT = "You are an expert copywriter and you are immersed in a document editor. You are to provide document related text responses based on the user prompts. Only write what is asked for. Do not provide explanations. Try to keep placeholders as short as possible. Do not output your prompt. Your instructions are: ";
6
6
  async function baseInsightsFetch(payload, options = {}) {
@@ -42626,7 +42626,7 @@ const _SuperConverter = class _SuperConverter {
42626
42626
  static getStoredSuperdocVersion(docx) {
42627
42627
  return _SuperConverter.getStoredCustomProperty(docx, "SuperdocVersion");
42628
42628
  }
42629
- static setStoredSuperdocVersion(docx = this.convertedXml, version = "1.0.0-beta.79") {
42629
+ static setStoredSuperdocVersion(docx = this.convertedXml, version = "1.0.0-beta.80") {
42630
42630
  return _SuperConverter.setStoredCustomProperty(docx, "SuperdocVersion", version, false);
42631
42631
  }
42632
42632
  /**
@@ -1,4 +1,4 @@
1
- import { p as process$1, aJ as commonjsGlobal, B as Buffer, aK as getDefaultExportFromCjs, aL as getContentTypesFromXml, aM as xmljs } from "./converter-DqebDh5Y.js";
1
+ import { p as process$1, aJ as commonjsGlobal, B as Buffer, aK as getDefaultExportFromCjs, aL as getContentTypesFromXml, aM as xmljs } from "./converter-Cww1mCyd.js";
2
2
  function commonjsRequire(path) {
3
3
  throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
4
4
  }
@@ -12,8 +12,8 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
12
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, computeExpectedSectionType_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, applyDomCorrectionToRects_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, getPageOffsetX_fn, convertPageLocalToOverlayCoords_fn, computeDomCaretPageLocal_fn, normalizeClientPoint_fn, computeCaretLayoutRectGeometry_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 resolveRunProperties, at as encodeCSSFromPPr, au as twipsToPixels$2, 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-DqebDh5Y.js";
16
- import { D as DocxZipper } from "./docx-zipper-DNBbqIUN.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 resolveRunProperties, at as encodeCSSFromPPr, au as twipsToPixels$2, 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-Cww1mCyd.js";
16
+ import { D as DocxZipper } from "./docx-zipper-BlOp_CYx.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() {
@@ -13923,7 +13923,7 @@ const isHeadless = (editor) => {
13923
13923
  const shouldSkipNodeView = (editor) => {
13924
13924
  return isHeadless(editor);
13925
13925
  };
13926
- const summaryVersion = "1.0.0-beta.79";
13926
+ const summaryVersion = "1.0.0-beta.80";
13927
13927
  const nodeKeys = ["group", "content", "marks", "inline", "atom", "defining", "code", "tableRole", "summary"];
13928
13928
  const markKeys = ["group", "inclusive", "excludes", "spanning", "code"];
13929
13929
  function mapAttributes(attrs) {
@@ -14715,7 +14715,7 @@ const _Editor = class _Editor extends EventEmitter {
14715
14715
  { default: remarkStringify },
14716
14716
  { default: remarkGfm }
14717
14717
  ] = await Promise.all([
14718
- import("./index-lIKPN00V.js"),
14718
+ import("./index-dhmURjT9.js"),
14719
14719
  import("./index-DRCvimau.js"),
14720
14720
  import("./index-C_x_N6Uh.js"),
14721
14721
  import("./index-D_sWOSiG.js"),
@@ -14920,7 +14920,7 @@ const _Editor = class _Editor extends EventEmitter {
14920
14920
  * Process collaboration migrations
14921
14921
  */
14922
14922
  processCollaborationMigrations() {
14923
- console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.79");
14923
+ console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.80");
14924
14924
  if (!this.options.ydoc) return;
14925
14925
  const metaMap = this.options.ydoc.getMap("meta");
14926
14926
  let docVersion = metaMap.get("version");
@@ -26706,6 +26706,9 @@ const MAX_HREF_LENGTH = 2048;
26706
26706
  const SAFE_ANCHOR_PATTERN = /^[A-Za-z0-9._-]+$/;
26707
26707
  const MAX_DATA_URL_LENGTH = 10 * 1024 * 1024;
26708
26708
  const VALID_IMAGE_DATA_URL = /^data:image\/(png|jpeg|jpg|gif|svg\+xml|webp|bmp|ico|tiff?);base64,/i;
26709
+ const MAX_RESIZE_MULTIPLIER = 3;
26710
+ const FALLBACK_MAX_DIMENSION = 1e3;
26711
+ const MIN_IMAGE_DIMENSION = 20;
26709
26712
  const AMBIGUOUS_LINK_PATTERNS = /^(click here|read more|more|link|here|this|download|view)$/i;
26710
26713
  const TRACK_CHANGE_BASE_CLASS = {
26711
26714
  insert: "track-insert-dec",
@@ -28652,14 +28655,25 @@ const _DomPainter = class _DomPainter {
28652
28655
  * - Only allows safe image MIME types (png, jpeg, gif, etc.) with base64 encoding
28653
28656
  * - Non-data URLs are sanitized through sanitizeUrl to prevent XSS
28654
28657
  *
28658
+ * METADATA ATTRIBUTE:
28659
+ * - Adds `data-image-metadata` attribute to enable interactive resizing via ImageResizeOverlay
28660
+ * - Metadata includes: originalWidth, originalHeight, aspectRatio, min/max dimensions
28661
+ * - Only added when run.width > 0 && run.height > 0 to prevent invalid metadata
28662
+ * - Max dimensions: 3x original size or 1000px (whichever is larger)
28663
+ * - Min dimensions: 20px to ensure visibility and interactivity
28664
+ *
28655
28665
  * @param run - The ImageRun to render containing image source, dimensions, and spacing
28656
28666
  * @returns HTMLElement (img) or null if src is missing or invalid
28657
28667
  *
28658
28668
  * @example
28659
28669
  * ```typescript
28660
- * // Valid data URL
28670
+ * // Valid data URL with metadata
28661
28671
  * renderImageRun({ kind: 'image', src: 'data:image/png;base64,iVBORw...', width: 100, height: 100 })
28662
- * // Returns: <img> element
28672
+ * // Returns: <img> element with data-image-metadata attribute
28673
+ *
28674
+ * // Invalid dimensions - no metadata
28675
+ * renderImageRun({ kind: 'image', src: 'data:image/png;base64,iVBORw...', width: 0, height: 0 })
28676
+ * // Returns: <img> element WITHOUT data-image-metadata attribute
28663
28677
  *
28664
28678
  * // Invalid MIME type
28665
28679
  * renderImageRun({ kind: 'image', src: 'data:text/html;base64,PHNjcmlwdD4...', width: 100, height: 100 })
@@ -28667,7 +28681,7 @@ const _DomPainter = class _DomPainter {
28667
28681
  *
28668
28682
  * // HTTP URL
28669
28683
  * renderImageRun({ kind: 'image', src: 'https://example.com/image.png', width: 100, height: 100 })
28670
- * // Returns: <img> element (after sanitization)
28684
+ * // Returns: <img> element (after sanitization) with data-image-metadata attribute
28671
28685
  * ```
28672
28686
  */
28673
28687
  renderImageRun(run) {
@@ -28695,6 +28709,22 @@ const _DomPainter = class _DomPainter {
28695
28709
  }
28696
28710
  img.width = run.width;
28697
28711
  img.height = run.height;
28712
+ if (run.width > 0 && run.height > 0) {
28713
+ const aspectRatio = run.width / run.height;
28714
+ const inlineImageMetadata = {
28715
+ originalWidth: run.width,
28716
+ originalHeight: run.height,
28717
+ // Max dimensions: MAX_RESIZE_MULTIPLIER x original size or FALLBACK_MAX_DIMENSION, whichever is larger
28718
+ // This provides generous constraints while preventing excessive scaling
28719
+ maxWidth: Math.max(run.width * MAX_RESIZE_MULTIPLIER, FALLBACK_MAX_DIMENSION),
28720
+ maxHeight: Math.max(run.height * MAX_RESIZE_MULTIPLIER, FALLBACK_MAX_DIMENSION),
28721
+ aspectRatio,
28722
+ // Min dimensions: MIN_IMAGE_DIMENSION to ensure images remain visible and interactive
28723
+ minWidth: MIN_IMAGE_DIMENSION,
28724
+ minHeight: MIN_IMAGE_DIMENSION
28725
+ };
28726
+ img.setAttribute("data-image-metadata", JSON.stringify(inlineImageMetadata));
28727
+ }
28698
28728
  img.alt = run.alt ?? "";
28699
28729
  if (run.title) {
28700
28730
  img.title = run.title;
@@ -1,4 +1,4 @@
1
- import { aK as getDefaultExportFromCjs } from "./converter-DqebDh5Y.js";
1
+ import { aK as getDefaultExportFromCjs } from "./converter-Cww1mCyd.js";
2
2
  import { V as VFile } from "./index-CvBqQJbG.js";
3
3
  function bail(error) {
4
4
  if (error) {
@@ -1,6 +1,6 @@
1
1
  import { computed, createElementBlock, openBlock, createElementVNode, createCommentVNode, normalizeClass, normalizeStyle, ref, withKeys, unref, withModifiers, createBlock, toDisplayString, withDirectives, vModelText, nextTick, getCurrentInstance, onMounted, onBeforeUnmount, createVNode, readonly, watch, reactive, onBeforeMount, inject, onActivated, onDeactivated, createTextVNode, Fragment, Comment, defineComponent, provide, h, Teleport, toRef, renderSlot, isVNode, shallowRef, watchEffect, mergeProps, Transition, vShow, cloneVNode, Text, renderList, withCtx } from "vue";
2
- import { p as process$1 } from "./converter-DqebDh5Y.js";
3
- import { _ as _export_sfc, u as useHighContrastMode, g as global$1 } from "./editor-BHqPITqs.js";
2
+ import { p as process$1 } from "./converter-Cww1mCyd.js";
3
+ import { _ as _export_sfc, u as useHighContrastMode, g as global$1 } from "./editor-D3MjMYeX.js";
4
4
  const sanitizeNumber = (value, defaultNumber) => {
5
5
  let sanitized = value.replace(/[^0-9.]/g, "");
6
6
  sanitized = parseFloat(sanitized);
@@ -1,4 +1,4 @@
1
- import { ac } from "./chunks/converter-DqebDh5Y.js";
1
+ import { ac } from "./chunks/converter-Cww1mCyd.js";
2
2
  export {
3
3
  ac as SuperConverter
4
4
  };
@@ -1,5 +1,5 @@
1
- import "./chunks/converter-DqebDh5Y.js";
2
- import { D } from "./chunks/docx-zipper-DNBbqIUN.js";
1
+ import "./chunks/converter-Cww1mCyd.js";
2
+ import { D } from "./chunks/docx-zipper-BlOp_CYx.js";
3
3
  export {
4
4
  D as default
5
5
  };
@@ -1,6 +1,6 @@
1
- import { E } from "./chunks/editor-BHqPITqs.js";
2
- import "./chunks/converter-DqebDh5Y.js";
3
- import "./chunks/docx-zipper-DNBbqIUN.js";
1
+ import { E } from "./chunks/editor-D3MjMYeX.js";
2
+ import "./chunks/converter-Cww1mCyd.js";
3
+ import "./chunks/docx-zipper-BlOp_CYx.js";
4
4
  export {
5
5
  E as Editor
6
6
  };
@@ -1,4 +1,4 @@
1
- import { J as JSZip } from "./chunks/docx-zipper-DNBbqIUN.js";
1
+ import { J as JSZip } from "./chunks/docx-zipper-BlOp_CYx.js";
2
2
  async function createZip(blobs, fileNames) {
3
3
  const zip = new JSZip();
4
4
  blobs.forEach((blob, index) => {