@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,192 @@
1
+ #include "PreparedProseViewerShadowNode.h"
2
+
3
+ #include <react/renderer/core/LayoutContext.h>
4
+
5
+ #include <cmath>
6
+ #include <atomic>
7
+ #include <limits>
8
+ #include <optional>
9
+
10
+ namespace facebook::react {
11
+
12
+ namespace {
13
+
14
+ bool HasRepresentablePhysicalWidth(Float width, Float scale) {
15
+ if (!std::isfinite(width) || width <= 0 || !std::isfinite(scale) ||
16
+ scale <= 0) {
17
+ return false;
18
+ }
19
+ const double physicalWidth = static_cast<double>(width) * static_cast<double>(scale);
20
+ if (!std::isfinite(physicalWidth) || physicalWidth <= 0) {
21
+ return false;
22
+ }
23
+ const double roundedWidth = std::round(physicalWidth);
24
+ const double largestConvertible = std::nextafter(
25
+ static_cast<double>(std::numeric_limits<long long>::max()), 0.0);
26
+ return std::isfinite(roundedWidth) && roundedWidth > 0 &&
27
+ roundedWidth <= largestConvertible;
28
+ }
29
+
30
+ std::optional<int32_t> CheckedPhysicalPixel(
31
+ Float value,
32
+ Float scale,
33
+ bool allowZero) {
34
+ if (!std::isfinite(value) || !std::isfinite(scale) || scale <= 0) {
35
+ return std::nullopt;
36
+ }
37
+ const auto physical = std::round(
38
+ static_cast<double>(value) * static_cast<double>(scale));
39
+ if (!std::isfinite(physical) || (!allowZero && physical <= 0) ||
40
+ physical < static_cast<double>(std::numeric_limits<int32_t>::min()) ||
41
+ physical > static_cast<double>(std::numeric_limits<int32_t>::max())) {
42
+ return std::nullopt;
43
+ }
44
+ return static_cast<int32_t>(physical);
45
+ }
46
+
47
+ uint64_t FontEnvironmentRevision(const PreparedProseViewerProps &props) {
48
+ const double value = static_cast<double>(props.fontEnvironmentRevision);
49
+ const double largestConvertible = std::nextafter(
50
+ static_cast<double>(std::numeric_limits<uint64_t>::max()), 0.0);
51
+ return std::isfinite(value) && value > 0 && value <= largestConvertible
52
+ ? static_cast<uint64_t>(value)
53
+ : 0;
54
+ }
55
+
56
+ uint64_t NextFabricLeaseHandle() {
57
+ // The Android JNI contract is a signed jlong. Stop rather than wrapping:
58
+ // aliasing a still-live owner would be worse than declining a theoretical
59
+ // 9e18th viewer incarnation.
60
+ static std::atomic<int64_t> next{0};
61
+ for (;;) {
62
+ auto current = next.load(std::memory_order_relaxed);
63
+ if (current < 0 || current == std::numeric_limits<int64_t>::max()) {
64
+ return 0;
65
+ }
66
+ // compare_exchange_weak writes the observed value back to `current` on a
67
+ // collision. Restart from that value: falling through after a failed
68
+ // zero-to-one race would hand the losing family an invalid zero handle.
69
+ if (next.compare_exchange_weak(
70
+ current, current + 1, std::memory_order_relaxed,
71
+ std::memory_order_relaxed)) {
72
+ return static_cast<uint64_t>(current + 1);
73
+ }
74
+ }
75
+ }
76
+
77
+ } // namespace
78
+
79
+ extern const char PreparedProseViewerComponentName[] = "PreparedProseViewer";
80
+
81
+ ShadowNodeTraits PreparedProseViewerShadowNode::BaseTraits() {
82
+ auto traits = ConcreteViewShadowNode::BaseTraits();
83
+ traits.set(ShadowNodeTraits::Trait::LeafYogaNode);
84
+ traits.set(ShadowNodeTraits::Trait::MeasurableYogaNode);
85
+ return traits;
86
+ }
87
+
88
+ PreparedProseViewerShadowNode::ConcreteStateData
89
+ PreparedProseViewerShadowNode::initialStateData(
90
+ const Props::Shared& /*props*/,
91
+ const ShadowNodeFamily::Shared& family,
92
+ const ComponentDescriptor& /*componentDescriptor*/) {
93
+ PreparedProseViewerState state;
94
+ state.leaseHandle = NextFabricLeaseHandle();
95
+ state.surfaceId = family->getSurfaceId();
96
+ state.componentTag = family->getEventEmitter()->getEventTarget()->getTag();
97
+ state.leaseLifecycle = std::make_shared<PreparedProseViewerLeaseLifecycle>();
98
+ return state;
99
+ }
100
+
101
+ void PreparedProseViewerShadowNode::setMeasurementsManager(
102
+ const std::shared_ptr<PreparedProseMeasurementsManager>&
103
+ measurementsManager) {
104
+ ensureUnsealed();
105
+ measurementsManager_ = measurementsManager;
106
+ }
107
+
108
+ Size PreparedProseViewerShadowNode::measureContent(
109
+ const LayoutContext& layoutContext,
110
+ const LayoutConstraints& layoutConstraints) const {
111
+ const auto maximumWidth = layoutConstraints.maximumSize.width;
112
+ const auto pointScaleFactor = layoutContext.pointScaleFactor;
113
+ if (!measurementsManager_) {
114
+ return {};
115
+ }
116
+
117
+ const auto hasUsableMeasurement =
118
+ HasRepresentablePhysicalWidth(maximumWidth, pointScaleFactor);
119
+ const auto effectiveWidth = hasUsableMeasurement
120
+ ? std::round(maximumWidth * pointScaleFactor) / pointScaleFactor
121
+ : maximumWidth;
122
+ const auto& props = getConcreteProps();
123
+ const auto& state = getStateData();
124
+ // The committed state mints this once, before Yoga's first measurement.
125
+ // A delayed callback from a released incarnation may still calculate an
126
+ // unowned size, but it must never recreate a Fabric lease or sidecar.
127
+ const auto leaseHandle = state.leaseLifecycle && state.leaseLifecycle->isActive()
128
+ ? state.leaseHandle
129
+ : 0;
130
+ if (leaseHandle != 0) {
131
+ measurementsManager_->bindLeaseLifecycle(
132
+ getSurfaceId(), getTag(), leaseHandle, state.leaseLifecycle);
133
+ }
134
+ return measurementsManager_->measure(
135
+ getSurfaceId(),
136
+ getTag(),
137
+ props,
138
+ effectiveWidth,
139
+ pointScaleFactor,
140
+ state.attachmentRevision,
141
+ state.nativeFontRevision,
142
+ state.nativeFontScale,
143
+ state.userInterfaceStyle,
144
+ state.accessibilityContrast,
145
+ FontEnvironmentRevision(props),
146
+ leaseHandle,
147
+ state.leaseLifecycle);
148
+ }
149
+
150
+ void PreparedProseViewerShadowNode::layout(LayoutContext layoutContext) {
151
+ ConcreteViewShadowNode::layout(layoutContext);
152
+ if (!measurementsManager_) {
153
+ return;
154
+ }
155
+ const auto metrics = getLayoutMetrics();
156
+ const auto contentFrame = getLayoutMetrics().getContentFrame();
157
+ const auto scale = metrics.pointScaleFactor;
158
+ const auto widthPx = CheckedPhysicalPixel(contentFrame.size.width, scale, false);
159
+ const auto originXPx = CheckedPhysicalPixel(contentFrame.origin.x, scale, true);
160
+ const auto originYPx = CheckedPhysicalPixel(contentFrame.origin.y, scale, true);
161
+ if (!widthPx || !originXPx || !originYPx) {
162
+ return;
163
+ }
164
+ const auto& props = getConcreteProps();
165
+ const auto& state = getStateData();
166
+ const auto leaseHandle = state.leaseLifecycle && state.leaseLifecycle->isActive()
167
+ ? state.leaseHandle
168
+ : 0;
169
+ if (leaseHandle == 0) {
170
+ return;
171
+ }
172
+ measurementsManager_->bindLeaseLifecycle(
173
+ getSurfaceId(), getTag(), leaseHandle, state.leaseLifecycle);
174
+ measurementsManager_->prepareFinalLayout(
175
+ getSurfaceId(),
176
+ getTag(),
177
+ props,
178
+ *widthPx,
179
+ *originXPx,
180
+ *originYPx,
181
+ scale,
182
+ state.attachmentRevision,
183
+ state.nativeFontRevision,
184
+ state.nativeFontScale,
185
+ state.userInterfaceStyle,
186
+ state.accessibilityContrast,
187
+ FontEnvironmentRevision(props),
188
+ leaseHandle,
189
+ state.leaseLifecycle);
190
+ }
191
+
192
+ } // namespace facebook::react
@@ -0,0 +1,46 @@
1
+ #pragma once
2
+
3
+ #include "PreparedProseMeasurementsManager.h"
4
+ #include "PreparedProseViewerState.h"
5
+
6
+ #include <react/renderer/components/ReactNativeProseEditorSpec/EventEmitters.h>
7
+ #include <react/renderer/components/ReactNativeProseEditorSpec/Props.h>
8
+ #include <react/renderer/components/view/ConcreteViewShadowNode.h>
9
+
10
+ namespace facebook::react {
11
+
12
+ class ComponentDescriptor;
13
+
14
+ extern const char PreparedProseViewerComponentName[];
15
+
16
+ class PreparedProseViewerShadowNode final
17
+ : public ConcreteViewShadowNode<
18
+ PreparedProseViewerComponentName,
19
+ PreparedProseViewerProps,
20
+ PreparedProseViewerEventEmitter,
21
+ PreparedProseViewerState> {
22
+ public:
23
+ using ConcreteViewShadowNode::ConcreteViewShadowNode;
24
+
25
+ static ShadowNodeTraits BaseTraits();
26
+
27
+ static ConcreteStateData initialStateData(
28
+ const Props::Shared& props,
29
+ const ShadowNodeFamily::Shared& family,
30
+ const ComponentDescriptor& componentDescriptor);
31
+
32
+ void setMeasurementsManager(
33
+ const std::shared_ptr<PreparedProseMeasurementsManager>&
34
+ measurementsManager);
35
+
36
+ Size measureContent(
37
+ const LayoutContext& layoutContext,
38
+ const LayoutConstraints& layoutConstraints) const override;
39
+
40
+ void layout(LayoutContext layoutContext) override;
41
+
42
+ private:
43
+ std::shared_ptr<PreparedProseMeasurementsManager> measurementsManager_;
44
+ };
45
+
46
+ } // namespace facebook::react
@@ -0,0 +1,145 @@
1
+ #pragma once
2
+
3
+ #include <cmath>
4
+ #include <atomic>
5
+ #include <cstdint>
6
+ #include <memory>
7
+ #include <string>
8
+ #include <functional>
9
+ #include <mutex>
10
+
11
+ #include <react/renderer/core/ReactPrimitives.h>
12
+
13
+ #ifdef ANDROID
14
+ #include <folly/dynamic.h>
15
+ #endif
16
+
17
+ namespace facebook::react {
18
+
19
+ /// Shared by every Fabric state clone for one viewer incarnation. The shadow
20
+ /// node checks this before handing work to a platform registry, while a
21
+ /// recycled component view deactivates it before releasing its exact lease.
22
+ /// Its lifetime is bounded by the state snapshots that reference it.
23
+ class PreparedProseViewerLeaseLifecycle final {
24
+ public:
25
+ ~PreparedProseViewerLeaseLifecycle() {
26
+ deactivate();
27
+ std::function<void()> cleanup;
28
+ {
29
+ std::lock_guard<std::mutex> lock(cleanupMutex_);
30
+ cleanup = std::move(cleanup_);
31
+ }
32
+ if (cleanup) cleanup();
33
+ }
34
+
35
+ bool isActive() const {
36
+ return active_.load(std::memory_order_acquire);
37
+ }
38
+
39
+ void deactivate() {
40
+ active_.store(false, std::memory_order_release);
41
+ }
42
+
43
+ // The platform bridge binds this once the first measurement knows the
44
+ // concrete Fabric surface/tag. It is held by shared state data, so ordinary
45
+ // state clones cannot fire it; it runs only when the family incarnation's
46
+ // final snapshot dies.
47
+ void bindTerminalCleanup(std::function<void()> cleanup) {
48
+ std::lock_guard<std::mutex> lock(cleanupMutex_);
49
+ if (!cleanup_) cleanup_ = std::move(cleanup);
50
+ }
51
+
52
+ private:
53
+ std::atomic<bool> active_{true};
54
+ std::mutex cleanupMutex_;
55
+ std::function<void()> cleanup_;
56
+ };
57
+
58
+ struct PreparedProseViewerState final {
59
+ uint64_t attachmentRevision{0};
60
+ uint64_t nativeFontRevision{0};
61
+ // A native Dynamic Type invalidation carries the scale that caused it.
62
+ // The JS revision can remain unchanged, so it cannot select this snapshot.
63
+ double nativeFontScale{1.0};
64
+ int32_t userInterfaceStyle{0};
65
+ int32_t accessibilityContrast{0};
66
+ // Opaque, native-owned Fabric handoff incarnation. The shadow node mints it
67
+ // once and component views must pass this exact value back to the registry.
68
+ uint64_t leaseHandle{0};
69
+ SurfaceId surfaceId{0};
70
+ Tag componentTag{0};
71
+ // This is deliberately C++-only state. Dynamic platform updates retain the
72
+ // previous lifecycle when they omit the native-owned handle.
73
+ std::shared_ptr<PreparedProseViewerLeaseLifecycle> leaseLifecycle{};
74
+
75
+ #ifdef ANDROID
76
+ PreparedProseViewerState() = default;
77
+
78
+ PreparedProseViewerState(
79
+ const PreparedProseViewerState& previousState,
80
+ const folly::dynamic& data)
81
+ : attachmentRevision(revisionValue(data, "attachmentRevision")),
82
+ nativeFontRevision(revisionValue(data, "nativeFontRevision")),
83
+ nativeFontScale(scaleValue(data, "nativeFontScale")),
84
+ userInterfaceStyle(previousState.userInterfaceStyle),
85
+ accessibilityContrast(previousState.accessibilityContrast),
86
+ leaseHandle(handleValue(data, "leaseHandle", previousState.leaseHandle)),
87
+ surfaceId(previousState.surfaceId),
88
+ componentTag(previousState.componentTag),
89
+ leaseLifecycle(lifecycleValue(previousState, leaseHandle)) {}
90
+
91
+ folly::dynamic getDynamic() const {
92
+ return folly::dynamic::object("attachmentRevision", attachmentRevision)(
93
+ "nativeFontRevision", nativeFontRevision)(
94
+ "nativeFontScale", nativeFontScale)(
95
+ // ReadableMap exposes numeric values as doubles on Android. Preserve
96
+ // this opaque Int64 identity as decimal text at the state boundary;
97
+ // the synchronous JNI measurement path still carries a real jlong.
98
+ "leaseHandle", std::to_string(static_cast<int64_t>(leaseHandle)));
99
+ }
100
+
101
+ private:
102
+ static uint64_t revisionValue(const folly::dynamic& data, const char* key) {
103
+ const auto value = data.getDefault(key, 0).asInt();
104
+ return value > 0 ? static_cast<uint64_t>(value) : 0;
105
+ }
106
+
107
+ static double scaleValue(const folly::dynamic& data, const char* key) {
108
+ const auto value = data.getDefault(key, 1.0).asDouble();
109
+ return std::isfinite(value) && value > 0.0 ? value : 1.0;
110
+ }
111
+
112
+ static uint64_t handleValue(
113
+ const folly::dynamic& data,
114
+ const char* key,
115
+ uint64_t fallback) {
116
+ if (data.count(key) == 0) {
117
+ return fallback;
118
+ }
119
+ if (data[key].isString()) {
120
+ try {
121
+ const auto value = std::stoll(data[key].asString());
122
+ return value > 0 ? static_cast<uint64_t>(value) : 0;
123
+ } catch (...) {
124
+ return 0;
125
+ }
126
+ }
127
+ const auto value = data.getDefault(key, 0).asInt();
128
+ return value > 0 ? static_cast<uint64_t>(value) : 0;
129
+ }
130
+
131
+ static std::shared_ptr<PreparedProseViewerLeaseLifecycle> lifecycleValue(
132
+ const PreparedProseViewerState& previousState,
133
+ uint64_t handle) {
134
+ if (handle == 0) {
135
+ return nullptr;
136
+ }
137
+ if (handle == previousState.leaseHandle && previousState.leaseLifecycle) {
138
+ return previousState.leaseLifecycle;
139
+ }
140
+ return std::make_shared<PreparedProseViewerLeaseLifecycle>();
141
+ }
142
+ #endif
143
+ };
144
+
145
+ } // namespace facebook::react
@@ -0,0 +1,17 @@
1
+ import type { AtomComponent, AtomComponentProps } from './atoms';
2
+ export interface AtomViewport {
3
+ /** Visible vertical range in the atom layout's coordinate space, in points. */
4
+ y: number;
5
+ height: number;
6
+ overscan?: number;
7
+ }
8
+ export declare function atomIsVisible(y: number, height: number, viewport?: AtomViewport): boolean;
9
+ export declare function AtomHost({ component: Component, atomProps, width, estimatedHeight, visible, onMeasure, nativeID, }: {
10
+ component: AtomComponent;
11
+ atomProps: Omit<AtomComponentProps, 'updatePending' | 'updateError' | 'setActive'>;
12
+ width: number;
13
+ estimatedHeight: number;
14
+ visible?: boolean;
15
+ onMeasure?: (event: import('react-native').LayoutChangeEvent) => void;
16
+ nativeID?: string;
17
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.atomIsVisible = atomIsVisible;
37
+ exports.AtomHost = AtomHost;
38
+ const jsx_runtime_1 = require("react/jsx-runtime");
39
+ const react_1 = __importStar(require("react"));
40
+ const react_native_1 = require("react-native");
41
+ const atomInstances_1 = require("./atomInstances");
42
+ function atomIsVisible(y, height, viewport) {
43
+ if (!viewport)
44
+ return true;
45
+ if (![viewport.y, viewport.height, viewport.overscan ?? 200].every(Number.isFinite) ||
46
+ viewport.height < 0 ||
47
+ (viewport.overscan ?? 200) < 0) {
48
+ throw new Error('Atom viewport must have finite coordinates and non-negative height and overscan.');
49
+ }
50
+ const overscan = viewport.overscan ?? 200;
51
+ return y + height >= viewport.y - overscan && y <= viewport.y + viewport.height + overscan;
52
+ }
53
+ class AtomErrorBoundary extends react_1.default.Component {
54
+ constructor() {
55
+ super(...arguments);
56
+ this.state = { error: false, component: this.props.component };
57
+ }
58
+ static getDerivedStateFromError() {
59
+ return { error: true };
60
+ }
61
+ static getDerivedStateFromProps(props, state) {
62
+ return props.component === state.component
63
+ ? null
64
+ : { component: props.component, error: false };
65
+ }
66
+ render() {
67
+ if (!this.state.error)
68
+ return this.props.children;
69
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { accessibilityRole: 'alert', style: { minHeight: 32, padding: 8 }, children: [(0, jsx_runtime_1.jsxs)(react_native_1.Text, { children: ["Unable to display ", this.props.nodeType] }), (0, jsx_runtime_1.jsx)(react_native_1.Pressable, { accessibilityRole: 'button', onPress: () => this.setState({ error: false }), children: (0, jsx_runtime_1.jsx)(react_native_1.Text, { children: "Retry" }) })] }));
70
+ }
71
+ }
72
+ function AtomHost({ component: Component, atomProps, width, estimatedHeight, visible = true, onMeasure, nativeID, }) {
73
+ const [measurement, setMeasurement] = (0, react_1.useState)({ width, height: estimatedHeight });
74
+ const [focused, setFocused] = (0, react_1.useState)(false);
75
+ const [active, setActive] = (0, react_1.useState)(false);
76
+ const [pending, setPending] = (0, react_1.useState)(0);
77
+ const [updateError, setUpdateError] = (0, react_1.useState)(null);
78
+ const latestRequest = (0, react_1.useRef)(0);
79
+ const applyUpdate = atomProps.updateAttrs;
80
+ const mounted = (0, react_1.useRef)(true);
81
+ (0, react_1.useEffect)(() => {
82
+ mounted.current = true;
83
+ return () => {
84
+ mounted.current = false;
85
+ };
86
+ }, []);
87
+ const updateAttrs = (0, react_1.useCallback)(async (update) => {
88
+ if (!mounted.current)
89
+ throw new atomInstances_1.AtomUpdateAttrsError('not-ready', 'The atom is unmounted.');
90
+ const request = ++latestRequest.current;
91
+ setPending((count) => count + 1);
92
+ setUpdateError(null);
93
+ try {
94
+ await applyUpdate(update);
95
+ }
96
+ catch (error) {
97
+ if (mounted.current && latestRequest.current === request)
98
+ setUpdateError(error instanceof Error ? error : new Error(String(error)));
99
+ throw error;
100
+ }
101
+ finally {
102
+ if (mounted.current)
103
+ setPending((count) => count - 1);
104
+ }
105
+ }, [applyUpdate]);
106
+ const editor = (0, react_1.useMemo)(() => {
107
+ if (!atomProps.editor)
108
+ return undefined;
109
+ const guard = (action) => async () => {
110
+ if (!mounted.current)
111
+ throw new atomInstances_1.AtomUpdateAttrsError('not-ready', 'The atom is unmounted.');
112
+ return action();
113
+ };
114
+ return {
115
+ select: guard(atomProps.editor.select),
116
+ delete: guard(atomProps.editor.delete),
117
+ focusBefore: guard(atomProps.editor.focusBefore),
118
+ focusAfter: guard(atomProps.editor.focusAfter),
119
+ };
120
+ }, [atomProps.editor]);
121
+ const retainedHeight = measurement.width === width ? measurement.height : estimatedHeight;
122
+ const show = visible || focused || active || pending > 0 || atomProps.selected;
123
+ return ((0, jsx_runtime_1.jsx)(react_native_1.View, { testID: 'atom-host', nativeID: nativeID, collapsable: false, pointerEvents: atomProps.interactive === false ? 'none' : 'box-none', accessibilityElementsHidden: !show, importantForAccessibility: !show ? 'no-hide-descendants' : 'auto', onFocus: () => setFocused(true), onBlur: () => setFocused(false), onLayout: (event) => {
124
+ onMeasure?.(event);
125
+ const size = event.nativeEvent.layout;
126
+ if (show &&
127
+ Number.isFinite(size.height) &&
128
+ size.height >= 0 &&
129
+ Math.abs(size.width - width) <= 1) {
130
+ setMeasurement((previous) => previous.width === width && previous.height === size.height
131
+ ? previous
132
+ : { width, height: size.height });
133
+ }
134
+ }, style: show ? undefined : { height: retainedHeight }, children: show && ((0, jsx_runtime_1.jsx)(AtomErrorBoundary, { component: Component, nodeType: atomProps.nodeType, children: (0, jsx_runtime_1.jsx)(react_1.Suspense, { fallback: (0, jsx_runtime_1.jsx)(react_native_1.View, { style: { height: retainedHeight }, children: (0, jsx_runtime_1.jsxs)(react_native_1.Text, { children: ["Loading ", atomProps.nodeType, "\u2026"] }) }), children: (0, jsx_runtime_1.jsx)(Component, { ...atomProps, editor: editor, updateAttrs: updateAttrs, updatePending: pending > 0, updateError: updateError, setActive: setActive }) }) })) }));
135
+ }
@@ -0,0 +1,2 @@
1
+ import type { AtomComponentProps } from './atoms';
2
+ export declare function DefaultAtomChip({ nodeType }: AtomComponentProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultAtomChip = DefaultAtomChip;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_native_1 = require("react-native");
6
+ const atomConstants_1 = require("./atomConstants");
7
+ function DefaultAtomChip({ nodeType }) {
8
+ return ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.container, children: (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: styles.label, children: nodeType }) }));
9
+ }
10
+ const styles = react_native_1.StyleSheet.create({
11
+ container: {
12
+ minHeight: atomConstants_1.DEFAULT_ATOM_CHIP_HEIGHT,
13
+ justifyContent: 'center',
14
+ paddingHorizontal: 10,
15
+ borderRadius: 6,
16
+ backgroundColor: '#E5E7EB',
17
+ },
18
+ label: {
19
+ color: '#374151',
20
+ fontSize: 13,
21
+ },
22
+ });
@@ -0,0 +1,32 @@
1
+ import type { MentionsAddonConfig } from './addons';
2
+ export interface MentionPressEvent {
3
+ docPos: number;
4
+ label: string;
5
+ attrs: Record<string, unknown>;
6
+ }
7
+ export interface MentionsAddonOptions extends MentionsAddonConfig {
8
+ /** Prepended to viewer mention labels unless already present. */
9
+ prefix?: string;
10
+ /** Enables mention presses in the viewer. */
11
+ onPress?: (event: MentionPressEvent) => void;
12
+ }
13
+ export interface CodeHighlightingAddonOptions {
14
+ readonly provider: string;
15
+ readonly theme: string;
16
+ }
17
+ export interface MentionsAddon {
18
+ readonly id: 'mentions';
19
+ readonly version: 1;
20
+ readonly capability: 'mentions';
21
+ readonly options: Readonly<MentionsAddonOptions>;
22
+ }
23
+ export interface CodeHighlightingAddon {
24
+ readonly id: 'code-highlighting';
25
+ readonly version: 1;
26
+ readonly capability: 'code-highlighting';
27
+ readonly options: CodeHighlightingAddonOptions;
28
+ }
29
+ export type EditorAddon = MentionsAddon | CodeHighlightingAddon;
30
+ export type EditorAddonEntry = EditorAddon | false | null | undefined;
31
+ export type EditorAddons = readonly EditorAddonEntry[];
32
+ export declare function createMentionsAddon(options?: MentionsAddonOptions): MentionsAddon;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMentionsAddon = createMentionsAddon;
4
+ function copyConfiguration(value, ancestors = new Set()) {
5
+ if (value === null || typeof value !== 'object')
6
+ return value;
7
+ if (ancestors.has(value))
8
+ throw new Error('Addon configuration must not contain cycles.');
9
+ if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype) {
10
+ throw new Error('Addon configuration must contain only plain objects and arrays.');
11
+ }
12
+ ancestors.add(value);
13
+ const copy = Array.isArray(value)
14
+ ? value.map((entry) => copyConfiguration(entry, ancestors))
15
+ : Object.fromEntries(Object.entries(value).map(([key, entry]) => [
16
+ key,
17
+ copyConfiguration(entry, ancestors),
18
+ ]));
19
+ ancestors.delete(value);
20
+ return Object.freeze(copy);
21
+ }
22
+ function createMentionsAddon(options = {}) {
23
+ return Object.freeze({
24
+ id: 'mentions',
25
+ version: 1,
26
+ capability: 'mentions',
27
+ options: copyConfiguration(options),
28
+ });
29
+ }
@@ -0,0 +1,6 @@
1
+ import type { CodeHighlightingAddonOptions, EditorAddons, MentionsAddonOptions } from './EditorAddon';
2
+ export interface NormalizedEditorAddons {
3
+ mentions?: Readonly<MentionsAddonOptions>;
4
+ codeHighlighting?: CodeHighlightingAddonOptions;
5
+ }
6
+ export declare function normalizeEditorAddons(addons?: EditorAddons): NormalizedEditorAddons;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeEditorAddons = normalizeEditorAddons;
4
+ function isRecord(value) {
5
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
6
+ }
7
+ function normalizeEditorAddons(addons) {
8
+ if (addons === undefined)
9
+ return {};
10
+ if (!Array.isArray(addons))
11
+ throw new Error('addons must be a flat readonly array.');
12
+ const normalized = {};
13
+ const ids = new Set();
14
+ for (const [index, addon] of addons.entries()) {
15
+ if (addon === false || addon === null || addon === undefined)
16
+ continue;
17
+ const path = `addons[${index}]`;
18
+ if (!isRecord(addon))
19
+ throw new Error(`${path} must be an addon descriptor.`);
20
+ if (addon.version !== 1)
21
+ throw new Error(`${path}.version must be 1.`);
22
+ if (addon.capability !== 'mentions' && addon.capability !== 'code-highlighting') {
23
+ throw new Error(`${path}.capability is unsupported.`);
24
+ }
25
+ if (addon.id !== addon.capability)
26
+ throw new Error(`${path}.id must match its capability.`);
27
+ if (ids.has(addon.capability))
28
+ throw new Error(`${path}: duplicate addon id '${addon.id}'.`);
29
+ ids.add(addon.capability);
30
+ if (!isRecord(addon.options))
31
+ throw new Error(`${path}.options must be an object.`);
32
+ if (addon.capability === 'mentions') {
33
+ normalized.mentions = addon.options;
34
+ }
35
+ else {
36
+ for (const key of ['provider', 'theme']) {
37
+ if (typeof addon.options[key] !== 'string' || !addon.options[key].trim()) {
38
+ throw new Error(`${path}.options.${key} must be a nonempty string.`);
39
+ }
40
+ }
41
+ normalized.codeHighlighting = {
42
+ provider: addon.options.provider,
43
+ theme: addon.options.theme,
44
+ };
45
+ }
46
+ }
47
+ return normalized;
48
+ }