@beyondwork/docx-react-component 1.0.29 → 1.0.30

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 (381) 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/review-queue-bar.tsx +97 -0
  180. package/src/ui-tailwind/chrome/tw-alert-banner.tsx +64 -0
  181. package/src/ui-tailwind/chrome/tw-context-analytics-summary.tsx +122 -0
  182. package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +121 -0
  183. package/src/ui-tailwind/chrome/tw-layout-panel.tsx +114 -0
  184. package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +30 -0
  185. package/src/ui-tailwind/chrome/tw-page-ruler.tsx +365 -0
  186. package/src/ui-tailwind/chrome/tw-selection-tool-blocked.tsx +23 -0
  187. package/src/ui-tailwind/chrome/tw-selection-tool-comment.tsx +35 -0
  188. package/src/ui-tailwind/chrome/tw-selection-tool-formatting.tsx +37 -0
  189. package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +298 -0
  190. package/src/ui-tailwind/chrome/tw-selection-tool-structure.tsx +116 -0
  191. package/src/ui-tailwind/chrome/tw-selection-tool-suggestion.tsx +29 -0
  192. package/src/ui-tailwind/chrome/tw-selection-tool-workflow.tsx +27 -0
  193. package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +186 -0
  194. package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +139 -0
  195. package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +200 -0
  196. package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +58 -0
  197. package/src/ui-tailwind/chrome/use-before-unload.ts +20 -0
  198. package/src/ui-tailwind/editor-surface/perf-probe.ts +179 -0
  199. package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +189 -0
  200. package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +31 -0
  201. package/src/ui-tailwind/editor-surface/pm-decorations.ts +411 -0
  202. package/src/ui-tailwind/editor-surface/pm-position-map.ts +123 -0
  203. package/src/ui-tailwind/editor-surface/pm-schema.ts +927 -0
  204. package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +567 -0
  205. package/src/ui-tailwind/editor-surface/search-plugin.ts +168 -0
  206. package/src/ui-tailwind/editor-surface/surface-build-keys.ts +65 -0
  207. package/src/ui-tailwind/editor-surface/tw-caret.tsx +12 -0
  208. package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +150 -0
  209. package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +129 -0
  210. package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +58 -0
  211. package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +151 -0
  212. package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +1047 -0
  213. package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +111 -0
  214. package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +503 -0
  215. package/src/ui-tailwind/index.ts +62 -0
  216. package/src/ui-tailwind/page-chrome-model.ts +27 -0
  217. package/src/ui-tailwind/review/tw-comment-sidebar.tsx +406 -0
  218. package/src/ui-tailwind/review/tw-health-panel.tsx +149 -0
  219. package/src/ui-tailwind/review/tw-review-rail.tsx +122 -0
  220. package/src/ui-tailwind/review/tw-revision-sidebar.tsx +164 -0
  221. package/src/ui-tailwind/status/tw-status-bar.tsx +65 -0
  222. package/{dist → src}/ui-tailwind/theme/editor-theme.css +58 -40
  223. package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +52 -0
  224. package/src/ui-tailwind/toolbar/tw-toolbar.tsx +1133 -0
  225. package/src/ui-tailwind/tw-review-workspace.tsx +1460 -0
  226. package/src/validation/README.md +3 -0
  227. package/src/validation/compatibility-engine.ts +878 -0
  228. package/src/validation/compatibility-report.ts +161 -0
  229. package/src/validation/diagnostics.ts +204 -0
  230. package/src/validation/docx-comment-proof.ts +720 -0
  231. package/src/validation/import-diagnostics.ts +128 -0
  232. package/src/validation/low-priority-word-surfaces.ts +373 -0
  233. package/dist/canonical-document-BLEbzL2J.d.cts +0 -844
  234. package/dist/canonical-document-BLEbzL2J.d.ts +0 -844
  235. package/dist/chunk-2FJS5GZM.js +0 -763
  236. package/dist/chunk-2FJS5GZM.js.map +0 -1
  237. package/dist/chunk-2OQBZS3F.js +0 -446
  238. package/dist/chunk-2OQBZS3F.js.map +0 -1
  239. package/dist/chunk-2S7W4KFO.js +0 -127
  240. package/dist/chunk-2S7W4KFO.js.map +0 -1
  241. package/dist/chunk-2TG72QSW.js +0 -3874
  242. package/dist/chunk-2TG72QSW.js.map +0 -1
  243. package/dist/chunk-36QNIZBO.js +0 -532
  244. package/dist/chunk-36QNIZBO.js.map +0 -1
  245. package/dist/chunk-4AQOYAW4.js +0 -3069
  246. package/dist/chunk-4AQOYAW4.js.map +0 -1
  247. package/dist/chunk-4D5EWJ3P.js +0 -77
  248. package/dist/chunk-4D5EWJ3P.js.map +0 -1
  249. package/dist/chunk-5FN54NDH.js +0 -2257
  250. package/dist/chunk-5FN54NDH.js.map +0 -1
  251. package/dist/chunk-BOYGQYRQ.js +0 -7306
  252. package/dist/chunk-BOYGQYRQ.js.map +0 -1
  253. package/dist/chunk-CN3XMECL.js +0 -212
  254. package/dist/chunk-CN3XMECL.js.map +0 -1
  255. package/dist/chunk-EBI3BX6U.js +0 -164
  256. package/dist/chunk-EBI3BX6U.js.map +0 -1
  257. package/dist/chunk-EILUG3VB.js +0 -1275
  258. package/dist/chunk-EILUG3VB.js.map +0 -1
  259. package/dist/chunk-FUDY333O.js +0 -70
  260. package/dist/chunk-FUDY333O.js.map +0 -1
  261. package/dist/chunk-GBVOWFIK.js +0 -1237
  262. package/dist/chunk-GBVOWFIK.js.map +0 -1
  263. package/dist/chunk-H4TQ3H3Y.js +0 -262
  264. package/dist/chunk-H4TQ3H3Y.js.map +0 -1
  265. package/dist/chunk-JGB3IXZO.js +0 -189
  266. package/dist/chunk-JGB3IXZO.js.map +0 -1
  267. package/dist/chunk-KD2QRQPY.js +0 -4342
  268. package/dist/chunk-KD2QRQPY.js.map +0 -1
  269. package/dist/chunk-KLMXQVYK.js +0 -369
  270. package/dist/chunk-KLMXQVYK.js.map +0 -1
  271. package/dist/chunk-KZUG5KFQ.js +0 -214
  272. package/dist/chunk-KZUG5KFQ.js.map +0 -1
  273. package/dist/chunk-QDAQ4CJU.js +0 -345
  274. package/dist/chunk-QDAQ4CJU.js.map +0 -1
  275. package/dist/chunk-RMH72RZI.js.map +0 -1
  276. package/dist/chunk-SWKWQZXM.js +0 -117
  277. package/dist/chunk-SWKWQZXM.js.map +0 -1
  278. package/dist/chunk-TJBP2K4T.js.map +0 -1
  279. package/dist/chunk-TLCEAQDQ.js +0 -542
  280. package/dist/chunk-TLCEAQDQ.js.map +0 -1
  281. package/dist/chunk-UZXBISGO.js.map +0 -1
  282. package/dist/chunk-WGBAKP3Q.js +0 -3220
  283. package/dist/chunk-WGBAKP3Q.js.map +0 -1
  284. package/dist/compare/index.cjs +0 -5475
  285. package/dist/compare/index.cjs.map +0 -1
  286. package/dist/compare/index.d.cts +0 -114
  287. package/dist/compare/index.d.ts +0 -114
  288. package/dist/compare/index.js +0 -731
  289. package/dist/compare/index.js.map +0 -1
  290. package/dist/core/commands/formatting-commands.cjs +0 -828
  291. package/dist/core/commands/formatting-commands.cjs.map +0 -1
  292. package/dist/core/commands/formatting-commands.d.cts +0 -63
  293. package/dist/core/commands/formatting-commands.d.ts +0 -63
  294. package/dist/core/commands/formatting-commands.js +0 -37
  295. package/dist/core/commands/formatting-commands.js.map +0 -1
  296. package/dist/core/commands/image-commands.cjs +0 -2023
  297. package/dist/core/commands/image-commands.cjs.map +0 -1
  298. package/dist/core/commands/image-commands.d.cts +0 -58
  299. package/dist/core/commands/image-commands.d.ts +0 -58
  300. package/dist/core/commands/image-commands.js +0 -18
  301. package/dist/core/commands/image-commands.js.map +0 -1
  302. package/dist/core/commands/section-layout-commands.cjs.map +0 -1
  303. package/dist/core/commands/section-layout-commands.d.cts +0 -62
  304. package/dist/core/commands/section-layout-commands.d.ts +0 -62
  305. package/dist/core/commands/section-layout-commands.js +0 -21
  306. package/dist/core/commands/section-layout-commands.js.map +0 -1
  307. package/dist/core/commands/style-commands.cjs.map +0 -1
  308. package/dist/core/commands/style-commands.d.cts +0 -13
  309. package/dist/core/commands/style-commands.d.ts +0 -13
  310. package/dist/core/commands/style-commands.js +0 -9
  311. package/dist/core/commands/style-commands.js.map +0 -1
  312. package/dist/core/commands/table-structure-commands.cjs +0 -1883
  313. package/dist/core/commands/table-structure-commands.cjs.map +0 -1
  314. package/dist/core/commands/table-structure-commands.d.cts +0 -59
  315. package/dist/core/commands/table-structure-commands.d.ts +0 -59
  316. package/dist/core/commands/table-structure-commands.js +0 -12
  317. package/dist/core/commands/table-structure-commands.js.map +0 -1
  318. package/dist/core/commands/text-commands.cjs +0 -2391
  319. package/dist/core/commands/text-commands.cjs.map +0 -1
  320. package/dist/core/commands/text-commands.d.cts +0 -24
  321. package/dist/core/commands/text-commands.d.ts +0 -24
  322. package/dist/core/commands/text-commands.js +0 -28
  323. package/dist/core/commands/text-commands.js.map +0 -1
  324. package/dist/core/selection/mapping.cjs +0 -200
  325. package/dist/core/selection/mapping.cjs.map +0 -1
  326. package/dist/core/selection/mapping.d.cts +0 -2
  327. package/dist/core/selection/mapping.d.ts +0 -2
  328. package/dist/core/selection/mapping.js +0 -31
  329. package/dist/core/selection/mapping.js.map +0 -1
  330. package/dist/core/state/editor-state.cjs +0 -2278
  331. package/dist/core/state/editor-state.cjs.map +0 -1
  332. package/dist/core/state/editor-state.d.cts +0 -2
  333. package/dist/core/state/editor-state.d.ts +0 -2
  334. package/dist/core/state/editor-state.js +0 -26
  335. package/dist/core/state/editor-state.js.map +0 -1
  336. package/dist/index.cjs +0 -38553
  337. package/dist/index.cjs.map +0 -1
  338. package/dist/index.d.cts +0 -15
  339. package/dist/index.d.ts +0 -15
  340. package/dist/index.js +0 -7856
  341. package/dist/index.js.map +0 -1
  342. package/dist/io/docx-session.cjs +0 -16236
  343. package/dist/io/docx-session.cjs.map +0 -1
  344. package/dist/io/docx-session.d.cts +0 -21
  345. package/dist/io/docx-session.d.ts +0 -21
  346. package/dist/io/docx-session.js +0 -18
  347. package/dist/io/docx-session.js.map +0 -1
  348. package/dist/legal/index.cjs +0 -3900
  349. package/dist/legal/index.cjs.map +0 -1
  350. package/dist/legal/index.d.cts +0 -86
  351. package/dist/legal/index.d.ts +0 -86
  352. package/dist/legal/index.js +0 -616
  353. package/dist/legal/index.js.map +0 -1
  354. package/dist/public-types-7ZL_94cz.d.ts +0 -1573
  355. package/dist/public-types-CeMaDueh.d.cts +0 -1573
  356. package/dist/public-types.cjs +0 -19
  357. package/dist/public-types.cjs.map +0 -1
  358. package/dist/public-types.d.cts +0 -2
  359. package/dist/public-types.d.ts +0 -2
  360. package/dist/public-types.js +0 -1
  361. package/dist/public-types.js.map +0 -1
  362. package/dist/runtime/document-runtime.cjs +0 -11140
  363. package/dist/runtime/document-runtime.cjs.map +0 -1
  364. package/dist/runtime/document-runtime.d.cts +0 -231
  365. package/dist/runtime/document-runtime.d.ts +0 -231
  366. package/dist/runtime/document-runtime.js +0 -21
  367. package/dist/runtime/document-runtime.js.map +0 -1
  368. package/dist/structural-helpers-CilgOVhh.d.cts +0 -10
  369. package/dist/structural-helpers-q0Gd-eBN.d.ts +0 -10
  370. package/dist/ui-tailwind/editor-surface/search-plugin.cjs +0 -313
  371. package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +0 -1
  372. package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +0 -67
  373. package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +0 -67
  374. package/dist/ui-tailwind/editor-surface/search-plugin.js +0 -23
  375. package/dist/ui-tailwind/editor-surface/search-plugin.js.map +0 -1
  376. package/dist/ui-tailwind/index.cjs +0 -4833
  377. package/dist/ui-tailwind/index.cjs.map +0 -1
  378. package/dist/ui-tailwind/index.d.cts +0 -617
  379. package/dist/ui-tailwind/index.d.ts +0 -617
  380. package/dist/ui-tailwind/index.js +0 -575
  381. 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":[]}