@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,191 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.graphics.Rect
4
+ import android.text.Annotation
5
+ import android.text.Layout
6
+ import android.text.Spanned
7
+ import com.apollohg.editor.EditorEditText.AccessibleAnnotation
8
+ import com.apollohg.editor.EditorEditText.AccessibleAnnotationTarget
9
+ import com.apollohg.editor.EditorEditText.InteractiveAnnotationHit
10
+ import com.apollohg.editor.EditorEditText.LinkHit
11
+ import com.apollohg.editor.EditorEditText.MentionHit
12
+
13
+ internal fun EditorEditText.textOffsetHitAt(x: Float, y: Float): Pair<Spanned, Int>? {
14
+ val spannable = text as? Spanned ?: return null
15
+ val layout = layout ?: return null
16
+ if (spannable.isEmpty()) return null
17
+
18
+ val localX = x - totalPaddingLeft + scrollX
19
+ val localY = y - totalPaddingTop + scrollY
20
+ if (localY < 0f || localY > layout.height.toFloat()) {
21
+ return null
22
+ }
23
+
24
+ val line = layout.getLineForVertical(localY.toInt())
25
+ val lineLeft = layout.getLineLeft(line)
26
+ val lineRight = layout.getLineRight(line)
27
+ if (localX < lineLeft || localX > lineRight) {
28
+ return null
29
+ }
30
+
31
+ val offset = layout.getOffsetForHorizontal(line, localX)
32
+ .coerceIn(0, maxOf(spannable.length - 1, 0))
33
+ return spannable to offset
34
+ }
35
+
36
+ internal fun EditorEditText.mentionHitAtImpl(x: Float, y: Float): MentionHit? {
37
+ val (spannable, offset) = textOffsetHitAt(x, y) ?: return null
38
+ val annotations = spannable.getSpans(
39
+ offset,
40
+ (offset + 1).coerceAtMost(spannable.length),
41
+ Annotation::class.java
42
+ )
43
+ val mentionAnnotation = annotations.firstOrNull {
44
+ it.key == "nativeVoidNodeType" && it.value == "mention"
45
+ } ?: return null
46
+ val docPos = annotations.firstOrNull { it.key == "nativeDocPos" }
47
+ ?.value
48
+ ?.viewerMentionDocPos() ?: return null
49
+ val start = spannable.getSpanStart(mentionAnnotation)
50
+ val end = spannable.getSpanEnd(mentionAnnotation)
51
+ if (start < 0 || end <= start) {
52
+ return null
53
+ }
54
+
55
+ return MentionHit(
56
+ docPos = docPos,
57
+ label = spannable.subSequence(start, end).toString()
58
+ )
59
+ }
60
+
61
+ internal fun EditorEditText.linkHitAtImpl(x: Float, y: Float): LinkHit? {
62
+ val (spannable, offset) = textOffsetHitAt(x, y) ?: return null
63
+ val annotations = spannable.getSpans(
64
+ offset,
65
+ (offset + 1).coerceAtMost(spannable.length),
66
+ Annotation::class.java
67
+ )
68
+ val linkAnnotation = annotations.firstOrNull {
69
+ it.key == RenderBridge.NATIVE_LINK_HREF_ANNOTATION && it.value.isNotBlank()
70
+ } ?: return null
71
+ val start = spannable.getSpanStart(linkAnnotation)
72
+ val end = spannable.getSpanEnd(linkAnnotation)
73
+ if (start < 0 || end <= start) {
74
+ return null
75
+ }
76
+
77
+ return LinkHit(
78
+ href = linkAnnotation.value,
79
+ text = spannable.subSequence(start, end).toString()
80
+ )
81
+ }
82
+
83
+ internal fun EditorEditText.accessibleAnnotationsImpl(): List<AccessibleAnnotation> {
84
+ val spannable = text as? Spanned ?: return emptyList()
85
+ val textLayout = layout ?: return emptyList()
86
+ val annotations = spannable.getSpans(0, spannable.length, Annotation::class.java)
87
+ val results = mutableListOf<Pair<Int, AccessibleAnnotation>>()
88
+ annotations.forEach { annotation ->
89
+ val start = spannable.getSpanStart(annotation)
90
+ val end = spannable.getSpanEnd(annotation)
91
+ if (start < 0 || end <= start) return@forEach
92
+ val label = spannable.subSequence(start, end).toString()
93
+ val target = when {
94
+ annotation.key == RenderBridge.NATIVE_LINK_HREF_ANNOTATION &&
95
+ annotation.value.isNotBlank() -> AccessibleAnnotationTarget.Link(
96
+ href = annotation.value,
97
+ text = label
98
+ )
99
+
100
+ annotation.key == "nativeVoidNodeType" && annotation.value == "mention" -> {
101
+ val docPos = annotations.firstOrNull { candidate ->
102
+ candidate.key == "nativeDocPos" &&
103
+ spannable.getSpanStart(candidate) == start &&
104
+ spannable.getSpanEnd(candidate) == end
105
+ }?.value?.viewerMentionDocPos() ?: return@forEach
106
+ AccessibleAnnotationTarget.Mention(docPos, label)
107
+ }
108
+
109
+ else -> return@forEach
110
+ }
111
+ val role = when (target) {
112
+ is AccessibleAnnotationTarget.Link -> "link"
113
+ is AccessibleAnnotationTarget.Mention -> "mention"
114
+ }
115
+ results += start to AccessibleAnnotation(
116
+ target = target,
117
+ label = label,
118
+ role = role,
119
+ bounds = annotationBounds(textLayout, start, end),
120
+ annotation = annotation,
121
+ start = start,
122
+ end = end
123
+ )
124
+ }
125
+ return results.sortedBy { it.first }.map { it.second }
126
+ }
127
+
128
+ internal fun EditorEditText.interactiveAnnotationHitAtImpl(
129
+ x: Float,
130
+ y: Float
131
+ ): InteractiveAnnotationHit? {
132
+ val (spannable, offset) = textOffsetHitAt(x, y) ?: return null
133
+ val annotations = spannable.getSpans(
134
+ offset,
135
+ (offset + 1).coerceAtMost(spannable.length),
136
+ Annotation::class.java
137
+ )
138
+ val mentionAnnotation = annotations.firstOrNull {
139
+ it.key == "nativeVoidNodeType" && it.value == "mention"
140
+ }
141
+ val annotation = mentionAnnotation ?: annotations.firstOrNull {
142
+ it.key == RenderBridge.NATIVE_LINK_HREF_ANNOTATION && it.value.isNotBlank()
143
+ } ?: return null
144
+ val start = spannable.getSpanStart(annotation)
145
+ val end = spannable.getSpanEnd(annotation)
146
+ if (start < 0 || end <= start) return null
147
+ val label = spannable.subSequence(start, end).toString()
148
+ val target = if (annotation === mentionAnnotation) {
149
+ val docPos = annotations.firstOrNull {
150
+ it.key == "nativeDocPos" &&
151
+ spannable.getSpanStart(it) == start &&
152
+ spannable.getSpanEnd(it) == end
153
+ }?.value?.viewerMentionDocPos() ?: return null
154
+ AccessibleAnnotationTarget.Mention(docPos, label)
155
+ } else {
156
+ AccessibleAnnotationTarget.Link(annotation.value, label)
157
+ }
158
+ return InteractiveAnnotationHit(target, annotation, start, end)
159
+ }
160
+
161
+ /** Annotation values are decimal Rust u32 positions, never signed editor offsets. */
162
+ private fun String.viewerMentionDocPos(): Long? =
163
+ toLongOrNull()?.takeIf { it in 0L..UInt.MAX_VALUE.toLong() }
164
+
165
+ internal fun EditorEditText.annotationBounds(textLayout: Layout, start: Int, end: Int): Rect {
166
+ val firstLine = textLayout.getLineForOffset(start)
167
+ val lastLine = textLayout.getLineForOffset((end - 1).coerceAtLeast(start))
168
+ val bounds = Rect()
169
+ for (line in firstLine..lastLine) {
170
+ val segmentStart = maxOf(start, textLayout.getLineStart(line))
171
+ val segmentEnd = minOf(end, textLayout.getLineEnd(line))
172
+ val left = totalPaddingLeft + minOf(
173
+ textLayout.getPrimaryHorizontal(segmentStart),
174
+ textLayout.getPrimaryHorizontal(segmentEnd)
175
+ ) - scrollX
176
+ val right = totalPaddingLeft + maxOf(
177
+ textLayout.getPrimaryHorizontal(segmentStart),
178
+ textLayout.getPrimaryHorizontal(segmentEnd)
179
+ ) - scrollX
180
+ val lineBounds = Rect(
181
+ kotlin.math.floor(left.toDouble()).toInt(),
182
+ totalPaddingTop + textLayout.editorTextLineTop(line) - scrollY,
183
+ kotlin.math.ceil(right.toDouble()).toInt().coerceAtLeast(
184
+ kotlin.math.floor(left.toDouble()).toInt() + 1
185
+ ),
186
+ totalPaddingTop + textLayout.editorTextLineBottom(line) - scrollY
187
+ )
188
+ if (bounds.isEmpty) bounds.set(lineBounds) else bounds.union(lineBounds)
189
+ }
190
+ return bounds
191
+ }
@@ -0,0 +1,100 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.graphics.Canvas
4
+ import android.graphics.Rect
5
+ import android.graphics.RectF
6
+ import android.os.Build
7
+ import android.util.AttributeSet
8
+ import android.util.TypedValue
9
+ import kotlin.math.abs
10
+
11
+ internal fun EditorEditText.setEditorAccessibilityHintImpl(hint: CharSequence?) {
12
+ editorAccessibilityHint = hint
13
+ }
14
+
15
+ internal fun EditorEditText.nativeCursorDrawRectImpl(): RectF? {
16
+ if (isCollapsedAtomBoundarySelection(selectionStart, selectionEnd)) {
17
+ isCursorVisible = false
18
+ return null
19
+ }
20
+ val textLayout = layout ?: return null
21
+ val offset = selectionEnd.coerceIn(0, textLayout.text.length)
22
+ val bounds = CaretGeometry.verticalBounds(textLayout, offset, paint, textLayout.text)
23
+ // Match Android's cursor pixel snapping and viewport-edge clamping.
24
+ val horizontal = maxOf(0.5f, textLayout.getPrimaryHorizontal(offset) - 0.5f)
25
+ val viewportWidth = width - compoundPaddingLeft - compoundPaddingRight
26
+ val left = when {
27
+ horizontal - scrollX >= viewportWidth - 1f -> scrollX + viewportWidth - caretWidthPx
28
+ abs(horizontal - scrollX) <= 1f -> scrollX.toFloat()
29
+ else -> horizontal.toInt().toFloat()
30
+ }
31
+ return RectF(left, bounds.top, left + caretWidthPx, bounds.bottom)
32
+ }
33
+
34
+ internal fun EditorEditText.resolveCaretWidth(attrs: AttributeSet?, defStyleAttr: Int): Float {
35
+ val attributes = context.obtainStyledAttributes(
36
+ attrs,
37
+ intArrayOf(android.R.attr.textCursorDrawable),
38
+ defStyleAttr,
39
+ 0
40
+ )
41
+ try {
42
+ val drawable = attributes.getDrawable(0)
43
+ if (drawable != null) {
44
+ val padding = Rect()
45
+ drawable.getPadding(padding)
46
+ // Native cursor drawables include transparent horizontal insets.
47
+ val width = drawable.intrinsicWidth - padding.left - padding.right
48
+ if (width > 0) return width.toFloat()
49
+ }
50
+ } finally {
51
+ attributes.recycle()
52
+ }
53
+ return 2f * resources.displayMetrics.density
54
+ }
55
+
56
+ /**
57
+ * The native caret is tinted by the theme's `colorControlActivated`; resolve
58
+ * the same value so the replacement keeps the platform appearance, falling
59
+ * back to the text color when the attribute is not a color.
60
+ */
61
+ internal fun EditorEditText.resolveCaretColor(): Int {
62
+ val resolved = TypedValue()
63
+ val found = context.theme.resolveAttribute(
64
+ android.R.attr.colorControlActivated,
65
+ resolved,
66
+ true
67
+ )
68
+ val isColor = resolved.type >= TypedValue.TYPE_FIRST_COLOR_INT &&
69
+ resolved.type <= TypedValue.TYPE_LAST_COLOR_INT
70
+ return if (found && isColor) resolved.data else currentTextColor
71
+ }
72
+
73
+ internal fun EditorEditText.clipLegacyNativeCursorTail(canvas: Canvas) {
74
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) return
75
+ if (!CaretGeometry.shouldRender(
76
+ isFocused,
77
+ hasWindowFocus(),
78
+ selectionStart,
79
+ selectionEnd
80
+ )
81
+ ) {
82
+ return
83
+ }
84
+ val textLayout = layout ?: return
85
+ val offset = selectionEnd.coerceIn(0, textLayout.text.length)
86
+ val bounds = CaretGeometry.verticalBounds(textLayout, offset, paint, textLayout.text)
87
+ val lineBottom = textLayout.editorTextLineBottom(textLayout.getLineForOffset(offset)).toFloat()
88
+ if (bounds.bottom >= lineBottom) return
89
+
90
+ val centerX = totalPaddingLeft + textLayout.getPrimaryHorizontal(offset)
91
+ val halfWidth = maxOf(caretWidthPx, 2f * resources.displayMetrics.density)
92
+ legacyCursorClipPaint.color = baseBackgroundColor
93
+ canvas.drawRect(
94
+ centerX - halfWidth,
95
+ totalPaddingTop + bounds.bottom,
96
+ centerX + halfWidth,
97
+ totalPaddingTop + lineBottom,
98
+ legacyCursorClipPaint
99
+ )
100
+ }
@@ -0,0 +1,101 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.content.ClipData
4
+ import android.content.ClipboardManager
5
+ import android.content.Context
6
+ import android.view.accessibility.AccessibilityNodeInfo
7
+
8
+ internal fun EditorEditText.isMutatingContextMenuItem(id: Int): Boolean =
9
+ id == android.R.id.paste ||
10
+ id == android.R.id.pasteAsPlainText ||
11
+ id == android.R.id.cut
12
+
13
+ internal fun EditorEditText.prepareForExternalInteractionMutation(): Boolean =
14
+ commitExternalTextCompositionBeforeInteractionIfNeeded() &&
15
+ prepareForExternalEditorUpdate()
16
+
17
+ internal fun EditorEditText.handlePaste(plainTextOnly: Boolean) {
18
+ val selectionRange = normalizedUtf16SelectionRange()
19
+ if (selectionRange != null &&
20
+ isCollapsedAtomBoundarySelection(selectionRange.first, selectionRange.second)
21
+ ) {
22
+ return
23
+ }
24
+ if (editorId == 0L) {
25
+ baseTextContextMenuItem(
26
+ if (plainTextOnly) android.R.id.pasteAsPlainText else android.R.id.paste
27
+ )
28
+ return
29
+ }
30
+ if (discardTransientInputForDestroyedEditorIfNeeded()) return
31
+ if (!prepareForExternalInteractionMutation()) return
32
+
33
+ val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager
34
+ ?: return
35
+ val clip = clipboard.primaryClip ?: return
36
+ if (clip.itemCount == 0) return
37
+
38
+ val item = clip.getItemAt(0)
39
+
40
+ val htmlText = item.htmlText
41
+ if (!plainTextOnly && htmlText != null) {
42
+ pasteHTML(htmlText)
43
+ return
44
+ }
45
+
46
+ val plainText = item.text?.toString() ?: item.coerceToText(context)?.toString()
47
+ if (plainText != null) {
48
+ pastePlainText(plainText)
49
+ }
50
+ }
51
+
52
+ internal fun EditorEditText.handleCut() {
53
+ if (editorId == 0L) {
54
+ baseTextContextMenuItem(android.R.id.cut)
55
+ return
56
+ }
57
+ if (discardTransientInputForDestroyedEditorIfNeeded()) return
58
+ if (!prepareForExternalInteractionMutation()) return
59
+
60
+ val currentText = text?.toString() ?: return
61
+ val (selectionStart, selectionEnd) = normalizedUtf16SelectionRange(currentText) ?: return
62
+ if (selectionStart == selectionEnd) return
63
+
64
+ val (utf16Start, utf16End) = PositionBridge.snapRangeToScalarBoundaries(
65
+ selectionStart,
66
+ selectionEnd,
67
+ currentText
68
+ )
69
+ if (utf16Start >= utf16End) return
70
+
71
+ val selectedText = currentText.substring(utf16Start, utf16End)
72
+ val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager
73
+ clipboard?.setPrimaryClip(ClipData.newPlainText(null, selectedText))
74
+
75
+ val scalarStart = PositionBridge.utf16ToScalar(utf16Start, currentText)
76
+ val scalarEnd = PositionBridge.utf16ToScalar(utf16End, currentText)
77
+ deleteRangeInRust(scalarStart, scalarEnd)
78
+ }
79
+
80
+ internal fun EditorEditText.handleAccessibilitySetText(arguments: android.os.Bundle?): Boolean {
81
+ val replacement = arguments
82
+ ?.getCharSequence(
83
+ android.view.accessibility.AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE
84
+ )
85
+ ?.toString()
86
+ ?: return false
87
+ if (editorId == 0L) {
88
+ return baseAccessibilityAction(
89
+ android.view.accessibility.AccessibilityNodeInfo.ACTION_SET_TEXT,
90
+ arguments
91
+ )
92
+ }
93
+ if (discardTransientInputForDestroyedEditorIfNeeded()) return false
94
+ if (!prepareForExternalInteractionMutation()) return false
95
+
96
+ val currentText = text?.toString() ?: return false
97
+ val scalarStart = 0
98
+ val scalarEnd = currentText.codePointCount(0, currentText.length)
99
+ insertPlainTextRangeInRust(scalarStart, scalarEnd, replacement)
100
+ return true
101
+ }
@@ -0,0 +1,220 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.graphics.Typeface
4
+ import android.text.Editable
5
+ import android.text.Spanned
6
+ import android.view.inputmethod.BaseInputConnection
7
+
8
+ internal fun EditorEditText.authorizedUtf16RangeImpl(start: Int, end: Int): Pair<Int, Int> {
9
+ if (start == end) {
10
+ val snapped = PositionBridge.snapToScalarBoundary(
11
+ start,
12
+ lastAuthorizedText,
13
+ biasForward = true
14
+ )
15
+ return snapped to snapped
16
+ }
17
+ return PositionBridge.snapRangeToScalarBoundaries(start, end, lastAuthorizedText)
18
+ }
19
+
20
+ internal fun EditorEditText.isCurrentTextAuthorizedForEditorImpl(): Boolean =
21
+ (text?.toString() ?: "") == lastAuthorizedText
22
+
23
+ internal fun EditorEditText.captureCompositionReplacementRangeIfNeededImpl() {
24
+ if (didInvalidateCompositionReplacementRange) return
25
+ if (compositionReplacementRange() != null) return
26
+ val (start, end) = normalizedUtf16SelectionRange() ?: return
27
+ setCompositionReplacementRange(start, end)
28
+ }
29
+
30
+ internal fun EditorEditText.setCompositionReplacementRangeImpl(start: Int, end: Int) {
31
+ if (didInvalidateCompositionReplacementRange) return
32
+ val replacementRange = authorizedUtf16Range(start, end)
33
+ composingReplacementStartUtf16 = replacementRange.first
34
+ composingReplacementEndUtf16 = replacementRange.second
35
+ composingReplacementAuthorizedTextRevision = lastAuthorizedTextRevision
36
+ didInvalidateCompositionReplacementRange = false
37
+ }
38
+
39
+ internal fun EditorEditText.compositionReplacementRangeImpl(): Pair<Int, Int>? {
40
+ val start = composingReplacementStartUtf16 ?: return null
41
+ val end = composingReplacementEndUtf16 ?: return null
42
+ if (composingReplacementAuthorizedTextRevision != lastAuthorizedTextRevision) {
43
+ clearCompositionTrackingForEditor()
44
+ didInvalidateCompositionReplacementRange = true
45
+ return null
46
+ }
47
+ return start to end
48
+ }
49
+
50
+ internal fun EditorEditText.authorizedSelectionForTransientInputRestore(
51
+ currentStart: Int,
52
+ currentEnd: Int
53
+ ): Pair<Int, Int>? {
54
+ compositionReplacementRange()?.let { return it }
55
+ return if (
56
+ currentStart >= 0 &&
57
+ currentEnd >= 0 &&
58
+ currentStart <= lastAuthorizedText.length &&
59
+ currentEnd <= lastAuthorizedText.length
60
+ ) {
61
+ currentStart to currentEnd
62
+ } else {
63
+ null
64
+ }
65
+ }
66
+
67
+ internal fun EditorEditText.consumeInvalidatedCompositionReplacementRangeForEditorImpl(): Boolean {
68
+ val invalidated = didInvalidateCompositionReplacementRange
69
+ didInvalidateCompositionReplacementRange = false
70
+ return invalidated
71
+ }
72
+
73
+ internal fun EditorEditText.hasInvalidatedCompositionReplacementRangeForEditorImpl(): Boolean =
74
+ didInvalidateCompositionReplacementRange
75
+
76
+ internal fun EditorEditText.setComposingTextForEditorImpl(text: String?) {
77
+ composingText = text
78
+ }
79
+
80
+ internal fun EditorEditText.composingTextForEditorImpl(): String? = composingText
81
+
82
+ internal fun EditorEditText.applyTransientComposingTextStyleForEditorImpl() {
83
+ val editable = text ?: return
84
+ removeTransientComposingTextStyleSpans(editable)
85
+
86
+ val start = BaseInputConnection.getComposingSpanStart(editable)
87
+ val end = BaseInputConnection.getComposingSpanEnd(editable)
88
+ if (start < 0 || end < 0 || start >= end || end > editable.length) return
89
+
90
+ val textStyle = theme?.effectiveTextStyle("paragraph")
91
+ val resolvedTextSize =
92
+ textStyle?.fontSize?.times(resources.displayMetrics.density) ?: baseFontSize
93
+ val resolvedTextColor = textStyle?.color ?: baseTextColor
94
+
95
+ editable.setSpan(
96
+ TransientComposingSizeSpan(resolvedTextSize.toInt()),
97
+ start,
98
+ end,
99
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
100
+ )
101
+ editable.setSpan(
102
+ TransientComposingColorSpan(resolvedTextColor),
103
+ start,
104
+ end,
105
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
106
+ )
107
+
108
+ val typefaceStyle = textStyle?.typefaceStyle() ?: Typeface.NORMAL
109
+ if (typefaceStyle != Typeface.NORMAL) {
110
+ editable.setSpan(
111
+ TransientComposingStyleSpan(typefaceStyle),
112
+ start,
113
+ end,
114
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
115
+ )
116
+ }
117
+
118
+ val fontFamily = textStyle?.fontFamily?.takeIf { it.isNotBlank() }
119
+ if (fontFamily != null) {
120
+ editable.setSpan(
121
+ TransientComposingTypefaceSpan(fontFamily),
122
+ start,
123
+ end,
124
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
125
+ )
126
+ }
127
+ invalidateImeTextCoordinateMapperForEditor()
128
+ }
129
+
130
+ internal fun EditorEditText.removeTransientComposingTextStyleSpans(editable: Editable) {
131
+ editable
132
+ .getSpans(0, editable.length, TransientComposingTextStyleSpan::class.java)
133
+ .forEach(editable::removeSpan)
134
+ invalidateImeTextCoordinateMapperForEditor()
135
+ }
136
+
137
+ internal fun EditorEditText.composingTextFromVisibleReplacementForEditorImpl(): String? {
138
+ val (start, end) = compositionReplacementRange() ?: return null
139
+ val authorizedText = lastAuthorizedText
140
+ val currentText = text?.toString() ?: return null
141
+ if (start < 0 || end < start || end > authorizedText.length) return null
142
+
143
+ val authorizedPrefix = authorizedText.substring(0, start)
144
+ val authorizedSuffix = authorizedText.substring(end)
145
+ if (!currentText.startsWith(authorizedPrefix)) return null
146
+ if (!currentText.endsWith(authorizedSuffix)) return null
147
+
148
+ val replacementEnd = currentText.length - authorizedSuffix.length
149
+ if (replacementEnd < authorizedPrefix.length) return null
150
+ return currentText.substring(authorizedPrefix.length, replacementEnd)
151
+ }
152
+
153
+ internal fun EditorEditText.clearCompositionTrackingForEditorImpl() {
154
+ composingText = null
155
+ composingReplacementStartUtf16 = null
156
+ composingReplacementEndUtf16 = null
157
+ composingReplacementAuthorizedTextRevision = null
158
+ }
159
+
160
+ internal fun EditorEditText.hasCompositionTrackingForEditor(): Boolean = composingText != null ||
161
+ composingReplacementStartUtf16 != null ||
162
+ composingReplacementEndUtf16 != null ||
163
+ composingReplacementAuthorizedTextRevision != null
164
+
165
+ internal fun EditorEditText.retireInputConnectionForEditor() {
166
+ recordImeTraceForTesting("retireInputConnection")
167
+ activeInputConnection?.clearCompositionTrackingForEditor()
168
+ invalidateInputConnectionsForEditor()
169
+ clearCompositionTrackingForEditor()
170
+ clearCompositionInvalidationForEditor()
171
+ clearNativeComposingSpans()
172
+ }
173
+
174
+ internal fun EditorEditText.retireInputConnectionForHostDetachImpl() {
175
+ retireInputConnectionForEditor()
176
+ }
177
+
178
+ internal fun EditorEditText.isEditorDestroyedForInputImpl(): Boolean =
179
+ editorId != 0L && NativeEditorViewRegistry.isDestroyed(editorId)
180
+
181
+ internal fun EditorEditText.hasLiveEditor(): Boolean =
182
+ editorId != 0L && !isEditorDestroyedForInput()
183
+
184
+ internal fun EditorEditText.discardTransientInputForDestroyedEditorIfNeeded(): Boolean {
185
+ if (!isEditorDestroyedForInput()) return false
186
+ cancelExternalTextCompositionForLifecycleIfNeeded()
187
+ retireInputConnectionForEditor()
188
+ clearNativeTextMutationAfterBlurWindow()
189
+ clearNativeTextMutationAdoptionSuppression()
190
+ return true
191
+ }
192
+
193
+ internal fun EditorEditText.discardTransientInputAndRestoreAuthorizedTextForEditor() {
194
+ cancelExternalTextCompositionForLifecycleIfNeeded()
195
+ retireInputConnectionForEditor()
196
+ clearNativeTextMutationAfterBlurWindow()
197
+ restoreAuthorizedTextSnapshotForEditor()
198
+ suppressNativeTextMutationAdoptionForCurrentRevision()
199
+ }
200
+
201
+ internal fun EditorEditText.restoreAuthorizedTextSnapshotForEditor() {
202
+ if ((text?.toString() ?: "") == lastAuthorizedText) return
203
+ val authorizedSnapshot = lastAuthorizedRenderedText ?: lastAuthorizedText
204
+ val wasApplyingRustState = isApplyingRustState
205
+ isApplyingRustState = true
206
+ beginBatchEdit()
207
+ try {
208
+ setText(authorizedSnapshot)
209
+ } finally {
210
+ endBatchEdit()
211
+ isApplyingRustState = wasApplyingRustState
212
+ }
213
+ }
214
+
215
+ internal fun EditorEditText.restartInputAfterCompositionInvalidationIfNeeded(
216
+ shouldRestart: Boolean
217
+ ) {
218
+ if (!shouldRestart) return
219
+ restartInputForEditorIfFocused("focused")
220
+ }