@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,612 @@
1
+ import UIKit
2
+
3
+ final class EditorAccessoryToolbarView: UIInputView {
4
+ private static let baseHeight: CGFloat = 50
5
+ private static let mentionRowHeight: CGFloat = 52
6
+ private static let contentSpacing: CGFloat = 6
7
+ private static let contentHorizontalInset: CGFloat = 12
8
+ private static let defaultHorizontalInset: CGFloat = 0
9
+ private static let defaultKeyboardOffset: CGFloat = 0
10
+ private static let chromeTransitionDuration: TimeInterval = 0.18
11
+ static let nativeDisabledButtonOpacity: CGFloat = 0.46
12
+
13
+ struct ButtonBinding {
14
+ let item: NativeToolbarItem
15
+ let button: UIButton
16
+ let widthConstraint: NSLayoutConstraint
17
+ let heightConstraint: NSLayoutConstraint
18
+ }
19
+
20
+ struct VisibleToolbarItemsByPlacement {
21
+ let start: [NativeToolbarItem]
22
+ let scroll: [NativeToolbarItem]
23
+ let end: [NativeToolbarItem]
24
+ }
25
+
26
+ private let chromeView = UIView()
27
+ private let blurView = UIVisualEffectView(effect: nil)
28
+ private let glassTintView = UIView()
29
+ let bodyStackView = UIStackView()
30
+ let startPinnedStackView = UIStackView()
31
+ private let contentStackView = UIStackView()
32
+ let endPinnedStackView = UIStackView()
33
+ private let mentionScrollView = UIScrollView()
34
+ private let mentionStackView = UIStackView()
35
+ let scrollView = UIScrollView()
36
+ let stackView = UIStackView()
37
+ private var chromeLeadingConstraint: NSLayoutConstraint?
38
+ private var chromeTrailingConstraint: NSLayoutConstraint?
39
+ private var chromeBottomConstraint: NSLayoutConstraint?
40
+ private var mentionRowHeightConstraint: NSLayoutConstraint?
41
+ private var scrollViewHeightConstraint: NSLayoutConstraint?
42
+ var buttonBindings: [ButtonBinding] = []
43
+ var separators: [UIView] = []
44
+ var mentionButtons: [MentionSuggestionChipButton] = []
45
+ var items: [NativeToolbarItem] = NativeToolbarItem.defaults
46
+ var expandedGroupKey: String?
47
+ var currentState = NativeToolbarState.empty
48
+ var theme: EditorToolbarTheme?
49
+ private var mentionTheme: EditorMentionTheme?
50
+ private var didAnimateChromeTransition = false
51
+ var editMenuPresenter: AnyObject?
52
+ var onPressItem: ((NativeToolbarItem) -> Void)?
53
+ var onSelectMentionSuggestion: ((NativeMentionSuggestion) -> Void)?
54
+ var isShowingMentionSuggestions: Bool {
55
+ !mentionButtons.isEmpty && !mentionScrollView.isHidden && scrollView.isHidden
56
+ }
57
+ var usesNativeAppearanceForTesting: Bool {
58
+ resolvedAppearance == .native
59
+ }
60
+ var usesUIGlassEffectForTesting: Bool {
61
+ #if compiler(>=6.2)
62
+ if #available(iOS 26.0, *) {
63
+ return blurView.effect is UIGlassEffect
64
+ }
65
+ #endif
66
+ return false
67
+ }
68
+ var chromeBorderWidthForTesting: CGFloat {
69
+ chromeView.layer.borderWidth
70
+ }
71
+ var nativeChromeIsTransparentForTesting: Bool {
72
+ blurView.isHidden
73
+ && glassTintView.isHidden
74
+ && chromeView.layer.borderWidth == 0
75
+ && chromeView.layer.shadowOpacity == 0
76
+ && (chromeView.backgroundColor ?? .clear) == .clear
77
+ }
78
+ var didAnimateChromeTransitionForTesting: Bool {
79
+ didAnimateChromeTransition
80
+ }
81
+ var startPinnedStackViewFrameForTesting: CGRect {
82
+ startPinnedStackView.frame
83
+ }
84
+ var endPinnedStackViewFrameForTesting: CGRect {
85
+ endPinnedStackView.frame
86
+ }
87
+ var contentStackViewFrameForTesting: CGRect {
88
+ contentStackView.frame
89
+ }
90
+ var nativeToolbarVisibleWidthForTesting: CGFloat {
91
+ scrollView.bounds.width
92
+ }
93
+ var nativeToolbarContentWidthForTesting: CGFloat {
94
+ max(scrollView.contentSize.width, stackView.bounds.width)
95
+ }
96
+ var nativeToolbarContentOffsetXForTesting: CGFloat {
97
+ scrollView.contentOffset.x
98
+ }
99
+ var selectedButtonCountForTesting: Int {
100
+ buttonBindings.filter(\.button.isSelected).count
101
+ }
102
+ var editMenuPresentationRequestCountForTesting: Int {
103
+ guard #available(iOS 16.0, *) else { return 0 }
104
+ return (editMenuPresenter as? ToolbarEditMenuPresenter)?.presentationRequestCount ?? 0
105
+ }
106
+
107
+ override var intrinsicContentSize: CGSize {
108
+ let contentHeight = mentionButtons.isEmpty ? resolvedToolbarHeight : Self.mentionRowHeight
109
+ return CGSize(
110
+ width: UIView.noIntrinsicMetric,
111
+ height: contentHeight + resolvedKeyboardOffset
112
+ )
113
+ }
114
+
115
+ convenience init(frame: CGRect) {
116
+ self.init(frame: frame, inputViewStyle: .keyboard)
117
+ }
118
+
119
+ override init(frame: CGRect, inputViewStyle: UIInputView.Style) {
120
+ super.init(frame: frame, inputViewStyle: inputViewStyle)
121
+ translatesAutoresizingMaskIntoConstraints = false
122
+ autoresizingMask = [.flexibleHeight]
123
+ backgroundColor = .clear
124
+ isOpaque = false
125
+ allowsSelfSizing = true
126
+ setupView()
127
+ if #available(iOS 16.0, *) {
128
+ let presenter = ToolbarEditMenuPresenter()
129
+ editMenuPresenter = presenter
130
+ addInteraction(presenter.interaction)
131
+ }
132
+ rebuildButtons()
133
+ }
134
+
135
+ required init?(coder: NSCoder) {
136
+ return nil
137
+ }
138
+
139
+ func setItems(_ items: [NativeToolbarItem]) {
140
+ self.items = items
141
+ if let expandedGroupKey,
142
+ !items.contains(where: {
143
+ $0.type == .group && $0.key == expandedGroupKey && ($0.presentation ?? .expand) == .expand
144
+ }) {
145
+ self.expandedGroupKey = nil
146
+ }
147
+ rebuildButtons()
148
+ }
149
+ func setItemsJSONForTesting(_ json: String) {
150
+ setItems(NativeToolbarItem.from(json: json))
151
+ }
152
+ func applyStateJSONForTesting(_ json: String) {
153
+ guard let state = NativeToolbarState(updateJSON: json) else { return }
154
+ apply(state: state)
155
+ }
156
+
157
+ func apply(mentionTheme: EditorMentionTheme?) {
158
+ self.mentionTheme = mentionTheme
159
+ for button in mentionButtons {
160
+ button.apply(theme: mentionTheme, toolbarAppearance: resolvedAppearance)
161
+ }
162
+ }
163
+
164
+ func apply(theme: EditorToolbarTheme?) {
165
+ apply(theme: theme, animateChrome: false)
166
+ }
167
+
168
+ func apply(theme: EditorToolbarTheme?, animateChrome: Bool) {
169
+ self.theme = theme
170
+ let usesNativeAppearance = resolvedAppearance == .native
171
+ let usesTransparentMentionChrome = self.usesTransparentMentionChrome
172
+ let targetBlurHidden = usesTransparentMentionChrome || !usesNativeAppearance
173
+ let targetBlurAlpha: CGFloat = usesNativeAppearance && !usesTransparentMentionChrome ? resolvedEffectAlpha : 0
174
+ let targetBlurEffect = usesNativeAppearance && !usesTransparentMentionChrome ? resolvedBlurEffect() : nil
175
+ let targetGlassHidden = usesTransparentMentionChrome || !usesNativeAppearance
176
+ let targetGlassBackground = usesNativeAppearance && !usesTransparentMentionChrome
177
+ ? UIColor.systemBackground.withAlphaComponent(resolvedGlassTintAlpha)
178
+ : .clear
179
+ let targetGlassAlpha: CGFloat = targetGlassHidden ? 0 : 1
180
+ let targetBorderColor = usesTransparentMentionChrome ? UIColor.clear : resolvedBorderColor
181
+ let targetBorderWidth: CGFloat = usesTransparentMentionChrome
182
+ ? 0
183
+ : (usesNativeAppearance
184
+ ? (1 / UIScreen.main.scale)
185
+ : resolvedBorderWidth)
186
+ let targetClipsToBounds =
187
+ !usesTransparentMentionChrome
188
+ && (usesNativeAppearance || resolvedBorderRadius > 0)
189
+ let targetShadowOpacity: Float =
190
+ usesNativeAppearance && !usesTransparentMentionChrome ? 0.08 : 0
191
+ let targetShadowRadius: CGFloat =
192
+ usesNativeAppearance && !usesTransparentMentionChrome ? 10 : 0
193
+
194
+ chromeView.backgroundColor = usesNativeAppearance
195
+ ? .clear
196
+ : (theme?.backgroundColor ?? .systemBackground)
197
+ chromeView.tintColor = usesNativeAppearance
198
+ ? nil
199
+ : (theme?.buttonColor ?? tintColor)
200
+ chromeView.isOpaque = false
201
+ chromeView.layer.cornerRadius = resolvedBorderRadius
202
+ if #available(iOS 13.0, *) {
203
+ chromeView.layer.cornerCurve = .continuous
204
+ }
205
+ #if compiler(>=6.2)
206
+ if #available(iOS 26.0, *) {
207
+ let cornerConfig: UICornerConfiguration = usesNativeAppearance
208
+ ? .capsule(maximumRadius: 24)
209
+ : .uniformCorners(radius: .fixed(Double(resolvedBorderRadius)))
210
+ chromeView.cornerConfiguration = cornerConfig
211
+ blurView.cornerConfiguration = cornerConfig
212
+ glassTintView.cornerConfiguration = cornerConfig
213
+ }
214
+ #endif
215
+ chromeView.layer.shadowOffset = CGSize(width: 0, height: 2)
216
+ chromeView.layer.shadowColor = UIColor.black.cgColor
217
+
218
+ let applyChromeProperties = {
219
+ self.blurView.alpha = targetBlurAlpha
220
+ self.glassTintView.alpha = targetGlassAlpha
221
+ self.chromeView.layer.borderColor = targetBorderColor.cgColor
222
+ self.chromeView.layer.borderWidth = targetBorderWidth
223
+ self.chromeView.layer.shadowOpacity = targetShadowOpacity
224
+ self.chromeView.layer.shadowRadius = targetShadowRadius
225
+ }
226
+ let finishChromeProperties = {
227
+ self.blurView.isHidden = targetBlurHidden
228
+ self.blurView.effect = targetBlurEffect
229
+ self.blurView.alpha = targetBlurAlpha
230
+ self.glassTintView.isHidden = targetGlassHidden
231
+ self.glassTintView.backgroundColor = targetGlassHidden ? .clear : targetGlassBackground
232
+ self.glassTintView.alpha = targetGlassAlpha
233
+ self.chromeView.layer.borderColor = targetBorderColor.cgColor
234
+ self.chromeView.layer.borderWidth = targetBorderWidth
235
+ self.chromeView.layer.shadowOpacity = targetShadowOpacity
236
+ self.chromeView.layer.shadowRadius = targetShadowRadius
237
+ self.chromeView.clipsToBounds = targetClipsToBounds
238
+ }
239
+
240
+ let shouldAnimateChrome = animateChrome && UIView.areAnimationsEnabled && window != nil
241
+ didAnimateChromeTransition = shouldAnimateChrome
242
+ if shouldAnimateChrome {
243
+ let blurWasHidden = blurView.isHidden
244
+ let glassWasHidden = glassTintView.isHidden
245
+ if !targetBlurHidden {
246
+ blurView.effect = targetBlurEffect
247
+ }
248
+ if !targetBlurHidden || !blurWasHidden {
249
+ blurView.isHidden = false
250
+ }
251
+ if blurWasHidden && !targetBlurHidden {
252
+ blurView.alpha = 0
253
+ }
254
+ if !targetGlassHidden {
255
+ glassTintView.backgroundColor = targetGlassBackground
256
+ }
257
+ if !targetGlassHidden || !glassWasHidden {
258
+ glassTintView.isHidden = false
259
+ }
260
+ if glassWasHidden && !targetGlassHidden {
261
+ glassTintView.alpha = 0
262
+ }
263
+ chromeView.clipsToBounds = targetClipsToBounds
264
+ UIView.animate(
265
+ withDuration: Self.chromeTransitionDuration,
266
+ delay: 0,
267
+ options: [.beginFromCurrentState, .allowUserInteraction, .curveEaseOut],
268
+ animations: applyChromeProperties,
269
+ completion: { _ in
270
+ finishChromeProperties()
271
+ }
272
+ )
273
+ } else {
274
+ finishChromeProperties()
275
+ }
276
+
277
+ chromeLeadingConstraint?.constant = resolvedHorizontalInset
278
+ chromeTrailingConstraint?.constant = -resolvedHorizontalInset
279
+ chromeBottomConstraint?.constant = -resolvedKeyboardOffset
280
+ scrollViewHeightConstraint?.constant = resolvedToolbarHeight
281
+ invalidateIntrinsicContentSize()
282
+ for separator in separators {
283
+ separator.backgroundColor = usesNativeAppearance
284
+ ? UIColor.separator.withAlphaComponent(0.45)
285
+ : (theme?.separatorColor ?? .separator)
286
+ }
287
+ for binding in buttonBindings {
288
+ binding.button.layer.cornerRadius = resolvedButtonBorderRadius(for: binding.item)
289
+ binding.widthConstraint.constant = resolvedButtonSize
290
+ binding.heightConstraint.constant = resolvedButtonSize
291
+ }
292
+ for button in mentionButtons {
293
+ button.apply(theme: mentionTheme, toolbarAppearance: resolvedAppearance)
294
+ }
295
+ apply(state: currentState)
296
+ }
297
+
298
+ @discardableResult
299
+ func setMentionSuggestions(
300
+ _ suggestions: [NativeMentionSuggestion],
301
+ trigger: String = "@"
302
+ ) -> Bool {
303
+ let hadSuggestions = !mentionButtons.isEmpty
304
+ var existingButtonsByKey: [String: MentionSuggestionChipButton] = [:]
305
+ for button in mentionButtons where existingButtonsByKey[button.suggestion.key] == nil {
306
+ existingButtonsByKey[button.suggestion.key] = button
307
+ }
308
+ let nextButtons = suggestions.prefix(8).map { suggestion in
309
+ if let button = existingButtonsByKey.removeValue(forKey: suggestion.key) {
310
+ button.update(suggestion: suggestion, trigger: trigger)
311
+ return button
312
+ }
313
+ let button = MentionSuggestionChipButton(
314
+ suggestion: suggestion,
315
+ trigger: trigger,
316
+ theme: mentionTheme,
317
+ toolbarAppearance: resolvedAppearance
318
+ )
319
+ button.addTarget(self, action: #selector(handleSelectMentionSuggestion(_:)), for: .touchUpInside)
320
+ return button
321
+ }
322
+
323
+ for button in mentionButtons where !nextButtons.contains(where: { $0 === button }) {
324
+ mentionStackView.removeArrangedSubview(button)
325
+ button.removeFromSuperview()
326
+ }
327
+ for (index, button) in nextButtons.enumerated() {
328
+ if mentionStackView.arrangedSubviews.indices.contains(index),
329
+ mentionStackView.arrangedSubviews[index] === button {
330
+ continue
331
+ }
332
+ if mentionStackView.arrangedSubviews.contains(where: { $0 === button }) {
333
+ mentionStackView.removeArrangedSubview(button)
334
+ }
335
+ mentionStackView.insertArrangedSubview(button, at: index)
336
+ }
337
+ mentionButtons = nextButtons
338
+
339
+ let hasSuggestions = !mentionButtons.isEmpty
340
+ mentionScrollView.isHidden = !hasSuggestions
341
+ scrollView.isHidden = hasSuggestions
342
+ mentionRowHeightConstraint?.constant = hasSuggestions ? Self.mentionRowHeight : 0
343
+ apply(theme: theme, animateChrome: hadSuggestions != hasSuggestions)
344
+ invalidateIntrinsicContentSize()
345
+ setNeedsLayout()
346
+ return hadSuggestions != hasSuggestions
347
+ }
348
+
349
+ func apply(state: NativeToolbarState) {
350
+ currentState = state
351
+ for binding in buttonBindings {
352
+ let buttonState = buttonState(for: binding.item, state: state)
353
+ binding.button.isEnabled = buttonState.enabled
354
+ binding.button.isSelected = buttonState.active
355
+ binding.button.accessibilityTraits = buttonState.active ? [.button, .selected] : .button
356
+ updateButtonAppearance(binding.button, item: binding.item, enabled: buttonState.enabled, active: buttonState.active)
357
+ }
358
+ if #available(iOS 16.0, *) {
359
+ (editMenuPresenter as? ToolbarEditMenuPresenter)?.reloadVisibleMenu()
360
+ }
361
+ }
362
+
363
+ var firstButtonAlphaForTesting: CGFloat {
364
+ buttonBindings.first?.button.alpha ?? 0
365
+ }
366
+ var firstButtonTintColorForTesting: UIColor? {
367
+ buttonBindings.first?.button.tintColor
368
+ }
369
+ var firstButtonTintAdjustmentModeForTesting: UIView.TintAdjustmentMode {
370
+ buttonBindings.first?.button.tintAdjustmentMode ?? .automatic
371
+ }
372
+
373
+ private func setupView() {
374
+ chromeView.translatesAutoresizingMaskIntoConstraints = false
375
+ chromeView.backgroundColor = .systemBackground
376
+ chromeView.layer.borderColor = UIColor.separator.cgColor
377
+ chromeView.layer.borderWidth = 0.5
378
+ chromeView.isOpaque = false
379
+ addSubview(chromeView)
380
+
381
+ blurView.translatesAutoresizingMaskIntoConstraints = false
382
+ blurView.isHidden = true
383
+ blurView.isUserInteractionEnabled = false
384
+ blurView.clipsToBounds = true
385
+ chromeView.addSubview(blurView)
386
+
387
+ glassTintView.translatesAutoresizingMaskIntoConstraints = false
388
+ glassTintView.isHidden = true
389
+ glassTintView.isUserInteractionEnabled = false
390
+ chromeView.addSubview(glassTintView)
391
+
392
+ bodyStackView.translatesAutoresizingMaskIntoConstraints = false
393
+ bodyStackView.axis = .horizontal
394
+ bodyStackView.alignment = .fill
395
+ bodyStackView.spacing = 0
396
+ chromeView.addSubview(bodyStackView)
397
+
398
+ startPinnedStackView.translatesAutoresizingMaskIntoConstraints = false
399
+ startPinnedStackView.axis = .horizontal
400
+ startPinnedStackView.alignment = .center
401
+ startPinnedStackView.spacing = 6
402
+ startPinnedStackView.directionalLayoutMargins = NSDirectionalEdgeInsets(
403
+ top: 0,
404
+ leading: Self.contentHorizontalInset,
405
+ bottom: 0,
406
+ trailing: 0
407
+ )
408
+ startPinnedStackView.isLayoutMarginsRelativeArrangement = true
409
+ startPinnedStackView.setContentHuggingPriority(.required, for: .horizontal)
410
+ startPinnedStackView.setContentCompressionResistancePriority(.required, for: .horizontal)
411
+ bodyStackView.addArrangedSubview(startPinnedStackView)
412
+
413
+ // contentStackView occupies the middle arranged-subview slot between the pinned
414
+ // start/end stacks. Arranged subviews are laid out side-by-side by construction,
415
+ // so the pinned items never overlap the scrolling middle.
416
+ contentStackView.translatesAutoresizingMaskIntoConstraints = false
417
+ contentStackView.axis = .vertical
418
+ contentStackView.spacing = 0
419
+ contentStackView.setContentHuggingPriority(.defaultLow, for: .horizontal)
420
+ contentStackView.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
421
+ bodyStackView.addArrangedSubview(contentStackView)
422
+
423
+ endPinnedStackView.translatesAutoresizingMaskIntoConstraints = false
424
+ endPinnedStackView.axis = .horizontal
425
+ endPinnedStackView.alignment = .center
426
+ endPinnedStackView.spacing = 6
427
+ endPinnedStackView.directionalLayoutMargins = NSDirectionalEdgeInsets(
428
+ top: 0,
429
+ leading: 0,
430
+ bottom: 0,
431
+ trailing: Self.contentHorizontalInset
432
+ )
433
+ endPinnedStackView.isLayoutMarginsRelativeArrangement = true
434
+ endPinnedStackView.setContentHuggingPriority(.required, for: .horizontal)
435
+ endPinnedStackView.setContentCompressionResistancePriority(.required, for: .horizontal)
436
+ bodyStackView.addArrangedSubview(endPinnedStackView)
437
+
438
+ mentionScrollView.translatesAutoresizingMaskIntoConstraints = false
439
+ mentionScrollView.showsHorizontalScrollIndicator = false
440
+ mentionScrollView.alwaysBounceHorizontal = true
441
+ mentionScrollView.isHidden = true
442
+ contentStackView.addArrangedSubview(mentionScrollView)
443
+
444
+ mentionStackView.translatesAutoresizingMaskIntoConstraints = false
445
+ mentionStackView.axis = .horizontal
446
+ mentionStackView.alignment = .fill
447
+ mentionStackView.spacing = 8
448
+ mentionScrollView.addSubview(mentionStackView)
449
+
450
+ scrollView.translatesAutoresizingMaskIntoConstraints = false
451
+ scrollView.showsHorizontalScrollIndicator = false
452
+ scrollView.alwaysBounceHorizontal = true
453
+ contentStackView.addArrangedSubview(scrollView)
454
+
455
+ stackView.translatesAutoresizingMaskIntoConstraints = false
456
+ stackView.axis = .horizontal
457
+ stackView.alignment = .center
458
+ stackView.spacing = 6
459
+ scrollView.addSubview(stackView)
460
+
461
+ let leading = chromeView.leadingAnchor.constraint(
462
+ equalTo: leadingAnchor,
463
+ constant: Self.defaultHorizontalInset
464
+ )
465
+ let trailing = chromeView.trailingAnchor.constraint(
466
+ equalTo: trailingAnchor,
467
+ constant: -Self.defaultHorizontalInset
468
+ )
469
+ let bottom = chromeView.bottomAnchor.constraint(
470
+ equalTo: safeAreaLayoutGuide.bottomAnchor,
471
+ constant: -Self.defaultKeyboardOffset
472
+ )
473
+ chromeLeadingConstraint = leading
474
+ chromeTrailingConstraint = trailing
475
+ chromeBottomConstraint = bottom
476
+ let mentionHeight = mentionScrollView.heightAnchor.constraint(equalToConstant: 0)
477
+ mentionRowHeightConstraint = mentionHeight
478
+ let scrollViewHeight = scrollView.heightAnchor.constraint(equalToConstant: resolvedToolbarHeight)
479
+ scrollViewHeightConstraint = scrollViewHeight
480
+
481
+ NSLayoutConstraint.activate([
482
+ chromeView.topAnchor.constraint(equalTo: topAnchor),
483
+ leading,
484
+ trailing,
485
+ bottom,
486
+
487
+ blurView.topAnchor.constraint(equalTo: chromeView.topAnchor),
488
+ blurView.leadingAnchor.constraint(equalTo: chromeView.leadingAnchor),
489
+ blurView.trailingAnchor.constraint(equalTo: chromeView.trailingAnchor),
490
+ blurView.bottomAnchor.constraint(equalTo: chromeView.bottomAnchor),
491
+
492
+ glassTintView.topAnchor.constraint(equalTo: chromeView.topAnchor),
493
+ glassTintView.leadingAnchor.constraint(equalTo: chromeView.leadingAnchor),
494
+ glassTintView.trailingAnchor.constraint(equalTo: chromeView.trailingAnchor),
495
+ glassTintView.bottomAnchor.constraint(equalTo: chromeView.bottomAnchor),
496
+
497
+ bodyStackView.topAnchor.constraint(equalTo: chromeView.topAnchor, constant: 6),
498
+ bodyStackView.leadingAnchor.constraint(equalTo: chromeView.leadingAnchor),
499
+ bodyStackView.trailingAnchor.constraint(equalTo: chromeView.trailingAnchor),
500
+ bodyStackView.bottomAnchor.constraint(equalTo: chromeView.safeAreaLayoutGuide.bottomAnchor, constant: -6),
501
+
502
+ mentionHeight,
503
+
504
+ mentionStackView.topAnchor.constraint(equalTo: mentionScrollView.contentLayoutGuide.topAnchor),
505
+ mentionStackView.leadingAnchor.constraint(
506
+ equalTo: mentionScrollView.contentLayoutGuide.leadingAnchor,
507
+ constant: Self.contentHorizontalInset
508
+ ),
509
+ mentionStackView.trailingAnchor.constraint(
510
+ equalTo: mentionScrollView.contentLayoutGuide.trailingAnchor,
511
+ constant: -Self.contentHorizontalInset
512
+ ),
513
+ mentionStackView.bottomAnchor.constraint(equalTo: mentionScrollView.contentLayoutGuide.bottomAnchor),
514
+ mentionStackView.heightAnchor.constraint(equalTo: mentionScrollView.frameLayoutGuide.heightAnchor),
515
+
516
+ stackView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor, constant: 6),
517
+ stackView.leadingAnchor.constraint(
518
+ equalTo: scrollView.contentLayoutGuide.leadingAnchor,
519
+ constant: Self.contentHorizontalInset
520
+ ),
521
+ stackView.trailingAnchor.constraint(
522
+ equalTo: scrollView.contentLayoutGuide.trailingAnchor,
523
+ constant: -Self.contentHorizontalInset
524
+ ),
525
+ stackView.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor, constant: -6),
526
+ stackView.heightAnchor.constraint(equalTo: scrollView.frameLayoutGuide.heightAnchor, constant: -12),
527
+ scrollViewHeight
528
+ ])
529
+
530
+ }
531
+
532
+ var resolvedAppearance: EditorToolbarAppearance {
533
+ theme?.appearance ?? .custom
534
+ }
535
+
536
+ private var resolvedHorizontalInset: CGFloat {
537
+ theme?.resolvedHorizontalInset ?? Self.defaultHorizontalInset
538
+ }
539
+
540
+ private var resolvedKeyboardOffset: CGFloat {
541
+ theme?.resolvedKeyboardOffset ?? Self.defaultKeyboardOffset
542
+ }
543
+
544
+ private var resolvedBorderRadius: CGFloat {
545
+ theme?.resolvedBorderRadius ?? 0
546
+ }
547
+
548
+ private var resolvedBorderWidth: CGFloat {
549
+ theme?.resolvedBorderWidth ?? 0.5
550
+ }
551
+
552
+ private var resolvedToolbarHeight: CGFloat {
553
+ max(theme?.height ?? Self.baseHeight, 1)
554
+ }
555
+
556
+ var resolvedButtonSize: CGFloat {
557
+ if theme?.height == nil {
558
+ return 36
559
+ }
560
+ return max(1, min(40, resolvedToolbarHeight - 4))
561
+ }
562
+
563
+ var resolvedButtonBorderRadius: CGFloat {
564
+ theme?.resolvedButtonBorderRadius ?? 8
565
+ }
566
+
567
+ private var usesTransparentMentionChrome: Bool {
568
+ guard resolvedAppearance == .native, !mentionButtons.isEmpty else { return false }
569
+ #if compiler(>=6.2)
570
+ if #available(iOS 26.0, *) {
571
+ return true
572
+ }
573
+ #endif
574
+ return false
575
+ }
576
+
577
+ private var resolvedEffectAlpha: CGFloat {
578
+ if #available(iOS 26.0, *), resolvedAppearance == .native {
579
+ return 1
580
+ }
581
+ return resolvedAppearance == .native ? 0.72 : 1
582
+ }
583
+
584
+ private var resolvedGlassTintAlpha: CGFloat {
585
+ if #available(iOS 26.0, *), resolvedAppearance == .native {
586
+ return 0
587
+ }
588
+ return resolvedAppearance == .native ? 0.12 : 0
589
+ }
590
+
591
+ var resolvedGlassEffectTintColor: UIColor {
592
+ return .clear
593
+ }
594
+
595
+ private var resolvedBorderColor: UIColor {
596
+ if resolvedAppearance != .native {
597
+ return theme?.borderColor ?? UIColor.separator
598
+ }
599
+ if #available(iOS 26.0, *) {
600
+ return .clear
601
+ }
602
+ return UIColor.separator.withAlphaComponent(0.22)
603
+ }
604
+
605
+ @objc private func handleSelectMentionSuggestion(_ sender: MentionSuggestionChipButton) {
606
+ onSelectMentionSuggestion?(sender.suggestion)
607
+ }
608
+
609
+ }
610
+
611
+ /// Keeps iOS keyboard integrations on the inputAccessoryView path when the
612
+ /// visible toolbar is rendered outside the native keyboard accessory.