@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,128 @@
1
+ import CryptoKit
2
+ import Foundation
3
+ import UIKit
4
+
5
+ extension PreparedProseLayoutRegistry {
6
+ func beginFabricMeasure(_ generation: FabricGenerationToken) -> Bool {
7
+ compiledCondition.lock()
8
+ guard isFabricLeaseActiveLocked(generation) else {
9
+ compiledCondition.unlock()
10
+ return false
11
+ }
12
+ var state = fabricMeasurementsInFlight[generation] ?? FabricMeasurementState()
13
+ guard !state.cancelled else {
14
+ compiledCondition.unlock()
15
+ return false
16
+ }
17
+ state.count += 1
18
+ fabricMeasurementsInFlight[generation] = state
19
+ compiledCondition.unlock()
20
+ return true
21
+ }
22
+
23
+ func endFabricMeasure(_ generation: FabricGenerationToken) {
24
+ compiledCondition.lock()
25
+ guard var state = fabricMeasurementsInFlight[generation] else {
26
+ compiledCondition.unlock()
27
+ return
28
+ }
29
+ let remaining = max(0, state.count - 1)
30
+ if remaining == 0 {
31
+ fabricMeasurementsInFlight.removeValue(forKey: generation)
32
+ } else {
33
+ state.count = remaining
34
+ fabricMeasurementsInFlight[generation] = state
35
+ }
36
+ compiledCondition.unlock()
37
+ }
38
+
39
+ func isFabricLeaseActive(_ generation: FabricGenerationToken) -> Bool {
40
+ compiledCondition.lock()
41
+ defer { compiledCondition.unlock() }
42
+ return isFabricLeaseActiveLocked(generation)
43
+ }
44
+
45
+ /// Caller must hold `compiledCondition`.
46
+ func isFabricLeaseActiveLocked(_ generation: FabricGenerationToken) -> Bool {
47
+ guard generation.leaseHandle != 0,
48
+ let lease = fabricLeaseStates[FabricLeaseOwner(
49
+ surface: generation.surface,
50
+ leaseHandle: generation.leaseHandle
51
+ )],
52
+ lease.active,
53
+ lease.permittedGenerationIdentity == nil ||
54
+ lease.permittedGenerationIdentity == generation.generationIdentity
55
+ else { return false }
56
+ return !(fabricMeasurementsInFlight[generation]?.cancelled ?? false)
57
+ }
58
+
59
+ /// Caller must hold `compiledCondition`.
60
+ func cancelFabricMeasurementLocked(_ generation: FabricGenerationToken) {
61
+ guard var state = fabricMeasurementsInFlight[generation] else { return }
62
+ state.cancelled = true
63
+ fabricMeasurementsInFlight[generation] = state
64
+ }
65
+
66
+ private func retireStaleFabricLease(
67
+ _ generation: FabricGenerationToken,
68
+ widthPixels: Int,
69
+ scale: CGFloat
70
+ ) {
71
+ _ = layoutCache.releasePendingLease(
72
+ for: generation.surface,
73
+ generationIdentity: generation.generationIdentity,
74
+ widthPixels: widthPixels,
75
+ displayScale: scale,
76
+ leaseHandle: generation.leaseHandle
77
+ )
78
+ }
79
+
80
+ func discardCancelledFabricMeasurement(
81
+ _ generation: FabricGenerationToken,
82
+ widthPixels: Int,
83
+ scale: CGFloat
84
+ ) {
85
+ retireStaleFabricLease(generation, widthPixels: widthPixels, scale: scale)
86
+ // Release can win after sidecar begin but before cache publication.
87
+ // This exact handle cannot clear a concurrently-created replacement.
88
+ FabricAttachmentSidecars.remove(
89
+ generation.surface,
90
+ leaseHandle: generation.leaseHandle
91
+ )
92
+ }
93
+
94
+ func retainFabricGenerationOwnership(
95
+ _ generation: FabricGenerationToken,
96
+ document: ViewerDocument,
97
+ request: ProseViewerRequest
98
+ ) -> Bool {
99
+ compiledCondition.lock()
100
+ guard isFabricLeaseActiveLocked(generation) else {
101
+ compiledCondition.unlock()
102
+ return false
103
+ }
104
+ documentsByFabricGeneration[generation] = document
105
+ failuresByFabricGeneration.removeValue(forKey: generation)
106
+ _ = preparedThemeLocked(for: request, generation: generation)
107
+ fabricOwnershipRevisions[generation, default: 0] &+= 1
108
+ compiledCondition.unlock()
109
+ return true
110
+ }
111
+
112
+ func retainFabricGenerationFailure(
113
+ _ generation: FabricGenerationToken,
114
+ error: Error
115
+ ) -> Bool {
116
+ compiledCondition.lock()
117
+ guard isFabricLeaseActiveLocked(generation) else {
118
+ compiledCondition.unlock()
119
+ return false
120
+ }
121
+ failuresByFabricGeneration[generation] = error
122
+ documentsByFabricGeneration.removeValue(forKey: generation)
123
+ fabricOwnershipRevisions[generation, default: 0] &+= 1
124
+ compiledCondition.unlock()
125
+ return true
126
+ }
127
+
128
+ }
@@ -0,0 +1,381 @@
1
+ import CryptoKit
2
+ import Foundation
3
+ import UIKit
4
+
5
+ /// Shared compiler and prepared-layout owner for UIKit and Fabric.
6
+ @objc(PREPPreparedProseLayoutRegistry)
7
+ public final class PreparedProseLayoutRegistry: NSObject {
8
+ typealias DocumentCompiler = (ProseViewerRequest) throws -> ViewerDocument
9
+ typealias LayoutPreparation = (ViewerDocument, ProseLayoutKey, CGFloat, CGFloat) throws -> PreparedProseLayout
10
+
11
+ @objc public static var sharedRegistry: PreparedProseLayoutRegistry { shared }
12
+ static let shared = PreparedProseLayoutRegistry()
13
+
14
+ private final class Compilation {
15
+ var result: Result<ViewerDocument, Error>?
16
+ }
17
+
18
+ struct FabricMeasurementCancelled: Error {}
19
+
20
+ /// This record exists only while a measurement is executing. A release
21
+ /// marks it cancelled so post-layout ownership cannot be republished;
22
+ /// `endFabricMeasure` removes it when the final in-flight callback exits.
23
+ struct FabricMeasurementState {
24
+ var count = 0
25
+ var cancelled = false
26
+ }
27
+
28
+ struct FabricLeaseState {
29
+ var active = true
30
+ /// `nil` permits bounded pre-commit Yoga work before a component view
31
+ /// has identified the canonical state/props generation.
32
+ var permittedGenerationIdentity: String?
33
+ }
34
+
35
+ let lock = NSLock()
36
+ let compiledCondition = NSCondition()
37
+ var compiledDocuments: [String: ViewerDocument] = [:]
38
+ /// Lazy access generations keep repeated compiled-document hits O(1).
39
+ /// Stale tokens are skipped during eviction and bounded by compaction.
40
+ var compiledAccessOrder: [(key: String, generation: UInt64)] = []
41
+ var compiledAccessGenerations: [String: UInt64] = [:]
42
+ var compiledAccessOrderHead = 0
43
+ var nextCompiledAccessGeneration: UInt64 = 0
44
+ private var compiledInFlight: [String: Compilation] = [:]
45
+ var compilationFailures: [String: Error] = [:]
46
+ var compilationFailureAccessOrder: [String] = []
47
+ var documentsByFabricGeneration: [FabricGenerationToken: ViewerDocument] = [:]
48
+ var failuresByFabricGeneration: [FabricGenerationToken: Error] = [:]
49
+ var themesByGeneration: [String: PreparedProseTheme] = [:]
50
+ var themeAccessOrder: [String] = []
51
+ var themeOwners: [FabricGenerationToken: String] = [:]
52
+ var themeOwnerCounts: [String: Int] = [:]
53
+ var fabricMeasurementsInFlight: [FabricGenerationToken: FabricMeasurementState] = [:]
54
+ /// Bounded to state-family handles that still have Fabric lifecycle
55
+ /// ownership. Terminal lifecycle cleanup removes entries entirely.
56
+ var fabricLeaseStates: [FabricLeaseOwner: FabricLeaseState] = [:]
57
+ var fabricOwnershipRevisions: [FabricGenerationToken: UInt64] = [:]
58
+ var themesRetainedBytes = 0
59
+ var compiledRetainedBytes = 0
60
+ let compiledByteBudget: Int
61
+ let compilationFailureBudget: Int
62
+ let themeByteBudget: Int
63
+ let themeEntryBudget: Int
64
+ let layoutCache: PreparedProseLayoutCache
65
+ private let compile: DocumentCompiler
66
+ let prepare: LayoutPreparation
67
+ private(set) var layoutPreparationCount = 0
68
+
69
+ // XCTest-only lock-step hook for the mount-miss/measure ownership race.
70
+ // It is deliberately absent from release binaries.
71
+ #if DEBUG
72
+ var fabricMountMissAfterExactLeaseCleanupForTesting: (() -> Void)?
73
+ var fabricSidecarRegisteredForTesting: (() -> Void)?
74
+ #endif
75
+
76
+ var preparedLayoutCacheCountForTesting: Int { layoutCache.countForTesting }
77
+ var compiledDocumentBytesForTesting: Int {
78
+ compiledCondition.lock()
79
+ defer { compiledCondition.unlock() }
80
+ return compiledRetainedBytes
81
+ }
82
+ var layoutRetainedBytesForTesting: Int { layoutCache.retainedBytesForTesting }
83
+ var oversizedLeaseCountForTesting: Int { layoutCache.oversizedLeaseCountForTesting }
84
+ var pendingFabricLeaseCountForTesting: Int { layoutCache.pendingLeaseCountForTesting }
85
+ var mountedFabricLeaseCountForTesting: Int { layoutCache.mountedLeaseCountForTesting }
86
+ var fabricLeaseCountForTesting: Int { layoutCache.leaseCountForTesting }
87
+ struct BenchmarkResidentCensus {
88
+ let keys: [ProseLayoutKey]
89
+ let count: Int
90
+ let digest: String
91
+ }
92
+ func permittedFabricGenerationForTesting(_ owner: FabricLeaseOwner) -> String? {
93
+ compiledCondition.lock()
94
+ defer { compiledCondition.unlock() }
95
+ return fabricLeaseStates[owner]?.permittedGenerationIdentity
96
+ }
97
+ func hasFabricGenerationOwnershipForTesting(_ generation: FabricGenerationToken) -> Bool {
98
+ compiledCondition.lock()
99
+ defer { compiledCondition.unlock() }
100
+ if documentsByFabricGeneration[generation] != nil {
101
+ return themeOwners[generation] != nil
102
+ }
103
+ return failuresByFabricGeneration[generation] != nil
104
+ }
105
+ var preparedThemeCountForTesting: Int {
106
+ compiledCondition.lock()
107
+ defer { compiledCondition.unlock() }
108
+ return themesByGeneration.count
109
+ }
110
+ func hasFabricThemeOwnershipForTesting(_ generation: FabricGenerationToken) -> Bool {
111
+ compiledCondition.lock()
112
+ defer { compiledCondition.unlock() }
113
+ return themeOwners[generation] != nil
114
+ }
115
+
116
+ override convenience init() {
117
+ self.init(compile: Self.compileWithRust, prepare: Self.prepareWithCoreText)
118
+ }
119
+
120
+ init(
121
+ byteBudget: Int = 32 * 1024 * 1024,
122
+ compiledByteBudget: Int = 8 * 1024 * 1024,
123
+ compilationFailureBudget: Int = 128,
124
+ themeByteBudget: Int = 512 * 1024,
125
+ themeEntryBudget: Int = 128,
126
+ compile: @escaping DocumentCompiler,
127
+ prepare: @escaping LayoutPreparation = PreparedProseLayoutRegistry.prepareWithCoreText
128
+ ) {
129
+ self.compile = compile
130
+ self.prepare = prepare
131
+ layoutCache = PreparedProseLayoutCache(byteBudget: byteBudget)
132
+ self.compiledByteBudget = compiledByteBudget
133
+ self.compilationFailureBudget = compilationFailureBudget
134
+ self.themeByteBudget = themeByteBudget
135
+ self.themeEntryBudget = themeEntryBudget
136
+ super.init()
137
+ NotificationCenter.default.addObserver(
138
+ self,
139
+ selector: #selector(didReceiveMemoryWarning),
140
+ name: UIApplication.didReceiveMemoryWarningNotification,
141
+ object: nil
142
+ )
143
+ }
144
+
145
+ deinit { NotificationCenter.default.removeObserver(self) }
146
+
147
+ func compileDocument(request: ProseViewerRequest) throws -> ViewerDocument {
148
+ let cacheKey = request.compiledCacheKey
149
+ compiledCondition.lock()
150
+ if let document = compiledDocuments[cacheKey] {
151
+ touchCompiled(cacheKey)
152
+ compiledCondition.unlock()
153
+ return document
154
+ }
155
+ if let failure = compilationFailures[cacheKey] {
156
+ touchCompilationFailure(cacheKey)
157
+ compiledCondition.unlock()
158
+ throw failure
159
+ }
160
+ if let compilation = compiledInFlight[cacheKey] {
161
+ while compilation.result == nil { compiledCondition.wait() }
162
+ let result = compilation.result!
163
+ compiledCondition.unlock()
164
+ return try result.get()
165
+ }
166
+ let compilation = Compilation()
167
+ compiledInFlight[cacheKey] = compilation
168
+ compiledCondition.unlock()
169
+
170
+ let compileStarted = PreparedProseInstrumentation.now()
171
+ let result = Result<ViewerDocument, Error> {
172
+ let compiled = try compile(request)
173
+ guard compiled.semanticKey.range(of: "^[0-9a-f]{64}$", options: .regularExpression) != nil else {
174
+ throw ProseViewerError.compiler(
175
+ domain: "viewer",
176
+ code: "INVALID_SEMANTIC_KEY",
177
+ message: "The compiler returned an invalid semantic key."
178
+ )
179
+ }
180
+ return compiled
181
+ }
182
+ PreparedProseInstrumentation.compiled(compileStarted, generation: request.generationIdentity)
183
+
184
+ compiledCondition.lock()
185
+ if case let .success(document) = result {
186
+ compiledDocuments[cacheKey] = document
187
+ compiledRetainedBytes += document.retainedBytes
188
+ touchCompiled(cacheKey)
189
+ trimCompiledToBudget()
190
+ PreparedProseInstrumentation.retained(.compiled, scope: "registry", bytes: compiledRetainedBytes)
191
+ } else if case let .failure(error) = result {
192
+ compilationFailures[cacheKey] = error
193
+ touchCompilationFailure(cacheKey)
194
+ trimCompilationFailuresToBudget()
195
+ }
196
+ compilation.result = result
197
+ compiledInFlight.removeValue(forKey: cacheKey)
198
+ compiledCondition.broadcast()
199
+ compiledCondition.unlock()
200
+ return try result.get()
201
+ }
202
+
203
+ func measure(
204
+ request: ProseViewerRequest,
205
+ widthPoints: CGFloat,
206
+ scale: CGFloat,
207
+ compiledDocument: ViewerDocument? = nil,
208
+ fabricSurface: FabricSurfaceToken? = nil,
209
+ fabricLeaseHandle: UInt64 = 1,
210
+ measurementImageState: ViewerAttachmentRevisionState? = nil
211
+ ) -> PreparedProseLayout {
212
+ let generation: FabricGenerationToken?
213
+ if let fabricSurface, fabricLeaseHandle != 0 {
214
+ generation = FabricGenerationToken(
215
+ surface: fabricSurface,
216
+ generationIdentity: request.generationIdentity,
217
+ leaseHandle: fabricLeaseHandle
218
+ )
219
+ } else {
220
+ generation = nil
221
+ }
222
+ guard let widthPixels = ProseLayoutMetrics.widthPixels(widthPoints: widthPoints, scale: scale) else {
223
+ if let generation {
224
+ releaseFabricInvalidMeasurement(
225
+ generation,
226
+ widthPoints: widthPoints,
227
+ scale: scale
228
+ )
229
+ }
230
+ return invalidWidthArtifact(
231
+ request: request,
232
+ scale: scale,
233
+ error: .hostContract(message: "A finite positive width is required for prose measurement.")
234
+ )
235
+ }
236
+ let beganFabricMeasure = generation.map(beginFabricMeasure) ?? false
237
+ let ownedGeneration = beganFabricMeasure ? generation : nil
238
+ defer {
239
+ if let generation, beganFabricMeasure { endFabricMeasure(generation) }
240
+ }
241
+ let canonicalWidth = ProseLayoutMetrics.canonicalWidth(widthPixels: widthPixels, scale: scale)
242
+ // Yoga can prepare before a component view exists. Reset the matching
243
+ // surface sidecar before Core Text asks for intrinsic fallback.
244
+ let imageMeasurementState = ownedGeneration.flatMap { token -> ViewerAttachmentRevisionState? in
245
+ guard isFabricLeaseActive(token) else { return nil }
246
+ let state = FabricAttachmentSidecars.begin(
247
+ token.surface,
248
+ leaseHandle: fabricLeaseHandle,
249
+ semanticIdentity: request.semanticGenerationIdentity
250
+ )
251
+ #if DEBUG
252
+ fabricSidecarRegisteredForTesting?()
253
+ #endif
254
+ // Release may race validation and create a stale exact sidecar.
255
+ // Remove only this handle; a replacement family has another one.
256
+ guard isFabricLeaseActive(token) else {
257
+ FabricAttachmentSidecars.remove(token.surface, leaseHandle: token.leaseHandle)
258
+ return nil
259
+ }
260
+ return state
261
+ } ?? measurementImageState ?? generation.map { _ in
262
+ let state = ViewerAttachmentRevisionState()
263
+ _ = state.beginSemanticGeneration(request.semanticGenerationIdentity)
264
+ return state
265
+ }
266
+ do {
267
+ if let ownedGeneration, !isFabricLeaseActive(ownedGeneration) {
268
+ throw FabricMeasurementCancelled()
269
+ }
270
+ let document = try preparedDocument(
271
+ request: request,
272
+ compiledDocument: compiledDocument,
273
+ fabricGeneration: ownedGeneration
274
+ )
275
+ let key = layoutKey(for: document, request: request, widthPixels: widthPixels, scale: scale)
276
+ if let ownedGeneration, !isFabricLeaseActive(ownedGeneration) {
277
+ throw FabricMeasurementCancelled()
278
+ }
279
+ let layout = try layoutCache.value(
280
+ for: key,
281
+ fabricSurface: ownedGeneration?.surface,
282
+ fabricLeaseHandle: ownedGeneration?.leaseHandle,
283
+ shouldCreateFabricLease: {
284
+ guard let ownedGeneration else { return true }
285
+ return self.isFabricLeaseActive(ownedGeneration)
286
+ },
287
+ build: {
288
+ let layoutStarted = PreparedProseInstrumentation.now()
289
+ self.lock.lock()
290
+ self.layoutPreparationCount += 1
291
+ self.lock.unlock()
292
+ do {
293
+ var prepared: Result<PreparedProseLayout, Error>!
294
+ request.appearance.traits.performAsCurrent {
295
+ prepared = Result {
296
+ if let imageMeasurementState {
297
+ return try FabricAttachmentSidecars.withMeasurementState(imageMeasurementState) {
298
+ try self.prepare(document, key, canonicalWidth, scale)
299
+ }
300
+ }
301
+ return try self.prepare(document, key, canonicalWidth, scale)
302
+ }
303
+ }
304
+ let artifact = try prepared.get()
305
+ PreparedProseInstrumentation.laidOut(layoutStarted, generation: request.generationIdentity)
306
+ return artifact
307
+ } catch let error as ProseViewerError {
308
+ return self.errorArtifact(key: key, width: canonicalWidth, error: error)
309
+ } catch {
310
+ return self.errorArtifact(
311
+ key: key,
312
+ width: canonicalWidth,
313
+ error: .layout(message: String(describing: error))
314
+ )
315
+ }
316
+ }
317
+ )
318
+ if let generation = ownedGeneration,
319
+ !retainFabricGenerationOwnership(
320
+ generation,
321
+ document: document,
322
+ request: request
323
+ ) {
324
+ discardCancelledFabricMeasurement(
325
+ generation,
326
+ widthPixels: widthPixels,
327
+ scale: scale
328
+ )
329
+ }
330
+ return layout
331
+ } catch is FabricMeasurementCancelled {
332
+ if let ownedGeneration {
333
+ discardCancelledFabricMeasurement(ownedGeneration, widthPixels: widthPixels, scale: scale)
334
+ }
335
+ return invalidWidthArtifact(
336
+ request: request,
337
+ scale: scale,
338
+ error: .layout(message: "A released Fabric measurement completed after its lifecycle ended.")
339
+ )
340
+ } catch let error as ProseViewerError {
341
+ let layout = cachedErrorArtifact(
342
+ request: request,
343
+ widthPixels: widthPixels,
344
+ scale: scale,
345
+ error: error,
346
+ fabricSurface: ownedGeneration?.surface,
347
+ fabricGeneration: ownedGeneration,
348
+ fabricLeaseHandle: ownedGeneration?.leaseHandle
349
+ )
350
+ if let generation = ownedGeneration,
351
+ !retainFabricGenerationFailure(generation, error: error) {
352
+ discardCancelledFabricMeasurement(
353
+ generation,
354
+ widthPixels: widthPixels,
355
+ scale: scale
356
+ )
357
+ }
358
+ return layout
359
+ } catch {
360
+ let layout = cachedErrorArtifact(
361
+ request: request,
362
+ widthPixels: widthPixels,
363
+ scale: scale,
364
+ error: .layout(message: String(describing: error)),
365
+ fabricSurface: ownedGeneration?.surface,
366
+ fabricGeneration: ownedGeneration,
367
+ fabricLeaseHandle: ownedGeneration?.leaseHandle
368
+ )
369
+ if let generation = ownedGeneration,
370
+ !retainFabricGenerationFailure(generation, error: error) {
371
+ discardCancelledFabricMeasurement(
372
+ generation,
373
+ widthPixels: widthPixels,
374
+ scale: scale
375
+ )
376
+ }
377
+ return layout
378
+ }
379
+ }
380
+
381
+ }