@x15ventures/x15-ui-library 3.19.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":"AnnotationLayer.js","names":["Object","defineProperty","exports","value","default","AnnotationLayer","_react","_interopRequireWildcard","require","_components","_interactionsHelper","_annotations","_highlightRegistry","_textIndex","_textQuoteAnchor","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","has","get","set","hasOwnProperty","call","getOwnPropertyDescriptor","sameStatus","first","second","keys","length","entries","every","commentId","attached","positionStyle","top","left","id","children","comments","selectedCommentId","canComment","showResolved","onRequestComment","onSelectComment","onAnchorStatusChange","labels","customLabels","getTextRoot","externalSelection","onExternalSelectionConsumed","useMemo","defaultDocumentAnnotationLabels","instanceId","useId","containerRef","useRef","contentRef","reportedStatusRef","frameRef","markers","setMarkers","useState","domSelection","setDomSelection","visibleComments","getVisibleComments","findTextRoot","useCallback","content","current","toLayerPosition","viewportTop","viewportLeft","container","containerRect","getBoundingClientRect","updateAnnotations","root","clearInstanceHighlights","index","buildTextIndex","status","commentRanges","selectedRanges","nextMarkers","resolveAnchor","createTextQuoteResolver","text","forEach","comment","match","anchor","range","rangeFromOffsets","start","end","push","lastRect","Array","from","getClientRects","filter","rect","width","height","pop","position","right","authorName","author","name","setInstanceHighlights","selected","scheduleUpdate","window","requestAnimationFrame","useLayoutEffect","useEffect","undefined","mutationObserver","MutationObserver","observe","subtree","childList","characterData","resizeObserver","ResizeObserver","addEventListener","disconnect","removeEventListener","cancelAnimationFrame","handleSelectionChange","selection","document","getSelection","rangeCount","isCollapsed","getRangeAt","contains","commonAncestorContainer","offsetsFromRange","createTextQuoteAnchor","bottom","latestRef","find","candidate","resolveTextQuoteAnchor","startContainer","parentElement","scrollIntoView","block","behavior","getPreferredScrollBehavior","externalPosition","pending","handleRequestComment","removeAllRanges","createElement","className","ref","map","marker","key","style","SimpleButton","label","openComment","hideLabel","leftIcon","ariaPressed","cssClass","onClickHandler","onMouseDown","event","preventDefault","addComment","_default"],"sources":["../../../../../../src/widgets/shared/documents/annotations/AnnotationLayer.tsx"],"sourcesContent":["'use client';\n\nimport React, {\n CSSProperties,\n FC,\n ReactNode,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\n\nimport { SimpleButton } from '../../../../components';\nimport { getPreferredScrollBehavior } from '../../../../helpers/interactionsHelper';\nimport {\n defaultDocumentAnnotationLabels,\n DocumentAnchorStatus,\n DocumentAnnotationsProps,\n getVisibleComments,\n TextQuoteAnchor\n} from './annotations.interfaces';\nimport { clearInstanceHighlights, setInstanceHighlights } from './highlightRegistry';\nimport { buildTextIndex, offsetsFromRange, rangeFromOffsets } from './textIndex';\nimport { createTextQuoteAnchor, createTextQuoteResolver, resolveTextQuoteAnchor } from './textQuoteAnchor';\n\nimport './annotationLayer.scss';\n\ntype Position = { top: number; left: number };\n\ntype CommentMarker = Position & { commentId: string; authorName: string };\n\nexport type PendingSelection = Position & { anchor: TextQuoteAnchor };\n\n// A selection made somewhere the layer cannot see through the DOM, e.g. the markdown source editor.\nexport type ExternalSelection = { anchor: TextQuoteAnchor; rect: { bottom: number; right: number } } | null;\n\nexport type AnnotationLayerProps = DocumentAnnotationsProps & {\n id: string;\n children: ReactNode;\n // Locates the element holding the document text inside the layer's content; defaults to the content.\n /* eslint-disable-next-line no-unused-vars */\n getTextRoot?: (content: HTMLElement) => HTMLElement | null;\n externalSelection?: ExternalSelection;\n onExternalSelectionConsumed?: () => void;\n};\n\nconst sameStatus = (first: DocumentAnchorStatus | null, second: DocumentAnchorStatus): boolean =>\n first !== null && Object.keys(first).length === Object.keys(second).length\n && Object.entries(second).every(([commentId, attached]) => first[commentId] === attached);\n\n// Geometry changes with every layout, so positions are passed to CSS as custom properties.\nconst positionStyle = ({ top, left }: Position): CSSProperties =>\n ({ '--documentAnnotationTop': `${ top }px`, '--documentAnnotationLeft': `${ left }px` } as CSSProperties);\n\n/*\n AnnotationLayer pins comments to the text of its children. It highlights each comment's quoted\n text, places a bubble at the end of it, offers a \"Comment\" action for new selections, and reports\n which comments could still be found. It never changes the annotated DOM, so it can wrap content\n owned by another library such as the rich-text editor.\n */\nexport const AnnotationLayer: FC<AnnotationLayerProps> = (\n {\n id,\n children,\n comments,\n selectedCommentId,\n canComment = false,\n showResolved = false,\n onRequestComment,\n onSelectComment,\n onAnchorStatusChange,\n labels: customLabels,\n getTextRoot,\n externalSelection = null,\n onExternalSelectionConsumed\n }\n) => {\n const labels = useMemo(() => ({ ...defaultDocumentAnnotationLabels, ...customLabels }), [customLabels]);\n const instanceId = useId();\n const containerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const reportedStatusRef = useRef<DocumentAnchorStatus | null>(null);\n const frameRef = useRef<number | null>(null);\n const [markers, setMarkers] = useState<CommentMarker[]>([]);\n const [domSelection, setDomSelection] = useState<PendingSelection | null>(null);\n\n const visibleComments = useMemo(() => getVisibleComments(comments, showResolved), [comments, showResolved]);\n\n const findTextRoot = useCallback((): HTMLElement | null => {\n const content = contentRef.current;\n if (!content) {\n return null;\n }\n return getTextRoot ? getTextRoot(content) : content;\n }, [getTextRoot]);\n\n // Converts viewport coordinates to coordinates within the layer, where the overlay is positioned.\n const toLayerPosition = useCallback((viewportTop: number, viewportLeft: number): Position | null => {\n const container = containerRef.current;\n if (!container) {\n return null;\n }\n const containerRect = container.getBoundingClientRect();\n return { top: viewportTop - containerRect.top, left: viewportLeft - containerRect.left };\n }, []);\n\n const updateAnnotations = useCallback(() => {\n const root = findTextRoot();\n if (!root) {\n setMarkers([]);\n clearInstanceHighlights(instanceId);\n return;\n }\n const index = buildTextIndex(root);\n const status: DocumentAnchorStatus = {};\n const commentRanges: Range[] = [];\n const selectedRanges: Range[] = [];\n const nextMarkers: CommentMarker[] = [];\n\n const resolveAnchor = createTextQuoteResolver(index.text);\n visibleComments.forEach((comment) => {\n const match = comment.anchor ? resolveAnchor(comment.anchor) : null;\n const range = match ? rangeFromOffsets(index, match.start, match.end) : null;\n status[comment.id] = range !== null;\n if (!range) {\n return;\n }\n (comment.id === selectedCommentId ? selectedRanges : commentRanges).push(range);\n // Hidden content (e.g. the rich-text view while source mode is shown) has no visible rects.\n const lastRect = Array.from(range.getClientRects?.() ?? []).filter((rect) => rect.width || rect.height).pop();\n const position = lastRect ? toLayerPosition(lastRect.top, lastRect.right) : null;\n if (position) {\n nextMarkers.push({ ...position, commentId: comment.id, authorName: comment.author.name });\n }\n });\n\n setInstanceHighlights(instanceId, { comments: commentRanges, selected: selectedRanges });\n setMarkers(nextMarkers);\n if (!sameStatus(reportedStatusRef.current, status)) {\n reportedStatusRef.current = status;\n onAnchorStatusChange?.(status);\n }\n }, [findTextRoot, instanceId, visibleComments, selectedCommentId, toLayerPosition, onAnchorStatusChange]);\n\n const scheduleUpdate = useCallback(() => {\n if (frameRef.current !== null) {\n return;\n }\n frameRef.current = window.requestAnimationFrame(() => {\n frameRef.current = null;\n updateAnnotations();\n });\n }, [updateAnnotations]);\n\n useLayoutEffect(() => {\n updateAnnotations();\n }, [updateAnnotations]);\n\n // Content can change without React knowing: lazy engines finish loading, the editor applies edits.\n useEffect(() => {\n const container = containerRef.current;\n const content = contentRef.current;\n if (!container || !content) {\n return undefined;\n }\n const mutationObserver = new MutationObserver(scheduleUpdate);\n mutationObserver.observe(content, { subtree: true, childList: true, characterData: true });\n const resizeObserver = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(scheduleUpdate);\n resizeObserver?.observe(container);\n window.addEventListener('resize', scheduleUpdate);\n return () => {\n mutationObserver.disconnect();\n resizeObserver?.disconnect();\n window.removeEventListener('resize', scheduleUpdate);\n if (frameRef.current !== null) {\n window.cancelAnimationFrame(frameRef.current);\n frameRef.current = null;\n }\n };\n }, [scheduleUpdate]);\n\n useEffect(() => () => clearInstanceHighlights(instanceId), [instanceId]);\n\n useEffect(() => {\n if (!canComment) {\n setDomSelection(null);\n return undefined;\n }\n const handleSelectionChange = () => {\n const root = findTextRoot();\n const selection = document.getSelection();\n if (!root || !selection || selection.rangeCount === 0 || selection.isCollapsed) {\n setDomSelection(null);\n return;\n }\n const range = selection.getRangeAt(0);\n if (!root.contains(range.commonAncestorContainer)) {\n setDomSelection(null);\n return;\n }\n const index = buildTextIndex(root);\n const { start, end } = offsetsFromRange(index, range);\n const anchor = createTextQuoteAnchor(index.text, start, end);\n const lastRect = Array.from(range.getClientRects?.() ?? []).pop() ?? range.getBoundingClientRect?.();\n const position = anchor && lastRect ? toLayerPosition(lastRect.bottom, lastRect.right) : null;\n setDomSelection(anchor && position ? { ...position, anchor } : null);\n };\n document.addEventListener('selectionchange', handleSelectionChange);\n return () => document.removeEventListener('selectionchange', handleSelectionChange);\n }, [canComment, findTextRoot, toLayerPosition]);\n\n // Read through a ref so only a change of selected comment scrolls; comment edits must not move the reader.\n const latestRef = useRef({ visibleComments, findTextRoot });\n latestRef.current = { visibleComments, findTextRoot };\n\n // Scroll a newly selected comment into view, e.g. after it is chosen in the comments panel.\n useEffect(() => {\n const comment = latestRef.current.visibleComments.find((candidate) => candidate.id === selectedCommentId);\n const root = latestRef.current.findTextRoot();\n if (!comment?.anchor || !root) {\n return;\n }\n const index = buildTextIndex(root);\n const match = resolveTextQuoteAnchor(index.text, comment.anchor);\n const range = match ? rangeFromOffsets(index, match.start, match.end) : null;\n range?.startContainer.parentElement?.scrollIntoView?.({ block: 'center', behavior: getPreferredScrollBehavior() });\n }, [selectedCommentId]);\n\n const externalPosition = externalSelection ? toLayerPosition(externalSelection.rect.bottom, externalSelection.rect.right) : null;\n const pending: PendingSelection | null = externalSelection && externalPosition\n ? { ...externalPosition, anchor: externalSelection.anchor }\n : domSelection;\n\n const handleRequestComment = () => {\n if (!pending) {\n return;\n }\n onRequestComment?.(pending.anchor);\n if (externalSelection) {\n onExternalSelectionConsumed?.();\n } else {\n document.getSelection()?.removeAllRanges();\n }\n setDomSelection(null);\n };\n\n return (\n <div id={ id } className=\"documentAnnotations\" ref={ containerRef }>\n <div className=\"documentAnnotations__content\" ref={ contentRef }>\n { children }\n </div>\n <div className=\"documentAnnotations__overlay\">\n { markers.map((marker) => (\n <div key={ marker.commentId } className=\"documentAnnotations__bubble\" style={ positionStyle(marker) }>\n <SimpleButton\n id={ `${ id }_bubble_${ marker.commentId }` }\n label={ labels.openComment(marker.authorName) }\n hideLabel\n leftIcon=\"bubbles4\"\n ariaPressed={ marker.commentId === selectedCommentId }\n cssClass={ `button icon-only compact documentAnnotations__bubbleButton ${\n marker.commentId === selectedCommentId ? 'documentAnnotations__bubbleButton--selected' : '' }` }\n onClickHandler={ () => onSelectComment?.(marker.commentId) }\n />\n </div>\n )) }\n { canComment && pending && (\n // Pressing the button must not clear the text selection it acts on.\n <div\n className=\"documentAnnotations__trigger\"\n style={ positionStyle(pending) }\n onMouseDown={ (event) => event.preventDefault() }\n >\n <SimpleButton\n id={ `${ id }_addComment` }\n label={ labels.addComment }\n leftIcon=\"bubble\"\n cssClass=\"button primary compact documentAnnotations__triggerButton\"\n onClickHandler={ handleRequestComment }\n />\n </div>\n ) }\n </div>\n </div>\n );\n};\n\nexport default AnnotationLayer;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,65 @@
1
+ .documentAnnotations {
2
+ position: relative;
3
+ display: flex;
4
+ flex: 1;
5
+ flex-direction: column;
6
+ min-width: 0;
7
+ }
8
+
9
+ .documentAnnotations__content {
10
+ display: flex;
11
+ flex: 1;
12
+ flex-direction: column;
13
+ min-width: 0;
14
+ }
15
+
16
+ .documentAnnotations__overlay {
17
+ position: absolute;
18
+ inset: 0;
19
+ pointer-events: none;
20
+ }
21
+
22
+ .documentAnnotations__bubble,
23
+ .documentAnnotations__trigger {
24
+ position: absolute;
25
+ top: var(--documentAnnotationTop);
26
+ left: var(--documentAnnotationLeft);
27
+ z-index: 2;
28
+ pointer-events: auto;
29
+ }
30
+
31
+ .documentAnnotations__bubble {
32
+ transform: translate(var(--documentAnnotationBubbleOffset, 5px), -50%);
33
+ }
34
+
35
+ .documentAnnotations__bubbleButton {
36
+ background: var(--documentAnnotationBubbleBg, var(--documentBg, #fff));
37
+ }
38
+
39
+ .documentAnnotations__bubbleButton--selected {
40
+ background: var(--documentAnnotationBubbleSelectedBg, var(--primaryButtonBg, currentColor));
41
+ }
42
+
43
+ .documentAnnotations__trigger {
44
+ transform: translate(-100%, var(--documentAnnotationTriggerOffset, 5px));
45
+ }
46
+
47
+ ::highlight(documentComment) {
48
+ background-color: var(--documentCommentHighlightBg, color-mix(in srgb, var(--statusWarnColor, #fc0) 30%, transparent));
49
+ color: var(--documentCommentHighlightFgColor, inherit);
50
+ }
51
+
52
+ ::highlight(documentCommentSelected) {
53
+ background-color: var(--documentCommentSelectedHighlightBg, color-mix(in srgb, var(--statusWarnColor, #fc0) 60%, transparent));
54
+ color: var(--documentCommentSelectedHighlightFgColor, inherit);
55
+ }
56
+
57
+ .documentAnnotations__sourceHighlight {
58
+ background-color: var(--documentCommentHighlightBg, color-mix(in srgb, var(--statusWarnColor, #fc0) 30%, transparent));
59
+ border-bottom: var(--documentAnnotationSourceHighlightBorder, 2px solid var(--statusWarnColor, #fc0));
60
+ cursor: pointer;
61
+ }
62
+
63
+ .documentAnnotations__sourceHighlight--selected {
64
+ background-color: var(--documentCommentSelectedHighlightBg, color-mix(in srgb, var(--statusWarnColor, #fc0) 60%, transparent));
65
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getVisibleComments = exports.defaultDocumentAnnotationLabels = void 0;
7
+ /*
8
+ A comment is pinned to text by quoting it rather than by character positions, so it can be found
9
+ again after the document is edited, re-rendered or opened in a different view (rendered, rich-text
10
+ or markdown source). See textQuoteAnchor.ts.
11
+ */
12
+
13
+ // Whether each pinned comment's quoted text was found in the document, keyed by comment id.
14
+
15
+ const defaultDocumentAnnotationLabels = exports.defaultDocumentAnnotationLabels = {
16
+ addComment: 'Comment',
17
+ openComment: authorName => `Open comment by ${authorName}`
18
+ };
19
+ const getVisibleComments = (comments, showResolved = false) => comments.filter(comment => comment.anchor && (showResolved || !comment.resolved));
20
+ exports.getVisibleComments = getVisibleComments;
21
+ //# sourceMappingURL=annotations.interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.interfaces.js","names":["defaultDocumentAnnotationLabels","exports","addComment","openComment","authorName","getVisibleComments","comments","showResolved","filter","comment","anchor","resolved"],"sources":["../../../../../../src/widgets/shared/documents/annotations/annotations.interfaces.ts"],"sourcesContent":["/*\n A comment is pinned to text by quoting it rather than by character positions, so it can be found\n again after the document is edited, re-rendered or opened in a different view (rendered, rich-text\n or markdown source). See textQuoteAnchor.ts.\n */\nexport type TextQuoteAnchor = {\n exact: string;\n // Text immediately before and after the quote, used to tell repeated phrases apart.\n prefix: string;\n suffix: string;\n // Where the quote started when it was created; a tiebreak only, since views count text differently.\n start?: number;\n};\n\nexport type DocumentCommentAuthor = {\n id: string;\n name: string;\n};\n\nexport type DocumentCommentReply = {\n id: string;\n author: DocumentCommentAuthor;\n content: string;\n createdAt: string;\n};\n\nexport type DocumentComment = {\n id: string;\n author: DocumentCommentAuthor;\n content: string;\n createdAt: string;\n resolved?: boolean;\n // Absent for general comments about the whole document.\n anchor?: TextQuoteAnchor;\n replies?: DocumentCommentReply[];\n};\n\n// Whether each pinned comment's quoted text was found in the document, keyed by comment id.\nexport type DocumentAnchorStatus = Record<string, boolean>;\n\nexport type DocumentAnnotationLabels = {\n addComment: string;\n /* eslint-disable-next-line no-unused-vars */\n openComment: (authorName: string) => string;\n};\n\nexport type DocumentAnnotationsProps = {\n comments: DocumentComment[];\n selectedCommentId?: string;\n // Offer the \"Comment\" action when text is selected.\n canComment?: boolean;\n // Highlight resolved comments as well as open ones.\n showResolved?: boolean;\n /* eslint-disable-next-line no-unused-vars */\n onRequestComment?: (anchor: TextQuoteAnchor) => void;\n /* eslint-disable-next-line no-unused-vars */\n onSelectComment?: (commentId: string) => void;\n /* eslint-disable-next-line no-unused-vars */\n onAnchorStatusChange?: (status: DocumentAnchorStatus) => void;\n labels?: Partial<DocumentAnnotationLabels>;\n};\n\nexport const defaultDocumentAnnotationLabels: DocumentAnnotationLabels = {\n addComment: 'Comment',\n openComment: (authorName) => `Open comment by ${ authorName }`\n};\n\nexport const getVisibleComments = (comments: DocumentComment[], showResolved = false): DocumentComment[] =>\n comments.filter((comment) => comment.anchor && (showResolved || !comment.resolved));\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;;AAiCA;;AAyBO,MAAMA,+BAAyD,GAAAC,OAAA,CAAAD,+BAAA,GAAG;EACvEE,UAAU,EAAE,SAAS;EACrBC,WAAW,EAAGC,UAAU,IAAK,mBAAoBA,UAAU;AAC7D,CAAC;AAEM,MAAMC,kBAAkB,GAAGA,CAACC,QAA2B,EAAEC,YAAY,GAAG,KAAK,KAClFD,QAAQ,CAACE,MAAM,CAAEC,OAAO,IAAKA,OAAO,CAACC,MAAM,KAAKH,YAAY,IAAI,CAACE,OAAO,CAACE,QAAQ,CAAC,CAAC;AAACV,OAAA,CAAAI,kBAAA,GAAAA,kBAAA","ignoreList":[]}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.supportsTextHighlights = exports.setInstanceHighlights = exports.clearInstanceHighlights = exports.HIGHLIGHT_NAMES = void 0;
7
+ /*
8
+ Comment highlights use the CSS Custom Highlight API, which styles text ranges without changing the
9
+ DOM. That matters inside the rich-text editor, which owns its DOM and would discard or fight any
10
+ wrapper elements added around highlighted text.
11
+
12
+ The browser keeps one registry entry per highlight name, so the ranges from every annotated view
13
+ on the page are merged here into shared entries. Browsers without the API simply show no
14
+ highlight; comment bubbles still mark each comment.
15
+ */
16
+
17
+ const HIGHLIGHT_NAMES = exports.HIGHLIGHT_NAMES = {
18
+ comment: 'documentComment',
19
+ selected: 'documentCommentSelected'
20
+ };
21
+ const instances = new Map();
22
+
23
+ /* eslint-disable no-unused-vars */
24
+
25
+ /* eslint-enable no-unused-vars */
26
+
27
+ const getHighlightApi = () => {
28
+ const cssNamespace = globalThis.CSS;
29
+ const Highlight = globalThis.Highlight;
30
+ return cssNamespace?.highlights && Highlight ? {
31
+ registry: cssNamespace.highlights,
32
+ Highlight
33
+ } : null;
34
+ };
35
+ const supportsTextHighlights = () => getHighlightApi() !== null;
36
+ exports.supportsTextHighlights = supportsTextHighlights;
37
+ const syncRegistry = () => {
38
+ const api = getHighlightApi();
39
+ if (!api) {
40
+ return;
41
+ }
42
+ const all = [...instances.values()];
43
+ const comments = all.flatMap(instance => instance.comments);
44
+ const selected = all.flatMap(instance => instance.selected);
45
+ if (comments.length) {
46
+ api.registry.set(HIGHLIGHT_NAMES.comment, new api.Highlight(...comments));
47
+ } else {
48
+ api.registry.delete(HIGHLIGHT_NAMES.comment);
49
+ }
50
+ if (selected.length) {
51
+ api.registry.set(HIGHLIGHT_NAMES.selected, new api.Highlight(...selected));
52
+ } else {
53
+ api.registry.delete(HIGHLIGHT_NAMES.selected);
54
+ }
55
+ };
56
+ const setInstanceHighlights = (instanceId, highlights) => {
57
+ instances.set(instanceId, highlights);
58
+ syncRegistry();
59
+ };
60
+ exports.setInstanceHighlights = setInstanceHighlights;
61
+ const clearInstanceHighlights = instanceId => {
62
+ if (instances.delete(instanceId)) {
63
+ syncRegistry();
64
+ }
65
+ };
66
+ exports.clearInstanceHighlights = clearInstanceHighlights;
67
+ //# sourceMappingURL=highlightRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlightRegistry.js","names":["HIGHLIGHT_NAMES","exports","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;;AAEO,MAAMA,eAAe,GAAAC,OAAA,CAAAD,eAAA,GAAG;EAC7BE,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;AAEM,MAAMG,sBAAsB,GAAGA,CAAA,KAAeP,eAAe,CAAC,CAAC,KAAK,IAAI;AAACL,OAAA,CAAAY,sBAAA,GAAAA,sBAAA;AAEhF,MAAMC,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,CAACtB,eAAe,CAACE,OAAO,EAAE,IAAIa,GAAG,CAACL,SAAS,CAAC,GAAGQ,QAAQ,CAAC,CAAC;EAC3E,CAAC,MAAM;IACLH,GAAG,CAACH,QAAQ,CAACW,MAAM,CAACvB,eAAe,CAACE,OAAO,CAAC;EAC9C;EACA,IAAIC,QAAQ,CAACkB,MAAM,EAAE;IACnBN,GAAG,CAACH,QAAQ,CAACU,GAAG,CAACtB,eAAe,CAACG,QAAQ,EAAE,IAAIY,GAAG,CAACL,SAAS,CAAC,GAAGP,QAAQ,CAAC,CAAC;EAC5E,CAAC,MAAM;IACLY,GAAG,CAACH,QAAQ,CAACW,MAAM,CAACvB,eAAe,CAACG,QAAQ,CAAC;EAC/C;AACF,CAAC;AAEM,MAAMqB,qBAAqB,GAAGA,CAACC,UAAkB,EAAEd,UAA8B,KAAW;EACjGP,SAAS,CAACkB,GAAG,CAACG,UAAU,EAAEd,UAAU,CAAC;EACrCG,YAAY,CAAC,CAAC;AAChB,CAAC;AAACb,OAAA,CAAAuB,qBAAA,GAAAA,qBAAA;AAEK,MAAME,uBAAuB,GAAID,UAAkB,IAAW;EACnE,IAAIrB,SAAS,CAACmB,MAAM,CAACE,UAAU,CAAC,EAAE;IAChCX,YAAY,CAAC,CAAC;EAChB;AACF,CAAC;AAACb,OAAA,CAAAyB,uBAAA,GAAAA,uBAAA","ignoreList":[]}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "AnnotationLayer", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _AnnotationLayer.AnnotationLayer;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "createTextQuoteAnchor", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _textQuoteAnchor.createTextQuoteAnchor;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "createTextQuoteResolver", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _textQuoteAnchor.createTextQuoteResolver;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "defaultDocumentAnnotationLabels", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _annotations.defaultDocumentAnnotationLabels;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "resolveTextQuoteAnchor", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _textQuoteAnchor.resolveTextQuoteAnchor;
34
+ }
35
+ });
36
+ var _AnnotationLayer = require("./AnnotationLayer");
37
+ var _annotations = require("./annotations.interfaces");
38
+ var _textQuoteAnchor = require("./textQuoteAnchor");
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["_AnnotationLayer","require","_annotations","_textQuoteAnchor"],"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,IAAAA,gBAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,gBAAA,GAAAF,OAAA","ignoreList":[]}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.rangeFromOffsets = exports.offsetsFromRange = exports.buildTextIndex = exports.EXCLUDED_TEXT_SELECTOR = void 0;
7
+ /*
8
+ Maps between DOM ranges and character offsets in the plain text of an element, so anchors can be
9
+ created from, and resolved to, selections in rendered content.
10
+
11
+ Block boundaries and line breaks become a newline in the indexed text. Without them, adjacent
12
+ paragraphs would run together ("PurposeThis policy") and quotes taken from rendered text would
13
+ not match the same text in markdown source.
14
+ */
15
+
16
+ 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']);
17
+
18
+ // Interface text inside the annotated area (buttons, toolbars, decorative content) is not document text.
19
+ const EXCLUDED_TEXT_SELECTOR = exports.EXCLUDED_TEXT_SELECTOR = 'button, [role="toolbar"], [aria-hidden="true"], script, style, .documentAnnotations__overlay';
20
+ const nearestBlock = (node, root) => {
21
+ let current = node.parentNode;
22
+ while (current && current !== root && !(current instanceof Element && BLOCK_TAGS.has(current.tagName))) {
23
+ current = current.parentNode;
24
+ }
25
+ return current ?? root;
26
+ };
27
+ const isExcluded = (node, root, excludedSelector) => {
28
+ const element = node instanceof Element ? node : node.parentElement;
29
+ const excluded = element?.closest(excludedSelector);
30
+ return Boolean(excluded && root.contains(excluded) && excluded !== root);
31
+ };
32
+ const buildTextIndex = (root, excludedSelector = EXCLUDED_TEXT_SELECTOR) => {
33
+ const ownerDocument = root.ownerDocument;
34
+ const walker = ownerDocument.createTreeWalker(root, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT);
35
+ const segments = [];
36
+ let text = '';
37
+ let previousBlock = null;
38
+ const addSeparator = () => {
39
+ if (text.length && !text.endsWith('\n')) {
40
+ text += '\n';
41
+ }
42
+ };
43
+ for (let node = walker.nextNode(); node; node = walker.nextNode()) {
44
+ if (isExcluded(node, root, excludedSelector)) {
45
+ continue;
46
+ }
47
+ if (node instanceof Element) {
48
+ if (node.tagName === 'BR') {
49
+ addSeparator();
50
+ }
51
+ continue;
52
+ }
53
+ const textNode = node;
54
+ const block = nearestBlock(textNode, root);
55
+ if (previousBlock && block !== previousBlock) {
56
+ addSeparator();
57
+ }
58
+ segments.push({
59
+ node: textNode,
60
+ start: text.length
61
+ });
62
+ text += textNode.data;
63
+ previousBlock = block;
64
+ }
65
+ return {
66
+ text,
67
+ segments
68
+ };
69
+ };
70
+ exports.buildTextIndex = buildTextIndex;
71
+ const segmentEnd = segment => segment.start + segment.node.data.length;
72
+
73
+ /*
74
+ Converts text offsets back to a DOM range. An offset that falls on an inserted separator snaps to
75
+ the nearest real text: forwards for the start, backwards for the end.
76
+ */
77
+ const rangeFromOffsets = (index, start, end) => {
78
+ const startSegment = index.segments.find(segment => start < segmentEnd(segment) && start >= segment.start) ?? index.segments.find(segment => segment.start >= start);
79
+ const endSegment = [...index.segments].reverse().find(segment => end > segment.start && end <= segmentEnd(segment)) ?? [...index.segments].reverse().find(segment => segmentEnd(segment) <= end);
80
+ if (!startSegment || !endSegment) {
81
+ return null;
82
+ }
83
+ const range = startSegment.node.ownerDocument.createRange();
84
+ range.setStart(startSegment.node, Math.max(0, start - startSegment.start));
85
+ range.setEnd(endSegment.node, Math.min(endSegment.node.data.length, end - endSegment.start));
86
+ return range.collapsed ? null : range;
87
+ };
88
+ exports.rangeFromOffsets = rangeFromOffsets;
89
+ const boundaryToOffset = (index, container, offset) => {
90
+ const segment = index.segments.find(candidate => candidate.node === container);
91
+ if (segment) {
92
+ return segment.start + offset;
93
+ }
94
+ // The boundary sits between nodes: it is at the start of the first text segment that follows it.
95
+ const boundary = container.ownerDocument?.createRange();
96
+ if (!boundary) {
97
+ return index.text.length;
98
+ }
99
+ boundary.setStart(container, offset);
100
+ const following = index.segments.find(candidate => {
101
+ const point = candidate.node.ownerDocument.createRange();
102
+ point.setStart(candidate.node, 0);
103
+ return boundary.compareBoundaryPoints(Range.START_TO_START, point) <= 0;
104
+ });
105
+ return following ? following.start : index.text.length;
106
+ };
107
+ const offsetsFromRange = (index, range) => ({
108
+ start: boundaryToOffset(index, range.startContainer, range.startOffset),
109
+ end: boundaryToOffset(index, range.endContainer, range.endOffset)
110
+ });
111
+ exports.offsetsFromRange = offsetsFromRange;
112
+ //# sourceMappingURL=textIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textIndex.js","names":["BLOCK_TAGS","Set","EXCLUDED_TEXT_SELECTOR","exports","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,160 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.resolveTextQuoteAnchor = exports.normaliseWhitespace = exports.createTextQuoteResolver = exports.createTextQuoteAnchor = void 0;
7
+ const DEFAULT_CONTEXT_LENGTH = 32;
8
+ const WHITESPACE = /\s/;
9
+ // Collapses each run of whitespace to one space. Views lay text out differently (a paragraph break
10
+ // in markdown is a newline in rendered text), so quotes are compared without whitespace differences.
11
+ const normaliseWhitespace = text => {
12
+ let normalised = '';
13
+ const offsets = [];
14
+ let inWhitespace = false;
15
+ for (let index = 0; index < text.length; index += 1) {
16
+ const isWhitespace = WHITESPACE.test(text[index]);
17
+ if (!isWhitespace || !inWhitespace) {
18
+ normalised += isWhitespace ? ' ' : text[index];
19
+ offsets.push(index);
20
+ }
21
+ inWhitespace = isWhitespace;
22
+ }
23
+ offsets.push(text.length);
24
+ return {
25
+ text: normalised,
26
+ offsets
27
+ };
28
+ };
29
+ exports.normaliseWhitespace = normaliseWhitespace;
30
+ const collapse = text => normaliseWhitespace(text).text;
31
+
32
+ /*
33
+ Creates an anchor for text[start, end). Surrounding whitespace is trimmed from the selection, and
34
+ an empty or whitespace-only selection returns null.
35
+ */
36
+ const createTextQuoteAnchor = (text, start, end, contextLength = DEFAULT_CONTEXT_LENGTH) => {
37
+ let from = Math.max(0, Math.min(start, end));
38
+ let to = Math.min(text.length, Math.max(start, end));
39
+ while (from < to && WHITESPACE.test(text[from])) {
40
+ from += 1;
41
+ }
42
+ while (to > from && WHITESPACE.test(text[to - 1])) {
43
+ to -= 1;
44
+ }
45
+ if (from === to) {
46
+ return null;
47
+ }
48
+ return {
49
+ exact: text.slice(from, to),
50
+ prefix: text.slice(Math.max(0, from - contextLength), from),
51
+ suffix: text.slice(to, to + contextLength),
52
+ start: from
53
+ };
54
+ };
55
+ exports.createTextQuoteAnchor = createTextQuoteAnchor;
56
+ const commonSuffixLength = (first, second) => {
57
+ let length = 0;
58
+ while (length < first.length && length < second.length && first[first.length - 1 - length] === second[second.length - 1 - length]) {
59
+ length += 1;
60
+ }
61
+ return length;
62
+ };
63
+ const commonPrefixLength = (first, second) => {
64
+ let length = 0;
65
+ while (length < first.length && length < second.length && first[length] === second[length]) {
66
+ length += 1;
67
+ }
68
+ return length;
69
+ };
70
+
71
+ /*
72
+ Anchors come from stored comments, which may be written by anyone, so their cost is bounded:
73
+ context beyond what createTextQuoteAnchor stores is ignored, and a quote that occurs very many
74
+ times (e.g. a single letter) is only compared at its first occurrences. Without these limits a
75
+ crafted anchor makes each resolution quadratic in the document length.
76
+ */
77
+ const MAX_CONTEXT_LENGTH = DEFAULT_CONTEXT_LENGTH * 4;
78
+ const MAX_OCCURRENCES = 1000;
79
+ const OCCURRENCES_PER_DIRECTION = MAX_OCCURRENCES / 2;
80
+ const findClosestNormalisedIndex = (document, originalIndex) => {
81
+ let low = 0;
82
+ let high = document.offsets.length - 1;
83
+ while (low < high) {
84
+ const middle = Math.floor((low + high) / 2);
85
+ if (document.offsets[middle] < originalIndex) {
86
+ low = middle + 1;
87
+ } else {
88
+ high = middle;
89
+ }
90
+ }
91
+ return Math.min(low, document.text.length);
92
+ };
93
+ const resolveInNormalisedText = (document, textLength, anchor) => {
94
+ const exact = collapse(anchor.exact).trim();
95
+ if (!exact) {
96
+ return null;
97
+ }
98
+ const prefix = collapse(anchor.prefix.slice(-MAX_CONTEXT_LENGTH));
99
+ const suffix = collapse(anchor.suffix.slice(0, MAX_CONTEXT_LENGTH));
100
+ let best = null;
101
+ const candidates = [];
102
+ if (anchor.start === undefined) {
103
+ for (let index = document.text.indexOf(exact); index !== -1 && candidates.length < MAX_OCCURRENCES; index = document.text.indexOf(exact, index + 1)) {
104
+ candidates.push(index);
105
+ }
106
+ } else {
107
+ const expectedIndex = findClosestNormalisedIndex(document, anchor.start);
108
+ let following = document.text.indexOf(exact, expectedIndex);
109
+ for (let count = 0; following !== -1 && count < OCCURRENCES_PER_DIRECTION; count += 1) {
110
+ candidates.push(following);
111
+ following = document.text.indexOf(exact, following + 1);
112
+ }
113
+ let preceding = document.text.lastIndexOf(exact, expectedIndex - 1);
114
+ for (let count = 0; preceding !== -1 && count < OCCURRENCES_PER_DIRECTION; count += 1) {
115
+ candidates.push(preceding);
116
+ if (preceding === 0) {
117
+ break;
118
+ }
119
+ preceding = document.text.lastIndexOf(exact, preceding - 1);
120
+ }
121
+ }
122
+ for (const index of candidates) {
123
+ const before = document.text.slice(Math.max(0, index - prefix.length), index);
124
+ const after = document.text.slice(index + exact.length, index + exact.length + suffix.length);
125
+ const distance = anchor.start === undefined ? 0 : Math.abs(document.offsets[index] - anchor.start) / Math.max(textLength, 1);
126
+ // Context dominates; distance is below one character's worth so it only breaks ties.
127
+ const score = commonSuffixLength(prefix, before) + commonPrefixLength(suffix, after) - distance;
128
+ if (!best || score > best.score) {
129
+ best = {
130
+ index,
131
+ score
132
+ };
133
+ }
134
+ }
135
+ if (!best) {
136
+ return null;
137
+ }
138
+ return {
139
+ start: document.offsets[best.index],
140
+ end: document.offsets[best.index + exact.length - 1] + 1
141
+ };
142
+ };
143
+
144
+ /*
145
+ Returns a resolver for anchors in `text`, normalising the text once so a document with many
146
+ comments is not re-normalised for each of them. Every occurrence of a quote is scored by how much
147
+ of the stored prefix and suffix surround it, with closeness to the original position as a
148
+ tiebreak. The resolver returns null when the quote no longer appears, e.g. because it was edited away.
149
+ */
150
+ /* eslint-disable-next-line no-unused-vars */
151
+ const createTextQuoteResolver = text => {
152
+ const document = normaliseWhitespace(text);
153
+ return anchor => resolveInNormalisedText(document, text.length, anchor);
154
+ };
155
+
156
+ // Finds a single anchor in `text`; see createTextQuoteResolver.
157
+ exports.createTextQuoteResolver = createTextQuoteResolver;
158
+ const resolveTextQuoteAnchor = (text, anchor) => createTextQuoteResolver(text)(anchor);
159
+ exports.resolveTextQuoteAnchor = resolveTextQuoteAnchor;
160
+ //# 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","exports","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":[]}