@x15ventures/x15-ui-library 3.18.0 → 3.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_LICENSES.md +11182 -0
- package/dist/cjs/autoGenerated/libraryThemes.js +12 -12
- package/dist/cjs/autoGenerated/libraryThemes.js.map +1 -1
- package/dist/cjs/autoGenerated/libraryThemes.json +12 -12
- package/dist/cjs/components/design/banners/pageBanner/PageBanner.js +27 -12
- package/dist/cjs/components/design/banners/pageBanner/PageBanner.js.map +1 -1
- package/dist/cjs/components/design/card/cardHeader/CardHeaderItem.js +22 -15
- package/dist/cjs/components/design/card/cardHeader/CardHeaderItem.js.map +1 -1
- package/dist/cjs/components/design/dialog/dialog.css +4 -0
- package/dist/cjs/components/design/logos/LogoLink.js +2 -1
- package/dist/cjs/components/design/logos/LogoLink.js.map +1 -1
- package/dist/cjs/components/design/logos/VentureLogo.js +2 -1
- package/dist/cjs/components/design/logos/VentureLogo.js.map +1 -1
- package/dist/cjs/components/design/revealMore/RevealMoreBelow.js +2 -2
- package/dist/cjs/components/design/revealMore/RevealMoreBelow.js.map +1 -1
- package/dist/cjs/components/design/skeleton/Skeleton.js +15 -5
- package/dist/cjs/components/design/skeleton/Skeleton.js.map +1 -1
- package/dist/cjs/components/design/themeLoader/ThemeLoader.js +1 -1
- package/dist/cjs/components/design/themeLoader/ThemeLoader.js.map +1 -1
- package/dist/cjs/components/form/buttons/SimpleButton.js +3 -1
- package/dist/cjs/components/form/buttons/SimpleButton.js.map +1 -1
- package/dist/cjs/components/form/buttons/button.interface.js.map +1 -1
- package/dist/cjs/components/form/buttons/userPicButton/UserPicButton.js +5 -3
- package/dist/cjs/components/form/buttons/userPicButton/UserPicButton.js.map +1 -1
- package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +64 -19
- package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
- package/dist/cjs/components/navigation/link/Link.js +2 -1
- package/dist/cjs/components/navigation/link/Link.js.map +1 -1
- package/dist/cjs/components/testing/devToolbar/DevToolbar.js +5 -3
- package/dist/cjs/components/testing/devToolbar/DevToolbar.js.map +1 -1
- package/dist/cjs/constants/fileUploadTypes.js +9 -4
- package/dist/cjs/constants/fileUploadTypes.js.map +1 -1
- package/dist/cjs/helpers/dateHelpers.js +34 -23
- package/dist/cjs/helpers/dateHelpers.js.map +1 -1
- package/dist/cjs/helpers/fileHelpers.js +58 -0
- package/dist/cjs/helpers/fileHelpers.js.map +1 -0
- package/dist/cjs/helpers/index.js +44 -0
- package/dist/cjs/helpers/index.js.map +1 -1
- package/dist/cjs/helpers/interactionsHelper.js +8 -1
- package/dist/cjs/helpers/interactionsHelper.js.map +1 -1
- package/dist/cjs/helpers/objectHelpers.js +23 -9
- package/dist/cjs/helpers/objectHelpers.js.map +1 -1
- package/dist/cjs/helpers/stringHelpers.js +61 -5
- package/dist/cjs/helpers/stringHelpers.js.map +1 -1
- package/dist/cjs/helpers/urlHelpers.js +48 -0
- package/dist/cjs/helpers/urlHelpers.js.map +1 -0
- package/dist/cjs/index.js +191 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/package.json +3 -305
- package/dist/cjs/styles/index.css +18 -0
- package/dist/cjs/styles/variables/cssVars/_designVariables.css +18 -0
- package/dist/cjs/widgets/documentComments/DocumentComments.js +305 -0
- package/dist/cjs/widgets/documentComments/DocumentComments.js.map +1 -0
- package/dist/cjs/widgets/documentComments/_documentCommentsVariables.css +0 -0
- package/dist/cjs/widgets/documentComments/documentComments.css +107 -0
- package/dist/cjs/widgets/documentComments/documentComments.interfaces.js +6 -0
- package/dist/cjs/widgets/documentComments/documentComments.interfaces.js.map +1 -0
- package/dist/cjs/widgets/documentComments/index.js +19 -0
- package/dist/cjs/widgets/documentComments/index.js.map +1 -0
- package/dist/cjs/widgets/documentComparer/DocumentComparer.js +309 -0
- package/dist/cjs/widgets/documentComparer/DocumentComparer.js.map +1 -0
- package/dist/cjs/widgets/documentComparer/_documentComparerVariables.css +0 -0
- package/dist/cjs/widgets/documentComparer/documentComparer.css +117 -0
- package/dist/cjs/widgets/documentComparer/documentComparer.interfaces.js +6 -0
- package/dist/cjs/widgets/documentComparer/documentComparer.interfaces.js.map +1 -0
- package/dist/cjs/widgets/documentComparer/index.js +19 -0
- package/dist/cjs/widgets/documentComparer/index.js.map +1 -0
- package/dist/cjs/widgets/documentEditor/DocumentEditor.js +142 -0
- package/dist/cjs/widgets/documentEditor/DocumentEditor.js.map +1 -0
- package/dist/cjs/widgets/documentEditor/_documentEditorVariables.css +0 -0
- package/dist/cjs/widgets/documentEditor/documentEditor.css +33 -0
- package/dist/cjs/widgets/documentEditor/documentEditor.interfaces.js +6 -0
- package/dist/cjs/widgets/documentEditor/documentEditor.interfaces.js.map +1 -0
- package/dist/cjs/widgets/documentEditor/index.js +19 -0
- package/dist/cjs/widgets/documentEditor/index.js.map +1 -0
- package/dist/cjs/widgets/documentViewer/DocumentViewer.js +206 -0
- package/dist/cjs/widgets/documentViewer/DocumentViewer.js.map +1 -0
- package/dist/cjs/widgets/documentViewer/_documentViewerVariables.css +0 -0
- package/dist/cjs/widgets/documentViewer/documentViewer.css +82 -0
- package/dist/cjs/widgets/documentViewer/documentViewer.interfaces.js +6 -0
- package/dist/cjs/widgets/documentViewer/documentViewer.interfaces.js.map +1 -0
- package/dist/cjs/widgets/documentViewer/index.js +19 -0
- package/dist/cjs/widgets/documentViewer/index.js.map +1 -0
- package/dist/cjs/widgets/index.js +126 -0
- package/dist/cjs/widgets/index.js.map +1 -1
- package/dist/cjs/widgets/shared/documents/ToggleGroup.js +32 -0
- package/dist/cjs/widgets/shared/documents/ToggleGroup.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/_documentVariables.css +0 -0
- package/dist/cjs/widgets/shared/documents/annotations/AnnotationLayer.js +279 -0
- package/dist/cjs/widgets/shared/documents/annotations/AnnotationLayer.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/annotations/_annotationLayerVariables.css +0 -0
- package/dist/cjs/widgets/shared/documents/annotations/annotationLayer.css +65 -0
- package/dist/cjs/widgets/shared/documents/annotations/annotations.interfaces.js +21 -0
- package/dist/cjs/widgets/shared/documents/annotations/annotations.interfaces.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/annotations/highlightRegistry.js +67 -0
- package/dist/cjs/widgets/shared/documents/annotations/highlightRegistry.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/annotations/index.js +39 -0
- package/dist/cjs/widgets/shared/documents/annotations/index.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/annotations/textIndex.js +112 -0
- package/dist/cjs/widgets/shared/documents/annotations/textIndex.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/annotations/textQuoteAnchor.js +160 -0
- package/dist/cjs/widgets/shared/documents/annotations/textQuoteAnchor.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/documentHelpers.js +186 -0
- package/dist/cjs/widgets/shared/documents/documentHelpers.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/documents.interfaces.js +6 -0
- package/dist/cjs/widgets/shared/documents/documents.interfaces.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/DocumentDiff.js +73 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/DocumentDiff.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/_documentDiffVariables.css +0 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js +114 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.css +69 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js +6 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/lazyEngines.js +19 -0
- package/dist/cjs/widgets/shared/documents/engines/lazyEngines.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js +200 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/_markdownEditorEngineVariables.css +0 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.css +50 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js +6 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js +179 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js +278 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js +208 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js +85 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/_markdownRendererVariables.css +0 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/markdownRenderer.css +78 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/index.js +64 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/index.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js +6 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js +71 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js +192 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js +86 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js +38 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/WordRenderer.js +49 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/WordRenderer.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js +214 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js +112 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordXml.js +68 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordXml.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/index.js +50 -0
- package/dist/cjs/widgets/shared/documents/index.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/toggleGroup.css +8 -0
- package/dist/cjs/widgets/shared/documents/useDocumentContent.js +222 -0
- package/dist/cjs/widgets/shared/documents/useDocumentContent.js.map +1 -0
- package/dist/components/design/banners/pageBanner/PageBanner.d.ts.map +1 -1
- package/dist/components/design/card/cardHeader/CardHeaderItem.d.ts.map +1 -1
- package/dist/components/design/logos/LogoLink.d.ts.map +1 -1
- package/dist/components/design/logos/VentureLogo.d.ts.map +1 -1
- package/dist/components/design/skeleton/Skeleton.d.ts +1 -1
- package/dist/components/design/skeleton/Skeleton.d.ts.map +1 -1
- package/dist/components/design/themeLoader/ThemeLoader.d.ts.map +1 -1
- package/dist/components/form/buttons/SimpleButton.d.ts.map +1 -1
- package/dist/components/form/buttons/button.interface.d.ts +1 -0
- package/dist/components/form/buttons/button.interface.d.ts.map +1 -1
- package/dist/components/form/buttons/userPicButton/UserPicButton.d.ts.map +1 -1
- package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.d.ts.map +1 -1
- package/dist/components/navigation/link/Link.d.ts.map +1 -1
- package/dist/components/testing/devToolbar/DevToolbar.d.ts.map +1 -1
- package/dist/constants/fileUploadTypes.d.ts.map +1 -1
- package/dist/esm/autoGenerated/libraryThemes.js +12 -12
- package/dist/esm/autoGenerated/libraryThemes.js.map +1 -1
- package/dist/esm/autoGenerated/libraryThemes.json +12 -12
- package/dist/esm/components/design/banners/pageBanner/PageBanner.js +27 -12
- package/dist/esm/components/design/banners/pageBanner/PageBanner.js.map +1 -1
- package/dist/esm/components/design/card/cardHeader/CardHeaderItem.js +22 -15
- package/dist/esm/components/design/card/cardHeader/CardHeaderItem.js.map +1 -1
- package/dist/esm/components/design/dialog/dialog.css +4 -0
- package/dist/esm/components/design/logos/LogoLink.js +2 -1
- package/dist/esm/components/design/logos/LogoLink.js.map +1 -1
- package/dist/esm/components/design/logos/VentureLogo.js +2 -1
- package/dist/esm/components/design/logos/VentureLogo.js.map +1 -1
- package/dist/esm/components/design/revealMore/RevealMoreBelow.js +1 -1
- package/dist/esm/components/design/revealMore/RevealMoreBelow.js.map +1 -1
- package/dist/esm/components/design/skeleton/Skeleton.js +15 -5
- package/dist/esm/components/design/skeleton/Skeleton.js.map +1 -1
- package/dist/esm/components/design/themeLoader/ThemeLoader.js +1 -1
- package/dist/esm/components/design/themeLoader/ThemeLoader.js.map +1 -1
- package/dist/esm/components/form/buttons/SimpleButton.js +3 -1
- package/dist/esm/components/form/buttons/SimpleButton.js.map +1 -1
- package/dist/esm/components/form/buttons/button.interface.js.map +1 -1
- package/dist/esm/components/form/buttons/userPicButton/UserPicButton.js +5 -3
- package/dist/esm/components/form/buttons/userPicButton/UserPicButton.js.map +1 -1
- package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +65 -19
- package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
- package/dist/esm/components/navigation/link/Link.js +2 -1
- package/dist/esm/components/navigation/link/Link.js.map +1 -1
- package/dist/esm/components/testing/devToolbar/DevToolbar.js +5 -3
- package/dist/esm/components/testing/devToolbar/DevToolbar.js.map +1 -1
- package/dist/esm/constants/fileUploadTypes.js +9 -4
- package/dist/esm/constants/fileUploadTypes.js.map +1 -1
- package/dist/esm/helpers/dateHelpers.js +34 -23
- package/dist/esm/helpers/dateHelpers.js.map +1 -1
- package/dist/esm/helpers/fileHelpers.js +48 -0
- package/dist/esm/helpers/fileHelpers.js.map +1 -0
- package/dist/esm/helpers/index.js +2 -0
- package/dist/esm/helpers/index.js.map +1 -1
- package/dist/esm/helpers/interactionsHelper.js +5 -0
- package/dist/esm/helpers/interactionsHelper.js.map +1 -1
- package/dist/esm/helpers/objectHelpers.js +23 -9
- package/dist/esm/helpers/objectHelpers.js.map +1 -1
- package/dist/esm/helpers/stringHelpers.js +61 -5
- package/dist/esm/helpers/stringHelpers.js.map +1 -1
- package/dist/esm/helpers/urlHelpers.js +40 -0
- package/dist/esm/helpers/urlHelpers.js.map +1 -0
- package/dist/esm/index.js +3 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/package.json +2 -304
- package/dist/esm/styles/index.css +18 -0
- package/dist/esm/styles/variables/cssVars/_designVariables.css +18 -0
- package/dist/esm/widgets/documentComments/DocumentComments.js +298 -0
- package/dist/esm/widgets/documentComments/DocumentComments.js.map +1 -0
- package/dist/esm/widgets/documentComments/_documentCommentsVariables.css +0 -0
- package/dist/esm/widgets/documentComments/documentComments.css +107 -0
- package/dist/esm/widgets/documentComments/documentComments.interfaces.js +2 -0
- package/dist/esm/widgets/documentComments/documentComments.interfaces.js.map +1 -0
- package/dist/esm/widgets/documentComments/index.js +2 -0
- package/dist/esm/widgets/documentComments/index.js.map +1 -0
- package/dist/esm/widgets/documentComparer/DocumentComparer.js +301 -0
- package/dist/esm/widgets/documentComparer/DocumentComparer.js.map +1 -0
- package/dist/esm/widgets/documentComparer/_documentComparerVariables.css +0 -0
- package/dist/esm/widgets/documentComparer/documentComparer.css +117 -0
- package/dist/esm/widgets/documentComparer/documentComparer.interfaces.js +2 -0
- package/dist/esm/widgets/documentComparer/documentComparer.interfaces.js.map +1 -0
- package/dist/esm/widgets/documentComparer/index.js +2 -0
- package/dist/esm/widgets/documentComparer/index.js.map +1 -0
- package/dist/esm/widgets/documentEditor/DocumentEditor.js +135 -0
- package/dist/esm/widgets/documentEditor/DocumentEditor.js.map +1 -0
- package/dist/esm/widgets/documentEditor/_documentEditorVariables.css +0 -0
- package/dist/esm/widgets/documentEditor/documentEditor.css +33 -0
- package/dist/esm/widgets/documentEditor/documentEditor.interfaces.js +2 -0
- package/dist/esm/widgets/documentEditor/documentEditor.interfaces.js.map +1 -0
- package/dist/esm/widgets/documentEditor/index.js +2 -0
- package/dist/esm/widgets/documentEditor/index.js.map +1 -0
- package/dist/esm/widgets/documentViewer/DocumentViewer.js +198 -0
- package/dist/esm/widgets/documentViewer/DocumentViewer.js.map +1 -0
- package/dist/esm/widgets/documentViewer/_documentViewerVariables.css +0 -0
- package/dist/esm/widgets/documentViewer/documentViewer.css +82 -0
- package/dist/esm/widgets/documentViewer/documentViewer.interfaces.js +2 -0
- package/dist/esm/widgets/documentViewer/documentViewer.interfaces.js.map +1 -0
- package/dist/esm/widgets/documentViewer/index.js +2 -0
- package/dist/esm/widgets/documentViewer/index.js.map +1 -0
- package/dist/esm/widgets/index.js +6 -0
- package/dist/esm/widgets/index.js.map +1 -1
- package/dist/esm/widgets/shared/documents/ToggleGroup.js +24 -0
- package/dist/esm/widgets/shared/documents/ToggleGroup.js.map +1 -0
- package/dist/esm/widgets/shared/documents/_documentVariables.css +0 -0
- package/dist/esm/widgets/shared/documents/annotations/AnnotationLayer.js +273 -0
- package/dist/esm/widgets/shared/documents/annotations/AnnotationLayer.js.map +1 -0
- package/dist/esm/widgets/shared/documents/annotations/_annotationLayerVariables.css +0 -0
- package/dist/esm/widgets/shared/documents/annotations/annotationLayer.css +65 -0
- package/dist/esm/widgets/shared/documents/annotations/annotations.interfaces.js +14 -0
- package/dist/esm/widgets/shared/documents/annotations/annotations.interfaces.js.map +1 -0
- package/dist/esm/widgets/shared/documents/annotations/highlightRegistry.js +58 -0
- package/dist/esm/widgets/shared/documents/annotations/highlightRegistry.js.map +1 -0
- package/dist/esm/widgets/shared/documents/annotations/index.js +4 -0
- package/dist/esm/widgets/shared/documents/annotations/index.js.map +1 -0
- package/dist/esm/widgets/shared/documents/annotations/textIndex.js +103 -0
- package/dist/esm/widgets/shared/documents/annotations/textIndex.js.map +1 -0
- package/dist/esm/widgets/shared/documents/annotations/textQuoteAnchor.js +150 -0
- package/dist/esm/widgets/shared/documents/annotations/textQuoteAnchor.js.map +1 -0
- package/dist/esm/widgets/shared/documents/documentHelpers.js +168 -0
- package/dist/esm/widgets/shared/documents/documentHelpers.js.map +1 -0
- package/dist/esm/widgets/shared/documents/documents.interfaces.js +2 -0
- package/dist/esm/widgets/shared/documents/documents.interfaces.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/DocumentDiff.js +65 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/DocumentDiff.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/_documentDiffVariables.css +0 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js +102 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.css +69 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js +2 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/lazyEngines.js +13 -0
- package/dist/esm/widgets/shared/documents/engines/lazyEngines.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js +191 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/_markdownEditorEngineVariables.css +0 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.css +50 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js +2 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js +170 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js +270 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js +198 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js +76 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/_markdownRendererVariables.css +0 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/markdownRenderer.css +78 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/index.js +5 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/index.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js +2 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js +64 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js +182 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js +78 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js +30 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/WordRenderer.js +41 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/WordRenderer.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js +207 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js +105 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordXml.js +57 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordXml.js.map +1 -0
- package/dist/esm/widgets/shared/documents/index.js +3 -0
- package/dist/esm/widgets/shared/documents/index.js.map +1 -0
- package/dist/esm/widgets/shared/documents/toggleGroup.css +8 -0
- package/dist/esm/widgets/shared/documents/useDocumentContent.js +215 -0
- package/dist/esm/widgets/shared/documents/useDocumentContent.js.map +1 -0
- package/dist/helpers/dateHelpers.d.ts.map +1 -1
- package/dist/helpers/fileHelpers.d.ts +5 -0
- package/dist/helpers/fileHelpers.d.ts.map +1 -0
- package/dist/helpers/index.d.ts +3 -0
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/interactionsHelper.d.ts +2 -0
- package/dist/helpers/interactionsHelper.d.ts.map +1 -1
- package/dist/helpers/objectHelpers.d.ts.map +1 -1
- package/dist/helpers/stringHelpers.d.ts.map +1 -1
- package/dist/helpers/urlHelpers.d.ts +3 -0
- package/dist/helpers/urlHelpers.d.ts.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/package.json +42 -28
- package/dist/widgets/documentComments/DocumentComments.d.ts +7 -0
- package/dist/widgets/documentComments/DocumentComments.d.ts.map +1 -0
- package/dist/widgets/documentComments/documentComments.interfaces.d.ts +57 -0
- package/dist/widgets/documentComments/documentComments.interfaces.d.ts.map +1 -0
- package/dist/widgets/documentComments/index.d.ts +3 -0
- package/dist/widgets/documentComments/index.d.ts.map +1 -0
- package/dist/widgets/documentComparer/DocumentComparer.d.ts +7 -0
- package/dist/widgets/documentComparer/DocumentComparer.d.ts.map +1 -0
- package/dist/widgets/documentComparer/documentComparer.interfaces.d.ts +78 -0
- package/dist/widgets/documentComparer/documentComparer.interfaces.d.ts.map +1 -0
- package/dist/widgets/documentComparer/index.d.ts +3 -0
- package/dist/widgets/documentComparer/index.d.ts.map +1 -0
- package/dist/widgets/documentEditor/DocumentEditor.d.ts +7 -0
- package/dist/widgets/documentEditor/DocumentEditor.d.ts.map +1 -0
- package/dist/widgets/documentEditor/documentEditor.interfaces.d.ts +40 -0
- package/dist/widgets/documentEditor/documentEditor.interfaces.d.ts.map +1 -0
- package/dist/widgets/documentEditor/index.d.ts +3 -0
- package/dist/widgets/documentEditor/index.d.ts.map +1 -0
- package/dist/widgets/documentViewer/DocumentViewer.d.ts +7 -0
- package/dist/widgets/documentViewer/DocumentViewer.d.ts.map +1 -0
- package/dist/widgets/documentViewer/documentViewer.interfaces.d.ts +47 -0
- package/dist/widgets/documentViewer/documentViewer.interfaces.d.ts.map +1 -0
- package/dist/widgets/documentViewer/index.d.ts +3 -0
- package/dist/widgets/documentViewer/index.d.ts.map +1 -0
- package/dist/widgets/index.d.ts +12 -0
- package/dist/widgets/index.d.ts.map +1 -1
- package/dist/widgets/shared/documents/ToggleGroup.d.ts +15 -0
- package/dist/widgets/shared/documents/ToggleGroup.d.ts.map +1 -0
- package/dist/widgets/shared/documents/annotations/AnnotationLayer.d.ts +27 -0
- package/dist/widgets/shared/documents/annotations/AnnotationLayer.d.ts.map +1 -0
- package/dist/widgets/shared/documents/annotations/annotations.interfaces.d.ts +43 -0
- package/dist/widgets/shared/documents/annotations/annotations.interfaces.d.ts.map +1 -0
- package/dist/widgets/shared/documents/annotations/highlightRegistry.d.ts +12 -0
- package/dist/widgets/shared/documents/annotations/highlightRegistry.d.ts.map +1 -0
- package/dist/widgets/shared/documents/annotations/index.d.ts +6 -0
- package/dist/widgets/shared/documents/annotations/index.d.ts.map +1 -0
- package/dist/widgets/shared/documents/annotations/textIndex.d.ts +16 -0
- package/dist/widgets/shared/documents/annotations/textIndex.d.ts.map +1 -0
- package/dist/widgets/shared/documents/annotations/textQuoteAnchor.d.ts +15 -0
- package/dist/widgets/shared/documents/annotations/textQuoteAnchor.d.ts.map +1 -0
- package/dist/widgets/shared/documents/documentHelpers.d.ts +14 -0
- package/dist/widgets/shared/documents/documentHelpers.d.ts.map +1 -0
- package/dist/widgets/shared/documents/documents.interfaces.d.ts +20 -0
- package/dist/widgets/shared/documents/documents.interfaces.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/documentDiff/DocumentDiff.d.ts +6 -0
- package/dist/widgets/shared/documents/engines/documentDiff/DocumentDiff.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.d.ts +25 -0
- package/dist/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.d.ts +17 -0
- package/dist/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/lazyEngines.d.ts +5 -0
- package/dist/widgets/shared/documents/engines/lazyEngines.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.d.ts +8 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.d.ts +23 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.d.ts +12 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.d.ts +8 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.d.ts +32 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.d.ts +12 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/index.d.ts +7 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/index.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.d.ts +16 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.d.ts +3 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.d.ts +6 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.d.ts +3 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.d.ts +8 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/WordRenderer.d.ts +11 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/WordRenderer.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/renderWordDocument.d.ts +7 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/renderWordDocument.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.d.ts +3 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/wordXml.d.ts +21 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/wordXml.d.ts.map +1 -0
- package/dist/widgets/shared/documents/index.d.ts +5 -0
- package/dist/widgets/shared/documents/index.d.ts.map +1 -0
- package/dist/widgets/shared/documents/useDocumentContent.d.ts +11 -0
- package/dist/widgets/shared/documents/useDocumentContent.d.ts.map +1 -0
- package/package.json +42 -28
- package/readme.md +49 -2
- package/dist/components/design/dialog/Dialog.test.d.ts +0 -5
- package/dist/components/design/dialog/Dialog.test.d.ts.map +0 -1
- package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.test.d.ts +0 -5
- package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.test.d.ts.map +0 -1
- package/dist/components/design/tooltip/Tooltip.test.d.ts +0 -2
- package/dist/components/design/tooltip/Tooltip.test.d.ts.map +0 -1
- package/dist/components/form/buttons/SimpleButton.test.d.ts +0 -5
- package/dist/components/form/buttons/SimpleButton.test.d.ts.map +0 -1
- package/dist/components/form/formFields/formFieldWrapper/FormField.test.d.ts +0 -5
- package/dist/components/form/formFields/formFieldWrapper/FormField.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/inputs/checkbox/checkboxSwitch/CheckboxSwitch.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/inputs/checkbox/checkboxSwitch/CheckboxSwitch.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/inputs/file/fileAttachmentList/FileAttachmentsList.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/inputs/file/fileAttachmentList/FileAttachmentsList.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/inputs/text/InputText.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/inputs/text/InputText.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/select/Select.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/select/Select.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/textarea/Textarea.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/textarea/Textarea.test.d.ts.map +0 -1
- package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts +0 -5
- package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts.map +0 -1
- package/dist/components/form/validation/ValidationMessages.test.d.ts +0 -5
- package/dist/components/form/validation/ValidationMessages.test.d.ts.map +0 -1
- package/dist/components/navigation/bubbleNavigator/bubbleNavigatorUtilities.test.d.ts +0 -2
- package/dist/components/navigation/bubbleNavigator/bubbleNavigatorUtilities.test.d.ts.map +0 -1
- package/dist/components/navigation/menu/menuItemContent/MenuItemIcon.test.d.ts +0 -5
- package/dist/components/navigation/menu/menuItemContent/MenuItemIcon.test.d.ts.map +0 -1
- package/dist/helpers/ageHelpers.test.d.ts +0 -2
- package/dist/helpers/ageHelpers.test.d.ts.map +0 -1
- package/dist/helpers/dateHelpers.test.d.ts +0 -2
- package/dist/helpers/dateHelpers.test.d.ts.map +0 -1
- package/dist/helpers/formatters.test.d.ts +0 -5
- package/dist/helpers/formatters.test.d.ts.map +0 -1
- package/dist/helpers/iconHelpers.test.d.ts +0 -5
- package/dist/helpers/iconHelpers.test.d.ts.map +0 -1
- package/dist/helpers/numberHelpers.test.d.ts +0 -5
- package/dist/helpers/numberHelpers.test.d.ts.map +0 -1
- package/dist/helpers/objectHelpers.test.d.ts +0 -2
- package/dist/helpers/objectHelpers.test.d.ts.map +0 -1
- package/dist/helpers/stringHelpers.test.d.ts +0 -2
- package/dist/helpers/stringHelpers.test.d.ts.map +0 -1
- package/dist/hooks/InteractiveHostFocus.test.d.ts +0 -5
- package/dist/hooks/InteractiveHostFocus.test.d.ts.map +0 -1
- package/dist/widgets/processLauncher/ProcessLauncher.test.d.ts +0 -5
- package/dist/widgets/processLauncher/ProcessLauncher.test.d.ts.map +0 -1
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { StateEffect, StateField } from '@codemirror/state';
|
|
2
|
+
import { Decoration, EditorView, ViewPlugin } from '@codemirror/view';
|
|
3
|
+
import { getVisibleComments } from '../../annotations/annotations.interfaces';
|
|
4
|
+
import { createTextQuoteAnchor, createTextQuoteResolver } from '../../annotations/textQuoteAnchor';
|
|
5
|
+
import { buildMarkdownTextIndex, sourceToTextOffset, textToSourceRange } from './markdownTextIndex';
|
|
6
|
+
const COMMENT_ID_ATTRIBUTE = 'data-comment-id';
|
|
7
|
+
const setAnnotations = StateEffect.define();
|
|
8
|
+
// Decorations and selections read the same document repeatedly, so the latest index is reused.
|
|
9
|
+
let cachedIndex = null;
|
|
10
|
+
const getMarkdownTextIndex = markdown => {
|
|
11
|
+
if (cachedIndex?.markdown !== markdown) {
|
|
12
|
+
cachedIndex = {
|
|
13
|
+
markdown,
|
|
14
|
+
index: buildMarkdownTextIndex(markdown)
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return cachedIndex.index;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
Returns a resolver for anchors in markdown source. Quotes are matched against the rendered text so
|
|
22
|
+
they resolve in either view; the raw source is a fallback for quotes that include markdown syntax.
|
|
23
|
+
*/
|
|
24
|
+
/* eslint-disable-next-line no-unused-vars */
|
|
25
|
+
export const createSourceAnchorResolver = doc => {
|
|
26
|
+
const index = getMarkdownTextIndex(doc);
|
|
27
|
+
const resolveInText = createTextQuoteResolver(index.text);
|
|
28
|
+
let resolveInSource;
|
|
29
|
+
return anchor => {
|
|
30
|
+
const match = resolveInText(anchor);
|
|
31
|
+
if (match) {
|
|
32
|
+
return textToSourceRange(index, match.start, match.end);
|
|
33
|
+
}
|
|
34
|
+
resolveInSource ??= createTextQuoteResolver(doc);
|
|
35
|
+
const sourceMatch = resolveInSource(anchor);
|
|
36
|
+
return sourceMatch ? {
|
|
37
|
+
from: sourceMatch.start,
|
|
38
|
+
to: sourceMatch.end
|
|
39
|
+
} : null;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// Creates an anchor for the rendered text within source[from, to); markup-only selections return null.
|
|
44
|
+
export const createSourceAnchor = (doc, from, to) => {
|
|
45
|
+
const index = getMarkdownTextIndex(doc);
|
|
46
|
+
return createTextQuoteAnchor(index.text, sourceToTextOffset(index, from), sourceToTextOffset(index, to));
|
|
47
|
+
};
|
|
48
|
+
const buildDecorationState = (doc, state) => {
|
|
49
|
+
const ranges = [];
|
|
50
|
+
let selectedRange = null;
|
|
51
|
+
const resolveAnchor = createSourceAnchorResolver(doc);
|
|
52
|
+
getVisibleComments(state.comments, state.showResolved).forEach(comment => {
|
|
53
|
+
const match = comment.anchor ? resolveAnchor(comment.anchor) : null;
|
|
54
|
+
if (!match || match.from >= match.to) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const isSelected = comment.id === state.selectedCommentId;
|
|
58
|
+
if (isSelected) {
|
|
59
|
+
selectedRange = match;
|
|
60
|
+
}
|
|
61
|
+
ranges.push(Decoration.mark({
|
|
62
|
+
class: `documentAnnotations__sourceHighlight${isSelected ? ' documentAnnotations__sourceHighlight--selected' : ''}`,
|
|
63
|
+
attributes: {
|
|
64
|
+
[COMMENT_ID_ATTRIBUTE]: comment.id
|
|
65
|
+
}
|
|
66
|
+
}).range(match.from, match.to));
|
|
67
|
+
});
|
|
68
|
+
return {
|
|
69
|
+
decorations: Decoration.set(ranges, true),
|
|
70
|
+
selectedRange
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
export const buildSourceDecorations = (doc, state) => buildDecorationState(doc, state).decorations;
|
|
74
|
+
const annotationField = StateField.define({
|
|
75
|
+
create: () => ({
|
|
76
|
+
state: {
|
|
77
|
+
comments: []
|
|
78
|
+
},
|
|
79
|
+
decorations: Decoration.none,
|
|
80
|
+
selectedRange: null
|
|
81
|
+
}),
|
|
82
|
+
update: (value, transaction) => {
|
|
83
|
+
const effect = transaction.effects.find(candidate => candidate.is(setAnnotations));
|
|
84
|
+
if (!effect && !transaction.docChanged) {
|
|
85
|
+
return value;
|
|
86
|
+
}
|
|
87
|
+
const state = effect ? effect.value : value.state;
|
|
88
|
+
// Anchors are resolved again after edits so highlights follow (or drop) the quoted text.
|
|
89
|
+
return {
|
|
90
|
+
state,
|
|
91
|
+
...buildDecorationState(transaction.state.doc.toString(), state)
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
provide: field => EditorView.decorations.from(field, value => value.decorations)
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
/*
|
|
98
|
+
Comment support for the markdown source editor (CodeMirror), which renders and virtualises its
|
|
99
|
+
own DOM, so highlights are drawn as decorations rather than through the DOM-based AnnotationLayer.
|
|
100
|
+
|
|
101
|
+
MDXEditor rebuilds the source editor whenever its extensions change, so the extension is created
|
|
102
|
+
once and annotation state is pushed into every live editor through `update`.
|
|
103
|
+
*/
|
|
104
|
+
export const createSourceAnnotations = handlers => {
|
|
105
|
+
const views = new Set();
|
|
106
|
+
const selectionVersions = new WeakMap();
|
|
107
|
+
let latest = {
|
|
108
|
+
comments: []
|
|
109
|
+
};
|
|
110
|
+
const tracker = ViewPlugin.define(view => {
|
|
111
|
+
views.add(view);
|
|
112
|
+
// A view created after the latest update (e.g. on switching to source mode) needs the current state.
|
|
113
|
+
queueMicrotask(() => {
|
|
114
|
+
if (views.has(view)) {
|
|
115
|
+
view.dispatch({
|
|
116
|
+
effects: setAnnotations.of(latest)
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
return {
|
|
121
|
+
destroy: () => {
|
|
122
|
+
selectionVersions.delete(view);
|
|
123
|
+
views.delete(view);
|
|
124
|
+
// Switching to rich text destroys the source view; its selection must not outlive it.
|
|
125
|
+
if (views.size === 0) {
|
|
126
|
+
handlers.onSelectionChange(null);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
});
|
|
131
|
+
const selectionListener = EditorView.updateListener.of(update => {
|
|
132
|
+
if (!update.selectionSet && !update.docChanged) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const version = (selectionVersions.get(update.view) ?? 0) + 1;
|
|
136
|
+
selectionVersions.set(update.view, version);
|
|
137
|
+
const isCurrentSelection = () => selectionVersions.get(update.view) === version;
|
|
138
|
+
const {
|
|
139
|
+
from,
|
|
140
|
+
to,
|
|
141
|
+
empty
|
|
142
|
+
} = update.state.selection.main;
|
|
143
|
+
const anchor = empty ? null : createSourceAnchor(update.state.doc.toString(), from, to);
|
|
144
|
+
if (!anchor) {
|
|
145
|
+
handlers.onSelectionChange(null);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// Layout must not be read while CodeMirror is applying an update.
|
|
149
|
+
update.view.requestMeasure({
|
|
150
|
+
read: view => isCurrentSelection() ? view.coordsAtPos(to) : null,
|
|
151
|
+
write: coords => {
|
|
152
|
+
if (isCurrentSelection()) {
|
|
153
|
+
handlers.onSelectionChange(coords ? {
|
|
154
|
+
anchor,
|
|
155
|
+
rect: {
|
|
156
|
+
bottom: coords.bottom,
|
|
157
|
+
right: coords.right
|
|
158
|
+
}
|
|
159
|
+
} : null);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
const clickHandler = EditorView.domEventHandlers({
|
|
165
|
+
click: event => {
|
|
166
|
+
const highlight = event.target?.closest?.(`[${COMMENT_ID_ATTRIBUTE}]`);
|
|
167
|
+
const commentId = highlight?.getAttribute(COMMENT_ID_ATTRIBUTE);
|
|
168
|
+
if (commentId) {
|
|
169
|
+
handlers.onSelectComment(commentId);
|
|
170
|
+
}
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
const extension = [annotationField, tracker, selectionListener, clickHandler];
|
|
175
|
+
const update = state => {
|
|
176
|
+
// Only a newly selected comment scrolls, not other annotation updates.
|
|
177
|
+
const shouldScroll = Boolean(state.selectedCommentId) && state.selectedCommentId !== latest.selectedCommentId;
|
|
178
|
+
latest = state;
|
|
179
|
+
views.forEach(view => {
|
|
180
|
+
view.dispatch({
|
|
181
|
+
effects: setAnnotations.of(state)
|
|
182
|
+
});
|
|
183
|
+
const selectedRange = shouldScroll ? view.state.field(annotationField).selectedRange : null;
|
|
184
|
+
if (selectedRange) {
|
|
185
|
+
view.dispatch({
|
|
186
|
+
effects: EditorView.scrollIntoView(selectedRange.from, {
|
|
187
|
+
y: 'center'
|
|
188
|
+
})
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
return {
|
|
194
|
+
extension,
|
|
195
|
+
update
|
|
196
|
+
};
|
|
197
|
+
};
|
|
198
|
+
//# sourceMappingURL=sourceAnnotations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceAnnotations.js","names":["StateEffect","StateField","Decoration","EditorView","ViewPlugin","getVisibleComments","createTextQuoteAnchor","createTextQuoteResolver","buildMarkdownTextIndex","sourceToTextOffset","textToSourceRange","COMMENT_ID_ATTRIBUTE","setAnnotations","define","cachedIndex","getMarkdownTextIndex","markdown","index","createSourceAnchorResolver","doc","resolveInText","text","resolveInSource","anchor","match","start","end","sourceMatch","from","to","createSourceAnchor","buildDecorationState","state","ranges","selectedRange","resolveAnchor","comments","showResolved","forEach","comment","isSelected","id","selectedCommentId","push","mark","class","attributes","range","decorations","set","buildSourceDecorations","annotationField","create","none","update","value","transaction","effect","effects","find","candidate","is","docChanged","toString","provide","field","createSourceAnnotations","handlers","views","Set","selectionVersions","WeakMap","latest","tracker","view","add","queueMicrotask","has","dispatch","of","destroy","delete","size","onSelectionChange","selectionListener","updateListener","selectionSet","version","get","isCurrentSelection","empty","selection","main","requestMeasure","read","coordsAtPos","write","coords","rect","bottom","right","clickHandler","domEventHandlers","click","event","highlight","target","closest","commentId","getAttribute","onSelectComment","extension","shouldScroll","Boolean","scrollIntoView","y"],"sources":["../../../../../../../src/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.ts"],"sourcesContent":["import { Extension, Range, StateEffect, StateField } from '@codemirror/state';\nimport { Decoration, DecorationSet, EditorView, ViewPlugin } from '@codemirror/view';\n\nimport { DocumentComment, getVisibleComments, TextQuoteAnchor } from '../../annotations/annotations.interfaces';\nimport { createTextQuoteAnchor, createTextQuoteResolver } from '../../annotations/textQuoteAnchor';\nimport { buildMarkdownTextIndex, MarkdownTextIndex, sourceToTextOffset, textToSourceRange } from './markdownTextIndex';\n\nexport type SourceAnnotationState = {\n comments: DocumentComment[];\n selectedCommentId?: string;\n showResolved?: boolean;\n};\n\nexport type SourceSelection = {\n anchor: TextQuoteAnchor;\n rect: { bottom: number; right: number };\n} | null;\n\nexport type SourceAnnotationHandlers = {\n /* eslint-disable-next-line no-unused-vars */\n onSelectionChange: (selection: SourceSelection) => void;\n /* eslint-disable-next-line no-unused-vars */\n onSelectComment: (commentId: string) => void;\n};\n\nconst COMMENT_ID_ATTRIBUTE = 'data-comment-id';\nconst setAnnotations = StateEffect.define<SourceAnnotationState>();\n\ntype SourceRange = { from: number; to: number };\n\n// Decorations and selections read the same document repeatedly, so the latest index is reused.\nlet cachedIndex: { markdown: string; index: MarkdownTextIndex } | null = null;\nconst getMarkdownTextIndex = (markdown: string): MarkdownTextIndex => {\n if (cachedIndex?.markdown !== markdown) {\n cachedIndex = { markdown, index: buildMarkdownTextIndex(markdown) };\n }\n return cachedIndex.index;\n};\n\n/*\n Returns a resolver for anchors in markdown source. Quotes are matched against the rendered text so\n they resolve in either view; the raw source is a fallback for quotes that include markdown syntax.\n */\n/* eslint-disable-next-line no-unused-vars */\nexport const createSourceAnchorResolver = (doc: string): ((anchor: TextQuoteAnchor) => SourceRange | null) => {\n const index = getMarkdownTextIndex(doc);\n const resolveInText = createTextQuoteResolver(index.text);\n let resolveInSource: ReturnType<typeof createTextQuoteResolver> | undefined;\n return (anchor) => {\n const match = resolveInText(anchor);\n if (match) {\n return textToSourceRange(index, match.start, match.end);\n }\n resolveInSource ??= createTextQuoteResolver(doc);\n const sourceMatch = resolveInSource(anchor);\n return sourceMatch ? { from: sourceMatch.start, to: sourceMatch.end } : null;\n };\n};\n\n// Creates an anchor for the rendered text within source[from, to); markup-only selections return null.\nexport const createSourceAnchor = (doc: string, from: number, to: number): TextQuoteAnchor | null => {\n const index = getMarkdownTextIndex(doc);\n return createTextQuoteAnchor(index.text, sourceToTextOffset(index, from), sourceToTextOffset(index, to));\n};\n\ntype SourceDecorations = { decorations: DecorationSet; selectedRange: SourceRange | null };\n\nconst buildDecorationState = (doc: string, state: SourceAnnotationState): SourceDecorations => {\n const ranges: Range<Decoration>[] = [];\n let selectedRange: SourceRange | null = null;\n const resolveAnchor = createSourceAnchorResolver(doc);\n getVisibleComments(state.comments, state.showResolved).forEach((comment) => {\n const match = comment.anchor ? resolveAnchor(comment.anchor) : null;\n if (!match || match.from >= match.to) {\n return;\n }\n const isSelected = comment.id === state.selectedCommentId;\n if (isSelected) {\n selectedRange = match;\n }\n ranges.push(Decoration.mark({\n class: `documentAnnotations__sourceHighlight${ isSelected ? ' documentAnnotations__sourceHighlight--selected' : '' }`,\n attributes: { [COMMENT_ID_ATTRIBUTE]: comment.id }\n }).range(match.from, match.to));\n });\n return { decorations: Decoration.set(ranges, true), selectedRange };\n};\n\nexport const buildSourceDecorations = (doc: string, state: SourceAnnotationState): DecorationSet =>\n buildDecorationState(doc, state).decorations;\n\ntype FieldValue = SourceDecorations & { state: SourceAnnotationState };\n\nconst annotationField = StateField.define<FieldValue>({\n create: () => ({ state: { comments: [] }, decorations: Decoration.none, selectedRange: null }),\n update: (value, transaction) => {\n const effect = transaction.effects.find((candidate) => candidate.is(setAnnotations));\n if (!effect && !transaction.docChanged) {\n return value;\n }\n const state = effect ? (effect.value as SourceAnnotationState) : value.state;\n // Anchors are resolved again after edits so highlights follow (or drop) the quoted text.\n return { state, ...buildDecorationState(transaction.state.doc.toString(), state) };\n },\n provide: (field) => EditorView.decorations.from(field, (value) => value.decorations)\n});\n\n/*\n Comment support for the markdown source editor (CodeMirror), which renders and virtualises its\n own DOM, so highlights are drawn as decorations rather than through the DOM-based AnnotationLayer.\n\n MDXEditor rebuilds the source editor whenever its extensions change, so the extension is created\n once and annotation state is pushed into every live editor through `update`.\n */\nexport const createSourceAnnotations = (handlers: SourceAnnotationHandlers) => {\n const views = new Set<EditorView>();\n const selectionVersions = new WeakMap<EditorView, number>();\n let latest: SourceAnnotationState = { comments: [] };\n\n const tracker = ViewPlugin.define((view) => {\n views.add(view);\n // A view created after the latest update (e.g. on switching to source mode) needs the current state.\n queueMicrotask(() => {\n if (views.has(view)) {\n view.dispatch({ effects: setAnnotations.of(latest) });\n }\n });\n return {\n destroy: () => {\n selectionVersions.delete(view);\n views.delete(view);\n // Switching to rich text destroys the source view; its selection must not outlive it.\n if (views.size === 0) {\n handlers.onSelectionChange(null);\n }\n }\n };\n });\n\n const selectionListener = EditorView.updateListener.of((update) => {\n if (!update.selectionSet && !update.docChanged) {\n return;\n }\n const version = (selectionVersions.get(update.view) ?? 0) + 1;\n selectionVersions.set(update.view, version);\n const isCurrentSelection = () => selectionVersions.get(update.view) === version;\n const { from, to, empty } = update.state.selection.main;\n const anchor = empty ? null : createSourceAnchor(update.state.doc.toString(), from, to);\n if (!anchor) {\n handlers.onSelectionChange(null);\n return;\n }\n // Layout must not be read while CodeMirror is applying an update.\n update.view.requestMeasure({\n read: (view) => (isCurrentSelection() ? view.coordsAtPos(to) : null),\n write: (coords) => {\n if (isCurrentSelection()) {\n handlers.onSelectionChange(coords ? { anchor, rect: { bottom: coords.bottom, right: coords.right } } : null);\n }\n }\n });\n });\n\n const clickHandler = EditorView.domEventHandlers({\n click: (event) => {\n const highlight = (event.target as Element | null)?.closest?.(`[${ COMMENT_ID_ATTRIBUTE }]`);\n const commentId = highlight?.getAttribute(COMMENT_ID_ATTRIBUTE);\n if (commentId) {\n handlers.onSelectComment(commentId);\n }\n return false;\n }\n });\n\n const extension: Extension = [annotationField, tracker, selectionListener, clickHandler];\n\n const update = (state: SourceAnnotationState) => {\n // Only a newly selected comment scrolls, not other annotation updates.\n const shouldScroll = Boolean(state.selectedCommentId) && state.selectedCommentId !== latest.selectedCommentId;\n latest = state;\n views.forEach((view) => {\n view.dispatch({ effects: setAnnotations.of(state) });\n const selectedRange = shouldScroll ? view.state.field(annotationField).selectedRange : null;\n if (selectedRange) {\n view.dispatch({ effects: EditorView.scrollIntoView(selectedRange.from, { y: 'center' }) });\n }\n });\n };\n\n return { extension, update };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import React, { createElement, useId, useMemo } from 'react';
|
|
3
|
+
import ReactMarkdown, { defaultUrlTransform } from 'react-markdown';
|
|
4
|
+
import remarkGfm from 'remark-gfm';
|
|
5
|
+
import { resolveDocumentResource } from '../../documentHelpers';
|
|
6
|
+
import { rehypeTableCleanup, remarkLayoutTables, remarkLineBreaks, remarkParagraphBreaks, remarkSafeTables, remarkTableCellLists } from './plugins';
|
|
7
|
+
import './markdownRenderer.css';
|
|
8
|
+
const remarkPlugins = [remarkGfm, remarkLineBreaks, remarkParagraphBreaks, remarkLayoutTables, remarkTableCellLists, remarkSafeTables];
|
|
9
|
+
const rehypePlugins = [rehypeTableCleanup];
|
|
10
|
+
const headingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
|
|
11
|
+
|
|
12
|
+
// mdast-util-to-hast prefixes footnote targets but leaves the shared label ID unprefixed.
|
|
13
|
+
const rehypeFootnoteLabel = labelId => tree => {
|
|
14
|
+
const visit = node => {
|
|
15
|
+
if (node.properties?.id === 'footnote-label') {
|
|
16
|
+
node.properties.id = labelId;
|
|
17
|
+
}
|
|
18
|
+
if (node.properties?.dataFootnoteRef) {
|
|
19
|
+
node.properties.ariaDescribedBy = [labelId];
|
|
20
|
+
}
|
|
21
|
+
node.children?.forEach(visit);
|
|
22
|
+
};
|
|
23
|
+
visit(tree);
|
|
24
|
+
};
|
|
25
|
+
const getHeadingComponents = headingOffset => {
|
|
26
|
+
if (headingOffset <= 0) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
return Object.fromEntries(headingTags.map((tag, index) => {
|
|
30
|
+
const level = index + 1 + headingOffset;
|
|
31
|
+
const HeadingComponent = (
|
|
32
|
+
// `node` is react-markdown's AST node; it is removed so it is not written to the DOM.
|
|
33
|
+
/* eslint-disable-next-line no-unused-vars */
|
|
34
|
+
{
|
|
35
|
+
node: _node,
|
|
36
|
+
...props
|
|
37
|
+
}) => level <= 6 ? /*#__PURE__*/createElement(`h${level}`, props) : /*#__PURE__*/React.createElement("div", _extends({}, props, {
|
|
38
|
+
role: "heading",
|
|
39
|
+
"aria-level": level
|
|
40
|
+
}));
|
|
41
|
+
return [tag, HeadingComponent];
|
|
42
|
+
}));
|
|
43
|
+
};
|
|
44
|
+
export const MarkdownRenderer = ({
|
|
45
|
+
markdown,
|
|
46
|
+
headingOffset = 0,
|
|
47
|
+
resolveResourceUrl,
|
|
48
|
+
cssClass = ''
|
|
49
|
+
}) => {
|
|
50
|
+
const components = useMemo(() => getHeadingComponents(headingOffset), [headingOffset]);
|
|
51
|
+
const footnoteId = useId();
|
|
52
|
+
const scopedRehypePlugins = useMemo(() => [...(rehypePlugins ?? []), [rehypeFootnoteLabel, `document-${footnoteId}-footnote-label`]], [footnoteId]);
|
|
53
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
54
|
+
className: `markdownRenderer ${cssClass}`.trim()
|
|
55
|
+
}, /*#__PURE__*/React.createElement(ReactMarkdown, {
|
|
56
|
+
remarkPlugins: remarkPlugins,
|
|
57
|
+
rehypePlugins: scopedRehypePlugins,
|
|
58
|
+
remarkRehypeOptions: {
|
|
59
|
+
clobberPrefix: `document-${footnoteId}-`
|
|
60
|
+
},
|
|
61
|
+
components: components,
|
|
62
|
+
urlTransform: (url, key, node) => {
|
|
63
|
+
// react-markdown visits final HAST, including children injected by remarkSafeTables.
|
|
64
|
+
const resolved = resolveResourceUrl ? resolveResourceUrl(url) ?? '' : url;
|
|
65
|
+
if (key === 'src' && node.tagName === 'img') {
|
|
66
|
+
const vetted = resolveDocumentResource(resolved);
|
|
67
|
+
if (/^(?:blob:|data:)/i.test(vetted)) {
|
|
68
|
+
return vetted;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return defaultUrlTransform(resolved);
|
|
72
|
+
}
|
|
73
|
+
}, markdown));
|
|
74
|
+
};
|
|
75
|
+
export default MarkdownRenderer;
|
|
76
|
+
//# sourceMappingURL=MarkdownRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownRenderer.js","names":["React","createElement","useId","useMemo","ReactMarkdown","defaultUrlTransform","remarkGfm","resolveDocumentResource","rehypeTableCleanup","remarkLayoutTables","remarkLineBreaks","remarkParagraphBreaks","remarkSafeTables","remarkTableCellLists","remarkPlugins","rehypePlugins","headingTags","rehypeFootnoteLabel","labelId","tree","visit","node","properties","id","dataFootnoteRef","ariaDescribedBy","children","forEach","getHeadingComponents","headingOffset","undefined","Object","fromEntries","map","tag","index","level","HeadingComponent","_node","props","_extends","role","MarkdownRenderer","markdown","resolveResourceUrl","cssClass","components","footnoteId","scopedRehypePlugins","className","trim","remarkRehypeOptions","clobberPrefix","urlTransform","url","key","resolved","tagName","vetted","test"],"sources":["../../../../../../../src/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.tsx"],"sourcesContent":["import React, { createElement, FC, useId, useMemo } from 'react';\nimport ReactMarkdown, { Components, defaultUrlTransform, Options } from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\n\nimport { resolveDocumentResource } from '../../documentHelpers';\nimport { ResolveResourceUrl } from '../../documents.interfaces';\nimport {\n rehypeTableCleanup,\n remarkLayoutTables,\n remarkLineBreaks,\n remarkParagraphBreaks,\n remarkSafeTables,\n remarkTableCellLists\n} from './plugins';\nimport { MarkdownNode, MarkdownTransformer } from './plugins/markdownNode.interfaces';\n\nimport './markdownRenderer.scss';\n\nexport type MarkdownRendererProps = {\n markdown: string;\n // Demote headings so an embedded document sits beneath the host page's own heading.\n headingOffset?: number;\n resolveResourceUrl?: ResolveResourceUrl;\n cssClass?: string;\n};\n\nconst remarkPlugins = [\n remarkGfm,\n remarkLineBreaks,\n remarkParagraphBreaks,\n remarkLayoutTables,\n remarkTableCellLists,\n remarkSafeTables\n] as Options['remarkPlugins'];\nconst rehypePlugins = [rehypeTableCleanup] as Options['rehypePlugins'];\nconst headingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const;\n\n// mdast-util-to-hast prefixes footnote targets but leaves the shared label ID unprefixed.\nconst rehypeFootnoteLabel = (labelId: string): MarkdownTransformer => (tree) => {\n const visit = (node: MarkdownNode) => {\n if (node.properties?.id === 'footnote-label') {\n node.properties.id = labelId;\n }\n if (node.properties?.dataFootnoteRef) {\n node.properties.ariaDescribedBy = [labelId];\n }\n node.children?.forEach(visit);\n };\n visit(tree);\n};\n\nconst getHeadingComponents = (headingOffset: number): Components | undefined => {\n if (headingOffset <= 0) {\n return undefined;\n }\n return Object.fromEntries(headingTags.map((tag, index) => {\n const level = index + 1 + headingOffset;\n const HeadingComponent: FC<React.HTMLAttributes<HTMLHeadingElement> & { node?: unknown }> = (\n // `node` is react-markdown's AST node; it is removed so it is not written to the DOM.\n /* eslint-disable-next-line no-unused-vars */\n { node: _node, ...props }\n ) => (level <= 6\n ? createElement(`h${ level }`, props)\n : <div { ...props } role=\"heading\" aria-level={ level } />);\n return [tag, HeadingComponent];\n })) as Components;\n};\n\nexport const MarkdownRenderer: FC<MarkdownRendererProps> = (\n {\n markdown,\n headingOffset = 0,\n resolveResourceUrl,\n cssClass = ''\n }\n) => {\n const components = useMemo(() => getHeadingComponents(headingOffset), [headingOffset]);\n const footnoteId = useId();\n const scopedRehypePlugins = useMemo(() => [\n ...rehypePlugins ?? [],\n [rehypeFootnoteLabel, `document-${ footnoteId }-footnote-label`]\n ] as Options['rehypePlugins'], [footnoteId]);\n\n return (\n <div className={ `markdownRenderer ${ cssClass }`.trim() }>\n <ReactMarkdown\n remarkPlugins={ remarkPlugins }\n rehypePlugins={ scopedRehypePlugins }\n remarkRehypeOptions={ { clobberPrefix: `document-${ footnoteId }-` } }\n components={ components }\n urlTransform={ (url, key, node) => {\n // react-markdown visits final HAST, including children injected by remarkSafeTables.\n const resolved = resolveResourceUrl ? resolveResourceUrl(url) ?? '' : url;\n if (key === 'src' && node.tagName === 'img') {\n const vetted = resolveDocumentResource(resolved);\n if (/^(?:blob:|data:)/i.test(vetted)) {\n return vetted;\n }\n }\n return defaultUrlTransform(resolved);\n } }\n >\n { markdown }\n </ReactMarkdown>\n </div>\n );\n};\n\nexport default MarkdownRenderer;\n"],"mappings":"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","ignoreList":[]}
|
package/dist/esm/widgets/shared/documents/engines/markdownRenderer/_markdownRendererVariables.css
ADDED
|
File without changes
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
.markdownRenderer {
|
|
2
|
+
padding: var(--markdownRendererPadding, var(--documentPadding, 30px));
|
|
3
|
+
max-width: var(--markdownRendererMaxWidth, 920px);
|
|
4
|
+
font-family: var(--documentFont);
|
|
5
|
+
color: var(--documentFgColor);
|
|
6
|
+
}
|
|
7
|
+
.markdownRenderer h1,
|
|
8
|
+
.markdownRenderer h2,
|
|
9
|
+
.markdownRenderer h3,
|
|
10
|
+
.markdownRenderer h4,
|
|
11
|
+
.markdownRenderer h5,
|
|
12
|
+
.markdownRenderer h6,
|
|
13
|
+
.markdownRenderer [role=heading] {
|
|
14
|
+
margin: var(--markdownRendererHeadingMargin, 25px 0 10px);
|
|
15
|
+
font-family: var(--documentHeadingFont);
|
|
16
|
+
}
|
|
17
|
+
.markdownRenderer h1:first-child,
|
|
18
|
+
.markdownRenderer h2:first-child,
|
|
19
|
+
.markdownRenderer h3:first-child,
|
|
20
|
+
.markdownRenderer h4:first-child,
|
|
21
|
+
.markdownRenderer h5:first-child,
|
|
22
|
+
.markdownRenderer h6:first-child,
|
|
23
|
+
.markdownRenderer [role=heading]:first-child {
|
|
24
|
+
margin-top: 0;
|
|
25
|
+
}
|
|
26
|
+
.markdownRenderer p,
|
|
27
|
+
.markdownRenderer li {
|
|
28
|
+
line-height: var(--markdownRendererLineHeight, 1.6);
|
|
29
|
+
}
|
|
30
|
+
.markdownRenderer table {
|
|
31
|
+
width: 100%;
|
|
32
|
+
border-collapse: collapse;
|
|
33
|
+
margin: var(--markdownRendererTableMargin, 20px 0);
|
|
34
|
+
}
|
|
35
|
+
.markdownRenderer th,
|
|
36
|
+
.markdownRenderer td {
|
|
37
|
+
border: var(--markdownRendererCellBorder, var(--documentBorder));
|
|
38
|
+
padding: var(--markdownRendererCellPadding, 10px);
|
|
39
|
+
vertical-align: top;
|
|
40
|
+
}
|
|
41
|
+
.markdownRenderer th {
|
|
42
|
+
background: var(--markdownRendererTableHeaderBg, var(--documentSubtleBg));
|
|
43
|
+
text-align: left;
|
|
44
|
+
}
|
|
45
|
+
.markdownRenderer td ul {
|
|
46
|
+
margin: 5px 0;
|
|
47
|
+
padding-left: 20px;
|
|
48
|
+
}
|
|
49
|
+
.markdownRenderer td li + li {
|
|
50
|
+
margin-top: 5px;
|
|
51
|
+
}
|
|
52
|
+
.markdownRenderer table.layoutTable > :is(thead, tbody, tfoot) > tr > :is(th, td):first-child:not(:last-child) {
|
|
53
|
+
min-width: var(--markdownRendererLayoutLabelMinWidth, clamp(100px, 20vw, 150px));
|
|
54
|
+
}
|
|
55
|
+
.markdownRenderer th.shortTableCell,
|
|
56
|
+
.markdownRenderer td.shortTableCell {
|
|
57
|
+
white-space: nowrap;
|
|
58
|
+
}
|
|
59
|
+
@media (max-width: 600px) {
|
|
60
|
+
.markdownRenderer th.shortTableCell,
|
|
61
|
+
.markdownRenderer td.shortTableCell {
|
|
62
|
+
white-space: normal;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
.markdownRenderer code {
|
|
66
|
+
background: var(--markdownRendererCodeBg, var(--documentSubtleBg));
|
|
67
|
+
border-radius: var(--documentBorderRadius);
|
|
68
|
+
padding: 0 5px;
|
|
69
|
+
}
|
|
70
|
+
.markdownRenderer pre code {
|
|
71
|
+
display: block;
|
|
72
|
+
padding: 10px;
|
|
73
|
+
overflow-x: auto;
|
|
74
|
+
}
|
|
75
|
+
.markdownRenderer img {
|
|
76
|
+
max-width: 100%;
|
|
77
|
+
height: auto;
|
|
78
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { remarkLayoutTables, remarkLineBreaks, remarkParagraphBreaks, remarkTableCellLists } from './remarkPlugins';
|
|
2
|
+
export { remarkSafeTables } from './remarkSafeTables';
|
|
3
|
+
export { rehypeTableCleanup } from './rehypeTableCleanup';
|
|
4
|
+
export { hasMeaningfulTableText, isLikelyLayoutTable, LAYOUT_TABLE_MARKER } from './tableHelpers';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["remarkLayoutTables","remarkLineBreaks","remarkParagraphBreaks","remarkTableCellLists","remarkSafeTables","rehypeTableCleanup","hasMeaningfulTableText","isLikelyLayoutTable","LAYOUT_TABLE_MARKER"],"sources":["../../../../../../../../src/widgets/shared/documents/engines/markdownRenderer/plugins/index.ts"],"sourcesContent":["export {\n remarkLayoutTables,\n remarkLineBreaks,\n remarkParagraphBreaks,\n remarkTableCellLists\n} from './remarkPlugins';\nexport { remarkSafeTables } from './remarkSafeTables';\nexport { rehypeTableCleanup } from './rehypeTableCleanup';\nexport { hasMeaningfulTableText, isLikelyLayoutTable, LAYOUT_TABLE_MARKER } from './tableHelpers';\nexport type { LayoutTableCell } from './tableHelpers';\nexport type { MarkdownNode, MarkdownTransformer } from './markdownNode.interfaces';\n"],"mappings":"AAAA,SACEA,kBAAkB,EAClBC,gBAAgB,EAChBC,qBAAqB,EACrBC,oBAAoB,QACf,iBAAiB;AACxB,SAASC,gBAAgB,QAAQ,oBAAoB;AACrD,SAASC,kBAAkB,QAAQ,sBAAsB;AACzD,SAASC,sBAAsB,EAAEC,mBAAmB,EAAEC,mBAAmB,QAAQ,gBAAgB","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdownNode.interfaces.js","names":[],"sources":["../../../../../../../../src/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.ts"],"sourcesContent":["// Minimal structural view of mdast/hast nodes; the plugins only need these fields, which keeps\n// them free of the unified type packages.\nexport type MarkdownNode = {\n type: string;\n value?: string;\n tagName?: string;\n properties?: Record<string, unknown>;\n children?: MarkdownNode[];\n data?: {\n hName?: string;\n hProperties?: Record<string, unknown> & { className?: string[] };\n hChildren?: unknown[];\n };\n};\n\n/* eslint-disable-next-line no-unused-vars */\nexport type MarkdownTransformer = (tree: MarkdownNode) => void;\n"],"mappings":"","ignoreList":[]}
|
package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { hasMeaningfulTableText } from './tableHelpers';
|
|
2
|
+
const SHORT_TABLE_CELL_MAX_LENGTH = 20;
|
|
3
|
+
const inlineTags = new Set(['strong', 'em', 'b', 'i', 'u', 'del', 's', 'code', 'a', 'span']);
|
|
4
|
+
const mediaTags = ['img', 'svg', 'video', 'audio', 'canvas'];
|
|
5
|
+
const getInlineText = node => {
|
|
6
|
+
if (node.type === 'text') {
|
|
7
|
+
return node.value ?? '';
|
|
8
|
+
}
|
|
9
|
+
if (node.type !== 'element' || !inlineTags.has(node.tagName ?? '')) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
const parts = node.children?.map(getInlineText) ?? [];
|
|
13
|
+
return parts.some(part => part === undefined) ? undefined : parts.join('');
|
|
14
|
+
};
|
|
15
|
+
const getClassNames = className => {
|
|
16
|
+
if (Array.isArray(className)) {
|
|
17
|
+
return className;
|
|
18
|
+
}
|
|
19
|
+
return typeof className === 'string' ? className.split(/\s+/) : [];
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// Short cells (labels, codes, dates) are kept on one line rather than wrapping awkwardly.
|
|
23
|
+
const markShortCell = cell => {
|
|
24
|
+
const parts = cell.children?.map(getInlineText) ?? [];
|
|
25
|
+
if (parts.some(part => part === undefined)) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const text = parts.join('').replace(/\s+/g, ' ').trim();
|
|
29
|
+
if (!text || text.length > SHORT_TABLE_CELL_MAX_LENGTH) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const className = [...new Set([...getClassNames(cell.properties?.className), 'shortTableCell'])];
|
|
33
|
+
cell.properties = {
|
|
34
|
+
...cell.properties,
|
|
35
|
+
className
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
const hasContent = node => node.type === 'text' && hasMeaningfulTableText(node.value ?? '') || node.type === 'element' && mediaTags.includes(node.tagName ?? '') || Boolean(node.children?.some(hasContent));
|
|
39
|
+
const isCell = node => node.tagName === 'td' || node.tagName === 'th';
|
|
40
|
+
const getCells = node => isCell(node) ? [node] : node.children?.flatMap(getCells) ?? [];
|
|
41
|
+
|
|
42
|
+
// Removes tables and table headers that converters emit with no visible content.
|
|
43
|
+
export const rehypeTableCleanup = () => {
|
|
44
|
+
const transform = parent => {
|
|
45
|
+
if (isCell(parent)) {
|
|
46
|
+
markShortCell(parent);
|
|
47
|
+
}
|
|
48
|
+
if (!parent.children) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
parent.children = parent.children.filter(node => {
|
|
52
|
+
if (node.tagName === 'table' && !getCells(node).some(hasContent)) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
if (parent.tagName === 'table' && node.tagName === 'thead' && !getCells(node).some(hasContent)) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
transform(node);
|
|
59
|
+
return true;
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
return transform;
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=rehypeTableCleanup.js.map
|
package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rehypeTableCleanup.js","names":["hasMeaningfulTableText","SHORT_TABLE_CELL_MAX_LENGTH","inlineTags","Set","mediaTags","getInlineText","node","type","value","has","tagName","undefined","parts","children","map","some","part","join","getClassNames","className","Array","isArray","split","markShortCell","cell","text","replace","trim","length","properties","hasContent","includes","Boolean","isCell","getCells","flatMap","rehypeTableCleanup","transform","parent","filter"],"sources":["../../../../../../../../src/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.ts"],"sourcesContent":["import { hasMeaningfulTableText } from './tableHelpers';\nimport { MarkdownNode, MarkdownTransformer } from './markdownNode.interfaces';\n\nconst SHORT_TABLE_CELL_MAX_LENGTH = 20;\nconst inlineTags = new Set(['strong', 'em', 'b', 'i', 'u', 'del', 's', 'code', 'a', 'span']);\nconst mediaTags = ['img', 'svg', 'video', 'audio', 'canvas'];\n\nconst getInlineText = (node: MarkdownNode): string | undefined => {\n if (node.type === 'text') {\n return node.value ?? '';\n }\n if (node.type !== 'element' || !inlineTags.has(node.tagName ?? '')) {\n return undefined;\n }\n const parts = node.children?.map(getInlineText) ?? [];\n return parts.some((part) => part === undefined) ? undefined : parts.join('');\n};\n\nconst getClassNames = (className: unknown): string[] => {\n if (Array.isArray(className)) {\n return className as string[];\n }\n return typeof className === 'string' ? className.split(/\\s+/) : [];\n};\n\n// Short cells (labels, codes, dates) are kept on one line rather than wrapping awkwardly.\nconst markShortCell = (cell: MarkdownNode): void => {\n const parts = cell.children?.map(getInlineText) ?? [];\n if (parts.some((part) => part === undefined)) {\n return;\n }\n const text = parts.join('').replace(/\\s+/g, ' ').trim();\n if (!text || text.length > SHORT_TABLE_CELL_MAX_LENGTH) {\n return;\n }\n const className = [...new Set([...getClassNames(cell.properties?.className), 'shortTableCell'])];\n cell.properties = { ...cell.properties, className };\n};\n\nconst hasContent = (node: MarkdownNode): boolean =>\n (node.type === 'text' && hasMeaningfulTableText(node.value ?? ''))\n || (node.type === 'element' && mediaTags.includes(node.tagName ?? ''))\n || Boolean(node.children?.some(hasContent));\n\nconst isCell = (node: MarkdownNode): boolean => node.tagName === 'td' || node.tagName === 'th';\n\nconst getCells = (node: MarkdownNode): MarkdownNode[] => (isCell(node) ? [node] : node.children?.flatMap(getCells) ?? []);\n\n// Removes tables and table headers that converters emit with no visible content.\nexport const rehypeTableCleanup = (): MarkdownTransformer => {\n const transform = (parent: MarkdownNode): void => {\n if (isCell(parent)) {\n markShortCell(parent);\n }\n if (!parent.children) {\n return;\n }\n parent.children = parent.children.filter((node) => {\n if (node.tagName === 'table' && !getCells(node).some(hasContent)) {\n return false;\n }\n if (parent.tagName === 'table' && node.tagName === 'thead' && !getCells(node).some(hasContent)) {\n return false;\n }\n transform(node);\n return true;\n });\n };\n return transform;\n};\n"],"mappings":"AAAA,SAASA,sBAAsB,QAAQ,gBAAgB;AAGvD,MAAMC,2BAA2B,GAAG,EAAE;AACtC,MAAMC,UAAU,GAAG,IAAIC,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAC5F,MAAMC,SAAS,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC;AAE5D,MAAMC,aAAa,GAAIC,IAAkB,IAAyB;EAChE,IAAIA,IAAI,CAACC,IAAI,KAAK,MAAM,EAAE;IACxB,OAAOD,IAAI,CAACE,KAAK,IAAI,EAAE;EACzB;EACA,IAAIF,IAAI,CAACC,IAAI,KAAK,SAAS,IAAI,CAACL,UAAU,CAACO,GAAG,CAACH,IAAI,CAACI,OAAO,IAAI,EAAE,CAAC,EAAE;IAClE,OAAOC,SAAS;EAClB;EACA,MAAMC,KAAK,GAAGN,IAAI,CAACO,QAAQ,EAAEC,GAAG,CAACT,aAAa,CAAC,IAAI,EAAE;EACrD,OAAOO,KAAK,CAACG,IAAI,CAAEC,IAAI,IAAKA,IAAI,KAAKL,SAAS,CAAC,GAAGA,SAAS,GAAGC,KAAK,CAACK,IAAI,CAAC,EAAE,CAAC;AAC9E,CAAC;AAED,MAAMC,aAAa,GAAIC,SAAkB,IAAe;EACtD,IAAIC,KAAK,CAACC,OAAO,CAACF,SAAS,CAAC,EAAE;IAC5B,OAAOA,SAAS;EAClB;EACA,OAAO,OAAOA,SAAS,KAAK,QAAQ,GAAGA,SAAS,CAACG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;AACpE,CAAC;;AAED;AACA,MAAMC,aAAa,GAAIC,IAAkB,IAAW;EAClD,MAAMZ,KAAK,GAAGY,IAAI,CAACX,QAAQ,EAAEC,GAAG,CAACT,aAAa,CAAC,IAAI,EAAE;EACrD,IAAIO,KAAK,CAACG,IAAI,CAAEC,IAAI,IAAKA,IAAI,KAAKL,SAAS,CAAC,EAAE;IAC5C;EACF;EACA,MAAMc,IAAI,GAAGb,KAAK,CAACK,IAAI,CAAC,EAAE,CAAC,CAACS,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAACC,IAAI,CAAC,CAAC;EACvD,IAAI,CAACF,IAAI,IAAIA,IAAI,CAACG,MAAM,GAAG3B,2BAA2B,EAAE;IACtD;EACF;EACA,MAAMkB,SAAS,GAAG,CAAC,GAAG,IAAIhB,GAAG,CAAC,CAAC,GAAGe,aAAa,CAACM,IAAI,CAACK,UAAU,EAAEV,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;EAChGK,IAAI,CAACK,UAAU,GAAG;IAAE,GAAGL,IAAI,CAACK,UAAU;IAAEV;EAAU,CAAC;AACrD,CAAC;AAED,MAAMW,UAAU,GAAIxB,IAAkB,IACnCA,IAAI,CAACC,IAAI,KAAK,MAAM,IAAIP,sBAAsB,CAACM,IAAI,CAACE,KAAK,IAAI,EAAE,CAAC,IAC7DF,IAAI,CAACC,IAAI,KAAK,SAAS,IAAIH,SAAS,CAAC2B,QAAQ,CAACzB,IAAI,CAACI,OAAO,IAAI,EAAE,CAAE,IACnEsB,OAAO,CAAC1B,IAAI,CAACO,QAAQ,EAAEE,IAAI,CAACe,UAAU,CAAC,CAAC;AAE7C,MAAMG,MAAM,GAAI3B,IAAkB,IAAcA,IAAI,CAACI,OAAO,KAAK,IAAI,IAAIJ,IAAI,CAACI,OAAO,KAAK,IAAI;AAE9F,MAAMwB,QAAQ,GAAI5B,IAAkB,IAAsB2B,MAAM,CAAC3B,IAAI,CAAC,GAAG,CAACA,IAAI,CAAC,GAAGA,IAAI,CAACO,QAAQ,EAAEsB,OAAO,CAACD,QAAQ,CAAC,IAAI,EAAG;;AAEzH;AACA,OAAO,MAAME,kBAAkB,GAAGA,CAAA,KAA2B;EAC3D,MAAMC,SAAS,GAAIC,MAAoB,IAAW;IAChD,IAAIL,MAAM,CAACK,MAAM,CAAC,EAAE;MAClBf,aAAa,CAACe,MAAM,CAAC;IACvB;IACA,IAAI,CAACA,MAAM,CAACzB,QAAQ,EAAE;MACpB;IACF;IACAyB,MAAM,CAACzB,QAAQ,GAAGyB,MAAM,CAACzB,QAAQ,CAAC0B,MAAM,CAAEjC,IAAI,IAAK;MACjD,IAAIA,IAAI,CAACI,OAAO,KAAK,OAAO,IAAI,CAACwB,QAAQ,CAAC5B,IAAI,CAAC,CAACS,IAAI,CAACe,UAAU,CAAC,EAAE;QAChE,OAAO,KAAK;MACd;MACA,IAAIQ,MAAM,CAAC5B,OAAO,KAAK,OAAO,IAAIJ,IAAI,CAACI,OAAO,KAAK,OAAO,IAAI,CAACwB,QAAQ,CAAC5B,IAAI,CAAC,CAACS,IAAI,CAACe,UAAU,CAAC,EAAE;QAC9F,OAAO,KAAK;MACd;MACAO,SAAS,CAAC/B,IAAI,CAAC;MACf,OAAO,IAAI;IACb,CAAC,CAAC;EACJ,CAAC;EACD,OAAO+B,SAAS;AAClB,CAAC","ignoreList":[]}
|