@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,288 @@
1
+ import ExpoModulesCore
2
+ import UIKit
3
+
4
+ extension NativeEditorExpoView {
5
+ func refreshMentionQuery() {
6
+ guard richTextView.editorId != 0,
7
+ richTextView.textView.isFirstResponder,
8
+ let mentions = addons.mentions
9
+ else {
10
+ clearMentionQueryStateAndHidePopover()
11
+ return
12
+ }
13
+ guard prepareForInputAccessoryMutationOrRetry(.refreshMentionQuery) else { return }
14
+
15
+ guard let queryState = currentMentionQueryState(trigger: mentions.trigger) else {
16
+ emitMentionQueryChange(query: "", trigger: mentions.trigger, anchor: 0, head: 0, isActive: false)
17
+ clearMentionQueryStateAndHidePopover()
18
+ return
19
+ }
20
+
21
+ let suggestions = filteredMentionSuggestions(for: queryState, config: mentions)
22
+ mentionQueryState = queryState
23
+ accessoryToolbar.apply(mentionTheme: richTextView.textView.theme?.mentions ?? mentions.theme)
24
+ let didChangeToolbarHeight = accessoryToolbar.setMentionSuggestions(
25
+ suggestions,
26
+ trigger: mentions.trigger
27
+ )
28
+ refreshSystemAssistantToolbarIfNeeded()
29
+ if didChangeToolbarHeight,
30
+ richTextView.textView.isFirstResponder,
31
+ richTextView.textView.inputAccessoryView === accessoryToolbar {
32
+ richTextView.textView.reloadInputViews()
33
+ }
34
+ markAccessoryMutationSucceeded(.refreshMentionQuery)
35
+ emitMentionQueryChange(
36
+ query: queryState.query,
37
+ trigger: queryState.trigger,
38
+ anchor: queryState.anchor,
39
+ head: queryState.head,
40
+ isActive: true
41
+ )
42
+ }
43
+
44
+ func clearMentionQueryStateAndHidePopover() {
45
+ guard prepareForInputAccessoryMutationOrRetry(.clearMentionQueryState) else { return }
46
+ mentionQueryState = nil
47
+ let didChangeToolbarHeight = accessoryToolbar.setMentionSuggestions([])
48
+ refreshSystemAssistantToolbarIfNeeded()
49
+ if didChangeToolbarHeight,
50
+ richTextView.textView.isFirstResponder,
51
+ richTextView.textView.inputAccessoryView === accessoryToolbar {
52
+ richTextView.textView.reloadInputViews()
53
+ }
54
+ markAccessoryMutationSucceeded(.clearMentionQueryState)
55
+ }
56
+
57
+ private func emitMentionQueryChange(
58
+ query: String,
59
+ trigger: String,
60
+ anchor: UInt32,
61
+ head: UInt32,
62
+ isActive: Bool
63
+ ) {
64
+ let payload: [String: Any] = [
65
+ "type": "mentionsQueryChange",
66
+ "query": query,
67
+ "trigger": trigger,
68
+ "range": [
69
+ "anchor": Int(anchor),
70
+ "head": Int(head)
71
+ ],
72
+ "isActive": isActive
73
+ ]
74
+ guard let data = try? JSONSerialization.data(withJSONObject: payload),
75
+ let json = String(data: data, encoding: .utf8)
76
+ else {
77
+ return
78
+ }
79
+ guard json != lastMentionEventJSON else { return }
80
+ lastMentionEventJSON = json
81
+ dispatchAddonEvent(json)
82
+ }
83
+
84
+ func resolvedMentionAttrs(
85
+ trigger: String,
86
+ suggestion: NativeMentionSuggestion
87
+ ) -> [String: Any] {
88
+ var attrs = suggestion.attrs
89
+ if attrs["label"] == nil {
90
+ attrs["label"] = suggestion.label
91
+ }
92
+ if attrs["mentionSuggestionChar"] == nil {
93
+ attrs["mentionSuggestionChar"] = trigger
94
+ }
95
+ return attrs
96
+ }
97
+
98
+ func emitMentionSelect(
99
+ trigger: String,
100
+ suggestion: NativeMentionSuggestion,
101
+ attrs: [String: Any]
102
+ ) {
103
+ let payload: [String: Any] = [
104
+ "type": "mentionsSelect",
105
+ "trigger": trigger,
106
+ "suggestionKey": suggestion.key,
107
+ "attrs": attrs
108
+ ]
109
+ guard let data = try? JSONSerialization.data(withJSONObject: payload),
110
+ let json = String(data: data, encoding: .utf8)
111
+ else {
112
+ return
113
+ }
114
+ dispatchAddonEvent(json)
115
+ }
116
+
117
+ func emitMentionSelectRequest(
118
+ trigger: String,
119
+ suggestion: NativeMentionSuggestion,
120
+ attrs: [String: Any],
121
+ range: MentionQueryState,
122
+ preflightUpdateJSON: String? = nil
123
+ ) {
124
+ var payload: [String: Any] = [
125
+ "type": "mentionsSelectRequest",
126
+ "trigger": trigger,
127
+ "suggestionKey": suggestion.key,
128
+ "attrs": attrs,
129
+ "range": [
130
+ "anchor": Int(range.anchor),
131
+ "head": Int(range.head)
132
+ ]
133
+ ]
134
+ if let preflightUpdateJSON {
135
+ payload["updateJson"] = preflightUpdateJSON
136
+ }
137
+ if let documentVersion = documentVersion(fromUpdateJSON: preflightUpdateJSON) {
138
+ payload["documentVersion"] = documentVersion
139
+ }
140
+ guard let data = try? JSONSerialization.data(withJSONObject: payload),
141
+ let json = String(data: data, encoding: .utf8)
142
+ else {
143
+ return
144
+ }
145
+ dispatchAddonEvent(json)
146
+ }
147
+
148
+ private func dispatchAddonEvent(_ json: String) {
149
+ let originatingEditorId = richTextView.editorId
150
+ lastAddonEventJSONForTestingValue = json
151
+ guard let event = Self.editorScopedEventPayload(
152
+ ["eventJson": json],
153
+ originatingEditorId: originatingEditorId
154
+ ) else { return }
155
+ onAddonEvent(event)
156
+ }
157
+
158
+ func isSupersededEditorUpdate(_ updateJSON: String) -> Bool {
159
+ guard let rendered = renderedRevision,
160
+ let incoming = renderRevision(fromUpdateJSON: updateJSON)
161
+ else {
162
+ return false
163
+ }
164
+ if incoming.document != rendered.document {
165
+ return incoming.document < rendered.document
166
+ }
167
+ return incoming.state < rendered.state
168
+ }
169
+
170
+ func renderRevision(
171
+ fromUpdateJSON updateJSON: String
172
+ ) -> (document: UInt64, state: UInt64)? {
173
+ guard let data = updateJSON.data(using: .utf8),
174
+ let raw = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
175
+ let document = (raw["documentVersion"] as? String)
176
+ .flatMap(v2CanonicalUInt64String)
177
+ .flatMap(UInt64.init),
178
+ let state = (raw["stateRevision"] as? String)
179
+ .flatMap(v2CanonicalUInt64String)
180
+ .flatMap(UInt64.init)
181
+ else {
182
+ return nil
183
+ }
184
+ return (document: document, state: state)
185
+ }
186
+
187
+ func documentVersion(fromUpdateJSON updateJSON: String?) -> String? {
188
+ guard let updateJSON,
189
+ let data = updateJSON.data(using: .utf8),
190
+ let raw = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
191
+ else {
192
+ return nil
193
+ }
194
+ return (raw["documentVersion"] as? String).flatMap(v2CanonicalUInt64String)
195
+ }
196
+
197
+ func filteredMentionSuggestions(
198
+ for queryState: MentionQueryState,
199
+ config: NativeMentionsAddonConfig
200
+ ) -> [NativeMentionSuggestion] {
201
+ let query = queryState.query.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
202
+ guard !query.isEmpty else {
203
+ return config.suggestions
204
+ }
205
+
206
+ return config.suggestions.filter { suggestion in
207
+ suggestion.title.lowercased().contains(query)
208
+ || suggestion.label.lowercased().contains(query)
209
+ || (suggestion.subtitle?.lowercased().contains(query) ?? false)
210
+ }
211
+ }
212
+
213
+ func currentMentionQueryState(trigger: String) -> MentionQueryState? {
214
+ guard let selectedTextRange = richTextView.textView.selectedTextRange,
215
+ selectedTextRange.isEmpty
216
+ else {
217
+ return nil
218
+ }
219
+
220
+ let currentText = richTextView.textView.text ?? ""
221
+ let cursorUtf16Offset = richTextView.textView.offset(
222
+ from: richTextView.textView.beginningOfDocument,
223
+ to: selectedTextRange.start
224
+ )
225
+ let visibleCursorScalar = PositionBridge.utf16OffsetToScalar(
226
+ cursorUtf16Offset,
227
+ in: currentText
228
+ )
229
+
230
+ guard let visibleQueryState = resolveMentionQueryState(
231
+ in: currentText,
232
+ cursorScalar: visibleCursorScalar,
233
+ trigger: trigger,
234
+ isCaretInsideMention: isCaretInsideMention(
235
+ cursorScalar: PositionBridge.textViewToScalar(
236
+ selectedTextRange.start,
237
+ in: richTextView.textView
238
+ )
239
+ )
240
+ ) else {
241
+ return nil
242
+ }
243
+
244
+ let anchorUtf16Offset = PositionBridge.scalarToUtf16Offset(
245
+ visibleQueryState.anchor,
246
+ in: currentText
247
+ )
248
+ let headUtf16Offset = PositionBridge.scalarToUtf16Offset(
249
+ visibleQueryState.head,
250
+ in: currentText
251
+ )
252
+
253
+ return MentionQueryState(
254
+ query: visibleQueryState.query,
255
+ trigger: visibleQueryState.trigger,
256
+ anchor: PositionBridge.utf16OffsetToScalar(
257
+ anchorUtf16Offset,
258
+ in: richTextView.textView
259
+ ),
260
+ head: PositionBridge.utf16OffsetToScalar(
261
+ headUtf16Offset,
262
+ in: richTextView.textView
263
+ )
264
+ )
265
+ }
266
+
267
+ private func isCaretInsideMention(cursorScalar: UInt32) -> Bool {
268
+ let utf16Offset = PositionBridge.scalarToUtf16Offset(
269
+ cursorScalar,
270
+ in: richTextView.textView.text ?? ""
271
+ )
272
+ let textStorage = richTextView.textView.textStorage
273
+ guard textStorage.length > 0 else { return false }
274
+ let candidateOffsets = [
275
+ min(max(utf16Offset, 0), max(textStorage.length - 1, 0)),
276
+ min(max(utf16Offset - 1, 0), max(textStorage.length - 1, 0))
277
+ ]
278
+
279
+ for offset in candidateOffsets where offset >= 0 && offset < textStorage.length {
280
+ if let nodeType = textStorage.attribute(RenderBridgeAttributes.voidNodeType, at: offset, effectiveRange: nil) as? String,
281
+ nodeType == "mention" {
282
+ return true
283
+ }
284
+ }
285
+ return false
286
+ }
287
+
288
+ }
@@ -0,0 +1,300 @@
1
+ import ExpoModulesCore
2
+ import UIKit
3
+
4
+ extension NativeEditorExpoView {
5
+ func setThemeJson(_ themeJson: String?) {
6
+ desiredThemeJSON = themeJson
7
+ guard lastThemeJSON != themeJson else {
8
+ clearPendingThemeRetry()
9
+ return
10
+ }
11
+ let theme = EditorTheme.from(json: themeJson)
12
+ guard imageLoadOwner.withCurrent({ richTextView.applyTheme(theme) }) else {
13
+ scheduleThemeRetry(themeJson)
14
+ return
15
+ }
16
+ lastThemeJSON = themeJson
17
+ clearPendingThemeRetry()
18
+ accessoryToolbar.apply(theme: theme?.toolbar)
19
+ accessoryToolbar.apply(mentionTheme: theme?.mentions ?? addons.mentions?.theme)
20
+ refreshSystemAssistantToolbarIfNeeded()
21
+ if richTextView.textView.isFirstResponder,
22
+ richTextView.textView.inputAccessoryView === accessoryToolbar || shouldUseSystemAssistantToolbar {
23
+ reloadInputViewsAfterPreparingOrRetry()
24
+ }
25
+ }
26
+
27
+ func hasActiveMentionQueryForCurrentAddons() -> Bool {
28
+ guard richTextView.editorId != 0,
29
+ richTextView.textView.isFirstResponder,
30
+ let mentions = addons.mentions
31
+ else {
32
+ return false
33
+ }
34
+ return currentMentionQueryState(trigger: mentions.trigger) != nil
35
+ }
36
+
37
+ func setAddonsJson(_ addonsJson: String?) {
38
+ guard lastAddonsJSON != addonsJson else { return }
39
+ lastAddonsJSON = addonsJson
40
+ addons = NativeEditorAddons.from(json: addonsJson)
41
+ richTextView.textView.onCodeHighlightingError = { [weak self] error in
42
+ self?.onEditorError(["domain": "addon", "code": "CODE_HIGHLIGHTING_FAILED", "message": error.localizedDescription])
43
+ }
44
+ richTextView.textView.codeHighlighting = addons.codeHighlighting
45
+ accessoryToolbar.apply(mentionTheme: richTextView.textView.theme?.mentions ?? addons.mentions?.theme)
46
+ refreshMentionQuery()
47
+ }
48
+
49
+ func setAtomsJson(_ atomsJson: String?) {
50
+ if desiredAtomsJSON != atomsJson {
51
+ clearPendingAtomsRetry()
52
+ }
53
+ desiredAtomsJSON = atomsJson
54
+ guard lastAtomsJSON != atomsJson else {
55
+ clearPendingAtomsRetry()
56
+ return
57
+ }
58
+ let configuration = AtomRenderConfiguration.from(json: atomsJson)
59
+ guard !blockAtomConfigurationApplyForTesting,
60
+ richTextView.applyAtomRenderConfiguration(configuration)
61
+ else {
62
+ scheduleAtomsRetry(atomsJson)
63
+ return
64
+ }
65
+ lastAtomsJSON = atomsJson
66
+ clearPendingAtomsRetry()
67
+ }
68
+
69
+ func setImageLoadingPolicyJson(_ json: String?) {
70
+ let policy = ImageLoadingPolicy.from(json: json)
71
+ guard policy != imageLoadOwner.policy else { return }
72
+ imageLoadOwner.updatePolicy(policy)
73
+ richTextView.textView.imageLoadingPolicyDidChange()
74
+ guard richTextView.editorId != 0 else { return }
75
+ imageLoadOwner.withCurrent {
76
+ _ = richTextView.textView.applyUpdateJSON(
77
+ EditorV2Shadow.getCurrentState(id: richTextView.editorId),
78
+ notifyDelegate: false
79
+ )
80
+ }
81
+ }
82
+
83
+ func setRemoteSelectionsJson(_ remoteSelectionsJson: String?) {
84
+ guard lastRemoteSelectionsJSON != remoteSelectionsJson else { return }
85
+ lastRemoteSelectionsJSON = remoteSelectionsJson
86
+ richTextView.setRemoteSelections(RemoteSelectionDecoration.from(json: remoteSelectionsJson))
87
+ }
88
+
89
+ func setEditable(_ editable: Bool) {
90
+ if !editable, richTextView.textView.isEditable {
91
+ richTextView.textView.cancelExternalTextCompositionForLifecycleIfNeeded()
92
+ }
93
+ if !editable,
94
+ richTextView.textView.isEditable,
95
+ richTextView.editorId != 0,
96
+ !richTextView.textView.prepareForExternalEditorUpdate() {
97
+ scheduleEditableRetry(editable)
98
+ return
99
+ }
100
+ pendingEditableRetryValue = nil
101
+ pendingEditableRetryEditorId = nil
102
+ pendingEditableRetryScheduled = false
103
+ richTextView.textView.isEditable = editable
104
+ updateAccessoryToolbarVisibility()
105
+ }
106
+
107
+ func setAccessibilityLabel(_ label: String?) {
108
+ richTextView.textView.accessibilityLabel = label
109
+ }
110
+
111
+ func setAccessibilityHint(_ hint: String?) {
112
+ richTextView.textView.accessibilityHint = hint
113
+ }
114
+
115
+ private func scheduleEditableRetry(_ editable: Bool) {
116
+ pendingEditableRetryValue = editable
117
+ pendingEditableRetryEditorId = richTextView.editorId
118
+ guard !pendingEditableRetryScheduled else { return }
119
+ pendingEditableRetryScheduled = true
120
+ pendingEditableRetryGeneration &+= 1
121
+ let retryGeneration = pendingEditableRetryGeneration
122
+ DispatchQueue.main.async { [weak self] in
123
+ guard let self else { return }
124
+ guard retryGeneration == self.pendingEditableRetryGeneration else { return }
125
+ guard let pendingEditable = self.pendingEditableRetryValue else {
126
+ self.pendingEditableRetryScheduled = false
127
+ return
128
+ }
129
+ guard self.pendingEditableRetryEditorId == self.richTextView.editorId else {
130
+ self.clearPendingEditableRetry()
131
+ return
132
+ }
133
+ self.pendingEditableRetryValue = nil
134
+ self.pendingEditableRetryEditorId = nil
135
+ self.pendingEditableRetryScheduled = false
136
+ self.setEditable(pendingEditable)
137
+ }
138
+ }
139
+
140
+ func setAutoFocus(_ autoFocus: Bool) {
141
+ guard autoFocus, !didApplyAutoFocus else { return }
142
+ didApplyAutoFocus = true
143
+ focus()
144
+ }
145
+
146
+ func setAutoCapitalize(_ autoCapitalize: String?) {
147
+ richTextView.textView.setAutoCapitalize(autoCapitalize)
148
+ }
149
+
150
+ func setAutoCorrect(_ autoCorrect: Bool?) {
151
+ richTextView.textView.setAutoCorrect(autoCorrect)
152
+ }
153
+
154
+ func setKeyboardType(_ keyboardType: String?) {
155
+ richTextView.textView.setKeyboardType(keyboardType)
156
+ }
157
+
158
+ func setShowToolbar(_ showToolbar: Bool) {
159
+ showsToolbar = showToolbar
160
+ updateAccessoryToolbarVisibility()
161
+ }
162
+
163
+ func setToolbarPlacement(_ toolbarPlacement: String?) {
164
+ self.toolbarPlacement = toolbarPlacement == "inline" ? "inline" : "keyboard"
165
+ updateAccessoryToolbarVisibility()
166
+ }
167
+
168
+ func setHeightBehavior(_ rawHeightBehavior: String) {
169
+ let nextBehavior = EditorHeightBehavior(rawValue: rawHeightBehavior) ?? .fixed
170
+ guard nextBehavior != heightBehavior else { return }
171
+ heightBehavior = nextBehavior
172
+ if nextBehavior != .autoGrow {
173
+ cachedAutoGrowContentHeight = 0
174
+ publishAutoGrowStyleHeight(nil)
175
+ }
176
+ richTextView.heightBehavior = nextBehavior
177
+ invalidateIntrinsicContentSize()
178
+ setNeedsLayout()
179
+ if nextBehavior == .autoGrow {
180
+ emitContentHeightIfNeeded(force: true)
181
+ DispatchQueue.main.async { [weak self] in
182
+ guard let self, self.heightBehavior == .autoGrow else { return }
183
+ self.setNeedsLayout()
184
+ self.layoutIfNeeded()
185
+ let measuredHeight = self.richTextView.remeasureAutoGrowHeight()
186
+ guard measuredHeight > 0 else { return }
187
+ self.cachedAutoGrowContentHeight = measuredHeight
188
+ self.invalidateIntrinsicContentSize()
189
+ self.emitContentHeightIfNeeded(force: true, measuredHeight: measuredHeight)
190
+ }
191
+ }
192
+ }
193
+
194
+ func setAllowImageResizing(_ allowImageResizing: Bool) {
195
+ richTextView.allowImageResizing = allowImageResizing
196
+ }
197
+
198
+ func emitContentHeightIfNeeded(force: Bool = false, measuredHeight: CGFloat? = nil) {
199
+ let originatingEditorId = richTextView.editorId
200
+ guard heightBehavior == .autoGrow else { return }
201
+ let resolvedHeight = measuredHeight
202
+ ?? (cachedAutoGrowContentHeight > 0 ? cachedAutoGrowContentHeight : richTextView.intrinsicContentSize.height)
203
+ let contentHeight = ceil(resolvedHeight)
204
+ guard contentHeight > 0 else { return }
205
+ publishAutoGrowStyleHeight(contentHeight)
206
+ guard force || abs(contentHeight - lastEmittedContentHeight) > 0.5 else { return }
207
+ cachedAutoGrowContentHeight = contentHeight
208
+ lastEmittedContentHeight = contentHeight
209
+ guard let event = Self.editorScopedEventPayload(
210
+ ["contentHeight": contentHeight],
211
+ originatingEditorId: originatingEditorId
212
+ ) else { return }
213
+ onContentHeightChange(event)
214
+ }
215
+
216
+ func emitAtomLayout(width: CGFloat) {
217
+ guard let event = Self.editorScopedEventPayload(
218
+ [
219
+ "width": Double(width),
220
+ "positions": richTextView.atomLayoutPositions(),
221
+ "viewport": [
222
+ "y": Double(richTextView.textView.contentOffset.y),
223
+ "height": Double(richTextView.textView.bounds.height)
224
+ ]
225
+ ],
226
+ originatingEditorId: richTextView.editorId
227
+ ) else { return }
228
+ onAtomLayout(event)
229
+ }
230
+
231
+ static func atomKey(for view: UIView) -> String? {
232
+ let selector = NSSelectorFromString("nativeId")
233
+ let nativeId = view.responds(to: selector) ? view.value(forKey: "nativeId") as? String : nil
234
+ let identifier = nativeId ?? view.accessibilityIdentifier
235
+ let prefix = "prose-atom:"
236
+ guard let identifier,
237
+ identifier.hasPrefix(prefix),
238
+ identifier.count > prefix.count
239
+ else { return nil }
240
+ return String(identifier.dropFirst(prefix.count))
241
+ }
242
+
243
+ private func publishAutoGrowStyleHeight(_ height: CGFloat?) {
244
+ if let height {
245
+ if let lastPublishedAutoGrowHeight,
246
+ abs(height - lastPublishedAutoGrowHeight) <= Self.layoutEpsilon {
247
+ return
248
+ }
249
+ lastPublishedAutoGrowHeight = height
250
+ } else {
251
+ guard lastPublishedAutoGrowHeight != nil else { return }
252
+ lastPublishedAutoGrowHeight = nil
253
+ }
254
+ let selector = NSSelectorFromString("setStyleSize:height:")
255
+ guard responds(to: selector) else { return }
256
+ _ = perform(selector, with: nil, with: height.map { NSNumber(value: Double($0)) })
257
+ }
258
+
259
+ func setToolbarButtonsJson(_ toolbarButtonsJson: String?) {
260
+ guard lastToolbarItemsJSON != toolbarButtonsJson else { return }
261
+ lastToolbarItemsJSON = toolbarButtonsJson
262
+ toolbarItems = NativeToolbarItem.from(json: toolbarButtonsJson)
263
+ accessoryToolbar.setItems(toolbarItems)
264
+ refreshSystemAssistantToolbarIfNeeded()
265
+ }
266
+
267
+ func setToolbarFrameJson(_ toolbarFrameJson: String?) {
268
+ guard lastToolbarFrameJSON != toolbarFrameJson else { return }
269
+ lastToolbarFrameJSON = toolbarFrameJson
270
+ guard let toolbarFrameJson,
271
+ let data = toolbarFrameJson.data(using: .utf8),
272
+ let raw = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
273
+ else {
274
+ toolbarFramesInWindow = []
275
+ return
276
+ }
277
+
278
+ if let frameDictionaries = raw["frames"] as? [[String: Any]] {
279
+ toolbarFramesInWindow = frameDictionaries.compactMap(Self.toolbarFrame(from:))
280
+ return
281
+ }
282
+
283
+ toolbarFramesInWindow = Self.toolbarFrame(from: raw).map { [$0] } ?? []
284
+ }
285
+
286
+ private static func toolbarFrame(from raw: [String: Any]) -> CGRect? {
287
+ guard let x = (raw["x"] as? NSNumber)?.doubleValue,
288
+ let y = (raw["y"] as? NSNumber)?.doubleValue,
289
+ let width = (raw["width"] as? NSNumber)?.doubleValue,
290
+ let height = (raw["height"] as? NSNumber)?.doubleValue,
291
+ width > 0,
292
+ height > 0
293
+ else {
294
+ return nil
295
+ }
296
+
297
+ return CGRect(x: x, y: y, width: width, height: height)
298
+ }
299
+
300
+ }
@@ -0,0 +1,86 @@
1
+ import ExpoModulesCore
2
+ import UIKit
3
+
4
+ extension NativeEditorExpoView {
5
+ func updateAccessoryToolbarVisibility() {
6
+ guard prepareForInputAccessoryMutationOrRetry(.updateAccessoryToolbarVisibility) else { return }
7
+ refreshSystemAssistantToolbarIfNeeded()
8
+ let nextAccessoryView: UIView?
9
+ if showsToolbar &&
10
+ toolbarPlacement == "keyboard" &&
11
+ richTextView.textView.isEditable &&
12
+ !shouldUseSystemAssistantToolbar {
13
+ nextAccessoryView = accessoryToolbar
14
+ } else if richTextView.textView.isEditable && !shouldUseSystemAssistantToolbar {
15
+ nextAccessoryView = accessoryPlaceholder
16
+ } else {
17
+ nextAccessoryView = nil
18
+ }
19
+ if richTextView.textView.inputAccessoryView !== nextAccessoryView {
20
+ richTextView.textView.inputAccessoryView = nextAccessoryView
21
+ if richTextView.textView.isFirstResponder {
22
+ richTextView.textView.reloadInputViews()
23
+ }
24
+ }
25
+ markAccessoryMutationSucceeded(.updateAccessoryToolbarVisibility)
26
+ }
27
+
28
+ func refreshSystemAssistantToolbarIfNeeded() {
29
+ guard #available(iOS 26.0, *) else { return }
30
+
31
+ let assistantItem = richTextView.textView.inputAssistantItem
32
+ assistantItem.allowsHidingShortcuts = false
33
+ assistantItem.leadingBarButtonGroups = []
34
+ assistantItem.trailingBarButtonGroups = []
35
+ }
36
+
37
+ private func handleListToggle(_ listType: String) {
38
+ let isActive = toolbarState.nodes[listType] == true
39
+ richTextView.textView.performToolbarToggleList(listType, isActive: isActive)
40
+ }
41
+
42
+ func handleToolbarItemPress(_ item: NativeToolbarItem) {
43
+ let originatingEditorId = richTextView.editorId
44
+ switch item.type {
45
+ case .mark:
46
+ guard let mark = item.mark else { return }
47
+ richTextView.textView.performToolbarToggleMark(mark)
48
+ case .heading:
49
+ guard let level = item.headingLevel else { return }
50
+ richTextView.textView.performToolbarToggleHeading(level)
51
+ case .blockquote:
52
+ richTextView.textView.performToolbarToggleBlockquote()
53
+ case .list:
54
+ guard let listType = item.listType?.rawValue else { return }
55
+ handleListToggle(listType)
56
+ case .command:
57
+ switch item.command {
58
+ case .indentList:
59
+ richTextView.textView.performToolbarIndentListItem()
60
+ case .outdentList:
61
+ richTextView.textView.performToolbarOutdentListItem()
62
+ case .undo:
63
+ richTextView.textView.performToolbarUndo()
64
+ case .redo:
65
+ richTextView.textView.performToolbarRedo()
66
+ case .none:
67
+ break
68
+ }
69
+ case .node:
70
+ guard let nodeType = item.nodeType else { return }
71
+ richTextView.textView.performToolbarInsertNode(nodeType)
72
+ case .action:
73
+ guard let key = item.key else { return }
74
+ guard let event = Self.editorScopedEventPayload(
75
+ ["key": key],
76
+ originatingEditorId: originatingEditorId
77
+ ) else { return }
78
+ onToolbarAction(event)
79
+ case .group:
80
+ break
81
+ case .separator:
82
+ break
83
+ }
84
+ }
85
+
86
+ }