@beyondwork/docx-react-component 1.0.29 → 1.0.31

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 (383) hide show
  1. package/package.json +65 -96
  2. package/src/README.md +85 -0
  3. package/src/api/README.md +26 -0
  4. package/src/api/public-types.ts +1952 -0
  5. package/src/api/session-state.ts +62 -0
  6. package/src/compare/diff-engine.ts +623 -0
  7. package/src/compare/export-redlines.ts +280 -0
  8. package/src/compare/index.ts +25 -0
  9. package/src/compare/snapshot.ts +97 -0
  10. package/src/component-inventory.md +99 -0
  11. package/src/core/README.md +10 -0
  12. package/src/core/commands/README.md +3 -0
  13. package/{dist/chunk-TJBP2K4T.js → src/core/commands/formatting-commands.ts} +536 -196
  14. package/src/core/commands/image-commands.ts +373 -0
  15. package/src/core/commands/index.ts +1879 -0
  16. package/src/core/commands/list-commands.ts +565 -0
  17. package/src/core/commands/paragraph-layout-commands.ts +339 -0
  18. package/src/core/commands/review-commands.ts +108 -0
  19. package/{dist/core/commands/section-layout-commands.cjs → src/core/commands/section-layout-commands.ts} +340 -137
  20. package/src/core/commands/structural-helpers.ts +309 -0
  21. package/{dist/core/commands/style-commands.cjs → src/core/commands/style-commands.ts} +113 -65
  22. package/src/core/commands/table-structure-commands.ts +854 -0
  23. package/{dist/chunk-UZXBISGO.js → src/core/commands/text-commands.ts} +142 -86
  24. package/src/core/schema/README.md +3 -0
  25. package/src/core/schema/text-schema.ts +516 -0
  26. package/src/core/search/search-text.ts +357 -0
  27. package/src/core/selection/README.md +3 -0
  28. package/src/core/selection/mapping.ts +289 -0
  29. package/src/core/selection/review-anchors.ts +183 -0
  30. package/src/core/state/README.md +3 -0
  31. package/src/core/state/editor-state.ts +892 -0
  32. package/src/core/state/text-transaction.ts +869 -0
  33. package/src/formats/xlsx/io/parse-shared-strings.ts +41 -0
  34. package/src/formats/xlsx/io/parse-sheet.ts +459 -0
  35. package/src/formats/xlsx/io/parse-styles.ts +59 -0
  36. package/src/formats/xlsx/io/parse-workbook.ts +75 -0
  37. package/src/formats/xlsx/io/serialize-shared-strings.ts +72 -0
  38. package/src/formats/xlsx/io/serialize-sheet.ts +333 -0
  39. package/src/formats/xlsx/io/serialize-styles.ts +98 -0
  40. package/src/formats/xlsx/io/serialize-workbook.ts +429 -0
  41. package/src/formats/xlsx/io/xlsx-session.ts +314 -0
  42. package/src/formats/xlsx/model/cell.ts +189 -0
  43. package/src/formats/xlsx/model/sheet.ts +326 -0
  44. package/src/formats/xlsx/model/styles.ts +118 -0
  45. package/src/formats/xlsx/model/workbook.ts +453 -0
  46. package/src/formats/xlsx/runtime/cell-commands.ts +567 -0
  47. package/src/formats/xlsx/runtime/sheet-commands.ts +206 -0
  48. package/src/formats/xlsx/runtime/workbook-runtime.ts +177 -0
  49. package/src/formats/xlsx/runtime/workbook-transaction.ts +822 -0
  50. package/src/index.ts +142 -0
  51. package/src/io/README.md +10 -0
  52. package/src/io/docx-session.ts +3175 -0
  53. package/src/io/export/README.md +3 -0
  54. package/src/io/export/export-session.ts +220 -0
  55. package/src/io/export/minimal-docx.ts +115 -0
  56. package/src/io/export/reattach-preserved-parts.ts +54 -0
  57. package/src/io/export/serialize-comments.ts +947 -0
  58. package/src/io/export/serialize-footnotes.ts +394 -0
  59. package/src/io/export/serialize-headers-footers.ts +368 -0
  60. package/src/io/export/serialize-main-document.ts +1342 -0
  61. package/src/io/export/serialize-numbering.ts +218 -0
  62. package/src/io/export/serialize-revisions.ts +389 -0
  63. package/src/io/export/serialize-runtime-revisions.ts +463 -0
  64. package/src/io/export/serialize-tables.ts +174 -0
  65. package/src/io/export/split-review-boundaries.ts +356 -0
  66. package/src/io/export/split-story-blocks-for-runtime-revisions.ts +252 -0
  67. package/src/io/export/table-properties-xml.ts +318 -0
  68. package/src/io/normalize/README.md +3 -0
  69. package/src/io/normalize/normalize-text.ts +670 -0
  70. package/src/io/ooxml/README.md +3 -0
  71. package/src/io/ooxml/highlight-colors.ts +39 -0
  72. package/src/io/ooxml/numbering-sentinels.ts +44 -0
  73. package/src/io/ooxml/parse-comments.ts +852 -0
  74. package/src/io/ooxml/parse-complex-content.ts +287 -0
  75. package/src/io/ooxml/parse-fields.ts +834 -0
  76. package/src/io/ooxml/parse-footnotes.ts +952 -0
  77. package/src/io/ooxml/parse-headers-footers.ts +1212 -0
  78. package/src/io/ooxml/parse-inline-media.ts +461 -0
  79. package/src/io/ooxml/parse-main-document.ts +2947 -0
  80. package/src/io/ooxml/parse-numbering.ts +747 -0
  81. package/src/io/ooxml/parse-revisions.ts +1045 -0
  82. package/src/io/ooxml/parse-settings.ts +184 -0
  83. package/src/io/ooxml/parse-shapes.ts +296 -0
  84. package/src/io/ooxml/parse-styles.ts +639 -0
  85. package/src/io/ooxml/parse-tables.ts +627 -0
  86. package/src/io/ooxml/parse-theme.ts +346 -0
  87. package/src/io/ooxml/part-manifest.ts +136 -0
  88. package/src/io/ooxml/revision-boundaries.ts +475 -0
  89. package/src/io/ooxml/workflow-payload.ts +544 -0
  90. package/src/io/opc/README.md +3 -0
  91. package/src/io/opc/corrupt-package.ts +166 -0
  92. package/src/io/opc/docx-package.ts +74 -0
  93. package/src/io/opc/package-reader.ts +325 -0
  94. package/src/io/opc/package-writer.ts +273 -0
  95. package/src/io/source-package-provenance.ts +241 -0
  96. package/{dist/chunk-RMH72RZI.js → src/legal/bookmarks.ts} +130 -44
  97. package/src/legal/cross-references.ts +414 -0
  98. package/src/legal/defined-terms.ts +203 -0
  99. package/src/legal/index.ts +32 -0
  100. package/src/legal/signature-blocks.ts +259 -0
  101. package/src/model/README.md +3 -0
  102. package/src/model/canonical-document.ts +2722 -0
  103. package/src/model/cds-1.0.0.ts +212 -0
  104. package/src/model/snapshot.ts +760 -0
  105. package/src/preservation/README.md +3 -0
  106. package/src/preservation/markup-compatibility.ts +48 -0
  107. package/src/preservation/opaque-fragment-store.ts +89 -0
  108. package/src/preservation/opaque-region.ts +233 -0
  109. package/src/preservation/package-preservation.ts +113 -0
  110. package/src/preservation/preserved-part-manifest.ts +56 -0
  111. package/src/preservation/relationship-retention.ts +57 -0
  112. package/src/preservation/store.ts +255 -0
  113. package/src/review/README.md +16 -0
  114. package/src/review/store/README.md +3 -0
  115. package/src/review/store/comment-anchors.ts +70 -0
  116. package/src/review/store/comment-remapping.ts +154 -0
  117. package/src/review/store/comment-store.ts +349 -0
  118. package/src/review/store/comment-thread.ts +109 -0
  119. package/src/review/store/revision-actions.ts +423 -0
  120. package/src/review/store/revision-store.ts +323 -0
  121. package/src/review/store/revision-types.ts +182 -0
  122. package/src/review/store/runtime-comment-store.ts +43 -0
  123. package/src/runtime/README.md +3 -0
  124. package/src/runtime/ai-action-policy.ts +764 -0
  125. package/src/runtime/context-analytics.ts +824 -0
  126. package/src/runtime/document-layout.ts +332 -0
  127. package/src/runtime/document-locations.ts +521 -0
  128. package/src/runtime/document-navigation.ts +616 -0
  129. package/src/runtime/document-outline.ts +440 -0
  130. package/src/runtime/document-runtime.ts +4055 -0
  131. package/src/runtime/document-search.ts +145 -0
  132. package/src/runtime/event-refresh-hints.ts +137 -0
  133. package/src/runtime/numbering-prefix.ts +244 -0
  134. package/src/runtime/page-layout-estimation.ts +305 -0
  135. package/src/runtime/read-only-diagnostics-runtime.ts +241 -0
  136. package/src/runtime/resolved-numbering-geometry.ts +293 -0
  137. package/src/runtime/review-runtime.ts +44 -0
  138. package/src/runtime/revision-runtime.ts +107 -0
  139. package/src/runtime/session-capabilities.ts +192 -0
  140. package/src/runtime/story-context.ts +164 -0
  141. package/src/runtime/story-targeting.ts +162 -0
  142. package/src/runtime/suggestions-snapshot.ts +137 -0
  143. package/src/runtime/surface-projection.ts +1553 -0
  144. package/src/runtime/table-commands.ts +173 -0
  145. package/src/runtime/table-schema.ts +309 -0
  146. package/src/runtime/table-style-resolver.ts +409 -0
  147. package/src/runtime/view-state.ts +493 -0
  148. package/src/runtime/virtualized-rendering.ts +258 -0
  149. package/src/runtime/workflow-markup.ts +393 -0
  150. package/src/ui/README.md +30 -0
  151. package/src/ui/WordReviewEditor.tsx +5268 -0
  152. package/src/ui/browser-export.ts +52 -0
  153. package/src/ui/comments/README.md +3 -0
  154. package/src/ui/compatibility/README.md +3 -0
  155. package/src/ui/editor-command-bag.ts +127 -0
  156. package/src/ui/editor-runtime-boundary.ts +1558 -0
  157. package/src/ui/editor-shell-view.tsx +144 -0
  158. package/src/ui/editor-surface/README.md +3 -0
  159. package/src/ui/editor-surface-controller.tsx +66 -0
  160. package/src/ui/headless/comment-decoration-model.ts +124 -0
  161. package/src/ui/headless/preserve-editor-selection.ts +5 -0
  162. package/src/ui/headless/revision-decoration-model.ts +128 -0
  163. package/src/ui/headless/selection-helpers.ts +54 -0
  164. package/src/ui/headless/selection-tool-context.ts +19 -0
  165. package/src/ui/headless/selection-tool-resolver.ts +752 -0
  166. package/src/ui/headless/selection-tool-types.ts +129 -0
  167. package/src/ui/headless/selection-toolbar-model.ts +11 -0
  168. package/src/ui/headless/use-editor-keyboard.ts +103 -0
  169. package/src/ui/review/README.md +3 -0
  170. package/src/ui/runtime-shortcut-dispatch.ts +365 -0
  171. package/src/ui/runtime-snapshot-selectors.ts +197 -0
  172. package/src/ui/shared/revision-filters.ts +31 -0
  173. package/src/ui/status/README.md +3 -0
  174. package/src/ui/theme/README.md +3 -0
  175. package/src/ui/toolbar/README.md +3 -0
  176. package/src/ui/workflow-surface-blocked-rails.ts +94 -0
  177. package/src/ui-tailwind/chrome/chrome-preset-model.ts +107 -0
  178. package/src/ui-tailwind/chrome/chrome-preset-toolbar.tsx +15 -0
  179. package/src/ui-tailwind/chrome/responsive-chrome.ts +46 -0
  180. package/src/ui-tailwind/chrome/review-queue-bar.tsx +97 -0
  181. package/src/ui-tailwind/chrome/tw-alert-banner.tsx +64 -0
  182. package/src/ui-tailwind/chrome/tw-context-analytics-summary.tsx +122 -0
  183. package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +121 -0
  184. package/src/ui-tailwind/chrome/tw-layout-panel.tsx +114 -0
  185. package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +30 -0
  186. package/src/ui-tailwind/chrome/tw-page-ruler.tsx +365 -0
  187. package/src/ui-tailwind/chrome/tw-selection-tool-blocked.tsx +23 -0
  188. package/src/ui-tailwind/chrome/tw-selection-tool-comment.tsx +35 -0
  189. package/src/ui-tailwind/chrome/tw-selection-tool-formatting.tsx +37 -0
  190. package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +303 -0
  191. package/src/ui-tailwind/chrome/tw-selection-tool-structure.tsx +116 -0
  192. package/src/ui-tailwind/chrome/tw-selection-tool-suggestion.tsx +29 -0
  193. package/src/ui-tailwind/chrome/tw-selection-tool-workflow.tsx +27 -0
  194. package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +186 -0
  195. package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +139 -0
  196. package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +250 -0
  197. package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +58 -0
  198. package/src/ui-tailwind/chrome/use-before-unload.ts +20 -0
  199. package/src/ui-tailwind/editor-surface/perf-probe.ts +179 -0
  200. package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +189 -0
  201. package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +31 -0
  202. package/src/ui-tailwind/editor-surface/pm-decorations.ts +411 -0
  203. package/src/ui-tailwind/editor-surface/pm-position-map.ts +123 -0
  204. package/src/ui-tailwind/editor-surface/pm-schema.ts +927 -0
  205. package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +567 -0
  206. package/src/ui-tailwind/editor-surface/search-plugin.ts +168 -0
  207. package/src/ui-tailwind/editor-surface/surface-build-keys.ts +63 -0
  208. package/src/ui-tailwind/editor-surface/tw-caret.tsx +12 -0
  209. package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +150 -0
  210. package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +129 -0
  211. package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +58 -0
  212. package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +151 -0
  213. package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +1047 -0
  214. package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +111 -0
  215. package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +503 -0
  216. package/src/ui-tailwind/index.ts +62 -0
  217. package/src/ui-tailwind/page-chrome-model.ts +27 -0
  218. package/src/ui-tailwind/review/tw-comment-sidebar.tsx +406 -0
  219. package/src/ui-tailwind/review/tw-health-panel.tsx +149 -0
  220. package/src/ui-tailwind/review/tw-review-rail.tsx +130 -0
  221. package/src/ui-tailwind/review/tw-revision-sidebar.tsx +164 -0
  222. package/src/ui-tailwind/status/tw-status-bar.tsx +65 -0
  223. package/{dist → src}/ui-tailwind/theme/editor-theme.css +58 -40
  224. package/src/ui-tailwind/toolbar/toolbar-layout.ts +47 -0
  225. package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +52 -0
  226. package/src/ui-tailwind/toolbar/tw-toolbar.tsx +1478 -0
  227. package/src/ui-tailwind/tw-review-workspace.tsx +1587 -0
  228. package/src/validation/README.md +3 -0
  229. package/src/validation/compatibility-engine.ts +878 -0
  230. package/src/validation/compatibility-report.ts +161 -0
  231. package/src/validation/diagnostics.ts +204 -0
  232. package/src/validation/docx-comment-proof.ts +720 -0
  233. package/src/validation/import-diagnostics.ts +128 -0
  234. package/src/validation/low-priority-word-surfaces.ts +373 -0
  235. package/dist/canonical-document-BLEbzL2J.d.cts +0 -844
  236. package/dist/canonical-document-BLEbzL2J.d.ts +0 -844
  237. package/dist/chunk-2FJS5GZM.js +0 -763
  238. package/dist/chunk-2FJS5GZM.js.map +0 -1
  239. package/dist/chunk-2OQBZS3F.js +0 -446
  240. package/dist/chunk-2OQBZS3F.js.map +0 -1
  241. package/dist/chunk-2S7W4KFO.js +0 -127
  242. package/dist/chunk-2S7W4KFO.js.map +0 -1
  243. package/dist/chunk-2TG72QSW.js +0 -3874
  244. package/dist/chunk-2TG72QSW.js.map +0 -1
  245. package/dist/chunk-36QNIZBO.js +0 -532
  246. package/dist/chunk-36QNIZBO.js.map +0 -1
  247. package/dist/chunk-4AQOYAW4.js +0 -3069
  248. package/dist/chunk-4AQOYAW4.js.map +0 -1
  249. package/dist/chunk-4D5EWJ3P.js +0 -77
  250. package/dist/chunk-4D5EWJ3P.js.map +0 -1
  251. package/dist/chunk-5FN54NDH.js +0 -2257
  252. package/dist/chunk-5FN54NDH.js.map +0 -1
  253. package/dist/chunk-BOYGQYRQ.js +0 -7306
  254. package/dist/chunk-BOYGQYRQ.js.map +0 -1
  255. package/dist/chunk-CN3XMECL.js +0 -212
  256. package/dist/chunk-CN3XMECL.js.map +0 -1
  257. package/dist/chunk-EBI3BX6U.js +0 -164
  258. package/dist/chunk-EBI3BX6U.js.map +0 -1
  259. package/dist/chunk-EILUG3VB.js +0 -1275
  260. package/dist/chunk-EILUG3VB.js.map +0 -1
  261. package/dist/chunk-FUDY333O.js +0 -70
  262. package/dist/chunk-FUDY333O.js.map +0 -1
  263. package/dist/chunk-GBVOWFIK.js +0 -1237
  264. package/dist/chunk-GBVOWFIK.js.map +0 -1
  265. package/dist/chunk-H4TQ3H3Y.js +0 -262
  266. package/dist/chunk-H4TQ3H3Y.js.map +0 -1
  267. package/dist/chunk-JGB3IXZO.js +0 -189
  268. package/dist/chunk-JGB3IXZO.js.map +0 -1
  269. package/dist/chunk-KD2QRQPY.js +0 -4342
  270. package/dist/chunk-KD2QRQPY.js.map +0 -1
  271. package/dist/chunk-KLMXQVYK.js +0 -369
  272. package/dist/chunk-KLMXQVYK.js.map +0 -1
  273. package/dist/chunk-KZUG5KFQ.js +0 -214
  274. package/dist/chunk-KZUG5KFQ.js.map +0 -1
  275. package/dist/chunk-QDAQ4CJU.js +0 -345
  276. package/dist/chunk-QDAQ4CJU.js.map +0 -1
  277. package/dist/chunk-RMH72RZI.js.map +0 -1
  278. package/dist/chunk-SWKWQZXM.js +0 -117
  279. package/dist/chunk-SWKWQZXM.js.map +0 -1
  280. package/dist/chunk-TJBP2K4T.js.map +0 -1
  281. package/dist/chunk-TLCEAQDQ.js +0 -542
  282. package/dist/chunk-TLCEAQDQ.js.map +0 -1
  283. package/dist/chunk-UZXBISGO.js.map +0 -1
  284. package/dist/chunk-WGBAKP3Q.js +0 -3220
  285. package/dist/chunk-WGBAKP3Q.js.map +0 -1
  286. package/dist/compare/index.cjs +0 -5475
  287. package/dist/compare/index.cjs.map +0 -1
  288. package/dist/compare/index.d.cts +0 -114
  289. package/dist/compare/index.d.ts +0 -114
  290. package/dist/compare/index.js +0 -731
  291. package/dist/compare/index.js.map +0 -1
  292. package/dist/core/commands/formatting-commands.cjs +0 -828
  293. package/dist/core/commands/formatting-commands.cjs.map +0 -1
  294. package/dist/core/commands/formatting-commands.d.cts +0 -63
  295. package/dist/core/commands/formatting-commands.d.ts +0 -63
  296. package/dist/core/commands/formatting-commands.js +0 -37
  297. package/dist/core/commands/formatting-commands.js.map +0 -1
  298. package/dist/core/commands/image-commands.cjs +0 -2023
  299. package/dist/core/commands/image-commands.cjs.map +0 -1
  300. package/dist/core/commands/image-commands.d.cts +0 -58
  301. package/dist/core/commands/image-commands.d.ts +0 -58
  302. package/dist/core/commands/image-commands.js +0 -18
  303. package/dist/core/commands/image-commands.js.map +0 -1
  304. package/dist/core/commands/section-layout-commands.cjs.map +0 -1
  305. package/dist/core/commands/section-layout-commands.d.cts +0 -62
  306. package/dist/core/commands/section-layout-commands.d.ts +0 -62
  307. package/dist/core/commands/section-layout-commands.js +0 -21
  308. package/dist/core/commands/section-layout-commands.js.map +0 -1
  309. package/dist/core/commands/style-commands.cjs.map +0 -1
  310. package/dist/core/commands/style-commands.d.cts +0 -13
  311. package/dist/core/commands/style-commands.d.ts +0 -13
  312. package/dist/core/commands/style-commands.js +0 -9
  313. package/dist/core/commands/style-commands.js.map +0 -1
  314. package/dist/core/commands/table-structure-commands.cjs +0 -1883
  315. package/dist/core/commands/table-structure-commands.cjs.map +0 -1
  316. package/dist/core/commands/table-structure-commands.d.cts +0 -59
  317. package/dist/core/commands/table-structure-commands.d.ts +0 -59
  318. package/dist/core/commands/table-structure-commands.js +0 -12
  319. package/dist/core/commands/table-structure-commands.js.map +0 -1
  320. package/dist/core/commands/text-commands.cjs +0 -2391
  321. package/dist/core/commands/text-commands.cjs.map +0 -1
  322. package/dist/core/commands/text-commands.d.cts +0 -24
  323. package/dist/core/commands/text-commands.d.ts +0 -24
  324. package/dist/core/commands/text-commands.js +0 -28
  325. package/dist/core/commands/text-commands.js.map +0 -1
  326. package/dist/core/selection/mapping.cjs +0 -200
  327. package/dist/core/selection/mapping.cjs.map +0 -1
  328. package/dist/core/selection/mapping.d.cts +0 -2
  329. package/dist/core/selection/mapping.d.ts +0 -2
  330. package/dist/core/selection/mapping.js +0 -31
  331. package/dist/core/selection/mapping.js.map +0 -1
  332. package/dist/core/state/editor-state.cjs +0 -2278
  333. package/dist/core/state/editor-state.cjs.map +0 -1
  334. package/dist/core/state/editor-state.d.cts +0 -2
  335. package/dist/core/state/editor-state.d.ts +0 -2
  336. package/dist/core/state/editor-state.js +0 -26
  337. package/dist/core/state/editor-state.js.map +0 -1
  338. package/dist/index.cjs +0 -38553
  339. package/dist/index.cjs.map +0 -1
  340. package/dist/index.d.cts +0 -15
  341. package/dist/index.d.ts +0 -15
  342. package/dist/index.js +0 -7856
  343. package/dist/index.js.map +0 -1
  344. package/dist/io/docx-session.cjs +0 -16236
  345. package/dist/io/docx-session.cjs.map +0 -1
  346. package/dist/io/docx-session.d.cts +0 -21
  347. package/dist/io/docx-session.d.ts +0 -21
  348. package/dist/io/docx-session.js +0 -18
  349. package/dist/io/docx-session.js.map +0 -1
  350. package/dist/legal/index.cjs +0 -3900
  351. package/dist/legal/index.cjs.map +0 -1
  352. package/dist/legal/index.d.cts +0 -86
  353. package/dist/legal/index.d.ts +0 -86
  354. package/dist/legal/index.js +0 -616
  355. package/dist/legal/index.js.map +0 -1
  356. package/dist/public-types-7ZL_94cz.d.ts +0 -1573
  357. package/dist/public-types-CeMaDueh.d.cts +0 -1573
  358. package/dist/public-types.cjs +0 -19
  359. package/dist/public-types.cjs.map +0 -1
  360. package/dist/public-types.d.cts +0 -2
  361. package/dist/public-types.d.ts +0 -2
  362. package/dist/public-types.js +0 -1
  363. package/dist/public-types.js.map +0 -1
  364. package/dist/runtime/document-runtime.cjs +0 -11140
  365. package/dist/runtime/document-runtime.cjs.map +0 -1
  366. package/dist/runtime/document-runtime.d.cts +0 -231
  367. package/dist/runtime/document-runtime.d.ts +0 -231
  368. package/dist/runtime/document-runtime.js +0 -21
  369. package/dist/runtime/document-runtime.js.map +0 -1
  370. package/dist/structural-helpers-CilgOVhh.d.cts +0 -10
  371. package/dist/structural-helpers-q0Gd-eBN.d.ts +0 -10
  372. package/dist/ui-tailwind/editor-surface/search-plugin.cjs +0 -313
  373. package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +0 -1
  374. package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +0 -67
  375. package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +0 -67
  376. package/dist/ui-tailwind/editor-surface/search-plugin.js +0 -23
  377. package/dist/ui-tailwind/editor-surface/search-plugin.js.map +0 -1
  378. package/dist/ui-tailwind/index.cjs +0 -4833
  379. package/dist/ui-tailwind/index.cjs.map +0 -1
  380. package/dist/ui-tailwind/index.d.cts +0 -617
  381. package/dist/ui-tailwind/index.d.ts +0 -617
  382. package/dist/ui-tailwind/index.js +0 -575
  383. package/dist/ui-tailwind/index.js.map +0 -1
@@ -1,345 +0,0 @@
1
- import {
2
- cloneParagraphProperties,
3
- cloneStoryUnit,
4
- createPlainText,
5
- parseTextStory,
6
- serializeTextStory
7
- } from "./chunk-KLMXQVYK.js";
8
- import {
9
- createEditorSurfaceSnapshot
10
- } from "./chunk-EILUG3VB.js";
11
- import {
12
- createSelectionSnapshot
13
- } from "./chunk-5FN54NDH.js";
14
-
15
- // src/core/state/text-transaction.ts
16
- var TextTransactionError = class extends Error {
17
- code;
18
- constructor(code, message) {
19
- super(message);
20
- this.name = "TextTransactionError";
21
- this.code = code;
22
- }
23
- };
24
- function applyTextTransaction(document, selection, intent, options) {
25
- const tableScopedResult = tryApplyTableParagraphTransaction(
26
- document,
27
- selection,
28
- intent,
29
- options
30
- );
31
- if (tableScopedResult) {
32
- return tableScopedResult;
33
- }
34
- return applyLinearTextTransaction(document, selection, intent, options);
35
- }
36
- function applyLinearTextTransaction(document, selection, intent, options) {
37
- const story = parseTextStory(document.content);
38
- const normalizedRange = resolveRange(selection, story.size, intent);
39
- const insertionUnits = createInsertionUnits(intent, story, normalizedRange.from);
40
- ensureEditableRange(story.units.slice(normalizedRange.from, normalizedRange.to));
41
- const nextUnits = [
42
- ...story.units.slice(0, normalizedRange.from).map(cloneStoryUnit),
43
- ...insertionUnits.map(cloneStoryUnit),
44
- ...story.units.slice(normalizedRange.to).map(cloneStoryUnit)
45
- ];
46
- const nextStory = {
47
- firstParagraph: cloneParagraphProperties(story.firstParagraph),
48
- units: normalizeStoryUnits(nextUnits),
49
- size: 0
50
- };
51
- nextStory.size = nextStory.units.length;
52
- const caret = normalizedRange.from + insertionUnits.length;
53
- return {
54
- document: {
55
- ...document,
56
- updatedAt: options.timestamp,
57
- content: serializeTextStory(nextStory)
58
- },
59
- selection: createSelectionSnapshot(caret, caret),
60
- mapping: {
61
- steps: [
62
- {
63
- from: normalizedRange.from,
64
- to: normalizedRange.to,
65
- insertSize: insertionUnits.length
66
- }
67
- ],
68
- metadata: {
69
- affectsComments: true,
70
- affectsRevisions: true,
71
- ...containsParagraphBoundaryChange(story, normalizedRange, insertionUnits) ? { invalidatesStructures: true } : {}
72
- }
73
- },
74
- storyText: createPlainText(nextStory)
75
- };
76
- }
77
- function tryApplyTableParagraphTransaction(document, selection, intent, options) {
78
- const scope = resolveTableParagraphScope(document, selection);
79
- if (!scope) {
80
- return null;
81
- }
82
- if (scope === "unsupported") {
83
- throw new TextTransactionError(
84
- "unsupported_content",
85
- "Text transactions inside table structures are only supported when the selection stays within one paragraph-backed table cell."
86
- );
87
- }
88
- const localDocument = {
89
- ...document,
90
- content: {
91
- type: "doc",
92
- children: [scope.paragraph]
93
- }
94
- };
95
- const localSelection = createSelectionSnapshot(
96
- selection.anchor - scope.paragraphStart,
97
- selection.head - scope.paragraphStart
98
- );
99
- const localResult = applyLinearTextTransaction(localDocument, localSelection, intent, options);
100
- const nextParagraphBlocks = localResult.document.content.children;
101
- const nextRoot = {
102
- ...scope.root,
103
- children: scope.root.children.map((child, blockIndex) => {
104
- if (blockIndex !== scope.tableBlockIndex) {
105
- return child;
106
- }
107
- const table = child;
108
- return {
109
- ...table,
110
- rows: table.rows.map((row, rowIndex) => {
111
- if (rowIndex !== scope.rowIndex) {
112
- return row;
113
- }
114
- return {
115
- ...row,
116
- cells: row.cells.map((cell, cellIndex) => {
117
- if (cellIndex !== scope.cellIndex) {
118
- return cell;
119
- }
120
- return {
121
- ...cell,
122
- children: [
123
- ...cell.children.slice(0, scope.childIndex),
124
- ...nextParagraphBlocks,
125
- ...cell.children.slice(scope.childIndex + 1)
126
- ]
127
- };
128
- })
129
- };
130
- })
131
- };
132
- })
133
- };
134
- return {
135
- document: {
136
- ...document,
137
- updatedAt: options.timestamp,
138
- content: nextRoot
139
- },
140
- selection: createSelectionSnapshot(
141
- localResult.selection.anchor + scope.paragraphStart,
142
- localResult.selection.head + scope.paragraphStart
143
- ),
144
- mapping: {
145
- ...localResult.mapping,
146
- steps: localResult.mapping.steps.map((step) => ({
147
- ...step,
148
- from: step.from + scope.paragraphStart,
149
- to: step.to + scope.paragraphStart
150
- }))
151
- },
152
- storyText: localResult.storyText
153
- };
154
- }
155
- function resolveTableParagraphScope(document, selection) {
156
- const root = document.content;
157
- if (!root || root.type !== "doc" || !Array.isArray(root.children)) {
158
- return null;
159
- }
160
- const surface = createEditorSurfaceSnapshot(document, selection);
161
- const selectionFrom = Math.min(selection.anchor, selection.head);
162
- const selectionTo = Math.max(selection.anchor, selection.head);
163
- for (let blockIndex = 0; blockIndex < root.children.length; blockIndex += 1) {
164
- const block = root.children[blockIndex];
165
- const surfaceBlock = surface.blocks[blockIndex];
166
- if (block?.type !== "table" || surfaceBlock?.kind !== "table") {
167
- continue;
168
- }
169
- const insideTable = selectionFallsWithinSurfaceRange(
170
- selectionFrom,
171
- selectionTo,
172
- surfaceBlock.from,
173
- surfaceBlock.to
174
- );
175
- if (!insideTable) {
176
- continue;
177
- }
178
- for (let rowIndex = 0; rowIndex < block.rows.length; rowIndex += 1) {
179
- const row = block.rows[rowIndex];
180
- const surfaceRow = surfaceBlock.rows[rowIndex];
181
- if (!row || !surfaceRow) {
182
- continue;
183
- }
184
- for (let cellIndex = 0; cellIndex < row.cells.length; cellIndex += 1) {
185
- const cell = row.cells[cellIndex];
186
- const surfaceCell = surfaceRow.cells[cellIndex];
187
- if (!cell || !surfaceCell) {
188
- continue;
189
- }
190
- for (let childIndex = 0; childIndex < Math.min(cell.children.length, surfaceCell.content.length); childIndex += 1) {
191
- const child = cell.children[childIndex];
192
- const surfaceChild = surfaceCell.content[childIndex];
193
- if (child?.type !== "paragraph" || surfaceChild?.kind !== "paragraph") {
194
- continue;
195
- }
196
- const insideParagraph = selectionFallsWithinSurfaceRange(
197
- selectionFrom,
198
- selectionTo,
199
- surfaceChild.from,
200
- surfaceChild.to
201
- );
202
- if (!insideParagraph) {
203
- continue;
204
- }
205
- return {
206
- root,
207
- tableBlockIndex: blockIndex,
208
- rowIndex,
209
- cellIndex,
210
- childIndex,
211
- paragraph: child,
212
- paragraphStart: surfaceChild.from
213
- };
214
- }
215
- }
216
- }
217
- return "unsupported";
218
- }
219
- return null;
220
- }
221
- function selectionFallsWithinSurfaceRange(selectionFrom, selectionTo, rangeFrom, rangeTo) {
222
- if (rangeFrom === rangeTo) {
223
- return selectionFrom === rangeFrom && selectionTo === rangeTo;
224
- }
225
- return selectionFrom >= rangeFrom && selectionTo <= rangeTo && selectionFrom < rangeTo;
226
- }
227
- function resolveRange(selection, storySize, intent) {
228
- const from = Math.max(0, Math.min(selection.anchor, selection.head));
229
- const to = Math.max(0, Math.max(selection.anchor, selection.head));
230
- if (from > storySize || to > storySize) {
231
- throw new TextTransactionError(
232
- "invalid_selection",
233
- `Selection ${from}-${to} exceeds story size ${storySize}.`
234
- );
235
- }
236
- if (intent.type === "replace") {
237
- if (intent.range) {
238
- const explicitFrom = Math.max(0, Math.min(intent.range.from, intent.range.to));
239
- const explicitTo = Math.max(0, Math.max(intent.range.from, intent.range.to));
240
- if (explicitFrom > storySize || explicitTo > storySize) {
241
- throw new TextTransactionError(
242
- "invalid_selection",
243
- `Explicit range ${explicitFrom}-${explicitTo} exceeds story size ${storySize}.`
244
- );
245
- }
246
- return {
247
- from: explicitFrom,
248
- to: explicitTo
249
- };
250
- }
251
- return { from, to };
252
- }
253
- if (from !== to) {
254
- return { from, to };
255
- }
256
- if (intent.type === "delete_backward") {
257
- return {
258
- from: Math.max(0, from - 1),
259
- to: from
260
- };
261
- }
262
- return {
263
- from,
264
- to: Math.min(storySize, from + 1)
265
- };
266
- }
267
- function createInsertionUnits(intent, story, position) {
268
- if (intent.type !== "replace") {
269
- return [];
270
- }
271
- const inheritedProps = resolveParagraphPropertiesAtPosition(story, position);
272
- return intent.insertion.flatMap((entry) => {
273
- switch (entry.type) {
274
- case "text":
275
- return Array.from(entry.text).map((character) => ({
276
- kind: "text",
277
- value: character
278
- }));
279
- case "tab":
280
- return [{ kind: "tab" }];
281
- case "hard_break":
282
- return [{ kind: "hard_break" }];
283
- case "paragraph_break":
284
- return [
285
- {
286
- kind: "paragraph_break",
287
- nextParagraph: cloneParagraphProperties(inheritedProps)
288
- }
289
- ];
290
- }
291
- });
292
- }
293
- function resolveParagraphPropertiesAtPosition(story, position) {
294
- let current = cloneParagraphProperties(story.firstParagraph);
295
- for (let index = 0; index < Math.min(position, story.units.length); index += 1) {
296
- const unit = story.units[index];
297
- if (unit.kind === "paragraph_break") {
298
- current = cloneParagraphProperties(unit.nextParagraph);
299
- } else if (unit.kind === "opaque_block" && unit.nextParagraph) {
300
- current = cloneParagraphProperties(unit.nextParagraph);
301
- }
302
- }
303
- return current;
304
- }
305
- function normalizeStoryUnits(units) {
306
- if (units.length === 0) {
307
- return [];
308
- }
309
- const normalized = [];
310
- for (const unit of units) {
311
- if (unit.kind === "paragraph_break" && normalized[normalized.length - 1]?.kind === "paragraph_break") {
312
- normalized.push({
313
- kind: "paragraph_break",
314
- nextParagraph: cloneParagraphProperties(unit.nextParagraph)
315
- });
316
- continue;
317
- }
318
- normalized.push(cloneStoryUnit(unit));
319
- }
320
- return normalized;
321
- }
322
- function ensureEditableRange(units) {
323
- const protectedUnit = units.find(
324
- (unit) => unit.kind === "opaque_inline" || unit.kind === "opaque_block" || unit.kind === "image"
325
- );
326
- if (!protectedUnit) {
327
- return;
328
- }
329
- throw new TextTransactionError(
330
- "unsupported_content",
331
- `Text transaction crosses protected ${protectedUnit.kind} content.`
332
- );
333
- }
334
- function containsParagraphBoundaryChange(story, range, insertionUnits) {
335
- if (insertionUnits.some((unit) => unit.kind === "paragraph_break")) {
336
- return true;
337
- }
338
- return story.units.slice(range.from, range.to).some((unit) => unit.kind === "paragraph_break");
339
- }
340
-
341
- export {
342
- TextTransactionError,
343
- applyTextTransaction
344
- };
345
- //# sourceMappingURL=chunk-QDAQ4CJU.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/state/text-transaction.ts"],"sourcesContent":["import { createSelectionSnapshot, type CanonicalDocumentEnvelope, type SelectionSnapshot } from \"./editor-state.ts\";\nimport type { TransactionMapping } from \"../selection/mapping.ts\";\nimport {\n cloneParagraphProperties,\n cloneStoryUnit,\n createPlainText,\n parseTextStory,\n serializeTextStory,\n type ParagraphProperties,\n type StoryUnit,\n type TextStory,\n} from \"../schema/text-schema.ts\";\nimport { createEditorSurfaceSnapshot } from \"../../runtime/surface-projection.ts\";\nimport type { DocumentRootNode, ParagraphNode, TableNode } from \"../../model/canonical-document.ts\";\n\nexport type TextInsertion =\n | {\n type: \"text\";\n text: string;\n }\n | {\n type: \"tab\";\n }\n | {\n type: \"hard_break\";\n }\n | {\n type: \"paragraph_break\";\n };\n\nexport type TextTransactionIntent =\n | {\n type: \"replace\";\n range?: {\n from: number;\n to: number;\n };\n insertion: TextInsertion[];\n }\n | {\n type: \"delete_backward\";\n }\n | {\n type: \"delete_forward\";\n };\n\nexport interface TextTransactionResult {\n document: CanonicalDocumentEnvelope;\n selection: SelectionSnapshot;\n mapping: TransactionMapping;\n storyText: string;\n}\n\nexport class TextTransactionError extends Error {\n readonly code: \"invalid_selection\" | \"unsupported_content\";\n\n constructor(\n code: TextTransactionError[\"code\"],\n message: string,\n ) {\n super(message);\n this.name = \"TextTransactionError\";\n this.code = code;\n }\n}\n\nexport function applyTextTransaction(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n intent: TextTransactionIntent,\n options: {\n timestamp: string;\n },\n): TextTransactionResult {\n const tableScopedResult = tryApplyTableParagraphTransaction(\n document,\n selection,\n intent,\n options,\n );\n if (tableScopedResult) {\n return tableScopedResult;\n }\n\n return applyLinearTextTransaction(document, selection, intent, options);\n}\n\nfunction applyLinearTextTransaction(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n intent: TextTransactionIntent,\n options: {\n timestamp: string;\n },\n): TextTransactionResult {\n const story = parseTextStory(document.content);\n const normalizedRange = resolveRange(selection, story.size, intent);\n const insertionUnits = createInsertionUnits(intent, story, normalizedRange.from);\n\n ensureEditableRange(story.units.slice(normalizedRange.from, normalizedRange.to));\n\n const nextUnits = [\n ...story.units.slice(0, normalizedRange.from).map(cloneStoryUnit),\n ...insertionUnits.map(cloneStoryUnit),\n ...story.units.slice(normalizedRange.to).map(cloneStoryUnit),\n ];\n\n const nextStory: TextStory = {\n firstParagraph: cloneParagraphProperties(story.firstParagraph),\n units: normalizeStoryUnits(nextUnits),\n size: 0,\n };\n nextStory.size = nextStory.units.length;\n\n const caret = normalizedRange.from + insertionUnits.length;\n\n return {\n document: {\n ...document,\n updatedAt: options.timestamp,\n content: serializeTextStory(nextStory),\n },\n selection: createSelectionSnapshot(caret, caret),\n mapping: {\n steps: [\n {\n from: normalizedRange.from,\n to: normalizedRange.to,\n insertSize: insertionUnits.length,\n },\n ],\n metadata: {\n affectsComments: true,\n affectsRevisions: true,\n ...(containsParagraphBoundaryChange(story, normalizedRange, insertionUnits)\n ? { invalidatesStructures: true }\n : {}),\n },\n },\n storyText: createPlainText(nextStory),\n };\n}\n\nfunction tryApplyTableParagraphTransaction(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n intent: TextTransactionIntent,\n options: {\n timestamp: string;\n },\n): TextTransactionResult | null {\n const scope = resolveTableParagraphScope(document, selection);\n if (!scope) {\n return null;\n }\n if (scope === \"unsupported\") {\n throw new TextTransactionError(\n \"unsupported_content\",\n \"Text transactions inside table structures are only supported when the selection stays within one paragraph-backed table cell.\",\n );\n }\n\n const localDocument: CanonicalDocumentEnvelope = {\n ...document,\n content: {\n type: \"doc\",\n children: [scope.paragraph],\n },\n };\n const localSelection = createSelectionSnapshot(\n selection.anchor - scope.paragraphStart,\n selection.head - scope.paragraphStart,\n );\n const localResult = applyLinearTextTransaction(localDocument, localSelection, intent, options);\n const nextParagraphBlocks = (localResult.document.content as DocumentRootNode).children;\n const nextRoot: DocumentRootNode = {\n ...scope.root,\n children: scope.root.children.map((child, blockIndex) => {\n if (blockIndex !== scope.tableBlockIndex) {\n return child;\n }\n\n const table = child as TableNode;\n return {\n ...table,\n rows: table.rows.map((row, rowIndex) => {\n if (rowIndex !== scope.rowIndex) {\n return row;\n }\n\n return {\n ...row,\n cells: row.cells.map((cell, cellIndex) => {\n if (cellIndex !== scope.cellIndex) {\n return cell;\n }\n\n return {\n ...cell,\n children: [\n ...cell.children.slice(0, scope.childIndex),\n ...nextParagraphBlocks,\n ...cell.children.slice(scope.childIndex + 1),\n ],\n };\n }),\n };\n }),\n };\n }),\n };\n\n return {\n document: {\n ...document,\n updatedAt: options.timestamp,\n content: nextRoot,\n },\n selection: createSelectionSnapshot(\n localResult.selection.anchor + scope.paragraphStart,\n localResult.selection.head + scope.paragraphStart,\n ),\n mapping: {\n ...localResult.mapping,\n steps: localResult.mapping.steps.map((step) => ({\n ...step,\n from: step.from + scope.paragraphStart,\n to: step.to + scope.paragraphStart,\n })),\n },\n storyText: localResult.storyText,\n };\n}\n\nfunction resolveTableParagraphScope(\n document: CanonicalDocumentEnvelope,\n selection: SelectionSnapshot,\n):\n | {\n root: DocumentRootNode;\n tableBlockIndex: number;\n rowIndex: number;\n cellIndex: number;\n childIndex: number;\n paragraph: ParagraphNode;\n paragraphStart: number;\n }\n | \"unsupported\"\n | null {\n const root = document.content as DocumentRootNode;\n if (!root || root.type !== \"doc\" || !Array.isArray(root.children)) {\n return null;\n }\n\n const surface = createEditorSurfaceSnapshot(document, selection);\n const selectionFrom = Math.min(selection.anchor, selection.head);\n const selectionTo = Math.max(selection.anchor, selection.head);\n\n for (let blockIndex = 0; blockIndex < root.children.length; blockIndex += 1) {\n const block = root.children[blockIndex];\n const surfaceBlock = surface.blocks[blockIndex];\n if (block?.type !== \"table\" || surfaceBlock?.kind !== \"table\") {\n continue;\n }\n\n const insideTable = selectionFallsWithinSurfaceRange(\n selectionFrom,\n selectionTo,\n surfaceBlock.from,\n surfaceBlock.to,\n );\n if (!insideTable) {\n continue;\n }\n\n for (let rowIndex = 0; rowIndex < block.rows.length; rowIndex += 1) {\n const row = block.rows[rowIndex];\n const surfaceRow = surfaceBlock.rows[rowIndex];\n if (!row || !surfaceRow) {\n continue;\n }\n\n for (let cellIndex = 0; cellIndex < row.cells.length; cellIndex += 1) {\n const cell = row.cells[cellIndex];\n const surfaceCell = surfaceRow.cells[cellIndex];\n if (!cell || !surfaceCell) {\n continue;\n }\n\n for (\n let childIndex = 0;\n childIndex < Math.min(cell.children.length, surfaceCell.content.length);\n childIndex += 1\n ) {\n const child = cell.children[childIndex];\n const surfaceChild = surfaceCell.content[childIndex];\n if (child?.type !== \"paragraph\" || surfaceChild?.kind !== \"paragraph\") {\n continue;\n }\n\n const insideParagraph = selectionFallsWithinSurfaceRange(\n selectionFrom,\n selectionTo,\n surfaceChild.from,\n surfaceChild.to,\n );\n if (!insideParagraph) {\n continue;\n }\n\n return {\n root,\n tableBlockIndex: blockIndex,\n rowIndex,\n cellIndex,\n childIndex,\n paragraph: child,\n paragraphStart: surfaceChild.from,\n };\n }\n }\n }\n\n return \"unsupported\";\n }\n\n return null;\n}\n\nfunction selectionFallsWithinSurfaceRange(\n selectionFrom: number,\n selectionTo: number,\n rangeFrom: number,\n rangeTo: number,\n): boolean {\n if (rangeFrom === rangeTo) {\n return selectionFrom === rangeFrom && selectionTo === rangeTo;\n }\n\n return (\n selectionFrom >= rangeFrom &&\n selectionTo <= rangeTo &&\n selectionFrom < rangeTo\n );\n}\n\nfunction resolveRange(\n selection: SelectionSnapshot,\n storySize: number,\n intent: TextTransactionIntent,\n): { from: number; to: number } {\n const from = Math.max(0, Math.min(selection.anchor, selection.head));\n const to = Math.max(0, Math.max(selection.anchor, selection.head));\n\n if (from > storySize || to > storySize) {\n throw new TextTransactionError(\n \"invalid_selection\",\n `Selection ${from}-${to} exceeds story size ${storySize}.`,\n );\n }\n\n if (intent.type === \"replace\") {\n if (intent.range) {\n const explicitFrom = Math.max(0, Math.min(intent.range.from, intent.range.to));\n const explicitTo = Math.max(0, Math.max(intent.range.from, intent.range.to));\n if (explicitFrom > storySize || explicitTo > storySize) {\n throw new TextTransactionError(\n \"invalid_selection\",\n `Explicit range ${explicitFrom}-${explicitTo} exceeds story size ${storySize}.`,\n );\n }\n\n return {\n from: explicitFrom,\n to: explicitTo,\n };\n }\n\n return { from, to };\n }\n\n if (from !== to) {\n return { from, to };\n }\n\n if (intent.type === \"delete_backward\") {\n return {\n from: Math.max(0, from - 1),\n to: from,\n };\n }\n\n return {\n from,\n to: Math.min(storySize, from + 1),\n };\n}\n\nfunction createInsertionUnits(\n intent: TextTransactionIntent,\n story: TextStory,\n position: number,\n): StoryUnit[] {\n if (intent.type !== \"replace\") {\n return [];\n }\n\n const inheritedProps = resolveParagraphPropertiesAtPosition(story, position);\n\n return intent.insertion.flatMap((entry) => {\n switch (entry.type) {\n case \"text\":\n return Array.from(entry.text).map<StoryUnit>((character) => ({\n kind: \"text\",\n value: character,\n }));\n case \"tab\":\n return [{ kind: \"tab\" }];\n case \"hard_break\":\n return [{ kind: \"hard_break\" }];\n case \"paragraph_break\":\n return [\n {\n kind: \"paragraph_break\",\n nextParagraph: cloneParagraphProperties(inheritedProps),\n },\n ];\n }\n });\n}\n\nfunction resolveParagraphPropertiesAtPosition(\n story: TextStory,\n position: number,\n): ParagraphProperties {\n let current = cloneParagraphProperties(story.firstParagraph);\n\n for (let index = 0; index < Math.min(position, story.units.length); index += 1) {\n const unit = story.units[index];\n if (unit.kind === \"paragraph_break\") {\n current = cloneParagraphProperties(unit.nextParagraph);\n } else if (unit.kind === \"opaque_block\" && unit.nextParagraph) {\n current = cloneParagraphProperties(unit.nextParagraph);\n }\n }\n\n return current;\n}\n\nfunction normalizeStoryUnits(units: StoryUnit[]): StoryUnit[] {\n if (units.length === 0) {\n return [];\n }\n\n const normalized: StoryUnit[] = [];\n\n for (const unit of units) {\n if (\n unit.kind === \"paragraph_break\" &&\n normalized[normalized.length - 1]?.kind === \"paragraph_break\"\n ) {\n normalized.push({\n kind: \"paragraph_break\",\n nextParagraph: cloneParagraphProperties(unit.nextParagraph),\n });\n continue;\n }\n\n normalized.push(cloneStoryUnit(unit));\n }\n\n return normalized;\n}\n\nfunction ensureEditableRange(units: StoryUnit[]): void {\n const protectedUnit = units.find(\n (unit) => unit.kind === \"opaque_inline\" || unit.kind === \"opaque_block\" || unit.kind === \"image\",\n );\n\n if (!protectedUnit) {\n return;\n }\n\n throw new TextTransactionError(\n \"unsupported_content\",\n `Text transaction crosses protected ${protectedUnit.kind} content.`,\n );\n}\n\nfunction containsParagraphBoundaryChange(\n story: TextStory,\n range: { from: number; to: number },\n insertionUnits: StoryUnit[],\n): boolean {\n if (insertionUnits.some((unit) => unit.kind === \"paragraph_break\")) {\n return true;\n }\n\n return story.units\n .slice(range.from, range.to)\n .some((unit) => unit.kind === \"paragraph_break\");\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/legal/bookmarks.ts"],"sourcesContent":["import { extractBookmarksFromBodyXml } from \"../io/ooxml/parse-fields.ts\";\nimport type {\n BookmarkEndNode,\n BookmarkStartNode,\n CanonicalDocument,\n DocumentNode,\n FieldRegistry,\n FieldRegistryEntry,\n} from \"../model/canonical-document.ts\";\n\nexport interface LegalBookmark {\n bookmarkId: string;\n name?: string;\n hidden: boolean;\n source: \"ooxml\" | \"canonical\";\n status: \"paired\" | \"start-only\" | \"end-only\";\n startIndex?: number;\n endIndex?: number;\n}\n\ninterface OpenBookmark {\n bookmarkId: string;\n name?: string;\n hidden: boolean;\n startIndex: number;\n}\n\nexport function parseBookmarksFromDocumentXml(xml: string): LegalBookmark[] {\n const bookmarks = extractBookmarksFromBodyXml(xml);\n const openBookmarks = new Map<string, OpenBookmark[]>();\n const results: LegalBookmark[] = [];\n\n for (let index = 0; index < bookmarks.length; index += 1) {\n const bookmark = bookmarks[index];\n\n if (bookmark.type === \"bookmark_start\") {\n const entry: OpenBookmark = {\n bookmarkId: bookmark.bookmarkId,\n name: bookmark.name,\n hidden: isHiddenBookmarkName(bookmark.name),\n startIndex: index,\n };\n const stack = openBookmarks.get(bookmark.bookmarkId) ?? [];\n stack.push(entry);\n openBookmarks.set(bookmark.bookmarkId, stack);\n continue;\n }\n\n const stack = openBookmarks.get(bookmark.bookmarkId);\n const open = stack?.pop();\n if (stack && stack.length === 0) {\n openBookmarks.delete(bookmark.bookmarkId);\n }\n\n if (open) {\n results.push({\n bookmarkId: bookmark.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"ooxml\",\n status: \"paired\",\n startIndex: open.startIndex,\n endIndex: index,\n });\n continue;\n }\n\n results.push({\n bookmarkId: bookmark.bookmarkId,\n hidden: false,\n source: \"ooxml\",\n status: \"end-only\",\n endIndex: index,\n });\n }\n\n for (const stack of openBookmarks.values()) {\n for (const open of stack) {\n results.push({\n bookmarkId: open.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"ooxml\",\n status: \"start-only\",\n startIndex: open.startIndex,\n });\n }\n }\n\n return results.sort(compareBookmarks);\n}\n\nexport function collectBookmarksFromCanonicalDocument(\n document: Pick<CanonicalDocument, \"content\"> | DocumentNode,\n): LegalBookmark[] {\n const root = \"content\" in document ? document.content : document;\n const sequence: Array<BookmarkStartNode | BookmarkEndNode> = [];\n\n walkDocument(root, (node) => {\n if (node.type === \"bookmark_start\" || node.type === \"bookmark_end\") {\n sequence.push(node);\n }\n });\n\n const openBookmarks = new Map<string, OpenBookmark[]>();\n const results: LegalBookmark[] = [];\n\n for (let index = 0; index < sequence.length; index += 1) {\n const bookmark = sequence[index];\n\n if (bookmark.type === \"bookmark_start\") {\n const entry: OpenBookmark = {\n bookmarkId: bookmark.bookmarkId,\n name: bookmark.name,\n hidden: isHiddenBookmarkName(bookmark.name),\n startIndex: index,\n };\n const stack = openBookmarks.get(bookmark.bookmarkId) ?? [];\n stack.push(entry);\n openBookmarks.set(bookmark.bookmarkId, stack);\n continue;\n }\n\n const stack = openBookmarks.get(bookmark.bookmarkId);\n const open = stack?.pop();\n if (stack && stack.length === 0) {\n openBookmarks.delete(bookmark.bookmarkId);\n }\n\n if (open) {\n results.push({\n bookmarkId: bookmark.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"canonical\",\n status: \"paired\",\n startIndex: open.startIndex,\n endIndex: index,\n });\n continue;\n }\n\n results.push({\n bookmarkId: bookmark.bookmarkId,\n hidden: false,\n source: \"canonical\",\n status: \"end-only\",\n endIndex: index,\n });\n }\n\n for (const stack of openBookmarks.values()) {\n for (const open of stack) {\n results.push({\n bookmarkId: open.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"canonical\",\n status: \"start-only\",\n startIndex: open.startIndex,\n });\n }\n }\n\n return results.sort(compareBookmarks);\n}\n\nexport function isHiddenBookmarkName(name: string | undefined): boolean {\n return Boolean(name && name.startsWith(\"_\"));\n}\n\nexport interface BookmarkIntegrityResult {\n totalCount: number;\n pairedCount: number;\n startOnlyCount: number;\n endOnlyCount: number;\n hiddenCount: number;\n namedCount: number;\n integrityScore: \"complete\" | \"partial\" | \"degraded\";\n}\n\nexport function assessBookmarkIntegrity(bookmarks: LegalBookmark[]): BookmarkIntegrityResult {\n const pairedCount = bookmarks.filter((b) => b.status === \"paired\").length;\n const startOnlyCount = bookmarks.filter((b) => b.status === \"start-only\").length;\n const endOnlyCount = bookmarks.filter((b) => b.status === \"end-only\").length;\n const hiddenCount = bookmarks.filter((b) => b.hidden).length;\n const namedCount = bookmarks.filter((b) => b.name && !b.hidden).length;\n const totalCount = bookmarks.length;\n const unpairedCount = startOnlyCount + endOnlyCount;\n\n return {\n totalCount,\n pairedCount,\n startOnlyCount,\n endOnlyCount,\n hiddenCount,\n namedCount,\n integrityScore:\n unpairedCount === 0\n ? \"complete\"\n : unpairedCount <= pairedCount\n ? \"partial\"\n : \"degraded\",\n };\n}\n\nfunction compareBookmarks(left: LegalBookmark, right: LegalBookmark): number {\n return (\n (left.startIndex ?? left.endIndex ?? Number.MAX_SAFE_INTEGER) -\n (right.startIndex ?? right.endIndex ?? Number.MAX_SAFE_INTEGER) ||\n left.bookmarkId.localeCompare(right.bookmarkId)\n );\n}\n\n/**\n * Build a lookup map from bookmark name to bookmarkId for the document.\n * Used by the field refresh runtime to resolve REF/PAGEREF/NOTEREF targets.\n */\nexport function buildBookmarkNameMap(\n document: Pick<CanonicalDocument, \"content\"> | DocumentNode,\n): Map<string, { bookmarkId: string; paragraphIndex: number }> {\n const root = \"content\" in document ? document.content : document;\n const map = new Map<string, { bookmarkId: string; paragraphIndex: number }>();\n let paragraphIndex = -1;\n\n walkDocument(root, (node) => {\n if (node.type === \"paragraph\") {\n paragraphIndex += 1;\n }\n if (node.type === \"bookmark_start\" && node.name) {\n map.set(node.name, { bookmarkId: node.bookmarkId, paragraphIndex });\n }\n });\n\n return map;\n}\n\n/**\n * Resolve field-to-bookmark dependencies from a field registry.\n * Returns a map of bookmark names to the field entries that reference them.\n * This enables the runtime to determine which fields need refresh when\n * a bookmark's content changes.\n */\nexport function resolveBookmarkFieldDependencies(\n registry: FieldRegistry,\n): Map<string, FieldRegistryEntry[]> {\n const deps = new Map<string, FieldRegistryEntry[]>();\n for (const entry of registry.supported) {\n if (!entry.fieldTarget) continue;\n const existing = deps.get(entry.fieldTarget) ?? [];\n existing.push(entry);\n deps.set(entry.fieldTarget, existing);\n }\n return deps;\n}\n\nfunction walkDocument(node: DocumentNode, visit: (node: DocumentNode) => void): void {\n visit(node);\n\n if (\"children\" in node && Array.isArray(node.children)) {\n for (const child of node.children) {\n walkDocument(child, visit);\n }\n }\n\n if (node.type === \"table\") {\n for (const row of node.rows) {\n walkDocument(row, visit);\n }\n } else if (node.type === \"table_row\") {\n for (const cell of node.cells) {\n walkDocument(cell, visit);\n }\n }\n}\n"],"mappings":"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","names":["stack"]}
@@ -1,117 +0,0 @@
1
- // src/preservation/store.ts
2
- function getOpaqueFragment(store, fragmentId) {
3
- return normalizeOpaqueFragmentMap(store)[fragmentId];
4
- }
5
- function listOpaqueFragments(store) {
6
- return Object.values(normalizeOpaqueFragmentMap(store)).sort((left, right) => {
7
- return left.lastKnownRange.from - right.lastKnownRange.from || left.fragmentId.localeCompare(right.fragmentId);
8
- });
9
- }
10
- function listPreservedPackageParts(store) {
11
- return Object.values(normalizePackagePartMap(store)).sort(
12
- (left, right) => left.packagePartName.localeCompare(right.packagePartName)
13
- );
14
- }
15
- function findOpaqueFragmentsIntersectingRange(store, range) {
16
- return listOpaqueFragments(store).filter(
17
- (fragment) => rangesIntersect(fragment.lastKnownRange, range)
18
- );
19
- }
20
- function describeOpaqueFragment(fragment) {
21
- const xml = fragment.payloadReference;
22
- const detail = createDetail(fragment);
23
- if (/\b(?:w:)?sectPr\b/u.test(xml)) {
24
- return {
25
- featureKey: "sections",
26
- label: "Section properties",
27
- detail
28
- };
29
- }
30
- if (/\b(?:w:)?tbl\b/u.test(xml)) {
31
- return {
32
- featureKey: "tables",
33
- label: "Preserved table structure",
34
- detail
35
- };
36
- }
37
- if (/\b(?:w:)?hdr\b|\b(?:w:)?ftr\b/u.test(xml)) {
38
- return {
39
- featureKey: "headers-footers",
40
- label: "Header or footer content",
41
- detail
42
- };
43
- }
44
- if (/\b(?:w:)?fldSimple\b|\b(?:w:)?fldChar\b|\b(?:w:)?instrText\b/u.test(xml)) {
45
- return {
46
- featureKey: "fields",
47
- label: "Word field content",
48
- detail
49
- };
50
- }
51
- if (/\b(?:w:)?sdt\b/u.test(xml)) {
52
- return {
53
- featureKey: "content-controls",
54
- label: "Content control",
55
- detail
56
- };
57
- }
58
- if (/\b(?:w:)?customXml\b/u.test(xml)) {
59
- return {
60
- featureKey: "custom-xml",
61
- label: "Custom XML wrapper",
62
- detail
63
- };
64
- }
65
- if (/\b(?:w:)?altChunk\b/u.test(xml)) {
66
- return {
67
- featureKey: "alt-chunk",
68
- label: "Alternate content import",
69
- detail
70
- };
71
- }
72
- if (/\b(?:w:)?object\b|\b(?:o:)?OLEObject\b/u.test(xml)) {
73
- return {
74
- featureKey: "embedded-objects",
75
- label: "Embedded object",
76
- detail
77
- };
78
- }
79
- if (/\b(?:mc:)?AlternateContent\b/u.test(xml)) {
80
- return {
81
- featureKey: "alternate-content",
82
- label: "Markup compatibility block",
83
- detail
84
- };
85
- }
86
- return {
87
- featureKey: "unknown-ooxml",
88
- label: "Unsupported OOXML fragment",
89
- detail
90
- };
91
- }
92
- function createDetail(fragment) {
93
- const detail = [
94
- `Preserved whole-unit from ${fragment.lastKnownRange.from}-${fragment.lastKnownRange.to}.`,
95
- fragment.packagePartName ? `Part ${fragment.packagePartName}.` : null,
96
- fragment.relationshipId ? `Relationship ${fragment.relationshipId}.` : null
97
- ].filter(Boolean).join(" ");
98
- return detail.length > 0 ? detail : "Preserved whole-unit to keep unsupported OOXML intact.";
99
- }
100
- function rangesIntersect(left, right) {
101
- return left.from < right.to && right.from < left.to;
102
- }
103
- function normalizeOpaqueFragmentMap(store) {
104
- return store && typeof store === "object" && store.opaqueFragments && typeof store.opaqueFragments === "object" ? store.opaqueFragments : {};
105
- }
106
- function normalizePackagePartMap(store) {
107
- return store && typeof store === "object" && store.packageParts && typeof store.packageParts === "object" ? store.packageParts : {};
108
- }
109
-
110
- export {
111
- getOpaqueFragment,
112
- listOpaqueFragments,
113
- listPreservedPackageParts,
114
- findOpaqueFragmentsIntersectingRange,
115
- describeOpaqueFragment
116
- };
117
- //# sourceMappingURL=chunk-SWKWQZXM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/preservation/store.ts"],"sourcesContent":["import type {\n DocRange,\n OpaqueFragmentRecord,\n PreservationStore,\n PreservedPackagePart,\n} from \"../model/canonical-document.ts\";\n\nexport interface OpaqueFragmentDescriptor {\n featureKey:\n | \"sections\"\n | \"tables\"\n | \"headers-footers\"\n | \"fields\"\n | \"content-controls\"\n | \"custom-xml\"\n | \"alt-chunk\"\n | \"embedded-objects\"\n | \"alternate-content\"\n | \"unknown-ooxml\";\n label: string;\n detail: string;\n}\n\nexport function createPreservationStore(\n seed?: Partial<PreservationStore>,\n): PreservationStore {\n return {\n opaqueFragments: { ...(seed?.opaqueFragments ?? {}) },\n packageParts: { ...(seed?.packageParts ?? {}) },\n };\n}\n\nexport function getOpaqueFragment(\n store: PreservationStore,\n fragmentId: string,\n): OpaqueFragmentRecord | undefined {\n return normalizeOpaqueFragmentMap(store)[fragmentId];\n}\n\nexport function listOpaqueFragments(\n store: PreservationStore,\n): OpaqueFragmentRecord[] {\n return Object.values(normalizeOpaqueFragmentMap(store)).sort((left, right) => {\n return (\n left.lastKnownRange.from - right.lastKnownRange.from ||\n left.fragmentId.localeCompare(right.fragmentId)\n );\n });\n}\n\nexport function listPreservedPackageParts(\n store: PreservationStore,\n): PreservedPackagePart[] {\n return Object.values(normalizePackagePartMap(store)).sort((left, right) =>\n left.packagePartName.localeCompare(right.packagePartName),\n );\n}\n\nexport function findOpaqueFragmentsIntersectingRange(\n store: PreservationStore,\n range: DocRange,\n): OpaqueFragmentRecord[] {\n return listOpaqueFragments(store).filter((fragment) =>\n rangesIntersect(fragment.lastKnownRange, range),\n );\n}\n\nexport function describeOpaqueFragment(\n fragment: OpaqueFragmentRecord,\n): OpaqueFragmentDescriptor {\n const xml = fragment.payloadReference;\n const detail = createDetail(fragment);\n\n if (/\\b(?:w:)?sectPr\\b/u.test(xml)) {\n return {\n featureKey: \"sections\",\n label: \"Section properties\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?tbl\\b/u.test(xml)) {\n return {\n featureKey: \"tables\",\n label: \"Preserved table structure\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?hdr\\b|\\b(?:w:)?ftr\\b/u.test(xml)) {\n return {\n featureKey: \"headers-footers\",\n label: \"Header or footer content\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?fldSimple\\b|\\b(?:w:)?fldChar\\b|\\b(?:w:)?instrText\\b/u.test(xml)) {\n return {\n featureKey: \"fields\",\n label: \"Word field content\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?sdt\\b/u.test(xml)) {\n return {\n featureKey: \"content-controls\",\n label: \"Content control\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?customXml\\b/u.test(xml)) {\n return {\n featureKey: \"custom-xml\",\n label: \"Custom XML wrapper\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?altChunk\\b/u.test(xml)) {\n return {\n featureKey: \"alt-chunk\",\n label: \"Alternate content import\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?object\\b|\\b(?:o:)?OLEObject\\b/u.test(xml)) {\n return {\n featureKey: \"embedded-objects\",\n label: \"Embedded object\",\n detail,\n };\n }\n\n if (/\\b(?:mc:)?AlternateContent\\b/u.test(xml)) {\n return {\n featureKey: \"alternate-content\",\n label: \"Markup compatibility block\",\n detail,\n };\n }\n\n return {\n featureKey: \"unknown-ooxml\",\n label: \"Unsupported OOXML fragment\",\n detail,\n };\n}\n\nfunction createDetail(fragment: OpaqueFragmentRecord): string {\n const detail = [\n `Preserved whole-unit from ${fragment.lastKnownRange.from}-${fragment.lastKnownRange.to}.`,\n fragment.packagePartName ? `Part ${fragment.packagePartName}.` : null,\n fragment.relationshipId ? `Relationship ${fragment.relationshipId}.` : null,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return detail.length > 0\n ? detail\n : \"Preserved whole-unit to keep unsupported OOXML intact.\";\n}\n\nfunction rangesIntersect(left: DocRange, right: DocRange): boolean {\n return left.from < right.to && right.from < left.to;\n}\n\nfunction normalizeOpaqueFragmentMap(\n store: PreservationStore,\n): Record<string, OpaqueFragmentRecord> {\n return store && typeof store === \"object\" && store.opaqueFragments && typeof store.opaqueFragments === \"object\"\n ? (store.opaqueFragments as Record<string, OpaqueFragmentRecord>)\n : {};\n}\n\nfunction normalizePackagePartMap(\n store: PreservationStore,\n): Record<string, PreservedPackagePart> {\n return store && typeof store === \"object\" && store.packageParts && typeof store.packageParts === \"object\"\n ? (store.packageParts as Record<string, PreservedPackagePart>)\n : {};\n}\n"],"mappings":"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","names":[]}