superdoc 2.4.0-next.63 → 2.4.0-next.64

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.
@@ -19,7 +19,7 @@ var COLLABORATION_UPGRADE_ENGINE_MINIMUM_NODE_MAJOR = 20;
19
19
  var PRIVATE_ENGINE_INFO = (0, _superdoc_docx_engine_collaboration_upgrade_engine.getCollaborationUpgradeEngineInfo)();
20
20
  var ENGINE_INFO = Object.freeze({
21
21
  ...PRIVATE_ENGINE_INFO,
22
- superdocVersion: "2.4.0-next.63",
22
+ superdocVersion: "2.4.0-next.64",
23
23
  roomSchemaVersion: Object.freeze({ ...PRIVATE_ENGINE_INFO.roomSchemaVersion }),
24
24
  supportedBundleVersions: SUPPORTED_COLLABORATION_UPGRADE_BUNDLE_VERSIONS,
25
25
  supportedV1ReaderContractVersions: SUPPORTED_V1_READER_CONTRACT_VERSIONS
@@ -18,7 +18,7 @@ var COLLABORATION_UPGRADE_ENGINE_MINIMUM_NODE_MAJOR = 20;
18
18
  var PRIVATE_ENGINE_INFO = getCollaborationUpgradeEngineInfo$1();
19
19
  var ENGINE_INFO = Object.freeze({
20
20
  ...PRIVATE_ENGINE_INFO,
21
- superdocVersion: "2.4.0-next.63",
21
+ superdocVersion: "2.4.0-next.64",
22
22
  roomSchemaVersion: Object.freeze({ ...PRIVATE_ENGINE_INFO.roomSchemaVersion }),
23
23
  supportedBundleVersions: SUPPORTED_COLLABORATION_UPGRADE_BUNDLE_VERSIONS,
24
24
  supportedV1ReaderContractVersions: SUPPORTED_V1_READER_CONTRACT_VERSIONS
@@ -318,6 +318,8 @@ export type RunMarks = {
318
318
  * Rendering normalizes a shift of zero to "no explicit shift".
319
319
  */
320
320
  baselineShift?: number;
321
+ /** Paint-only Word 2010+ text effects (`w14:textFill`, outline, shadow, reflection). */
322
+ textEffects?: TextEffects;
321
323
  };
322
324
  export type PageReferenceRelativePositionText = 'above' | 'below';
323
325
  export type FieldResultFormat = 'charformat' | 'mergeformat';
@@ -473,6 +475,18 @@ export type ImageHyperlink = {
473
475
  * baseline next to the surrounding text instead of floating above it.
474
476
  */
475
477
  export type ImageRunVerticalAlign = 'top' | 'bottom' | 'baseline';
478
+ /**
479
+ * Explicit fail-closed rendering metadata for content that keeps its authored
480
+ * layout box but cannot be painted faithfully.
481
+ *
482
+ * The producer owns the diagnostic identity; painters only expose it on the
483
+ * visible, accessible placeholder. This keeps support decisions out of the DOM
484
+ * layer and makes degraded output observable in browser regression proofs.
485
+ */
486
+ export type RenderPlaceholder = {
487
+ diagnosticIds: string[];
488
+ accessibleName: string;
489
+ };
476
490
  /**
477
491
  * Inline image run for images that flow with text on the same line.
478
492
  * Unlike ImageBlock (anchored/floating images), ImageRun is part of the paragraph's run array
@@ -499,10 +513,16 @@ export type ImageRun = {
499
513
  width: number;
500
514
  /** Image height in pixels. */
501
515
  height: number;
516
+ /** Font family of the owning OOXML run, used to compose an image-only line box. */
517
+ fontFamily?: string;
518
+ /** Font size of the owning OOXML run, used to compose an image-only line box. */
519
+ fontSize?: number;
502
520
  /** Alternative text for accessibility. */
503
521
  alt?: string;
504
522
  /** Image title (tooltip). */
505
523
  title?: string;
524
+ /** Visible fail-closed replacement when the image source cannot be painted. */
525
+ placeholder?: RenderPlaceholder;
506
526
  /** DrawingML docPr/@id of the picture (used to target the Document API for interactive resize). */
507
527
  imageId?: string;
508
528
  /** Clip-path value for cropped images. */
@@ -891,6 +911,8 @@ export type ImageBlock = {
891
911
  height?: number;
892
912
  alt?: string;
893
913
  title?: string;
914
+ /** Visible fail-closed replacement when the image source cannot be painted. */
915
+ placeholder?: RenderPlaceholder;
894
916
  /** DrawingML docPr/@id of the picture (used to target the Document API for interactive resize). */
895
917
  imageId?: string;
896
918
  objectFit?: 'contain' | 'cover' | 'fill' | 'scale-down';
@@ -986,6 +1008,52 @@ export type TextFormatting = {
986
1008
  fontSize?: number;
987
1009
  fontFamily?: string;
988
1010
  letterSpacing?: number;
1011
+ /** Paint-only Word 2010+ text effects shared with ordinary text runs. */
1012
+ textEffects?: TextEffects;
1013
+ };
1014
+ /** Solid color used by a text effect, with optional opacity. */
1015
+ export type TextEffectColor = {
1016
+ color: string;
1017
+ alpha?: number;
1018
+ };
1019
+ /** Word 2010+ text outline (`w14:textOutline`). */
1020
+ export type TextOutlineEffect = {
1021
+ /** Outline width converted from EMU to CSS pixels. */
1022
+ width: number;
1023
+ fill: FillColor;
1024
+ };
1025
+ /** Word 2010+ outer text shadow (`w14:shadow`). */
1026
+ export type TextShadowEffect = {
1027
+ color: TextEffectColor;
1028
+ /** Blur radius converted from EMU to CSS pixels. */
1029
+ blurRadius: number;
1030
+ /** Shadow distance converted from EMU to CSS pixels. */
1031
+ distance: number;
1032
+ /** Direction in DrawingML degrees (`0` points right, `90` points down). */
1033
+ direction: number;
1034
+ };
1035
+ /** Word 2010+ reflected-text mask (`w14:reflection`). */
1036
+ export type TextReflectionEffect = {
1037
+ blurRadius: number;
1038
+ distance: number;
1039
+ direction: number;
1040
+ startAlpha: number;
1041
+ startPosition: number;
1042
+ endAlpha: number;
1043
+ endPosition: number;
1044
+ scaleX: number;
1045
+ scaleY: number;
1046
+ };
1047
+ /**
1048
+ * Paint-only text effects shared by paragraph runs and flattened shape text.
1049
+ * These effects do not change glyph advances, so layout measurement continues
1050
+ * to use the run's ordinary typography contract.
1051
+ */
1052
+ export type TextEffects = {
1053
+ fill?: FillColor;
1054
+ outline?: TextOutlineEffect;
1055
+ shadow?: TextShadowEffect;
1056
+ reflection?: TextReflectionEffect;
989
1057
  };
990
1058
  /** A single text part with optional formatting. */
991
1059
  export type TextPart = {
@@ -1041,6 +1109,20 @@ export type ShapeTextContent = {
1041
1109
  /** Horizontal text alignment within the shape. */
1042
1110
  horizontalAlign?: 'left' | 'center' | 'right';
1043
1111
  };
1112
+ /** DrawingML textbox flow/overflow semantics from `a:bodyPr`. */
1113
+ export type ShapeTextLayout = {
1114
+ /** `a:bodyPr/@wrap`; `none` keeps authored paragraphs on explicit lines only. */
1115
+ wrap?: 'square' | 'none';
1116
+ /** `a:bodyPr/@horzOverflow`. */
1117
+ horizontalOverflow?: 'overflow' | 'clip';
1118
+ /** `a:bodyPr/@vertOverflow`. */
1119
+ verticalOverflow?: 'overflow' | 'clip' | 'ellipsis';
1120
+ };
1121
+ /** Resolve the line-breaking width for DrawingML textbox content. */
1122
+ export declare function resolveShapeTextContentMeasureWidth(shapeWidth: number, insets: {
1123
+ left: number;
1124
+ right: number;
1125
+ }, layout: ShapeTextLayout | undefined, autoFitBoundaryWidth?: number): number;
1044
1126
  export type LineEnd = {
1045
1127
  type?: string;
1046
1128
  width?: string;
@@ -1056,8 +1138,38 @@ export type EffectExtent = {
1056
1138
  right: number;
1057
1139
  bottom: number;
1058
1140
  };
1141
+ /**
1142
+ * DrawingML relative rectangle in the source 1000ths-of-a-percent units.
1143
+ * Values may be negative: ECMA-376 allows an outset as well as an inset.
1144
+ */
1145
+ export type ShapeImageFillRect = {
1146
+ left: number;
1147
+ top: number;
1148
+ right: number;
1149
+ bottom: number;
1150
+ };
1151
+ /** DrawingML `a:tile` parameters, preserved without painter-specific conversion. */
1152
+ export type ShapeImageFillTile = {
1153
+ offsetX?: number;
1154
+ offsetY?: number;
1155
+ scaleX?: number;
1156
+ scaleY?: number;
1157
+ flip?: string;
1158
+ alignment?: string;
1159
+ };
1160
+ /** Resolved bitmap used as the fill paint for vector geometry. */
1161
+ export type ShapeImageFill = {
1162
+ src: string;
1163
+ mode: 'stretch' | 'tile';
1164
+ sourceRect?: ShapeImageFillRect;
1165
+ fillRect?: ShapeImageFillRect;
1166
+ tile?: ShapeImageFillTile;
1167
+ dpi?: number;
1168
+ rotateWithShape?: boolean;
1169
+ };
1059
1170
  export type VectorShapeStyle = {
1060
1171
  fillColor?: FillColor;
1172
+ imageFill?: ShapeImageFill;
1061
1173
  strokeColor?: StrokeColor;
1062
1174
  strokeWidth?: number;
1063
1175
  /** Physical CSS-pixel dash/gap lengths resolved from the source stroke. */
@@ -1068,6 +1180,7 @@ export type VectorShapeStyle = {
1068
1180
  borders?: CellBorders;
1069
1181
  lineEnds?: LineEnds;
1070
1182
  textContent?: ShapeTextContent;
1183
+ textLayout?: ShapeTextLayout;
1071
1184
  textAlign?: string;
1072
1185
  textVerticalAlign?: 'top' | 'center' | 'bottom';
1073
1186
  /** Legacy VML textbox text-flow semantics. */
@@ -1129,6 +1242,8 @@ export type DrawingBlockBase = {
1129
1242
  drawingContent?: DrawingContentSnapshot;
1130
1243
  attrs?: Record<string, unknown>;
1131
1244
  sourceAnchor?: SourceAnchor;
1245
+ /** Visible fail-closed replacement metadata owned by the projection layer. */
1246
+ placeholder?: RenderPlaceholder;
1132
1247
  };
1133
1248
  /**
1134
1249
  * Custom geometry path data extracted from a:custGeom/a:pathLst.
@@ -1150,6 +1265,7 @@ export type VectorShapeDrawing = DrawingBlockBase & {
1150
1265
  shapeKind?: string;
1151
1266
  customGeometry?: CustomGeometryData;
1152
1267
  fillColor?: FillColor;
1268
+ imageFill?: ShapeImageFill;
1153
1269
  strokeColor?: StrokeColor;
1154
1270
  strokeWidth?: number;
1155
1271
  strokeDashArray?: number[];
@@ -1158,6 +1274,7 @@ export type VectorShapeDrawing = DrawingBlockBase & {
1158
1274
  lineEnds?: LineEnds;
1159
1275
  effectExtent?: EffectExtent;
1160
1276
  textContent?: ShapeTextContent;
1277
+ textLayout?: ShapeTextLayout;
1161
1278
  textAlign?: string;
1162
1279
  textVerticalAlign?: 'top' | 'center' | 'bottom';
1163
1280
  textFlow?: 'horizontal' | 'vertical' | 'vertical-ideographic' | 'horizontal-ideographic' | 'bottom-to-top';
@@ -1176,6 +1293,7 @@ export type TextboxDrawing = DrawingBlockBase & {
1176
1293
  shapeKind?: string;
1177
1294
  customGeometry?: CustomGeometryData;
1178
1295
  fillColor?: FillColor;
1296
+ imageFill?: ShapeImageFill;
1179
1297
  strokeColor?: StrokeColor;
1180
1298
  strokeWidth?: number;
1181
1299
  strokeDashArray?: number[];
@@ -1184,6 +1302,7 @@ export type TextboxDrawing = DrawingBlockBase & {
1184
1302
  lineEnds?: LineEnds;
1185
1303
  effectExtent?: EffectExtent;
1186
1304
  textContent?: ShapeTextContent;
1305
+ textLayout?: ShapeTextLayout;
1187
1306
  textAlign?: string;
1188
1307
  textVerticalAlign?: 'top' | 'center' | 'bottom';
1189
1308
  textFlow?: 'horizontal' | 'vertical' | 'vertical-ideographic' | 'horizontal-ideographic' | 'bottom-to-top';
@@ -1,13 +1,13 @@
1
- import { ChartModel, DrawingGeometry } from '../../../contracts/src/index.js';
1
+ import { ChartModel, DrawingGeometry, RenderPlaceholder } from '../../../contracts/src/index.js';
2
2
  /**
3
3
  * Create a chart element from a ChartDrawing block.
4
4
  * Routes to the correct renderer based on chart type, with placeholder fallback.
5
5
  */
6
- export declare function createChartElement(doc: Document, chartData: ChartModel | undefined, geometry: DrawingGeometry): HTMLElement;
6
+ export declare function createChartElement(doc: Document, chartData: ChartModel | undefined, geometry: DrawingGeometry, placeholder?: RenderPlaceholder): HTMLElement;
7
7
  /**
8
8
  * Create a placeholder for charts with missing data or unsupported types.
9
9
  * Preserves layout dimensions and is print-visible.
10
10
  */
11
- export declare function createChartPlaceholder(doc: Document, container: HTMLElement, label: string): HTMLElement;
11
+ export declare function createChartPlaceholder(doc: Document, container: HTMLElement, label: string, placeholder?: RenderPlaceholder): HTMLElement;
12
12
  /** Format a numeric tick value for chart axis labels. */
13
13
  export declare function formatTickValue(value: number): string;
@@ -0,0 +1,12 @@
1
+ import { RenderPlaceholder } from '../../../../contracts/src/index.js';
2
+ export type CreateRenderPlaceholderOptions = {
3
+ doc: Document;
4
+ placeholder: RenderPlaceholder;
5
+ };
6
+ /** Stamp the shared diagnostic and accessibility contract on a placeholder. */
7
+ export declare const applyRenderPlaceholderSemantics: (element: HTMLElement, placeholder: RenderPlaceholder) => void;
8
+ /**
9
+ * Paint an observable, print-visible replacement for content that the
10
+ * projection layer deliberately kept fail-closed.
11
+ */
12
+ export declare const createRenderPlaceholder: ({ doc, placeholder }: CreateRenderPlaceholderOptions) => HTMLSpanElement;
@@ -261,6 +261,7 @@ export declare class DomPainter {
261
261
  private totalPages;
262
262
  private sectionPageCounts;
263
263
  private linkIdCounter;
264
+ private shapeImageFillCounter;
264
265
  private sdtLabelsRendered;
265
266
  /**
266
267
  * WeakMap storing tooltip data for hyperlink elements before DOM insertion.
@@ -528,6 +529,10 @@ export declare class DomPainter {
528
529
  * magnitude. Keep geometry scalable and paint the resolved width verbatim.
529
530
  */
530
531
  private applyPhysicalStrokeSemantics;
532
+ /** Paint a DrawingML picture fill through the existing SVG geometry. */
533
+ private applyShapeImageFill;
534
+ private appendShapeFillImage;
535
+ private resolveShapeTileOrigin;
531
536
  private hasShapeTextContent;
532
537
  private createShapeTextElement;
533
538
  private createTextboxContentElement;
@@ -548,6 +553,7 @@ export declare class DomPainter {
548
553
  * @param _groupScaleY - Reserved parent-group scale factor
549
554
  */
550
555
  private createFallbackTextElement;
556
+ private shapeTextAllowsOverflow;
551
557
  private applyShapeTextFlow;
552
558
  private tryCreatePresetSvg;
553
559
  /**
@@ -0,0 +1,14 @@
1
+ import { TextEffects } from '../../../../contracts/src/index.js';
2
+ type TextInkBounds = {
3
+ left: number;
4
+ top: number;
5
+ right: number;
6
+ bottom: number;
7
+ };
8
+ export declare function resolveTextReflectionTransform(reflection: NonNullable<TextEffects['reflection']>, ink: TextInkBounds): {
9
+ transform: string;
10
+ maskDirection: 'top' | 'bottom' | 'left' | 'right';
11
+ };
12
+ /** Apply paint-only Word text effects without changing glyph metrics. */
13
+ export declare function applyTextEffects(element: HTMLElement, effects: TextEffects | undefined): void;
14
+ export {};
package/dist/style.css CHANGED
@@ -1770,11 +1770,11 @@ img[data-v-c95b2073] {
1770
1770
  pointer-events: auto;
1771
1771
  }
1772
1772
 
1773
- .superdoc[data-v-d39f5239] {
1773
+ .superdoc[data-v-dfc988f2] {
1774
1774
  display: flex;
1775
1775
  position: relative;
1776
1776
  }
1777
- .sd-visually-hidden[data-v-d39f5239] {
1777
+ .sd-visually-hidden[data-v-dfc988f2] {
1778
1778
  position: absolute;
1779
1779
  width: 1px;
1780
1780
  height: 1px;
@@ -1785,30 +1785,30 @@ img[data-v-c95b2073] {
1785
1785
  white-space: nowrap;
1786
1786
  border: 0;
1787
1787
  }
1788
- .right-sidebar[data-v-d39f5239] {
1788
+ .right-sidebar[data-v-dfc988f2] {
1789
1789
  min-width: 320px;
1790
1790
  height: 100%;
1791
1791
  }
1792
- .floating-comments[data-v-d39f5239] {
1792
+ .floating-comments[data-v-dfc988f2] {
1793
1793
  min-width: 300px;
1794
1794
  width: 300px;
1795
1795
  height: 100%;
1796
1796
  overflow: visible;
1797
1797
  }
1798
- .superdoc__layers[data-v-d39f5239] {
1798
+ .superdoc__layers[data-v-dfc988f2] {
1799
1799
  height: 100%;
1800
1800
  position: relative;
1801
1801
  box-sizing: border-box;
1802
1802
  }
1803
- .superdoc__document[data-v-d39f5239] {
1803
+ .superdoc__document[data-v-dfc988f2] {
1804
1804
  width: 100%;
1805
1805
  position: relative;
1806
1806
  }
1807
- .superdoc__sub-document[data-v-d39f5239] {
1807
+ .superdoc__sub-document[data-v-dfc988f2] {
1808
1808
  width: 100%;
1809
1809
  position: relative;
1810
1810
  }
1811
- .superdoc__selection-layer[data-v-d39f5239] {
1811
+ .superdoc__selection-layer[data-v-dfc988f2] {
1812
1812
  position: absolute;
1813
1813
  min-width: 100%;
1814
1814
  min-height: 100%;
@@ -1819,13 +1819,13 @@ img[data-v-c95b2073] {
1819
1819
  /* SD-3497: PDF whiteboard overlay sits above the rendered PDF canvas but below
1820
1820
  the PDF comment anchors (z-index 6 in PdfCommentsLayer) so anchors stay
1821
1821
  clickable, and below the selection layer (z-index 10). */
1822
- .superdoc__whiteboard-layer[data-v-d39f5239] {
1822
+ .superdoc__whiteboard-layer[data-v-dfc988f2] {
1823
1823
  z-index: 4;
1824
1824
  }
1825
- .superdoc__temp-selection[data-v-d39f5239] {
1825
+ .superdoc__temp-selection[data-v-dfc988f2] {
1826
1826
  position: absolute;
1827
1827
  }
1828
- .superdoc__right-sidebar[data-v-d39f5239] {
1828
+ .superdoc__right-sidebar[data-v-dfc988f2] {
1829
1829
  width: 320px;
1830
1830
  min-width: 320px;
1831
1831
  padding: 0 10px;
@@ -1833,7 +1833,7 @@ img[data-v-c95b2073] {
1833
1833
  position: relative;
1834
1834
  z-index: 2;
1835
1835
  }
1836
- .superdoc__compact-comment-popover[data-v-d39f5239] {
1836
+ .superdoc__compact-comment-popover[data-v-dfc988f2] {
1837
1837
  position: absolute;
1838
1838
  top: 12px;
1839
1839
  right: 12px;
@@ -1842,14 +1842,14 @@ img[data-v-c95b2073] {
1842
1842
  }
1843
1843
 
1844
1844
  /* Tools styles */
1845
- .tools[data-v-d39f5239] {
1845
+ .tools[data-v-dfc988f2] {
1846
1846
  position: absolute;
1847
1847
  z-index: 3;
1848
1848
  display: flex;
1849
1849
  flex-direction: column;
1850
1850
  gap: var(--sd-ui-tools-gap, 6px);
1851
1851
  }
1852
- .tools-item[data-v-d39f5239] {
1852
+ .tools-item[data-v-dfc988f2] {
1853
1853
  display: flex;
1854
1854
  align-items: center;
1855
1855
  justify-content: center;
@@ -1860,10 +1860,10 @@ img[data-v-c95b2073] {
1860
1860
  cursor: pointer;
1861
1861
  position: relative;
1862
1862
  }
1863
- .tools-item i[data-v-d39f5239] {
1863
+ .tools-item i[data-v-dfc988f2] {
1864
1864
  cursor: pointer;
1865
1865
  }
1866
- .superdoc__tools-icon[data-v-d39f5239] {
1866
+ .superdoc__tools-icon[data-v-dfc988f2] {
1867
1867
  width: var(--sd-ui-tools-icon-size, 20px);
1868
1868
  height: var(--sd-ui-tools-icon-size, 20px);
1869
1869
  flex-shrink: 0;
@@ -1878,22 +1878,22 @@ img[data-v-c95b2073] {
1878
1878
 
1879
1879
  /* 834px is iPad screen size in portrait orientation */
1880
1880
  @media (max-width: 834px) {
1881
- .superdoc .superdoc__layers[data-v-d39f5239] {
1881
+ .superdoc .superdoc__layers[data-v-dfc988f2] {
1882
1882
  margin: 0;
1883
1883
  border: 0 !important;
1884
1884
  box-shadow: none;
1885
1885
  }
1886
- .superdoc__sub-document[data-v-d39f5239] {
1886
+ .superdoc__sub-document[data-v-dfc988f2] {
1887
1887
  max-width: 100%;
1888
1888
  }
1889
- .superdoc__right-sidebar[data-v-d39f5239] {
1889
+ .superdoc__right-sidebar[data-v-dfc988f2] {
1890
1890
  padding: 10px;
1891
1891
  position: relative;
1892
1892
  }
1893
1893
  }
1894
1894
 
1895
1895
  /* AI Writer styles */
1896
- .ai-writer-container[data-v-d39f5239] {
1896
+ .ai-writer-container[data-v-dfc988f2] {
1897
1897
  position: fixed;
1898
1898
  z-index: 1000;
1899
1899
  background: white;
@@ -1909,10 +1909,10 @@ img[data-v-c95b2073] {
1909
1909
  transform: translateY(-50%);
1910
1910
  z-index: 50;
1911
1911
  } */
1912
- .ai-tool > svg[data-v-d39f5239] {
1912
+ .ai-tool > svg[data-v-dfc988f2] {
1913
1913
  fill: transparent;
1914
1914
  }
1915
- .ai-tool[data-v-d39f5239]::before {
1915
+ .ai-tool[data-v-dfc988f2]::before {
1916
1916
  content: '';
1917
1917
  position: absolute;
1918
1918
  width: 20px;
@@ -1933,7 +1933,7 @@ img[data-v-c95b2073] {
1933
1933
  filter: brightness(1.2);
1934
1934
  transition: filter 0.2s ease;
1935
1935
  }
1936
- .ai-tool[data-v-d39f5239]:hover::before {
1936
+ .ai-tool[data-v-dfc988f2]:hover::before {
1937
1937
  filter: brightness(1.3);
1938
1938
  }
1939
1939
 
@@ -1770,11 +1770,11 @@ img[data-v-c95b2073] {
1770
1770
  pointer-events: auto;
1771
1771
  }
1772
1772
 
1773
- .superdoc[data-v-d39f5239] {
1773
+ .superdoc[data-v-dfc988f2] {
1774
1774
  display: flex;
1775
1775
  position: relative;
1776
1776
  }
1777
- .sd-visually-hidden[data-v-d39f5239] {
1777
+ .sd-visually-hidden[data-v-dfc988f2] {
1778
1778
  position: absolute;
1779
1779
  width: 1px;
1780
1780
  height: 1px;
@@ -1785,30 +1785,30 @@ img[data-v-c95b2073] {
1785
1785
  white-space: nowrap;
1786
1786
  border: 0;
1787
1787
  }
1788
- .right-sidebar[data-v-d39f5239] {
1788
+ .right-sidebar[data-v-dfc988f2] {
1789
1789
  min-width: 320px;
1790
1790
  height: 100%;
1791
1791
  }
1792
- .floating-comments[data-v-d39f5239] {
1792
+ .floating-comments[data-v-dfc988f2] {
1793
1793
  min-width: 300px;
1794
1794
  width: 300px;
1795
1795
  height: 100%;
1796
1796
  overflow: visible;
1797
1797
  }
1798
- .superdoc__layers[data-v-d39f5239] {
1798
+ .superdoc__layers[data-v-dfc988f2] {
1799
1799
  height: 100%;
1800
1800
  position: relative;
1801
1801
  box-sizing: border-box;
1802
1802
  }
1803
- .superdoc__document[data-v-d39f5239] {
1803
+ .superdoc__document[data-v-dfc988f2] {
1804
1804
  width: 100%;
1805
1805
  position: relative;
1806
1806
  }
1807
- .superdoc__sub-document[data-v-d39f5239] {
1807
+ .superdoc__sub-document[data-v-dfc988f2] {
1808
1808
  width: 100%;
1809
1809
  position: relative;
1810
1810
  }
1811
- .superdoc__selection-layer[data-v-d39f5239] {
1811
+ .superdoc__selection-layer[data-v-dfc988f2] {
1812
1812
  position: absolute;
1813
1813
  min-width: 100%;
1814
1814
  min-height: 100%;
@@ -1819,13 +1819,13 @@ img[data-v-c95b2073] {
1819
1819
  /* SD-3497: PDF whiteboard overlay sits above the rendered PDF canvas but below
1820
1820
  the PDF comment anchors (z-index 6 in PdfCommentsLayer) so anchors stay
1821
1821
  clickable, and below the selection layer (z-index 10). */
1822
- .superdoc__whiteboard-layer[data-v-d39f5239] {
1822
+ .superdoc__whiteboard-layer[data-v-dfc988f2] {
1823
1823
  z-index: 4;
1824
1824
  }
1825
- .superdoc__temp-selection[data-v-d39f5239] {
1825
+ .superdoc__temp-selection[data-v-dfc988f2] {
1826
1826
  position: absolute;
1827
1827
  }
1828
- .superdoc__right-sidebar[data-v-d39f5239] {
1828
+ .superdoc__right-sidebar[data-v-dfc988f2] {
1829
1829
  width: 320px;
1830
1830
  min-width: 320px;
1831
1831
  padding: 0 10px;
@@ -1833,7 +1833,7 @@ img[data-v-c95b2073] {
1833
1833
  position: relative;
1834
1834
  z-index: 2;
1835
1835
  }
1836
- .superdoc__compact-comment-popover[data-v-d39f5239] {
1836
+ .superdoc__compact-comment-popover[data-v-dfc988f2] {
1837
1837
  position: absolute;
1838
1838
  top: 12px;
1839
1839
  right: 12px;
@@ -1842,14 +1842,14 @@ img[data-v-c95b2073] {
1842
1842
  }
1843
1843
 
1844
1844
  /* Tools styles */
1845
- .tools[data-v-d39f5239] {
1845
+ .tools[data-v-dfc988f2] {
1846
1846
  position: absolute;
1847
1847
  z-index: 3;
1848
1848
  display: flex;
1849
1849
  flex-direction: column;
1850
1850
  gap: var(--sd-ui-tools-gap, 6px);
1851
1851
  }
1852
- .tools-item[data-v-d39f5239] {
1852
+ .tools-item[data-v-dfc988f2] {
1853
1853
  display: flex;
1854
1854
  align-items: center;
1855
1855
  justify-content: center;
@@ -1860,10 +1860,10 @@ img[data-v-c95b2073] {
1860
1860
  cursor: pointer;
1861
1861
  position: relative;
1862
1862
  }
1863
- .tools-item i[data-v-d39f5239] {
1863
+ .tools-item i[data-v-dfc988f2] {
1864
1864
  cursor: pointer;
1865
1865
  }
1866
- .superdoc__tools-icon[data-v-d39f5239] {
1866
+ .superdoc__tools-icon[data-v-dfc988f2] {
1867
1867
  width: var(--sd-ui-tools-icon-size, 20px);
1868
1868
  height: var(--sd-ui-tools-icon-size, 20px);
1869
1869
  flex-shrink: 0;
@@ -1878,22 +1878,22 @@ img[data-v-c95b2073] {
1878
1878
 
1879
1879
  /* 834px is iPad screen size in portrait orientation */
1880
1880
  @media (max-width: 834px) {
1881
- .superdoc .superdoc__layers[data-v-d39f5239] {
1881
+ .superdoc .superdoc__layers[data-v-dfc988f2] {
1882
1882
  margin: 0;
1883
1883
  border: 0 !important;
1884
1884
  box-shadow: none;
1885
1885
  }
1886
- .superdoc__sub-document[data-v-d39f5239] {
1886
+ .superdoc__sub-document[data-v-dfc988f2] {
1887
1887
  max-width: 100%;
1888
1888
  }
1889
- .superdoc__right-sidebar[data-v-d39f5239] {
1889
+ .superdoc__right-sidebar[data-v-dfc988f2] {
1890
1890
  padding: 10px;
1891
1891
  position: relative;
1892
1892
  }
1893
1893
  }
1894
1894
 
1895
1895
  /* AI Writer styles */
1896
- .ai-writer-container[data-v-d39f5239] {
1896
+ .ai-writer-container[data-v-dfc988f2] {
1897
1897
  position: fixed;
1898
1898
  z-index: 1000;
1899
1899
  background: white;
@@ -1909,10 +1909,10 @@ img[data-v-c95b2073] {
1909
1909
  transform: translateY(-50%);
1910
1910
  z-index: 50;
1911
1911
  } */
1912
- .ai-tool > svg[data-v-d39f5239] {
1912
+ .ai-tool > svg[data-v-dfc988f2] {
1913
1913
  fill: transparent;
1914
1914
  }
1915
- .ai-tool[data-v-d39f5239]::before {
1915
+ .ai-tool[data-v-dfc988f2]::before {
1916
1916
  content: '';
1917
1917
  position: absolute;
1918
1918
  width: 20px;
@@ -1933,7 +1933,7 @@ img[data-v-c95b2073] {
1933
1933
  filter: brightness(1.2);
1934
1934
  transition: filter 0.2s ease;
1935
1935
  }
1936
- .ai-tool[data-v-d39f5239]:hover::before {
1936
+ .ai-tool[data-v-dfc988f2]:hover::before {
1937
1937
  filter: brightness(1.3);
1938
1938
  }
1939
1939
 
package/dist/superdoc.cjs CHANGED
@@ -21793,6 +21793,7 @@ var SuperDoc_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_v
21793
21793
  handleImageUpload: proxy.$superdoc.config.handleImageUpload,
21794
21794
  externalExtensions: proxy.$superdoc.config.editorExtensions || [],
21795
21795
  extensions: proxy.$superdoc.config.extensions || [],
21796
+ ...pdfConfig?.pdfLib ? { pdfLib: pdfConfig.pdfLib } : {},
21796
21797
  suppressDefaultDocxStyles: proxy.$superdoc.config.suppressDefaultDocxStyles,
21797
21798
  disableContextMenu: !proxy.$superdoc.uiConfig.contextMenu.enabled || proxy.$superdoc.config.disableContextMenu === true,
21798
21799
  jsonOverride: proxy.$superdoc.config.jsonOverride,
@@ -22782,7 +22783,7 @@ var SuperDoc_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_v
22782
22783
  ], 38);
22783
22784
  };
22784
22785
  }
22785
- }, [["__scopeId", "data-v-d39f5239"]]);
22786
+ }, [["__scopeId", "data-v-dfc988f2"]]);
22786
22787
  //#endregion
22787
22788
  //#region src/core/create-app.js
22788
22789
  var PINIA_DEVTOOLS_SETUP_EVENT = "devtools-plugin:setup";
@@ -43261,7 +43262,7 @@ var SuperDoc = class extends require_eventemitter3.import_eventemitter3.default
43261
43262
  this.config.colors = shuffleArray(this.config.colors);
43262
43263
  this.userColorMap = /* @__PURE__ */ new Map();
43263
43264
  this.colorIndex = 0;
43264
- this.version = "2.4.0-next.63";
43265
+ this.version = "2.4.0-next.64";
43265
43266
  this.#log("🦋 [superdoc] Using SuperDoc version:", this.version);
43266
43267
  this.superdocId = config.superdocId || require_uuid.v4();
43267
43268
  this.colors = this.config.colors ?? [];
@@ -21753,6 +21753,7 @@ var SuperDoc_default = /*#__PURE__*/ _plugin_vue_export_helper_default({
21753
21753
  handleImageUpload: proxy.$superdoc.config.handleImageUpload,
21754
21754
  externalExtensions: proxy.$superdoc.config.editorExtensions || [],
21755
21755
  extensions: proxy.$superdoc.config.extensions || [],
21756
+ ...pdfConfig?.pdfLib ? { pdfLib: pdfConfig.pdfLib } : {},
21756
21757
  suppressDefaultDocxStyles: proxy.$superdoc.config.suppressDefaultDocxStyles,
21757
21758
  disableContextMenu: !proxy.$superdoc.uiConfig.contextMenu.enabled || proxy.$superdoc.config.disableContextMenu === true,
21758
21759
  jsonOverride: proxy.$superdoc.config.jsonOverride,
@@ -22742,7 +22743,7 @@ var SuperDoc_default = /*#__PURE__*/ _plugin_vue_export_helper_default({
22742
22743
  ], 38);
22743
22744
  };
22744
22745
  }
22745
- }, [["__scopeId", "data-v-d39f5239"]]);
22746
+ }, [["__scopeId", "data-v-dfc988f2"]]);
22746
22747
  //#endregion
22747
22748
  //#region src/core/create-app.js
22748
22749
  var PINIA_DEVTOOLS_SETUP_EVENT = "devtools-plugin:setup";
@@ -43194,7 +43195,7 @@ var SuperDoc = class extends import_eventemitter3.default {
43194
43195
  this.config.colors = shuffleArray(this.config.colors);
43195
43196
  this.userColorMap = /* @__PURE__ */ new Map();
43196
43197
  this.colorIndex = 0;
43197
- this.version = "2.4.0-next.63";
43198
+ this.version = "2.4.0-next.64";
43198
43199
  this.#log("🦋 [superdoc] Using SuperDoc version:", this.version);
43199
43200
  this.superdocId = config.superdocId || v4();
43200
43201
  this.colors = this.config.colors ?? [];