@stll/folio-core 0.56.0 → 0.58.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 (158) hide show
  1. package/dist/ai-edits/apply.js +122 -22
  2. package/dist/ai-edits/batch-claims.d.ts +3 -1
  3. package/dist/ai-edits/batch-claims.js +25 -1
  4. package/dist/ai-edits/table-row-column-mutations.js +17 -3
  5. package/dist/ai-suggestions/apply.js +20 -1
  6. package/dist/compare/inline-atoms.js +40 -16
  7. package/dist/compare/inline-provenance.js +12 -5
  8. package/dist/compat/eigenpal.d.ts +2 -1
  9. package/dist/compat/eigenpal.js +2 -1
  10. package/dist/controller/canonicalClipboard.d.ts +3 -1
  11. package/dist/controller/canonicalClipboard.js +31 -13
  12. package/dist/controller/canonicalComments.d.ts +41 -0
  13. package/dist/controller/canonicalComments.js +152 -0
  14. package/dist/controller/canonicalComposition.d.ts +17 -4
  15. package/dist/controller/canonicalComposition.js +125 -20
  16. package/dist/controller/canonicalInlineProjection.d.ts +6 -1
  17. package/dist/controller/canonicalInlineProjection.js +86 -3
  18. package/dist/controller/canonicalInput.d.ts +1 -1
  19. package/dist/controller/canonicalInput.js +14 -4
  20. package/dist/controller/canonicalInputTimer.d.ts +10 -1
  21. package/dist/controller/canonicalInputTimer.js +24 -1
  22. package/dist/controller/canonicalPublicOperations.d.ts +2 -2
  23. package/dist/controller/canonicalPublicOperations.js +107 -15
  24. package/dist/controller/canonicalSelection.d.ts +18 -0
  25. package/dist/controller/canonicalSelection.js +41 -0
  26. package/dist/controller/canonicalSession.d.ts +4 -1
  27. package/dist/controller/canonicalSession.js +106 -36
  28. package/dist/controller/canonicalStoryEditor.d.ts +3 -1
  29. package/dist/controller/canonicalStoryEditor.js +21 -1
  30. package/dist/controller/canonicalStructure.js +8 -3
  31. package/dist/controller/folioEditor.js +13 -0
  32. package/dist/controller/headerFooterEditorManager.d.ts +1 -1
  33. package/dist/controller/headerFooterEditorManager.js +25 -11
  34. package/dist/controller/hiddenEditorApi.d.ts +13 -2
  35. package/dist/controller/hiddenEditorApi.js +5 -1
  36. package/dist/controller/hiddenEditorManager.d.ts +3 -1
  37. package/dist/controller/hiddenEditorManager.js +167 -14
  38. package/dist/controller/noteEditorManager.d.ts +1 -1
  39. package/dist/controller/noteEditorManager.js +28 -13
  40. package/dist/docx/builtInStyles.js +13 -6
  41. package/dist/docx/containerChildren.gen.d.ts +3 -1
  42. package/dist/docx/containerChildren.gen.js +33 -1
  43. package/dist/docx/fieldParser.js +14 -2
  44. package/dist/docx/hyperlinkParser.d.ts +1 -1
  45. package/dist/docx/hyperlinkParser.js +20 -1
  46. package/dist/docx/inlineWrapperContent.d.ts +4 -4
  47. package/dist/docx/inlineWrapperContent.js +4 -4
  48. package/dist/docx/linkedSdtPreservation.d.ts +10 -0
  49. package/dist/docx/linkedSdtPreservation.js +37 -0
  50. package/dist/docx/listRendering.d.ts +18 -0
  51. package/dist/{prosemirror/conversion/listRenderingDefinition.js → docx/listRendering.js} +17 -3
  52. package/dist/docx/paragraphParser.js +88 -67
  53. package/dist/docx/paragraphPropertySource.d.ts +22 -1
  54. package/dist/docx/paragraphPropertySource.js +107 -1
  55. package/dist/docx/preservedRunContent.js +2 -1
  56. package/dist/docx/relsParser.js +26 -2
  57. package/dist/docx/rezip.js +9 -6
  58. package/dist/docx/selectiveSave.js +10 -8
  59. package/dist/docx/serializer/commentSerializer.d.ts +4 -1
  60. package/dist/docx/serializer/commentSerializer.js +7 -3
  61. package/dist/docx/serializer/paragraphSerializer.js +207 -94
  62. package/dist/docx/server/materializeYjsDocx.js +15 -7
  63. package/dist/docx/server/migrateYjsAttrSchema.js +17 -5
  64. package/dist/i18n/messages/ar.gen.js +4 -0
  65. package/dist/i18n/messages/catalogs.gen.d.ts +68 -0
  66. package/dist/i18n/messages/catalogs.gen.js +68 -0
  67. package/dist/i18n/messages/cs.gen.js +4 -0
  68. package/dist/i18n/messages/de.gen.js +4 -0
  69. package/dist/i18n/messages/en.gen.js +4 -0
  70. package/dist/i18n/messages/es.gen.js +4 -0
  71. package/dist/i18n/messages/et.gen.js +4 -0
  72. package/dist/i18n/messages/fr.gen.js +4 -0
  73. package/dist/i18n/messages/he.gen.js +4 -0
  74. package/dist/i18n/messages/hi.gen.js +4 -0
  75. package/dist/i18n/messages/hu.gen.js +4 -0
  76. package/dist/i18n/messages/lt.gen.js +4 -0
  77. package/dist/i18n/messages/lv.gen.js +4 -0
  78. package/dist/i18n/messages/messages.gen.d.ts +4 -0
  79. package/dist/i18n/messages/pl.gen.js +4 -0
  80. package/dist/i18n/messages/pt-BR.gen.js +4 -0
  81. package/dist/i18n/messages/sk.gen.js +4 -0
  82. package/dist/i18n/messages/tr.gen.js +4 -0
  83. package/dist/i18n/messages/zh-CN.gen.js +4 -0
  84. package/dist/index.d.ts +2 -1
  85. package/dist/index.js +2 -1
  86. package/dist/internal/revisionResolutionInline.js +25 -3
  87. package/dist/markdown/internals.js +7 -0
  88. package/dist/markdown/renderParagraph.js +11 -12
  89. package/dist/markdown/renderRuns.js +3 -13
  90. package/dist/markdown/types.d.ts +3 -0
  91. package/dist/panel-layout.d.ts +11 -9
  92. package/dist/panel-layout.js +13 -9
  93. package/dist/prosemirror/addTrackedDeletionMark.d.ts +18 -0
  94. package/dist/prosemirror/addTrackedDeletionMark.js +87 -0
  95. package/dist/prosemirror/attrs/index.js +9 -0
  96. package/dist/prosemirror/commands/comments.js +60 -35
  97. package/dist/prosemirror/commands/propertyChangeScope.js +3 -6
  98. package/dist/prosemirror/commands/resolveParagraphProperties.js +22 -13
  99. package/dist/prosemirror/commentOps.js +15 -1
  100. package/dist/prosemirror/conversion/fromProseDoc.d.ts +8 -1
  101. package/dist/prosemirror/conversion/fromProseDoc.js +150 -30
  102. package/dist/prosemirror/conversion/toProseDoc.js +128 -40
  103. package/dist/prosemirror/extensions/core/ParagraphExtension.js +22 -5
  104. package/dist/prosemirror/extensions/features/BaseKeymapExtension.js +74 -25
  105. package/dist/prosemirror/extensions/marks/FootnoteRefExtension.js +11 -0
  106. package/dist/prosemirror/extensions/marks/HyperlinkExtension.js +22 -14
  107. package/dist/prosemirror/extensions/marks/markUtils.js +8 -7
  108. package/dist/prosemirror/extensions/marks/noteReferenceDeletion.js +5 -2
  109. package/dist/prosemirror/extensions/nodes/ImageExtension.js +8 -1
  110. package/dist/prosemirror/fieldRepresentation.d.ts +8 -0
  111. package/dist/prosemirror/fieldRepresentation.js +18 -0
  112. package/dist/prosemirror/hyperlinkRemoval.d.ts +13 -1
  113. package/dist/prosemirror/hyperlinkRemoval.js +28 -9
  114. package/dist/prosemirror/imagePictureNames.d.ts +12 -0
  115. package/dist/prosemirror/imagePictureNames.js +20 -0
  116. package/dist/prosemirror/listNumbering.js +11 -5
  117. package/dist/prosemirror/noteReferenceOccurrenceId.d.ts +5 -0
  118. package/dist/prosemirror/noteReferenceOccurrenceId.js +5 -0
  119. package/dist/prosemirror/noteReferenceOccurrences.d.ts +21 -0
  120. package/dist/prosemirror/noteReferenceOccurrences.js +185 -0
  121. package/dist/prosemirror/noteReferenceReview.js +14 -1
  122. package/dist/prosemirror/paragraphFormattingProvenance.js +1 -0
  123. package/dist/prosemirror/plugins/documentStyles.d.ts +4 -1
  124. package/dist/prosemirror/plugins/documentStyles.js +17 -10
  125. package/dist/prosemirror/plugins/suggestionMode.js +47 -49
  126. package/dist/prosemirror/preservedXmlReview.d.ts +6 -0
  127. package/dist/prosemirror/preservedXmlReview.js +35 -0
  128. package/dist/prosemirror/runFormattingFromMarks.js +2 -2
  129. package/dist/prosemirror/runFormattingReconciliation.js +5 -4
  130. package/dist/prosemirror/runPropertyChangeResolution.d.ts +8 -1
  131. package/dist/prosemirror/runPropertyChangeResolution.js +24 -2
  132. package/dist/prosemirror/runStyleFormatting.d.ts +74 -2
  133. package/dist/prosemirror/runStyleFormatting.js +20 -1
  134. package/dist/prosemirror/schema/marks.d.ts +1 -0
  135. package/dist/prosemirror/schema/nodes.d.ts +3 -0
  136. package/dist/prosemirror/styles/paragraphStyleCascade.js +4 -1
  137. package/dist/prosemirror/styles/resolvedStyleAttrs.d.ts +15 -15
  138. package/dist/prosemirror/styles/resolvedStyleAttrs.js +69 -28
  139. package/dist/prosemirror/styles/styleResolver.d.ts +4 -1
  140. package/dist/prosemirror/styles/styleResolver.js +32 -11
  141. package/dist/prosemirror/textInput.d.ts +5 -1
  142. package/dist/prosemirror/textInput.js +3 -3
  143. package/dist/prosemirror/trackedRevisionPath.d.ts +5 -1
  144. package/dist/prosemirror/trackedRevisionPath.js +39 -1
  145. package/dist/prosemirror/validation.js +3 -5
  146. package/dist/prosemirror/yjsDocumentMetadata.d.ts +9 -3
  147. package/dist/prosemirror/yjsDocumentMetadata.js +37 -8
  148. package/dist/types/canonicalCapabilities.d.ts +18 -18
  149. package/dist/types/canonicalCapabilities.js +18 -18
  150. package/dist/types/canonicalComments.d.ts +51 -0
  151. package/dist/types/canonicalComments.js +0 -0
  152. package/dist/types/canonicalSections.d.ts +12 -0
  153. package/dist/types/canonicalSections.js +0 -0
  154. package/dist/utils/headingCollector.js +45 -4
  155. package/dist/utils/outlineDepth.d.ts +9 -0
  156. package/dist/utils/outlineDepth.js +9 -0
  157. package/package.json +2 -2
  158. package/dist/prosemirror/conversion/listRenderingDefinition.d.ts +0 -6
@@ -3,15 +3,15 @@
3
3
  const CANONICAL_GAP = {
4
4
  authorityRouting: "authority-routing",
5
5
  commands: "command-descriptors",
6
- suggesting: "adapter-suggesting",
7
6
  trackedHyperlinkResolution: "tracked-hyperlink-resolution",
7
+ storyContentProjection: "story-content-projection",
8
8
  comments: "comment-model-edits",
9
9
  modelEdits: "direct-model-edits",
10
10
  sectionProperties: "section-properties",
11
11
  watermark: "watermark-model-edits",
12
- secondaryStories: "secondary-story-routing",
13
12
  collaboration: "collaboration-session",
14
13
  dispatch: "unclassified-transactions",
14
+ tableActivation: "table-session-activation",
15
15
  save: "pm-save-projection",
16
16
  resourceReplacement: "canonical-resource-replacement",
17
17
  history: "pm-history",
@@ -47,19 +47,19 @@ const CANONICAL_CAPABILITIES = {
47
47
  owner: "controller",
48
48
  kind: "refusal",
49
49
  adapters: ["react", "vue"],
50
- summary: "Hyperlink and TOC suggestions require serializable wrapper review provenance."
50
+ summary: "Hyperlink and TOC suggestions and edits intersecting review identities require serializable wrapper review provenance."
51
51
  },
52
- [CANONICAL_GAP.suggesting]: {
53
- owner: "adapters",
52
+ [CANONICAL_GAP.storyContentProjection]: {
53
+ owner: "controller",
54
54
  kind: "refusal",
55
55
  adapters: ["react", "vue"],
56
- summary: "Adapter suggesting controls and tracked secondary-story edits remain gated."
56
+ summary: "Unsupported inline, field and review content cannot be projected after canonical edits."
57
57
  },
58
58
  [CANONICAL_GAP.comments]: {
59
59
  owner: "adapters",
60
- kind: "refusal",
60
+ kind: "routing",
61
61
  adapters: ["react", "vue"],
62
- summary: "Comment mutations still use direct model changes."
62
+ summary: "Default sessions retain comment model edits; canonical comments use semantic operations."
63
63
  },
64
64
  [CANONICAL_GAP.modelEdits]: {
65
65
  owner: "adapters",
@@ -68,10 +68,10 @@ const CANONICAL_CAPABILITIES = {
68
68
  summary: "Direct model and pending-suggestion snapshots bypass the canonical journal."
69
69
  },
70
70
  [CANONICAL_GAP.sectionProperties]: {
71
- owner: "adapters",
71
+ owner: "controller",
72
72
  kind: "routing",
73
73
  adapters: ["react", "vue"],
74
- summary: "Section properties select canonical operations or legacy model changes."
74
+ summary: "The shared controller journals section properties; default sessions keep model changes."
75
75
  },
76
76
  [CANONICAL_GAP.watermark]: {
77
77
  owner: "adapters",
@@ -79,12 +79,6 @@ const CANONICAL_CAPABILITIES = {
79
79
  adapters: ["vue"],
80
80
  summary: "Vue watermark mutations still change the model directly."
81
81
  },
82
- [CANONICAL_GAP.secondaryStories]: {
83
- owner: "controller",
84
- kind: "routing",
85
- adapters: ["react", "vue"],
86
- summary: "Secondary-story creation, views and history still select their session authority."
87
- },
88
82
  [CANONICAL_GAP.collaboration]: {
89
83
  owner: "controller",
90
84
  kind: "refusal",
@@ -97,6 +91,12 @@ const CANONICAL_CAPABILITIES = {
97
91
  adapters: ["react", "vue"],
98
92
  summary: "Unclassified native and plugin mutations are refused at the projection boundary."
99
93
  },
94
+ [CANONICAL_GAP.tableActivation]: {
95
+ owner: "controller",
96
+ kind: "refusal",
97
+ adapters: ["react", "vue"],
98
+ summary: "Canonical session activation requires table projection and cell addressing."
99
+ },
100
100
  [CANONICAL_GAP.save]: {
101
101
  owner: "controller",
102
102
  kind: "routing",
@@ -149,9 +149,9 @@ const CANONICAL_CAPABILITIES = {
149
149
  [CANONICAL_GAP.publicComments]: {
150
150
  owner: "document-operations",
151
151
  defaultSessionMutation: "pm-public-operations",
152
- kind: "refusal",
152
+ kind: "routing",
153
153
  adapters: ["react", "vue"],
154
- summary: "Public comment operations refuse in canonical sessions; legacy sessions retain PM comments."
154
+ summary: "Canonical public comments compile to semantic operations; default sessions retain PM comments."
155
155
  },
156
156
  [CANONICAL_GAP.publicSuggestedMode]: {
157
157
  owner: "document-operations",
@@ -0,0 +1,51 @@
1
+ import { CanonicalGap } from "./canonicalCapabilities.js";
2
+ import { Comment } from "./content.js";
3
+ import { OpStory } from "@stll/docx-core/ops";
4
+ //#region src/types/canonicalComments.d.ts
5
+ /** Requests name their anchor; comment metadata never creates an unanchored root. */
6
+ type CanonicalCommentRequest = {
7
+ type: "create";
8
+ text: string;
9
+ author: string;
10
+ date?: string;
11
+ anchor: {
12
+ kind: "selection";
13
+ from: number;
14
+ to: number;
15
+ story: OpStory;
16
+ } | {
17
+ kind: "reply";
18
+ parentId: number;
19
+ } | {
20
+ kind: "revision";
21
+ story: OpStory;
22
+ revisionId: number;
23
+ };
24
+ } | {
25
+ type: "update";
26
+ id: number;
27
+ content: Comment["content"];
28
+ } | {
29
+ type: "resolve";
30
+ id: number;
31
+ status: "open" | "resolved";
32
+ } | {
33
+ type: "delete";
34
+ id: number;
35
+ } | {
36
+ type: "replace";
37
+ comments: readonly Comment[];
38
+ };
39
+ type CanonicalCommentResult = {
40
+ status: "applied";
41
+ comments: Comment[];
42
+ commentId?: number;
43
+ } | {
44
+ status: "refused";
45
+ gap: CanonicalGap;
46
+ message: string;
47
+ /** Whether the same request can succeed once a pending composition settles. */
48
+ retry: "afterComposition" | "never";
49
+ };
50
+ //#endregion
51
+ export { CanonicalCommentRequest, CanonicalCommentResult };
File without changes
@@ -0,0 +1,12 @@
1
+ import { CANONICAL_GAP } from "./canonicalCapabilities.js";
2
+ //#region src/types/canonicalSections.d.ts
3
+ type CanonicalSectionPropertiesResult = {
4
+ status: "applied";
5
+ version: number;
6
+ } | {
7
+ status: "refused";
8
+ gap: typeof CANONICAL_GAP.sectionProperties;
9
+ message: string;
10
+ };
11
+ //#endregion
12
+ export { CanonicalSectionPropertiesResult };
File without changes
@@ -1,6 +1,50 @@
1
1
  import { resolveHeadingLevel } from "../docx/builtInStyles.js";
2
2
  import { readOutlineLevelAttr } from "../prosemirror/outlineLevelAttr.js";
3
3
  //#region src/utils/headingCollector.ts
4
+ const RUN_IN_TITLE_MARKS = /* @__PURE__ */ new Set([
5
+ "bold",
6
+ "italic",
7
+ "underline"
8
+ ]);
9
+ const runInTitleFormat = (child) => {
10
+ const marks = child.marks.map(({ type }) => type.name).filter((name) => RUN_IN_TITLE_MARKS.has(name)).sort();
11
+ return marks.length > 0 ? marks.join("+") : void 0;
12
+ };
13
+ const headingText = (paragraph) => {
14
+ let text = "";
15
+ let capture = { status: "searching" };
16
+ for (let childIndex = 0; childIndex < paragraph.childCount; childIndex += 1) {
17
+ const child = paragraph.child(childIndex);
18
+ if (!child.isText) {
19
+ if (capture.status === "collecting") capture = {
20
+ status: "complete",
21
+ text: capture.text
22
+ };
23
+ continue;
24
+ }
25
+ const childText = child.text || "";
26
+ text += childText;
27
+ const format = runInTitleFormat(child);
28
+ if (capture.status === "searching" && format !== void 0) {
29
+ capture = {
30
+ status: "collecting",
31
+ format,
32
+ text: childText
33
+ };
34
+ continue;
35
+ }
36
+ if (capture.status !== "collecting") continue;
37
+ capture = format === capture.format ? {
38
+ status: "collecting",
39
+ format: capture.format,
40
+ text: capture.text + childText
41
+ } : {
42
+ status: "complete",
43
+ text: capture.text
44
+ };
45
+ }
46
+ return ((capture.status === "searching" ? "" : capture.text.trim()) || text).trim();
47
+ };
4
48
  /**
5
49
  * Collect all headings from a ProseMirror document, in document order.
6
50
  *
@@ -19,10 +63,7 @@ function collectHeadings(doc, styles) {
19
63
  styleId: typeof node.attrs["styleId"] === "string" ? node.attrs["styleId"] : null
20
64
  }, styles);
21
65
  if (level === void 0) return;
22
- let text = "";
23
- node.forEach((child) => {
24
- if (child.isText) text += child.text || "";
25
- });
66
+ const text = headingText(node);
26
67
  if (text.trim()) headings.push({
27
68
  text: text.trim(),
28
69
  level,
@@ -0,0 +1,9 @@
1
+ import { HeadingInfo } from "./headingCollector.js";
2
+ //#region src/utils/outlineDepth.d.ts
3
+ /** Maximum heading depth displayed in the document outline. */
4
+ type OutlineDepth = 2 | 3 | "all";
5
+ declare const DEFAULT_OUTLINE_DEPTH = 2;
6
+ /** Filter headings for the outline without changing their document order. */
7
+ declare const filterHeadingsByDepth: (headings: readonly HeadingInfo[], depth: OutlineDepth) => HeadingInfo[];
8
+ //#endregion
9
+ export { DEFAULT_OUTLINE_DEPTH, OutlineDepth, filterHeadingsByDepth };
@@ -0,0 +1,9 @@
1
+ //#region src/utils/outlineDepth.ts
2
+ const DEFAULT_OUTLINE_DEPTH = 2;
3
+ /** Filter headings for the outline without changing their document order. */
4
+ const filterHeadingsByDepth = (headings, depth) => {
5
+ if (depth === "all") return [...headings];
6
+ return headings.filter((heading) => heading.level < depth);
7
+ };
8
+ //#endregion
9
+ export { DEFAULT_OUTLINE_DEPTH, filterHeadingsByDepth };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stll/folio-core",
3
- "version": "0.56.0",
3
+ "version": "0.58.0",
4
4
  "description": "Headless, framework-neutral core of folio: the OOXML (.docx) parser, document model, ProseMirror integration, and page-layout engine. No React.",
5
5
  "keywords": [
6
6
  "document-model",
@@ -146,7 +146,7 @@
146
146
  "perf": "bun scripts/profile-editor.ts"
147
147
  },
148
148
  "dependencies": {
149
- "@stll/docx-core": "^0.32.0",
149
+ "@stll/docx-core": "^0.34.0",
150
150
  "@stll/docx-utils": "^0.1.0",
151
151
  "@stll/template-conditions": "^0.6.2",
152
152
  "better-result": "3.0.1",
@@ -1,6 +0,0 @@
1
- import { document_d_exports } from "../../types/document.js";
2
- //#region src/prosemirror/conversion/listRenderingDefinition.d.ts
3
- /** Compare scalar fields directly; only nested records need canonical ordering. */
4
- declare const listRenderingDefinitionsMatch: (left: document_d_exports.ListRendering, right: document_d_exports.ListRendering) => boolean;
5
- //#endregion
6
- export { listRenderingDefinitionsMatch };