@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,354 @@
1
+ import UIKit
2
+
3
+ struct NativeMentionSuggestion {
4
+ let key: String
5
+ let title: String
6
+ let subtitle: String?
7
+ let label: String
8
+ let attrs: [String: Any]
9
+
10
+ init?(dictionary: [String: Any]) {
11
+ guard let key = dictionary["key"] as? String,
12
+ let title = dictionary["title"] as? String,
13
+ let label = dictionary["label"] as? String
14
+ else {
15
+ return nil
16
+ }
17
+
18
+ self.key = key
19
+ self.title = title
20
+ self.subtitle = dictionary["subtitle"] as? String
21
+ self.label = label
22
+ self.attrs = dictionary["attrs"] as? [String: Any] ?? [:]
23
+ }
24
+
25
+ func displayLabel(trigger: String) -> String {
26
+ let trimmedLabel = label.trimmingCharacters(in: .whitespacesAndNewlines)
27
+ guard !trigger.isEmpty, !trimmedLabel.hasPrefix(trigger) else {
28
+ return trimmedLabel
29
+ }
30
+ return "\(trigger)\(trimmedLabel)"
31
+ }
32
+ }
33
+
34
+ struct NativeMentionsAddonConfig {
35
+ let trigger: String
36
+ let suggestions: [NativeMentionSuggestion]
37
+ let theme: EditorMentionTheme?
38
+ let resolveSelectionAttrs: Bool
39
+ let resolveTheme: Bool
40
+
41
+ init?(dictionary: [String: Any]) {
42
+ let trigger = (dictionary["trigger"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines)
43
+ self.trigger = (trigger?.isEmpty == false ? trigger : "@") ?? "@"
44
+ self.suggestions = ((dictionary["suggestions"] as? [[String: Any]]) ?? []).compactMap(NativeMentionSuggestion.init(dictionary:))
45
+ self.resolveSelectionAttrs = dictionary["resolveSelectionAttrs"] as? Bool ?? false
46
+ self.resolveTheme = dictionary["resolveTheme"] as? Bool ?? false
47
+ if let theme = dictionary["theme"] as? [String: Any] {
48
+ self.theme = EditorMentionTheme(dictionary: theme)
49
+ } else {
50
+ self.theme = nil
51
+ }
52
+ }
53
+ }
54
+
55
+ struct NativeEditorAddons {
56
+ var codeHighlighting: NativeCodeHighlightConfiguration?
57
+ let mentions: NativeMentionsAddonConfig?
58
+
59
+ static func from(json: String?) -> NativeEditorAddons {
60
+ guard let json,
61
+ let data = json.data(using: .utf8),
62
+ let raw = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
63
+ else {
64
+ return NativeEditorAddons(mentions: nil)
65
+ }
66
+
67
+ return NativeEditorAddons(
68
+ codeHighlighting: NativeCodeHighlightConfiguration.from(raw["codeHighlighting"]),
69
+ mentions: (raw["mentions"] as? [String: Any]).flatMap(NativeMentionsAddonConfig.init(dictionary:))
70
+ )
71
+ }
72
+ }
73
+
74
+ struct MentionQueryState: Equatable {
75
+ let query: String
76
+ let trigger: String
77
+ let anchor: UInt32
78
+ let head: UInt32
79
+ }
80
+
81
+ func isMentionIdentifierScalar(_ scalar: Unicode.Scalar) -> Bool {
82
+ CharacterSet.alphanumerics.contains(scalar) || scalar == "_" || scalar == "-"
83
+ }
84
+
85
+ func resolveMentionQueryState(
86
+ in text: String,
87
+ cursorScalar: UInt32,
88
+ trigger: String,
89
+ isCaretInsideMention: Bool
90
+ ) -> MentionQueryState? {
91
+ guard !isCaretInsideMention else { return nil }
92
+
93
+ let scalars = Array(text.unicodeScalars)
94
+ let scalarCount = UInt32(scalars.count)
95
+ guard cursorScalar <= scalarCount else { return nil }
96
+
97
+ let triggerScalars = Array(trigger.unicodeScalars)
98
+ guard triggerScalars.count == 1, let triggerScalar = triggerScalars.first else {
99
+ return nil
100
+ }
101
+
102
+ var start = Int(cursorScalar)
103
+ while start > 0 {
104
+ let previous = scalars[start - 1]
105
+ if previous.properties.isWhitespace
106
+ || previous == "\n"
107
+ || previous == "\u{FFFC}"
108
+ || (!isMentionIdentifierScalar(previous) && previous != triggerScalar) {
109
+ break
110
+ }
111
+ start -= 1
112
+ }
113
+
114
+ guard start < scalars.count, scalars[start] == triggerScalar else {
115
+ return nil
116
+ }
117
+ if start > 0 {
118
+ let previous = scalars[start - 1]
119
+ if isMentionIdentifierScalar(previous) {
120
+ return nil
121
+ }
122
+ }
123
+
124
+ let queryStart = start + 1
125
+ let cursor = Int(cursorScalar)
126
+ guard queryStart <= cursor else { return nil }
127
+ let query = String(String.UnicodeScalarView(scalars[queryStart..<cursor]))
128
+ if query.unicodeScalars.contains(where: {
129
+ $0.properties.isWhitespace || $0 == "\n" || $0 == "\u{FFFC}"
130
+ }) {
131
+ return nil
132
+ }
133
+
134
+ return MentionQueryState(
135
+ query: query,
136
+ trigger: trigger,
137
+ anchor: UInt32(start),
138
+ head: cursorScalar
139
+ )
140
+ }
141
+
142
+ final class MentionSuggestionChipButton: UIButton {
143
+ private static let horizontalContentInset: CGFloat = 8
144
+ private static let verticalContentInset: CGFloat = 8
145
+
146
+ private let titleLabelView = UILabel()
147
+ private let subtitleLabelView = UILabel()
148
+ private let stackView = UIStackView()
149
+ private var displayLabel: String
150
+ private var theme: EditorMentionTheme?
151
+ private var toolbarAppearance: EditorToolbarAppearance = .custom
152
+
153
+ private(set) var suggestion: NativeMentionSuggestion
154
+
155
+ init(
156
+ suggestion: NativeMentionSuggestion,
157
+ trigger: String = "@",
158
+ theme: EditorMentionTheme?,
159
+ toolbarAppearance: EditorToolbarAppearance = .custom
160
+ ) {
161
+ self.suggestion = suggestion
162
+ self.displayLabel = suggestion.displayLabel(trigger: trigger)
163
+ self.theme = theme
164
+ self.toolbarAppearance = toolbarAppearance
165
+ super.init(frame: .zero)
166
+ translatesAutoresizingMaskIntoConstraints = false
167
+ layer.cornerRadius = 12
168
+ clipsToBounds = true
169
+ if #available(iOS 15.0, *) {
170
+ var configuration = UIButton.Configuration.plain()
171
+ configuration.contentInsets = .zero
172
+ self.configuration = configuration
173
+ }
174
+
175
+ titleLabelView.translatesAutoresizingMaskIntoConstraints = false
176
+ titleLabelView.isUserInteractionEnabled = false
177
+ titleLabelView.font = .systemFont(ofSize: 14, weight: .semibold)
178
+ titleLabelView.text = displayLabel
179
+ titleLabelView.numberOfLines = 1
180
+
181
+ subtitleLabelView.translatesAutoresizingMaskIntoConstraints = false
182
+ subtitleLabelView.isUserInteractionEnabled = false
183
+ subtitleLabelView.font = .systemFont(ofSize: 12)
184
+ subtitleLabelView.text = suggestion.subtitle
185
+ subtitleLabelView.numberOfLines = 1
186
+ subtitleLabelView.isHidden = suggestion.subtitle == nil
187
+
188
+ stackView.translatesAutoresizingMaskIntoConstraints = false
189
+ stackView.isUserInteractionEnabled = false
190
+ stackView.axis = .vertical
191
+ stackView.alignment = .fill
192
+ stackView.spacing = 1
193
+ stackView.addArrangedSubview(titleLabelView)
194
+ stackView.addArrangedSubview(subtitleLabelView)
195
+ addSubview(stackView)
196
+
197
+ NSLayoutConstraint.activate([
198
+ stackView.topAnchor.constraint(equalTo: topAnchor, constant: Self.verticalContentInset),
199
+ stackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: Self.horizontalContentInset),
200
+ stackView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -Self.horizontalContentInset),
201
+ stackView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -Self.verticalContentInset),
202
+ heightAnchor.constraint(greaterThanOrEqualToConstant: 40)
203
+ ])
204
+
205
+ addTarget(self, action: #selector(handleTouchDown), for: [.touchDown, .touchDragEnter])
206
+ addTarget(self, action: #selector(handleTouchUp), for: [.touchCancel, .touchDragExit, .touchUpInside, .touchUpOutside])
207
+ apply(theme: theme, toolbarAppearance: toolbarAppearance)
208
+ updateAppearance(highlighted: false)
209
+ }
210
+
211
+ required init?(coder: NSCoder) {
212
+ return nil
213
+ }
214
+
215
+ func update(suggestion: NativeMentionSuggestion, trigger: String) {
216
+ self.suggestion = suggestion
217
+ displayLabel = suggestion.displayLabel(trigger: trigger)
218
+ titleLabelView.text = displayLabel
219
+ subtitleLabelView.text = suggestion.subtitle
220
+ subtitleLabelView.isHidden = suggestion.subtitle == nil
221
+ updateAppearance(highlighted: isHighlighted)
222
+ }
223
+
224
+ func apply(theme: EditorMentionTheme?, toolbarAppearance: EditorToolbarAppearance = .custom) {
225
+ self.theme = theme
226
+ self.toolbarAppearance = toolbarAppearance
227
+ let option = theme?.suggestions?.option
228
+ layer.cornerRadius = option?.borderRadius ?? 12
229
+ layer.borderColor = (option?.borderColor ?? UIColor.clear).cgColor
230
+ layer.borderWidth = option?.borderWidth ?? 0
231
+ subtitleLabelView.isHidden = suggestion.subtitle == nil
232
+ updateAppearance(highlighted: isHighlighted)
233
+ }
234
+
235
+ override var isHighlighted: Bool {
236
+ didSet {
237
+ updateAppearance(highlighted: isHighlighted)
238
+ }
239
+ }
240
+
241
+ override func tintColorDidChange() {
242
+ super.tintColorDidChange()
243
+ if toolbarAppearance == .native {
244
+ updateAppearance(highlighted: isHighlighted)
245
+ }
246
+ }
247
+
248
+ @objc private func handleTouchDown() {
249
+ updateAppearance(highlighted: true)
250
+ }
251
+
252
+ @objc private func handleTouchUp() {
253
+ updateAppearance(highlighted: false)
254
+ }
255
+
256
+ private func updateAppearance(highlighted: Bool) {
257
+ if toolbarAppearance == .native {
258
+ layer.cornerRadius = 18
259
+ layer.borderColor = UIColor.clear.cgColor
260
+ layer.borderWidth = 0
261
+ #if compiler(>=6.2)
262
+ if #available(iOS 26.0, *) {
263
+ stackView.isHidden = true
264
+ backgroundColor = .clear
265
+ var configuration = highlighted
266
+ ? UIButton.Configuration.prominentGlass()
267
+ : UIButton.Configuration.glass()
268
+ configuration.cornerStyle = .capsule
269
+ configuration.contentInsets = NSDirectionalEdgeInsets(
270
+ top: Self.verticalContentInset,
271
+ leading: Self.horizontalContentInset,
272
+ bottom: Self.verticalContentInset,
273
+ trailing: Self.horizontalContentInset
274
+ )
275
+ configuration.title = displayLabel
276
+ configuration.subtitle = suggestion.subtitle
277
+ configuration.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in
278
+ var outgoing = incoming
279
+ outgoing.font = .systemFont(ofSize: 14, weight: .semibold)
280
+ return outgoing
281
+ }
282
+ self.configuration = configuration
283
+ return
284
+ }
285
+ #endif
286
+ stackView.isHidden = false
287
+ backgroundColor = highlighted
288
+ ? UIColor.white.withAlphaComponent(0.18)
289
+ : .clear
290
+ titleLabelView.textColor = tintColor
291
+ subtitleLabelView.textColor = tintColor.withAlphaComponent(0.72)
292
+ return
293
+ }
294
+
295
+ stackView.isHidden = false
296
+ if #available(iOS 15.0, *) {
297
+ var configuration = UIButton.Configuration.plain()
298
+ configuration.contentInsets = .zero
299
+ self.configuration = configuration
300
+ }
301
+ let option = theme?.suggestions?.option
302
+ backgroundColor = highlighted
303
+ ? (option?.highlightedBackgroundColor ?? UIColor.systemBlue.withAlphaComponent(0.12))
304
+ : (option?.backgroundColor ?? UIColor.secondarySystemBackground)
305
+ titleLabelView.textColor = highlighted
306
+ ? (option?.highlightedTextColor ?? option?.textColor ?? .label)
307
+ : (option?.textColor ?? .label)
308
+ subtitleLabelView.textColor = option?.secondaryTextColor ?? .secondaryLabel
309
+ }
310
+
311
+ func contentViewsAllowTouchPassthroughForTesting() -> Bool {
312
+ !stackView.isUserInteractionEnabled
313
+ && !titleLabelView.isUserInteractionEnabled
314
+ && !subtitleLabelView.isUserInteractionEnabled
315
+ }
316
+
317
+ func usesNativeAppearanceForTesting() -> Bool {
318
+ toolbarAppearance == .native
319
+ }
320
+
321
+ func titleTextColorForTesting() -> UIColor? {
322
+ titleLabelView.textColor
323
+ }
324
+
325
+ func subtitleTextColorForTesting() -> UIColor? {
326
+ subtitleLabelView.textColor
327
+ }
328
+
329
+ func usesNativeGlassTextRenderingForTesting() -> Bool {
330
+ #if compiler(>=6.2)
331
+ if #available(iOS 26.0, *) {
332
+ return toolbarAppearance == .native
333
+ && stackView.isHidden
334
+ && configuration?.title == displayLabel
335
+ }
336
+ #endif
337
+ return false
338
+ }
339
+
340
+ func titleTextForTesting() -> String? {
341
+ titleLabelView.text
342
+ }
343
+
344
+ func usesNativeGlassSemiboldTitleForTesting() -> Bool {
345
+ #if compiler(>=6.2)
346
+ if #available(iOS 26.0, *) {
347
+ return toolbarAppearance == .native
348
+ && stackView.isHidden
349
+ && configuration?.titleTextAttributesTransformer != nil
350
+ }
351
+ #endif
352
+ return false
353
+ }
354
+ }
@@ -0,0 +1,184 @@
1
+ import CoreText
2
+ import UIKit
3
+
4
+ struct NativeCodeHighlightConfiguration: Equatable {
5
+ let provider: String
6
+ let theme: String
7
+
8
+ static func from(_ value: Any?) -> NativeCodeHighlightConfiguration? {
9
+ guard let values = value as? [String: Any], let provider = values["provider"] as? String,
10
+ let theme = values["theme"] as? String, !provider.isEmpty, !theme.isEmpty else { return nil }
11
+ return NativeCodeHighlightConfiguration(provider: provider, theme: theme)
12
+ }
13
+ }
14
+
15
+ let editorCodeBlockAttribute = NSAttributedString.Key("com.apollohg.editor.codeBlock")
16
+ private let editorSyntaxOwnedAttribute = NSAttributedString.Key("com.apollohg.editor.syntaxOwned")
17
+
18
+ final class EditorCodeBlockPresentation: NSObject {
19
+ let language: String?
20
+ init(language: String?) { self.language = language }
21
+ }
22
+
23
+ private final class EditorSyntaxOwnedAttributes: NSObject {
24
+ let values: [NSAttributedString.Key: Any]
25
+ init(_ values: [NSAttributedString.Key: Any]) { self.values = values }
26
+ }
27
+
28
+ enum NativeCodeHighlightPresentation {
29
+ static func apply(_ ranges: [NativeCodeHighlightRange], to string: NSMutableAttributedString, offset: Int = 0, owned: Bool = false) {
30
+ for token in ranges {
31
+ let range = NSRange(location: offset + token.start, length: token.length)
32
+ guard range.location >= 0, NSMaxRange(range) <= string.length else { continue }
33
+ string.enumerateAttributes(in: range) { original, piece, _ in
34
+ var attributes: [NSAttributedString.Key: Any] = [:]
35
+ let color = UIColor(red: CGFloat(token.color >> 24) / 255,
36
+ green: CGFloat((token.color >> 16) & 255) / 255,
37
+ blue: CGFloat((token.color >> 8) & 255) / 255,
38
+ alpha: CGFloat(token.color & 255) / 255)
39
+ attributes[.foregroundColor] = color
40
+ attributes[kCTForegroundColorAttributeName as NSAttributedString.Key] = color.cgColor
41
+ let font = original[.font] as? UIFont ?? .systemFont(ofSize: 16)
42
+ var traits = font.fontDescriptor.symbolicTraits
43
+ if token.fontStyle & 1 != 0 { traits.insert(.traitBold) }
44
+ if token.fontStyle & 4 != 0 { traits.insert(.traitItalic) }
45
+ let styled = ViewerFontEnvironment.shared.resolveFont(family: nil, size: font.pointSize, fallback: font, additionalTraits: traits, semanticGeneration: "native-code-highlighting")
46
+ attributes[.font] = styled
47
+ attributes[kCTFontAttributeName as NSAttributedString.Key] = CoreTextProseLayoutEngine.coreTextFont(from: styled)
48
+ if token.fontStyle & 2 != 0 {
49
+ attributes[.underlineStyle] = NSUnderlineStyle.single.rawValue
50
+ attributes[kCTUnderlineStyleAttributeName as NSAttributedString.Key] = NSUnderlineStyle.single.rawValue
51
+ }
52
+ if owned {
53
+ var base: [NSAttributedString.Key: Any] = [:]
54
+ for key in attributes.keys { base[key] = original[key] ?? NSNull() }
55
+ attributes[editorSyntaxOwnedAttribute] = EditorSyntaxOwnedAttributes(base)
56
+ }
57
+ string.addAttributes(attributes, range: piece)
58
+ }
59
+ }
60
+ }
61
+ }
62
+
63
+ extension EditorTextView {
64
+ func restoreCodeHighlighting() {
65
+ guard textStorage.length > 0 else { return }
66
+ let wasApplying = isApplyingRustState
67
+ isApplyingRustState = true
68
+ textStorage.beginEditing()
69
+ textStorage.enumerateAttribute(editorSyntaxOwnedAttribute, in: NSRange(location: 0, length: textStorage.length)) { value, range, _ in
70
+ guard let original = value as? EditorSyntaxOwnedAttributes else { return }
71
+ for (key, value) in original.values {
72
+ if value is NSNull { textStorage.removeAttribute(key, range: range) } else { textStorage.addAttribute(key, value: value, range: range) }
73
+ }
74
+ textStorage.removeAttribute(editorSyntaxOwnedAttribute, range: range)
75
+ }
76
+ textStorage.endEditing()
77
+ isApplyingRustState = wasApplying
78
+ invalidateAutoGrowHeightMeasurement()
79
+ setNeedsLayout()
80
+ setNeedsDisplay()
81
+ }
82
+
83
+ func scheduleCodeHighlighting() {
84
+ codeHighlightingSession.cancel()
85
+ guard let configuration = codeHighlighting else { return }
86
+ do { _ = try NativeCodeHighlightingRegistry.provider(id: configuration.provider) } catch { onCodeHighlightingError?(error); return }
87
+ guard markedTextRange == nil, textStorage.length > 0 else { return }
88
+ restoreCodeHighlighting()
89
+ let text = textStorage.string
90
+ let binding = editorId
91
+ var blocks: [NativeCodeHighlightBlock] = []
92
+ textStorage.enumerateAttribute(editorCodeBlockAttribute, in: NSRange(location: 0, length: textStorage.length)) { value, range, _ in
93
+ guard let presentation = value as? EditorCodeBlockPresentation else { return }
94
+ var range = range
95
+ while range.length > 0, textStorage.attribute(RenderBridgeAttributes.syntheticPlaceholder, at: NSMaxRange(range) - 1, effectiveRange: nil) != nil { range.length -= 1 }
96
+ blocks.append(NativeCodeHighlightBlock(start: range.location, text: (text as NSString).substring(with: range), language: presentation.language))
97
+ }
98
+ guard !blocks.isEmpty else { return }
99
+ do {
100
+ try codeHighlightingSession.update(provider: configuration.provider, theme: configuration.theme, blocks: blocks) { [weak self] result in
101
+ guard let self, self.codeHighlighting == configuration, self.editorId == binding,
102
+ self.markedTextRange == nil, self.textStorage.string == text else { return }
103
+ switch result {
104
+ case let .failure(error): self.onCodeHighlightingError?(error)
105
+ case let .success(output):
106
+ let wasApplying = self.isApplyingRustState
107
+ self.isApplyingRustState = true
108
+ self.textStorage.beginEditing()
109
+ for block in output { NativeCodeHighlightPresentation.apply(block.ranges, to: self.textStorage, offset: block.block.start, owned: true) }
110
+ self.textStorage.endEditing()
111
+ self.isApplyingRustState = wasApplying
112
+ self.invalidateAutoGrowHeightMeasurement()
113
+ self.setNeedsLayout()
114
+ self.setNeedsDisplay()
115
+ }
116
+ }
117
+ } catch { onCodeHighlightingError?(error) }
118
+ }
119
+ }
120
+
121
+ struct PreparedViewerHighlightingRequest {
122
+ let configuration: NativeCodeHighlightConfiguration
123
+ let generation: String
124
+ let blocks: [NativeCodeHighlightBlock]
125
+ var retainedBytes: Int { blocks.reduce(128) { $0 + $1.text.utf16.count * 2 + 64 } }
126
+ }
127
+
128
+ final class PreparedViewerHighlightingResult: NSObject {
129
+ let ranges: [Int: [NativeCodeHighlightRange]]
130
+ init(_ output: [NativeHighlightedCodeBlock]) {
131
+ let count = output.reduce(0) { $0 + $1.ranges.count }
132
+ ranges = count <= 100_000 ? Dictionary(uniqueKeysWithValues: output.map { ($0.block.start, $0.ranges) }) : [:]
133
+ }
134
+ var retainedBytes: Int { ranges.values.reduce(128) { $0 + $1.count * 40 } }
135
+ }
136
+
137
+ enum PreparedViewerHighlightingStore {
138
+ private static let cache: NSCache<NSString, PreparedViewerHighlightingResult> = {
139
+ let cache = NSCache<NSString, PreparedViewerHighlightingResult>()
140
+ cache.countLimit = 32
141
+ cache.totalCostLimit = 4 * 1024 * 1024
142
+ return cache
143
+ }()
144
+ static func result(for generation: String) -> PreparedViewerHighlightingResult? { cache.object(forKey: generation as NSString) }
145
+ static func publish(_ result: PreparedViewerHighlightingResult, generation: String) {
146
+ cache.setObject(result, forKey: generation as NSString, cost: result.retainedBytes)
147
+ }
148
+ }
149
+
150
+ extension PreparedProseDrawingView {
151
+ func scheduleCodeHighlighting() {
152
+ codeHighlightingSession.cancel()
153
+ guard let layout, let request = layout.highlightingRequest, !layout.highlightingResolved else { return }
154
+ if PreparedViewerHighlightingStore.result(for: request.generation) != nil {
155
+ DispatchQueue.main.async { [weak self, weak layout] in
156
+ guard let self, let layout, self.layout === layout else { return }
157
+ self.publishCodeHighlightingResolution(request.generation)
158
+ }
159
+ return
160
+ }
161
+ do {
162
+ try codeHighlightingSession.update(provider: request.configuration.provider, theme: request.configuration.theme, blocks: request.blocks) { [weak self, weak layout] result in
163
+ guard let self, let layout, self.layout === layout else { return }
164
+ switch result {
165
+ case let .success(output):
166
+ PreparedViewerHighlightingStore.publish(PreparedViewerHighlightingResult(output), generation: request.generation)
167
+ self.publishCodeHighlightingResolution(request.generation)
168
+ case let .failure(error): self.reportCodeHighlightingError(error, generation: request.generation)
169
+ }
170
+ }
171
+ } catch { reportCodeHighlightingError(error, generation: request.generation) }
172
+ }
173
+
174
+ private func publishCodeHighlightingResolution(_ generation: String) {
175
+ onCodeHighlightingResolved?(generation)
176
+ NotificationCenter.default.post(name: Self.codeHighlightingDidResolve, object: self, userInfo: ["generation": generation])
177
+ }
178
+
179
+ private func reportCodeHighlightingError(_ error: Error, generation: String) {
180
+ PreparedViewerHighlightingStore.publish(PreparedViewerHighlightingResult([]), generation: generation)
181
+ onCodeHighlightingFailure?(error)
182
+ NotificationCenter.default.post(name: Self.codeHighlightingDidFail, object: self, userInfo: ["generation": generation, "message": error.localizedDescription])
183
+ }
184
+ }
@@ -0,0 +1,44 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>AvailableLibraries</key>
6
+ <array>
7
+ <dict>
8
+ <key>BinaryPath</key>
9
+ <string>libeditor_core.a</string>
10
+ <key>LibraryIdentifier</key>
11
+ <string>ios-arm64</string>
12
+ <key>LibraryPath</key>
13
+ <string>libeditor_core.a</string>
14
+ <key>SupportedArchitectures</key>
15
+ <array>
16
+ <string>arm64</string>
17
+ </array>
18
+ <key>SupportedPlatform</key>
19
+ <string>ios</string>
20
+ </dict>
21
+ <dict>
22
+ <key>BinaryPath</key>
23
+ <string>libeditor_core.a</string>
24
+ <key>LibraryIdentifier</key>
25
+ <string>ios-arm64_x86_64-simulator</string>
26
+ <key>LibraryPath</key>
27
+ <string>libeditor_core.a</string>
28
+ <key>SupportedArchitectures</key>
29
+ <array>
30
+ <string>arm64</string>
31
+ <string>x86_64</string>
32
+ </array>
33
+ <key>SupportedPlatform</key>
34
+ <string>ios</string>
35
+ <key>SupportedPlatformVariant</key>
36
+ <string>simulator</string>
37
+ </dict>
38
+ </array>
39
+ <key>CFBundlePackageType</key>
40
+ <string>XFWK</string>
41
+ <key>XCFrameworkFormatVersion</key>
42
+ <string>1.0</string>
43
+ </dict>
44
+ </plist>