@stll/folio-core 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/README.md +39 -0
  2. package/dist/ai-edits/apply.js +18 -4
  3. package/dist/ai-edits/headless.d.ts +73 -6
  4. package/dist/ai-edits/headless.js +299 -60
  5. package/dist/ai-edits/index.d.ts +3 -3
  6. package/dist/ai-edits/index.js +2 -1
  7. package/dist/ai-edits/snapshot.js +40 -3
  8. package/dist/ai-edits/types.d.ts +2 -1
  9. package/dist/compat/eigenpal.d.ts +6 -4
  10. package/dist/compat/eigenpal.js +5 -3
  11. package/dist/controller/latestRequestGate.d.ts +13 -0
  12. package/dist/controller/latestRequestGate.js +16 -0
  13. package/dist/controller/layoutPipeline.js +13 -1
  14. package/dist/document-operations.d.ts +20 -4
  15. package/dist/document-operations.js +36 -15
  16. package/dist/document-stories.d.ts +10 -0
  17. package/dist/document-stories.js +27 -0
  18. package/dist/docx/blockContentParser.js +2 -2
  19. package/dist/docx/commentParser.js +1 -1
  20. package/dist/docx/compatibility.d.ts +3 -7
  21. package/dist/docx/compatibility.js +0 -11
  22. package/dist/docx/corePropertiesParser.d.ts +8 -0
  23. package/dist/docx/corePropertiesParser.js +53 -0
  24. package/dist/docx/encryption/agileDecryption.js +1 -1
  25. package/dist/docx/encryption/encryptionInfo.js +1 -1
  26. package/dist/docx/encryption/openEncryptedDocx.js +1 -1
  27. package/dist/docx/fontTableParser.d.ts +6 -0
  28. package/dist/docx/fontTableParser.js +72 -0
  29. package/dist/docx/groupDrawingParser.js +7 -2
  30. package/dist/docx/headerFooterParser.js +1 -1
  31. package/dist/docx/index.d.ts +2 -1
  32. package/dist/docx/index.js +2 -1
  33. package/dist/docx/metadataPrivacy.d.ts +40 -0
  34. package/dist/docx/metadataPrivacy.js +131 -0
  35. package/dist/docx/normalizeBaseDirection.js +1 -1
  36. package/dist/docx/numberingParser.js +1 -0
  37. package/dist/docx/paragraphParser.js +12 -1
  38. package/dist/docx/parser.d.ts +1 -1
  39. package/dist/docx/parser.js +16 -10
  40. package/dist/docx/rezip.d.ts +5 -4
  41. package/dist/docx/rezip.js +76 -13
  42. package/dist/docx/runConsolidator.js +4 -0
  43. package/dist/docx/runParser.js +19 -1
  44. package/dist/docx/selectiveSave.js +3 -3
  45. package/dist/docx/serializer/fontTableSerializer.d.ts +6 -0
  46. package/dist/docx/serializer/fontTableSerializer.js +26 -0
  47. package/dist/docx/serializer/headerFooterSerializer.js +1 -1
  48. package/dist/docx/serializer/paragraphSerializer.js +4 -0
  49. package/dist/docx/serializer/runSerializer.js +7 -0
  50. package/dist/docx/serializer/settingsSerializer.d.ts +6 -0
  51. package/dist/docx/serializer/settingsSerializer.js +16 -0
  52. package/dist/docx/serializer/stylesSerializer.d.ts +6 -0
  53. package/dist/docx/serializer/stylesSerializer.js +56 -0
  54. package/dist/docx/serializer/tableSerializer.js +25 -26
  55. package/dist/docx/serializer/themeSerializer.d.ts +6 -0
  56. package/dist/docx/serializer/themeSerializer.js +36 -0
  57. package/dist/docx/settingsParser.js +46 -0
  58. package/dist/docx/styleParser.js +26 -1
  59. package/dist/docx/tableParser.js +11 -1
  60. package/dist/docx/vmlImageParser.js +1 -0
  61. package/dist/i18n/messages/catalogs.gen.d.ts +5916 -5916
  62. package/dist/i18n/messages/catalogs.gen.js +5910 -5910
  63. package/dist/index.d.ts +6 -4
  64. package/dist/index.js +5 -3
  65. package/dist/layout-bridge/convert/footnoteLayout.d.ts +3 -0
  66. package/dist/layout-bridge/convert/footnoteLayout.js +3 -1
  67. package/dist/layout-bridge/convert/headerFooterLayout.d.ts +3 -0
  68. package/dist/layout-bridge/convert/headerFooterLayout.js +6 -1
  69. package/dist/layout-bridge/convert/toFlowBlocks.d.ts +14 -2
  70. package/dist/layout-bridge/convert/toFlowBlocks.js +52 -14
  71. package/dist/layout-bridge/engine/measuring/index.d.ts +2 -1
  72. package/dist/layout-bridge/engine/measuring/index.js +2 -1
  73. package/dist/layout-engine/index.js +36 -28
  74. package/dist/layout-engine/measure/cache.js +6 -3
  75. package/dist/layout-engine/measure/effectiveLineBreakPolicy.d.ts +29 -0
  76. package/dist/layout-engine/measure/effectiveLineBreakPolicy.js +60 -0
  77. package/dist/layout-engine/measure/font-metrics.worker.js +1 -0
  78. package/dist/layout-engine/measure/index.d.ts +2 -1
  79. package/dist/layout-engine/measure/index.js +2 -1
  80. package/dist/layout-engine/measure/lineBreakProvider.d.ts +33 -0
  81. package/dist/layout-engine/measure/lineBreakProvider.js +252 -0
  82. package/dist/layout-engine/measure/lineBreaks.d.ts +7 -2
  83. package/dist/layout-engine/measure/lineBreaks.js +11 -18
  84. package/dist/layout-engine/measure/listMarkerWidth.d.ts +1 -0
  85. package/dist/layout-engine/measure/listMarkerWidth.js +12 -6
  86. package/dist/layout-engine/measure/measureBlocks.d.ts +1 -2
  87. package/dist/layout-engine/measure/measureBlocks.js +6 -36
  88. package/dist/layout-engine/measure/measureContainer.js +32 -9
  89. package/dist/layout-engine/measure/measureHelpers.js +5 -2
  90. package/dist/layout-engine/measure/measureParagraph.js +332 -73
  91. package/dist/layout-engine/measure/measureTypes.d.ts +2 -1
  92. package/dist/layout-engine/measure/measureWorker.d.ts +2 -2
  93. package/dist/layout-engine/measure/measureWorker.js +8 -19
  94. package/dist/layout-engine/measure/measureWorkerProtocol.d.ts +3 -14
  95. package/dist/layout-engine/measure/tableCellFloating.d.ts +10 -3
  96. package/dist/layout-engine/measure/tableCellFloating.js +51 -37
  97. package/dist/layout-engine/measure/tableCellFlow.d.ts +27 -0
  98. package/dist/layout-engine/measure/tableCellFlow.js +73 -0
  99. package/dist/layout-engine/measure/tableCellGrid.js +1 -1
  100. package/dist/layout-engine/measure/textMeasurementPolicy.d.ts +18 -0
  101. package/dist/layout-engine/measure/textMeasurementPolicy.js +24 -0
  102. package/dist/layout-engine/renderedBreakReconciliation.d.ts +6 -1
  103. package/dist/layout-engine/renderedBreakReconciliation.js +34 -11
  104. package/dist/layout-engine/tableRowBreak.d.ts +5 -2
  105. package/dist/layout-engine/tableRowBreak.js +62 -29
  106. package/dist/layout-engine/types.d.ts +43 -8
  107. package/dist/layout-painter/anchoredImagePosition.d.ts +23 -0
  108. package/dist/layout-painter/anchoredImagePosition.js +95 -0
  109. package/dist/layout-painter/borderStroke.d.ts +23 -0
  110. package/dist/layout-painter/borderStroke.js +39 -0
  111. package/dist/layout-painter/renderImage.d.ts +5 -4
  112. package/dist/layout-painter/renderImage.js +18 -4
  113. package/dist/layout-painter/renderPage.d.ts +2 -27
  114. package/dist/layout-painter/renderPage.js +13 -99
  115. package/dist/layout-painter/renderParagraph.js +41 -23
  116. package/dist/layout-painter/renderTable.d.ts +2 -0
  117. package/dist/layout-painter/renderTable.js +223 -43
  118. package/dist/managers/DocumentLoaderManager.d.ts +1 -1
  119. package/dist/managers/DocumentLoaderManager.js +2 -2
  120. package/dist/prosemirror/attrs/index.d.ts +4 -2
  121. package/dist/prosemirror/attrs/index.js +22 -2
  122. package/dist/prosemirror/commands/propertyChangeScope.js +1 -1
  123. package/dist/prosemirror/conversion/effectiveTableCellFormatting.d.ts +62 -0
  124. package/dist/prosemirror/conversion/effectiveTableCellFormatting.js +131 -0
  125. package/dist/prosemirror/conversion/fromProseDoc.js +34 -18
  126. package/dist/prosemirror/conversion/toProseDoc.js +81 -77
  127. package/dist/prosemirror/extensions/StarterKit.js +2 -0
  128. package/dist/prosemirror/extensions/core/ParagraphExtension.js +7 -2
  129. package/dist/prosemirror/extensions/features/AutoBidiDetectionExtension.js +1 -1
  130. package/dist/prosemirror/extensions/features/ListExtension.js +1 -0
  131. package/dist/prosemirror/extensions/marks/FootnoteRefExtension.js +1 -0
  132. package/dist/prosemirror/extensions/marks/HighlightExtension.js +1 -1
  133. package/dist/prosemirror/extensions/marks/LanguageExtension.d.ts +7 -0
  134. package/dist/prosemirror/extensions/marks/LanguageExtension.js +30 -0
  135. package/dist/prosemirror/extensions/marks/RunShadingExtension.js +1 -1
  136. package/dist/prosemirror/extensions/marks/TextColorExtension.js +1 -1
  137. package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.js +1 -1
  138. package/dist/prosemirror/extensions/marks/markUtils.js +12 -0
  139. package/dist/prosemirror/extensions/nodes/ImageExtension.js +3 -1
  140. package/dist/prosemirror/extensions/nodes/TableExtension.js +4 -2
  141. package/dist/prosemirror/schema/index.d.ts +2 -2
  142. package/dist/prosemirror/schema/marks.d.ts +6 -1
  143. package/dist/prosemirror/schema/nodes.d.ts +15 -12
  144. package/dist/prosemirror/styles/resolvedStyleAttrs.js +1 -0
  145. package/dist/prosemirror/utils/tabCalculator.d.ts +3 -1
  146. package/dist/prosemirror/utils/tabCalculator.js +12 -10
  147. package/dist/prosemirror/validation.js +4 -1
  148. package/dist/redline.d.ts +26 -11
  149. package/dist/redline.js +107 -64
  150. package/dist/server.d.ts +9 -5
  151. package/dist/server.js +8 -4
  152. package/dist/style-sets/extract.d.ts +35 -0
  153. package/dist/style-sets/extract.js +123 -0
  154. package/dist/style-sets/stellaStyle.d.ts +13 -0
  155. package/dist/style-sets/stellaStyle.js +516 -0
  156. package/dist/style-sets/types.d.ts +31 -0
  157. package/dist/style-sets/types.js +5 -0
  158. package/dist/utils/createDocument.d.ts +12 -2
  159. package/dist/utils/createDocument.js +42 -31
  160. package/dist/utils/fontResolver.js +6 -6
  161. package/dist/utils/formatToStyle.js +1 -1
  162. package/dist/utils/paragraphFormattingMerge.d.ts +14 -3
  163. package/dist/utils/paragraphFormattingMerge.js +14 -4
  164. package/dist/version-comparison.d.ts +65 -11
  165. package/dist/version-comparison.js +187 -29
  166. package/package.json +5 -1
  167. package/dist/docx/capabilities.d.ts +0 -41
  168. package/dist/docx/capabilities.js +0 -322
@@ -1,4 +1,5 @@
1
1
  import { setMeasureProvider } from "./measureProvider.js";
2
+ import { getFontKerningMode } from "./textMeasurementPolicy.js";
2
3
  import { buildFontString, getResolvedData, ptToPx } from "./measureHelpers.js";
3
4
  import { hasCjk, isCjkCodePoint, segmentByScript } from "../../utils/scriptSegments.js";
4
5
  import { getCachedFontMetrics, getCachedTextWidth, getTextWidthCacheGeneration, setCachedFontMetrics, setCachedTextWidth } from "./cache.js";
@@ -46,13 +47,14 @@ function getCanvasContext() {
46
47
  function resetCanvasContext() {
47
48
  canvasContext = null;
48
49
  }
49
- function getWorkerFontFingerprintWidth(ctx, font) {
50
+ function getWorkerFontFingerprintWidth(ctx, font, fontCacheKey, fontKerning) {
50
51
  const generation = getTextWidthCacheGeneration();
51
- const cached = workerFontFingerprintCache.get(font);
52
+ const cached = workerFontFingerprintCache.get(fontCacheKey);
52
53
  if (cached?.generation === generation) return cached.width;
53
54
  ctx.font = font;
55
+ ctx.fontKerning = fontKerning;
54
56
  const width = ctx.measureText(WORKER_FONT_FINGERPRINT_TEXT).width;
55
- workerFontFingerprintCache.set(font, {
57
+ workerFontFingerprintCache.set(fontCacheKey, {
56
58
  generation,
57
59
  width
58
60
  });
@@ -86,6 +88,7 @@ function canvasGetFontMetrics(style) {
86
88
  try {
87
89
  const ctx = getCanvasContext();
88
90
  ctx.font = buildFontString(style);
91
+ ctx.fontKerning = getFontKerningMode(style);
89
92
  const metrics = ctx.measureText("Hg");
90
93
  if (typeof metrics.actualBoundingBoxAscent === "number" && typeof metrics.actualBoundingBoxDescent === "number") {
91
94
  ascent = metrics.actualBoundingBoxAscent;
@@ -120,10 +123,12 @@ function canvasMeasureTextWidth(text, style) {
120
123
  const font = buildFontString(style);
121
124
  const letterSpacing = style.letterSpacing ?? 0;
122
125
  const horizontalScale = getHorizontalScaleFactor(style);
123
- const fontCacheKey = `${font}|scale:${horizontalScale}`;
126
+ const fontKerning = getFontKerningMode(style);
127
+ const fontCacheKey = style.kerning ? `${font}|kerning:normal|scale:${horizontalScale}` : `${font}|scale:${horizontalScale}`;
124
128
  const cached = getCachedTextWidth(measuredText, fontCacheKey, letterSpacing);
125
129
  if (cached !== void 0) return cached;
126
130
  ctx.font = font;
131
+ ctx.fontKerning = fontKerning;
127
132
  let width = ctx.measureText(measuredText).width;
128
133
  if (letterSpacing) {
129
134
  const codePoints = countCodePoints(measuredText);
@@ -132,9 +137,17 @@ function canvasMeasureTextWidth(text, style) {
132
137
  const scaledWidth = width * horizontalScale;
133
138
  setCachedTextWidth(measuredText, fontCacheKey, letterSpacing, scaledWidth);
134
139
  if (!canPrefetchMeasurement()) return scaledWidth;
135
- const fontFingerprintWidth = getWorkerFontFingerprintWidth(ctx, font);
136
- prefetchMeasurement(measuredText, font, letterSpacing, horizontalScale, fontCacheKey, fontFingerprintWidth);
137
- prefetchBinarySearchProbes(measuredText, font, fontCacheKey, fontFingerprintWidth, letterSpacing, horizontalScale);
140
+ const fontFingerprintWidth = getWorkerFontFingerprintWidth(ctx, font, fontCacheKey, fontKerning);
141
+ prefetchMeasurement({
142
+ text: measuredText,
143
+ font,
144
+ letterSpacing,
145
+ horizontalScale,
146
+ fontCacheKey,
147
+ fontFingerprintWidth,
148
+ fontKerning
149
+ });
150
+ prefetchBinarySearchProbes(measuredText, font, fontCacheKey, fontFingerprintWidth, letterSpacing, horizontalScale, fontKerning);
138
151
  return scaledWidth;
139
152
  }
140
153
  /**
@@ -150,6 +163,7 @@ function glyphAdvanceStyle(style, fontFamily) {
150
163
  if (style.bold !== void 0) result.bold = style.bold;
151
164
  if (style.italic !== void 0) result.italic = style.italic;
152
165
  if (style.fontVariant !== void 0) result.fontVariant = style.fontVariant;
166
+ if (style.kerning !== void 0) result.kerning = style.kerning;
153
167
  return result;
154
168
  }
155
169
  /**
@@ -186,12 +200,20 @@ function measureMixedScriptWidth(measuredText, style) {
186
200
  * pays the main-thread cost as usual. When the worker wins, that probe
187
201
  * lands on a hit.
188
202
  */
189
- function prefetchBinarySearchProbes(text, font, fontCacheKey, fontFingerprintWidth, letterSpacing, horizontalScale) {
203
+ function prefetchBinarySearchProbes(text, font, fontCacheKey, fontFingerprintWidth, letterSpacing, horizontalScale, fontKerning) {
190
204
  if (text.length < 4) return;
191
205
  for (let denom = 2; denom <= 8; denom *= 2) {
192
206
  const len = Math.floor(text.length / denom);
193
207
  if (len < 2) break;
194
- prefetchMeasurement(text.slice(0, len), font, letterSpacing, horizontalScale, fontCacheKey, fontFingerprintWidth);
208
+ prefetchMeasurement({
209
+ text: text.slice(0, len),
210
+ font,
211
+ letterSpacing,
212
+ horizontalScale,
213
+ fontCacheKey,
214
+ fontFingerprintWidth,
215
+ fontKerning
216
+ });
195
217
  }
196
218
  }
197
219
  /**
@@ -224,6 +246,7 @@ function canvasMeasureRun(text, style) {
224
246
  const ctx = getCanvasContext();
225
247
  const baseFont = buildFontString(style);
226
248
  ctx.font = baseFont;
249
+ ctx.fontKerning = style.kerning ? "normal" : "none";
227
250
  const eastAsiaFont = style.eastAsiaFontFamily !== void 0 && !style.letterSpacing ? buildFontString({
228
251
  ...style,
229
252
  fontFamily: style.eastAsiaFontFamily
@@ -1,5 +1,6 @@
1
1
  import { resolveFontFamily } from "../../utils/fontResolver.js";
2
2
  import "../../utils/fontWeights.js";
3
+ import { FONT_KERNING_MODE, getRunFontKerningMode } from "./textMeasurementPolicy.js";
3
4
  //#region src/layout-engine/measure/measureHelpers.ts
4
5
  /**
5
6
  * Pure measurement helpers — no canvas, no DOM, no worker.
@@ -23,16 +24,18 @@ const DEFAULT_FONT_FAMILY = "Calibri";
23
24
  * and size fallbacks for runs that declare neither.
24
25
  */
25
26
  function buildRunFontStyle(run, fallbackFontFamily, fallbackFontSize) {
27
+ const fontSize = run.fontSize ?? fallbackFontSize;
26
28
  return {
27
29
  fontFamily: run.fontFamily ?? fallbackFontFamily,
28
30
  ...run.eastAsiaFontFamily !== void 0 ? { eastAsiaFontFamily: run.eastAsiaFontFamily } : {},
29
- fontSize: run.fontSize ?? fallbackFontSize,
31
+ fontSize,
30
32
  ...run.bold !== void 0 ? { bold: run.bold } : {},
31
33
  ...run.italic !== void 0 ? { italic: run.italic } : {},
32
34
  ...run.letterSpacing !== void 0 ? { letterSpacing: run.letterSpacing } : {},
33
35
  ...run.allCaps ? { textTransform: "uppercase" } : {},
34
36
  ...run.smallCaps ? { fontVariant: "small-caps" } : {},
35
- ...run.horizontalScale !== void 0 ? { horizontalScale: run.horizontalScale } : {}
37
+ ...run.horizontalScale !== void 0 ? { horizontalScale: run.horizontalScale } : {},
38
+ kerning: getRunFontKerningMode(run, fallbackFontSize) === FONT_KERNING_MODE.enabled
36
39
  };
37
40
  }
38
41
  /** Cache for resolved font data */