@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,462 @@
1
+ import UIKit
2
+
3
+ /// A mention activated from an embedded prose viewer.
4
+ public struct ProseViewerMention {
5
+ public let docPos: UInt32
6
+ public let label: String
7
+ public let attrs: [String: Any]
8
+ }
9
+
10
+ /// Interaction callbacks for an embedded prose viewer.
11
+ public protocol ProseViewerInteractionDelegate: AnyObject {
12
+ func proseViewer(_ view: ProseViewerView, didTapLink href: String, text: String)
13
+ func proseViewer(_ view: ProseViewerView, didTapMention mention: ProseViewerMention)
14
+ func proseViewer(_ view: ProseViewerView, didFail error: ProseViewerError)
15
+ }
16
+
17
+ public extension ProseViewerInteractionDelegate {
18
+ func proseViewer(_ view: ProseViewerView, didFail error: ProseViewerError) {}
19
+ }
20
+
21
+ /// A direct Core Text viewer. Its first finite measurement or layout prepares an immutable artifact.
22
+ public final class ProseViewerView: UIView {
23
+ public weak var interactionDelegate: ProseViewerInteractionDelegate?
24
+
25
+ private let layoutRegistry: PreparedProseLayoutRegistry
26
+ private let drawingView = PreparedProseDrawingView(frame: .zero)
27
+ private var request: ProseViewerRequest?
28
+ private var compiledDocument: ViewerDocument?
29
+ private var ownedLayout: PreparedProseLayout?
30
+ private lazy var preparedInstrumentationOwner = "direct-\(ObjectIdentifier(self))"
31
+ private var pendingError: ProseViewerError?
32
+ private var errorWasReported = false
33
+ private let attachmentRevisions = ViewerAttachmentRevisionState()
34
+ private let fontEnvironment = ViewerFontEnvironment.shared
35
+ private var fontEnvironmentObserver: NSObjectProtocol?
36
+ private lazy var viewerImagePipeline = ViewerImagePipeline(policy: .default)
37
+
38
+ internal var drawingViewForTesting: PreparedProseDrawingView { drawingView }
39
+ internal var linkTapsEnabled = true {
40
+ didSet {
41
+ guard oldValue != linkTapsEnabled else { return }
42
+ drawingView.linkInteractionsEnabled = linkTapsEnabled
43
+ }
44
+ }
45
+ /// Mounted host total; the layout cache intentionally excludes this
46
+ /// mutable sidecar because it is not shared immutable layout state.
47
+ internal var preparedSurfaceRetainedBytesForTesting: Int {
48
+ PreparedProseDrawingView.saturatingAdd(
49
+ PreparedProseDrawingView.saturatingAdd(
50
+ ownedLayout?.retainedBytes ?? 0,
51
+ attachmentRevisions.retainedPublicationBytesForTesting
52
+ ),
53
+ drawingView.retainedImagePixelsBytesForTesting
54
+ )
55
+ }
56
+
57
+ public override init(frame: CGRect) {
58
+ layoutRegistry = .shared
59
+ super.init(frame: frame)
60
+ setup()
61
+ }
62
+
63
+ init(frame: CGRect = .zero, layoutRegistry: PreparedProseLayoutRegistry) {
64
+ self.layoutRegistry = layoutRegistry
65
+ super.init(frame: frame)
66
+ setup()
67
+ }
68
+
69
+ @available(*, unavailable)
70
+ required init?(coder: NSCoder) { fatalError("ProseViewerView does not support NSCoder") }
71
+
72
+ private func setup() {
73
+ fontEnvironment.refreshContentSizeCategory()
74
+ drawingView.backgroundColor = .clear
75
+ drawingView.isOpaque = false
76
+ drawingView.linkInteractionsEnabled = linkTapsEnabled
77
+ drawingView.onActivateInteraction = { [weak self] interaction in self?.activate(interaction) ?? false }
78
+ drawingView.onCodeHighlightingResolved = { [weak self] generation in
79
+ guard let self, let request = self.request, request.semanticGenerationIdentity == generation else { return }
80
+ self.request = ProseViewerRequest(source: request.source, configuration: request.configuration,
81
+ nativeFontRevision: request.nativeFontRevision &+ 1, nativeFontScale: request.nativeFontScale,
82
+ fontEnvironmentRevision: request.fontEnvironmentRevision, attachmentRevision: request.attachmentRevision,
83
+ appearance: request.appearance)
84
+ self.invalidateIntrinsicContentSize()
85
+ self.setNeedsLayout()
86
+ }
87
+ drawingView.onCodeHighlightingFailure = { [weak self] error in
88
+ guard let self else { return }
89
+ self.interactionDelegate?.proseViewer(self, didFail: .compiler(domain: "addon", code: "CODE_HIGHLIGHTING_FAILED", message: error.localizedDescription))
90
+ }
91
+ drawingView.onVisibleRectChange = { [weak self] visibleRect in
92
+ self?.requestVisibleImageAttachments(in: visibleRect)
93
+ }
94
+ viewerImagePipeline.onPixels = { [weak self] attachment, image in
95
+ guard let self, self.request?.semanticGenerationIdentity == self.viewerImageGeneration else { return }
96
+ self.drawingView.imagePixels[attachment.id] = image
97
+ }
98
+ viewerImagePipeline.onIntrinsicMetadata = { [weak self] attachment, size in
99
+ self?.applyIntrinsicImageMetadata(attachment, size: size)
100
+ }
101
+ viewerImagePipeline.onResourceFailure = { [weak self] attachment in self?.reportResourceFailureIfNeeded(attachment) }
102
+ fontEnvironmentObserver = NotificationCenter.default.addObserver(
103
+ forName: ViewerFontEnvironment.didInvalidateNotification,
104
+ object: fontEnvironment,
105
+ queue: .main
106
+ ) { [weak self] note in
107
+ self?.applyFontEnvironmentRevision(note.userInfo?["revision"] as? UInt64 ?? 0)
108
+ }
109
+ isAccessibilityElement = false
110
+ addSubview(drawingView)
111
+ }
112
+
113
+ deinit {
114
+ layoutRegistry.releaseDirectMounted(preparedInstrumentationOwner)
115
+ if let fontEnvironmentObserver { NotificationCenter.default.removeObserver(fontEnvironmentObserver) }
116
+ }
117
+
118
+ @discardableResult
119
+ private func activate(_ interaction: PreparedProseInteraction) -> Bool {
120
+ switch interaction.kind {
121
+ case .link:
122
+ guard linkTapsEnabled, let href = interaction.href else { return false }
123
+ interactionDelegate?.proseViewer(self, didTapLink: href, text: interaction.visibleText)
124
+ return true
125
+ case .mention:
126
+ guard
127
+ let docPos = interaction.docPos,
128
+ let attrsJSON = interaction.attrsJSON,
129
+ let attrs = Self.parseMentionAttrs(attrsJSON)
130
+ else {
131
+ interactionDelegate?.proseViewer(
132
+ self,
133
+ didFail: .compiler(
134
+ domain: "viewer",
135
+ code: "INVALID_MENTION_ATTRIBUTES",
136
+ message: "The prepared mention attributes are not a JSON object."
137
+ )
138
+ )
139
+ return false
140
+ }
141
+ interactionDelegate?.proseViewer(
142
+ self,
143
+ didTapMention: ProseViewerMention(docPos: docPos, label: interaction.label, attrs: attrs)
144
+ )
145
+ return true
146
+ }
147
+ }
148
+
149
+ private static func parseMentionAttrs(_ json: String) -> [String: Any]? {
150
+ guard let data = json.data(using: .utf8) else { return nil }
151
+ return (try? JSONSerialization.jsonObject(with: data)) as? [String: Any]
152
+ }
153
+
154
+ @discardableResult
155
+ internal func activatePreparedInteractionForTesting(_ interaction: PreparedProseInteraction) -> Bool {
156
+ activate(interaction)
157
+ }
158
+
159
+ private func installPreparedLayout(_ layout: PreparedProseLayout?) {
160
+ ownedLayout = layout
161
+ if let layout {
162
+ layoutRegistry.registerDirectMounted(preparedInstrumentationOwner, layout: layout)
163
+ } else {
164
+ layoutRegistry.releaseDirectMounted(preparedInstrumentationOwner)
165
+ }
166
+ PreparedProseInstrumentation.retained(.sidecars, scope: "direct-\(ObjectIdentifier(self))", bytes: attachmentRevisions.retainedPublicationBytesForTesting)
167
+ drawingView.install(layout: layout)
168
+ }
169
+
170
+ /// Compiles once for this immutable generation. The first finite measurement prepares layout.
171
+ @discardableResult
172
+ public func apply(source: ProseViewerSource, configuration: ProseViewerConfiguration) -> Bool {
173
+ let fontRevision = fontEnvironment.revision
174
+ let appearance = currentAppearance
175
+ if let request,
176
+ request.source == source,
177
+ request.configuration == configuration {
178
+ guard request.fontEnvironmentRevision != fontRevision || request.appearance != appearance
179
+ else { return pendingError == nil }
180
+ self.request = ProseViewerRequest(
181
+ source: request.source,
182
+ configuration: request.configuration,
183
+ nativeFontRevision: request.nativeFontRevision,
184
+ nativeFontScale: fontEnvironment.fontScale(for: fontRevision),
185
+ fontEnvironmentRevision: fontRevision,
186
+ attachmentRevision: request.attachmentRevision,
187
+ appearance: appearance
188
+ )
189
+ invalidateIntrinsicContentSize()
190
+ setNeedsLayout()
191
+ return pendingError == nil
192
+ }
193
+ let nextRequest = ProseViewerRequest(
194
+ source: source,
195
+ configuration: configuration,
196
+ nativeFontScale: fontEnvironment.fontScale(for: fontRevision),
197
+ fontEnvironmentRevision: fontRevision,
198
+ attachmentRevision: 0,
199
+ appearance: appearance
200
+ )
201
+ PreparedProseInstrumentation.invalidated(.content)
202
+ _ = attachmentRevisions.beginSemanticGeneration(nextRequest.semanticGenerationIdentity)
203
+ request = nextRequest
204
+ compiledDocument = nil
205
+ viewerImagePipeline.cancel()
206
+ drawingView.imagePixels = [:]
207
+ installPreparedLayout(nil)
208
+ pendingError = nil
209
+ errorWasReported = false
210
+ do {
211
+ compiledDocument = try layoutRegistry.compileDocument(request: nextRequest)
212
+ invalidateIntrinsicContentSize()
213
+ setNeedsLayout()
214
+ return true
215
+ } catch let error as ProseViewerError {
216
+ pendingError = error
217
+ invalidateIntrinsicContentSize()
218
+ setNeedsLayout()
219
+ return false
220
+ } catch {
221
+ pendingError = .layout(message: String(describing: error))
222
+ invalidateIntrinsicContentSize()
223
+ setNeedsLayout()
224
+ return false
225
+ }
226
+ }
227
+
228
+ public override func sizeThatFits(_ size: CGSize) -> CGSize {
229
+ let layout = preparedLayout(width: size.width, scale: displayScale)
230
+ guard size.width.isFinite, size.width > 0 else { return .zero }
231
+ let hostHeight = size.height
232
+ let height = hostHeight.isFinite && hostHeight >= 0 ? min(layout.size.height, hostHeight) : layout.size.height
233
+ return CGSize(width: layout.size.width, height: height)
234
+ }
235
+
236
+ public override var intrinsicContentSize: CGSize {
237
+ guard bounds.width.isFinite, bounds.width > 0 else {
238
+ return CGSize(width: UIView.noIntrinsicMetric, height: UIView.noIntrinsicMetric)
239
+ }
240
+ return preparedLayout(width: bounds.width, scale: displayScale).size
241
+ }
242
+
243
+ public override func systemLayoutSizeFitting(_ targetSize: CGSize) -> CGSize {
244
+ sizeThatFits(targetSize)
245
+ }
246
+
247
+ public override func layoutSubviews() {
248
+ super.layoutSubviews()
249
+ drawingView.frame = bounds
250
+ let scale = displayScale
251
+ if let request,
252
+ let widthPixels = ProseLayoutMetrics.widthPixels(widthPoints: bounds.width, scale: scale),
253
+ !ownedLayoutMatches(request: request, widthPixels: widthPixels, scale: scale) {
254
+ _ = preparedLayout(width: bounds.width, scale: scale)
255
+ } else {
256
+ drawingView.install(layout: ownedLayout)
257
+ }
258
+ drawingView.updateConfiguredImagesForVisibleWindow()
259
+ }
260
+
261
+ public override func didMoveToWindow() {
262
+ super.didMoveToWindow()
263
+ guard window != nil else {
264
+ layoutRegistry.releaseDirectMounted(preparedInstrumentationOwner)
265
+ viewerImagePipeline.cancel()
266
+ // Request cancellation is not a semantic replacement. Preserve
267
+ // publication bits and revision for a later remount.
268
+ drawingView.imagePixels = [:]
269
+ return
270
+ }
271
+ if let ownedLayout {
272
+ layoutRegistry.registerDirectMounted(preparedInstrumentationOwner, layout: ownedLayout)
273
+ }
274
+ drawingView.updateConfiguredImagesForVisibleWindow()
275
+ }
276
+
277
+ public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
278
+ super.traitCollectionDidChange(previousTraitCollection)
279
+ applyAppearance()
280
+ }
281
+
282
+ /// Releases this surface's artifact ownership without clearing its delegate.
283
+ public func prepareForReuse() {
284
+ PreparedProseInstrumentation.invalidated(.reuse)
285
+ request = nil
286
+ compiledDocument = nil
287
+ installPreparedLayout(nil)
288
+ pendingError = nil
289
+ errorWasReported = false
290
+ viewerImagePipeline.cancel()
291
+ attachmentRevisions.reset()
292
+ drawingView.imagePixels = [:]
293
+ invalidateIntrinsicContentSize()
294
+ setNeedsLayout()
295
+ }
296
+
297
+ private var displayScale: CGFloat {
298
+ let scale = window?.screen.scale ?? UIScreen.main.scale
299
+ return scale.isFinite && scale > 0 ? scale : 1
300
+ }
301
+
302
+ private func ownedLayoutMatches(request: ProseViewerRequest, widthPixels: Int, scale: CGFloat) -> Bool {
303
+ guard let ownedLayout else { return false }
304
+ return ownedLayout.key.generationIdentity == request.generationIdentity
305
+ && ownedLayout.key.widthPixels == widthPixels
306
+ && ownedLayout.key.displayScaleBits == Double(scale).bitPattern
307
+ }
308
+
309
+ @discardableResult
310
+ private func preparedLayout(width: CGFloat, scale: CGFloat) -> PreparedProseLayout {
311
+ guard let request else {
312
+ let widthPixels = ProseLayoutMetrics.widthPixels(widthPoints: width, scale: scale) ?? 0
313
+ let errorWidth = widthPixels > 0
314
+ ? ProseLayoutMetrics.canonicalWidth(widthPixels: widthPixels, scale: scale)
315
+ : 0
316
+ let empty = PreparedProseLayout.error(
317
+ key: ProseLayoutKey(
318
+ semanticKey: "empty",
319
+ widthPixels: widthPixels,
320
+ themeDigest: "",
321
+ nativeFontRevision: 0,
322
+ fontEnvironmentRevision: 0,
323
+ displayScale: scale,
324
+ attachmentRevision: 0,
325
+ generationIdentity: "empty",
326
+ semanticGenerationIdentity: "empty"
327
+ ),
328
+ width: errorWidth,
329
+ error: .hostContract(message: "No prose viewer source has been applied.")
330
+ )
331
+ installPreparedLayout(empty)
332
+ return empty
333
+ }
334
+ if let pendingError {
335
+ let widthPixels = ProseLayoutMetrics.widthPixels(widthPoints: width, scale: scale) ?? 0
336
+ let safeWidth = widthPixels > 0
337
+ ? ProseLayoutMetrics.canonicalWidth(widthPixels: widthPixels, scale: scale)
338
+ : 0
339
+ let errorLayout = PreparedProseLayout.error(
340
+ key: ProseLayoutKey(
341
+ semanticKey: "error:" + request.compiledCacheKey,
342
+ widthPixels: widthPixels,
343
+ themeDigest: request.themeDigest,
344
+ nativeFontRevision: request.nativeFontRevision,
345
+ fontEnvironmentRevision: request.fontEnvironmentRevision,
346
+ displayScale: scale,
347
+ attachmentRevision: request.attachmentRevision,
348
+ generationIdentity: request.generationIdentity,
349
+ semanticGenerationIdentity: request.semanticGenerationIdentity
350
+ ),
351
+ width: safeWidth,
352
+ error: pendingError
353
+ )
354
+ installPreparedLayout(errorLayout)
355
+ reportErrorIfNeeded(pendingError)
356
+ return errorLayout
357
+ }
358
+ let layout = layoutRegistry.measure(
359
+ request: request,
360
+ widthPoints: width,
361
+ scale: scale,
362
+ compiledDocument: compiledDocument,
363
+ measurementImageState: attachmentRevisions
364
+ )
365
+ installPreparedLayout(layout)
366
+ reportErrorIfNeeded(layout.error)
367
+ return layout
368
+ }
369
+
370
+ private var viewerImageGeneration: String? { request?.semanticGenerationIdentity }
371
+
372
+ private func configureImageGeneration(for layout: PreparedProseLayout) {
373
+ guard let request else { return }
374
+ _ = attachmentRevisions.beginSemanticGeneration(request.semanticGenerationIdentity)
375
+ attachmentRevisions.admit(attachmentCount: layout.imageAttachments.count)
376
+ viewerImagePipeline.begin(
377
+ generation: request.semanticGenerationIdentity,
378
+ imagesEnabled: request.configuration.imagesEnabled,
379
+ policy: ImageLoadingPolicy.from(json: request.configuration.imagePolicyJSON)
380
+ )
381
+ }
382
+
383
+ private func requestVisibleImageAttachments(in visibleRect: CGRect?) {
384
+ guard let layout = ownedLayout, let visibleRect else {
385
+ viewerImagePipeline.leaveViewport()
386
+ return
387
+ }
388
+ configureImageGeneration(for: layout)
389
+ viewerImagePipeline.updateVisibleRect(visibleRect, attachments: layout.imageAttachments)
390
+ }
391
+
392
+ private func applyIntrinsicImageMetadata(_ attachment: ViewerImageAttachment, size: CGSize) {
393
+ guard let request,
394
+ viewerImagePipeline.acceptsCompletion(generation: request.semanticGenerationIdentity),
395
+ attachmentRevisions.recordIntrinsicSize(size, for: attachment.id, ordinal: attachment.ordinal, declaredSize: attachment.declaredSize)
396
+ else { return }
397
+ self.request = ProseViewerRequest(
398
+ source: request.source,
399
+ configuration: request.configuration,
400
+ nativeFontRevision: request.nativeFontRevision,
401
+ nativeFontScale: request.nativeFontScale,
402
+ fontEnvironmentRevision: request.fontEnvironmentRevision,
403
+ attachmentRevision: attachmentRevisions.revision,
404
+ appearance: request.appearance
405
+ )
406
+ PreparedProseInstrumentation.invalidated(.attachment)
407
+ PreparedProseInstrumentation.retained(.sidecars, scope: "direct-\(ObjectIdentifier(self))", bytes: attachmentRevisions.retainedPublicationBytesForTesting)
408
+ // Metadata is the sole image completion allowed to reflow. Pixels stay
409
+ // in the drawing cache; this schedules exactly one replacement key.
410
+ invalidateIntrinsicContentSize()
411
+ setNeedsLayout()
412
+ }
413
+
414
+ private func applyFontEnvironmentRevision(_ revision: UInt64) {
415
+ guard let request, revision > request.fontEnvironmentRevision else { return }
416
+ self.request = ProseViewerRequest(
417
+ source: request.source,
418
+ configuration: request.configuration,
419
+ nativeFontRevision: request.nativeFontRevision,
420
+ nativeFontScale: fontEnvironment.fontScale(for: revision),
421
+ fontEnvironmentRevision: revision,
422
+ attachmentRevision: request.attachmentRevision,
423
+ appearance: request.appearance
424
+ )
425
+ PreparedProseInstrumentation.invalidated(.font)
426
+ invalidateIntrinsicContentSize()
427
+ setNeedsLayout()
428
+ }
429
+
430
+ private var currentAppearance: ProseViewerAppearance {
431
+ ProseViewerAppearance(traits: traitCollection)
432
+ }
433
+
434
+ private func applyAppearance() {
435
+ guard let request, request.appearance != currentAppearance else { return }
436
+ self.request = ProseViewerRequest(
437
+ source: request.source,
438
+ configuration: request.configuration,
439
+ nativeFontRevision: request.nativeFontRevision,
440
+ nativeFontScale: request.nativeFontScale,
441
+ fontEnvironmentRevision: request.fontEnvironmentRevision,
442
+ attachmentRevision: request.attachmentRevision,
443
+ appearance: currentAppearance
444
+ )
445
+ PreparedProseInstrumentation.invalidated(.appearance)
446
+ invalidateIntrinsicContentSize()
447
+ setNeedsLayout()
448
+ }
449
+
450
+ private func reportErrorIfNeeded(_ error: ProseViewerError?) {
451
+ guard let error, !errorWasReported else { return }
452
+ errorWasReported = true
453
+ interactionDelegate?.proseViewer(self, didFail: error)
454
+ }
455
+
456
+ private func reportResourceFailureIfNeeded(_ attachment: ViewerImageAttachment) {
457
+ guard attachmentRevisions.recordResourceFailure(for: attachment.ordinal)
458
+ else { return }
459
+ interactionDelegate?.proseViewer(self, didFail: .resource)
460
+ }
461
+
462
+ }