@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,460 @@
1
+ package com.apollohg.editor.viewer
2
+
3
+ import android.graphics.Rect
4
+ import com.apollohg.editor.DecodedBitmapBudget
5
+ import com.apollohg.editor.DecodedBitmapLease
6
+ import com.apollohg.editor.DecodedBitmapPriority
7
+ import com.apollohg.editor.ImageLoadingPolicy
8
+ import com.apollohg.editor.NativeImagePipeline
9
+ import com.apollohg.editor.RenderImageLoader
10
+ import com.apollohg.editor.viewer.ViewerInline.Atom
11
+ import org.json.JSONObject
12
+
13
+ /** Immutable attachment geometry emitted by preparation; bitmap state is not part of an artifact. */
14
+ internal data class ViewerImageAttachment(
15
+ val id: String,
16
+ val source: String,
17
+ val bounds: Rect,
18
+ val declaredSize: Pair<Int, Int>?,
19
+ /** Ordinal within the immutable prepared artifact; id is source-qualified cache identity. */
20
+ val ordinal: Int = -1
21
+ ) {
22
+ val hasDeclaredSize: Boolean get() = (declaredSize?.first ?: 0) > 0 &&
23
+ (declaredSize?.second ?: 0) > 0
24
+
25
+ companion object {
26
+ /** Compiler/admission ceiling; supports far more than the old 256 IDs. */
27
+ const val MAXIMUM_ADMITTED_ATTACHMENTS = 8_192
28
+ fun sourceAndDeclaredSize(block: ViewerBlock): Triple<String, String, Pair<Int, Int>?>? {
29
+ val atom =
30
+ block.inlines.filterIsInstance<Atom>().firstOrNull { it.nodeType == "image" }
31
+ ?: return null
32
+ val attrs = runCatching { JSONObject(atom.attrsJson) }.getOrNull() ?: return null
33
+ val source = attrs.optString("src").takeIf(String::isNotEmpty) ?: return null
34
+ val width = attrs.optDouble("width", Double.NaN).takeIf {
35
+ it.isFinite() && it > 0
36
+ }?.toInt()
37
+ val height = attrs.optDouble("height", Double.NaN).takeIf {
38
+ it.isFinite() && it > 0
39
+ }?.toInt()
40
+ return Triple(
41
+ "${atom.docPos}:$source",
42
+ source,
43
+ if (width != null &&
44
+ height != null
45
+ ) {
46
+ width to height
47
+ } else {
48
+ null
49
+ }
50
+ )
51
+ }
52
+ }
53
+ }
54
+
55
+ internal class ViewerImageIntrinsicStore(entryLimit: Int = 256) {
56
+ companion object {
57
+ val shared = ViewerImageIntrinsicStore()
58
+ }
59
+
60
+ private data class Entry(val size: Pair<Int, Int>, var access: Long)
61
+ private val lock = Any()
62
+ private var entryLimit = entryLimit.coerceAtLeast(1)
63
+ private val values = mutableMapOf<String, Entry>()
64
+ private var access = 0L
65
+
66
+ fun size(id: String): Pair<Int, Int>? {
67
+ val cached = synchronized(lock) {
68
+ values[id]?.also { entry ->
69
+ access += 1
70
+ entry.access = access
71
+ }?.size
72
+ }
73
+ // The global LRU is process-wide, but sidecar fallback must be the
74
+ // measurement owner's explicit local state. Never scan another host.
75
+ return cached
76
+ ?: FabricAttachmentSidecars.currentMeasurementState?.intrinsicSizeForSourceQualifiedId(
77
+ id
78
+ )
79
+ }
80
+
81
+ /** Test-only global-LRU inspection; [size] can consult its scoped owner. */
82
+ fun globalSize(id: String): Pair<Int, Int>? = synchronized(lock) { values[id]?.size }
83
+
84
+ /** Test-only seam for the actual process-global store, never a fixture-local LRU. */
85
+ internal fun clearAndSetEntryLimitForTesting(limit: Int = 256) = synchronized(lock) {
86
+ values.clear()
87
+ access = 0L
88
+ entryLimit = limit.coerceAtLeast(1)
89
+ }
90
+
91
+ fun store(id: String, size: Pair<Int, Int>) = synchronized(lock) {
92
+ if (size.first <= 0 || size.second <= 0) return@synchronized
93
+ access += 1
94
+ values[id] = Entry(size, access)
95
+ while (values.size > entryLimit) {
96
+ val oldest =
97
+ values.minWithOrNull(
98
+ compareBy<Map.Entry<String, Entry>> {
99
+ it.value.access
100
+ }.thenBy { it.key }
101
+ )
102
+ ?: break
103
+ values.remove(oldest.key)
104
+ }
105
+ }
106
+ }
107
+
108
+ /**
109
+ * Per-surface reflow-publication state. Compact ordinal metadata plus a
110
+ * bitset makes the global LRU an optimization; reset only for semantic
111
+ * replacement or recycle/teardown, never request cancellation.
112
+ */
113
+ internal class ViewerAttachmentRevisionState {
114
+ companion object {
115
+ const val FIXED_RETAINED_BYTES = 160
116
+ const val COLLECTION_RETAINED_BYTES = 32
117
+ }
118
+ private val lock = Any()
119
+ private var publishedBits = ByteArray(0)
120
+ private var reportedErrorBits = ByteArray(0)
121
+ private var intrinsicWidths = IntArray(0)
122
+ private var intrinsicHeights = IntArray(0)
123
+ private var sourceQualifiedIds = arrayOfNulls<String>(0)
124
+ private var attachmentOrdinals = IntArray(0)
125
+ private var admittedAttachmentCount = 0
126
+ private var semanticGenerationIdentity: String? = null
127
+ var revision: Long = 0
128
+ private set
129
+
130
+ /** Exact mounted-sidecar state; immutable layout/cache bytes exclude this owner. */
131
+ val retainedPublicationBytesForTesting: Int get() = synchronized(lock) {
132
+ FIXED_RETAINED_BYTES +
133
+ COLLECTION_RETAINED_BYTES * 5 +
134
+ publishedBits.size + reportedErrorBits.size +
135
+ intrinsicWidths.size * Int.SIZE_BYTES +
136
+ intrinsicHeights.size * Int.SIZE_BYTES +
137
+ sourceQualifiedIds.size * Long.SIZE_BYTES +
138
+ attachmentOrdinals.size * Int.SIZE_BYTES +
139
+ sourceQualifiedIds.filterNotNull().sumOf { it.length * 2 } +
140
+ (semanticGenerationIdentity?.length ?: 0) * 2
141
+ }
142
+
143
+ /** Clears once for a true semantic replacement; revision-only reinstalls preserve state. */
144
+ fun beginSemanticGeneration(identity: String): Boolean {
145
+ val changed = synchronized(lock) {
146
+ if (semanticGenerationIdentity == identity) return@synchronized false
147
+ clearLocked()
148
+ semanticGenerationIdentity = identity
149
+ true
150
+ }
151
+ return changed
152
+ }
153
+
154
+ fun admit(attachmentCount: Int) {
155
+ val count = attachmentCount.coerceAtLeast(0)
156
+ synchronized(lock) {
157
+ if (admittedAttachmentCount == count) return@synchronized
158
+ admittedAttachmentCount = count
159
+ publishedBits = ByteArray((count + 7) / 8)
160
+ reportedErrorBits = ByteArray((count + 7) / 8)
161
+ intrinsicWidths = IntArray(count)
162
+ intrinsicHeights = IntArray(count)
163
+ sourceQualifiedIds = arrayOfNulls(count)
164
+ attachmentOrdinals = IntArray(count) { it }
165
+ }
166
+ }
167
+
168
+ fun reset() = synchronized(lock) {
169
+ clearLocked()
170
+ semanticGenerationIdentity = null
171
+ }
172
+
173
+ fun recordIntrinsicSize(
174
+ id: String,
175
+ ordinal: Int,
176
+ width: Int,
177
+ height: Int,
178
+ declaredSize: Pair<Int, Int>?
179
+ ): Boolean = synchronized(lock) {
180
+ if (declaredSize != null || width <= 0 || height <= 0 ||
181
+ ordinal !in 0 until admittedAttachmentCount
182
+ ) {
183
+ return@synchronized false
184
+ }
185
+ val byteIndex = ordinal / 8
186
+ val mask = 1 shl (ordinal % 8)
187
+ if ((publishedBits[byteIndex].toInt() and mask) != 0) return@synchronized false
188
+ publishedBits[byteIndex] = (publishedBits[byteIndex].toInt() or mask).toByte()
189
+ intrinsicWidths[ordinal] = width
190
+ intrinsicHeights[ordinal] = height
191
+ sourceQualifiedIds[ordinal] = id
192
+ ViewerImageIntrinsicStore.shared.store(id, width to height)
193
+ revision += 1
194
+ true
195
+ }
196
+
197
+ fun intrinsicSize(ordinal: Int): Pair<Int, Int>? = synchronized(lock) {
198
+ if (ordinal !in 0 until admittedAttachmentCount) return@synchronized null
199
+ val mask = 1 shl (ordinal % 8)
200
+ if ((publishedBits[ordinal / 8].toInt() and mask) == 0) {
201
+ null
202
+ } else {
203
+ intrinsicWidths[ordinal] to intrinsicHeights[ordinal]
204
+ }
205
+ }
206
+
207
+ fun recordResourceFailure(ordinal: Int): Boolean = synchronized(lock) {
208
+ if (ordinal !in 0 until admittedAttachmentCount) return@synchronized false
209
+ val byteIndex = ordinal / 8
210
+ val mask = 1 shl (ordinal % 8)
211
+ if ((reportedErrorBits[byteIndex].toInt() and mask) != 0) return@synchronized false
212
+ reportedErrorBits[byteIndex] = (reportedErrorBits[byteIndex].toInt() or mask).toByte()
213
+ true
214
+ }
215
+
216
+ fun intrinsicSizeForSourceQualifiedId(id: String): Pair<Int, Int>? = synchronized(lock) {
217
+ val index = sourceQualifiedIds.indexOfFirst { it == id }
218
+ if (index < 0) return@synchronized null
219
+ val ordinal = attachmentOrdinals[index]
220
+ val mask = 1 shl (ordinal % 8)
221
+ if ((publishedBits[ordinal / 8].toInt() and mask) == 0) {
222
+ null
223
+ } else {
224
+ intrinsicWidths[ordinal] to intrinsicHeights[ordinal]
225
+ }
226
+ }
227
+
228
+ private fun clearLocked() {
229
+ publishedBits = ByteArray(0)
230
+ reportedErrorBits = ByteArray(0)
231
+ intrinsicWidths = IntArray(0)
232
+ intrinsicHeights = IntArray(0)
233
+ sourceQualifiedIds = arrayOfNulls(0)
234
+ attachmentOrdinals = IntArray(0)
235
+ admittedAttachmentCount = 0
236
+ revision = 0
237
+ }
238
+ }
239
+
240
+ /**
241
+ * Viewport/generation facade over the editor's established bounded pipeline.
242
+ * `RenderImageLoader` remains the one owner of source admission, decode/fetch
243
+ * limits, byte-bounded cache, de-duplication, cancellation receipts and errors.
244
+ */
245
+ internal class ViewerImagePipeline(
246
+ private val ownerId: Long = DecodedBitmapBudget.nextOwnerId(),
247
+ private val load: (
248
+ RenderImageLoader.PreparedSource,
249
+ Long,
250
+ DecodedBitmapPriority,
251
+ (DecodedBitmapLease?) -> Unit
252
+ ) -> RenderImageLoader.LoadHandle = { source, owner, priority, callback ->
253
+ NativeImagePipeline.load(source, owner, priority, callback)
254
+ }
255
+ ) {
256
+ companion object {
257
+ const val PREFETCH_MARGIN_PX = 480
258
+ }
259
+
260
+ private val lock = Any()
261
+ private var generation = ""
262
+ private var enabled = false
263
+ private var policy = ImageLoadingPolicy.DEFAULT
264
+ private val requested = mutableSetOf<String>()
265
+ private val requestPriorities = mutableMapOf<String, DecodedBitmapPriority>()
266
+ private val receipts = mutableMapOf<String, RenderImageLoader.LoadHandle>()
267
+ var requestCountForTesting: Int = 0
268
+ private set
269
+ var onPixels: ((ViewerImageAttachment, DecodedBitmapLease) -> Unit)? = null
270
+ var onPixelsReleased: ((Set<String>) -> Unit)? = null
271
+ var onIntrinsicMetadata: ((ViewerImageAttachment, Int, Int) -> Unit)? = null
272
+
273
+ /** Contains only the internal attachment token, never its source URL. */
274
+ var onResourceFailure: ((ViewerImageAttachment) -> Unit)? = null
275
+
276
+ fun begin(
277
+ generation: String,
278
+ imagesEnabled: Boolean,
279
+ policy: ImageLoadingPolicy = this.policy
280
+ ) {
281
+ val released = synchronized(lock) {
282
+ if (this.generation == generation && enabled == imagesEnabled &&
283
+ this.policy == policy
284
+ ) {
285
+ return@synchronized null
286
+ }
287
+ receipts.values.forEach(RenderImageLoader.LoadHandle::cancel)
288
+ receipts.clear()
289
+ requested.toSet().also {
290
+ requested.clear()
291
+ requestPriorities.clear()
292
+ requestCountForTesting = 0
293
+ this.generation = generation
294
+ this.enabled = imagesEnabled
295
+ this.policy = policy
296
+ }
297
+ } ?: return
298
+ DecodedBitmapBudget.shared().setOwnerPressureHandler(ownerId, ::releasePrefetchForPressure)
299
+ onPixelsReleased?.invoke(released)
300
+ }
301
+
302
+ fun cancel() {
303
+ val released = synchronized(lock) {
304
+ generation = ""
305
+ enabled = false
306
+ receipts.values.forEach(RenderImageLoader.LoadHandle::cancel)
307
+ receipts.clear()
308
+ requested.toSet().also {
309
+ requested.clear()
310
+ requestPriorities.clear()
311
+ }
312
+ }
313
+ DecodedBitmapBudget.shared().setOwnerPressureHandler(ownerId, null)
314
+ onPixelsReleased?.invoke(released)
315
+ }
316
+
317
+ fun acceptsCompletion(generation: String): Boolean = synchronized(lock) {
318
+ enabled && this.generation.isNotEmpty() && this.generation == generation
319
+ }
320
+
321
+ private fun acceptsCompletion(generation: String, id: String): Boolean = synchronized(lock) {
322
+ enabled && this.generation.isNotEmpty() && this.generation == generation && id in requested
323
+ }
324
+
325
+ fun updateVisibleRect(visible: Rect, attachments: List<ViewerImageAttachment>) {
326
+ val prefetched = if (visible.isEmpty) {
327
+ Rect()
328
+ } else {
329
+ Rect(visible).apply {
330
+ inset(-PREFETCH_MARGIN_PX, -PREFETCH_MARGIN_PX)
331
+ }
332
+ }
333
+ val eligibleIds = attachments.asSequence()
334
+ .filter {
335
+ it.ordinal >= 0 && it.source.isNotEmpty() &&
336
+ Rect.intersects(it.bounds, prefetched)
337
+ }
338
+ .mapTo(mutableSetOf()) { it.id }
339
+ val visibleIds = attachments.asSequence()
340
+ .filter {
341
+ it.ordinal >= 0 && it.source.isNotEmpty() &&
342
+ Rect.intersects(it.bounds, visible)
343
+ }
344
+ .mapTo(mutableSetOf()) { it.id }
345
+ val released = mutableSetOf<String>()
346
+ val start = synchronized(lock) {
347
+ if (!enabled || generation.isEmpty()) return
348
+ requested.filterTo(released) { it !in eligibleIds }
349
+ requested.filterTo(released) {
350
+ it in visibleIds && requestPriorities[it] == DecodedBitmapPriority.PREFETCH
351
+ }
352
+ released.forEach { id ->
353
+ requested.remove(id)
354
+ requestPriorities.remove(id)
355
+ receipts.remove(id)?.cancel()
356
+ }
357
+ attachments.asSequence()
358
+ .filter { it.id in eligibleIds && it.id !in requested }
359
+ .sortedBy { if (Rect.intersects(it.bounds, visible)) 0 else 1 }
360
+ .filter { requested.add(it.id) }
361
+ .toList()
362
+ .also { requestCountForTesting += it.size }
363
+ .map { attachment ->
364
+ Triple(
365
+ attachment,
366
+ generation,
367
+ if (Rect.intersects(attachment.bounds, visible)) {
368
+ DecodedBitmapPriority.VISIBLE
369
+ } else {
370
+ DecodedBitmapPriority.PREFETCH
371
+ }
372
+ ).also { requestPriorities[attachment.id] = it.third }
373
+ }
374
+ }
375
+ if (released.isNotEmpty()) onPixelsReleased?.invoke(released)
376
+ start.forEach { (attachment, requestGeneration, priority) ->
377
+ if (!acceptsCompletion(requestGeneration, attachment.id)) return@forEach
378
+ val source = NativeImagePipeline.prepare(attachment.source, policy) ?: run {
379
+ reportFailure(attachment, requestGeneration)
380
+ return@forEach
381
+ }
382
+ PreparedProseInstrumentation.imageRequested()
383
+ val receipt = load(source, ownerId, priority) { lease ->
384
+ if (!acceptsCompletion(requestGeneration, attachment.id)) {
385
+ lease?.close()
386
+ return@load
387
+ }
388
+ val bitmap = lease?.bitmap
389
+ if (lease == null || bitmap == null || bitmap.width <= 0 || bitmap.height <= 0) {
390
+ lease?.close()
391
+ reportFailure(attachment, requestGeneration)
392
+ return@load
393
+ }
394
+ PreparedProseInstrumentation.imageMetadataRead()
395
+ onIntrinsicMetadata?.invoke(attachment, bitmap.width, bitmap.height)
396
+ val delivered = synchronized(lock) {
397
+ if (!enabled || generation != requestGeneration ||
398
+ attachment.id !in requested
399
+ ) {
400
+ false
401
+ } else {
402
+ PreparedProseInstrumentation.imageDecoded()
403
+ val callback = onPixels
404
+ if (callback == null) {
405
+ false
406
+ } else {
407
+ callback.invoke(attachment, lease)
408
+ true
409
+ }
410
+ }
411
+ }
412
+ if (!delivered) {
413
+ lease.close()
414
+ }
415
+ }
416
+ synchronized(lock) {
417
+ if (acceptsCompletion(requestGeneration) && attachment.id in requested) {
418
+ receipts[attachment.id] = receipt
419
+ } else {
420
+ receipt.cancel()
421
+ }
422
+ }
423
+ receipt.onFinished {
424
+ synchronized(lock) {
425
+ if (receipts[attachment.id] === receipt) receipts.remove(attachment.id)
426
+ }
427
+ }
428
+ }
429
+ }
430
+
431
+ private fun releasePrefetchForPressure() {
432
+ val released = synchronized(lock) {
433
+ requestPriorities.asSequence()
434
+ .filter { it.value == DecodedBitmapPriority.PREFETCH }
435
+ .mapTo(mutableSetOf()) { it.key }
436
+ .also { ids ->
437
+ ids.forEach { id ->
438
+ requestPriorities.remove(id)
439
+ requested.remove(id)
440
+ receipts.remove(id)?.cancel()
441
+ }
442
+ }
443
+ }
444
+ if (released.isNotEmpty()) onPixelsReleased?.invoke(released)
445
+ }
446
+
447
+ internal fun releasePrefetchForPressureForTesting() = releasePrefetchForPressure()
448
+
449
+ private fun reportFailure(attachment: ViewerImageAttachment, requestGeneration: String) {
450
+ val callback = synchronized(lock) {
451
+ if (!enabled || generation != requestGeneration) null else onResourceFailure
452
+ }
453
+ callback?.invoke(attachment)
454
+ }
455
+
456
+ internal fun reportFailureForTesting(attachment: ViewerImageAttachment) {
457
+ val current = synchronized(lock) { generation }
458
+ reportFailure(attachment, current)
459
+ }
460
+ }
@@ -0,0 +1,85 @@
1
+ cmake_minimum_required(VERSION 3.13)
2
+ set(CMAKE_VERBOSE_MAKEFILE ON)
3
+
4
+ set(LIB_LITERAL ReactNativeProseEditorSpec)
5
+ set(LIB_TARGET_NAME react_codegen_${LIB_LITERAL})
6
+
7
+ set(LIB_ANDROID_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../..)
8
+ set(LIB_COMMON_DIR ${LIB_ANDROID_DIR}/../common/cpp)
9
+ set(LIB_ANDROID_GENERATED_JNI_DIR ${LIB_ANDROID_DIR}/build/generated/source/codegen/jni)
10
+ set(LIB_ANDROID_GENERATED_COMPONENTS_DIR ${LIB_ANDROID_GENERATED_JNI_DIR}/react/renderer/components/${LIB_LITERAL})
11
+
12
+ file(GLOB LIB_CUSTOM_SRCS CONFIGURE_DEPENDS
13
+ ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
14
+ ${LIB_COMMON_DIR}/react/renderer/components/PreparedProseViewer/*.cpp)
15
+ file(GLOB LIB_CODEGEN_SRCS CONFIGURE_DEPENDS
16
+ ${LIB_ANDROID_GENERATED_JNI_DIR}/*.cpp
17
+ ${LIB_ANDROID_GENERATED_COMPONENTS_DIR}/*.cpp)
18
+
19
+ add_library(
20
+ ${LIB_TARGET_NAME}
21
+ SHARED
22
+ ${LIB_CUSTOM_SRCS}
23
+ ${LIB_CODEGEN_SRCS}
24
+ )
25
+
26
+ target_include_directories(
27
+ ${LIB_TARGET_NAME}
28
+ PUBLIC
29
+ .
30
+ ${LIB_COMMON_DIR}
31
+ ${LIB_ANDROID_GENERATED_JNI_DIR}
32
+ ${LIB_ANDROID_GENERATED_COMPONENTS_DIR}
33
+ )
34
+
35
+ target_link_libraries(
36
+ ${LIB_TARGET_NAME}
37
+ fbjni
38
+ jsi
39
+ reactnative
40
+ )
41
+
42
+ # Available from React Native 0.81; retain compatibility with the 0.76 floor.
43
+ if(COMMAND target_compile_reactnative_options)
44
+ target_compile_reactnative_options(${LIB_TARGET_NAME} PUBLIC)
45
+ else()
46
+ # Match the React Native 0.76 application's C++ and Folly flags for
47
+ # codegen targets when the 0.81 helper is unavailable.
48
+ target_compile_options(
49
+ ${LIB_TARGET_NAME}
50
+ PUBLIC
51
+ -Wall
52
+ -Werror
53
+ -fexceptions
54
+ -frtti
55
+ -std=c++20
56
+ -DLOG_TAG=\"ReactNative\"
57
+ -DFOLLY_NO_CONFIG=1
58
+ -DFOLLY_HAVE_CLOCK_GETTIME=1
59
+ -DFOLLY_USE_LIBCPP=1
60
+ -DFOLLY_CFG_NO_COROUTINES=1
61
+ -DFOLLY_MOBILE=1
62
+ -DFOLLY_HAVE_RECVMMSG=1
63
+ -DFOLLY_HAVE_PTHREAD=1
64
+ -DFOLLY_HAVE_XSI_STRERROR_R=1
65
+ )
66
+ target_compile_definitions(
67
+ ${LIB_TARGET_NAME}
68
+ PUBLIC
69
+ RN_SERIALIZABLE_STATE
70
+ )
71
+ endif()
72
+
73
+ target_compile_options(
74
+ ${LIB_TARGET_NAME}
75
+ PRIVATE
76
+ -Wpedantic
77
+ -Wno-gnu-zero-variadic-macro-arguments
78
+ -Wno-dollar-in-identifier-extension
79
+ )
80
+
81
+ target_include_directories(
82
+ ${CMAKE_PROJECT_NAME}
83
+ PUBLIC
84
+ ${CMAKE_CURRENT_SOURCE_DIR}
85
+ )