@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,266 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.content.Context
4
+ import android.graphics.Canvas
5
+ import android.graphics.Color
6
+ import android.graphics.Paint
7
+ import android.graphics.Rect
8
+ import android.graphics.RectF
9
+ import android.os.Build
10
+ import android.util.AttributeSet
11
+ import android.view.MotionEvent
12
+ import android.view.View
13
+ import kotlin.math.ceil
14
+ import kotlin.math.floor
15
+ import kotlin.math.max
16
+
17
+ internal class ImageResizeOverlayView @JvmOverloads constructor(
18
+ context: Context,
19
+ attrs: AttributeSet? = null,
20
+ defStyleAttr: Int = 0
21
+ ) : View(context, attrs, defStyleAttr) {
22
+ private enum class Corner {
23
+ TOP_LEFT,
24
+ TOP_RIGHT,
25
+ BOTTOM_LEFT,
26
+ BOTTOM_RIGHT
27
+ }
28
+
29
+ private data class DragState(
30
+ val corner: Corner,
31
+ val originalRect: RectF,
32
+ val docPos: Int,
33
+ val maximumWidthPx: Float,
34
+ var previewRect: RectF
35
+ )
36
+
37
+ private var editorView: RichTextEditorView? = null
38
+ private var currentGeometry: EditorEditText.SelectedImageGeometry? = null
39
+ private var dragState: DragState? = null
40
+
41
+ private val density = resources.displayMetrics.density
42
+ private val handleRadiusPx = 10f * density
43
+ private val handleTouchRadiusPx = 24f * density
44
+ private val minimumImageSizePx = 48f * density
45
+ private val borderPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
46
+ color = Color.parseColor("#0A84FF")
47
+ style = Paint.Style.STROKE
48
+ strokeWidth = max(2f, density)
49
+ }
50
+ private val handleFillPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
51
+ color = Color.WHITE
52
+ style = Paint.Style.FILL
53
+ }
54
+ private val handleStrokePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
55
+ color = Color.parseColor("#0A84FF")
56
+ style = Paint.Style.STROKE
57
+ strokeWidth = max(2f, density)
58
+ }
59
+
60
+ init {
61
+ setWillNotDraw(false)
62
+ visibility = INVISIBLE
63
+ }
64
+
65
+ fun bind(editorView: RichTextEditorView) {
66
+ if (this.editorView !== editorView) cancelActiveResize()
67
+ this.editorView = editorView
68
+ }
69
+
70
+ fun refresh() {
71
+ val nextGeometry = editorView?.selectedImageGeometry()
72
+ if (nextGeometry == null) {
73
+ cancelActiveResize()
74
+ return
75
+ }
76
+ if (currentGeometry?.docPos != nextGeometry.docPos) cancelActiveResize()
77
+ currentGeometry = nextGeometry
78
+ visibility = VISIBLE
79
+ bringToFront()
80
+ updateSystemGestureExclusionRects()
81
+ invalidate()
82
+ }
83
+
84
+ fun cancelActiveResize() {
85
+ dragState = null
86
+ currentGeometry = null
87
+ parent?.requestDisallowInterceptTouchEvent(false)
88
+ visibility = INVISIBLE
89
+ updateSystemGestureExclusionRects()
90
+ invalidate()
91
+ }
92
+
93
+ fun visibleRectForTesting(): RectF? = currentGeometry?.rect?.let(::RectF)
94
+
95
+ fun simulateResizeForTesting(widthPx: Float, heightPx: Float) {
96
+ val geometry = currentGeometry ?: return
97
+ editorView?.resizeImage(geometry.docPos, widthPx, heightPx)
98
+ }
99
+
100
+ override fun onDraw(canvas: Canvas) {
101
+ super.onDraw(canvas)
102
+ val geometry = currentGeometry ?: return
103
+ canvas.drawRoundRect(geometry.rect, 8f * density, 8f * density, borderPaint)
104
+ for (corner in Corner.entries) {
105
+ val center = handleCenter(corner, geometry.rect)
106
+ canvas.drawCircle(center.x, center.y, handleRadiusPx, handleFillPaint)
107
+ canvas.drawCircle(center.x, center.y, handleRadiusPx, handleStrokePaint)
108
+ }
109
+ }
110
+
111
+ override fun onTouchEvent(event: MotionEvent): Boolean {
112
+ val geometry = currentGeometry ?: return false
113
+
114
+ when (event.actionMasked) {
115
+ MotionEvent.ACTION_DOWN -> {
116
+ val corner = cornerAt(event.x, event.y, geometry.rect) ?: return false
117
+ dragState = DragState(
118
+ corner = corner,
119
+ originalRect = RectF(geometry.rect),
120
+ docPos = geometry.docPos,
121
+ maximumWidthPx = editorView?.maximumImageWidthPx() ?: geometry.rect.width(),
122
+ previewRect = RectF(geometry.rect)
123
+ )
124
+ parent?.requestDisallowInterceptTouchEvent(true)
125
+ return true
126
+ }
127
+
128
+ MotionEvent.ACTION_MOVE -> {
129
+ val state = dragState ?: return false
130
+ val nextRect = resizedRect(
131
+ originalRect = state.originalRect,
132
+ corner = state.corner,
133
+ deltaX = event.x - handleCenter(state.corner, state.originalRect).x,
134
+ deltaY = event.y - handleCenter(state.corner, state.originalRect).y,
135
+ maximumWidthPx = state.maximumWidthPx
136
+ )
137
+ state.previewRect = RectF(nextRect)
138
+ currentGeometry = EditorEditText.SelectedImageGeometry(state.docPos, nextRect)
139
+ updateSystemGestureExclusionRects()
140
+ invalidate()
141
+ return true
142
+ }
143
+
144
+ MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
145
+ val state = dragState ?: return false
146
+ if (event.actionMasked == MotionEvent.ACTION_UP) {
147
+ editorView?.resizeImage(
148
+ state.docPos,
149
+ state.previewRect.width(),
150
+ state.previewRect.height()
151
+ )
152
+ }
153
+ dragState = null
154
+ parent?.requestDisallowInterceptTouchEvent(false)
155
+ post { refresh() }
156
+ return true
157
+ }
158
+ }
159
+
160
+ return false
161
+ }
162
+
163
+ override fun onDetachedFromWindow() {
164
+ cancelActiveResize()
165
+ super.onDetachedFromWindow()
166
+ }
167
+
168
+ override fun onSizeChanged(width: Int, height: Int, oldWidth: Int, oldHeight: Int) {
169
+ super.onSizeChanged(width, height, oldWidth, oldHeight)
170
+ updateSystemGestureExclusionRects()
171
+ }
172
+
173
+ private fun cornerAt(x: Float, y: Float, rect: RectF): Corner? =
174
+ Corner.entries.firstOrNull { corner ->
175
+ val center = handleCenter(corner, rect)
176
+ val dx = x - center.x
177
+ val dy = y - center.y
178
+ (dx * dx) + (dy * dy) <= handleTouchRadiusPx * handleTouchRadiusPx
179
+ }
180
+
181
+ private fun updateSystemGestureExclusionRects() {
182
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) return
183
+ val geometry = currentGeometry
184
+ val nextRects = if (geometry == null || visibility != VISIBLE || width == 0 ||
185
+ height == 0
186
+ ) {
187
+ emptyList()
188
+ } else {
189
+ Corner.entries.map { corner ->
190
+ val center = handleCenter(corner, geometry.rect)
191
+ Rect(
192
+ floor(center.x - handleTouchRadiusPx).toInt().coerceIn(0, width),
193
+ floor(center.y - handleTouchRadiusPx).toInt().coerceIn(0, height),
194
+ ceil(center.x + handleTouchRadiusPx).toInt().coerceIn(0, width),
195
+ ceil(center.y + handleTouchRadiusPx).toInt().coerceIn(0, height)
196
+ )
197
+ }
198
+ }
199
+ if (systemGestureExclusionRects != nextRects) {
200
+ systemGestureExclusionRects = nextRects
201
+ }
202
+ }
203
+
204
+ private fun handleCenter(corner: Corner, rect: RectF) = when (corner) {
205
+ Corner.TOP_LEFT -> android.graphics.PointF(rect.left, rect.top)
206
+ Corner.TOP_RIGHT -> android.graphics.PointF(rect.right, rect.top)
207
+ Corner.BOTTOM_LEFT -> android.graphics.PointF(rect.left, rect.bottom)
208
+ Corner.BOTTOM_RIGHT -> android.graphics.PointF(rect.right, rect.bottom)
209
+ }
210
+
211
+ private fun anchorPoint(corner: Corner, rect: RectF) = when (corner) {
212
+ Corner.TOP_LEFT -> android.graphics.PointF(rect.right, rect.bottom)
213
+ Corner.TOP_RIGHT -> android.graphics.PointF(rect.left, rect.bottom)
214
+ Corner.BOTTOM_LEFT -> android.graphics.PointF(rect.right, rect.top)
215
+ Corner.BOTTOM_RIGHT -> android.graphics.PointF(rect.left, rect.top)
216
+ }
217
+
218
+ private fun resizedRect(
219
+ originalRect: RectF,
220
+ corner: Corner,
221
+ deltaX: Float,
222
+ deltaY: Float,
223
+ maximumWidthPx: Float?
224
+ ): RectF {
225
+ val aspectRatio = max(originalRect.width() / max(originalRect.height(), 1f), 0.1f)
226
+ val signedDx = if (corner == Corner.TOP_RIGHT ||
227
+ corner == Corner.BOTTOM_RIGHT
228
+ ) {
229
+ deltaX
230
+ } else {
231
+ -deltaX
232
+ }
233
+ val signedDy = if (corner == Corner.BOTTOM_LEFT ||
234
+ corner == Corner.BOTTOM_RIGHT
235
+ ) {
236
+ deltaY
237
+ } else {
238
+ -deltaY
239
+ }
240
+ val widthScale = (originalRect.width() + signedDx) / max(originalRect.width(), 1f)
241
+ val heightScale = (originalRect.height() + signedDy) / max(originalRect.height(), 1f)
242
+ val scale = max(
243
+ max(widthScale, heightScale),
244
+ minimumImageSizePx / max(originalRect.width(), 1f)
245
+ )
246
+ val unclampedWidth = max(minimumImageSizePx, originalRect.width() * scale)
247
+ val unclampedHeight = max(minimumImageSizePx / aspectRatio, unclampedWidth / aspectRatio)
248
+ val (width, height) = editorView?.let { boundEditor ->
249
+ maximumWidthPx?.let { maxWidth ->
250
+ boundEditor.clampImageSize(
251
+ widthPx = unclampedWidth,
252
+ heightPx = unclampedHeight,
253
+ maximumWidthPx = maxWidth
254
+ )
255
+ } ?: boundEditor.clampImageSize(unclampedWidth, unclampedHeight)
256
+ } ?: (unclampedWidth to unclampedHeight)
257
+ val anchor = anchorPoint(corner, originalRect)
258
+
259
+ return when (corner) {
260
+ Corner.TOP_LEFT -> RectF(anchor.x - width, anchor.y - height, anchor.x, anchor.y)
261
+ Corner.TOP_RIGHT -> RectF(anchor.x, anchor.y - height, anchor.x + width, anchor.y)
262
+ Corner.BOTTOM_LEFT -> RectF(anchor.x - width, anchor.y, anchor.x, anchor.y + height)
263
+ Corner.BOTTOM_RIGHT -> RectF(anchor.x, anchor.y, anchor.x + width, anchor.y + height)
264
+ }
265
+ }
266
+ }
@@ -0,0 +1,102 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.text.Annotation
4
+ import android.text.NoCopySpan
5
+ import android.text.Selection
6
+ import android.text.SpannableString
7
+ import android.text.Spanned
8
+
9
+ internal class ImeTextCoordinateMapper private constructor(
10
+ val visibleText: CharSequence,
11
+ val generation: Long,
12
+ private val rawToImeOffsets: IntArray,
13
+ private val imeToRawBeforeOffsets: IntArray,
14
+ private val imeToRawAfterOffsets: IntArray
15
+ ) {
16
+ enum class Affinity {
17
+ BEFORE,
18
+ AFTER
19
+ }
20
+
21
+ fun rawToIme(offset: Int): Int = rawToImeOffsets[offset.coerceIn(0, rawToImeOffsets.lastIndex)]
22
+
23
+ fun imeToRaw(offset: Int, affinity: Affinity): Int {
24
+ val clamped = offset.coerceIn(0, imeToRawBeforeOffsets.lastIndex)
25
+ return when (affinity) {
26
+ Affinity.BEFORE -> imeToRawBeforeOffsets[clamped]
27
+ Affinity.AFTER -> imeToRawAfterOffsets[clamped]
28
+ }
29
+ }
30
+
31
+ companion object {
32
+ fun build(raw: CharSequence, generation: Long): ImeTextCoordinateMapper {
33
+ val rawToIme = IntArray(raw.length + 1)
34
+ val visible = StringBuilder(raw.length)
35
+ val generatedMarkers = BooleanArray(raw.length)
36
+ if (raw is Spanned) {
37
+ raw.getSpans(0, raw.length, Annotation::class.java)
38
+ .filter { it.key == RenderBridge.NATIVE_LIST_MARKER_ANNOTATION }
39
+ .forEach { marker ->
40
+ for (offset in raw.getSpanStart(marker) until raw.getSpanEnd(marker)) {
41
+ generatedMarkers[offset] = true
42
+ }
43
+ }
44
+ }
45
+ var visibleOffset = 0
46
+ rawToIme[0] = 0
47
+ for (rawOffset in raw.indices) {
48
+ if (!isInvisiblePlaceholder(raw[rawOffset]) && !generatedMarkers[rawOffset]) {
49
+ visible.append(raw[rawOffset])
50
+ visibleOffset += 1
51
+ }
52
+ rawToIme[rawOffset + 1] = visibleOffset
53
+ }
54
+
55
+ val imeToRawBefore = IntArray(visibleOffset + 1) { Int.MAX_VALUE }
56
+ val imeToRawAfter = IntArray(visibleOffset + 1) { -1 }
57
+ for (rawOffset in rawToIme.indices) {
58
+ val imeOffset = rawToIme[rawOffset]
59
+ imeToRawBefore[imeOffset] = minOf(imeToRawBefore[imeOffset], rawOffset)
60
+ imeToRawAfter[imeOffset] = maxOf(imeToRawAfter[imeOffset], rawOffset)
61
+ }
62
+
63
+ val visibleText = if (raw is Spanned) {
64
+ SpannableString(visible.toString()).apply {
65
+ raw.getSpans(0, raw.length, Any::class.java).forEach { span ->
66
+ val rawStart = raw.getSpanStart(span)
67
+ val rawEnd = raw.getSpanEnd(span)
68
+ val flags = raw.getSpanFlags(span)
69
+ if (
70
+ rawStart >= 0 &&
71
+ rawEnd >= rawStart &&
72
+ span !is NoCopySpan &&
73
+ span !== Selection.SELECTION_START &&
74
+ span !== Selection.SELECTION_END &&
75
+ flags and Spanned.SPAN_COMPOSING == 0
76
+ ) {
77
+ setSpan(
78
+ span,
79
+ rawToIme[rawStart.coerceIn(0, raw.length)],
80
+ rawToIme[rawEnd.coerceIn(0, raw.length)],
81
+ flags
82
+ )
83
+ }
84
+ }
85
+ }
86
+ } else {
87
+ visible.toString()
88
+ }
89
+
90
+ return ImeTextCoordinateMapper(
91
+ visibleText = visibleText,
92
+ generation = generation,
93
+ rawToImeOffsets = rawToIme,
94
+ imeToRawBeforeOffsets = imeToRawBefore,
95
+ imeToRawAfterOffsets = imeToRawAfter
96
+ )
97
+ }
98
+
99
+ private fun isInvisiblePlaceholder(character: Char): Boolean =
100
+ character == LayoutConstants.SYNTHETIC_PLACEHOLDER_CHARACTER[0]
101
+ }
102
+ }
@@ -0,0 +1,101 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.view.View
4
+ import androidx.core.view.WindowInsetsAnimationCompat
5
+ import androidx.core.view.WindowInsetsCompat
6
+
7
+ internal class KeyboardToolbarImeAnimationController(
8
+ private val toolbarView: View,
9
+ private val onTargetImeBottomChanged: (Int) -> Unit,
10
+ private val onImeAnimationSettled: (Int) -> Unit
11
+ ) {
12
+ private var activeImeAnimation: WindowInsetsAnimationCompat? = null
13
+ private var displayedImeBottom = 0
14
+ private var startImeBottom = 0
15
+ private var targetImeBottom = 0
16
+
17
+ val animationCallback = object : WindowInsetsAnimationCompat.Callback(
18
+ DISPATCH_MODE_CONTINUE_ON_SUBTREE
19
+ ) {
20
+ override fun onPrepare(animation: WindowInsetsAnimationCompat) {
21
+ if (!animation.affectsIme()) return
22
+ activeImeAnimation = animation
23
+ startImeBottom = displayedImeBottom
24
+ }
25
+
26
+ override fun onStart(
27
+ animation: WindowInsetsAnimationCompat,
28
+ bounds: WindowInsetsAnimationCompat.BoundsCompat
29
+ ): WindowInsetsAnimationCompat.BoundsCompat {
30
+ if (animation !== activeImeAnimation) return bounds
31
+ updateToolbarForAnimatedImeBottom(startImeBottom)
32
+ return bounds
33
+ }
34
+
35
+ override fun onProgress(
36
+ insets: WindowInsetsCompat,
37
+ runningAnimations: MutableList<WindowInsetsAnimationCompat>
38
+ ): WindowInsetsCompat {
39
+ if (
40
+ activeImeAnimation != null &&
41
+ runningAnimations.any { it.affectsIme() }
42
+ ) {
43
+ updateToolbarForAnimatedImeBottom(insets.imeBottom())
44
+ }
45
+ return insets
46
+ }
47
+
48
+ override fun onEnd(animation: WindowInsetsAnimationCompat) {
49
+ if (animation !== activeImeAnimation) return
50
+ activeImeAnimation = null
51
+ settleAtTargetImeBottom()
52
+ }
53
+ }
54
+
55
+ fun onApplyWindowInsets(insets: WindowInsetsCompat) {
56
+ targetImeBottom = insets.imeBottom()
57
+ onTargetImeBottomChanged(targetImeBottom)
58
+ if (activeImeAnimation == null) {
59
+ settleAtTargetImeBottom()
60
+ } else if (startImeBottom > 0 || targetImeBottom > 0) {
61
+ toolbarView.visibility = View.VISIBLE
62
+ }
63
+ }
64
+
65
+ fun cancel() {
66
+ activeImeAnimation = null
67
+ displayedImeBottom = targetImeBottom
68
+ startImeBottom = targetImeBottom
69
+ toolbarView.translationY = 0f
70
+ }
71
+
72
+ fun reset() {
73
+ activeImeAnimation = null
74
+ displayedImeBottom = 0
75
+ startImeBottom = 0
76
+ targetImeBottom = 0
77
+ toolbarView.translationY = 0f
78
+ }
79
+
80
+ private fun updateToolbarForAnimatedImeBottom(animatedImeBottom: Int) {
81
+ displayedImeBottom = animatedImeBottom
82
+ toolbarView.translationY = (targetImeBottom - animatedImeBottom).toFloat()
83
+ if (displayedImeBottom > 0 || startImeBottom > 0 || targetImeBottom > 0) {
84
+ toolbarView.visibility = View.VISIBLE
85
+ }
86
+ }
87
+
88
+ private fun settleAtTargetImeBottom() {
89
+ displayedImeBottom = targetImeBottom
90
+ startImeBottom = targetImeBottom
91
+ toolbarView.translationY = 0f
92
+ toolbarView.visibility = if (targetImeBottom > 0) View.VISIBLE else View.INVISIBLE
93
+ onImeAnimationSettled(targetImeBottom)
94
+ }
95
+
96
+ private fun WindowInsetsAnimationCompat.affectsIme(): Boolean =
97
+ typeMask and WindowInsetsCompat.Type.ime() != 0
98
+
99
+ private fun WindowInsetsCompat.imeBottom(): Int =
100
+ getInsets(WindowInsetsCompat.Type.ime()).bottom
101
+ }
@@ -0,0 +1,234 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.content.Context
4
+ import android.graphics.Color
5
+ import android.graphics.Typeface
6
+ import android.graphics.drawable.GradientDrawable
7
+ import android.util.TypedValue
8
+ import android.view.Gravity
9
+ import android.view.View
10
+ import android.widget.LinearLayout
11
+ import androidx.appcompat.content.res.AppCompatResources
12
+ import androidx.appcompat.widget.AppCompatTextView
13
+ import androidx.core.view.setPadding
14
+ import com.google.android.material.R as MaterialR
15
+ import kotlin.math.roundToInt
16
+ import org.json.JSONObject
17
+
18
+ internal fun withAlpha(color: Int, alphaFraction: Float): Int {
19
+ val alpha = (alphaFraction.coerceIn(0f, 1f) * 255).roundToInt()
20
+ return Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color))
21
+ }
22
+
23
+ internal class MentionSuggestionChipView(
24
+ context: Context,
25
+ suggestion: NativeMentionSuggestion,
26
+ trigger: String = "@"
27
+ ) : LinearLayout(context) {
28
+ private val titleView = AppCompatTextView(context)
29
+ private val subtitleView = AppCompatTextView(context)
30
+ private var theme: EditorMentionTheme? = null
31
+ private var toolbarAppearance: EditorToolbarAppearance = EditorToolbarAppearance.CUSTOM
32
+ private val density = resources.displayMetrics.density
33
+ var suggestion: NativeMentionSuggestion = suggestion
34
+ private set
35
+ private var trigger: String = trigger
36
+
37
+ init {
38
+ orientation = VERTICAL
39
+ gravity = Gravity.CENTER_VERTICAL
40
+ minimumHeight = dp(40)
41
+ setPadding(dp(12), dp(8), dp(12), dp(8))
42
+ isClickable = true
43
+ isFocusable = true
44
+
45
+ titleView.apply {
46
+ text = suggestion.displayLabel(trigger)
47
+ setTypeface(typeface, Typeface.BOLD)
48
+ textSize = 14f
49
+ includeFontPadding = false
50
+ }
51
+ addView(
52
+ titleView,
53
+ LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
54
+ )
55
+
56
+ subtitleView.apply {
57
+ text = suggestion.subtitle
58
+ textSize = 12f
59
+ includeFontPadding = false
60
+ visibility = if (suggestion.subtitle.isNullOrBlank()) View.GONE else View.VISIBLE
61
+ }
62
+ addView(
63
+ subtitleView,
64
+ LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
65
+ )
66
+
67
+ setOnTouchListener { _, motionEvent ->
68
+ when (motionEvent.actionMasked) {
69
+ android.view.MotionEvent.ACTION_DOWN,
70
+ android.view.MotionEvent.ACTION_MOVE -> updateAppearance(highlighted = true)
71
+
72
+ android.view.MotionEvent.ACTION_CANCEL,
73
+ android.view.MotionEvent.ACTION_UP -> updateAppearance(highlighted = false)
74
+ }
75
+ false
76
+ }
77
+
78
+ applyTheme(null)
79
+ }
80
+
81
+ fun updateSuggestion(suggestion: NativeMentionSuggestion, trigger: String) {
82
+ this.suggestion = suggestion
83
+ this.trigger = trigger
84
+ titleView.text = suggestion.displayLabel(trigger)
85
+ subtitleView.text = suggestion.subtitle
86
+ subtitleView.visibility =
87
+ if (suggestion.subtitle.isNullOrBlank()) View.GONE else View.VISIBLE
88
+ }
89
+
90
+ fun applyTheme(
91
+ theme: EditorMentionTheme?,
92
+ toolbarAppearance: EditorToolbarAppearance = EditorToolbarAppearance.CUSTOM
93
+ ) {
94
+ this.theme = theme
95
+ this.toolbarAppearance = toolbarAppearance
96
+ val option = theme?.suggestions?.option
97
+ val hasSubtitle = !suggestion.subtitle.isNullOrBlank()
98
+ subtitleView.visibility = if (hasSubtitle) View.VISIBLE else View.GONE
99
+ background = GradientDrawable().apply {
100
+ shape = GradientDrawable.RECTANGLE
101
+ cornerRadius =
102
+ (
103
+ if (toolbarAppearance ==
104
+ EditorToolbarAppearance.NATIVE
105
+ ) {
106
+ 20f
107
+ } else {
108
+ (option?.borderRadius ?: 12f)
109
+ }
110
+ ) *
111
+ density
112
+ setColor(
113
+ if (toolbarAppearance == EditorToolbarAppearance.NATIVE) {
114
+ Color.TRANSPARENT
115
+ } else {
116
+ option?.backgroundColor ?: resolveColorAttr(
117
+ MaterialR.attr.colorSurfaceContainerLow,
118
+ MaterialR.attr.colorSurfaceVariant,
119
+ MaterialR.attr.colorSurface,
120
+ android.R.attr.colorBackground
121
+ )
122
+ }
123
+ )
124
+ val strokeWidth = if (toolbarAppearance == EditorToolbarAppearance.NATIVE) {
125
+ 0
126
+ } else {
127
+ ((option?.borderWidth ?: 0f) * density).toInt()
128
+ }
129
+ if (strokeWidth > 0) {
130
+ setStroke(strokeWidth, option?.borderColor ?: Color.TRANSPARENT)
131
+ }
132
+ }
133
+ updateAppearance(highlighted = false)
134
+ }
135
+
136
+ private fun updateAppearance(highlighted: Boolean) {
137
+ val optionTheme = theme?.suggestions?.option
138
+ val backgroundDrawable = background as? GradientDrawable
139
+ val backgroundColor = if (toolbarAppearance == EditorToolbarAppearance.NATIVE) {
140
+ if (highlighted) {
141
+ resolveColorAttr(
142
+ MaterialR.attr.colorSecondaryContainer,
143
+ MaterialR.attr.colorPrimaryContainer,
144
+ MaterialR.attr.colorSurfaceVariant,
145
+ android.R.attr.colorAccent
146
+ )
147
+ } else {
148
+ Color.TRANSPARENT
149
+ }
150
+ } else if (highlighted) {
151
+ optionTheme?.highlightedBackgroundColor ?: resolveColorAttr(
152
+ MaterialR.attr.colorSecondaryContainer,
153
+ MaterialR.attr.colorPrimaryContainer,
154
+ MaterialR.attr.colorSurfaceVariant,
155
+ android.R.attr.colorAccent
156
+ )
157
+ } else {
158
+ optionTheme?.backgroundColor ?: resolveColorAttr(
159
+ MaterialR.attr.colorSurfaceContainerLow,
160
+ MaterialR.attr.colorSurfaceVariant,
161
+ MaterialR.attr.colorSurface,
162
+ android.R.attr.colorBackground
163
+ )
164
+ }
165
+ backgroundDrawable?.setColor(backgroundColor)
166
+ titleView.setTextColor(
167
+ if (toolbarAppearance == EditorToolbarAppearance.NATIVE && !highlighted) {
168
+ resolveColorAttr(
169
+ MaterialR.attr.colorOnSurface,
170
+ android.R.attr.textColorPrimary
171
+ )
172
+ } else if (highlighted) {
173
+ optionTheme?.highlightedTextColor
174
+ ?: optionTheme?.textColor
175
+ ?: resolveColorAttr(
176
+ MaterialR.attr.colorOnSecondaryContainer,
177
+ MaterialR.attr.colorOnPrimaryContainer,
178
+ MaterialR.attr.colorOnSurface,
179
+ android.R.attr.textColorPrimary
180
+ )
181
+ } else {
182
+ optionTheme?.textColor
183
+ ?: resolveColorAttr(
184
+ MaterialR.attr.colorOnSurface,
185
+ android.R.attr.textColorPrimary
186
+ )
187
+ }
188
+ )
189
+ subtitleView.setTextColor(
190
+ if (toolbarAppearance == EditorToolbarAppearance.NATIVE) {
191
+ resolveColorAttr(
192
+ MaterialR.attr.colorOnSurfaceVariant,
193
+ android.R.attr.textColorSecondary
194
+ )
195
+ } else {
196
+ optionTheme?.secondaryTextColor ?: resolveColorAttr(
197
+ MaterialR.attr.colorOnSurfaceVariant,
198
+ android.R.attr.textColorSecondary
199
+ )
200
+ }
201
+ )
202
+ }
203
+
204
+ fun usesNativeAppearanceForTesting(): Boolean =
205
+ toolbarAppearance == EditorToolbarAppearance.NATIVE
206
+
207
+ fun titleTextForTesting(): String = titleView.text.toString()
208
+
209
+ private fun dp(value: Int): Int = (value * density).toInt()
210
+
211
+ private fun resolveColorAttr(vararg attrs: Int): Int {
212
+ val typedValue = TypedValue()
213
+ for (attr in attrs) {
214
+ if (!context.theme.resolveAttribute(attr, typedValue, true)) {
215
+ continue
216
+ }
217
+ if (typedValue.resourceId != 0) {
218
+ AppCompatResources.getColorStateList(context, typedValue.resourceId)
219
+ ?.defaultColor
220
+ ?.let { return it }
221
+ } else if (typedValue.type in
222
+ TypedValue.TYPE_FIRST_COLOR_INT..TypedValue.TYPE_LAST_COLOR_INT
223
+ ) {
224
+ return typedValue.data
225
+ }
226
+ }
227
+ return Color.TRANSPARENT
228
+ }
229
+ }
230
+
231
+ internal fun NativeMentionSuggestion.displayLabel(trigger: String): String {
232
+ val label = this.label.trim()
233
+ return if (trigger.isNotEmpty() && !label.startsWith(trigger)) "$trigger$label" else label
234
+ }