@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,539 @@
1
+ import os
2
+ import UIKit
3
+
4
+ extension EditorTextView {
5
+ func withImageLoadOwner<T>(_ body: () -> T) -> T {
6
+ guard let imageLoadOwner else { return body() }
7
+ return imageLoadOwner.withCurrent(body)
8
+ }
9
+
10
+ func imageLoadingPolicyDidChange() {
11
+ renderAppearanceRevision &+= 1
12
+ }
13
+
14
+ enum PositionCacheUpdate {
15
+ case scan
16
+ case invalidate
17
+ case plainText
18
+ case attributed
19
+ }
20
+
21
+ @discardableResult
22
+ func applyTheme(_ theme: EditorTheme?) -> Bool {
23
+ if editorId != 0 {
24
+ guard prepareForExternalEditorUpdate() else { return false }
25
+ self.theme = theme
26
+ let previousOffset = contentOffset
27
+ let stateJSON = EditorV2Shadow.getCurrentState(id: editorId)
28
+ applyUpdateJSON(stateJSON, notifyDelegate: false)
29
+ if heightBehavior == .fixed {
30
+ preserveScrollOffset(previousOffset)
31
+ }
32
+ } else {
33
+ self.theme = theme
34
+ refreshTypingAttributesForSelection()
35
+ }
36
+ if heightBehavior == .autoGrow {
37
+ notifyHeightChangeIfNeeded(force: true)
38
+ }
39
+ return true
40
+ }
41
+
42
+ @discardableResult
43
+ func applyAtomRenderConfiguration(_ configuration: AtomRenderConfiguration?) -> Bool {
44
+ if editorId != 0 {
45
+ guard prepareForExternalEditorUpdate() else { return false }
46
+ atomRenderConfiguration = configuration
47
+ let previousOffset = contentOffset
48
+ applyUpdateJSON(EditorV2Shadow.getCurrentState(id: editorId), notifyDelegate: false)
49
+ if heightBehavior == .fixed {
50
+ preserveScrollOffset(previousOffset)
51
+ }
52
+ } else {
53
+ atomRenderConfiguration = configuration
54
+ }
55
+ if heightBehavior == .autoGrow {
56
+ notifyHeightChangeIfNeeded(force: true)
57
+ }
58
+ return true
59
+ }
60
+
61
+ private func performPostApplyMaintenance(forceHeightNotify: Bool = false) -> PostApplyTrace {
62
+ let totalStartedAt = DispatchTime.now().uptimeNanoseconds
63
+
64
+ let typingAttributesStartedAt = totalStartedAt
65
+ refreshTypingAttributesForSelection()
66
+ let typingAttributesNanos = DispatchTime.now().uptimeNanoseconds - typingAttributesStartedAt
67
+
68
+ let heightNotifyStartedAt = DispatchTime.now().uptimeNanoseconds
69
+ lastHeightNotifyMeasureNanosForTesting = 0
70
+ lastHeightNotifyCallbackNanosForTesting = 0
71
+ lastHeightNotifyEnsureLayoutNanosForTesting = 0
72
+ lastHeightNotifyUsedRectNanosForTesting = 0
73
+ lastHeightNotifyContentSizeNanosForTesting = 0
74
+ lastHeightNotifySizeThatFitsNanosForTesting = 0
75
+ if heightBehavior == .autoGrow {
76
+ invalidateAutoGrowHeightMeasurement()
77
+ if forceHeightNotify || window == nil {
78
+ notifyHeightChangeIfNeeded(force: forceHeightNotify)
79
+ } else {
80
+ setNeedsLayout()
81
+ }
82
+ }
83
+ let heightNotifyNanos = DispatchTime.now().uptimeNanoseconds - heightNotifyStartedAt
84
+
85
+ let selectionOrContentStartedAt = DispatchTime.now().uptimeNanoseconds
86
+ onSelectionOrContentMayChange?()
87
+ let selectionOrContentCallbackNanos =
88
+ DispatchTime.now().uptimeNanoseconds - selectionOrContentStartedAt
89
+
90
+ return PostApplyTrace(
91
+ totalNanos: DispatchTime.now().uptimeNanoseconds - totalStartedAt,
92
+ typingAttributesNanos: typingAttributesNanos,
93
+ heightNotifyNanos: heightNotifyNanos,
94
+ heightNotifyMeasureNanos: lastHeightNotifyMeasureNanosForTesting,
95
+ heightNotifyCallbackNanos: lastHeightNotifyCallbackNanosForTesting,
96
+ heightNotifyEnsureLayoutNanos: lastHeightNotifyEnsureLayoutNanosForTesting,
97
+ heightNotifyUsedRectNanos: lastHeightNotifyUsedRectNanosForTesting,
98
+ heightNotifyContentSizeNanos: lastHeightNotifyContentSizeNanosForTesting,
99
+ heightNotifySizeThatFitsNanos: lastHeightNotifySizeThatFitsNanosForTesting,
100
+ selectionOrContentCallbackNanos: selectionOrContentCallbackNanos
101
+ )
102
+ }
103
+
104
+ func applyAttributedRender(
105
+ _ attrStr: NSAttributedString,
106
+ replaceRange: NSRange? = nil,
107
+ usedPatch: Bool,
108
+ positionCacheUpdate: PositionCacheUpdate = .scan,
109
+ authorizedReplaceRange: NSRange? = nil,
110
+ authorizedReplacementText: String? = nil,
111
+ authorizedReplacementAttributedText: NSAttributedString? = nil
112
+ ) -> ApplyRenderTrace {
113
+ let totalStartedAt = DispatchTime.now().uptimeNanoseconds
114
+ let replaceUtf16Length = replaceRange?.length ?? textStorage.length
115
+ let replacementUtf16Length = attrStr.length
116
+ let shouldUseSmallPatchTextMutation =
117
+ replaceRange != nil && shouldUseSmallPatchTextMutation(for: attrStr, replaceRange: replaceRange)
118
+ isApplyingRustState = true
119
+ let textMutationStartedAt = DispatchTime.now().uptimeNanoseconds
120
+ let beginEditingStartedAt = DispatchTime.now().uptimeNanoseconds
121
+ textStorage.beginEditing()
122
+ let beginEditingNanos = DispatchTime.now().uptimeNanoseconds - beginEditingStartedAt
123
+ var stringMutationNanos: UInt64 = 0
124
+ var attributeMutationNanos: UInt64 = 0
125
+ let previousTextStorageDelegate = textStorage.delegate
126
+ textStorage.delegate = nil
127
+ delegate = nil
128
+ defer {
129
+ textStorage.delegate = previousTextStorageDelegate
130
+ ensureInternalTextViewDelegate()
131
+ }
132
+ if let replaceRange {
133
+ if shouldUseSmallPatchTextMutation {
134
+ let stringMutationStartedAt = DispatchTime.now().uptimeNanoseconds
135
+ textStorage.replaceCharacters(in: replaceRange, with: attrStr.string)
136
+ stringMutationNanos =
137
+ DispatchTime.now().uptimeNanoseconds - stringMutationStartedAt
138
+ let destinationRange = NSRange(location: replaceRange.location, length: attrStr.length)
139
+ let attributeMutationStartedAt = DispatchTime.now().uptimeNanoseconds
140
+ applyAttributes(from: attrStr, to: destinationRange)
141
+ attributeMutationNanos =
142
+ DispatchTime.now().uptimeNanoseconds - attributeMutationStartedAt
143
+ } else {
144
+ let stringMutationStartedAt = DispatchTime.now().uptimeNanoseconds
145
+ textStorage.replaceCharacters(in: replaceRange, with: attrStr)
146
+ stringMutationNanos =
147
+ DispatchTime.now().uptimeNanoseconds - stringMutationStartedAt
148
+ }
149
+ } else {
150
+ let stringMutationStartedAt = DispatchTime.now().uptimeNanoseconds
151
+ textStorage.setAttributedString(attrStr)
152
+ stringMutationNanos =
153
+ DispatchTime.now().uptimeNanoseconds - stringMutationStartedAt
154
+ }
155
+ onApplyingRustTextForTesting?()
156
+ let endEditingStartedAt = DispatchTime.now().uptimeNanoseconds
157
+ textStorage.endEditing()
158
+ let endEditingNanos = DispatchTime.now().uptimeNanoseconds - endEditingStartedAt
159
+ let textMutationNanos = DispatchTime.now().uptimeNanoseconds - textMutationStartedAt
160
+ let authorizedTextStartedAt = DispatchTime.now().uptimeNanoseconds
161
+ let snapshotReplaceRange = authorizedReplaceRange ?? replaceRange
162
+ let snapshotReplacementText = authorizedReplacementText ?? attrStr.string
163
+ let snapshotReplacementAttributedText = authorizedReplacementAttributedText ?? attrStr
164
+ if let snapshotReplaceRange,
165
+ snapshotReplaceRange.location >= 0,
166
+ snapshotReplaceRange.location + snapshotReplaceRange.length <= lastAuthorizedTextStorage.length {
167
+ lastAuthorizedTextStorage.replaceCharacters(
168
+ in: snapshotReplaceRange,
169
+ with: snapshotReplacementText
170
+ )
171
+ lastAuthorizedAttributedTextStorage.replaceCharacters(
172
+ in: snapshotReplaceRange,
173
+ with: snapshotReplacementAttributedText
174
+ )
175
+ } else {
176
+ lastAuthorizedTextStorage.setString(replaceRange == nil ? snapshotReplacementText : textStorage.string)
177
+ let fallbackAttributedSnapshot = replaceRange == nil
178
+ ? snapshotReplacementAttributedText
179
+ : NSAttributedString(attributedString: textStorage)
180
+ lastAuthorizedAttributedTextStorage.setAttributedString(fallbackAttributedSnapshot)
181
+ }
182
+ let authorizedTextNanos = DispatchTime.now().uptimeNanoseconds - authorizedTextStartedAt
183
+ let cacheInvalidationStartedAt = DispatchTime.now().uptimeNanoseconds
184
+ lastRenderAppliedPatchForTesting = usedPatch
185
+ switch positionCacheUpdate {
186
+ case .plainText:
187
+ guard let replaceRange else {
188
+ PositionBridge.invalidateCache(for: self)
189
+ break
190
+ }
191
+ let patchedPositionCache = PositionBridge.applyPlainTextPatchIfPossible(
192
+ for: self,
193
+ replaceRange: replaceRange,
194
+ replacementText: attrStr.string
195
+ )
196
+ if !patchedPositionCache {
197
+ PositionBridge.invalidateCache(for: self)
198
+ }
199
+ case .attributed:
200
+ guard let replaceRange else {
201
+ PositionBridge.invalidateCache(for: self)
202
+ break
203
+ }
204
+ let patchedPositionCache = PositionBridge.applyAttributedPatchIfPossible(
205
+ for: self,
206
+ replaceRange: replaceRange,
207
+ replacement: attrStr
208
+ )
209
+ if !patchedPositionCache {
210
+ PositionBridge.invalidateCache(for: self)
211
+ }
212
+ case .invalidate:
213
+ PositionBridge.invalidateCache(for: self)
214
+ case .scan:
215
+ let canPatchPositionCache = if let replaceRange {
216
+ replaceRange.location >= 0
217
+ && !textStorageRangeContainsAttachment(replaceRange)
218
+ && !attributedStringContainsAttachment(attrStr)
219
+ } else {
220
+ false
221
+ }
222
+ if let replaceRange, canPatchPositionCache {
223
+ let patchedPositionCache: Bool
224
+ if !textStorageRangeContainsPositionAdjustments(replaceRange),
225
+ !attributedStringContainsPositionAdjustments(attrStr) {
226
+ patchedPositionCache = PositionBridge.applyPlainTextPatchIfPossible(
227
+ for: self,
228
+ replaceRange: replaceRange,
229
+ replacementText: attrStr.string
230
+ )
231
+ } else {
232
+ patchedPositionCache = PositionBridge.applyAttributedPatchIfPossible(
233
+ for: self,
234
+ replaceRange: replaceRange,
235
+ replacement: attrStr
236
+ )
237
+ }
238
+
239
+ if !patchedPositionCache {
240
+ PositionBridge.invalidateCache(for: self)
241
+ }
242
+ } else {
243
+ PositionBridge.invalidateCache(for: self)
244
+ }
245
+ }
246
+ let cacheInvalidationNanos = DispatchTime.now().uptimeNanoseconds - cacheInvalidationStartedAt
247
+ isApplyingRustState = false
248
+ scheduleCodeHighlighting()
249
+ return ApplyRenderTrace(
250
+ totalNanos: DispatchTime.now().uptimeNanoseconds - totalStartedAt,
251
+ replaceUtf16Length: replaceUtf16Length,
252
+ replacementUtf16Length: replacementUtf16Length,
253
+ textMutationNanos: textMutationNanos,
254
+ beginEditingNanos: beginEditingNanos,
255
+ endEditingNanos: endEditingNanos,
256
+ stringMutationNanos: stringMutationNanos,
257
+ attributeMutationNanos: attributeMutationNanos,
258
+ authorizedTextNanos: authorizedTextNanos,
259
+ cacheInvalidationNanos: cacheInvalidationNanos,
260
+ usedSmallPatchTextMutation: shouldUseSmallPatchTextMutation
261
+ )
262
+ }
263
+
264
+ /// Apply a full render update from Rust to the text view.
265
+ ///
266
+ /// Parses the update JSON, converts render elements to NSAttributedString
267
+ /// via RenderBridge, and replaces the text view's content.
268
+ ///
269
+ /// - Parameter updateJSON: The JSON string from editor_insert_text, etc.
270
+ @discardableResult
271
+ func applyUpdateJSON(_ updateJSON: String, notifyDelegate: Bool = true) -> Bool {
272
+ ensureInternalTextViewDelegate()
273
+ let totalStartedAt = DispatchTime.now().uptimeNanoseconds
274
+ let parseStartedAt = totalStartedAt
275
+ guard let data = updateJSON.data(using: .utf8),
276
+ let update = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
277
+ else { return false }
278
+ let parseNanos = DispatchTime.now().uptimeNanoseconds - parseStartedAt
279
+ resetPendingNativeTextMutationState()
280
+
281
+ let renderElements = update["renderElements"] as? [[String: Any]]
282
+ let selectionFromUpdate = (update["selection"] as? [String: Any])
283
+ .map(self.selectionSummary(from:)) ?? "none"
284
+ Self.updateLog.debug(
285
+ "[applyUpdateJSON.begin] renderCount=\(renderElements?.count ?? 0) updateSelection=\(selectionFromUpdate, privacy: .public) before=\(self.textSnapshotSummary(), privacy: .public)"
286
+ )
287
+ let resolveRenderBlocksStartedAt = DispatchTime.now().uptimeNanoseconds
288
+ let updateDocumentVersion = canonicalDocumentVersion(update["documentVersion"])
289
+ let renderBlocks = parseRenderBlocks(update["renderBlocks"])
290
+ let explicitRenderPatch = parseRenderPatch(update["renderPatch"])
291
+ let resolvedRenderBlocks = renderBlocks
292
+ ?? explicitRenderPatch.flatMap { patch in
293
+ guard patchMatchesCurrentRenderBlocks(
294
+ patch,
295
+ updateDocumentVersion: updateDocumentVersion
296
+ ) else { return nil }
297
+ return currentRenderBlocks.flatMap { mergeRenderBlocks(applying: patch, to: $0) }
298
+ }
299
+ let resolveRenderBlocksNanos =
300
+ DispatchTime.now().uptimeNanoseconds - resolveRenderBlocksStartedAt
301
+ if renderBlocks == nil,
302
+ renderElements == nil,
303
+ explicitRenderPatch != nil,
304
+ resolvedRenderBlocks == nil {
305
+ return recoverRenderPatchBaseMismatch(notifyDelegate: notifyDelegate)
306
+ }
307
+
308
+ let derivedRenderPatch: DerivedRenderPatch? =
309
+ if let currentRenderBlocks,
310
+ let resolvedRenderBlocks {
311
+ deriveRenderPatch(from: currentRenderBlocks, to: resolvedRenderBlocks)
312
+ } else {
313
+ nil
314
+ }
315
+ let renderPatch: ParsedRenderPatch? = if let explicitRenderPatch {
316
+ explicitRenderPatch
317
+ } else if case let .patch(derivedPatch)? = derivedRenderPatch {
318
+ derivedPatch
319
+ } else {
320
+ nil
321
+ }
322
+ let shouldSkipRender = if case .unchanged? = derivedRenderPatch {
323
+ textStorage.string == lastAuthorizedText
324
+ && lastAppliedRenderAppearanceRevision == renderAppearanceRevision
325
+ } else {
326
+ false
327
+ }
328
+
329
+ let patchTrace: PatchApplyTrace? = if !shouldSkipRender
330
+ && textStorage.string == lastAuthorizedText
331
+ && lastAppliedRenderAppearanceRevision == renderAppearanceRevision {
332
+ renderPatch.map(applyRenderPatchIfPossible)
333
+ } else {
334
+ nil
335
+ }
336
+ let appliedPatch = patchTrace?.applied == true
337
+ var usedSmallPatchTextMutation = patchTrace?.usedSmallPatchTextMutation ?? false
338
+ var applyRenderReplaceUtf16Length = patchTrace?.applyRenderReplaceUtf16Length ?? 0
339
+ var applyRenderReplacementUtf16Length =
340
+ patchTrace?.applyRenderReplacementUtf16Length ?? 0
341
+ var buildRenderNanos = patchTrace?.buildRenderNanos ?? 0
342
+ var applyRenderNanos = patchTrace?.applyRenderNanos ?? 0
343
+ var applyRenderTextMutationNanos = patchTrace?.applyRenderTextMutationNanos ?? 0
344
+ var applyRenderBeginEditingNanos = patchTrace?.applyRenderBeginEditingNanos ?? 0
345
+ var applyRenderEndEditingNanos = patchTrace?.applyRenderEndEditingNanos ?? 0
346
+ var applyRenderStringMutationNanos = patchTrace?.applyRenderStringMutationNanos ?? 0
347
+ var applyRenderAttributeMutationNanos =
348
+ patchTrace?.applyRenderAttributeMutationNanos ?? 0
349
+ var applyRenderAuthorizedTextNanos = patchTrace?.applyRenderAuthorizedTextNanos ?? 0
350
+ var applyRenderCacheInvalidationNanos = patchTrace?.applyRenderCacheInvalidationNanos ?? 0
351
+ if shouldSkipRender {
352
+ lastRenderAppliedPatchForTesting = false
353
+ if let resolvedRenderBlocks {
354
+ retainCurrentRenderBlocks(
355
+ resolvedRenderBlocks,
356
+ documentVersion: updateDocumentVersion
357
+ )
358
+ }
359
+ } else if !appliedPatch {
360
+ let buildStartedAt = DispatchTime.now().uptimeNanoseconds
361
+ let attrStr: NSAttributedString
362
+ if let resolvedRenderBlocks {
363
+ attrStr = withImageLoadOwner {
364
+ RenderBridge.renderBlocks(
365
+ fromArray: resolvedRenderBlocks,
366
+ baseFont: baseFont,
367
+ textColor: baseTextColor,
368
+ theme: theme,
369
+ atomConfiguration: atomRenderConfiguration
370
+ )
371
+ }
372
+ retainCurrentRenderBlocks(
373
+ resolvedRenderBlocks,
374
+ documentVersion: updateDocumentVersion
375
+ )
376
+ } else if let renderElements {
377
+ attrStr = withImageLoadOwner {
378
+ RenderBridge.renderElements(
379
+ fromArray: renderElements,
380
+ baseFont: baseFont,
381
+ textColor: baseTextColor,
382
+ theme: theme,
383
+ atomConfiguration: atomRenderConfiguration
384
+ )
385
+ }
386
+ invalidateCurrentRenderBlocks()
387
+ } else {
388
+ return false
389
+ }
390
+ buildRenderNanos = DispatchTime.now().uptimeNanoseconds - buildStartedAt
391
+ let applyTrace = applyAttributedRender(
392
+ attrStr,
393
+ usedPatch: false,
394
+ positionCacheUpdate: .invalidate
395
+ )
396
+ refreshTopLevelChildMetadata(from: attrStr)
397
+ applyRenderReplaceUtf16Length = applyTrace.replaceUtf16Length
398
+ applyRenderReplacementUtf16Length = applyTrace.replacementUtf16Length
399
+ applyRenderNanos = applyTrace.totalNanos
400
+ applyRenderTextMutationNanos = applyTrace.textMutationNanos
401
+ applyRenderBeginEditingNanos = applyTrace.beginEditingNanos
402
+ applyRenderEndEditingNanos = applyTrace.endEditingNanos
403
+ applyRenderStringMutationNanos = applyTrace.stringMutationNanos
404
+ applyRenderAttributeMutationNanos = applyTrace.attributeMutationNanos
405
+ applyRenderAuthorizedTextNanos = applyTrace.authorizedTextNanos
406
+ applyRenderCacheInvalidationNanos = applyTrace.cacheInvalidationNanos
407
+ usedSmallPatchTextMutation = applyTrace.usedSmallPatchTextMutation
408
+ lastAppliedRenderAppearanceRevision = renderAppearanceRevision
409
+ } else if let resolvedRenderBlocks {
410
+ retainCurrentRenderBlocks(
411
+ resolvedRenderBlocks,
412
+ documentVersion: updateDocumentVersion
413
+ )
414
+ lastAppliedRenderAppearanceRevision = renderAppearanceRevision
415
+ }
416
+ if appliedPatch,
417
+ let renderPatch,
418
+ let resolvedRenderBlocks,
419
+ !refreshRetainedPositionalMetadata(
420
+ startingAt: renderPatch.startIndex + renderPatch.renderBlocks.count,
421
+ updatedRenderBlocks: resolvedRenderBlocks
422
+ ) {
423
+ // The preflight is deliberately conservative: a partial metadata
424
+ // refresh must never leave a retained atom targeting stale state.
425
+ // The next update will take the full safe path after cache reset.
426
+ currentTopLevelChildMetadata = nil
427
+ }
428
+
429
+ // The core is the authority on empty state; adopt it before the
430
+ // placeholder is reconsidered.
431
+ coreReportedDocumentIsEmpty = update["documentIsEmpty"] as? Bool
432
+ refreshPlaceholderVisibility()
433
+ Self.updateLog.debug(
434
+ "[applyUpdateJSON.rendered] mode=\(appliedPatch ? "patch" : "full", privacy: .public) after=\(self.textSnapshotSummary(), privacy: .public)"
435
+ )
436
+
437
+ let selectionTrace: SelectionApplyTrace
438
+ if let selection = update["selection"] as? [String: Any] {
439
+ selectionTrace = applySelectionFromJSON(selection)
440
+ } else {
441
+ selectionTrace = SelectionApplyTrace(
442
+ totalNanos: 0,
443
+ resolveNanos: 0,
444
+ assignmentNanos: 0,
445
+ chromeNanos: 0
446
+ )
447
+ }
448
+ let postApplyTrace = performPostApplyMaintenance()
449
+ let postApplyNanos = postApplyTrace.totalNanos
450
+
451
+ if captureApplyUpdateTraceForTesting {
452
+ lastApplyUpdateTraceForTesting = ApplyUpdateTrace(
453
+ attemptedPatch: renderPatch != nil,
454
+ patchStartIndex: renderPatch?.startIndex,
455
+ patchDeleteCount: renderPatch?.deleteCount,
456
+ patchRenderBlockCount: renderPatch?.renderBlocks.count,
457
+ usedPatch: appliedPatch,
458
+ usedSmallPatchTextMutation: usedSmallPatchTextMutation,
459
+ applyRenderReplaceUtf16Length: applyRenderReplaceUtf16Length,
460
+ applyRenderReplacementUtf16Length: applyRenderReplacementUtf16Length,
461
+ parseNanos: parseNanos,
462
+ resolveRenderBlocksNanos: resolveRenderBlocksNanos,
463
+ patchEligibilityNanos: patchTrace?.eligibilityNanos ?? 0,
464
+ patchTrimNanos: patchTrace?.trimNanos ?? 0,
465
+ patchMetadataNanos: patchTrace?.metadataNanos ?? 0,
466
+ buildRenderNanos: buildRenderNanos,
467
+ applyRenderNanos: applyRenderNanos,
468
+ selectionNanos: selectionTrace.totalNanos,
469
+ postApplyNanos: postApplyNanos,
470
+ totalNanos: DispatchTime.now().uptimeNanoseconds - totalStartedAt,
471
+ applyRenderTextMutationNanos: applyRenderTextMutationNanos,
472
+ applyRenderBeginEditingNanos: applyRenderBeginEditingNanos,
473
+ applyRenderEndEditingNanos: applyRenderEndEditingNanos,
474
+ applyRenderStringMutationNanos: applyRenderStringMutationNanos,
475
+ applyRenderAttributeMutationNanos: applyRenderAttributeMutationNanos,
476
+ applyRenderAuthorizedTextNanos: applyRenderAuthorizedTextNanos,
477
+ applyRenderCacheInvalidationNanos: applyRenderCacheInvalidationNanos,
478
+ selectionResolveNanos: selectionTrace.resolveNanos,
479
+ selectionAssignmentNanos: selectionTrace.assignmentNanos,
480
+ selectionChromeNanos: selectionTrace.chromeNanos,
481
+ postApplyTypingAttributesNanos: postApplyTrace.typingAttributesNanos,
482
+ postApplyHeightNotifyNanos: postApplyTrace.heightNotifyNanos,
483
+ postApplyHeightNotifyMeasureNanos: postApplyTrace.heightNotifyMeasureNanos,
484
+ postApplyHeightNotifyCallbackNanos: postApplyTrace.heightNotifyCallbackNanos,
485
+ postApplyHeightNotifyEnsureLayoutNanos: postApplyTrace.heightNotifyEnsureLayoutNanos,
486
+ postApplyHeightNotifyUsedRectNanos: postApplyTrace.heightNotifyUsedRectNanos,
487
+ postApplyHeightNotifyContentSizeNanos: postApplyTrace.heightNotifyContentSizeNanos,
488
+ postApplyHeightNotifySizeThatFitsNanos: postApplyTrace.heightNotifySizeThatFitsNanos,
489
+ postApplySelectionOrContentCallbackNanos:
490
+ postApplyTrace.selectionOrContentCallbackNanos
491
+ )
492
+ }
493
+ recordAuthorizedSelectionIfPossible()
494
+ Self.updateLog.debug(
495
+ "[applyUpdateJSON.end] finalSelection=\(self.selectionSummary(), privacy: .public) textState=\(self.textSnapshotSummary(), privacy: .public)"
496
+ )
497
+
498
+ if notifyDelegate {
499
+ editorDelegate?.editorTextView(self, didReceiveUpdate: updateJSON)
500
+ }
501
+ return true
502
+ }
503
+
504
+ /// Apply a render JSON string (just render elements, no update wrapper).
505
+ ///
506
+ /// Used for initial content loading (set_html / set_json return render
507
+ /// elements directly, not wrapped in an EditorUpdate).
508
+ func applyRenderJSON(_ renderJSON: String) {
509
+ ensureInternalTextViewDelegate()
510
+ resetPendingNativeTextMutationState()
511
+ Self.updateLog.debug(
512
+ "[applyRenderJSON.begin] before=\(self.textSnapshotSummary(), privacy: .public)"
513
+ )
514
+ let attrStr = withImageLoadOwner {
515
+ RenderBridge.renderElements(
516
+ fromJSON: renderJSON,
517
+ baseFont: baseFont,
518
+ textColor: baseTextColor,
519
+ theme: theme,
520
+ atomConfiguration: atomRenderConfiguration
521
+ )
522
+ }
523
+ _ = applyAttributedRender(attrStr, usedPatch: false)
524
+ invalidateCurrentRenderBlocks()
525
+ refreshTopLevelChildMetadata(from: attrStr)
526
+ lastAppliedRenderAppearanceRevision = renderAppearanceRevision
527
+
528
+ // A bare render carries no editor update, so there is no authoritative
529
+ // empty state to adopt; fall back until the next update supplies one.
530
+ coreReportedDocumentIsEmpty = nil
531
+ refreshPlaceholderVisibility()
532
+ _ = performPostApplyMaintenance()
533
+ recordAuthorizedSelectionIfPossible()
534
+ Self.updateLog.debug(
535
+ "[applyRenderJSON.end] after=\(self.textSnapshotSummary(), privacy: .public)"
536
+ )
537
+ }
538
+
539
+ }