@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.
Files changed (494) hide show
  1. package/LICENSE +160 -0
  2. package/README.md +259 -0
  3. package/RUST-STANDARD-LIBRARY-NOTICES.html +8266 -0
  4. package/ReactNativeProseEditor.podspec +59 -0
  5. package/THIRD_PARTY_NOTICES.md +31155 -0
  6. package/android/build.gradle +188 -0
  7. package/android/consumer-rules.pro +18 -0
  8. package/android/expo/build.gradle +17 -0
  9. package/android/src/debug/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +7 -0
  10. package/android/src/main/assets/editor-icons/MaterialIcons.json +2236 -0
  11. package/android/src/main/assets/editor-icons/MaterialIcons.ttf +0 -0
  12. package/android/src/main/java/com/apollohg/editor/AndroidApiCompat.kt +19 -0
  13. package/android/src/main/java/com/apollohg/editor/AndroidCollaborationTransport.kt +860 -0
  14. package/android/src/main/java/com/apollohg/editor/CaretGeometry.kt +91 -0
  15. package/android/src/main/java/com/apollohg/editor/CodeHighlighting.kt +141 -0
  16. package/android/src/main/java/com/apollohg/editor/DecodedBitmapBudget.kt +250 -0
  17. package/android/src/main/java/com/apollohg/editor/EditorAddons.kt +133 -0
  18. package/android/src/main/java/com/apollohg/editor/EditorBlockSpacing.kt +51 -0
  19. package/android/src/main/java/com/apollohg/editor/EditorBoxDrawable.kt +16 -0
  20. package/android/src/main/java/com/apollohg/editor/EditorBoxDrawing.kt +234 -0
  21. package/android/src/main/java/com/apollohg/editor/EditorCheckboxSpan.kt +87 -0
  22. package/android/src/main/java/com/apollohg/editor/EditorCodeHighlighting.kt +120 -0
  23. package/android/src/main/java/com/apollohg/editor/EditorDecorationLayer.java +18 -0
  24. package/android/src/main/java/com/apollohg/editor/EditorDocumentLayout.kt +626 -0
  25. package/android/src/main/java/com/apollohg/editor/EditorEditText.kt +1042 -0
  26. package/android/src/main/java/com/apollohg/editor/EditorEditTextAnnotations.kt +191 -0
  27. package/android/src/main/java/com/apollohg/editor/EditorEditTextCaret.kt +100 -0
  28. package/android/src/main/java/com/apollohg/editor/EditorEditTextClipboard.kt +101 -0
  29. package/android/src/main/java/com/apollohg/editor/EditorEditTextComposition.kt +220 -0
  30. package/android/src/main/java/com/apollohg/editor/EditorEditTextConfiguration.kt +316 -0
  31. package/android/src/main/java/com/apollohg/editor/EditorEditTextCorrection.kt +303 -0
  32. package/android/src/main/java/com/apollohg/editor/EditorEditTextDeferredUpdates.kt +327 -0
  33. package/android/src/main/java/com/apollohg/editor/EditorEditTextDeletion.kt +258 -0
  34. package/android/src/main/java/com/apollohg/editor/EditorEditTextDiagnostics.kt +83 -0
  35. package/android/src/main/java/com/apollohg/editor/EditorEditTextDragDrop.kt +67 -0
  36. package/android/src/main/java/com/apollohg/editor/EditorEditTextExternalComposition.kt +357 -0
  37. package/android/src/main/java/com/apollohg/editor/EditorEditTextHardwareInput.kt +277 -0
  38. package/android/src/main/java/com/apollohg/editor/EditorEditTextImages.kt +280 -0
  39. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputLifecycle.kt +183 -0
  40. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputPreparation.kt +79 -0
  41. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputTraits.kt +384 -0
  42. package/android/src/main/java/com/apollohg/editor/EditorEditTextLayout.kt +100 -0
  43. package/android/src/main/java/com/apollohg/editor/EditorEditTextNativeMutation.kt +243 -0
  44. package/android/src/main/java/com/apollohg/editor/EditorEditTextPlaceholder.kt +154 -0
  45. package/android/src/main/java/com/apollohg/editor/EditorEditTextRenderPatch.kt +347 -0
  46. package/android/src/main/java/com/apollohg/editor/EditorEditTextRendering.kt +313 -0
  47. package/android/src/main/java/com/apollohg/editor/EditorEditTextRustCommands.kt +281 -0
  48. package/android/src/main/java/com/apollohg/editor/EditorEditTextSelection.kt +352 -0
  49. package/android/src/main/java/com/apollohg/editor/EditorEditTextState.kt +113 -0
  50. package/android/src/main/java/com/apollohg/editor/EditorEditTextTaskMarkers.kt +92 -0
  51. package/android/src/main/java/com/apollohg/editor/EditorEditTextTextCommit.kt +327 -0
  52. package/android/src/main/java/com/apollohg/editor/EditorEditTextToolbar.kt +84 -0
  53. package/android/src/main/java/com/apollohg/editor/EditorEditTextUpdates.kt +245 -0
  54. package/android/src/main/java/com/apollohg/editor/EditorGlyphHeightCursorDrawable.kt +42 -0
  55. package/android/src/main/java/com/apollohg/editor/EditorHeightBehavior.kt +13 -0
  56. package/android/src/main/java/com/apollohg/editor/EditorInputConnection.kt +923 -0
  57. package/android/src/main/java/com/apollohg/editor/EditorInputCoordinates.kt +191 -0
  58. package/android/src/main/java/com/apollohg/editor/EditorInputCorrection.kt +107 -0
  59. package/android/src/main/java/com/apollohg/editor/EditorInputCursorGeometry.kt +128 -0
  60. package/android/src/main/java/com/apollohg/editor/EditorInputSnapshots.kt +134 -0
  61. package/android/src/main/java/com/apollohg/editor/EditorInputSurroundingDeletion.kt +321 -0
  62. package/android/src/main/java/com/apollohg/editor/EditorKeyboardToolbarView.kt +851 -0
  63. package/android/src/main/java/com/apollohg/editor/EditorMentionStyle.kt +192 -0
  64. package/android/src/main/java/com/apollohg/editor/EditorReconciliationWatcher.kt +46 -0
  65. package/android/src/main/java/com/apollohg/editor/EditorStyleSheet.kt +303 -0
  66. package/android/src/main/java/com/apollohg/editor/EditorStyleSheetSpans.kt +253 -0
  67. package/android/src/main/java/com/apollohg/editor/EditorSurfaceInputConnection.kt +67 -0
  68. package/android/src/main/java/com/apollohg/editor/EditorTextDecorationDrawing.kt +143 -0
  69. package/android/src/main/java/com/apollohg/editor/EditorTextSurface.kt +712 -0
  70. package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceDragDrop.kt +94 -0
  71. package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceInteraction.kt +708 -0
  72. package/android/src/main/java/com/apollohg/editor/EditorTheme.kt +650 -0
  73. package/android/src/main/java/com/apollohg/editor/EditorV2Adapter.kt +912 -0
  74. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterMutations.kt +402 -0
  75. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterRendering.kt +123 -0
  76. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterSelection.kt +203 -0
  77. package/android/src/main/java/com/apollohg/editor/EditorV2Backend.kt +120 -0
  78. package/android/src/main/java/com/apollohg/editor/EditorV2Driver.kt +87 -0
  79. package/android/src/main/java/com/apollohg/editor/EditorV2Registry.kt +97 -0
  80. package/android/src/main/java/com/apollohg/editor/EditorV2RenderValidation.kt +409 -0
  81. package/android/src/main/java/com/apollohg/editor/ExpoAutoGrowStyleSizePublisher.kt +34 -0
  82. package/android/src/main/java/com/apollohg/editor/ImageResizeOverlayView.kt +266 -0
  83. package/android/src/main/java/com/apollohg/editor/ImeTextCoordinateMapper.kt +102 -0
  84. package/android/src/main/java/com/apollohg/editor/KeyboardToolbarImeAnimationController.kt +101 -0
  85. package/android/src/main/java/com/apollohg/editor/MentionSuggestionChipView.kt +234 -0
  86. package/android/src/main/java/com/apollohg/editor/NativeCollaborationTransportRegistry.kt +493 -0
  87. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoView.kt +813 -0
  88. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewAtoms.kt +68 -0
  89. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewBinding.kt +126 -0
  90. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewDiagnostics.kt +208 -0
  91. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewErrors.kt +146 -0
  92. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewEvents.kt +150 -0
  93. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewExternalComposition.kt +39 -0
  94. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewFocus.kt +176 -0
  95. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewLifecycle.kt +302 -0
  96. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewMentions.kt +259 -0
  97. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewNativeActions.kt +179 -0
  98. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewOutsideTap.kt +214 -0
  99. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPendingUpdates.kt +376 -0
  100. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewProperties.kt +234 -0
  101. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPropertyRetries.kt +197 -0
  102. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewToolbar.kt +285 -0
  103. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewTypes.kt +28 -0
  104. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewUpdates.kt +271 -0
  105. package/android/src/main/java/com/apollohg/editor/NativeEditorModule.kt +687 -0
  106. package/android/src/main/java/com/apollohg/editor/NativeEditorOutsideTapDispatcher.kt +380 -0
  107. package/android/src/main/java/com/apollohg/editor/NativeEditorV2Numbers.kt +45 -0
  108. package/android/src/main/java/com/apollohg/editor/NativeEditorViewRegistry.kt +372 -0
  109. package/android/src/main/java/com/apollohg/editor/NativeImagePipeline.kt +22 -0
  110. package/android/src/main/java/com/apollohg/editor/NativeToolbar.kt +193 -0
  111. package/android/src/main/java/com/apollohg/editor/NativeToolbarIcons.kt +177 -0
  112. package/android/src/main/java/com/apollohg/editor/NativeToolbarItem.kt +274 -0
  113. package/android/src/main/java/com/apollohg/editor/OkHttpCollaborationSocket.kt +102 -0
  114. package/android/src/main/java/com/apollohg/editor/OrderedListMarkerFormatter.kt +130 -0
  115. package/android/src/main/java/com/apollohg/editor/PointerTransparentView.java +18 -0
  116. package/android/src/main/java/com/apollohg/editor/PositionBridge.kt +128 -0
  117. package/android/src/main/java/com/apollohg/editor/ProseViewerView.kt +854 -0
  118. package/android/src/main/java/com/apollohg/editor/RemoteSelectionOverlayView.kt +314 -0
  119. package/android/src/main/java/com/apollohg/editor/RenderBlockSpans.kt +314 -0
  120. package/android/src/main/java/com/apollohg/editor/RenderBridge.kt +224 -0
  121. package/android/src/main/java/com/apollohg/editor/RenderBridgeBlockStyles.kt +407 -0
  122. package/android/src/main/java/com/apollohg/editor/RenderBridgeElements.kt +544 -0
  123. package/android/src/main/java/com/apollohg/editor/RenderBridgeInlineAndAtoms.kt +631 -0
  124. package/android/src/main/java/com/apollohg/editor/RenderBridgeParagraphs.kt +215 -0
  125. package/android/src/main/java/com/apollohg/editor/RenderImageDecoder.kt +748 -0
  126. package/android/src/main/java/com/apollohg/editor/RenderImageLoader.kt +900 -0
  127. package/android/src/main/java/com/apollohg/editor/RenderLayoutConstants.kt +117 -0
  128. package/android/src/main/java/com/apollohg/editor/RenderMediaSpans.kt +337 -0
  129. package/android/src/main/java/com/apollohg/editor/RenderParagraphSpans.kt +182 -0
  130. package/android/src/main/java/com/apollohg/editor/RichTextEditorView.kt +951 -0
  131. package/android/src/main/java/com/apollohg/editor/SharedNativeImagePipeline.kt +78 -0
  132. package/android/src/main/java/com/apollohg/editor/UniffiEditorV2Backend.kt +261 -0
  133. package/android/src/main/java/com/apollohg/editor/viewer/AndroidProseLayoutEngine.kt +1656 -0
  134. package/android/src/main/java/com/apollohg/editor/viewer/FabricAttachmentSidecars.kt +80 -0
  135. package/android/src/main/java/com/apollohg/editor/viewer/FabricLeaseHandleBridge.kt +59 -0
  136. package/android/src/main/java/com/apollohg/editor/viewer/FallbackSelectionGeometry.kt +450 -0
  137. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseDrawingView.kt +678 -0
  138. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseInstrumentation.kt +608 -0
  139. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayout.kt +186 -0
  140. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutCache.kt +393 -0
  141. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutRegistry.kt +828 -0
  142. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseTheme.kt +316 -0
  143. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerManager.kt +900 -0
  144. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerPackage.kt +16 -0
  145. package/android/src/main/java/com/apollohg/editor/viewer/PreparedViewerAtoms.kt +89 -0
  146. package/android/src/main/java/com/apollohg/editor/viewer/ViewerCodeHighlighting.kt +91 -0
  147. package/android/src/main/java/com/apollohg/editor/viewer/ViewerDocument.kt +453 -0
  148. package/android/src/main/java/com/apollohg/editor/viewer/ViewerFontEnvironment.kt +282 -0
  149. package/android/src/main/java/com/apollohg/editor/viewer/ViewerImagePipeline.kt +460 -0
  150. package/android/src/main/jni/CMakeLists.txt +85 -0
  151. package/android/src/main/jni/PreparedProseViewerMeasurementsManager.cpp +334 -0
  152. package/android/src/main/jni/ReactNativeProseEditorSpec.h +17 -0
  153. package/android/src/main/jni/reactnativeproseeditor.h +6 -0
  154. package/android/src/main/res/values/attrs.xml +6 -0
  155. package/android/src/release/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +9 -0
  156. package/app.plugin.js +62 -0
  157. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseMeasurementsManager.h +62 -0
  158. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerComponentDescriptor.h +30 -0
  159. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.cpp +192 -0
  160. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.h +46 -0
  161. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerState.h +145 -0
  162. package/dist/AtomHost.d.ts +17 -0
  163. package/dist/AtomHost.js +135 -0
  164. package/dist/DefaultAtomChip.d.ts +2 -0
  165. package/dist/DefaultAtomChip.js +22 -0
  166. package/dist/EditorAddon.d.ts +32 -0
  167. package/dist/EditorAddon.js +29 -0
  168. package/dist/EditorAddonNormalization.d.ts +6 -0
  169. package/dist/EditorAddonNormalization.js +48 -0
  170. package/dist/EditorMentionThemeNormalization.d.ts +8 -0
  171. package/dist/EditorMentionThemeNormalization.js +22 -0
  172. package/dist/EditorMentionThemeValidation.d.ts +12 -0
  173. package/dist/EditorMentionThemeValidation.js +95 -0
  174. package/dist/EditorStyleSheet.d.ts +4 -0
  175. package/dist/EditorStyleSheet.js +10 -0
  176. package/dist/EditorStyleSheetNormalization.d.ts +3 -0
  177. package/dist/EditorStyleSheetNormalization.js +226 -0
  178. package/dist/EditorStyleSheetTypes.d.ts +151 -0
  179. package/dist/EditorStyleSheetTypes.js +2 -0
  180. package/dist/EditorTheme.d.ts +117 -0
  181. package/dist/EditorTheme.js +41 -0
  182. package/dist/EditorToolbar.d.ts +4 -0
  183. package/dist/EditorToolbar.js +17 -0
  184. package/dist/EditorToolbarComponent.d.ts +13 -0
  185. package/dist/EditorToolbarComponent.js +24 -0
  186. package/dist/EditorToolbarItems.d.ts +9 -0
  187. package/dist/EditorToolbarItems.js +58 -0
  188. package/dist/EditorToolbarRegistry.d.ts +59 -0
  189. package/dist/EditorToolbarRegistry.js +175 -0
  190. package/dist/EditorToolbarTypes.d.ts +273 -0
  191. package/dist/EditorToolbarTypes.js +2 -0
  192. package/dist/EditorToolbarVisuals.d.ts +154 -0
  193. package/dist/EditorToolbarVisuals.js +228 -0
  194. package/dist/EditorUpdateRevision.d.ts +8 -0
  195. package/dist/EditorUpdateRevision.js +22 -0
  196. package/dist/ExternalTextComposition.d.ts +45 -0
  197. package/dist/ExternalTextComposition.js +537 -0
  198. package/dist/ImageLoadingPolicy.d.ts +54 -0
  199. package/dist/ImageLoadingPolicy.js +60 -0
  200. package/dist/NativeEditorBoundaryError.d.ts +111 -0
  201. package/dist/NativeEditorBoundaryError.js +268 -0
  202. package/dist/NativeEditorBridge.d.ts +9 -0
  203. package/dist/NativeEditorBridge.js +37 -0
  204. package/dist/NativeEditorCollaborationTransport.d.ts +154 -0
  205. package/dist/NativeEditorCollaborationTransport.js +275 -0
  206. package/dist/NativeEditorCreateConfig.d.ts +16 -0
  207. package/dist/NativeEditorCreateConfig.js +249 -0
  208. package/dist/NativeEditorCreateJson.d.ts +76 -0
  209. package/dist/NativeEditorCreateJson.js +474 -0
  210. package/dist/NativeEditorCreateValidation.d.ts +32 -0
  211. package/dist/NativeEditorCreateValidation.js +150 -0
  212. package/dist/NativeEditorDocumentBridge.d.ts +72 -0
  213. package/dist/NativeEditorDocumentBridge.js +305 -0
  214. package/dist/NativeEditorDocumentHandle.d.ts +70 -0
  215. package/dist/NativeEditorDocumentHandle.js +89 -0
  216. package/dist/NativeEditorLocalAwareness.d.ts +34 -0
  217. package/dist/NativeEditorLocalAwareness.js +153 -0
  218. package/dist/NativeEditorNativeModule.d.ts +48 -0
  219. package/dist/NativeEditorNativeModule.js +34 -0
  220. package/dist/NativeEditorRenderNormalization.d.ts +22 -0
  221. package/dist/NativeEditorRenderNormalization.js +274 -0
  222. package/dist/NativeEditorResultNormalization.d.ts +108 -0
  223. package/dist/NativeEditorResultNormalization.js +400 -0
  224. package/dist/NativeEditorTypes.d.ts +318 -0
  225. package/dist/NativeEditorTypes.js +15 -0
  226. package/dist/NativeEditorV2Decimal.d.ts +5 -0
  227. package/dist/NativeEditorV2Decimal.js +18 -0
  228. package/dist/NativeProseViewer.d.ts +122 -0
  229. package/dist/NativeProseViewer.js +130 -0
  230. package/dist/NativeRichTextEditor.d.ts +3 -0
  231. package/dist/NativeRichTextEditor.js +6 -0
  232. package/dist/ResourceLimits.d.ts +100 -0
  233. package/dist/ResourceLimits.js +80 -0
  234. package/dist/RichTextEditor.d.ts +4 -0
  235. package/dist/RichTextEditor.js +25 -0
  236. package/dist/RichTextEditorNativeTypes.d.ts +122 -0
  237. package/dist/RichTextEditorNativeTypes.js +2 -0
  238. package/dist/RichTextEditorNativeView.d.ts +12 -0
  239. package/dist/RichTextEditorNativeView.js +15 -0
  240. package/dist/RichTextEditorSerialization.d.ts +53 -0
  241. package/dist/RichTextEditorSerialization.js +283 -0
  242. package/dist/RichTextEditorTypes.d.ts +281 -0
  243. package/dist/RichTextEditorTypes.js +2 -0
  244. package/dist/ViewerConfiguration.d.ts +22 -0
  245. package/dist/ViewerConfiguration.js +6 -0
  246. package/dist/YjsCollaboration.d.ts +146 -0
  247. package/dist/YjsCollaboration.js +496 -0
  248. package/dist/addons.d.ts +193 -0
  249. package/dist/addons.js +122 -0
  250. package/dist/atomConstants.d.ts +3 -0
  251. package/dist/atomConstants.js +6 -0
  252. package/dist/atomInstances.d.ts +35 -0
  253. package/dist/atomInstances.js +79 -0
  254. package/dist/atomPolicy.d.ts +4 -0
  255. package/dist/atomPolicy.js +47 -0
  256. package/dist/atomUpdates.d.ts +2 -0
  257. package/dist/atomUpdates.js +38 -0
  258. package/dist/atoms.d.ts +92 -0
  259. package/dist/atoms.js +222 -0
  260. package/dist/attributeValidation.d.ts +4 -0
  261. package/dist/attributeValidation.js +97 -0
  262. package/dist/contentExpression.d.ts +6 -0
  263. package/dist/contentExpression.js +335 -0
  264. package/dist/index.d.ts +21 -0
  265. package/dist/index.js +78 -0
  266. package/dist/listMarkers.d.ts +15 -0
  267. package/dist/listMarkers.js +21 -0
  268. package/dist/schemaDefinition.d.ts +143 -0
  269. package/dist/schemaDefinition.js +206 -0
  270. package/dist/schemaDocument.d.ts +17 -0
  271. package/dist/schemaDocument.js +69 -0
  272. package/dist/schemaDocumentConstruction.d.ts +5 -0
  273. package/dist/schemaDocumentConstruction.js +125 -0
  274. package/dist/schemaNormalization.d.ts +29 -0
  275. package/dist/schemaNormalization.js +313 -0
  276. package/dist/schemaPresets.d.ts +68 -0
  277. package/dist/schemaPresets.js +198 -0
  278. package/dist/schemaResolution.d.ts +9 -0
  279. package/dist/schemaResolution.js +211 -0
  280. package/dist/schemas.d.ts +5 -0
  281. package/dist/schemas.js +28 -0
  282. package/dist/specs/PreparedProseViewerNativeComponent.d.ts +37 -0
  283. package/dist/specs/PreparedProseViewerNativeComponent.js +6 -0
  284. package/dist/useEditorToolbarInteractions.d.ts +12 -0
  285. package/dist/useEditorToolbarInteractions.js +218 -0
  286. package/dist/useEditorToolbarItems.d.ts +8 -0
  287. package/dist/useEditorToolbarItems.js +280 -0
  288. package/dist/useEditorToolbarPresentation.d.ts +4 -0
  289. package/dist/useEditorToolbarPresentation.js +203 -0
  290. package/dist/useEditorToolbarState.d.ts +63 -0
  291. package/dist/useEditorToolbarState.js +108 -0
  292. package/dist/useFocusPreservingFrames.d.ts +17 -0
  293. package/dist/useFocusPreservingFrames.js +108 -0
  294. package/dist/useNativeEditor.d.ts +66 -0
  295. package/dist/useNativeEditor.js +370 -0
  296. package/dist/useRichTextEditorCommands.d.ts +21 -0
  297. package/dist/useRichTextEditorCommands.js +299 -0
  298. package/dist/useRichTextEditorEvents.d.ts +18 -0
  299. package/dist/useRichTextEditorEvents.js +216 -0
  300. package/dist/useRichTextEditorMentions.d.ts +11 -0
  301. package/dist/useRichTextEditorMentions.js +316 -0
  302. package/dist/useRichTextEditorPresentation.d.ts +5 -0
  303. package/dist/useRichTextEditorPresentation.js +178 -0
  304. package/dist/useRichTextEditorState.d.ts +180 -0
  305. package/dist/useRichTextEditorState.js +405 -0
  306. package/dist/useRichTextEditorUpdates.d.ts +10 -0
  307. package/dist/useRichTextEditorUpdates.js +308 -0
  308. package/dist/useViewerAtoms.d.ts +38 -0
  309. package/dist/useViewerAtoms.js +288 -0
  310. package/expo-module.config.json +13 -0
  311. package/ios/EditorAddons.swift +354 -0
  312. package/ios/EditorCodeHighlighting.swift +184 -0
  313. package/ios/EditorCore.xcframework/Info.plist +44 -0
  314. package/ios/EditorCore.xcframework/ios-arm64/libeditor_core.a +0 -0
  315. package/ios/EditorCore.xcframework/ios-arm64_x86_64-simulator/libeditor_core.a +0 -0
  316. package/ios/EditorInteractionOverlays.swift +697 -0
  317. package/ios/EditorLayoutManager.swift +971 -0
  318. package/ios/EditorNodeTypes.swift +37 -0
  319. package/ios/EditorStyleSheet.swift +461 -0
  320. package/ios/EditorTextView+AttributedPatch.swift +305 -0
  321. package/ios/EditorTextView+Binding.swift +61 -0
  322. package/ios/EditorTextView+Caret.swift +333 -0
  323. package/ios/EditorTextView+Commands.swift +203 -0
  324. package/ios/EditorTextView+Delegate.swift +65 -0
  325. package/ios/EditorTextView+Diagnostics.swift +225 -0
  326. package/ios/EditorTextView+DragDrop.swift +290 -0
  327. package/ios/EditorTextView+ExternalComposition.swift +364 -0
  328. package/ios/EditorTextView+Images.swift +354 -0
  329. package/ios/EditorTextView+InputTraits.swift +200 -0
  330. package/ios/EditorTextView+KeyboardInput.swift +318 -0
  331. package/ios/EditorTextView+Layout.swift +245 -0
  332. package/ios/EditorTextView+MarkedText.swift +267 -0
  333. package/ios/EditorTextView+NativeInputLifecycle.swift +372 -0
  334. package/ios/EditorTextView+NativeMutation.swift +471 -0
  335. package/ios/EditorTextView+Reconciliation.swift +97 -0
  336. package/ios/EditorTextView+RenderPatch.swift +573 -0
  337. package/ios/EditorTextView+Rendering.swift +539 -0
  338. package/ios/EditorTextView+Selection.swift +542 -0
  339. package/ios/EditorTextView.swift +953 -0
  340. package/ios/EditorTheme.swift +626 -0
  341. package/ios/EditorV2Adapter+Commands.swift +204 -0
  342. package/ios/EditorV2Adapter+Envelope.swift +238 -0
  343. package/ios/EditorV2Adapter+Mutation.swift +392 -0
  344. package/ios/EditorV2Adapter+Registry.swift +185 -0
  345. package/ios/EditorV2Adapter+RenderState.swift +360 -0
  346. package/ios/EditorV2Adapter+RenderValidation.swift +420 -0
  347. package/ios/EditorV2Adapter+Selection.swift +329 -0
  348. package/ios/EditorV2Adapter+TextCommands.swift +430 -0
  349. package/ios/EditorV2Adapter.swift +376 -0
  350. package/ios/EditorV2Shadow.swift +353 -0
  351. package/ios/Generated_editor_core.swift +2378 -0
  352. package/ios/NativeCodeHighlighting.swift +159 -0
  353. package/ios/NativeCollaborationSocket.swift +144 -0
  354. package/ios/NativeCollaborationTransport+Protocol.swift +258 -0
  355. package/ios/NativeCollaborationTransport+Socket.swift +379 -0
  356. package/ios/NativeCollaborationTransport+Validation.swift +103 -0
  357. package/ios/NativeCollaborationTransport.swift +322 -0
  358. package/ios/NativeCollaborationTransportRegistry.swift +521 -0
  359. package/ios/NativeEditorExpoView+AccessoryRetry.swift +219 -0
  360. package/ios/NativeEditorExpoView+Binding.swift +268 -0
  361. package/ios/NativeEditorExpoView+Diagnostics.swift +66 -0
  362. package/ios/NativeEditorExpoView+Events.swift +131 -0
  363. package/ios/NativeEditorExpoView+Focus.swift +169 -0
  364. package/ios/NativeEditorExpoView+MentionRetry.swift +288 -0
  365. package/ios/NativeEditorExpoView+Mentions.swift +288 -0
  366. package/ios/NativeEditorExpoView+Properties.swift +300 -0
  367. package/ios/NativeEditorExpoView+Toolbar.swift +86 -0
  368. package/ios/NativeEditorExpoView+Updates.swift +312 -0
  369. package/ios/NativeEditorExpoView.swift +349 -0
  370. package/ios/NativeEditorModule.swift +856 -0
  371. package/ios/NativeEditorViewRegistry.swift +226 -0
  372. package/ios/NativeToolbar+ButtonStyle.swift +214 -0
  373. package/ios/NativeToolbar+Buttons.swift +228 -0
  374. package/ios/NativeToolbar+Diagnostics.swift +114 -0
  375. package/ios/NativeToolbar+Menu.swift +101 -0
  376. package/ios/NativeToolbar+Models.swift +519 -0
  377. package/ios/NativeToolbar+Placeholder.swift +39 -0
  378. package/ios/NativeToolbar.swift +612 -0
  379. package/ios/OrderedListMarkerFormatter.swift +103 -0
  380. package/ios/PositionBridge.swift +596 -0
  381. package/ios/ProseViewerView.swift +462 -0
  382. package/ios/RenderBridge+Atoms.swift +288 -0
  383. package/ios/RenderBridge+Attachments.swift +246 -0
  384. package/ios/RenderBridge+BlockBoundaries.swift +313 -0
  385. package/ios/RenderBridge+Style.swift +343 -0
  386. package/ios/RenderBridge.swift +704 -0
  387. package/ios/RichTextEditorView.swift +930 -0
  388. package/ios/SharedNativeImagePipeline+Cache.swift +189 -0
  389. package/ios/SharedNativeImagePipeline+Transport.swift +328 -0
  390. package/ios/SharedNativeImagePipeline.swift +533 -0
  391. package/ios/Viewer/CoreTextProseLayoutEngine+AttributedText.swift +436 -0
  392. package/ios/Viewer/CoreTextProseLayoutEngine+Models.swift +322 -0
  393. package/ios/Viewer/CoreTextProseLayoutEngine.swift +635 -0
  394. package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.h +4 -0
  395. package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.mm +767 -0
  396. package/ios/Viewer/Fabric/PreparedProseMeasurementsManager.mm +118 -0
  397. package/ios/Viewer/NativeSVGImageDecoder.h +9 -0
  398. package/ios/Viewer/NativeSVGImageDecoder.mm +106 -0
  399. package/ios/Viewer/NativeSVGPreflight.h +11 -0
  400. package/ios/Viewer/NativeSVGPreflight.mm +219 -0
  401. package/ios/Viewer/PreparedProseDrawingView.swift +639 -0
  402. package/ios/Viewer/PreparedProseInstrumentation.swift +387 -0
  403. package/ios/Viewer/PreparedProseLayout.swift +326 -0
  404. package/ios/Viewer/PreparedProseLayoutCache.swift +766 -0
  405. package/ios/Viewer/PreparedProseLayoutRegistry+Artifacts.swift +377 -0
  406. package/ios/Viewer/PreparedProseLayoutRegistry+Fabric.swift +582 -0
  407. package/ios/Viewer/PreparedProseLayoutRegistry+FabricOwnership.swift +128 -0
  408. package/ios/Viewer/PreparedProseLayoutRegistry.swift +381 -0
  409. package/ios/Viewer/ViewerDocument.swift +575 -0
  410. package/ios/Viewer/ViewerFontEnvironment.swift +283 -0
  411. package/ios/Viewer/ViewerImagePipeline.swift +478 -0
  412. package/ios/editor_coreFFI/editor_coreFFI.h +1023 -0
  413. package/ios/editor_coreFFI/module.modulemap +7 -0
  414. package/package.json +151 -0
  415. package/react-native.config.js +17 -0
  416. package/rust/android/arm64-v8a/libeditor_core.so +0 -0
  417. package/rust/android/armeabi-v7a/libeditor_core.so +0 -0
  418. package/rust/android/x86/libeditor_core.so +0 -0
  419. package/rust/android/x86_64/libeditor_core.so +0 -0
  420. package/rust/bindings/kotlin/uniffi/editor_core/editor_core.kt +3146 -0
  421. package/src/AtomHost.tsx +180 -0
  422. package/src/DefaultAtomChip.tsx +27 -0
  423. package/src/EditorAddon.ts +65 -0
  424. package/src/EditorAddonNormalization.ts +49 -0
  425. package/src/EditorMentionThemeNormalization.ts +25 -0
  426. package/src/EditorMentionThemeValidation.ts +133 -0
  427. package/src/EditorStyleSheet.ts +9 -0
  428. package/src/EditorStyleSheetNormalization.ts +219 -0
  429. package/src/EditorStyleSheetTypes.ts +189 -0
  430. package/src/EditorTheme.ts +196 -0
  431. package/src/EditorToolbar.tsx +31 -0
  432. package/src/EditorToolbarComponent.tsx +23 -0
  433. package/src/EditorToolbarItems.tsx +64 -0
  434. package/src/EditorToolbarRegistry.tsx +254 -0
  435. package/src/EditorToolbarTypes.tsx +322 -0
  436. package/src/EditorToolbarVisuals.tsx +270 -0
  437. package/src/EditorUpdateRevision.ts +26 -0
  438. package/src/ExternalTextComposition.ts +658 -0
  439. package/src/ImageLoadingPolicy.ts +125 -0
  440. package/src/NativeEditorBoundaryError.ts +345 -0
  441. package/src/NativeEditorBridge.ts +93 -0
  442. package/src/NativeEditorCollaborationTransport.ts +493 -0
  443. package/src/NativeEditorCreateConfig.ts +326 -0
  444. package/src/NativeEditorCreateJson.ts +579 -0
  445. package/src/NativeEditorCreateValidation.ts +178 -0
  446. package/src/NativeEditorDocumentBridge.ts +485 -0
  447. package/src/NativeEditorDocumentHandle.ts +168 -0
  448. package/src/NativeEditorLocalAwareness.ts +168 -0
  449. package/src/NativeEditorNativeModule.ts +97 -0
  450. package/src/NativeEditorRenderNormalization.ts +320 -0
  451. package/src/NativeEditorResultNormalization.ts +469 -0
  452. package/src/NativeEditorTypes.ts +366 -0
  453. package/src/NativeEditorV2Decimal.ts +13 -0
  454. package/src/NativeProseViewer.tsx +356 -0
  455. package/src/NativeRichTextEditor.tsx +33 -0
  456. package/src/ResourceLimits.ts +187 -0
  457. package/src/RichTextEditor.tsx +27 -0
  458. package/src/RichTextEditorNativeTypes.tsx +144 -0
  459. package/src/RichTextEditorNativeView.tsx +21 -0
  460. package/src/RichTextEditorSerialization.tsx +381 -0
  461. package/src/RichTextEditorTypes.tsx +327 -0
  462. package/src/ViewerConfiguration.ts +23 -0
  463. package/src/YjsCollaboration.ts +692 -0
  464. package/src/addons.ts +311 -0
  465. package/src/atomConstants.ts +3 -0
  466. package/src/atomInstances.ts +123 -0
  467. package/src/atomPolicy.ts +47 -0
  468. package/src/atomUpdates.ts +52 -0
  469. package/src/atoms.ts +379 -0
  470. package/src/attributeValidation.ts +116 -0
  471. package/src/contentExpression.ts +338 -0
  472. package/src/index.ts +295 -0
  473. package/src/listMarkers.ts +18 -0
  474. package/src/schemaDefinition.ts +395 -0
  475. package/src/schemaDocument.ts +92 -0
  476. package/src/schemaDocumentConstruction.ts +148 -0
  477. package/src/schemaNormalization.ts +367 -0
  478. package/src/schemaPresets.ts +250 -0
  479. package/src/schemaResolution.ts +242 -0
  480. package/src/schemas.ts +43 -0
  481. package/src/specs/PreparedProseViewerNativeComponent.ts +40 -0
  482. package/src/useEditorToolbarInteractions.tsx +329 -0
  483. package/src/useEditorToolbarItems.tsx +390 -0
  484. package/src/useEditorToolbarPresentation.tsx +483 -0
  485. package/src/useEditorToolbarState.tsx +172 -0
  486. package/src/useFocusPreservingFrames.ts +171 -0
  487. package/src/useNativeEditor.ts +534 -0
  488. package/src/useRichTextEditorCommands.tsx +478 -0
  489. package/src/useRichTextEditorEvents.tsx +342 -0
  490. package/src/useRichTextEditorMentions.tsx +441 -0
  491. package/src/useRichTextEditorPresentation.tsx +563 -0
  492. package/src/useRichTextEditorState.tsx +620 -0
  493. package/src/useRichTextEditorUpdates.tsx +403 -0
  494. package/src/useViewerAtoms.tsx +427 -0
@@ -0,0 +1,203 @@
1
+ package com.apollohg.editor
2
+
3
+ import org.json.JSONArray
4
+ import org.json.JSONObject
5
+
6
+ internal sealed interface SelectionSyncOutcome {
7
+ object Ok : SelectionSyncOutcome
8
+ data class Refreshed(val updateJson: String) : SelectionSyncOutcome
9
+ object Failed : SelectionSyncOutcome
10
+ }
11
+
12
+ internal fun EditorV2Adapter.clampScalar(scalar: Int): Int {
13
+ val extent = cachedScalarLength ?: return scalar
14
+ return scalar.coerceIn(0, extent)
15
+ }
16
+
17
+ internal fun EditorV2Adapter.selectAtomNode(docPos: Int): String? {
18
+ val selection = JSONObject().put("type", "atom").put("docPos", docPos).put("edge", "node")
19
+ return when (
20
+ val result = callWithEnvelope(JSONObject().put("selection", selection)) {
21
+ backend.setSelection(editorId, it)
22
+ }
23
+ ) {
24
+ is EditorV2CallResult.Err -> handleMutationError(result.error)
25
+
26
+ is EditorV2CallResult.Ok -> {
27
+ invalidateCachedAtomicState(null)
28
+ recoverNativeRender()
29
+ }
30
+ }
31
+ }
32
+
33
+ internal fun EditorV2Adapter.invalidateCachedAtomicState(selection: IntArray?) {
34
+ cachedAuthoritativeScalarSelection = selection?.copyOf()
35
+ cachedScalarLength = null
36
+ cachedActiveState = null
37
+ cachedHistoryState = null
38
+ cachedViewUpdateJson = null
39
+ cachedAtomicRenderJson = null
40
+ cachedAtomicRenderDocumentRevision = null
41
+ }
42
+
43
+ internal fun EditorV2Adapter.ensureSelection(anchor: Int, head: Int): SelectionSyncOutcome {
44
+ val clampedAnchor = clampScalar(anchor)
45
+ val clampedHead = clampScalar(head)
46
+ val last = lastSyncedScalarSelection
47
+ if (last != null && last[0] == clampedAnchor && last[1] == clampedHead) {
48
+ return SelectionSyncOutcome.Ok
49
+ }
50
+ // Affinity policy mirrors the engine's own cursor resolution: a
51
+ // collapsed caret prefers After with a deterministic Before fallback
52
+ // at text-boundary positions; a range uses Before. The fallback
53
+ // changes only the stickiness of the SAME position.
54
+ val collapsed = clampedAnchor == clampedHead
55
+ var result = callWithEnvelope(
56
+ selectionEnvelope(clampedAnchor, clampedHead, if (collapsed) "after" else "before")
57
+ ) { requestJson ->
58
+ backend.setSelection(editorId, requestJson)
59
+ }
60
+ if (collapsed &&
61
+ result is EditorV2CallResult.Err &&
62
+ result.error.code == "POSITION_INVALID"
63
+ ) {
64
+ result =
65
+ callWithEnvelope(
66
+ selectionEnvelope(clampedAnchor, clampedHead, "before")
67
+ ) { requestJson ->
68
+ backend.setSelection(editorId, requestJson)
69
+ }
70
+ }
71
+ return when (result) {
72
+ is EditorV2CallResult.Ok -> {
73
+ parseMutationOutcome(result.value)?.let { outcome ->
74
+ if (outcome is MutationOutcome.Transaction) {
75
+ baseDocumentRevision = outcome.revision
76
+ }
77
+ }
78
+ val synchronizedSelection = intArrayOf(clampedAnchor, clampedHead)
79
+ lastSyncedScalarSelection = synchronizedSelection
80
+ cachedAuthoritativeScalarSelection = synchronizedSelection.copyOf()
81
+ // Selection changes can affect active state and state revision,
82
+ // but retain the last atomic history result until a document
83
+ // mutation supplies its next locked snapshot.
84
+ cachedActiveState = null
85
+ cachedViewUpdateJson = null
86
+ cachedAtomicRenderJson = null
87
+ cachedAtomicRenderDocumentRevision = null
88
+ SelectionSyncOutcome.Ok
89
+ }
90
+
91
+ is EditorV2CallResult.Err -> {
92
+ if (result.error.code == "REVISION_MISMATCH") {
93
+ val update = refreshInternal(null, stripViewSelection = false)
94
+ if (update != null) {
95
+ SelectionSyncOutcome.Refreshed(update)
96
+ } else {
97
+ SelectionSyncOutcome.Failed
98
+ }
99
+ } else {
100
+ emit(result.error)
101
+ SelectionSyncOutcome.Failed
102
+ }
103
+ }
104
+ }
105
+ }
106
+
107
+ internal fun EditorV2Adapter.textDocumentSelection(updateJson: String): IntArray? {
108
+ return try {
109
+ val selection = JSONObject(updateJson).getJSONObject("selection")
110
+ if (selection.optString("type") != "text") return null
111
+ intArrayOf(
112
+ scalarField(selection, "anchor") ?: return null,
113
+ scalarField(selection, "head") ?: return null
114
+ )
115
+ } catch (error: Exception) {
116
+ null
117
+ }
118
+ }
119
+
120
+ internal fun EditorV2Adapter.resolveSelectionMapping(anchor: Int, head: Int): IntArray? {
121
+ // Engine-authoritative scalar→doc selection mapping for the delegate
122
+ // callback's doc positions (v2 accessor).
123
+ val resolved = when (val result = backend.resolveScalarSelection(editorId, anchor, head)) {
124
+ is EditorV2CallResult.Err -> {
125
+ debugNotes.add("resolveScalarSelection ${result.error.domain}/${result.error.code}")
126
+ return null
127
+ }
128
+
129
+ is EditorV2CallResult.Ok -> result.value
130
+ }
131
+ return try {
132
+ val selection = JSONObject(resolved)
133
+ intArrayOf(
134
+ scalarField(selection, "anchor") ?: return null,
135
+ scalarField(selection, "head") ?: return null
136
+ )
137
+ } catch (error: Exception) {
138
+ null
139
+ }
140
+ }
141
+
142
+ internal fun EditorV2Adapter.publishCachedCollaborationSelection() {
143
+ if (!roomBound) return
144
+ val selection = cachedAuthoritativeScalarSelection ?: return
145
+ val mapping = resolveSelectionMapping(selection[0], selection[1]) ?: return
146
+ publishCollaborationSelection(mapping[0], mapping[1])
147
+ }
148
+
149
+ internal fun EditorV2Adapter.publishCollaborationSelection(docAnchor: Int, docHead: Int) {
150
+ if (!roomBound) return
151
+ val selectionJson = JSONObject()
152
+ .put("type", "text")
153
+ .put("anchor", docAnchor)
154
+ .put("head", docHead)
155
+ .toString()
156
+ when (
157
+ val result = backend.collaborationSetAwarenessSelection(
158
+ editorId,
159
+ selectionJson
160
+ )
161
+ ) {
162
+ is EditorV2CallResult.Err -> emit(result.error)
163
+
164
+ is EditorV2CallResult.Ok -> {
165
+ val outboundChanged = try {
166
+ val value = JSONObject(result.value)
167
+ if (value.length() != 1 ||
168
+ !value.has("outboundChanged") ||
169
+ value.opt("outboundChanged") !is Boolean
170
+ ) {
171
+ null
172
+ } else {
173
+ value.getBoolean("outboundChanged")
174
+ }
175
+ } catch (error: Exception) {
176
+ null
177
+ }
178
+ if (outboundChanged == null) {
179
+ emit(
180
+ EditorV2Adapter.contractError(
181
+ "awareness selection result violates the frozen shape"
182
+ )
183
+ )
184
+ } else if (outboundChanged) {
185
+ collaborationWake(editorId, CollaborationWakeReason.AWARENESS)
186
+ }
187
+ }
188
+ }
189
+ }
190
+
191
+ internal fun EditorV2Adapter.mapPosition(result: EditorV2CallResult<String>, key: String): Int? =
192
+ when (result) {
193
+ is EditorV2CallResult.Err -> {
194
+ emit(result.error)
195
+ null
196
+ }
197
+
198
+ is EditorV2CallResult.Ok -> try {
199
+ scalarField(JSONObject(result.value), key)
200
+ } catch (error: Exception) {
201
+ null
202
+ }
203
+ }
@@ -0,0 +1,120 @@
1
+ package com.apollohg.editor
2
+
3
+ /**
4
+ * The v2 backend contract: the v2 engine verbs plus the v2
5
+ * render/selection/position accessor. The production implementation
6
+ * (`UniffiEditorV2Backend`) calls the real `editorV2*` UniFFI entries;
7
+ * tests substitute `FakeEditorV2Backend`.
8
+ */
9
+ internal data class EditorV2Error(
10
+ val domain: String,
11
+ val code: String,
12
+ val message: String,
13
+ val requestId: String? = null,
14
+ val operationIndex: String? = null,
15
+ val limit: String? = null,
16
+ val actual: String? = null,
17
+ val detailsJson: String? = null
18
+ )
19
+
20
+ internal sealed interface EditorV2CallResult<out T> {
21
+ data class Ok<T>(val value: T) : EditorV2CallResult<T>
22
+ data class Err(val error: EditorV2Error) : EditorV2CallResult<Nothing>
23
+ }
24
+
25
+ internal data class EditorV2OutboundLease(val leaseId: String, val frame: ByteArray)
26
+
27
+ internal sealed interface EditorV2LeaseResult {
28
+ data class Value(val lease: EditorV2OutboundLease) : EditorV2LeaseResult
29
+ data object Empty : EditorV2LeaseResult
30
+ data class Err(val error: EditorV2Error) : EditorV2LeaseResult
31
+ }
32
+
33
+ internal interface EditorV2Backend {
34
+ fun create(configJson: String, snapshotState: ByteArray?): EditorV2CallResult<String>
35
+ fun destroy(editorId: String): EditorV2Error?
36
+ fun getState(editorId: String): EditorV2CallResult<String>
37
+ fun getDocumentJson(editorId: String): EditorV2CallResult<String>
38
+ fun getDocumentHtml(editorId: String): EditorV2CallResult<String>
39
+ fun getContentSnapshot(editorId: String): EditorV2CallResult<String>
40
+ fun applyInput(editorId: String, requestJson: String): EditorV2CallResult<String>
41
+ fun applyCommand(editorId: String, requestJson: String): EditorV2CallResult<String>
42
+ fun applyLocalApi(editorId: String, requestJson: String): EditorV2CallResult<String>
43
+ fun replaceDocument(editorId: String, requestJson: String): EditorV2CallResult<String>
44
+ fun setSelection(editorId: String, requestJson: String): EditorV2CallResult<String>
45
+ fun undo(editorId: String, requestJson: String): EditorV2CallResult<String>
46
+ fun redo(editorId: String, requestJson: String): EditorV2CallResult<String>
47
+ fun collaborationDrive(editorId: String, nowMillis: String): EditorV2CallResult<String>
48
+ fun collaborationSocketOpen(
49
+ editorId: String,
50
+ generation: String,
51
+ nowMillis: String
52
+ ): EditorV2CallResult<String>
53
+ fun collaborationReceive(
54
+ editorId: String,
55
+ generation: String,
56
+ message: ByteArray,
57
+ nowMillis: String
58
+ ): EditorV2CallResult<String>
59
+ fun collaborationSocketClose(
60
+ editorId: String,
61
+ generation: String,
62
+ code: UInt?,
63
+ reason: String?,
64
+ nowMillis: String
65
+ ): EditorV2CallResult<String>
66
+ fun collaborationLeaseOutbound(editorId: String, generation: String): EditorV2LeaseResult
67
+ fun collaborationAckOutbound(
68
+ editorId: String,
69
+ generation: String,
70
+ leaseId: String
71
+ ): EditorV2CallResult<String>
72
+ fun collaborationNackOutbound(
73
+ editorId: String,
74
+ generation: String,
75
+ leaseId: String
76
+ ): EditorV2CallResult<String>
77
+ fun collaborationDetach(editorId: String): EditorV2Error?
78
+ fun collaborationReattach(editorId: String): EditorV2Error?
79
+ fun collaborationPeers(editorId: String): EditorV2CallResult<String>
80
+ fun collaborationSetAwarenessSelection(
81
+ editorId: String,
82
+ selectionJson: String
83
+ ): EditorV2CallResult<String>
84
+ fun snapshotExport(editorId: String): EditorV2CallResult<Pair<String, ByteArray>>
85
+
86
+ /**
87
+ * The v2 render accessor: from the LIVE v2 session produce the
88
+ * complete locked atomic snapshot: render blocks/patch, selection,
89
+ * active/history state, canonical document/state revisions, and scalar
90
+ * extent. The adapter must parse and adopt this one result as-is; it
91
+ * must never stitch it to a separate `getState` response.
92
+ */
93
+ fun renderUpdate(
94
+ editorId: String,
95
+ mirrorAnchor: Int?,
96
+ mirrorHead: Int?
97
+ ): EditorV2CallResult<String>
98
+ fun renderNative(
99
+ editorId: String,
100
+ ownerId: String,
101
+ mirrorAnchor: Int?,
102
+ mirrorHead: Int?
103
+ ): EditorV2CallResult<String>
104
+ fun pinPositionEpoch(
105
+ editorId: String,
106
+ ownerId: String,
107
+ documentRevision: String
108
+ ): EditorV2CallResult<String>
109
+ fun applyNativeIntent(editorId: String, requestJson: String): EditorV2CallResult<String>
110
+ fun releaseNativeBinding(editorId: String, ownerId: String): EditorV2Error?
111
+
112
+ /** Engine-authoritative scalar→doc selection resolution for one session. */
113
+ fun resolveScalarSelection(editorId: String, anchor: Int, head: Int): EditorV2CallResult<String>
114
+
115
+ /** Lenient doc→scalar mapping (clamps at the document extent). */
116
+ fun docToScalar(editorId: String, docPos: Int): EditorV2CallResult<String>
117
+
118
+ /** Lenient scalar→doc mapping (clamps at the document extent). */
119
+ fun scalarToDoc(editorId: String, scalar: Int): EditorV2CallResult<String>
120
+ }
@@ -0,0 +1,87 @@
1
+ package com.apollohg.editor
2
+
3
+ /**
4
+ * Render returned by a block-split request. A refresh-only render keeps the
5
+ * native view coherent but must not be treated as a locally committed split.
6
+ */
7
+ internal data class EditorV2SplitRender(val updateJson: String, val committed: Boolean)
8
+
9
+ internal data class EditorV2SelectionSync(
10
+ val docAnchor: Int,
11
+ val docHead: Int,
12
+ val refreshedUpdateJson: String?
13
+ )
14
+
15
+ internal data class EditorV2NativeMutationRender(
16
+ val updateJson: String,
17
+ val changed: Boolean,
18
+ val documentChanged: Boolean
19
+ )
20
+
21
+ internal sealed interface EditorV2NativeIntentResult {
22
+ data class Applied(val render: EditorV2NativeMutationRender) : EditorV2NativeIntentResult
23
+ data class Recovered(val updateJson: String) : EditorV2NativeIntentResult
24
+ data object Rejected : EditorV2NativeIntentResult
25
+ }
26
+
27
+ /**
28
+ * The v2 driver: the ONLY engine path for views.
29
+ *
30
+ * The views call this interface for every engine interaction; the legacy
31
+ * UniFFI free functions are gone. `EditorV2Adapter` supplies the
32
+ * implementation, whose typed v2 transactions/results are the only engine
33
+ * traffic for paired editors.
34
+ */
35
+ internal interface EditorV2Driver {
36
+ fun insertText(text: String, atScalarPos: Int): String?
37
+ fun replaceTextRange(scalarFrom: Int, scalarTo: Int, text: String): String?
38
+ fun deleteScalarRange(scalarFrom: Int, scalarTo: Int): String?
39
+ fun replaceTextRangeNative(
40
+ scalarFrom: Int,
41
+ scalarTo: Int,
42
+ text: String
43
+ ): EditorV2NativeIntentResult
44
+ fun deleteScalarRangeNative(scalarFrom: Int, scalarTo: Int): EditorV2NativeIntentResult
45
+ fun deleteBackwardAtSelection(anchor: Int, head: Int): String?
46
+ fun splitBlockAt(scalarPos: Int): EditorV2SplitRender?
47
+ fun deleteAndSplit(scalarFrom: Int, scalarTo: Int): EditorV2SplitRender?
48
+ fun moveSelection(anchor: Int, head: Int, destination: Int): String?
49
+
50
+ fun insertNode(nodeType: String, anchor: Int, head: Int): String?
51
+ fun insertContentHtmlAtSelection(html: String, anchor: Int, head: Int): String?
52
+ fun insertContentJsonAtSelection(json: String, anchor: Int, head: Int): String?
53
+ fun toggleMark(markName: String, anchor: Int, head: Int): String?
54
+ fun setMark(markName: String, attrsJson: String, anchor: Int, head: Int): String?
55
+ fun unsetMark(markName: String, anchor: Int, head: Int): String?
56
+ fun toggleHeading(level: Int, anchor: Int, head: Int): String?
57
+ fun toggleCodeBlock(anchor: Int, head: Int): String?
58
+ fun toggleBlockquote(anchor: Int, head: Int): String?
59
+ fun wrapInList(listType: String, anchor: Int, head: Int): String?
60
+ fun unwrapFromList(anchor: Int, head: Int): String?
61
+ fun indentListItem(anchor: Int, head: Int): String?
62
+ fun outdentListItem(anchor: Int, head: Int): String?
63
+ fun toggleTaskItemCheckedAtSelection(anchor: Int, head: Int): String?
64
+ fun resizeImageAtDocPos(docPos: Int, width: Int, height: Int): String?
65
+
66
+ fun undo(): String?
67
+ fun redo(): String?
68
+
69
+ fun syncSelection(anchor: Int, head: Int): EditorV2SelectionSync?
70
+ fun syncSelectionQuiet(anchor: Int, head: Int): String?
71
+ fun scalarPositionForDoc(docPos: Int): Int?
72
+ fun docPositionForScalar(scalar: Int): Int?
73
+
74
+ fun currentStateJson(): String?
75
+ fun documentHtml(): String?
76
+ fun documentJson(): String?
77
+ fun contentSnapshotJson(): String?
78
+ fun historyCanUndo(): Boolean?
79
+ fun historyCanRedo(): Boolean?
80
+ fun selectionJson(): String?
81
+
82
+ fun setContentHtml(html: String): String?
83
+ fun setContentJson(json: String): String?
84
+
85
+ /** Stale-revision recovery: refresh from Rust state, never retry the failed op. */
86
+ fun refreshFromRustState(mirrorSelection: IntArray?): String?
87
+ }
@@ -0,0 +1,97 @@
1
+ package com.apollohg.editor
2
+
3
+ import java.util.concurrent.ConcurrentHashMap
4
+ import java.util.concurrent.atomic.AtomicLong
5
+
6
+ internal enum class EditorV2DestroyReservationResult {
7
+ RESERVED,
8
+ ALREADY_IN_PROGRESS
9
+ }
10
+
11
+ internal fun <T> invokeDestroyTestingHook(hook: ((T) -> Unit)?, value: T) {
12
+ try {
13
+ hook?.invoke(value)
14
+ } catch (_: Throwable) {
15
+ // Destroy test hooks are observational and cannot alter the transaction.
16
+ }
17
+ }
18
+
19
+ /**
20
+ * The v2 pairing registry keeps the public editor handle as its canonical
21
+ * decimal string. A separate, opaque view token exists only for the Android
22
+ * widget lifecycle; it never crosses the JS/native or native/Rust boundary.
23
+ */
24
+ internal object EditorV2Registry {
25
+ private data class Pairing(
26
+ val handle: String,
27
+ val viewToken: Long,
28
+ val adapter: EditorV2Adapter
29
+ )
30
+
31
+ private val pairingsByHandle = ConcurrentHashMap<String, Pairing>()
32
+ private val pairingsByViewToken = ConcurrentHashMap<Long, Pairing>()
33
+ private val destroyingHandles = ConcurrentHashMap.newKeySet<String>()
34
+ private val nextViewToken = AtomicLong(0)
35
+
36
+ @Volatile
37
+ internal var onHandleDestroyReservationAcquiredForTesting: ((String) -> Unit)? = null
38
+
39
+ @Volatile
40
+ internal var onDestroyFfiResultReceivedForTesting: ((String) -> Unit)? = null
41
+
42
+ @Volatile
43
+ internal var onPairRemovedBeforeDestroyFinalizationForTesting: ((String) -> Unit)? = null
44
+
45
+ fun register(adapter: EditorV2Adapter): Long {
46
+ val token = nextViewToken.incrementAndGet()
47
+ check(token > 0L) { "native editor view token overflow" }
48
+ val pairing = Pairing(adapter.editorId, token, adapter)
49
+ pairingsByHandle[adapter.editorId] = pairing
50
+ pairingsByViewToken[token] = pairing
51
+ return token
52
+ }
53
+
54
+ fun viewTokenForHandle(handle: String): Long? = pairingsByHandle[handle]?.viewToken
55
+
56
+ /**
57
+ * The public v2 handle owns the destroy transaction. It is deliberately
58
+ * separate from the mutable pairing so contenders still observe the
59
+ * transaction after the owner has removed that pairing.
60
+ */
61
+ fun acquireHandleDestroyReservation(handle: String): EditorV2DestroyReservationResult {
62
+ if (!destroyingHandles.add(handle)) {
63
+ return EditorV2DestroyReservationResult.ALREADY_IN_PROGRESS
64
+ }
65
+ invokeDestroyTestingHook(onHandleDestroyReservationAcquiredForTesting, handle)
66
+ return EditorV2DestroyReservationResult.RESERVED
67
+ }
68
+
69
+ fun releaseHandleDestroyReservation(handle: String) {
70
+ destroyingHandles.remove(handle)
71
+ }
72
+
73
+ internal fun isHandleDestroyReservedForTesting(handle: String): Boolean =
74
+ destroyingHandles.contains(handle)
75
+
76
+ fun adapterForViewToken(viewToken: Long): EditorV2Adapter? =
77
+ pairingsByViewToken[viewToken]?.adapter
78
+
79
+ fun handleForViewToken(viewToken: Long): String? = pairingsByViewToken[viewToken]?.handle
80
+
81
+ /** Cancel view-owned callbacks without releasing the pairing itself. */
82
+ fun cancelAutonomousErrorOwner(handle: String) {
83
+ pairingsByHandle[handle]?.adapter?.releaseAutonomousErrorOwner()
84
+ }
85
+
86
+ fun remove(handle: String): EditorV2Adapter? {
87
+ val pairing = pairingsByHandle.remove(handle) ?: return null
88
+ pairingsByViewToken.remove(pairing.viewToken)
89
+ pairing.adapter.releaseAutonomousErrorOwner()
90
+ return pairing.adapter
91
+ }
92
+
93
+ /** Drop a pairing after the public v2 destroy entry has handled its session. */
94
+ fun dropPair(handle: String) {
95
+ remove(handle)
96
+ }
97
+ }