@x15ventures/x15-ui-library 3.18.0 → 3.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. package/THIRD_PARTY_LICENSES.md +11182 -0
  2. package/dist/cjs/autoGenerated/libraryThemes.js +12 -12
  3. package/dist/cjs/autoGenerated/libraryThemes.js.map +1 -1
  4. package/dist/cjs/autoGenerated/libraryThemes.json +12 -12
  5. package/dist/cjs/components/design/banners/pageBanner/PageBanner.js +27 -12
  6. package/dist/cjs/components/design/banners/pageBanner/PageBanner.js.map +1 -1
  7. package/dist/cjs/components/design/card/cardHeader/CardHeaderItem.js +22 -15
  8. package/dist/cjs/components/design/card/cardHeader/CardHeaderItem.js.map +1 -1
  9. package/dist/cjs/components/design/dialog/dialog.css +4 -0
  10. package/dist/cjs/components/design/logos/LogoLink.js +2 -1
  11. package/dist/cjs/components/design/logos/LogoLink.js.map +1 -1
  12. package/dist/cjs/components/design/logos/VentureLogo.js +2 -1
  13. package/dist/cjs/components/design/logos/VentureLogo.js.map +1 -1
  14. package/dist/cjs/components/design/revealMore/RevealMoreBelow.js +2 -2
  15. package/dist/cjs/components/design/revealMore/RevealMoreBelow.js.map +1 -1
  16. package/dist/cjs/components/design/skeleton/Skeleton.js +15 -5
  17. package/dist/cjs/components/design/skeleton/Skeleton.js.map +1 -1
  18. package/dist/cjs/components/design/themeLoader/ThemeLoader.js +1 -1
  19. package/dist/cjs/components/design/themeLoader/ThemeLoader.js.map +1 -1
  20. package/dist/cjs/components/form/buttons/SimpleButton.js +3 -1
  21. package/dist/cjs/components/form/buttons/SimpleButton.js.map +1 -1
  22. package/dist/cjs/components/form/buttons/button.interface.js.map +1 -1
  23. package/dist/cjs/components/form/buttons/userPicButton/UserPicButton.js +5 -3
  24. package/dist/cjs/components/form/buttons/userPicButton/UserPicButton.js.map +1 -1
  25. package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +64 -19
  26. package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
  27. package/dist/cjs/components/navigation/link/Link.js +2 -1
  28. package/dist/cjs/components/navigation/link/Link.js.map +1 -1
  29. package/dist/cjs/components/testing/devToolbar/DevToolbar.js +5 -3
  30. package/dist/cjs/components/testing/devToolbar/DevToolbar.js.map +1 -1
  31. package/dist/cjs/constants/fileUploadTypes.js +9 -4
  32. package/dist/cjs/constants/fileUploadTypes.js.map +1 -1
  33. package/dist/cjs/helpers/dateHelpers.js +34 -23
  34. package/dist/cjs/helpers/dateHelpers.js.map +1 -1
  35. package/dist/cjs/helpers/fileHelpers.js +58 -0
  36. package/dist/cjs/helpers/fileHelpers.js.map +1 -0
  37. package/dist/cjs/helpers/index.js +44 -0
  38. package/dist/cjs/helpers/index.js.map +1 -1
  39. package/dist/cjs/helpers/interactionsHelper.js +8 -1
  40. package/dist/cjs/helpers/interactionsHelper.js.map +1 -1
  41. package/dist/cjs/helpers/objectHelpers.js +23 -9
  42. package/dist/cjs/helpers/objectHelpers.js.map +1 -1
  43. package/dist/cjs/helpers/stringHelpers.js +61 -5
  44. package/dist/cjs/helpers/stringHelpers.js.map +1 -1
  45. package/dist/cjs/helpers/urlHelpers.js +48 -0
  46. package/dist/cjs/helpers/urlHelpers.js.map +1 -0
  47. package/dist/cjs/index.js +191 -0
  48. package/dist/cjs/index.js.map +1 -1
  49. package/dist/cjs/package.json +3 -305
  50. package/dist/cjs/styles/index.css +18 -0
  51. package/dist/cjs/styles/variables/cssVars/_designVariables.css +18 -0
  52. package/dist/cjs/widgets/documentComments/DocumentComments.js +305 -0
  53. package/dist/cjs/widgets/documentComments/DocumentComments.js.map +1 -0
  54. package/dist/cjs/widgets/documentComments/_documentCommentsVariables.css +0 -0
  55. package/dist/cjs/widgets/documentComments/documentComments.css +107 -0
  56. package/dist/cjs/widgets/documentComments/documentComments.interfaces.js +6 -0
  57. package/dist/cjs/widgets/documentComments/documentComments.interfaces.js.map +1 -0
  58. package/dist/cjs/widgets/documentComments/index.js +19 -0
  59. package/dist/cjs/widgets/documentComments/index.js.map +1 -0
  60. package/dist/cjs/widgets/documentComparer/DocumentComparer.js +309 -0
  61. package/dist/cjs/widgets/documentComparer/DocumentComparer.js.map +1 -0
  62. package/dist/cjs/widgets/documentComparer/_documentComparerVariables.css +0 -0
  63. package/dist/cjs/widgets/documentComparer/documentComparer.css +117 -0
  64. package/dist/cjs/widgets/documentComparer/documentComparer.interfaces.js +6 -0
  65. package/dist/cjs/widgets/documentComparer/documentComparer.interfaces.js.map +1 -0
  66. package/dist/cjs/widgets/documentComparer/index.js +19 -0
  67. package/dist/cjs/widgets/documentComparer/index.js.map +1 -0
  68. package/dist/cjs/widgets/documentEditor/DocumentEditor.js +142 -0
  69. package/dist/cjs/widgets/documentEditor/DocumentEditor.js.map +1 -0
  70. package/dist/cjs/widgets/documentEditor/_documentEditorVariables.css +0 -0
  71. package/dist/cjs/widgets/documentEditor/documentEditor.css +33 -0
  72. package/dist/cjs/widgets/documentEditor/documentEditor.interfaces.js +6 -0
  73. package/dist/cjs/widgets/documentEditor/documentEditor.interfaces.js.map +1 -0
  74. package/dist/cjs/widgets/documentEditor/index.js +19 -0
  75. package/dist/cjs/widgets/documentEditor/index.js.map +1 -0
  76. package/dist/cjs/widgets/documentViewer/DocumentViewer.js +206 -0
  77. package/dist/cjs/widgets/documentViewer/DocumentViewer.js.map +1 -0
  78. package/dist/cjs/widgets/documentViewer/_documentViewerVariables.css +0 -0
  79. package/dist/cjs/widgets/documentViewer/documentViewer.css +82 -0
  80. package/dist/cjs/widgets/documentViewer/documentViewer.interfaces.js +6 -0
  81. package/dist/cjs/widgets/documentViewer/documentViewer.interfaces.js.map +1 -0
  82. package/dist/cjs/widgets/documentViewer/index.js +19 -0
  83. package/dist/cjs/widgets/documentViewer/index.js.map +1 -0
  84. package/dist/cjs/widgets/index.js +126 -0
  85. package/dist/cjs/widgets/index.js.map +1 -1
  86. package/dist/cjs/widgets/shared/documents/ToggleGroup.js +32 -0
  87. package/dist/cjs/widgets/shared/documents/ToggleGroup.js.map +1 -0
  88. package/dist/cjs/widgets/shared/documents/_documentVariables.css +0 -0
  89. package/dist/cjs/widgets/shared/documents/annotations/AnnotationLayer.js +279 -0
  90. package/dist/cjs/widgets/shared/documents/annotations/AnnotationLayer.js.map +1 -0
  91. package/dist/cjs/widgets/shared/documents/annotations/_annotationLayerVariables.css +0 -0
  92. package/dist/cjs/widgets/shared/documents/annotations/annotationLayer.css +65 -0
  93. package/dist/cjs/widgets/shared/documents/annotations/annotations.interfaces.js +21 -0
  94. package/dist/cjs/widgets/shared/documents/annotations/annotations.interfaces.js.map +1 -0
  95. package/dist/cjs/widgets/shared/documents/annotations/highlightRegistry.js +67 -0
  96. package/dist/cjs/widgets/shared/documents/annotations/highlightRegistry.js.map +1 -0
  97. package/dist/cjs/widgets/shared/documents/annotations/index.js +39 -0
  98. package/dist/cjs/widgets/shared/documents/annotations/index.js.map +1 -0
  99. package/dist/cjs/widgets/shared/documents/annotations/textIndex.js +112 -0
  100. package/dist/cjs/widgets/shared/documents/annotations/textIndex.js.map +1 -0
  101. package/dist/cjs/widgets/shared/documents/annotations/textQuoteAnchor.js +160 -0
  102. package/dist/cjs/widgets/shared/documents/annotations/textQuoteAnchor.js.map +1 -0
  103. package/dist/cjs/widgets/shared/documents/documentHelpers.js +186 -0
  104. package/dist/cjs/widgets/shared/documents/documentHelpers.js.map +1 -0
  105. package/dist/cjs/widgets/shared/documents/documents.interfaces.js +6 -0
  106. package/dist/cjs/widgets/shared/documents/documents.interfaces.js.map +1 -0
  107. package/dist/cjs/widgets/shared/documents/engines/documentDiff/DocumentDiff.js +73 -0
  108. package/dist/cjs/widgets/shared/documents/engines/documentDiff/DocumentDiff.js.map +1 -0
  109. package/dist/cjs/widgets/shared/documents/engines/documentDiff/_documentDiffVariables.css +0 -0
  110. package/dist/cjs/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js +114 -0
  111. package/dist/cjs/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js.map +1 -0
  112. package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.css +69 -0
  113. package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js +6 -0
  114. package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js.map +1 -0
  115. package/dist/cjs/widgets/shared/documents/engines/lazyEngines.js +19 -0
  116. package/dist/cjs/widgets/shared/documents/engines/lazyEngines.js.map +1 -0
  117. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js +200 -0
  118. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js.map +1 -0
  119. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/_markdownEditorEngineVariables.css +0 -0
  120. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.css +50 -0
  121. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js +6 -0
  122. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js.map +1 -0
  123. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js +179 -0
  124. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js.map +1 -0
  125. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js +278 -0
  126. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js.map +1 -0
  127. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js +208 -0
  128. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js.map +1 -0
  129. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js +85 -0
  130. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js.map +1 -0
  131. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/_markdownRendererVariables.css +0 -0
  132. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/markdownRenderer.css +78 -0
  133. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/index.js +64 -0
  134. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/index.js.map +1 -0
  135. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js +6 -0
  136. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js.map +1 -0
  137. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js +71 -0
  138. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js.map +1 -0
  139. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js +192 -0
  140. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js.map +1 -0
  141. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js +86 -0
  142. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js.map +1 -0
  143. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js +38 -0
  144. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js.map +1 -0
  145. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/WordRenderer.js +49 -0
  146. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/WordRenderer.js.map +1 -0
  147. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js +214 -0
  148. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js.map +1 -0
  149. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js +112 -0
  150. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js.map +1 -0
  151. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordXml.js +68 -0
  152. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordXml.js.map +1 -0
  153. package/dist/cjs/widgets/shared/documents/index.js +50 -0
  154. package/dist/cjs/widgets/shared/documents/index.js.map +1 -0
  155. package/dist/cjs/widgets/shared/documents/toggleGroup.css +8 -0
  156. package/dist/cjs/widgets/shared/documents/useDocumentContent.js +222 -0
  157. package/dist/cjs/widgets/shared/documents/useDocumentContent.js.map +1 -0
  158. package/dist/components/design/banners/pageBanner/PageBanner.d.ts.map +1 -1
  159. package/dist/components/design/card/cardHeader/CardHeaderItem.d.ts.map +1 -1
  160. package/dist/components/design/logos/LogoLink.d.ts.map +1 -1
  161. package/dist/components/design/logos/VentureLogo.d.ts.map +1 -1
  162. package/dist/components/design/skeleton/Skeleton.d.ts +1 -1
  163. package/dist/components/design/skeleton/Skeleton.d.ts.map +1 -1
  164. package/dist/components/design/themeLoader/ThemeLoader.d.ts.map +1 -1
  165. package/dist/components/form/buttons/SimpleButton.d.ts.map +1 -1
  166. package/dist/components/form/buttons/button.interface.d.ts +1 -0
  167. package/dist/components/form/buttons/button.interface.d.ts.map +1 -1
  168. package/dist/components/form/buttons/userPicButton/UserPicButton.d.ts.map +1 -1
  169. package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.d.ts.map +1 -1
  170. package/dist/components/navigation/link/Link.d.ts.map +1 -1
  171. package/dist/components/testing/devToolbar/DevToolbar.d.ts.map +1 -1
  172. package/dist/constants/fileUploadTypes.d.ts.map +1 -1
  173. package/dist/esm/autoGenerated/libraryThemes.js +12 -12
  174. package/dist/esm/autoGenerated/libraryThemes.js.map +1 -1
  175. package/dist/esm/autoGenerated/libraryThemes.json +12 -12
  176. package/dist/esm/components/design/banners/pageBanner/PageBanner.js +27 -12
  177. package/dist/esm/components/design/banners/pageBanner/PageBanner.js.map +1 -1
  178. package/dist/esm/components/design/card/cardHeader/CardHeaderItem.js +22 -15
  179. package/dist/esm/components/design/card/cardHeader/CardHeaderItem.js.map +1 -1
  180. package/dist/esm/components/design/dialog/dialog.css +4 -0
  181. package/dist/esm/components/design/logos/LogoLink.js +2 -1
  182. package/dist/esm/components/design/logos/LogoLink.js.map +1 -1
  183. package/dist/esm/components/design/logos/VentureLogo.js +2 -1
  184. package/dist/esm/components/design/logos/VentureLogo.js.map +1 -1
  185. package/dist/esm/components/design/revealMore/RevealMoreBelow.js +1 -1
  186. package/dist/esm/components/design/revealMore/RevealMoreBelow.js.map +1 -1
  187. package/dist/esm/components/design/skeleton/Skeleton.js +15 -5
  188. package/dist/esm/components/design/skeleton/Skeleton.js.map +1 -1
  189. package/dist/esm/components/design/themeLoader/ThemeLoader.js +1 -1
  190. package/dist/esm/components/design/themeLoader/ThemeLoader.js.map +1 -1
  191. package/dist/esm/components/form/buttons/SimpleButton.js +3 -1
  192. package/dist/esm/components/form/buttons/SimpleButton.js.map +1 -1
  193. package/dist/esm/components/form/buttons/button.interface.js.map +1 -1
  194. package/dist/esm/components/form/buttons/userPicButton/UserPicButton.js +5 -3
  195. package/dist/esm/components/form/buttons/userPicButton/UserPicButton.js.map +1 -1
  196. package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +65 -19
  197. package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
  198. package/dist/esm/components/navigation/link/Link.js +2 -1
  199. package/dist/esm/components/navigation/link/Link.js.map +1 -1
  200. package/dist/esm/components/testing/devToolbar/DevToolbar.js +5 -3
  201. package/dist/esm/components/testing/devToolbar/DevToolbar.js.map +1 -1
  202. package/dist/esm/constants/fileUploadTypes.js +9 -4
  203. package/dist/esm/constants/fileUploadTypes.js.map +1 -1
  204. package/dist/esm/helpers/dateHelpers.js +34 -23
  205. package/dist/esm/helpers/dateHelpers.js.map +1 -1
  206. package/dist/esm/helpers/fileHelpers.js +48 -0
  207. package/dist/esm/helpers/fileHelpers.js.map +1 -0
  208. package/dist/esm/helpers/index.js +2 -0
  209. package/dist/esm/helpers/index.js.map +1 -1
  210. package/dist/esm/helpers/interactionsHelper.js +5 -0
  211. package/dist/esm/helpers/interactionsHelper.js.map +1 -1
  212. package/dist/esm/helpers/objectHelpers.js +23 -9
  213. package/dist/esm/helpers/objectHelpers.js.map +1 -1
  214. package/dist/esm/helpers/stringHelpers.js +61 -5
  215. package/dist/esm/helpers/stringHelpers.js.map +1 -1
  216. package/dist/esm/helpers/urlHelpers.js +40 -0
  217. package/dist/esm/helpers/urlHelpers.js.map +1 -0
  218. package/dist/esm/index.js +3 -1
  219. package/dist/esm/index.js.map +1 -1
  220. package/dist/esm/package.json +2 -304
  221. package/dist/esm/styles/index.css +18 -0
  222. package/dist/esm/styles/variables/cssVars/_designVariables.css +18 -0
  223. package/dist/esm/widgets/documentComments/DocumentComments.js +298 -0
  224. package/dist/esm/widgets/documentComments/DocumentComments.js.map +1 -0
  225. package/dist/esm/widgets/documentComments/_documentCommentsVariables.css +0 -0
  226. package/dist/esm/widgets/documentComments/documentComments.css +107 -0
  227. package/dist/esm/widgets/documentComments/documentComments.interfaces.js +2 -0
  228. package/dist/esm/widgets/documentComments/documentComments.interfaces.js.map +1 -0
  229. package/dist/esm/widgets/documentComments/index.js +2 -0
  230. package/dist/esm/widgets/documentComments/index.js.map +1 -0
  231. package/dist/esm/widgets/documentComparer/DocumentComparer.js +301 -0
  232. package/dist/esm/widgets/documentComparer/DocumentComparer.js.map +1 -0
  233. package/dist/esm/widgets/documentComparer/_documentComparerVariables.css +0 -0
  234. package/dist/esm/widgets/documentComparer/documentComparer.css +117 -0
  235. package/dist/esm/widgets/documentComparer/documentComparer.interfaces.js +2 -0
  236. package/dist/esm/widgets/documentComparer/documentComparer.interfaces.js.map +1 -0
  237. package/dist/esm/widgets/documentComparer/index.js +2 -0
  238. package/dist/esm/widgets/documentComparer/index.js.map +1 -0
  239. package/dist/esm/widgets/documentEditor/DocumentEditor.js +135 -0
  240. package/dist/esm/widgets/documentEditor/DocumentEditor.js.map +1 -0
  241. package/dist/esm/widgets/documentEditor/_documentEditorVariables.css +0 -0
  242. package/dist/esm/widgets/documentEditor/documentEditor.css +33 -0
  243. package/dist/esm/widgets/documentEditor/documentEditor.interfaces.js +2 -0
  244. package/dist/esm/widgets/documentEditor/documentEditor.interfaces.js.map +1 -0
  245. package/dist/esm/widgets/documentEditor/index.js +2 -0
  246. package/dist/esm/widgets/documentEditor/index.js.map +1 -0
  247. package/dist/esm/widgets/documentViewer/DocumentViewer.js +198 -0
  248. package/dist/esm/widgets/documentViewer/DocumentViewer.js.map +1 -0
  249. package/dist/esm/widgets/documentViewer/_documentViewerVariables.css +0 -0
  250. package/dist/esm/widgets/documentViewer/documentViewer.css +82 -0
  251. package/dist/esm/widgets/documentViewer/documentViewer.interfaces.js +2 -0
  252. package/dist/esm/widgets/documentViewer/documentViewer.interfaces.js.map +1 -0
  253. package/dist/esm/widgets/documentViewer/index.js +2 -0
  254. package/dist/esm/widgets/documentViewer/index.js.map +1 -0
  255. package/dist/esm/widgets/index.js +6 -0
  256. package/dist/esm/widgets/index.js.map +1 -1
  257. package/dist/esm/widgets/shared/documents/ToggleGroup.js +24 -0
  258. package/dist/esm/widgets/shared/documents/ToggleGroup.js.map +1 -0
  259. package/dist/esm/widgets/shared/documents/_documentVariables.css +0 -0
  260. package/dist/esm/widgets/shared/documents/annotations/AnnotationLayer.js +273 -0
  261. package/dist/esm/widgets/shared/documents/annotations/AnnotationLayer.js.map +1 -0
  262. package/dist/esm/widgets/shared/documents/annotations/_annotationLayerVariables.css +0 -0
  263. package/dist/esm/widgets/shared/documents/annotations/annotationLayer.css +65 -0
  264. package/dist/esm/widgets/shared/documents/annotations/annotations.interfaces.js +14 -0
  265. package/dist/esm/widgets/shared/documents/annotations/annotations.interfaces.js.map +1 -0
  266. package/dist/esm/widgets/shared/documents/annotations/highlightRegistry.js +58 -0
  267. package/dist/esm/widgets/shared/documents/annotations/highlightRegistry.js.map +1 -0
  268. package/dist/esm/widgets/shared/documents/annotations/index.js +4 -0
  269. package/dist/esm/widgets/shared/documents/annotations/index.js.map +1 -0
  270. package/dist/esm/widgets/shared/documents/annotations/textIndex.js +103 -0
  271. package/dist/esm/widgets/shared/documents/annotations/textIndex.js.map +1 -0
  272. package/dist/esm/widgets/shared/documents/annotations/textQuoteAnchor.js +150 -0
  273. package/dist/esm/widgets/shared/documents/annotations/textQuoteAnchor.js.map +1 -0
  274. package/dist/esm/widgets/shared/documents/documentHelpers.js +168 -0
  275. package/dist/esm/widgets/shared/documents/documentHelpers.js.map +1 -0
  276. package/dist/esm/widgets/shared/documents/documents.interfaces.js +2 -0
  277. package/dist/esm/widgets/shared/documents/documents.interfaces.js.map +1 -0
  278. package/dist/esm/widgets/shared/documents/engines/documentDiff/DocumentDiff.js +65 -0
  279. package/dist/esm/widgets/shared/documents/engines/documentDiff/DocumentDiff.js.map +1 -0
  280. package/dist/esm/widgets/shared/documents/engines/documentDiff/_documentDiffVariables.css +0 -0
  281. package/dist/esm/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js +102 -0
  282. package/dist/esm/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js.map +1 -0
  283. package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.css +69 -0
  284. package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js +2 -0
  285. package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js.map +1 -0
  286. package/dist/esm/widgets/shared/documents/engines/lazyEngines.js +13 -0
  287. package/dist/esm/widgets/shared/documents/engines/lazyEngines.js.map +1 -0
  288. package/dist/esm/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js +191 -0
  289. package/dist/esm/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js.map +1 -0
  290. package/dist/esm/widgets/shared/documents/engines/markdownEditor/_markdownEditorEngineVariables.css +0 -0
  291. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.css +50 -0
  292. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js +2 -0
  293. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js.map +1 -0
  294. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js +170 -0
  295. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js.map +1 -0
  296. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js +270 -0
  297. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js.map +1 -0
  298. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js +198 -0
  299. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js.map +1 -0
  300. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js +76 -0
  301. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js.map +1 -0
  302. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/_markdownRendererVariables.css +0 -0
  303. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/markdownRenderer.css +78 -0
  304. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/index.js +5 -0
  305. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/index.js.map +1 -0
  306. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js +2 -0
  307. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js.map +1 -0
  308. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js +64 -0
  309. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js.map +1 -0
  310. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js +182 -0
  311. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js.map +1 -0
  312. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js +78 -0
  313. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js.map +1 -0
  314. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js +30 -0
  315. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js.map +1 -0
  316. package/dist/esm/widgets/shared/documents/engines/wordRenderer/WordRenderer.js +41 -0
  317. package/dist/esm/widgets/shared/documents/engines/wordRenderer/WordRenderer.js.map +1 -0
  318. package/dist/esm/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js +207 -0
  319. package/dist/esm/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js.map +1 -0
  320. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js +105 -0
  321. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js.map +1 -0
  322. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordXml.js +57 -0
  323. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordXml.js.map +1 -0
  324. package/dist/esm/widgets/shared/documents/index.js +3 -0
  325. package/dist/esm/widgets/shared/documents/index.js.map +1 -0
  326. package/dist/esm/widgets/shared/documents/toggleGroup.css +8 -0
  327. package/dist/esm/widgets/shared/documents/useDocumentContent.js +215 -0
  328. package/dist/esm/widgets/shared/documents/useDocumentContent.js.map +1 -0
  329. package/dist/helpers/dateHelpers.d.ts.map +1 -1
  330. package/dist/helpers/fileHelpers.d.ts +5 -0
  331. package/dist/helpers/fileHelpers.d.ts.map +1 -0
  332. package/dist/helpers/index.d.ts +3 -0
  333. package/dist/helpers/index.d.ts.map +1 -1
  334. package/dist/helpers/interactionsHelper.d.ts +2 -0
  335. package/dist/helpers/interactionsHelper.d.ts.map +1 -1
  336. package/dist/helpers/objectHelpers.d.ts.map +1 -1
  337. package/dist/helpers/stringHelpers.d.ts.map +1 -1
  338. package/dist/helpers/urlHelpers.d.ts +3 -0
  339. package/dist/helpers/urlHelpers.d.ts.map +1 -0
  340. package/dist/index.d.ts +5 -2
  341. package/dist/index.d.ts.map +1 -1
  342. package/dist/package.json +42 -28
  343. package/dist/widgets/documentComments/DocumentComments.d.ts +7 -0
  344. package/dist/widgets/documentComments/DocumentComments.d.ts.map +1 -0
  345. package/dist/widgets/documentComments/documentComments.interfaces.d.ts +57 -0
  346. package/dist/widgets/documentComments/documentComments.interfaces.d.ts.map +1 -0
  347. package/dist/widgets/documentComments/index.d.ts +3 -0
  348. package/dist/widgets/documentComments/index.d.ts.map +1 -0
  349. package/dist/widgets/documentComparer/DocumentComparer.d.ts +7 -0
  350. package/dist/widgets/documentComparer/DocumentComparer.d.ts.map +1 -0
  351. package/dist/widgets/documentComparer/documentComparer.interfaces.d.ts +78 -0
  352. package/dist/widgets/documentComparer/documentComparer.interfaces.d.ts.map +1 -0
  353. package/dist/widgets/documentComparer/index.d.ts +3 -0
  354. package/dist/widgets/documentComparer/index.d.ts.map +1 -0
  355. package/dist/widgets/documentEditor/DocumentEditor.d.ts +7 -0
  356. package/dist/widgets/documentEditor/DocumentEditor.d.ts.map +1 -0
  357. package/dist/widgets/documentEditor/documentEditor.interfaces.d.ts +40 -0
  358. package/dist/widgets/documentEditor/documentEditor.interfaces.d.ts.map +1 -0
  359. package/dist/widgets/documentEditor/index.d.ts +3 -0
  360. package/dist/widgets/documentEditor/index.d.ts.map +1 -0
  361. package/dist/widgets/documentViewer/DocumentViewer.d.ts +7 -0
  362. package/dist/widgets/documentViewer/DocumentViewer.d.ts.map +1 -0
  363. package/dist/widgets/documentViewer/documentViewer.interfaces.d.ts +47 -0
  364. package/dist/widgets/documentViewer/documentViewer.interfaces.d.ts.map +1 -0
  365. package/dist/widgets/documentViewer/index.d.ts +3 -0
  366. package/dist/widgets/documentViewer/index.d.ts.map +1 -0
  367. package/dist/widgets/index.d.ts +12 -0
  368. package/dist/widgets/index.d.ts.map +1 -1
  369. package/dist/widgets/shared/documents/ToggleGroup.d.ts +15 -0
  370. package/dist/widgets/shared/documents/ToggleGroup.d.ts.map +1 -0
  371. package/dist/widgets/shared/documents/annotations/AnnotationLayer.d.ts +27 -0
  372. package/dist/widgets/shared/documents/annotations/AnnotationLayer.d.ts.map +1 -0
  373. package/dist/widgets/shared/documents/annotations/annotations.interfaces.d.ts +43 -0
  374. package/dist/widgets/shared/documents/annotations/annotations.interfaces.d.ts.map +1 -0
  375. package/dist/widgets/shared/documents/annotations/highlightRegistry.d.ts +12 -0
  376. package/dist/widgets/shared/documents/annotations/highlightRegistry.d.ts.map +1 -0
  377. package/dist/widgets/shared/documents/annotations/index.d.ts +6 -0
  378. package/dist/widgets/shared/documents/annotations/index.d.ts.map +1 -0
  379. package/dist/widgets/shared/documents/annotations/textIndex.d.ts +16 -0
  380. package/dist/widgets/shared/documents/annotations/textIndex.d.ts.map +1 -0
  381. package/dist/widgets/shared/documents/annotations/textQuoteAnchor.d.ts +15 -0
  382. package/dist/widgets/shared/documents/annotations/textQuoteAnchor.d.ts.map +1 -0
  383. package/dist/widgets/shared/documents/documentHelpers.d.ts +14 -0
  384. package/dist/widgets/shared/documents/documentHelpers.d.ts.map +1 -0
  385. package/dist/widgets/shared/documents/documents.interfaces.d.ts +20 -0
  386. package/dist/widgets/shared/documents/documents.interfaces.d.ts.map +1 -0
  387. package/dist/widgets/shared/documents/engines/documentDiff/DocumentDiff.d.ts +6 -0
  388. package/dist/widgets/shared/documents/engines/documentDiff/DocumentDiff.d.ts.map +1 -0
  389. package/dist/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.d.ts +25 -0
  390. package/dist/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.d.ts.map +1 -0
  391. package/dist/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.d.ts +17 -0
  392. package/dist/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.d.ts.map +1 -0
  393. package/dist/widgets/shared/documents/engines/lazyEngines.d.ts +5 -0
  394. package/dist/widgets/shared/documents/engines/lazyEngines.d.ts.map +1 -0
  395. package/dist/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.d.ts +8 -0
  396. package/dist/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.d.ts.map +1 -0
  397. package/dist/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.d.ts +23 -0
  398. package/dist/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.d.ts.map +1 -0
  399. package/dist/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.d.ts +12 -0
  400. package/dist/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.d.ts.map +1 -0
  401. package/dist/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.d.ts +8 -0
  402. package/dist/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.d.ts.map +1 -0
  403. package/dist/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.d.ts +32 -0
  404. package/dist/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.d.ts.map +1 -0
  405. package/dist/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.d.ts +12 -0
  406. package/dist/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.d.ts.map +1 -0
  407. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/index.d.ts +7 -0
  408. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/index.d.ts.map +1 -0
  409. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.d.ts +16 -0
  410. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.d.ts.map +1 -0
  411. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.d.ts +3 -0
  412. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.d.ts.map +1 -0
  413. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.d.ts +6 -0
  414. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.d.ts.map +1 -0
  415. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.d.ts +3 -0
  416. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.d.ts.map +1 -0
  417. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.d.ts +8 -0
  418. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.d.ts.map +1 -0
  419. package/dist/widgets/shared/documents/engines/wordRenderer/WordRenderer.d.ts +11 -0
  420. package/dist/widgets/shared/documents/engines/wordRenderer/WordRenderer.d.ts.map +1 -0
  421. package/dist/widgets/shared/documents/engines/wordRenderer/renderWordDocument.d.ts +7 -0
  422. package/dist/widgets/shared/documents/engines/wordRenderer/renderWordDocument.d.ts.map +1 -0
  423. package/dist/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.d.ts +3 -0
  424. package/dist/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.d.ts.map +1 -0
  425. package/dist/widgets/shared/documents/engines/wordRenderer/wordXml.d.ts +21 -0
  426. package/dist/widgets/shared/documents/engines/wordRenderer/wordXml.d.ts.map +1 -0
  427. package/dist/widgets/shared/documents/index.d.ts +5 -0
  428. package/dist/widgets/shared/documents/index.d.ts.map +1 -0
  429. package/dist/widgets/shared/documents/useDocumentContent.d.ts +11 -0
  430. package/dist/widgets/shared/documents/useDocumentContent.d.ts.map +1 -0
  431. package/package.json +42 -28
  432. package/readme.md +49 -2
  433. package/dist/components/design/dialog/Dialog.test.d.ts +0 -5
  434. package/dist/components/design/dialog/Dialog.test.d.ts.map +0 -1
  435. package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.test.d.ts +0 -5
  436. package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.test.d.ts.map +0 -1
  437. package/dist/components/design/tooltip/Tooltip.test.d.ts +0 -2
  438. package/dist/components/design/tooltip/Tooltip.test.d.ts.map +0 -1
  439. package/dist/components/form/buttons/SimpleButton.test.d.ts +0 -5
  440. package/dist/components/form/buttons/SimpleButton.test.d.ts.map +0 -1
  441. package/dist/components/form/formFields/formFieldWrapper/FormField.test.d.ts +0 -5
  442. package/dist/components/form/formFields/formFieldWrapper/FormField.test.d.ts.map +0 -1
  443. package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts +0 -5
  444. package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts.map +0 -1
  445. package/dist/components/form/formFields/subComponents/inputs/checkbox/checkboxSwitch/CheckboxSwitch.test.d.ts +0 -5
  446. package/dist/components/form/formFields/subComponents/inputs/checkbox/checkboxSwitch/CheckboxSwitch.test.d.ts.map +0 -1
  447. package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.test.d.ts +0 -5
  448. package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.test.d.ts.map +0 -1
  449. package/dist/components/form/formFields/subComponents/inputs/file/fileAttachmentList/FileAttachmentsList.test.d.ts +0 -5
  450. package/dist/components/form/formFields/subComponents/inputs/file/fileAttachmentList/FileAttachmentsList.test.d.ts.map +0 -1
  451. package/dist/components/form/formFields/subComponents/inputs/text/InputText.test.d.ts +0 -5
  452. package/dist/components/form/formFields/subComponents/inputs/text/InputText.test.d.ts.map +0 -1
  453. package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts +0 -5
  454. package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts.map +0 -1
  455. package/dist/components/form/formFields/subComponents/select/Select.test.d.ts +0 -5
  456. package/dist/components/form/formFields/subComponents/select/Select.test.d.ts.map +0 -1
  457. package/dist/components/form/formFields/subComponents/textarea/Textarea.test.d.ts +0 -5
  458. package/dist/components/form/formFields/subComponents/textarea/Textarea.test.d.ts.map +0 -1
  459. package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts +0 -5
  460. package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts.map +0 -1
  461. package/dist/components/form/validation/ValidationMessages.test.d.ts +0 -5
  462. package/dist/components/form/validation/ValidationMessages.test.d.ts.map +0 -1
  463. package/dist/components/navigation/bubbleNavigator/bubbleNavigatorUtilities.test.d.ts +0 -2
  464. package/dist/components/navigation/bubbleNavigator/bubbleNavigatorUtilities.test.d.ts.map +0 -1
  465. package/dist/components/navigation/menu/menuItemContent/MenuItemIcon.test.d.ts +0 -5
  466. package/dist/components/navigation/menu/menuItemContent/MenuItemIcon.test.d.ts.map +0 -1
  467. package/dist/helpers/ageHelpers.test.d.ts +0 -2
  468. package/dist/helpers/ageHelpers.test.d.ts.map +0 -1
  469. package/dist/helpers/dateHelpers.test.d.ts +0 -2
  470. package/dist/helpers/dateHelpers.test.d.ts.map +0 -1
  471. package/dist/helpers/formatters.test.d.ts +0 -5
  472. package/dist/helpers/formatters.test.d.ts.map +0 -1
  473. package/dist/helpers/iconHelpers.test.d.ts +0 -5
  474. package/dist/helpers/iconHelpers.test.d.ts.map +0 -1
  475. package/dist/helpers/numberHelpers.test.d.ts +0 -5
  476. package/dist/helpers/numberHelpers.test.d.ts.map +0 -1
  477. package/dist/helpers/objectHelpers.test.d.ts +0 -2
  478. package/dist/helpers/objectHelpers.test.d.ts.map +0 -1
  479. package/dist/helpers/stringHelpers.test.d.ts +0 -2
  480. package/dist/helpers/stringHelpers.test.d.ts.map +0 -1
  481. package/dist/hooks/InteractiveHostFocus.test.d.ts +0 -5
  482. package/dist/hooks/InteractiveHostFocus.test.d.ts.map +0 -1
  483. package/dist/widgets/processLauncher/ProcessLauncher.test.d.ts +0 -5
  484. package/dist/widgets/processLauncher/ProcessLauncher.test.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlightRegistry.js","names":["HIGHLIGHT_NAMES","comment","selected","instances","Map","getHighlightApi","cssNamespace","globalThis","CSS","Highlight","highlights","registry","supportsTextHighlights","syncRegistry","api","all","values","comments","flatMap","instance","length","set","delete","setInstanceHighlights","instanceId","clearInstanceHighlights"],"sources":["../../../../../../src/widgets/shared/documents/annotations/highlightRegistry.ts"],"sourcesContent":["/*\n Comment highlights use the CSS Custom Highlight API, which styles text ranges without changing the\n DOM. That matters inside the rich-text editor, which owns its DOM and would discard or fight any\n wrapper elements added around highlighted text.\n\n The browser keeps one registry entry per highlight name, so the ranges from every annotated view\n on the page are merged here into shared entries. Browsers without the API simply show no\n highlight; comment bubbles still mark each comment.\n */\n\nexport const HIGHLIGHT_NAMES = {\n comment: 'documentComment',\n selected: 'documentCommentSelected'\n} as const;\n\nexport type InstanceHighlights = {\n comments: Range[];\n selected: Range[];\n};\n\nconst instances = new Map<string, InstanceHighlights>();\n\n/* eslint-disable no-unused-vars */\ntype HighlightConstructor = new (...ranges: Range[]) => unknown;\ntype HighlightRegistryLike = { set: (name: string, highlight: unknown) => void; delete: (name: string) => void };\n/* eslint-enable no-unused-vars */\n\nconst getHighlightApi = (): { registry: HighlightRegistryLike; Highlight: HighlightConstructor } | null => {\n const cssNamespace = (globalThis as { CSS?: { highlights?: HighlightRegistryLike } }).CSS;\n const Highlight = (globalThis as { Highlight?: HighlightConstructor }).Highlight;\n return cssNamespace?.highlights && Highlight ? { registry: cssNamespace.highlights, Highlight } : null;\n};\n\nexport const supportsTextHighlights = (): boolean => getHighlightApi() !== null;\n\nconst syncRegistry = () => {\n const api = getHighlightApi();\n if (!api) {\n return;\n }\n const all = [...instances.values()];\n const comments = all.flatMap((instance) => instance.comments);\n const selected = all.flatMap((instance) => instance.selected);\n if (comments.length) {\n api.registry.set(HIGHLIGHT_NAMES.comment, new api.Highlight(...comments));\n } else {\n api.registry.delete(HIGHLIGHT_NAMES.comment);\n }\n if (selected.length) {\n api.registry.set(HIGHLIGHT_NAMES.selected, new api.Highlight(...selected));\n } else {\n api.registry.delete(HIGHLIGHT_NAMES.selected);\n }\n};\n\nexport const setInstanceHighlights = (instanceId: string, highlights: InstanceHighlights): void => {\n instances.set(instanceId, highlights);\n syncRegistry();\n};\n\nexport const clearInstanceHighlights = (instanceId: string): void => {\n if (instances.delete(instanceId)) {\n syncRegistry();\n }\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,MAAMA,eAAe,GAAG;EAC7BC,OAAO,EAAE,iBAAiB;EAC1BC,QAAQ,EAAE;AACZ,CAAU;AAOV,MAAMC,SAAS,GAAG,IAAIC,GAAG,CAA6B,CAAC;;AAEvD;;AAGA;;AAEA,MAAMC,eAAe,GAAGA,CAAA,KAAmF;EACzG,MAAMC,YAAY,GAAIC,UAAU,CAAsDC,GAAG;EACzF,MAAMC,SAAS,GAAIF,UAAU,CAA0CE,SAAS;EAChF,OAAOH,YAAY,EAAEI,UAAU,IAAID,SAAS,GAAG;IAAEE,QAAQ,EAAEL,YAAY,CAACI,UAAU;IAAED;EAAU,CAAC,GAAG,IAAI;AACxG,CAAC;AAED,OAAO,MAAMG,sBAAsB,GAAGA,CAAA,KAAeP,eAAe,CAAC,CAAC,KAAK,IAAI;AAE/E,MAAMQ,YAAY,GAAGA,CAAA,KAAM;EACzB,MAAMC,GAAG,GAAGT,eAAe,CAAC,CAAC;EAC7B,IAAI,CAACS,GAAG,EAAE;IACR;EACF;EACA,MAAMC,GAAG,GAAG,CAAC,GAAGZ,SAAS,CAACa,MAAM,CAAC,CAAC,CAAC;EACnC,MAAMC,QAAQ,GAAGF,GAAG,CAACG,OAAO,CAAEC,QAAQ,IAAKA,QAAQ,CAACF,QAAQ,CAAC;EAC7D,MAAMf,QAAQ,GAAGa,GAAG,CAACG,OAAO,CAAEC,QAAQ,IAAKA,QAAQ,CAACjB,QAAQ,CAAC;EAC7D,IAAIe,QAAQ,CAACG,MAAM,EAAE;IACnBN,GAAG,CAACH,QAAQ,CAACU,GAAG,CAACrB,eAAe,CAACC,OAAO,EAAE,IAAIa,GAAG,CAACL,SAAS,CAAC,GAAGQ,QAAQ,CAAC,CAAC;EAC3E,CAAC,MAAM;IACLH,GAAG,CAACH,QAAQ,CAACW,MAAM,CAACtB,eAAe,CAACC,OAAO,CAAC;EAC9C;EACA,IAAIC,QAAQ,CAACkB,MAAM,EAAE;IACnBN,GAAG,CAACH,QAAQ,CAACU,GAAG,CAACrB,eAAe,CAACE,QAAQ,EAAE,IAAIY,GAAG,CAACL,SAAS,CAAC,GAAGP,QAAQ,CAAC,CAAC;EAC5E,CAAC,MAAM;IACLY,GAAG,CAACH,QAAQ,CAACW,MAAM,CAACtB,eAAe,CAACE,QAAQ,CAAC;EAC/C;AACF,CAAC;AAED,OAAO,MAAMqB,qBAAqB,GAAGA,CAACC,UAAkB,EAAEd,UAA8B,KAAW;EACjGP,SAAS,CAACkB,GAAG,CAACG,UAAU,EAAEd,UAAU,CAAC;EACrCG,YAAY,CAAC,CAAC;AAChB,CAAC;AAED,OAAO,MAAMY,uBAAuB,GAAID,UAAkB,IAAW;EACnE,IAAIrB,SAAS,CAACmB,MAAM,CAACE,UAAU,CAAC,EAAE;IAChCX,YAAY,CAAC,CAAC;EAChB;AACF,CAAC","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ export { AnnotationLayer } from './AnnotationLayer';
2
+ export { defaultDocumentAnnotationLabels } from './annotations.interfaces';
3
+ export { createTextQuoteAnchor, createTextQuoteResolver, resolveTextQuoteAnchor } from './textQuoteAnchor';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["AnnotationLayer","defaultDocumentAnnotationLabels","createTextQuoteAnchor","createTextQuoteResolver","resolveTextQuoteAnchor"],"sources":["../../../../../../src/widgets/shared/documents/annotations/index.ts"],"sourcesContent":["export { AnnotationLayer } from './AnnotationLayer';\nexport { defaultDocumentAnnotationLabels } from './annotations.interfaces';\nexport { createTextQuoteAnchor, createTextQuoteResolver, resolveTextQuoteAnchor } from './textQuoteAnchor';\n\nexport type { AnnotationLayerProps } from './AnnotationLayer';\nexport type {\n DocumentAnchorStatus,\n DocumentAnnotationLabels,\n DocumentAnnotationsProps,\n DocumentComment,\n DocumentCommentAuthor,\n DocumentCommentReply,\n TextQuoteAnchor\n} from './annotations.interfaces';\n"],"mappings":"AAAA,SAASA,eAAe,QAAQ,mBAAmB;AACnD,SAASC,+BAA+B,QAAQ,0BAA0B;AAC1E,SAASC,qBAAqB,EAAEC,uBAAuB,EAAEC,sBAAsB,QAAQ,mBAAmB","ignoreList":[]}
@@ -0,0 +1,103 @@
1
+ /*
2
+ Maps between DOM ranges and character offsets in the plain text of an element, so anchors can be
3
+ created from, and resolved to, selections in rendered content.
4
+
5
+ Block boundaries and line breaks become a newline in the indexed text. Without them, adjacent
6
+ paragraphs would run together ("PurposeThis policy") and quotes taken from rendered text would
7
+ not match the same text in markdown source.
8
+ */
9
+
10
+ const BLOCK_TAGS = new Set(['ADDRESS', 'ARTICLE', 'ASIDE', 'BLOCKQUOTE', 'DD', 'DIV', 'DL', 'DT', 'FIGCAPTION', 'FIGURE', 'FOOTER', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HEADER', 'HR', 'LI', 'MAIN', 'NAV', 'OL', 'P', 'PRE', 'SECTION', 'TABLE', 'TBODY', 'TD', 'TFOOT', 'TH', 'THEAD', 'TR', 'UL']);
11
+
12
+ // Interface text inside the annotated area (buttons, toolbars, decorative content) is not document text.
13
+ export const EXCLUDED_TEXT_SELECTOR = 'button, [role="toolbar"], [aria-hidden="true"], script, style, .documentAnnotations__overlay';
14
+ const nearestBlock = (node, root) => {
15
+ let current = node.parentNode;
16
+ while (current && current !== root && !(current instanceof Element && BLOCK_TAGS.has(current.tagName))) {
17
+ current = current.parentNode;
18
+ }
19
+ return current ?? root;
20
+ };
21
+ const isExcluded = (node, root, excludedSelector) => {
22
+ const element = node instanceof Element ? node : node.parentElement;
23
+ const excluded = element?.closest(excludedSelector);
24
+ return Boolean(excluded && root.contains(excluded) && excluded !== root);
25
+ };
26
+ export const buildTextIndex = (root, excludedSelector = EXCLUDED_TEXT_SELECTOR) => {
27
+ const ownerDocument = root.ownerDocument;
28
+ const walker = ownerDocument.createTreeWalker(root, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT);
29
+ const segments = [];
30
+ let text = '';
31
+ let previousBlock = null;
32
+ const addSeparator = () => {
33
+ if (text.length && !text.endsWith('\n')) {
34
+ text += '\n';
35
+ }
36
+ };
37
+ for (let node = walker.nextNode(); node; node = walker.nextNode()) {
38
+ if (isExcluded(node, root, excludedSelector)) {
39
+ continue;
40
+ }
41
+ if (node instanceof Element) {
42
+ if (node.tagName === 'BR') {
43
+ addSeparator();
44
+ }
45
+ continue;
46
+ }
47
+ const textNode = node;
48
+ const block = nearestBlock(textNode, root);
49
+ if (previousBlock && block !== previousBlock) {
50
+ addSeparator();
51
+ }
52
+ segments.push({
53
+ node: textNode,
54
+ start: text.length
55
+ });
56
+ text += textNode.data;
57
+ previousBlock = block;
58
+ }
59
+ return {
60
+ text,
61
+ segments
62
+ };
63
+ };
64
+ const segmentEnd = segment => segment.start + segment.node.data.length;
65
+
66
+ /*
67
+ Converts text offsets back to a DOM range. An offset that falls on an inserted separator snaps to
68
+ the nearest real text: forwards for the start, backwards for the end.
69
+ */
70
+ export const rangeFromOffsets = (index, start, end) => {
71
+ const startSegment = index.segments.find(segment => start < segmentEnd(segment) && start >= segment.start) ?? index.segments.find(segment => segment.start >= start);
72
+ const endSegment = [...index.segments].reverse().find(segment => end > segment.start && end <= segmentEnd(segment)) ?? [...index.segments].reverse().find(segment => segmentEnd(segment) <= end);
73
+ if (!startSegment || !endSegment) {
74
+ return null;
75
+ }
76
+ const range = startSegment.node.ownerDocument.createRange();
77
+ range.setStart(startSegment.node, Math.max(0, start - startSegment.start));
78
+ range.setEnd(endSegment.node, Math.min(endSegment.node.data.length, end - endSegment.start));
79
+ return range.collapsed ? null : range;
80
+ };
81
+ const boundaryToOffset = (index, container, offset) => {
82
+ const segment = index.segments.find(candidate => candidate.node === container);
83
+ if (segment) {
84
+ return segment.start + offset;
85
+ }
86
+ // The boundary sits between nodes: it is at the start of the first text segment that follows it.
87
+ const boundary = container.ownerDocument?.createRange();
88
+ if (!boundary) {
89
+ return index.text.length;
90
+ }
91
+ boundary.setStart(container, offset);
92
+ const following = index.segments.find(candidate => {
93
+ const point = candidate.node.ownerDocument.createRange();
94
+ point.setStart(candidate.node, 0);
95
+ return boundary.compareBoundaryPoints(Range.START_TO_START, point) <= 0;
96
+ });
97
+ return following ? following.start : index.text.length;
98
+ };
99
+ export const offsetsFromRange = (index, range) => ({
100
+ start: boundaryToOffset(index, range.startContainer, range.startOffset),
101
+ end: boundaryToOffset(index, range.endContainer, range.endOffset)
102
+ });
103
+ //# sourceMappingURL=textIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textIndex.js","names":["BLOCK_TAGS","Set","EXCLUDED_TEXT_SELECTOR","nearestBlock","node","root","current","parentNode","Element","has","tagName","isExcluded","excludedSelector","element","parentElement","excluded","closest","Boolean","contains","buildTextIndex","ownerDocument","walker","createTreeWalker","NodeFilter","SHOW_TEXT","SHOW_ELEMENT","segments","text","previousBlock","addSeparator","length","endsWith","nextNode","textNode","block","push","start","data","segmentEnd","segment","rangeFromOffsets","index","end","startSegment","find","endSegment","reverse","range","createRange","setStart","Math","max","setEnd","min","collapsed","boundaryToOffset","container","offset","candidate","boundary","following","point","compareBoundaryPoints","Range","START_TO_START","offsetsFromRange","startContainer","startOffset","endContainer","endOffset"],"sources":["../../../../../../src/widgets/shared/documents/annotations/textIndex.ts"],"sourcesContent":["/*\n Maps between DOM ranges and character offsets in the plain text of an element, so anchors can be\n created from, and resolved to, selections in rendered content.\n\n Block boundaries and line breaks become a newline in the indexed text. Without them, adjacent\n paragraphs would run together (\"PurposeThis policy\") and quotes taken from rendered text would\n not match the same text in markdown source.\n */\n\nconst BLOCK_TAGS = new Set([\n 'ADDRESS', 'ARTICLE', 'ASIDE', 'BLOCKQUOTE', 'DD', 'DIV', 'DL', 'DT', 'FIGCAPTION', 'FIGURE', 'FOOTER',\n 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HEADER', 'HR', 'LI', 'MAIN', 'NAV', 'OL', 'P', 'PRE', 'SECTION',\n 'TABLE', 'TBODY', 'TD', 'TFOOT', 'TH', 'THEAD', 'TR', 'UL'\n]);\n\n// Interface text inside the annotated area (buttons, toolbars, decorative content) is not document text.\nexport const EXCLUDED_TEXT_SELECTOR = 'button, [role=\"toolbar\"], [aria-hidden=\"true\"], script, style, .documentAnnotations__overlay';\n\nexport type TextSegment = {\n node: Text;\n start: number;\n};\n\nexport type TextIndex = {\n text: string;\n segments: TextSegment[];\n};\n\nconst nearestBlock = (node: Node, root: Node): Node => {\n let current = node.parentNode;\n while (current && current !== root && !(current instanceof Element && BLOCK_TAGS.has(current.tagName))) {\n current = current.parentNode;\n }\n return current ?? root;\n};\n\nconst isExcluded = (node: Node, root: Element, excludedSelector: string): boolean => {\n const element = node instanceof Element ? node : node.parentElement;\n const excluded = element?.closest(excludedSelector);\n return Boolean(excluded && root.contains(excluded) && excluded !== root);\n};\n\nexport const buildTextIndex = (root: Element, excludedSelector = EXCLUDED_TEXT_SELECTOR): TextIndex => {\n const ownerDocument = root.ownerDocument;\n const walker = ownerDocument.createTreeWalker(root, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT);\n const segments: TextSegment[] = [];\n let text = '';\n let previousBlock: Node | null = null;\n\n const addSeparator = () => {\n if (text.length && !text.endsWith('\\n')) {\n text += '\\n';\n }\n };\n\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n if (isExcluded(node, root, excludedSelector)) {\n continue;\n }\n if (node instanceof Element) {\n if (node.tagName === 'BR') {\n addSeparator();\n }\n continue;\n }\n const textNode = node as Text;\n const block = nearestBlock(textNode, root);\n if (previousBlock && block !== previousBlock) {\n addSeparator();\n }\n segments.push({ node: textNode, start: text.length });\n text += textNode.data;\n previousBlock = block;\n }\n\n return { text, segments };\n};\n\nconst segmentEnd = (segment: TextSegment): number => segment.start + segment.node.data.length;\n\n/*\n Converts text offsets back to a DOM range. An offset that falls on an inserted separator snaps to\n the nearest real text: forwards for the start, backwards for the end.\n */\nexport const rangeFromOffsets = (index: TextIndex, start: number, end: number): Range | null => {\n const startSegment = index.segments.find((segment) => start < segmentEnd(segment) && start >= segment.start)\n ?? index.segments.find((segment) => segment.start >= start);\n const endSegment = [...index.segments].reverse().find((segment) => end > segment.start && end <= segmentEnd(segment))\n ?? [...index.segments].reverse().find((segment) => segmentEnd(segment) <= end);\n if (!startSegment || !endSegment) {\n return null;\n }\n const range = startSegment.node.ownerDocument.createRange();\n range.setStart(startSegment.node, Math.max(0, start - startSegment.start));\n range.setEnd(endSegment.node, Math.min(endSegment.node.data.length, end - endSegment.start));\n return range.collapsed ? null : range;\n};\n\nconst boundaryToOffset = (index: TextIndex, container: Node, offset: number): number => {\n const segment = index.segments.find((candidate) => candidate.node === container);\n if (segment) {\n return segment.start + offset;\n }\n // The boundary sits between nodes: it is at the start of the first text segment that follows it.\n const boundary = container.ownerDocument?.createRange();\n if (!boundary) {\n return index.text.length;\n }\n boundary.setStart(container, offset);\n const following = index.segments.find((candidate) => {\n const point = candidate.node.ownerDocument.createRange();\n point.setStart(candidate.node, 0);\n return boundary.compareBoundaryPoints(Range.START_TO_START, point) <= 0;\n });\n return following ? following.start : index.text.length;\n};\n\nexport const offsetsFromRange = (index: TextIndex, range: Range): { start: number; end: number } => ({\n start: boundaryToOffset(index, range.startContainer, range.startOffset),\n end: boundaryToOffset(index, range.endContainer, range.endOffset)\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,150 @@
1
+ const DEFAULT_CONTEXT_LENGTH = 32;
2
+ const WHITESPACE = /\s/;
3
+ // Collapses each run of whitespace to one space. Views lay text out differently (a paragraph break
4
+ // in markdown is a newline in rendered text), so quotes are compared without whitespace differences.
5
+ export const normaliseWhitespace = text => {
6
+ let normalised = '';
7
+ const offsets = [];
8
+ let inWhitespace = false;
9
+ for (let index = 0; index < text.length; index += 1) {
10
+ const isWhitespace = WHITESPACE.test(text[index]);
11
+ if (!isWhitespace || !inWhitespace) {
12
+ normalised += isWhitespace ? ' ' : text[index];
13
+ offsets.push(index);
14
+ }
15
+ inWhitespace = isWhitespace;
16
+ }
17
+ offsets.push(text.length);
18
+ return {
19
+ text: normalised,
20
+ offsets
21
+ };
22
+ };
23
+ const collapse = text => normaliseWhitespace(text).text;
24
+
25
+ /*
26
+ Creates an anchor for text[start, end). Surrounding whitespace is trimmed from the selection, and
27
+ an empty or whitespace-only selection returns null.
28
+ */
29
+ export const createTextQuoteAnchor = (text, start, end, contextLength = DEFAULT_CONTEXT_LENGTH) => {
30
+ let from = Math.max(0, Math.min(start, end));
31
+ let to = Math.min(text.length, Math.max(start, end));
32
+ while (from < to && WHITESPACE.test(text[from])) {
33
+ from += 1;
34
+ }
35
+ while (to > from && WHITESPACE.test(text[to - 1])) {
36
+ to -= 1;
37
+ }
38
+ if (from === to) {
39
+ return null;
40
+ }
41
+ return {
42
+ exact: text.slice(from, to),
43
+ prefix: text.slice(Math.max(0, from - contextLength), from),
44
+ suffix: text.slice(to, to + contextLength),
45
+ start: from
46
+ };
47
+ };
48
+ const commonSuffixLength = (first, second) => {
49
+ let length = 0;
50
+ while (length < first.length && length < second.length && first[first.length - 1 - length] === second[second.length - 1 - length]) {
51
+ length += 1;
52
+ }
53
+ return length;
54
+ };
55
+ const commonPrefixLength = (first, second) => {
56
+ let length = 0;
57
+ while (length < first.length && length < second.length && first[length] === second[length]) {
58
+ length += 1;
59
+ }
60
+ return length;
61
+ };
62
+
63
+ /*
64
+ Anchors come from stored comments, which may be written by anyone, so their cost is bounded:
65
+ context beyond what createTextQuoteAnchor stores is ignored, and a quote that occurs very many
66
+ times (e.g. a single letter) is only compared at its first occurrences. Without these limits a
67
+ crafted anchor makes each resolution quadratic in the document length.
68
+ */
69
+ const MAX_CONTEXT_LENGTH = DEFAULT_CONTEXT_LENGTH * 4;
70
+ const MAX_OCCURRENCES = 1000;
71
+ const OCCURRENCES_PER_DIRECTION = MAX_OCCURRENCES / 2;
72
+ const findClosestNormalisedIndex = (document, originalIndex) => {
73
+ let low = 0;
74
+ let high = document.offsets.length - 1;
75
+ while (low < high) {
76
+ const middle = Math.floor((low + high) / 2);
77
+ if (document.offsets[middle] < originalIndex) {
78
+ low = middle + 1;
79
+ } else {
80
+ high = middle;
81
+ }
82
+ }
83
+ return Math.min(low, document.text.length);
84
+ };
85
+ const resolveInNormalisedText = (document, textLength, anchor) => {
86
+ const exact = collapse(anchor.exact).trim();
87
+ if (!exact) {
88
+ return null;
89
+ }
90
+ const prefix = collapse(anchor.prefix.slice(-MAX_CONTEXT_LENGTH));
91
+ const suffix = collapse(anchor.suffix.slice(0, MAX_CONTEXT_LENGTH));
92
+ let best = null;
93
+ const candidates = [];
94
+ if (anchor.start === undefined) {
95
+ for (let index = document.text.indexOf(exact); index !== -1 && candidates.length < MAX_OCCURRENCES; index = document.text.indexOf(exact, index + 1)) {
96
+ candidates.push(index);
97
+ }
98
+ } else {
99
+ const expectedIndex = findClosestNormalisedIndex(document, anchor.start);
100
+ let following = document.text.indexOf(exact, expectedIndex);
101
+ for (let count = 0; following !== -1 && count < OCCURRENCES_PER_DIRECTION; count += 1) {
102
+ candidates.push(following);
103
+ following = document.text.indexOf(exact, following + 1);
104
+ }
105
+ let preceding = document.text.lastIndexOf(exact, expectedIndex - 1);
106
+ for (let count = 0; preceding !== -1 && count < OCCURRENCES_PER_DIRECTION; count += 1) {
107
+ candidates.push(preceding);
108
+ if (preceding === 0) {
109
+ break;
110
+ }
111
+ preceding = document.text.lastIndexOf(exact, preceding - 1);
112
+ }
113
+ }
114
+ for (const index of candidates) {
115
+ const before = document.text.slice(Math.max(0, index - prefix.length), index);
116
+ const after = document.text.slice(index + exact.length, index + exact.length + suffix.length);
117
+ const distance = anchor.start === undefined ? 0 : Math.abs(document.offsets[index] - anchor.start) / Math.max(textLength, 1);
118
+ // Context dominates; distance is below one character's worth so it only breaks ties.
119
+ const score = commonSuffixLength(prefix, before) + commonPrefixLength(suffix, after) - distance;
120
+ if (!best || score > best.score) {
121
+ best = {
122
+ index,
123
+ score
124
+ };
125
+ }
126
+ }
127
+ if (!best) {
128
+ return null;
129
+ }
130
+ return {
131
+ start: document.offsets[best.index],
132
+ end: document.offsets[best.index + exact.length - 1] + 1
133
+ };
134
+ };
135
+
136
+ /*
137
+ Returns a resolver for anchors in `text`, normalising the text once so a document with many
138
+ comments is not re-normalised for each of them. Every occurrence of a quote is scored by how much
139
+ of the stored prefix and suffix surround it, with closeness to the original position as a
140
+ tiebreak. The resolver returns null when the quote no longer appears, e.g. because it was edited away.
141
+ */
142
+ /* eslint-disable-next-line no-unused-vars */
143
+ export const createTextQuoteResolver = text => {
144
+ const document = normaliseWhitespace(text);
145
+ return anchor => resolveInNormalisedText(document, text.length, anchor);
146
+ };
147
+
148
+ // Finds a single anchor in `text`; see createTextQuoteResolver.
149
+ export const resolveTextQuoteAnchor = (text, anchor) => createTextQuoteResolver(text)(anchor);
150
+ //# sourceMappingURL=textQuoteAnchor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textQuoteAnchor.js","names":["DEFAULT_CONTEXT_LENGTH","WHITESPACE","normaliseWhitespace","text","normalised","offsets","inWhitespace","index","length","isWhitespace","test","push","collapse","createTextQuoteAnchor","start","end","contextLength","from","Math","max","min","to","exact","slice","prefix","suffix","commonSuffixLength","first","second","commonPrefixLength","MAX_CONTEXT_LENGTH","MAX_OCCURRENCES","OCCURRENCES_PER_DIRECTION","findClosestNormalisedIndex","document","originalIndex","low","high","middle","floor","resolveInNormalisedText","textLength","anchor","trim","best","candidates","undefined","indexOf","expectedIndex","following","count","preceding","lastIndexOf","before","after","distance","abs","score","createTextQuoteResolver","resolveTextQuoteAnchor"],"sources":["../../../../../../src/widgets/shared/documents/annotations/textQuoteAnchor.ts"],"sourcesContent":["import { TextQuoteAnchor } from './annotations.interfaces';\n\nconst DEFAULT_CONTEXT_LENGTH = 32;\nconst WHITESPACE = /\\s/;\n\ntype NormalisedText = {\n text: string;\n // offsets[i] is the index in the original text of normalised character i; the extra final entry\n // is the original length, so a match ending at the last character can be mapped back.\n offsets: number[];\n};\n\n// Collapses each run of whitespace to one space. Views lay text out differently (a paragraph break\n// in markdown is a newline in rendered text), so quotes are compared without whitespace differences.\nexport const normaliseWhitespace = (text: string): NormalisedText => {\n let normalised = '';\n const offsets: number[] = [];\n let inWhitespace = false;\n for (let index = 0; index < text.length; index += 1) {\n const isWhitespace = WHITESPACE.test(text[index]);\n if (!isWhitespace || !inWhitespace) {\n normalised += isWhitespace ? ' ' : text[index];\n offsets.push(index);\n }\n inWhitespace = isWhitespace;\n }\n offsets.push(text.length);\n return { text: normalised, offsets };\n};\n\nconst collapse = (text: string): string => normaliseWhitespace(text).text;\n\n/*\n Creates an anchor for text[start, end). Surrounding whitespace is trimmed from the selection, and\n an empty or whitespace-only selection returns null.\n */\nexport const createTextQuoteAnchor = (\n text: string,\n start: number,\n end: number,\n contextLength = DEFAULT_CONTEXT_LENGTH\n): TextQuoteAnchor | null => {\n let from = Math.max(0, Math.min(start, end));\n let to = Math.min(text.length, Math.max(start, end));\n while (from < to && WHITESPACE.test(text[from])) {\n from += 1;\n }\n while (to > from && WHITESPACE.test(text[to - 1])) {\n to -= 1;\n }\n if (from === to) {\n return null;\n }\n return {\n exact: text.slice(from, to),\n prefix: text.slice(Math.max(0, from - contextLength), from),\n suffix: text.slice(to, to + contextLength),\n start: from\n };\n};\n\nconst commonSuffixLength = (first: string, second: string): number => {\n let length = 0;\n while (length < first.length && length < second.length && first[first.length - 1 - length] === second[second.length - 1 - length]) {\n length += 1;\n }\n return length;\n};\n\nconst commonPrefixLength = (first: string, second: string): number => {\n let length = 0;\n while (length < first.length && length < second.length && first[length] === second[length]) {\n length += 1;\n }\n return length;\n};\n\n/*\n Anchors come from stored comments, which may be written by anyone, so their cost is bounded:\n context beyond what createTextQuoteAnchor stores is ignored, and a quote that occurs very many\n times (e.g. a single letter) is only compared at its first occurrences. Without these limits a\n crafted anchor makes each resolution quadratic in the document length.\n */\nconst MAX_CONTEXT_LENGTH = DEFAULT_CONTEXT_LENGTH * 4;\nconst MAX_OCCURRENCES = 1000;\nconst OCCURRENCES_PER_DIRECTION = MAX_OCCURRENCES / 2;\n\ntype TextQuoteMatch = { start: number; end: number };\n\nconst findClosestNormalisedIndex = (document: NormalisedText, originalIndex: number): number => {\n let low = 0;\n let high = document.offsets.length - 1;\n while (low < high) {\n const middle = Math.floor((low + high) / 2);\n if (document.offsets[middle] < originalIndex) {\n low = middle + 1;\n } else {\n high = middle;\n }\n }\n return Math.min(low, document.text.length);\n};\n\nconst resolveInNormalisedText = (document: NormalisedText, textLength: number, anchor: TextQuoteAnchor): TextQuoteMatch | null => {\n const exact = collapse(anchor.exact).trim();\n if (!exact) {\n return null;\n }\n const prefix = collapse(anchor.prefix.slice(-MAX_CONTEXT_LENGTH));\n const suffix = collapse(anchor.suffix.slice(0, MAX_CONTEXT_LENGTH));\n let best: { index: number; score: number } | null = null;\n const candidates: number[] = [];\n\n if (anchor.start === undefined) {\n for (let index = document.text.indexOf(exact); index !== -1 && candidates.length < MAX_OCCURRENCES; index = document.text.indexOf(exact, index + 1)) {\n candidates.push(index);\n }\n } else {\n const expectedIndex = findClosestNormalisedIndex(document, anchor.start);\n let following = document.text.indexOf(exact, expectedIndex);\n for (let count = 0; following !== -1 && count < OCCURRENCES_PER_DIRECTION; count += 1) {\n candidates.push(following);\n following = document.text.indexOf(exact, following + 1);\n }\n\n let preceding = document.text.lastIndexOf(exact, expectedIndex - 1);\n for (let count = 0; preceding !== -1 && count < OCCURRENCES_PER_DIRECTION; count += 1) {\n candidates.push(preceding);\n if (preceding === 0) {\n break;\n }\n preceding = document.text.lastIndexOf(exact, preceding - 1);\n }\n }\n\n for (const index of candidates) {\n const before = document.text.slice(Math.max(0, index - prefix.length), index);\n const after = document.text.slice(index + exact.length, index + exact.length + suffix.length);\n const distance = anchor.start === undefined ? 0 : Math.abs(document.offsets[index] - anchor.start) / Math.max(textLength, 1);\n // Context dominates; distance is below one character's worth so it only breaks ties.\n const score = commonSuffixLength(prefix, before) + commonPrefixLength(suffix, after) - distance;\n if (!best || score > best.score) {\n best = { index, score };\n }\n }\n\n if (!best) {\n return null;\n }\n return {\n start: document.offsets[best.index],\n end: document.offsets[best.index + exact.length - 1] + 1\n };\n};\n\n/*\n Returns a resolver for anchors in `text`, normalising the text once so a document with many\n comments is not re-normalised for each of them. Every occurrence of a quote is scored by how much\n of the stored prefix and suffix surround it, with closeness to the original position as a\n tiebreak. The resolver returns null when the quote no longer appears, e.g. because it was edited away.\n */\n/* eslint-disable-next-line no-unused-vars */\nexport const createTextQuoteResolver = (text: string): ((anchor: TextQuoteAnchor) => TextQuoteMatch | null) => {\n const document = normaliseWhitespace(text);\n return (anchor) => resolveInNormalisedText(document, text.length, anchor);\n};\n\n// Finds a single anchor in `text`; see createTextQuoteResolver.\nexport const resolveTextQuoteAnchor = (text: string, anchor: TextQuoteAnchor): TextQuoteMatch | null =>\n createTextQuoteResolver(text)(anchor);\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,168 @@
1
+ import { getFileExtension, getUrlExtension } from '../../../helpers/fileHelpers';
2
+ const markdownExtensions = ['md', 'markdown'];
3
+ const wordExtensions = ['docx', 'dotx'];
4
+ const imageExtensions = ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp', 'avif'];
5
+ const textExtensions = ['json', 'txt', 'csv', 'log'];
6
+ const wordMimeType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
7
+ const getSuppliedDocumentName = document => document.fileName || document.file?.name;
8
+ export const getDocumentFileName = document => getSuppliedDocumentName(document) || document.title;
9
+ export const getDocumentExtension = document => {
10
+ const suppliedName = getSuppliedDocumentName(document);
11
+ if (suppliedName) {
12
+ return getFileExtension(suppliedName);
13
+ }
14
+ return document.url ? getUrlExtension(document.url) : getFileExtension(document.title);
15
+ };
16
+ export const getDocumentKind = document => {
17
+ const extension = getDocumentExtension(document);
18
+ const fileType = document.fileType || document.file?.type || '';
19
+ if (extension === 'pdf' || fileType === 'application/pdf') {
20
+ return 'pdf';
21
+ }
22
+ if (markdownExtensions.includes(extension) || fileType === 'text/markdown') {
23
+ return 'markdown';
24
+ }
25
+ if (wordExtensions.includes(extension) || fileType === wordMimeType) {
26
+ return 'word';
27
+ }
28
+ if (imageExtensions.includes(extension) || fileType.startsWith('image/')) {
29
+ return 'image';
30
+ }
31
+ if (textExtensions.includes(extension) || fileType.startsWith('text/') || fileType === 'application/json') {
32
+ return 'text';
33
+ }
34
+ return 'unsupported';
35
+ };
36
+ const fetchDocument = async (url, signal) => {
37
+ const response = await fetch(url, {
38
+ signal
39
+ });
40
+ if (!response.ok) {
41
+ throw new Error(`Document request failed (${response.status}).`);
42
+ }
43
+ // Single-page-app servers answer unknown paths with their index page rather than a 404.
44
+ if (response.headers.get('content-type')?.includes('text/html')) {
45
+ throw new Error('The document URL returned a web page instead of a document.');
46
+ }
47
+ return response;
48
+ };
49
+ export const fetchDocumentAsText = async (url, signal) => (await fetchDocument(url, signal)).text();
50
+ export const fetchDocumentAsArrayBuffer = async (url, signal) => (await fetchDocument(url, signal)).arrayBuffer();
51
+ export const isJsonDocument = document => getDocumentExtension(document) === 'json' || (document.fileType || document.file?.type) === 'application/json';
52
+ const anyScheme = /^[a-z][a-z\d+.-]*:/i;
53
+
54
+ // URLs the browser may render natively. An unsandboxed iframe navigated to a `javascript:` URL runs it
55
+ // in the host page, so only network, blob and inert data URLs of the matching type are allowed;
56
+ // relative URLs (no scheme) resolve against the page and are allowed too.
57
+ const safeNativeUrls = {
58
+ pdf: /^(?:https?:|blob:|data:application\/pdf[;,])/i,
59
+ image: /^(?:https?:|blob:|data:image\/(?:png|jpeg|gif|webp|avif|bmp|svg\+xml)[;,])/i
60
+ };
61
+ const SPACE_CODE_POINT = 32;
62
+
63
+ // Mirrors the URL parser: tabs and newlines are removed anywhere and control characters and spaces are
64
+ // trimmed from the ends, so "java\nscript:" or " javascript:" are recognised as the scheme they become.
65
+ const normaliseUrlForSchemeCheck = url => {
66
+ const withoutBreaks = url.replace(/[\t\n\r]/g, '');
67
+ let start = 0;
68
+ let end = withoutBreaks.length;
69
+ while (start < end && withoutBreaks.charCodeAt(start) <= SPACE_CODE_POINT) {
70
+ start += 1;
71
+ }
72
+ while (end > start && withoutBreaks.charCodeAt(end - 1) <= SPACE_CODE_POINT) {
73
+ end -= 1;
74
+ }
75
+ return withoutBreaks.slice(start, end);
76
+ };
77
+
78
+ // The PDF format requires its `%PDF-` header within the first 1024 bytes.
79
+ const PDF_SIGNATURE = '%PDF-';
80
+ const PDF_HEADER_SEARCH_LENGTH = 1024;
81
+ export const hasPdfSignature = bytes => {
82
+ const header = new Uint8Array(bytes, 0, Math.min(bytes.byteLength, PDF_HEADER_SEARCH_LENGTH));
83
+ return String.fromCharCode(...Array.from(header)).includes(PDF_SIGNATURE);
84
+ };
85
+
86
+ /*
87
+ Whether a URL would render with the host page's own origin: blob URLs inherit their creator's
88
+ origin, and relative or same-origin URLs are the host's. Content from such a URL renders as
89
+ whatever type it declares, so an HTML page disguised as a PDF would run script in the host.
90
+ */
91
+ export const rendersInHostOrigin = url => {
92
+ const normalised = normaliseUrlForSchemeCheck(url);
93
+ if (/^blob:/i.test(normalised)) {
94
+ return true;
95
+ }
96
+ if (/^data:/i.test(normalised) || typeof window === 'undefined') {
97
+ // Data URLs load in an opaque origin of their own.
98
+ return false;
99
+ }
100
+ try {
101
+ return new URL(normalised, window.location.href).origin === window.location.origin;
102
+ } catch {
103
+ return true;
104
+ }
105
+ };
106
+
107
+ /*
108
+ Whether a cross-origin URL belongs to one of the origins the host has chosen to trust. Trusting
109
+ an origin trusts its redirects too, since a directly framed URL is never inspected.
110
+ */
111
+ export const isTrustedPdfOrigin = (url, trustedOrigins = []) => {
112
+ if (!trustedOrigins.length || typeof window === 'undefined' || rendersInHostOrigin(url)) {
113
+ return false;
114
+ }
115
+ try {
116
+ const {
117
+ origin
118
+ } = new URL(normaliseUrlForSchemeCheck(url), window.location.href);
119
+ return trustedOrigins.some(trusted => {
120
+ try {
121
+ return new URL(trusted).origin === origin;
122
+ } catch {
123
+ return false;
124
+ }
125
+ });
126
+ } catch {
127
+ return false;
128
+ }
129
+ };
130
+ export const isSafeNativeDocumentUrl = (url, kind) => {
131
+ const normalised = normaliseUrlForSchemeCheck(url);
132
+ const pattern = safeNativeUrls[kind];
133
+ return Boolean(pattern && normalised && (pattern.test(normalised) || !anyScheme.test(normalised)));
134
+ };
135
+ const RESOURCE_PROTOCOLS = new Set(['http:', 'https:', 'blob:', 'mailto:']);
136
+ const RASTER_IMAGE_DATA_URL = /^data:image\/(?:png|jpeg|gif|webp);base64,/i;
137
+ // Stands in for the page URL during server rendering, where there is no window.
138
+ const SERVER_PAGE_URL = 'https://document.invalid/';
139
+
140
+ /*
141
+ Keeps anchors and safe URLs, drops other schemes (javascript:, vbscript:, file:, ...), and resolves
142
+ relative paths against the document's own URL so embedded images and links work. The scheme is
143
+ taken from the parsed URL, which is what the browser follows: checking the raw text would let
144
+ "java\tscript:" or " javascript:" through, since the parser removes the tab and the space.
145
+ */
146
+ export const resolveDocumentResource = (resource, documentUrl) => {
147
+ const normalised = normaliseUrlForSchemeCheck(resource);
148
+ if (!normalised) {
149
+ return '';
150
+ }
151
+ if (normalised.startsWith('#') || RASTER_IMAGE_DATA_URL.test(normalised)) {
152
+ return normalised;
153
+ }
154
+ const pageUrl = typeof window === 'undefined' ? SERVER_PAGE_URL : window.location.href;
155
+ let resolved;
156
+ try {
157
+ resolved = new URL(normalised, documentUrl ? new URL(documentUrl, pageUrl) : pageUrl);
158
+ } catch {
159
+ return '';
160
+ }
161
+ if (!RESOURCE_PROTOCOLS.has(resolved.protocol)) {
162
+ return '';
163
+ }
164
+ // Without a document URL a relative path is left as written, so it resolves against the page.
165
+ return anyScheme.test(normalised) || !documentUrl ? normalised : resolved.href;
166
+ };
167
+ export const resolveDocumentResourceWithFallback = (resource, documentUrl, resolveResourceUrl) => resolveResourceUrl ? resolveResourceUrl(resource) : resolveDocumentResource(resource, documentUrl);
168
+ //# sourceMappingURL=documentHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentHelpers.js","names":["getFileExtension","getUrlExtension","markdownExtensions","wordExtensions","imageExtensions","textExtensions","wordMimeType","getSuppliedDocumentName","document","fileName","file","name","getDocumentFileName","title","getDocumentExtension","suppliedName","url","getDocumentKind","extension","fileType","type","includes","startsWith","fetchDocument","signal","response","fetch","ok","Error","status","headers","get","fetchDocumentAsText","text","fetchDocumentAsArrayBuffer","arrayBuffer","isJsonDocument","anyScheme","safeNativeUrls","pdf","image","SPACE_CODE_POINT","normaliseUrlForSchemeCheck","withoutBreaks","replace","start","end","length","charCodeAt","slice","PDF_SIGNATURE","PDF_HEADER_SEARCH_LENGTH","hasPdfSignature","bytes","header","Uint8Array","Math","min","byteLength","String","fromCharCode","Array","from","rendersInHostOrigin","normalised","test","window","URL","location","href","origin","isTrustedPdfOrigin","trustedOrigins","some","trusted","isSafeNativeDocumentUrl","kind","pattern","Boolean","RESOURCE_PROTOCOLS","Set","RASTER_IMAGE_DATA_URL","SERVER_PAGE_URL","resolveDocumentResource","resource","documentUrl","pageUrl","resolved","has","protocol","resolveDocumentResourceWithFallback","resolveResourceUrl"],"sources":["../../../../../src/widgets/shared/documents/documentHelpers.ts"],"sourcesContent":["import { getFileExtension, getUrlExtension } from '../../../helpers/fileHelpers';\nimport { DocumentKind, DocumentSource, ResolveResourceUrl } from './documents.interfaces';\n\nconst markdownExtensions = ['md', 'markdown'];\nconst wordExtensions = ['docx', 'dotx'];\nconst imageExtensions = ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp', 'avif'];\nconst textExtensions = ['json', 'txt', 'csv', 'log'];\nconst wordMimeType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\n\nconst getSuppliedDocumentName = (document: DocumentSource): string | undefined => document.fileName || document.file?.name;\n\nexport const getDocumentFileName = (document: DocumentSource): string =>\n getSuppliedDocumentName(document) || document.title;\n\nexport const getDocumentExtension = (document: DocumentSource): string => {\n const suppliedName = getSuppliedDocumentName(document);\n if (suppliedName) {\n return getFileExtension(suppliedName);\n }\n return document.url ? getUrlExtension(document.url) : getFileExtension(document.title);\n};\n\nexport const getDocumentKind = (document: DocumentSource): DocumentKind => {\n const extension = getDocumentExtension(document);\n const fileType = document.fileType || document.file?.type || '';\n\n if (extension === 'pdf' || fileType === 'application/pdf') {\n return 'pdf';\n }\n if (markdownExtensions.includes(extension) || fileType === 'text/markdown') {\n return 'markdown';\n }\n if (wordExtensions.includes(extension) || fileType === wordMimeType) {\n return 'word';\n }\n if (imageExtensions.includes(extension) || fileType.startsWith('image/')) {\n return 'image';\n }\n if (textExtensions.includes(extension) || fileType.startsWith('text/') || fileType === 'application/json') {\n return 'text';\n }\n return 'unsupported';\n};\n\nconst fetchDocument = async (url: string, signal?: AbortSignal): Promise<Response> => {\n const response = await fetch(url, { signal });\n if (!response.ok) {\n throw new Error(`Document request failed (${ response.status }).`);\n }\n // Single-page-app servers answer unknown paths with their index page rather than a 404.\n if (response.headers.get('content-type')?.includes('text/html')) {\n throw new Error('The document URL returned a web page instead of a document.');\n }\n return response;\n};\n\nexport const fetchDocumentAsText = async (url: string, signal?: AbortSignal): Promise<string> => (await fetchDocument(url, signal)).text();\n\nexport const fetchDocumentAsArrayBuffer = async (url: string, signal?: AbortSignal): Promise<ArrayBuffer> =>\n (await fetchDocument(url, signal)).arrayBuffer();\n\nexport const isJsonDocument = (document: DocumentSource): boolean =>\n getDocumentExtension(document) === 'json' || (document.fileType || document.file?.type) === 'application/json';\n\nconst anyScheme = /^[a-z][a-z\\d+.-]*:/i;\n\n// URLs the browser may render natively. An unsandboxed iframe navigated to a `javascript:` URL runs it\n// in the host page, so only network, blob and inert data URLs of the matching type are allowed;\n// relative URLs (no scheme) resolve against the page and are allowed too.\nconst safeNativeUrls: Partial<Record<DocumentKind, RegExp>> = {\n pdf: /^(?:https?:|blob:|data:application\\/pdf[;,])/i,\n image: /^(?:https?:|blob:|data:image\\/(?:png|jpeg|gif|webp|avif|bmp|svg\\+xml)[;,])/i\n};\n\nconst SPACE_CODE_POINT = 32;\n\n// Mirrors the URL parser: tabs and newlines are removed anywhere and control characters and spaces are\n// trimmed from the ends, so \"java\\nscript:\" or \" javascript:\" are recognised as the scheme they become.\nconst normaliseUrlForSchemeCheck = (url: string): string => {\n const withoutBreaks = url.replace(/[\\t\\n\\r]/g, '');\n let start = 0;\n let end = withoutBreaks.length;\n while (start < end && withoutBreaks.charCodeAt(start) <= SPACE_CODE_POINT) {\n start += 1;\n }\n while (end > start && withoutBreaks.charCodeAt(end - 1) <= SPACE_CODE_POINT) {\n end -= 1;\n }\n return withoutBreaks.slice(start, end);\n};\n\n// The PDF format requires its `%PDF-` header within the first 1024 bytes.\nconst PDF_SIGNATURE = '%PDF-';\nconst PDF_HEADER_SEARCH_LENGTH = 1024;\n\nexport const hasPdfSignature = (bytes: ArrayBuffer): boolean => {\n const header = new Uint8Array(bytes, 0, Math.min(bytes.byteLength, PDF_HEADER_SEARCH_LENGTH));\n return String.fromCharCode(...Array.from(header)).includes(PDF_SIGNATURE);\n};\n\n/*\n Whether a URL would render with the host page's own origin: blob URLs inherit their creator's\n origin, and relative or same-origin URLs are the host's. Content from such a URL renders as\n whatever type it declares, so an HTML page disguised as a PDF would run script in the host.\n */\nexport const rendersInHostOrigin = (url: string): boolean => {\n const normalised = normaliseUrlForSchemeCheck(url);\n if (/^blob:/i.test(normalised)) {\n return true;\n }\n if (/^data:/i.test(normalised) || typeof window === 'undefined') {\n // Data URLs load in an opaque origin of their own.\n return false;\n }\n try {\n return new URL(normalised, window.location.href).origin === window.location.origin;\n } catch {\n return true;\n }\n};\n\n/*\n Whether a cross-origin URL belongs to one of the origins the host has chosen to trust. Trusting\n an origin trusts its redirects too, since a directly framed URL is never inspected.\n */\nexport const isTrustedPdfOrigin = (url: string, trustedOrigins: string[] = []): boolean => {\n if (!trustedOrigins.length || typeof window === 'undefined' || rendersInHostOrigin(url)) {\n return false;\n }\n try {\n const { origin } = new URL(normaliseUrlForSchemeCheck(url), window.location.href);\n return trustedOrigins.some((trusted) => {\n try {\n return new URL(trusted).origin === origin;\n } catch {\n return false;\n }\n });\n } catch {\n return false;\n }\n};\n\nexport const isSafeNativeDocumentUrl =(url: string, kind: DocumentKind): boolean => {\n const normalised = normaliseUrlForSchemeCheck(url);\n const pattern = safeNativeUrls[kind];\n return Boolean(pattern && normalised && (pattern.test(normalised) || !anyScheme.test(normalised)));\n};\n\nconst RESOURCE_PROTOCOLS = new Set(['http:', 'https:', 'blob:', 'mailto:']);\nconst RASTER_IMAGE_DATA_URL = /^data:image\\/(?:png|jpeg|gif|webp);base64,/i;\n// Stands in for the page URL during server rendering, where there is no window.\nconst SERVER_PAGE_URL = 'https://document.invalid/';\n\n/*\n Keeps anchors and safe URLs, drops other schemes (javascript:, vbscript:, file:, ...), and resolves\n relative paths against the document's own URL so embedded images and links work. The scheme is\n taken from the parsed URL, which is what the browser follows: checking the raw text would let\n \"java\\tscript:\" or \" javascript:\" through, since the parser removes the tab and the space.\n */\nexport const resolveDocumentResource = (resource: string, documentUrl?: string): string => {\n const normalised = normaliseUrlForSchemeCheck(resource);\n if (!normalised) {\n return '';\n }\n if (normalised.startsWith('#') || RASTER_IMAGE_DATA_URL.test(normalised)) {\n return normalised;\n }\n const pageUrl = typeof window === 'undefined' ? SERVER_PAGE_URL : window.location.href;\n let resolved: URL;\n try {\n resolved = new URL(normalised, documentUrl ? new URL(documentUrl, pageUrl) : pageUrl);\n } catch {\n return '';\n }\n if (!RESOURCE_PROTOCOLS.has(resolved.protocol)) {\n return '';\n }\n // Without a document URL a relative path is left as written, so it resolves against the page.\n return anyScheme.test(normalised) || !documentUrl ? normalised : resolved.href;\n};\n\nexport const resolveDocumentResourceWithFallback = (\n resource: string,\n documentUrl: string | undefined,\n resolveResourceUrl?: ResolveResourceUrl\n): string | undefined =>\n resolveResourceUrl\n ? resolveResourceUrl(resource)\n : resolveDocumentResource(resource, documentUrl);\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=documents.interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.interfaces.js","names":[],"sources":["../../../../../src/widgets/shared/documents/documents.interfaces.ts"],"sourcesContent":["export type DocumentKind = 'pdf' | 'markdown' | 'word' | 'image' | 'text' | 'unsupported';\n\nexport type DocumentLoadStatus = 'idle' | 'loading' | 'ready' | 'error';\n\n// A document can be supplied as inline text, a local File, or a URL; the first available wins in that order.\nexport type DocumentSource = {\n title: string;\n fileName?: string;\n fileType?: string;\n fileSize?: number;\n file?: File;\n url?: string;\n text?: string;\n};\n\n/* eslint-disable-next-line no-unused-vars */\nexport type ResolveResourceUrl = (resource: string) => string | undefined;\n\nexport type LoadedDocument = {\n kind: DocumentKind;\n // Text for text-based kinds (markdown, text); bytes for kinds that need parsing (word).\n content?: string;\n arrayBuffer?: ArrayBuffer;\n // Object or remote URL for kinds the browser renders natively (pdf, image).\n url?: string;\n // True when `url` is an object URL created for this load; it is revoked once no longer shown.\n ownsUrl?: boolean;\n};\n"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,65 @@
1
+ import React, { useMemo } from 'react';
2
+ import MarkdownRenderer from '../markdownRenderer/MarkdownRenderer';
3
+ import { buildBlockDiff, buildLineDiff, getMarkdownDefinitions, summariseDiff } from './buildDocumentDiff';
4
+ import './documentDiff.css';
5
+
6
+ // The change is also announced in text, so it is not conveyed by colour alone.
7
+ const ChangeMarker = ({
8
+ change,
9
+ labels
10
+ }) => change === 'unchanged' ? null : /*#__PURE__*/React.createElement("span", {
11
+ className: "sr-only"
12
+ }, change === 'added' ? labels.added : labels.removed, ": ");
13
+ export const DocumentDiff = ({
14
+ baseline,
15
+ revised,
16
+ view = 'rendered',
17
+ headingOffset = 0,
18
+ resolveResourceUrl,
19
+ labels
20
+ }) => {
21
+ const blocks = useMemo(() => view === 'rendered' ? buildBlockDiff(baseline, revised) : [], [view, baseline, revised]);
22
+ const definitions = useMemo(() => view === 'rendered' ? {
23
+ baseline: getMarkdownDefinitions(baseline),
24
+ revised: getMarkdownDefinitions(revised)
25
+ } : {
26
+ baseline: '',
27
+ revised: ''
28
+ }, [view, baseline, revised]);
29
+ const lines = useMemo(() => view === 'source' ? buildLineDiff(baseline, revised) : [], [view, baseline, revised]);
30
+ const summary = summariseDiff(view === 'rendered' ? blocks : lines);
31
+ const hasChanges = summary.added > 0 || summary.removed > 0;
32
+ return /*#__PURE__*/React.createElement("div", {
33
+ className: `documentDiff documentDiff--${view}`
34
+ }, /*#__PURE__*/React.createElement("p", {
35
+ className: "documentDiff__summary",
36
+ role: "status"
37
+ }, hasChanges ? labels.summary(summary.added, summary.removed) : labels.noChanges), view === 'rendered' && blocks.map((block, index) => /*#__PURE__*/React.createElement("div", {
38
+ // Blocks have no stable identity beyond their position in the diff.
39
+ key: `${block.change}_${index}`,
40
+ className: `documentDiff__block documentDiff__block--${block.change}`
41
+ }, /*#__PURE__*/React.createElement(ChangeMarker, {
42
+ change: block.change,
43
+ labels: labels
44
+ }), /*#__PURE__*/React.createElement(MarkdownRenderer, {
45
+ markdown: `${block.change === 'removed' ? definitions.baseline : definitions.revised}\n\n${block.markdown}`,
46
+ headingOffset: headingOffset,
47
+ resolveResourceUrl: resolveResourceUrl,
48
+ cssClass: "documentDiff__markdown"
49
+ }))), view === 'source' && /*#__PURE__*/React.createElement("pre", {
50
+ className: "documentDiff__source"
51
+ }, lines.map((line, index) => /*#__PURE__*/React.createElement("span", {
52
+ key: `${line.change}_${index}`,
53
+ className: `documentDiff__line documentDiff__line--${line.change}`
54
+ }, /*#__PURE__*/React.createElement(ChangeMarker, {
55
+ change: line.change,
56
+ labels: labels
57
+ }), line.segments.map((segment, segmentIndex) => segment.change === 'unchanged' ? /*#__PURE__*/React.createElement(React.Fragment, {
58
+ key: segmentIndex
59
+ }, segment.text) : /*#__PURE__*/React.createElement("mark", {
60
+ key: segmentIndex,
61
+ className: `documentDiff__word documentDiff__word--${segment.change}`
62
+ }, segment.text)), '\n'))));
63
+ };
64
+ export default DocumentDiff;
65
+ //# sourceMappingURL=DocumentDiff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentDiff.js","names":["React","useMemo","MarkdownRenderer","buildBlockDiff","buildLineDiff","getMarkdownDefinitions","summariseDiff","ChangeMarker","change","labels","createElement","className","added","removed","DocumentDiff","baseline","revised","view","headingOffset","resolveResourceUrl","blocks","definitions","lines","summary","hasChanges","role","noChanges","map","block","index","key","markdown","cssClass","line","segments","segment","segmentIndex","Fragment","text"],"sources":["../../../../../../../src/widgets/shared/documents/engines/documentDiff/DocumentDiff.tsx"],"sourcesContent":["import React, { FC, useMemo } from 'react';\n\nimport MarkdownRenderer from '../markdownRenderer/MarkdownRenderer';\nimport {\n buildBlockDiff,\n buildLineDiff,\n DocumentDiffChange,\n getMarkdownDefinitions,\n summariseDiff\n} from './buildDocumentDiff';\nimport { DocumentDiffLabels, DocumentDiffProps } from './documentDiff.interfaces';\n\nimport './documentDiff.scss';\n\n// The change is also announced in text, so it is not conveyed by colour alone.\nconst ChangeMarker: FC<{ change: DocumentDiffChange; labels: DocumentDiffLabels }> = ({ change, labels }) =>\n (change === 'unchanged' ? null : <span className=\"sr-only\">{ change === 'added' ? labels.added : labels.removed }: </span>);\n\nexport const DocumentDiff: FC<DocumentDiffProps> = (\n {\n baseline,\n revised,\n view = 'rendered',\n headingOffset = 0,\n resolveResourceUrl,\n labels\n }\n) => {\n const blocks = useMemo(() => (view === 'rendered' ? buildBlockDiff(baseline, revised) : []), [view, baseline, revised]);\n const definitions = useMemo(() => (view === 'rendered'\n ? { baseline: getMarkdownDefinitions(baseline), revised: getMarkdownDefinitions(revised) }\n : { baseline: '', revised: '' }), [view, baseline, revised]);\n const lines = useMemo(() => (view === 'source' ? buildLineDiff(baseline, revised) : []), [view, baseline, revised]);\n const summary = summariseDiff(view === 'rendered' ? blocks : lines);\n const hasChanges = summary.added > 0 || summary.removed > 0;\n\n return (\n <div className={ `documentDiff documentDiff--${ view }` }>\n <p className=\"documentDiff__summary\" role=\"status\">\n { hasChanges ? labels.summary(summary.added, summary.removed) : labels.noChanges }\n </p>\n\n { view === 'rendered' && blocks.map((block, index) => (\n <div\n // Blocks have no stable identity beyond their position in the diff.\n key={ `${ block.change }_${ index }` }\n className={ `documentDiff__block documentDiff__block--${ block.change }` }\n >\n <ChangeMarker change={ block.change } labels={ labels } />\n <MarkdownRenderer\n markdown={ `${ block.change === 'removed' ? definitions.baseline : definitions.revised }\\n\\n${ block.markdown }` }\n headingOffset={ headingOffset }\n resolveResourceUrl={ resolveResourceUrl }\n cssClass=\"documentDiff__markdown\"\n />\n </div>\n )) }\n\n { view === 'source' && (\n <pre className=\"documentDiff__source\">\n { lines.map((line, index) => (\n <span key={ `${ line.change }_${ index }` } className={ `documentDiff__line documentDiff__line--${ line.change }` }>\n <ChangeMarker change={ line.change } labels={ labels } />\n { line.segments.map((segment, segmentIndex) => (segment.change === 'unchanged'\n ? <React.Fragment key={ segmentIndex }>{ segment.text }</React.Fragment>\n : <mark key={ segmentIndex } className={ `documentDiff__word documentDiff__word--${ segment.change }` }>{ segment.text }</mark>\n )) }\n { '\\n' }\n </span>\n )) }\n </pre>\n ) }\n </div>\n );\n};\n\nexport default DocumentDiff;\n"],"mappings":"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","ignoreList":[]}