@apollohg/react-native-rich-text-editor 2.0.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/LICENSE +160 -0
- package/README.md +259 -0
- package/RUST-STANDARD-LIBRARY-NOTICES.html +8266 -0
- package/ReactNativeProseEditor.podspec +59 -0
- package/THIRD_PARTY_NOTICES.md +31155 -0
- package/android/build.gradle +188 -0
- package/android/consumer-rules.pro +18 -0
- package/android/expo/build.gradle +17 -0
- package/android/src/debug/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +7 -0
- package/android/src/main/assets/editor-icons/MaterialIcons.json +2236 -0
- package/android/src/main/assets/editor-icons/MaterialIcons.ttf +0 -0
- package/android/src/main/java/com/apollohg/editor/AndroidApiCompat.kt +19 -0
- package/android/src/main/java/com/apollohg/editor/AndroidCollaborationTransport.kt +860 -0
- package/android/src/main/java/com/apollohg/editor/CaretGeometry.kt +91 -0
- package/android/src/main/java/com/apollohg/editor/CodeHighlighting.kt +141 -0
- package/android/src/main/java/com/apollohg/editor/DecodedBitmapBudget.kt +250 -0
- package/android/src/main/java/com/apollohg/editor/EditorAddons.kt +133 -0
- package/android/src/main/java/com/apollohg/editor/EditorBlockSpacing.kt +51 -0
- package/android/src/main/java/com/apollohg/editor/EditorBoxDrawable.kt +16 -0
- package/android/src/main/java/com/apollohg/editor/EditorBoxDrawing.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/EditorCheckboxSpan.kt +87 -0
- package/android/src/main/java/com/apollohg/editor/EditorCodeHighlighting.kt +120 -0
- package/android/src/main/java/com/apollohg/editor/EditorDecorationLayer.java +18 -0
- package/android/src/main/java/com/apollohg/editor/EditorDocumentLayout.kt +626 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditText.kt +1042 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextAnnotations.kt +191 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextCaret.kt +100 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextClipboard.kt +101 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextComposition.kt +220 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextConfiguration.kt +316 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextCorrection.kt +303 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDeferredUpdates.kt +327 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDeletion.kt +258 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDiagnostics.kt +83 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDragDrop.kt +67 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextExternalComposition.kt +357 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextHardwareInput.kt +277 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextImages.kt +280 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputLifecycle.kt +183 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputPreparation.kt +79 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputTraits.kt +384 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextLayout.kt +100 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextNativeMutation.kt +243 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextPlaceholder.kt +154 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRenderPatch.kt +347 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRendering.kt +313 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRustCommands.kt +281 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextSelection.kt +352 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextState.kt +113 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextTaskMarkers.kt +92 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextTextCommit.kt +327 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextToolbar.kt +84 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextUpdates.kt +245 -0
- package/android/src/main/java/com/apollohg/editor/EditorGlyphHeightCursorDrawable.kt +42 -0
- package/android/src/main/java/com/apollohg/editor/EditorHeightBehavior.kt +13 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputConnection.kt +923 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCoordinates.kt +191 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCorrection.kt +107 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCursorGeometry.kt +128 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputSnapshots.kt +134 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputSurroundingDeletion.kt +321 -0
- package/android/src/main/java/com/apollohg/editor/EditorKeyboardToolbarView.kt +851 -0
- package/android/src/main/java/com/apollohg/editor/EditorMentionStyle.kt +192 -0
- package/android/src/main/java/com/apollohg/editor/EditorReconciliationWatcher.kt +46 -0
- package/android/src/main/java/com/apollohg/editor/EditorStyleSheet.kt +303 -0
- package/android/src/main/java/com/apollohg/editor/EditorStyleSheetSpans.kt +253 -0
- package/android/src/main/java/com/apollohg/editor/EditorSurfaceInputConnection.kt +67 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextDecorationDrawing.kt +143 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurface.kt +712 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceDragDrop.kt +94 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceInteraction.kt +708 -0
- package/android/src/main/java/com/apollohg/editor/EditorTheme.kt +650 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Adapter.kt +912 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterMutations.kt +402 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterRendering.kt +123 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterSelection.kt +203 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Backend.kt +120 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Driver.kt +87 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Registry.kt +97 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2RenderValidation.kt +409 -0
- package/android/src/main/java/com/apollohg/editor/ExpoAutoGrowStyleSizePublisher.kt +34 -0
- package/android/src/main/java/com/apollohg/editor/ImageResizeOverlayView.kt +266 -0
- package/android/src/main/java/com/apollohg/editor/ImeTextCoordinateMapper.kt +102 -0
- package/android/src/main/java/com/apollohg/editor/KeyboardToolbarImeAnimationController.kt +101 -0
- package/android/src/main/java/com/apollohg/editor/MentionSuggestionChipView.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/NativeCollaborationTransportRegistry.kt +493 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoView.kt +813 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewAtoms.kt +68 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewBinding.kt +126 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewDiagnostics.kt +208 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewErrors.kt +146 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewEvents.kt +150 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewExternalComposition.kt +39 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewFocus.kt +176 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewLifecycle.kt +302 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewMentions.kt +259 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewNativeActions.kt +179 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewOutsideTap.kt +214 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPendingUpdates.kt +376 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewProperties.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPropertyRetries.kt +197 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewToolbar.kt +285 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewTypes.kt +28 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewUpdates.kt +271 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorModule.kt +687 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorOutsideTapDispatcher.kt +380 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorV2Numbers.kt +45 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorViewRegistry.kt +372 -0
- package/android/src/main/java/com/apollohg/editor/NativeImagePipeline.kt +22 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbar.kt +193 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbarIcons.kt +177 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbarItem.kt +274 -0
- package/android/src/main/java/com/apollohg/editor/OkHttpCollaborationSocket.kt +102 -0
- package/android/src/main/java/com/apollohg/editor/OrderedListMarkerFormatter.kt +130 -0
- package/android/src/main/java/com/apollohg/editor/PointerTransparentView.java +18 -0
- package/android/src/main/java/com/apollohg/editor/PositionBridge.kt +128 -0
- package/android/src/main/java/com/apollohg/editor/ProseViewerView.kt +854 -0
- package/android/src/main/java/com/apollohg/editor/RemoteSelectionOverlayView.kt +314 -0
- package/android/src/main/java/com/apollohg/editor/RenderBlockSpans.kt +314 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridge.kt +224 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeBlockStyles.kt +407 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeElements.kt +544 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeInlineAndAtoms.kt +631 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeParagraphs.kt +215 -0
- package/android/src/main/java/com/apollohg/editor/RenderImageDecoder.kt +748 -0
- package/android/src/main/java/com/apollohg/editor/RenderImageLoader.kt +900 -0
- package/android/src/main/java/com/apollohg/editor/RenderLayoutConstants.kt +117 -0
- package/android/src/main/java/com/apollohg/editor/RenderMediaSpans.kt +337 -0
- package/android/src/main/java/com/apollohg/editor/RenderParagraphSpans.kt +182 -0
- package/android/src/main/java/com/apollohg/editor/RichTextEditorView.kt +951 -0
- package/android/src/main/java/com/apollohg/editor/SharedNativeImagePipeline.kt +78 -0
- package/android/src/main/java/com/apollohg/editor/UniffiEditorV2Backend.kt +261 -0
- package/android/src/main/java/com/apollohg/editor/viewer/AndroidProseLayoutEngine.kt +1656 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FabricAttachmentSidecars.kt +80 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FabricLeaseHandleBridge.kt +59 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FallbackSelectionGeometry.kt +450 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseDrawingView.kt +678 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseInstrumentation.kt +608 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayout.kt +186 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutCache.kt +393 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutRegistry.kt +828 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseTheme.kt +316 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerManager.kt +900 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerPackage.kt +16 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedViewerAtoms.kt +89 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerCodeHighlighting.kt +91 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerDocument.kt +453 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerFontEnvironment.kt +282 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerImagePipeline.kt +460 -0
- package/android/src/main/jni/CMakeLists.txt +85 -0
- package/android/src/main/jni/PreparedProseViewerMeasurementsManager.cpp +334 -0
- package/android/src/main/jni/ReactNativeProseEditorSpec.h +17 -0
- package/android/src/main/jni/reactnativeproseeditor.h +6 -0
- package/android/src/main/res/values/attrs.xml +6 -0
- package/android/src/release/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +9 -0
- package/app.plugin.js +62 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseMeasurementsManager.h +62 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerComponentDescriptor.h +30 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.cpp +192 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.h +46 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerState.h +145 -0
- package/dist/AtomHost.d.ts +17 -0
- package/dist/AtomHost.js +135 -0
- package/dist/DefaultAtomChip.d.ts +2 -0
- package/dist/DefaultAtomChip.js +22 -0
- package/dist/EditorAddon.d.ts +32 -0
- package/dist/EditorAddon.js +29 -0
- package/dist/EditorAddonNormalization.d.ts +6 -0
- package/dist/EditorAddonNormalization.js +48 -0
- package/dist/EditorMentionThemeNormalization.d.ts +8 -0
- package/dist/EditorMentionThemeNormalization.js +22 -0
- package/dist/EditorMentionThemeValidation.d.ts +12 -0
- package/dist/EditorMentionThemeValidation.js +95 -0
- package/dist/EditorStyleSheet.d.ts +4 -0
- package/dist/EditorStyleSheet.js +10 -0
- package/dist/EditorStyleSheetNormalization.d.ts +3 -0
- package/dist/EditorStyleSheetNormalization.js +226 -0
- package/dist/EditorStyleSheetTypes.d.ts +151 -0
- package/dist/EditorStyleSheetTypes.js +2 -0
- package/dist/EditorTheme.d.ts +117 -0
- package/dist/EditorTheme.js +41 -0
- package/dist/EditorToolbar.d.ts +4 -0
- package/dist/EditorToolbar.js +17 -0
- package/dist/EditorToolbarComponent.d.ts +13 -0
- package/dist/EditorToolbarComponent.js +24 -0
- package/dist/EditorToolbarItems.d.ts +9 -0
- package/dist/EditorToolbarItems.js +58 -0
- package/dist/EditorToolbarRegistry.d.ts +59 -0
- package/dist/EditorToolbarRegistry.js +175 -0
- package/dist/EditorToolbarTypes.d.ts +273 -0
- package/dist/EditorToolbarTypes.js +2 -0
- package/dist/EditorToolbarVisuals.d.ts +154 -0
- package/dist/EditorToolbarVisuals.js +228 -0
- package/dist/EditorUpdateRevision.d.ts +8 -0
- package/dist/EditorUpdateRevision.js +22 -0
- package/dist/ExternalTextComposition.d.ts +45 -0
- package/dist/ExternalTextComposition.js +537 -0
- package/dist/ImageLoadingPolicy.d.ts +54 -0
- package/dist/ImageLoadingPolicy.js +60 -0
- package/dist/NativeEditorBoundaryError.d.ts +111 -0
- package/dist/NativeEditorBoundaryError.js +268 -0
- package/dist/NativeEditorBridge.d.ts +9 -0
- package/dist/NativeEditorBridge.js +37 -0
- package/dist/NativeEditorCollaborationTransport.d.ts +154 -0
- package/dist/NativeEditorCollaborationTransport.js +275 -0
- package/dist/NativeEditorCreateConfig.d.ts +16 -0
- package/dist/NativeEditorCreateConfig.js +249 -0
- package/dist/NativeEditorCreateJson.d.ts +76 -0
- package/dist/NativeEditorCreateJson.js +474 -0
- package/dist/NativeEditorCreateValidation.d.ts +32 -0
- package/dist/NativeEditorCreateValidation.js +150 -0
- package/dist/NativeEditorDocumentBridge.d.ts +72 -0
- package/dist/NativeEditorDocumentBridge.js +305 -0
- package/dist/NativeEditorDocumentHandle.d.ts +70 -0
- package/dist/NativeEditorDocumentHandle.js +89 -0
- package/dist/NativeEditorLocalAwareness.d.ts +34 -0
- package/dist/NativeEditorLocalAwareness.js +153 -0
- package/dist/NativeEditorNativeModule.d.ts +48 -0
- package/dist/NativeEditorNativeModule.js +34 -0
- package/dist/NativeEditorRenderNormalization.d.ts +22 -0
- package/dist/NativeEditorRenderNormalization.js +274 -0
- package/dist/NativeEditorResultNormalization.d.ts +108 -0
- package/dist/NativeEditorResultNormalization.js +400 -0
- package/dist/NativeEditorTypes.d.ts +318 -0
- package/dist/NativeEditorTypes.js +15 -0
- package/dist/NativeEditorV2Decimal.d.ts +5 -0
- package/dist/NativeEditorV2Decimal.js +18 -0
- package/dist/NativeProseViewer.d.ts +122 -0
- package/dist/NativeProseViewer.js +130 -0
- package/dist/NativeRichTextEditor.d.ts +3 -0
- package/dist/NativeRichTextEditor.js +6 -0
- package/dist/ResourceLimits.d.ts +100 -0
- package/dist/ResourceLimits.js +80 -0
- package/dist/RichTextEditor.d.ts +4 -0
- package/dist/RichTextEditor.js +25 -0
- package/dist/RichTextEditorNativeTypes.d.ts +122 -0
- package/dist/RichTextEditorNativeTypes.js +2 -0
- package/dist/RichTextEditorNativeView.d.ts +12 -0
- package/dist/RichTextEditorNativeView.js +15 -0
- package/dist/RichTextEditorSerialization.d.ts +53 -0
- package/dist/RichTextEditorSerialization.js +283 -0
- package/dist/RichTextEditorTypes.d.ts +281 -0
- package/dist/RichTextEditorTypes.js +2 -0
- package/dist/ViewerConfiguration.d.ts +22 -0
- package/dist/ViewerConfiguration.js +6 -0
- package/dist/YjsCollaboration.d.ts +146 -0
- package/dist/YjsCollaboration.js +496 -0
- package/dist/addons.d.ts +193 -0
- package/dist/addons.js +122 -0
- package/dist/atomConstants.d.ts +3 -0
- package/dist/atomConstants.js +6 -0
- package/dist/atomInstances.d.ts +35 -0
- package/dist/atomInstances.js +79 -0
- package/dist/atomPolicy.d.ts +4 -0
- package/dist/atomPolicy.js +47 -0
- package/dist/atomUpdates.d.ts +2 -0
- package/dist/atomUpdates.js +38 -0
- package/dist/atoms.d.ts +92 -0
- package/dist/atoms.js +222 -0
- package/dist/attributeValidation.d.ts +4 -0
- package/dist/attributeValidation.js +97 -0
- package/dist/contentExpression.d.ts +6 -0
- package/dist/contentExpression.js +335 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +78 -0
- package/dist/listMarkers.d.ts +15 -0
- package/dist/listMarkers.js +21 -0
- package/dist/schemaDefinition.d.ts +143 -0
- package/dist/schemaDefinition.js +206 -0
- package/dist/schemaDocument.d.ts +17 -0
- package/dist/schemaDocument.js +69 -0
- package/dist/schemaDocumentConstruction.d.ts +5 -0
- package/dist/schemaDocumentConstruction.js +125 -0
- package/dist/schemaNormalization.d.ts +29 -0
- package/dist/schemaNormalization.js +313 -0
- package/dist/schemaPresets.d.ts +68 -0
- package/dist/schemaPresets.js +198 -0
- package/dist/schemaResolution.d.ts +9 -0
- package/dist/schemaResolution.js +211 -0
- package/dist/schemas.d.ts +5 -0
- package/dist/schemas.js +28 -0
- package/dist/specs/PreparedProseViewerNativeComponent.d.ts +37 -0
- package/dist/specs/PreparedProseViewerNativeComponent.js +6 -0
- package/dist/useEditorToolbarInteractions.d.ts +12 -0
- package/dist/useEditorToolbarInteractions.js +218 -0
- package/dist/useEditorToolbarItems.d.ts +8 -0
- package/dist/useEditorToolbarItems.js +280 -0
- package/dist/useEditorToolbarPresentation.d.ts +4 -0
- package/dist/useEditorToolbarPresentation.js +203 -0
- package/dist/useEditorToolbarState.d.ts +63 -0
- package/dist/useEditorToolbarState.js +108 -0
- package/dist/useFocusPreservingFrames.d.ts +17 -0
- package/dist/useFocusPreservingFrames.js +108 -0
- package/dist/useNativeEditor.d.ts +66 -0
- package/dist/useNativeEditor.js +370 -0
- package/dist/useRichTextEditorCommands.d.ts +21 -0
- package/dist/useRichTextEditorCommands.js +299 -0
- package/dist/useRichTextEditorEvents.d.ts +18 -0
- package/dist/useRichTextEditorEvents.js +216 -0
- package/dist/useRichTextEditorMentions.d.ts +11 -0
- package/dist/useRichTextEditorMentions.js +316 -0
- package/dist/useRichTextEditorPresentation.d.ts +5 -0
- package/dist/useRichTextEditorPresentation.js +178 -0
- package/dist/useRichTextEditorState.d.ts +180 -0
- package/dist/useRichTextEditorState.js +405 -0
- package/dist/useRichTextEditorUpdates.d.ts +10 -0
- package/dist/useRichTextEditorUpdates.js +308 -0
- package/dist/useViewerAtoms.d.ts +38 -0
- package/dist/useViewerAtoms.js +288 -0
- package/expo-module.config.json +13 -0
- package/ios/EditorAddons.swift +354 -0
- package/ios/EditorCodeHighlighting.swift +184 -0
- package/ios/EditorCore.xcframework/Info.plist +44 -0
- package/ios/EditorCore.xcframework/ios-arm64/libeditor_core.a +0 -0
- package/ios/EditorCore.xcframework/ios-arm64_x86_64-simulator/libeditor_core.a +0 -0
- package/ios/EditorInteractionOverlays.swift +697 -0
- package/ios/EditorLayoutManager.swift +971 -0
- package/ios/EditorNodeTypes.swift +37 -0
- package/ios/EditorStyleSheet.swift +461 -0
- package/ios/EditorTextView+AttributedPatch.swift +305 -0
- package/ios/EditorTextView+Binding.swift +61 -0
- package/ios/EditorTextView+Caret.swift +333 -0
- package/ios/EditorTextView+Commands.swift +203 -0
- package/ios/EditorTextView+Delegate.swift +65 -0
- package/ios/EditorTextView+Diagnostics.swift +225 -0
- package/ios/EditorTextView+DragDrop.swift +290 -0
- package/ios/EditorTextView+ExternalComposition.swift +364 -0
- package/ios/EditorTextView+Images.swift +354 -0
- package/ios/EditorTextView+InputTraits.swift +200 -0
- package/ios/EditorTextView+KeyboardInput.swift +318 -0
- package/ios/EditorTextView+Layout.swift +245 -0
- package/ios/EditorTextView+MarkedText.swift +267 -0
- package/ios/EditorTextView+NativeInputLifecycle.swift +372 -0
- package/ios/EditorTextView+NativeMutation.swift +471 -0
- package/ios/EditorTextView+Reconciliation.swift +97 -0
- package/ios/EditorTextView+RenderPatch.swift +573 -0
- package/ios/EditorTextView+Rendering.swift +539 -0
- package/ios/EditorTextView+Selection.swift +542 -0
- package/ios/EditorTextView.swift +953 -0
- package/ios/EditorTheme.swift +626 -0
- package/ios/EditorV2Adapter+Commands.swift +204 -0
- package/ios/EditorV2Adapter+Envelope.swift +238 -0
- package/ios/EditorV2Adapter+Mutation.swift +392 -0
- package/ios/EditorV2Adapter+Registry.swift +185 -0
- package/ios/EditorV2Adapter+RenderState.swift +360 -0
- package/ios/EditorV2Adapter+RenderValidation.swift +420 -0
- package/ios/EditorV2Adapter+Selection.swift +329 -0
- package/ios/EditorV2Adapter+TextCommands.swift +430 -0
- package/ios/EditorV2Adapter.swift +376 -0
- package/ios/EditorV2Shadow.swift +353 -0
- package/ios/Generated_editor_core.swift +2378 -0
- package/ios/NativeCodeHighlighting.swift +159 -0
- package/ios/NativeCollaborationSocket.swift +144 -0
- package/ios/NativeCollaborationTransport+Protocol.swift +258 -0
- package/ios/NativeCollaborationTransport+Socket.swift +379 -0
- package/ios/NativeCollaborationTransport+Validation.swift +103 -0
- package/ios/NativeCollaborationTransport.swift +322 -0
- package/ios/NativeCollaborationTransportRegistry.swift +521 -0
- package/ios/NativeEditorExpoView+AccessoryRetry.swift +219 -0
- package/ios/NativeEditorExpoView+Binding.swift +268 -0
- package/ios/NativeEditorExpoView+Diagnostics.swift +66 -0
- package/ios/NativeEditorExpoView+Events.swift +131 -0
- package/ios/NativeEditorExpoView+Focus.swift +169 -0
- package/ios/NativeEditorExpoView+MentionRetry.swift +288 -0
- package/ios/NativeEditorExpoView+Mentions.swift +288 -0
- package/ios/NativeEditorExpoView+Properties.swift +300 -0
- package/ios/NativeEditorExpoView+Toolbar.swift +86 -0
- package/ios/NativeEditorExpoView+Updates.swift +312 -0
- package/ios/NativeEditorExpoView.swift +349 -0
- package/ios/NativeEditorModule.swift +856 -0
- package/ios/NativeEditorViewRegistry.swift +226 -0
- package/ios/NativeToolbar+ButtonStyle.swift +214 -0
- package/ios/NativeToolbar+Buttons.swift +228 -0
- package/ios/NativeToolbar+Diagnostics.swift +114 -0
- package/ios/NativeToolbar+Menu.swift +101 -0
- package/ios/NativeToolbar+Models.swift +519 -0
- package/ios/NativeToolbar+Placeholder.swift +39 -0
- package/ios/NativeToolbar.swift +612 -0
- package/ios/OrderedListMarkerFormatter.swift +103 -0
- package/ios/PositionBridge.swift +596 -0
- package/ios/ProseViewerView.swift +462 -0
- package/ios/RenderBridge+Atoms.swift +288 -0
- package/ios/RenderBridge+Attachments.swift +246 -0
- package/ios/RenderBridge+BlockBoundaries.swift +313 -0
- package/ios/RenderBridge+Style.swift +343 -0
- package/ios/RenderBridge.swift +704 -0
- package/ios/RichTextEditorView.swift +930 -0
- package/ios/SharedNativeImagePipeline+Cache.swift +189 -0
- package/ios/SharedNativeImagePipeline+Transport.swift +328 -0
- package/ios/SharedNativeImagePipeline.swift +533 -0
- package/ios/Viewer/CoreTextProseLayoutEngine+AttributedText.swift +436 -0
- package/ios/Viewer/CoreTextProseLayoutEngine+Models.swift +322 -0
- package/ios/Viewer/CoreTextProseLayoutEngine.swift +635 -0
- package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.h +4 -0
- package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.mm +767 -0
- package/ios/Viewer/Fabric/PreparedProseMeasurementsManager.mm +118 -0
- package/ios/Viewer/NativeSVGImageDecoder.h +9 -0
- package/ios/Viewer/NativeSVGImageDecoder.mm +106 -0
- package/ios/Viewer/NativeSVGPreflight.h +11 -0
- package/ios/Viewer/NativeSVGPreflight.mm +219 -0
- package/ios/Viewer/PreparedProseDrawingView.swift +639 -0
- package/ios/Viewer/PreparedProseInstrumentation.swift +387 -0
- package/ios/Viewer/PreparedProseLayout.swift +326 -0
- package/ios/Viewer/PreparedProseLayoutCache.swift +766 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+Artifacts.swift +377 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+Fabric.swift +582 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+FabricOwnership.swift +128 -0
- package/ios/Viewer/PreparedProseLayoutRegistry.swift +381 -0
- package/ios/Viewer/ViewerDocument.swift +575 -0
- package/ios/Viewer/ViewerFontEnvironment.swift +283 -0
- package/ios/Viewer/ViewerImagePipeline.swift +478 -0
- package/ios/editor_coreFFI/editor_coreFFI.h +1023 -0
- package/ios/editor_coreFFI/module.modulemap +7 -0
- package/package.json +151 -0
- package/react-native.config.js +17 -0
- package/rust/android/arm64-v8a/libeditor_core.so +0 -0
- package/rust/android/armeabi-v7a/libeditor_core.so +0 -0
- package/rust/android/x86/libeditor_core.so +0 -0
- package/rust/android/x86_64/libeditor_core.so +0 -0
- package/rust/bindings/kotlin/uniffi/editor_core/editor_core.kt +3146 -0
- package/src/AtomHost.tsx +180 -0
- package/src/DefaultAtomChip.tsx +27 -0
- package/src/EditorAddon.ts +65 -0
- package/src/EditorAddonNormalization.ts +49 -0
- package/src/EditorMentionThemeNormalization.ts +25 -0
- package/src/EditorMentionThemeValidation.ts +133 -0
- package/src/EditorStyleSheet.ts +9 -0
- package/src/EditorStyleSheetNormalization.ts +219 -0
- package/src/EditorStyleSheetTypes.ts +189 -0
- package/src/EditorTheme.ts +196 -0
- package/src/EditorToolbar.tsx +31 -0
- package/src/EditorToolbarComponent.tsx +23 -0
- package/src/EditorToolbarItems.tsx +64 -0
- package/src/EditorToolbarRegistry.tsx +254 -0
- package/src/EditorToolbarTypes.tsx +322 -0
- package/src/EditorToolbarVisuals.tsx +270 -0
- package/src/EditorUpdateRevision.ts +26 -0
- package/src/ExternalTextComposition.ts +658 -0
- package/src/ImageLoadingPolicy.ts +125 -0
- package/src/NativeEditorBoundaryError.ts +345 -0
- package/src/NativeEditorBridge.ts +93 -0
- package/src/NativeEditorCollaborationTransport.ts +493 -0
- package/src/NativeEditorCreateConfig.ts +326 -0
- package/src/NativeEditorCreateJson.ts +579 -0
- package/src/NativeEditorCreateValidation.ts +178 -0
- package/src/NativeEditorDocumentBridge.ts +485 -0
- package/src/NativeEditorDocumentHandle.ts +168 -0
- package/src/NativeEditorLocalAwareness.ts +168 -0
- package/src/NativeEditorNativeModule.ts +97 -0
- package/src/NativeEditorRenderNormalization.ts +320 -0
- package/src/NativeEditorResultNormalization.ts +469 -0
- package/src/NativeEditorTypes.ts +366 -0
- package/src/NativeEditorV2Decimal.ts +13 -0
- package/src/NativeProseViewer.tsx +356 -0
- package/src/NativeRichTextEditor.tsx +33 -0
- package/src/ResourceLimits.ts +187 -0
- package/src/RichTextEditor.tsx +27 -0
- package/src/RichTextEditorNativeTypes.tsx +144 -0
- package/src/RichTextEditorNativeView.tsx +21 -0
- package/src/RichTextEditorSerialization.tsx +381 -0
- package/src/RichTextEditorTypes.tsx +327 -0
- package/src/ViewerConfiguration.ts +23 -0
- package/src/YjsCollaboration.ts +692 -0
- package/src/addons.ts +311 -0
- package/src/atomConstants.ts +3 -0
- package/src/atomInstances.ts +123 -0
- package/src/atomPolicy.ts +47 -0
- package/src/atomUpdates.ts +52 -0
- package/src/atoms.ts +379 -0
- package/src/attributeValidation.ts +116 -0
- package/src/contentExpression.ts +338 -0
- package/src/index.ts +295 -0
- package/src/listMarkers.ts +18 -0
- package/src/schemaDefinition.ts +395 -0
- package/src/schemaDocument.ts +92 -0
- package/src/schemaDocumentConstruction.ts +148 -0
- package/src/schemaNormalization.ts +367 -0
- package/src/schemaPresets.ts +250 -0
- package/src/schemaResolution.ts +242 -0
- package/src/schemas.ts +43 -0
- package/src/specs/PreparedProseViewerNativeComponent.ts +40 -0
- package/src/useEditorToolbarInteractions.tsx +329 -0
- package/src/useEditorToolbarItems.tsx +390 -0
- package/src/useEditorToolbarPresentation.tsx +483 -0
- package/src/useEditorToolbarState.tsx +172 -0
- package/src/useFocusPreservingFrames.ts +171 -0
- package/src/useNativeEditor.ts +534 -0
- package/src/useRichTextEditorCommands.tsx +478 -0
- package/src/useRichTextEditorEvents.tsx +342 -0
- package/src/useRichTextEditorMentions.tsx +441 -0
- package/src/useRichTextEditorPresentation.tsx +563 -0
- package/src/useRichTextEditorState.tsx +620 -0
- package/src/useRichTextEditorUpdates.tsx +403 -0
- package/src/useViewerAtoms.tsx +427 -0
package/src/addons.ts
ADDED
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { normalizeEditorAddons, type NormalizedEditorAddons } from './EditorAddonNormalization';
|
|
2
|
+
import type { EditorAddons, CodeHighlightingAddonOptions } from './EditorAddon';
|
|
3
|
+
export { normalizeEditorAddons } from './EditorAddonNormalization';
|
|
4
|
+
export { createMentionsAddon, type EditorAddons } from './EditorAddon';
|
|
5
|
+
import type { EditorMentionTheme } from './EditorTheme';
|
|
6
|
+
import {
|
|
7
|
+
normalizeEditorMentionTheme,
|
|
8
|
+
type SerializedEditorMentionTheme,
|
|
9
|
+
} from './EditorMentionThemeNormalization';
|
|
10
|
+
import type { DocumentJSON, ReadonlyActiveState } from './NativeEditorBridge';
|
|
11
|
+
import {
|
|
12
|
+
buildDocumentFragmentJson,
|
|
13
|
+
type ResolvedDocumentSchema,
|
|
14
|
+
type SchemaDefinition,
|
|
15
|
+
type NodeSpec,
|
|
16
|
+
} from './schemas';
|
|
17
|
+
|
|
18
|
+
/** One row offered in the mention suggestion list. */
|
|
19
|
+
export interface MentionSuggestion {
|
|
20
|
+
/** Identity of this suggestion. Must be unique within the offered list. */
|
|
21
|
+
key: string;
|
|
22
|
+
/** Primary text shown in the suggestion row. */
|
|
23
|
+
title: string;
|
|
24
|
+
/** Secondary text shown in the suggestion row. */
|
|
25
|
+
subtitle?: string;
|
|
26
|
+
/** Text rendered in the document once inserted. Defaults to `title`. */
|
|
27
|
+
label?: string;
|
|
28
|
+
/** Extra attributes stored on the inserted mention node, e.g. a user id. */
|
|
29
|
+
attrs?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** The mention query under the caret changed. */
|
|
33
|
+
export interface MentionQueryChangeEvent {
|
|
34
|
+
/** Text typed after the trigger, without the trigger itself. */
|
|
35
|
+
query: string;
|
|
36
|
+
/** Trigger character that opened this query. */
|
|
37
|
+
trigger: string;
|
|
38
|
+
/** Engine document positions the mention would replace. */
|
|
39
|
+
range: {
|
|
40
|
+
anchor: number;
|
|
41
|
+
head: number;
|
|
42
|
+
};
|
|
43
|
+
/** False once the query closed — supply an empty suggestion list. */
|
|
44
|
+
isActive: boolean;
|
|
45
|
+
/** Engine document revision the query was computed against. */
|
|
46
|
+
documentVersion?: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** A suggestion was inserted into the document. */
|
|
50
|
+
export interface MentionSelectEvent {
|
|
51
|
+
trigger: string;
|
|
52
|
+
suggestion: MentionSuggestion;
|
|
53
|
+
/** The attributes actually written onto the mention node. */
|
|
54
|
+
attrs: Record<string, unknown>;
|
|
55
|
+
documentVersion?: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* A suggestion is about to be inserted. Passed to
|
|
60
|
+
* {@link MentionsAddonConfig.resolveSelectionAttrs} and
|
|
61
|
+
* {@link MentionsAddonConfig.resolveTheme} so the host can decide the node's
|
|
62
|
+
* attributes and styling from live document context.
|
|
63
|
+
*/
|
|
64
|
+
export interface MentionSelectionAttrsEvent {
|
|
65
|
+
trigger: string;
|
|
66
|
+
suggestion: MentionSuggestion;
|
|
67
|
+
/** Attributes resolved so far — the suggestion's own, plus `label` and `mentionSuggestionChar`. */
|
|
68
|
+
attrs: Record<string, unknown>;
|
|
69
|
+
/** Mark attributes active at the insertion point. */
|
|
70
|
+
markAttrs: ReadonlyActiveState['markAttrs'];
|
|
71
|
+
/** Engine document positions the mention will replace. */
|
|
72
|
+
range: {
|
|
73
|
+
anchor: number;
|
|
74
|
+
head: number;
|
|
75
|
+
};
|
|
76
|
+
documentVersion?: string;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Payload of {@link MentionsAddonConfig.resolveTheme}, carrying the attributes
|
|
80
|
+
* `resolveSelectionAttrs` already resolved. */
|
|
81
|
+
export type MentionThemeResolveEvent = MentionSelectionAttrsEvent;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Mentions for `RichTextEditor`. The schema belongs to the document
|
|
85
|
+
* handle, so create the handle with {@link withMentionsSchema} applied to
|
|
86
|
+
* your schema — this config alone does not add the `mention` node.
|
|
87
|
+
* (`RichTextViewer` adds it for you.)
|
|
88
|
+
*
|
|
89
|
+
* The host owns the suggestion list: react to `onQueryChange` by filtering
|
|
90
|
+
* your own data, then pass the result back through `suggestions`.
|
|
91
|
+
*/
|
|
92
|
+
export interface MentionsAddonConfig {
|
|
93
|
+
/** Character that opens a mention query. Defaults to `'@'`. */
|
|
94
|
+
trigger?: string;
|
|
95
|
+
/** Rows currently offered for the open query. */
|
|
96
|
+
suggestions?: readonly MentionSuggestion[];
|
|
97
|
+
/** Default mention styling. See {@link EditorMentionTheme}. */
|
|
98
|
+
theme?: EditorMentionTheme;
|
|
99
|
+
/**
|
|
100
|
+
* Extra attributes merged over the suggestion's own, just before
|
|
101
|
+
* insertion. Return `null`/`undefined` to keep them unchanged. Throwing
|
|
102
|
+
* is caught and treated the same way.
|
|
103
|
+
*/
|
|
104
|
+
resolveSelectionAttrs?: (
|
|
105
|
+
event: MentionSelectionAttrsEvent
|
|
106
|
+
) => Record<string, unknown> | null | undefined;
|
|
107
|
+
/**
|
|
108
|
+
* Per-mention styling, stored on the inserted node and used in place of
|
|
109
|
+
* `theme`. Runs after `resolveSelectionAttrs`. A value that is not a
|
|
110
|
+
* valid {@link EditorMentionTheme} is dropped rather than written into
|
|
111
|
+
* the document.
|
|
112
|
+
*/
|
|
113
|
+
resolveTheme?: (event: MentionThemeResolveEvent) => EditorMentionTheme | null | undefined;
|
|
114
|
+
/** Called whenever the open query changes, including when it closes. */
|
|
115
|
+
onQueryChange?: (event: MentionQueryChangeEvent) => void;
|
|
116
|
+
/** Called after a suggestion has been inserted. */
|
|
117
|
+
onSelect?: (event: MentionSelectEvent) => void;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export interface SerializedMentionSuggestion {
|
|
121
|
+
key: string;
|
|
122
|
+
title: string;
|
|
123
|
+
subtitle?: string;
|
|
124
|
+
label: string;
|
|
125
|
+
attrs: Record<string, unknown>;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export interface SerializedMentionsAddonConfig {
|
|
129
|
+
trigger: string;
|
|
130
|
+
theme?: SerializedEditorMentionTheme;
|
|
131
|
+
resolveSelectionAttrs?: boolean;
|
|
132
|
+
resolveTheme?: boolean;
|
|
133
|
+
suggestions: SerializedMentionSuggestion[];
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export interface SerializedEditorAddons {
|
|
137
|
+
mentions?: SerializedMentionsAddonConfig;
|
|
138
|
+
codeHighlighting?: CodeHighlightingAddonOptions;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* The raw addon event the native view emits, before the editor turns it into
|
|
143
|
+
* the typed {@link MentionsAddonConfig} callbacks. Exported for hosts that
|
|
144
|
+
* inspect the native stream directly; ordinary use needs `onQueryChange` and
|
|
145
|
+
* `onSelect` instead.
|
|
146
|
+
*/
|
|
147
|
+
export type EditorAddonEvent =
|
|
148
|
+
| {
|
|
149
|
+
type: 'mentionsQueryChange';
|
|
150
|
+
query: string;
|
|
151
|
+
trigger: string;
|
|
152
|
+
range: {
|
|
153
|
+
anchor: number;
|
|
154
|
+
head: number;
|
|
155
|
+
};
|
|
156
|
+
isActive: boolean;
|
|
157
|
+
documentVersion?: string;
|
|
158
|
+
}
|
|
159
|
+
| {
|
|
160
|
+
type: 'mentionsSelectRequest';
|
|
161
|
+
trigger: string;
|
|
162
|
+
suggestionKey: string;
|
|
163
|
+
attrs: Record<string, unknown>;
|
|
164
|
+
range: {
|
|
165
|
+
anchor: number;
|
|
166
|
+
head: number;
|
|
167
|
+
};
|
|
168
|
+
documentVersion?: string;
|
|
169
|
+
updateJson?: string;
|
|
170
|
+
}
|
|
171
|
+
| {
|
|
172
|
+
type: 'mentionsSelect';
|
|
173
|
+
trigger: string;
|
|
174
|
+
suggestionKey: string;
|
|
175
|
+
attrs: Record<string, unknown>;
|
|
176
|
+
documentVersion?: string;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
/** Node name mentions are stored under in the document. */
|
|
180
|
+
export const MENTION_NODE_NAME = 'mention';
|
|
181
|
+
const DEFAULT_MENTION_TRIGGER = '@';
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* The mention node spec: a void inline node that round-trips arbitrary
|
|
185
|
+
* app-defined attributes. Add it through {@link withMentionsSchema} rather
|
|
186
|
+
* than assembling it by hand.
|
|
187
|
+
*/
|
|
188
|
+
export function mentionNodeSpec(): NodeSpec {
|
|
189
|
+
return {
|
|
190
|
+
name: MENTION_NODE_NAME,
|
|
191
|
+
content: '',
|
|
192
|
+
group: 'inline',
|
|
193
|
+
role: 'inline',
|
|
194
|
+
isVoid: true,
|
|
195
|
+
// Mention nodes round-trip arbitrary app-defined metadata (id, kind,
|
|
196
|
+
// mentionSuggestionChar, mentionTheme, and anything supplied via
|
|
197
|
+
// MentionSuggestion.attrs / resolveSelectionAttrs) that this fixed
|
|
198
|
+
// attrs map cannot enumerate. Opt out of the schema-declared-attrs
|
|
199
|
+
// filter that Rust's set_json ingestion otherwise applies.
|
|
200
|
+
allowUndeclaredAttrs: true,
|
|
201
|
+
attrs: {
|
|
202
|
+
label: { default: null },
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Return `schema` with the mention node added, or `schema` unchanged when it
|
|
209
|
+
* already declares one. Apply it when creating the document handle for an
|
|
210
|
+
* editor that uses mentions.
|
|
211
|
+
*
|
|
212
|
+
* @example
|
|
213
|
+
* ```ts
|
|
214
|
+
* createNativeEditorDocumentHandle({
|
|
215
|
+
* initialization: { type: 'localEmpty' },
|
|
216
|
+
* schema: withMentionsSchema(defaultSchema),
|
|
217
|
+
* });
|
|
218
|
+
* ```
|
|
219
|
+
*/
|
|
220
|
+
export function withMentionsSchema(schema: SchemaDefinition): SchemaDefinition {
|
|
221
|
+
const hasMentionNode = schema.nodes.some((node) => node.name === MENTION_NODE_NAME);
|
|
222
|
+
if (hasMentionNode) {
|
|
223
|
+
return schema;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return {
|
|
227
|
+
...schema,
|
|
228
|
+
nodes: [...schema.nodes, mentionNodeSpec()],
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export function normalizeNativeEditorAddons(
|
|
233
|
+
addons?: NormalizedEditorAddons
|
|
234
|
+
): SerializedEditorAddons | undefined {
|
|
235
|
+
if (!addons?.mentions) {
|
|
236
|
+
return addons?.codeHighlighting ? { codeHighlighting: addons.codeHighlighting } : undefined;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const trigger = addons.mentions.trigger?.trim() || DEFAULT_MENTION_TRIGGER;
|
|
240
|
+
const suggestions = (addons.mentions.suggestions ?? []).map((suggestion) => {
|
|
241
|
+
const label = suggestion.label?.trim() || suggestion.title;
|
|
242
|
+
const attrs = {
|
|
243
|
+
label,
|
|
244
|
+
mentionSuggestionChar: trigger,
|
|
245
|
+
...(suggestion.attrs ?? {}),
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
return {
|
|
249
|
+
key: suggestion.key,
|
|
250
|
+
title: suggestion.title,
|
|
251
|
+
subtitle: suggestion.subtitle,
|
|
252
|
+
label,
|
|
253
|
+
attrs,
|
|
254
|
+
};
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
return {
|
|
258
|
+
mentions: {
|
|
259
|
+
trigger,
|
|
260
|
+
theme: normalizeEditorMentionTheme(addons.mentions.theme),
|
|
261
|
+
...(typeof addons.mentions.resolveSelectionAttrs === 'function'
|
|
262
|
+
? { resolveSelectionAttrs: true }
|
|
263
|
+
: {}),
|
|
264
|
+
...(typeof addons.mentions.resolveTheme === 'function' ? { resolveTheme: true } : {}),
|
|
265
|
+
suggestions,
|
|
266
|
+
},
|
|
267
|
+
...(addons.codeHighlighting ? { codeHighlighting: addons.codeHighlighting } : {}),
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export function serializeEditorAddons(addons?: EditorAddons): string | undefined {
|
|
272
|
+
return serializeNormalizedEditorAddons(normalizeEditorAddons(addons));
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
export function serializeNormalizedEditorAddons(
|
|
276
|
+
addons?: NormalizedEditorAddons
|
|
277
|
+
): string | undefined {
|
|
278
|
+
const normalized = normalizeNativeEditorAddons(addons);
|
|
279
|
+
return normalized ? JSON.stringify(normalized) : undefined;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/** Options for {@link buildMentionFragmentJson}. */
|
|
283
|
+
export interface MentionFragmentOptions {
|
|
284
|
+
/** Append a plain, unmarked space so typing continues after the mention. */
|
|
285
|
+
trailingSpace?: boolean;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Build a document fragment holding one mention node, ready for
|
|
290
|
+
* `insertContentJson`. Use it to insert a mention outside the suggestion
|
|
291
|
+
* flow — from a picker, say.
|
|
292
|
+
*
|
|
293
|
+
* @param attrs Attributes for the mention node, e.g. `{ label, id }`.
|
|
294
|
+
* @param descriptor Document node name to wrap the fragment in. Defaults to `doc`.
|
|
295
|
+
*/
|
|
296
|
+
export function buildMentionFragmentJson(
|
|
297
|
+
attrs: Record<string, unknown>,
|
|
298
|
+
descriptor?: Pick<ResolvedDocumentSchema, 'documentNodeName'>,
|
|
299
|
+
options?: MentionFragmentOptions
|
|
300
|
+
): DocumentJSON {
|
|
301
|
+
return buildDocumentFragmentJson(
|
|
302
|
+
[
|
|
303
|
+
{
|
|
304
|
+
type: MENTION_NODE_NAME,
|
|
305
|
+
attrs,
|
|
306
|
+
},
|
|
307
|
+
...(options?.trailingSpace ? [{ type: 'text', text: ' ' }] : []),
|
|
308
|
+
],
|
|
309
|
+
descriptor
|
|
310
|
+
);
|
|
311
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { Selection } from './NativeEditorBridge';
|
|
2
|
+
|
|
3
|
+
export { DEFAULT_ATOM_CHIP_HEIGHT } from './atomConstants';
|
|
4
|
+
|
|
5
|
+
export interface AtomInstance {
|
|
6
|
+
key: string;
|
|
7
|
+
hasStableKey: boolean;
|
|
8
|
+
nodeType: string;
|
|
9
|
+
attrs: Readonly<Record<string, unknown>>;
|
|
10
|
+
docPos: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface AtomInstanceCollection {
|
|
14
|
+
instanceBlocks: AtomInstance[][];
|
|
15
|
+
instances: AtomInstance[];
|
|
16
|
+
hasOnlyStableKeys: boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const NATIVE_VOID_BLOCK_TYPES: ReadonlySet<string> = new Set([
|
|
20
|
+
'horizontalRule',
|
|
21
|
+
'horizontal_rule',
|
|
22
|
+
'image',
|
|
23
|
+
]);
|
|
24
|
+
|
|
25
|
+
export type AtomUpdateAttrsErrorCode =
|
|
26
|
+
| 'not-applicable'
|
|
27
|
+
| 'stale-revision'
|
|
28
|
+
| 'not-ready'
|
|
29
|
+
| 'engine-error';
|
|
30
|
+
|
|
31
|
+
export class AtomUpdateAttrsError extends Error {
|
|
32
|
+
readonly code: AtomUpdateAttrsErrorCode;
|
|
33
|
+
|
|
34
|
+
constructor(code: AtomUpdateAttrsErrorCode, message: string) {
|
|
35
|
+
super(message);
|
|
36
|
+
this.name = 'AtomUpdateAttrsError';
|
|
37
|
+
this.code = code;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface AtomRenderElement {
|
|
42
|
+
readonly type: string;
|
|
43
|
+
readonly nodeType?: string;
|
|
44
|
+
readonly docPos?: number;
|
|
45
|
+
readonly atomId?: string;
|
|
46
|
+
readonly attrs?: Readonly<Record<string, unknown>>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const EMPTY_ATOM_ATTRS: Readonly<Record<string, unknown>> = Object.freeze({});
|
|
50
|
+
|
|
51
|
+
export function collectAtomInstanceBlocks(
|
|
52
|
+
renderBlocks: ReadonlyArray<ReadonlyArray<AtomRenderElement>>,
|
|
53
|
+
registeredTypes: ReadonlySet<string>
|
|
54
|
+
): AtomInstanceCollection {
|
|
55
|
+
const occurrences = new Map<string, number>();
|
|
56
|
+
const instanceBlocks: AtomInstance[][] = [];
|
|
57
|
+
const instances: AtomInstance[] = [];
|
|
58
|
+
let hasOnlyStableKeys = true;
|
|
59
|
+
for (const block of renderBlocks) {
|
|
60
|
+
const blockInstances: AtomInstance[] = [];
|
|
61
|
+
for (const element of block) {
|
|
62
|
+
if (
|
|
63
|
+
element.type !== 'voidBlock' ||
|
|
64
|
+
typeof element.nodeType !== 'string' ||
|
|
65
|
+
typeof element.docPos !== 'number'
|
|
66
|
+
) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const occurrence = occurrences.get(element.nodeType) ?? 0;
|
|
70
|
+
occurrences.set(element.nodeType, occurrence + 1);
|
|
71
|
+
if (
|
|
72
|
+
!registeredTypes.has(element.nodeType) &&
|
|
73
|
+
NATIVE_VOID_BLOCK_TYPES.has(element.nodeType)
|
|
74
|
+
) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const hasStableKey = typeof element.atomId === 'string';
|
|
78
|
+
const instance = {
|
|
79
|
+
key: hasStableKey ? element.atomId! : `${element.nodeType}:${occurrence}`,
|
|
80
|
+
hasStableKey,
|
|
81
|
+
nodeType: element.nodeType,
|
|
82
|
+
attrs: element.attrs ?? EMPTY_ATOM_ATTRS,
|
|
83
|
+
docPos: element.docPos,
|
|
84
|
+
};
|
|
85
|
+
hasOnlyStableKeys &&= hasStableKey;
|
|
86
|
+
blockInstances.push(instance);
|
|
87
|
+
instances.push(instance);
|
|
88
|
+
}
|
|
89
|
+
instanceBlocks.push(blockInstances);
|
|
90
|
+
}
|
|
91
|
+
return { instanceBlocks, instances, hasOnlyStableKeys };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function collectAtomInstances(
|
|
95
|
+
renderBlocks: ReadonlyArray<ReadonlyArray<AtomRenderElement>>,
|
|
96
|
+
registeredTypes: ReadonlySet<string>
|
|
97
|
+
): AtomInstance[] {
|
|
98
|
+
return collectAtomInstanceBlocks(renderBlocks, registeredTypes).instances;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function applyRenderPatch<Element>(
|
|
102
|
+
previousBlocks: ReadonlyArray<ReadonlyArray<Element>>,
|
|
103
|
+
patch: {
|
|
104
|
+
readonly startIndex: number;
|
|
105
|
+
readonly deleteCount: number;
|
|
106
|
+
readonly renderBlocks: ReadonlyArray<ReadonlyArray<Element>>;
|
|
107
|
+
}
|
|
108
|
+
): Array<ReadonlyArray<Element>> {
|
|
109
|
+
return [
|
|
110
|
+
...previousBlocks.slice(0, patch.startIndex),
|
|
111
|
+
...patch.renderBlocks,
|
|
112
|
+
...previousBlocks.slice(patch.startIndex + patch.deleteCount),
|
|
113
|
+
];
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function atomSelected(selection: Selection, docPos: number): boolean {
|
|
117
|
+
if (selection.type === 'all') return true;
|
|
118
|
+
if (selection.type === 'node') return selection.pos === docPos;
|
|
119
|
+
const { anchor, head } = selection;
|
|
120
|
+
if (anchor == null || head == null) return false;
|
|
121
|
+
const [from, to] = anchor <= head ? [anchor, head] : [head, anchor];
|
|
122
|
+
return from <= docPos && docPos + 1 <= to;
|
|
123
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export const RESERVED_WIRE_NODE_TYPES: ReadonlySet<string> = new Set([
|
|
2
|
+
'__opaque',
|
|
3
|
+
'__opaque_json',
|
|
4
|
+
'__skip',
|
|
5
|
+
]);
|
|
6
|
+
|
|
7
|
+
export const ATOM_HTML_IDENTIFIER = /^[a-z][a-z0-9-]*$/;
|
|
8
|
+
|
|
9
|
+
export const ATOM_HTML_DENIED_TAGS: ReadonlySet<string> = new Set([
|
|
10
|
+
'script',
|
|
11
|
+
'style',
|
|
12
|
+
'iframe',
|
|
13
|
+
'object',
|
|
14
|
+
'embed',
|
|
15
|
+
'link',
|
|
16
|
+
'meta',
|
|
17
|
+
'base',
|
|
18
|
+
'title',
|
|
19
|
+
'head',
|
|
20
|
+
'html',
|
|
21
|
+
'body',
|
|
22
|
+
'form',
|
|
23
|
+
'textarea',
|
|
24
|
+
'select',
|
|
25
|
+
'option',
|
|
26
|
+
'button',
|
|
27
|
+
'area',
|
|
28
|
+
'br',
|
|
29
|
+
'col',
|
|
30
|
+
'hr',
|
|
31
|
+
'img',
|
|
32
|
+
'input',
|
|
33
|
+
'param',
|
|
34
|
+
'source',
|
|
35
|
+
'track',
|
|
36
|
+
'wbr',
|
|
37
|
+
]);
|
|
38
|
+
|
|
39
|
+
export const ATOM_HTML_DENIED_ATTRS: ReadonlySet<string> = new Set([
|
|
40
|
+
'style',
|
|
41
|
+
'srcdoc',
|
|
42
|
+
'href',
|
|
43
|
+
'src',
|
|
44
|
+
'srcset',
|
|
45
|
+
'action',
|
|
46
|
+
'formaction',
|
|
47
|
+
]);
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { AtomAttrsUpdate } from './atoms';
|
|
2
|
+
import { AtomUpdateAttrsError } from './atomInstances';
|
|
3
|
+
|
|
4
|
+
function copyJson(value: unknown, ancestors = new Set<object>()): unknown {
|
|
5
|
+
if (value === null || typeof value === 'string' || typeof value === 'boolean') return value;
|
|
6
|
+
if (typeof value === 'number' && Number.isFinite(value)) return value;
|
|
7
|
+
if (typeof value !== 'object' || ancestors.has(value) || ancestors.size > 128) {
|
|
8
|
+
throw new AtomUpdateAttrsError(
|
|
9
|
+
'not-applicable',
|
|
10
|
+
'Atom attributes must contain finite JSON values.'
|
|
11
|
+
);
|
|
12
|
+
}
|
|
13
|
+
if (
|
|
14
|
+
!Array.isArray(value) &&
|
|
15
|
+
Object.getPrototypeOf(value) !== Object.prototype &&
|
|
16
|
+
Object.getPrototypeOf(value) !== null
|
|
17
|
+
) {
|
|
18
|
+
throw new AtomUpdateAttrsError(
|
|
19
|
+
'not-applicable',
|
|
20
|
+
'Atom attributes must contain plain JSON objects.'
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
ancestors.add(value);
|
|
24
|
+
const result = Array.isArray(value)
|
|
25
|
+
? Array.from(value, (entry) => copyJson(entry, ancestors))
|
|
26
|
+
: Object.fromEntries(
|
|
27
|
+
Object.entries(value).map(([key, entry]) => [key, copyJson(entry, ancestors)])
|
|
28
|
+
);
|
|
29
|
+
ancestors.delete(value);
|
|
30
|
+
return Object.freeze(result);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function resolveAtomAttrsUpdate(
|
|
34
|
+
attrs: Readonly<Record<string, unknown>>,
|
|
35
|
+
update: AtomAttrsUpdate
|
|
36
|
+
): Record<string, unknown> {
|
|
37
|
+
let current = copyJson(attrs) as Record<string, unknown>;
|
|
38
|
+
let patch: Record<string, unknown> = {};
|
|
39
|
+
for (const entry of Array.isArray(update) ? update : [update]) {
|
|
40
|
+
const value: unknown = typeof entry === 'function' ? entry(current) : entry;
|
|
41
|
+
if (value == null || typeof value !== 'object' || Array.isArray(value)) {
|
|
42
|
+
throw new AtomUpdateAttrsError(
|
|
43
|
+
'not-applicable',
|
|
44
|
+
'Atom updates must return an attribute object.'
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
const partial = copyJson(value) as Record<string, unknown>;
|
|
48
|
+
patch = { ...patch, ...partial };
|
|
49
|
+
current = Object.freeze({ ...current, ...partial });
|
|
50
|
+
}
|
|
51
|
+
return patch;
|
|
52
|
+
}
|