@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,290 @@
1
+ import os
2
+ import UIKit
3
+
4
+ extension EditorTextView {
5
+ enum LocalTextDragState {
6
+ case idle
7
+ case dragging(
8
+ session: ObjectIdentifier,
9
+ editorId: UInt64,
10
+ documentRevision: UInt64,
11
+ supported: Bool,
12
+ range: (from: UInt32, to: UInt32)
13
+ )
14
+ case awaitingUIKitCleanup(
15
+ session: ObjectIdentifier,
16
+ editorId: UInt64,
17
+ cleanupRanges: [NSRange]
18
+ )
19
+ }
20
+
21
+ func textDraggableView(
22
+ _ textDraggableView: UIView & UITextDraggable,
23
+ itemsForDrag dragRequest: UITextDragRequest
24
+ ) -> [UIDragItem] {
25
+ let requestedRange = PositionBridge.textRangeToScalarRange(
26
+ dragRequest.dragRange,
27
+ in: self
28
+ )
29
+ let range = scalarRange(for: dragRequest)
30
+ if editorId != 0,
31
+ range.from < range.to,
32
+ let documentRevision = EditorV2Shadow.documentRevision(id: editorId) {
33
+ let narrowedToVoidAttachment = !dragRequest.isSelected
34
+ && (range.from != requestedRange.from || range.to != requestedRange.to)
35
+ localTextDragState = .dragging(
36
+ session: ObjectIdentifier(dragRequest.dragSession as AnyObject),
37
+ editorId: editorId,
38
+ documentRevision: documentRevision,
39
+ supported: narrowedToVoidAttachment
40
+ || containsNoBlockBoundary(dragRequest.dragRange),
41
+ range: range
42
+ )
43
+ }
44
+ return dragRequest.suggestedItems
45
+ }
46
+
47
+ private func containsNoBlockBoundary(_ range: UITextRange) -> Bool {
48
+ let start = offset(from: beginningOfDocument, to: range.start)
49
+ let end = offset(from: beginningOfDocument, to: range.end)
50
+ guard start >= 0, end > start, end <= textStorage.length else { return false }
51
+ var containsBoundary = false
52
+ textStorage.enumerateAttribute(
53
+ RenderBridgeAttributes.blockBoundary,
54
+ in: NSRange(location: start, length: end - start)
55
+ ) { value, _, stop in
56
+ guard value != nil else { return }
57
+ containsBoundary = true
58
+ stop.pointee = true
59
+ }
60
+ return !containsBoundary
61
+ }
62
+
63
+ func scalarRange(for dragRequest: UITextDragRequest) -> (from: UInt32, to: UInt32) {
64
+ let range = PositionBridge.textRangeToScalarRange(dragRequest.dragRange, in: self)
65
+ guard !dragRequest.isSelected else { return range }
66
+
67
+ let start = offset(from: beginningOfDocument, to: dragRequest.dragRange.start)
68
+ let end = offset(from: beginningOfDocument, to: dragRequest.dragRange.end)
69
+ guard start >= 0, end > start, start < textStorage.length else { return range }
70
+ let length = min(end, textStorage.length) - start
71
+ var atomRange: (from: UInt32, to: UInt32)?
72
+ textStorage.enumerateAttribute(
73
+ .attachment,
74
+ in: NSRange(location: start, length: length)
75
+ ) { value, characterRange, stop in
76
+ guard value is NSTextAttachment,
77
+ textStorage.attribute(
78
+ RenderBridgeAttributes.voidNodeType,
79
+ at: characterRange.location,
80
+ effectiveRange: nil
81
+ ) is String
82
+ else {
83
+ return
84
+ }
85
+ let from = PositionBridge.utf16OffsetToScalar(characterRange.location, in: self)
86
+ let to = PositionBridge.utf16OffsetToScalar(NSMaxRange(characterRange), in: self)
87
+ atomRange = (from, to)
88
+ stop.pointee = true
89
+ }
90
+ return atomRange ?? range
91
+ }
92
+
93
+ func textDroppableView(
94
+ _ textDroppableView: UIView & UITextDroppable,
95
+ proposalForDrop drop: UITextDropRequest
96
+ ) -> UITextDropProposal {
97
+ guard let drag = matchingLocalTextDrag(for: drop) else {
98
+ return drop.suggestedProposal
99
+ }
100
+ let destination = PositionBridge.textViewToScalar(drop.dropPosition, in: self)
101
+ guard drag.supported,
102
+ drag.documentRevision == EditorV2Shadow.documentRevision(id: editorId),
103
+ canMove(drag.range, to: destination)
104
+ else {
105
+ return UITextDropProposal(operation: .forbidden)
106
+ }
107
+
108
+ let proposal = UITextDropProposal(operation: .move)
109
+ proposal.dropAction = .insert
110
+ proposal.dropPerformer = .delegate
111
+ proposal.dropProgressMode = .custom
112
+ proposal.useFastSameViewOperations = false
113
+ return proposal
114
+ }
115
+
116
+ func textDroppableView(
117
+ _ textDroppableView: UIView & UITextDroppable,
118
+ willPerformDrop drop: UITextDropRequest
119
+ ) {
120
+ guard let drag = matchingLocalTextDrag(for: drop) else { return }
121
+ let destination = PositionBridge.textViewToScalar(drop.dropPosition, in: self)
122
+ guard drag.supported,
123
+ drag.documentRevision == EditorV2Shadow.documentRevision(id: editorId),
124
+ canMove(drag.range, to: destination)
125
+ else {
126
+ localTextDragState = .idle
127
+ return
128
+ }
129
+ guard finishExternalTextCompositionBeforeInteractionIfNeeded() else { return }
130
+ guard flushPendingNativeTextMutationCommitIfNeeded() else { return }
131
+ guard drag.documentRevision == EditorV2Shadow.documentRevision(id: editorId) else {
132
+ localTextDragState = .idle
133
+ return
134
+ }
135
+
136
+ let sourceStartUtf16 = PositionBridge.scalarToUtf16Offset(drag.range.from, in: self)
137
+ let sourceEndUtf16 = PositionBridge.scalarToUtf16Offset(drag.range.to, in: self)
138
+ let sourceUtf16Range = NSRange(
139
+ location: sourceStartUtf16,
140
+ length: max(0, sourceEndUtf16 - sourceStartUtf16)
141
+ )
142
+
143
+ var applied = false
144
+ performInterceptedInput {
145
+ let updateJSON = EditorV2Shadow.moveSelectionAtScalar(
146
+ id: editorId,
147
+ scalarAnchor: drag.range.from,
148
+ scalarHead: drag.range.to,
149
+ destination: destination
150
+ )
151
+ applied = applyUpdateJSON(updateJSON)
152
+ }
153
+ if applied {
154
+ localTextDragState = .awaitingUIKitCleanup(
155
+ session: drag.session,
156
+ editorId: drag.editorId,
157
+ cleanupRanges: localTextDragCleanupRanges(
158
+ sourceUtf16Range: sourceUtf16Range,
159
+ sourceScalarRange: drag.range,
160
+ destination: destination
161
+ )
162
+ )
163
+ } else {
164
+ localTextDragState = .idle
165
+ }
166
+ }
167
+
168
+ func textDroppableView(
169
+ _ textDroppableView: UIView & UITextDroppable,
170
+ previewForDroppingAllItemsWithDefault defaultPreview: UITargetedDragPreview
171
+ ) -> UITargetedDragPreview? {
172
+ defaultPreview
173
+ }
174
+
175
+ func textDraggableView(
176
+ _ textDraggableView: UIView & UITextDraggable,
177
+ dragSessionDidEnd session: UIDragSession,
178
+ with operation: UIDropOperation
179
+ ) {
180
+ finishLocalTextDrag(for: session)
181
+ }
182
+
183
+ private struct LocalTextDragMatch {
184
+ let session: ObjectIdentifier
185
+ let editorId: UInt64
186
+ let documentRevision: UInt64
187
+ let supported: Bool
188
+ let range: (from: UInt32, to: UInt32)
189
+ }
190
+
191
+ private func matchingLocalTextDrag(for drop: UITextDropRequest) -> LocalTextDragMatch? {
192
+ guard drop.isSameView,
193
+ let localSession = drop.dropSession.localDragSession,
194
+ case let .dragging(
195
+ session,
196
+ sourceEditorId,
197
+ documentRevision,
198
+ supported,
199
+ range
200
+ ) = localTextDragState,
201
+ sourceEditorId == editorId,
202
+ session == ObjectIdentifier(localSession as AnyObject)
203
+ else {
204
+ return nil
205
+ }
206
+ return LocalTextDragMatch(
207
+ session: session,
208
+ editorId: sourceEditorId,
209
+ documentRevision: documentRevision,
210
+ supported: supported,
211
+ range: range
212
+ )
213
+ }
214
+
215
+ private func canMove(
216
+ _ range: (from: UInt32, to: UInt32),
217
+ to destination: UInt32
218
+ ) -> Bool {
219
+ destination < range.from || destination > range.to
220
+ }
221
+
222
+ private func finishLocalTextDrag(for session: UIDragSession) {
223
+ let sessionID = ObjectIdentifier(session as AnyObject)
224
+ guard case let .awaitingUIKitCleanup(completedSession, sourceEditorId, _) = localTextDragState,
225
+ completedSession == sessionID,
226
+ sourceEditorId == editorId
227
+ else {
228
+ if case let .dragging(activeSession, _, _, _, _) = localTextDragState,
229
+ activeSession == sessionID {
230
+ localTextDragState = .idle
231
+ }
232
+ return
233
+ }
234
+ scheduleLocalTextDragCleanup(session: sessionID, sourceEditorId: sourceEditorId)
235
+ }
236
+
237
+ private func scheduleLocalTextDragCleanup(
238
+ session: ObjectIdentifier,
239
+ sourceEditorId: UInt64
240
+ ) {
241
+ DispatchQueue.main.async { [weak self] in
242
+ guard let self,
243
+ case let .awaitingUIKitCleanup(activeSession, activeEditorId, _) = self.localTextDragState,
244
+ activeSession == session,
245
+ activeEditorId == sourceEditorId,
246
+ activeEditorId == self.editorId
247
+ else {
248
+ return
249
+ }
250
+ if self.pendingNativeTextMutation != nil || self.nativeTextMutationCommitScheduled {
251
+ _ = self.drainPendingNativeTextMutation(
252
+ allowAfterBlur: self.canAdoptNativeTextMutationAfterBlur(),
253
+ allowWhileIntercepting: true
254
+ )
255
+ }
256
+ self.localTextDragState = .idle
257
+ self.restoreAfterLocalTextDragCleanup()
258
+ }
259
+ }
260
+
261
+ func restoreAfterLocalTextDragCleanup() {
262
+ if textStorage.string != lastAuthorizedText {
263
+ _ = applyAttributedRender(
264
+ NSAttributedString(attributedString: lastAuthorizedAttributedTextStorage),
265
+ usedPatch: false,
266
+ positionCacheUpdate: .invalidate
267
+ )
268
+ }
269
+ applyUpdateJSON(
270
+ EditorV2Shadow.getCurrentState(id: editorId),
271
+ notifyDelegate: false
272
+ )
273
+ }
274
+
275
+ private func localTextDragCleanupRanges(
276
+ sourceUtf16Range: NSRange,
277
+ sourceScalarRange: (from: UInt32, to: UInt32),
278
+ destination: UInt32
279
+ ) -> [NSRange] {
280
+ var ranges = [sourceUtf16Range]
281
+ if destination < sourceScalarRange.from {
282
+ ranges.append(NSRange(
283
+ location: sourceUtf16Range.location + sourceUtf16Range.length,
284
+ length: sourceUtf16Range.length
285
+ ))
286
+ }
287
+ return ranges
288
+ }
289
+
290
+ }
@@ -0,0 +1,364 @@
1
+ import os
2
+ import UIKit
3
+
4
+ extension EditorTextView {
5
+ struct ExternalTextCompositionState {
6
+ let sessionId: String
7
+ let startingAuthorizedText: String
8
+ let startingAuthorizedAttributedText: NSAttributedString
9
+ let startingSelectedUtf16Range: NSRange
10
+ var latestText: String
11
+ }
12
+
13
+ struct ExternalTextCompositionFinish {
14
+ let resultJSON: String
15
+ let adoptedUpdateJSON: String?
16
+ let succeeded: Bool
17
+ }
18
+
19
+ func beginExternalTextComposition(sessionId: String) -> String {
20
+ guard editorId != 0,
21
+ isEditable,
22
+ let adapter = EditorV2Registry.adapter(forLegacyId: editorId),
23
+ !adapter.isDestroyed
24
+ else {
25
+ return externalCompositionErrorJSON(
26
+ sessionId: sessionId,
27
+ code: "EXTERNAL_COMPOSITION_UNAVAILABLE",
28
+ message: "The native editor is unavailable or not editable"
29
+ )
30
+ }
31
+ guard externalTextCompositionTerminalResults[sessionId] == nil else {
32
+ return externalCompositionEndedErrorJSON(sessionId: sessionId)
33
+ }
34
+ guard let selectionJSON = adapter.selectionJSON(),
35
+ let selectionData = selectionJSON.data(using: .utf8),
36
+ let selection = try? JSONSerialization.jsonObject(with: selectionData) as? [String: Any],
37
+ selection["type"] as? String == "text"
38
+ else {
39
+ return externalCompositionErrorJSON(
40
+ sessionId: sessionId,
41
+ code: "EXTERNAL_COMPOSITION_SELECTION_INCOMPATIBLE",
42
+ message: "External composition requires a text selection"
43
+ )
44
+ }
45
+
46
+ if externalTextComposition != nil {
47
+ let finished = finishExternalTextComposition(
48
+ cause: "consumer",
49
+ finalText: nil,
50
+ cancel: false
51
+ )
52
+ guard finished?.succeeded == true else {
53
+ return externalCompositionErrorJSON(
54
+ sessionId: sessionId,
55
+ code: "EXTERNAL_COMPOSITION_COMMIT_FAILED",
56
+ message: "The previous external text composition could not be committed"
57
+ )
58
+ }
59
+ } else if isComposing, !prepareForExternalEditorUpdate() {
60
+ return externalCompositionErrorJSON(
61
+ sessionId: sessionId,
62
+ code: "EXTERNAL_COMPOSITION_UNAVAILABLE",
63
+ message: "The active input composition could not be committed"
64
+ )
65
+ }
66
+ guard flushPendingNativeTextMutationCommitIfNeeded() else {
67
+ return externalCompositionErrorJSON(
68
+ sessionId: sessionId,
69
+ code: "EXTERNAL_COMPOSITION_UNAVAILABLE",
70
+ message: "Pending native input could not be committed"
71
+ )
72
+ }
73
+
74
+ let startingSelection = selectedRange.location == NSNotFound
75
+ ? NSRange(location: 0, length: 0)
76
+ : selectedRange
77
+ captureMarkedTextReplacementRangeIfNeeded()
78
+ externalTextComposition = ExternalTextCompositionState(
79
+ sessionId: sessionId,
80
+ startingAuthorizedText: lastAuthorizedText,
81
+ startingAuthorizedAttributedText: NSAttributedString(
82
+ attributedString: lastAuthorizedAttributedTextStorage
83
+ ),
84
+ startingSelectedUtf16Range: startingSelection,
85
+ latestText: ""
86
+ )
87
+ isComposing = true
88
+ return externalCompositionActiveJSON(sessionId: sessionId)
89
+ }
90
+
91
+ func updateExternalTextComposition(sessionId: String, text: String) -> String {
92
+ guard var state = externalTextComposition, state.sessionId == sessionId else {
93
+ return externalCompositionEndedErrorJSON(sessionId: sessionId)
94
+ }
95
+ performTransientTextMutation {
96
+ super.setMarkedText(
97
+ text,
98
+ selectedRange: NSRange(location: (text as NSString).length, length: 0)
99
+ )
100
+ }
101
+ state.latestText = text
102
+ externalTextComposition = state
103
+ refreshMarkedTextCompositionText(fallback: text)
104
+ refreshPlaceholderVisibility()
105
+ return externalCompositionActiveJSON(sessionId: sessionId)
106
+ }
107
+
108
+ func commitExternalTextComposition(sessionId: String, finalText: String) -> String {
109
+ guard externalTextComposition?.sessionId == sessionId else {
110
+ return externalTextCompositionTerminalResults[sessionId]
111
+ ?? externalCompositionEndedErrorJSON(sessionId: sessionId)
112
+ }
113
+ return finishExternalTextComposition(
114
+ cause: "consumer",
115
+ finalText: finalText,
116
+ cancel: false
117
+ )?.resultJSON ?? externalCompositionEndedErrorJSON(sessionId: sessionId)
118
+ }
119
+
120
+ func cancelExternalTextComposition(sessionId: String, cause: String) -> String {
121
+ guard ["consumer", "documentChange", "lifecycle"].contains(cause) else {
122
+ return externalCompositionErrorJSON(
123
+ sessionId: sessionId,
124
+ code: "EXTERNAL_COMPOSITION_CANCEL_CAUSE_INVALID",
125
+ message: "The external composition cancellation cause is invalid"
126
+ )
127
+ }
128
+ guard externalTextComposition?.sessionId == sessionId else {
129
+ return externalTextCompositionTerminalResults[sessionId]
130
+ ?? externalCompositionEndedErrorJSON(sessionId: sessionId)
131
+ }
132
+ return finishExternalTextComposition(
133
+ cause: cause,
134
+ finalText: nil,
135
+ cancel: true
136
+ )?.resultJSON ?? externalCompositionEndedErrorJSON(sessionId: sessionId)
137
+ }
138
+
139
+ func finishExternalTextCompositionBeforeInteractionIfNeeded() -> Bool {
140
+ guard externalTextComposition != nil else { return true }
141
+ return finishExternalTextComposition(
142
+ cause: "interaction",
143
+ finalText: nil,
144
+ cancel: false
145
+ )?.succeeded == true
146
+ }
147
+
148
+ func finishExternalTextComposition(
149
+ cause: String,
150
+ finalText: String?,
151
+ cancel: Bool
152
+ ) -> ExternalTextCompositionFinish? {
153
+ guard var state = externalTextComposition else { return nil }
154
+ if let finalText {
155
+ if finalText != state.latestText {
156
+ performTransientTextMutation {
157
+ super.setMarkedText(
158
+ finalText,
159
+ selectedRange: NSRange(
160
+ location: (finalText as NSString).length,
161
+ length: 0
162
+ )
163
+ )
164
+ }
165
+ refreshMarkedTextCompositionText(fallback: finalText)
166
+ }
167
+ state.latestText = finalText
168
+ externalTextComposition = state
169
+ }
170
+
171
+ let replacementRange = trackedMarkedTextReplacementRange()
172
+ var authoritativeUpdateJSON: String?
173
+ if cancel,
174
+ editorId != 0,
175
+ let adapter = EditorV2Registry.adapter(forLegacyId: editorId),
176
+ !adapter.isDestroyed {
177
+ authoritativeUpdateJSON = adapter.currentStateJSON()
178
+ }
179
+ externalTextComposition = nil
180
+ finishTransientMarkedTextMutation()
181
+
182
+ if cancel {
183
+ restoreAuthorizedExternalComposition(
184
+ state,
185
+ authoritativeUpdateJSON: authoritativeUpdateJSON
186
+ )
187
+ let resultJSON = externalCompositionEndedJSON(
188
+ sessionId: state.sessionId,
189
+ outcome: "cancelled",
190
+ cause: cause,
191
+ text: state.latestText
192
+ )
193
+ emitExternalTextCompositionEnd(sessionId: state.sessionId, resultJSON: resultJSON)
194
+ return ExternalTextCompositionFinish(
195
+ resultJSON: resultJSON,
196
+ adoptedUpdateJSON: nil,
197
+ succeeded: true
198
+ )
199
+ }
200
+
201
+ _ = applyAttributedRender(
202
+ state.startingAuthorizedAttributedText,
203
+ usedPatch: false,
204
+ positionCacheUpdate: .scan
205
+ )
206
+ guard let commit = commitMarkedTextWithNativeOutcome(
207
+ state.latestText,
208
+ replacementRange: replacementRange
209
+ ) else {
210
+ let currentUpdateJSON: String?
211
+ if editorId == 0 {
212
+ currentUpdateJSON = nil
213
+ } else {
214
+ currentUpdateJSON = EditorV2Registry.adapter(forLegacyId: editorId)?
215
+ .recoverNativeRender()
216
+ }
217
+ restoreAuthorizedExternalComposition(
218
+ state,
219
+ authoritativeUpdateJSON: currentUpdateJSON
220
+ )
221
+ let error = externalCompositionErrorPayload(
222
+ code: "EXTERNAL_COMPOSITION_COMMIT_FAILED",
223
+ message: "The external text composition could not be committed"
224
+ )
225
+ let resultJSON = externalCompositionEndedJSON(
226
+ sessionId: state.sessionId,
227
+ outcome: "cancelled",
228
+ cause: cause,
229
+ text: state.latestText,
230
+ error: error
231
+ )
232
+ emitExternalTextCompositionEnd(sessionId: state.sessionId, resultJSON: resultJSON)
233
+ return ExternalTextCompositionFinish(
234
+ resultJSON: resultJSON,
235
+ adoptedUpdateJSON: nil,
236
+ succeeded: false
237
+ )
238
+ }
239
+
240
+ let resultJSON = externalCompositionEndedJSON(
241
+ sessionId: state.sessionId,
242
+ outcome: "committed",
243
+ cause: cause,
244
+ text: state.latestText
245
+ )
246
+ emitExternalTextCompositionEnd(sessionId: state.sessionId, resultJSON: resultJSON)
247
+ return ExternalTextCompositionFinish(
248
+ resultJSON: resultJSON,
249
+ adoptedUpdateJSON: commit.updateJSON,
250
+ succeeded: true
251
+ )
252
+ }
253
+
254
+ private func restoreAuthorizedExternalComposition(
255
+ _ state: ExternalTextCompositionState,
256
+ authoritativeUpdateJSON: String? = nil
257
+ ) {
258
+ _ = applyAttributedRender(
259
+ state.startingAuthorizedAttributedText,
260
+ usedPatch: false,
261
+ positionCacheUpdate: .scan
262
+ )
263
+ if let authoritativeUpdateJSON {
264
+ _ = applyUpdateJSON(authoritativeUpdateJSON, notifyDelegate: false)
265
+ }
266
+ guard textStorage.string == state.startingAuthorizedText,
267
+ state.startingSelectedUtf16Range.location >= 0,
268
+ state.startingSelectedUtf16Range.length >= 0,
269
+ state.startingSelectedUtf16Range.location
270
+ + state.startingSelectedUtf16Range.length <= textStorage.length
271
+ else {
272
+ return
273
+ }
274
+
275
+ logicalSelectionScalarRange = nil
276
+ logicalSelectionUtf16Range = nil
277
+ performTransientTextMutation {
278
+ selectedRange = state.startingSelectedUtf16Range
279
+ noteSelectionDidChange()
280
+ }
281
+ recordAuthorizedSelectionIfPossible()
282
+ refreshTypingAttributesForSelection()
283
+ }
284
+
285
+ private func emitExternalTextCompositionEnd(sessionId: String, resultJSON: String) {
286
+ guard externalTextCompositionTerminalResults[sessionId] == nil else { return }
287
+ externalTextCompositionTerminalResults[sessionId] = resultJSON
288
+ editorDelegate?.editorTextView(self, didEndExternalTextComposition: resultJSON)
289
+ }
290
+
291
+ private func externalCompositionActiveJSON(sessionId: String) -> String {
292
+ externalCompositionResultJSON([
293
+ "version": 1,
294
+ "type": "active",
295
+ "sessionId": sessionId
296
+ ])
297
+ }
298
+
299
+ private func externalCompositionEndedJSON(
300
+ sessionId: String,
301
+ outcome: String,
302
+ cause: String,
303
+ text: String,
304
+ error: [String: Any]? = nil
305
+ ) -> String {
306
+ var payload: [String: Any] = [
307
+ "version": 1,
308
+ "type": "ended",
309
+ "sessionId": sessionId,
310
+ "outcome": outcome,
311
+ "cause": cause,
312
+ "text": text
313
+ ]
314
+ if let error {
315
+ payload["error"] = error
316
+ }
317
+ return externalCompositionResultJSON(payload)
318
+ }
319
+
320
+ private func externalCompositionEndedErrorJSON(sessionId: String) -> String {
321
+ externalCompositionErrorJSON(
322
+ sessionId: sessionId,
323
+ code: "EXTERNAL_COMPOSITION_ENDED",
324
+ message: "The external text composition session has ended"
325
+ )
326
+ }
327
+
328
+ private func externalCompositionErrorJSON(
329
+ sessionId: String?,
330
+ code: String,
331
+ message: String
332
+ ) -> String {
333
+ externalCompositionResultJSON([
334
+ "version": 1,
335
+ "type": "error",
336
+ "sessionId": sessionId.map { $0 as Any } ?? NSNull(),
337
+ "error": externalCompositionErrorPayload(code: code, message: message)
338
+ ])
339
+ }
340
+
341
+ private func externalCompositionErrorPayload(code: String, message: String) -> [String: Any] {
342
+ [
343
+ "domain": "lifecycle",
344
+ "code": code,
345
+ "message": message,
346
+ "requestId": NSNull(),
347
+ "operationIndex": NSNull(),
348
+ "limit": NSNull(),
349
+ "actual": NSNull(),
350
+ "details": NSNull()
351
+ ]
352
+ }
353
+
354
+ func externalCompositionResultJSON(_ payload: [String: Any]) -> String {
355
+ guard JSONSerialization.isValidJSONObject(payload),
356
+ let data = try? JSONSerialization.data(withJSONObject: payload),
357
+ let json = String(data: data, encoding: .utf8)
358
+ else {
359
+ return #"{"version":1,"type":"error","sessionId":null,"error":{"domain":"lifecycle","code":"EXTERNAL_COMPOSITION_RESULT_INVALID","message":"Could not serialize external composition result","requestId":null,"operationIndex":null,"limit":null,"actual":null,"details":null}}"#
360
+ }
361
+ return json
362
+ }
363
+
364
+ }