@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
@@ -0,0 +1,365 @@
1
+ import React, { useEffect, useMemo, useRef, useState } from "react";
2
+
3
+ import type {
4
+ EditorViewStateSnapshot,
5
+ PageLayoutSnapshot,
6
+ } from "../../api/public-types";
7
+
8
+ interface ActiveParagraphLayout {
9
+ leftIndent: number;
10
+ rightIndent: number;
11
+ firstLineOffset: number;
12
+ tabStops: Array<{ pos: number; val?: string; leader?: string }>;
13
+ indentationReadOnly?: boolean;
14
+ tabStopsReadOnly?: boolean;
15
+ }
16
+
17
+ export interface TwPageRulerProps {
18
+ pageLayout: PageLayoutSnapshot;
19
+ viewState: EditorViewStateSnapshot;
20
+ paragraphLayout: ActiveParagraphLayout | null;
21
+ readOnly: boolean;
22
+ onReturnToBody: () => void;
23
+ onOpenHeader?: () => void;
24
+ onOpenFooter?: () => void;
25
+ onSetIndentation?: (indentation: {
26
+ left?: number;
27
+ right?: number;
28
+ firstLine?: number;
29
+ hanging?: number;
30
+ }) => void;
31
+ onSetTabStops?: (tabStops: Array<{ pos: number; val?: string; leader?: string }>) => void;
32
+ onRestartNumbering?: () => void;
33
+ onContinueNumbering?: () => void;
34
+ }
35
+
36
+ type DragKind = "left-indent" | "first-line";
37
+
38
+ const MIN_HANDLE_TWIPS = 0;
39
+ const HANDLE_OVERLAP_THRESHOLD_PERCENT = 1.4;
40
+ const HANDLE_OFFSET_PERCENT = 0.9;
41
+ const MARKER_HALF_PX = 8;
42
+
43
+ export function TwPageRuler(props: TwPageRulerProps) {
44
+ const trackRef = useRef<HTMLDivElement | null>(null);
45
+ const dragCleanupRef = useRef<(() => void) | null>(null);
46
+ const [, setDragState] = useState<{
47
+ kind: DragKind;
48
+ startClientX: number;
49
+ startLeftIndent: number;
50
+ startFirstLineOffset: number;
51
+ } | null>(null);
52
+ const [previewLayout, setPreviewLayout] = useState<ActiveParagraphLayout | null>(null);
53
+
54
+ const effectiveLayout = previewLayout ?? props.paragraphLayout;
55
+ const activeRegion = props.viewState.activePageRegion?.region ?? "body";
56
+ const isBodyParagraphContext =
57
+ activeRegion === "body" && Boolean(props.paragraphLayout);
58
+ const indentationReadOnly = props.readOnly || Boolean(props.paragraphLayout?.indentationReadOnly);
59
+ const tabStopsReadOnly = props.readOnly || Boolean(props.paragraphLayout?.tabStopsReadOnly);
60
+ const availableHeader = props.pageLayout.headerVariants[0];
61
+ const availableFooter = props.pageLayout.footerVariants[0];
62
+
63
+ const usablePageWidth = Math.max(
64
+ 1440,
65
+ props.pageLayout.pageWidth - props.pageLayout.marginLeft - props.pageLayout.marginRight,
66
+ );
67
+
68
+ useEffect(() => {
69
+ return () => {
70
+ dragCleanupRef.current?.();
71
+ };
72
+ }, []);
73
+
74
+ function beginDrag(kind: DragKind, clientX: number): void {
75
+ if (!isBodyParagraphContext || !props.paragraphLayout || indentationReadOnly) {
76
+ return;
77
+ }
78
+
79
+ dragCleanupRef.current?.();
80
+ const activeDrag = {
81
+ kind,
82
+ startClientX: clientX,
83
+ startLeftIndent: props.paragraphLayout.leftIndent,
84
+ startFirstLineOffset: props.paragraphLayout.firstLineOffset,
85
+ };
86
+ setDragState(activeDrag);
87
+
88
+ const handleMouseMove = (event: MouseEvent): void => {
89
+ const track = trackRef.current;
90
+ if (!track) {
91
+ return;
92
+ }
93
+ const rect = track.getBoundingClientRect();
94
+ const deltaPx = event.clientX - activeDrag.startClientX;
95
+ const deltaTwips = pxToTwips(deltaPx, rect.width, usablePageWidth);
96
+
97
+ if (activeDrag.kind === "left-indent") {
98
+ setPreviewLayout({
99
+ ...props.paragraphLayout!,
100
+ leftIndent: clampTwips(activeDrag.startLeftIndent + deltaTwips),
101
+ firstLineOffset: activeDrag.startFirstLineOffset,
102
+ });
103
+ return;
104
+ }
105
+
106
+ setPreviewLayout({
107
+ ...props.paragraphLayout!,
108
+ leftIndent: activeDrag.startLeftIndent,
109
+ firstLineOffset: activeDrag.startFirstLineOffset + deltaTwips,
110
+ });
111
+ };
112
+
113
+ const handleMouseUp = (event: MouseEvent): void => {
114
+ const track = trackRef.current;
115
+ if (!track || !props.onSetIndentation) {
116
+ cleanupDrag();
117
+ setDragState(null);
118
+ setPreviewLayout(null);
119
+ return;
120
+ }
121
+
122
+ const rect = track.getBoundingClientRect();
123
+ const deltaPx = event.clientX - activeDrag.startClientX;
124
+ const deltaTwips = pxToTwips(deltaPx, rect.width, usablePageWidth);
125
+ const leftIndent =
126
+ activeDrag.kind === "left-indent"
127
+ ? clampTwips(activeDrag.startLeftIndent + deltaTwips)
128
+ : activeDrag.startLeftIndent;
129
+ const firstLineOffset =
130
+ activeDrag.kind === "first-line"
131
+ ? activeDrag.startFirstLineOffset + deltaTwips
132
+ : activeDrag.startFirstLineOffset;
133
+
134
+ cleanupDrag();
135
+ props.onSetIndentation(
136
+ composeIndentation(leftIndent, effectiveLayout?.rightIndent ?? props.paragraphLayout?.rightIndent ?? 0, firstLineOffset),
137
+ );
138
+ setDragState(null);
139
+ setPreviewLayout(null);
140
+ };
141
+
142
+ const cleanupDrag = (): void => {
143
+ window.removeEventListener("mousemove", handleMouseMove);
144
+ window.removeEventListener("mouseup", handleMouseUp);
145
+ if (dragCleanupRef.current === cleanupDrag) {
146
+ dragCleanupRef.current = null;
147
+ }
148
+ };
149
+
150
+ dragCleanupRef.current = cleanupDrag;
151
+ window.addEventListener("mousemove", handleMouseMove);
152
+ window.addEventListener("mouseup", handleMouseUp);
153
+ }
154
+
155
+ const markerLayout = useMemo(() => {
156
+ if (!effectiveLayout || !isBodyParagraphContext) {
157
+ return null;
158
+ }
159
+ return {
160
+ leftIndent: twipsToPercent(effectiveLayout.leftIndent, usablePageWidth),
161
+ firstLine: twipsToPercent(
162
+ Math.max(MIN_HANDLE_TWIPS, effectiveLayout.leftIndent + effectiveLayout.firstLineOffset),
163
+ usablePageWidth,
164
+ ),
165
+ tabStops: effectiveLayout.tabStops.map((tabStop, index) => ({
166
+ id: `${tabStop.pos}-${index}`,
167
+ left: twipsToPercent(tabStop.pos, usablePageWidth),
168
+ })),
169
+ };
170
+ }, [effectiveLayout, isBodyParagraphContext, usablePageWidth]);
171
+ const handlesOverlap = markerLayout
172
+ ? Math.abs(markerLayout.leftIndent - markerLayout.firstLine) < HANDLE_OVERLAP_THRESHOLD_PERCENT
173
+ : false;
174
+ const leftIndentHandleLeft = markerLayout
175
+ ? offsetHandlePercent(markerLayout.leftIndent, handlesOverlap ? -HANDLE_OFFSET_PERCENT : 0)
176
+ : 0;
177
+ const firstLineHandleLeft = markerLayout
178
+ ? offsetHandlePercent(markerLayout.firstLine, handlesOverlap ? HANDLE_OFFSET_PERCENT : 0)
179
+ : 0;
180
+
181
+ return (
182
+ <div
183
+ aria-label="Page ruler"
184
+ className="mb-4 rounded-2xl border border-border bg-surface/80 px-4 py-3 shadow-sm"
185
+ >
186
+ <div className="mb-3 flex flex-wrap items-center gap-2">
187
+ <button
188
+ type="button"
189
+ aria-label="Return to document body"
190
+ title="Return to document body"
191
+ onClick={props.onReturnToBody}
192
+ className={regionButtonClass(activeRegion === "body")}
193
+ >
194
+ Body
195
+ </button>
196
+ {availableHeader ? (
197
+ <button
198
+ type="button"
199
+ aria-label="Open header story"
200
+ title="Open header story"
201
+ onClick={props.onOpenHeader}
202
+ className={regionButtonClass(activeRegion === "header")}
203
+ >
204
+ Header
205
+ </button>
206
+ ) : null}
207
+ {availableFooter ? (
208
+ <button
209
+ type="button"
210
+ aria-label="Open footer story"
211
+ title="Open footer story"
212
+ onClick={props.onOpenFooter}
213
+ className={regionButtonClass(activeRegion === "footer")}
214
+ >
215
+ Footer
216
+ </button>
217
+ ) : null}
218
+ </div>
219
+
220
+ <div
221
+ className="mb-2 flex items-center justify-between"
222
+ aria-label={`Section ${props.pageLayout.sectionIndex + 1}, ${props.pageLayout.orientation}`}
223
+ title={`Section ${props.pageLayout.sectionIndex + 1} · ${props.pageLayout.orientation}`}
224
+ >
225
+ <span className="sr-only">Page ruler</span>
226
+ </div>
227
+
228
+ <div
229
+ ref={trackRef}
230
+ aria-label="Page ruler track"
231
+ className="relative h-14 overflow-hidden rounded-xl border border-border bg-canvas"
232
+ onClick={(event) => {
233
+ if (
234
+ tabStopsReadOnly ||
235
+ !isBodyParagraphContext ||
236
+ !props.paragraphLayout ||
237
+ !props.onSetTabStops
238
+ ) {
239
+ return;
240
+ }
241
+ if ((event.target as HTMLElement).dataset.handle === "true") {
242
+ return;
243
+ }
244
+ const rect = event.currentTarget.getBoundingClientRect();
245
+ const nextPos = clampTwips(pxToTwips(event.clientX - rect.left, rect.width, usablePageWidth));
246
+ props.onSetTabStops(
247
+ [...props.paragraphLayout.tabStops, { pos: nextPos, val: "left" }]
248
+ .sort((left, right) => left.pos - right.pos),
249
+ );
250
+ }}
251
+ >
252
+ <div className="absolute inset-x-4 top-2 h-px bg-border" />
253
+ <div className="absolute inset-x-4 top-7 h-px bg-border/70" />
254
+ {Array.from({ length: 8 }, (_, index) => (
255
+ <div
256
+ key={`tick-${index}`}
257
+ className="absolute top-1 h-3 w-px bg-border/80"
258
+ style={{ left: `${12 + index * 12}%` }}
259
+ />
260
+ ))}
261
+
262
+ {markerLayout ? (
263
+ <>
264
+ <button
265
+ type="button"
266
+ data-handle="true"
267
+ aria-label="Left indent handle"
268
+ title={`Left indent: ${effectiveLayout?.leftIndent ?? 0} twips`}
269
+ disabled={indentationReadOnly}
270
+ className={`absolute top-8 h-4 w-4 -translate-x-1/2 rounded-[5px] border border-accent/40 bg-accent-soft shadow-sm transition-opacity ${
271
+ handlesOverlap ? "opacity-80 z-10" : ""
272
+ }`}
273
+ style={{ left: markerLeftStyle(leftIndentHandleLeft) }}
274
+ onMouseDown={(event) => {
275
+ event.preventDefault();
276
+ beginDrag("left-indent", event.clientX);
277
+ }}
278
+ />
279
+ <button
280
+ type="button"
281
+ data-handle="true"
282
+ aria-label="First line indent handle"
283
+ title={`First line offset: ${effectiveLayout?.firstLineOffset ?? 0} twips`}
284
+ disabled={indentationReadOnly}
285
+ className={`absolute top-1 h-4 w-4 -translate-x-1/2 rotate-45 rounded-[4px] border border-primary/30 bg-surface-raised shadow-sm transition-opacity ${
286
+ handlesOverlap ? "opacity-80 z-20" : ""
287
+ }`}
288
+ style={{ left: markerLeftStyle(firstLineHandleLeft) }}
289
+ onMouseDown={(event) => {
290
+ event.preventDefault();
291
+ beginDrag("first-line", event.clientX);
292
+ }}
293
+ />
294
+ {markerLayout.tabStops.map((tabStop) => (
295
+ <div
296
+ key={tabStop.id}
297
+ data-handle="true"
298
+ aria-label={`Tab stop at ${tabStop.left.toFixed(0)}%`}
299
+ title={`Tab stop`}
300
+ className="absolute top-5 h-4 w-4 -translate-x-1/2 rounded-sm border border-border bg-surface-raised shadow-sm"
301
+ style={{ left: markerLeftStyle(tabStop.left) }}
302
+ />
303
+ ))}
304
+ </>
305
+ ) : null}
306
+ </div>
307
+ </div>
308
+ );
309
+ }
310
+
311
+ function composeIndentation(leftIndent: number, rightIndent: number, firstLineOffset: number) {
312
+ const indentation: {
313
+ left?: number;
314
+ right?: number;
315
+ firstLine?: number;
316
+ hanging?: number;
317
+ } = {};
318
+ if (leftIndent > 0) {
319
+ indentation.left = leftIndent;
320
+ }
321
+ if (rightIndent > 0) {
322
+ indentation.right = rightIndent;
323
+ }
324
+ if (firstLineOffset > 0) {
325
+ indentation.firstLine = Math.round(firstLineOffset);
326
+ } else if (firstLineOffset < 0) {
327
+ indentation.hanging = Math.round(Math.abs(firstLineOffset));
328
+ }
329
+ return indentation;
330
+ }
331
+
332
+ function regionButtonClass(active: boolean): string {
333
+ return `inline-flex items-center rounded-full border px-3 py-1 text-xs transition-colors ${
334
+ active
335
+ ? "border-accent/30 bg-accent-soft text-accent"
336
+ : "border-border bg-canvas text-secondary hover:bg-surface"
337
+ }`;
338
+ }
339
+
340
+ const controlButtonClass =
341
+ "inline-flex items-center rounded-full border border-border bg-canvas px-3 py-1 text-xs text-secondary transition-colors hover:bg-surface disabled:cursor-not-allowed disabled:opacity-50";
342
+
343
+ function twipsToPercent(value: number, usablePageWidth: number): number {
344
+ return Math.max(0, Math.min(100, (value / usablePageWidth) * 100));
345
+ }
346
+
347
+ function pxToTwips(px: number, width: number, usablePageWidth: number): number {
348
+ if (width <= 0) {
349
+ return 0;
350
+ }
351
+ return Math.round((px / width) * usablePageWidth);
352
+ }
353
+
354
+ function clampTwips(value: number): number {
355
+ return Math.max(MIN_HANDLE_TWIPS, Math.round(value));
356
+ }
357
+
358
+ function offsetHandlePercent(value: number, offset: number): number {
359
+ return Math.max(0, Math.min(100, value + offset));
360
+ }
361
+
362
+ function markerLeftStyle(value: number): string {
363
+ const clamped = Math.max(0, Math.min(100, value));
364
+ return `clamp(${MARKER_HALF_PX}px, ${clamped}%, calc(100% - ${MARKER_HALF_PX}px))`;
365
+ }
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+
3
+ import type { BlockedExplainerSelectionToolModel } from "../../ui/headless/selection-tool-types";
4
+
5
+ export interface TwSelectionToolBlockedProps {
6
+ model: BlockedExplainerSelectionToolModel;
7
+ }
8
+
9
+ export function TwSelectionToolBlocked(props: TwSelectionToolBlockedProps) {
10
+ return (
11
+ <div
12
+ data-testid="blocked-selection-tool"
13
+ className="max-w-[min(24rem,calc(100vw-2rem))] rounded-xl border border-border bg-canvas px-3 py-2 shadow-lg"
14
+ role="status"
15
+ aria-live="polite"
16
+ >
17
+ <div className="text-[10px] font-semibold uppercase tracking-[0.12em] text-tertiary">
18
+ Unavailable here
19
+ </div>
20
+ <div className="mt-1 text-sm text-primary">{props.model.disabledReason}</div>
21
+ </div>
22
+ );
23
+ }
@@ -0,0 +1,35 @@
1
+ import React from "react";
2
+
3
+ import type { CommentThreadSelectionToolModel } from "../../ui/headless/selection-tool-types";
4
+ import { preserveEditorSelectionMouseDown } from "../../ui/headless/preserve-editor-selection";
5
+
6
+ export interface TwSelectionToolCommentProps {
7
+ model: CommentThreadSelectionToolModel;
8
+ onAddComment?: () => void;
9
+ }
10
+
11
+ export function TwSelectionToolComment(props: TwSelectionToolCommentProps) {
12
+ return (
13
+ <div
14
+ data-testid="comment-thread-selection-tool"
15
+ className="max-w-[min(24rem,calc(100vw-2rem))] rounded-xl border border-border bg-canvas px-3 py-2 shadow-lg"
16
+ >
17
+ <div className="text-[10px] font-semibold uppercase tracking-[0.12em] text-tertiary">
18
+ Comment
19
+ </div>
20
+ <div className="mt-1 truncate text-sm text-primary">
21
+ {props.model.previewText ?? "Comment thread"}
22
+ </div>
23
+ <button
24
+ type="button"
25
+ aria-label="Add comment from thread"
26
+ disabled={!props.model.canAddComment || !props.onAddComment}
27
+ onMouseDown={preserveEditorSelectionMouseDown}
28
+ onClick={props.onAddComment}
29
+ className="mt-2 inline-flex h-8 items-center rounded-lg border border-border px-2.5 text-xs font-medium text-secondary transition-colors hover:bg-surface disabled:cursor-not-allowed disabled:opacity-40"
30
+ >
31
+ Comment
32
+ </button>
33
+ </div>
34
+ );
35
+ }
@@ -0,0 +1,37 @@
1
+ import React, { forwardRef } from "react";
2
+ import type { FocusEventHandler } from "react";
3
+
4
+ import type { FormattingInlineSelectionToolModel } from "../../ui/headless/selection-tool-types";
5
+ import { TwSelectionToolbar } from "./tw-selection-toolbar";
6
+
7
+ export interface TwSelectionToolFormattingProps {
8
+ model: FormattingInlineSelectionToolModel;
9
+ onFocusCapture?: FocusEventHandler<HTMLDivElement>;
10
+ onBlurCapture?: FocusEventHandler<HTMLDivElement>;
11
+ onToggleBold?: () => void;
12
+ onToggleItalic?: () => void;
13
+ onToggleUnderline?: () => void;
14
+ onSetTextColor?: (color: string) => void;
15
+ onSetHighlightColor?: (color: string | null) => void;
16
+ onAddComment?: () => void;
17
+ }
18
+
19
+ export const TwSelectionToolFormatting = forwardRef<HTMLDivElement, TwSelectionToolFormattingProps>(
20
+ function TwSelectionToolFormatting(props, ref) {
21
+ return (
22
+ <TwSelectionToolbar
23
+ ref={ref}
24
+ model={props.model}
25
+ disabledReason={props.model.disabledReason}
26
+ onFocusCapture={props.onFocusCapture}
27
+ onBlurCapture={props.onBlurCapture}
28
+ onToggleBold={props.onToggleBold}
29
+ onToggleItalic={props.onToggleItalic}
30
+ onToggleUnderline={props.onToggleUnderline}
31
+ onSetTextColor={props.onSetTextColor}
32
+ onSetHighlightColor={props.onSetHighlightColor}
33
+ onAddComment={props.onAddComment}
34
+ />
35
+ );
36
+ },
37
+ );