@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 os
2
+ import UIKit
3
+
4
+ extension EditorTextView {
5
+ @objc
6
+ func handleImageAttachmentDidLoad(_ notification: Notification) {
7
+ guard let attachment = notification.object as? NSTextAttachment else { return }
8
+ guard textStorage.length > 0 else { return }
9
+ var ownsAttachment = false
10
+ textStorage.enumerateAttribute(
11
+ .attachment,
12
+ in: NSRange(location: 0, length: textStorage.length),
13
+ options: [.longestEffectiveRangeNotRequired]
14
+ ) { value, _, stop in
15
+ guard let candidate = value as? NSTextAttachment,
16
+ candidate === attachment
17
+ else {
18
+ return
19
+ }
20
+ ownsAttachment = true
21
+ stop.pointee = true
22
+ }
23
+ guard ownsAttachment else { return }
24
+
25
+ textStorage.beginEditing()
26
+ textStorage.edited(.editedAttributes, range: NSRange(location: 0, length: textStorage.length), changeInLength: 0)
27
+ textStorage.endEditing()
28
+ invalidateAutoGrowHeightMeasurement()
29
+ setNeedsLayout()
30
+ invalidateIntrinsicContentSize()
31
+ onSelectionOrContentMayChange?()
32
+ }
33
+
34
+ @objc
35
+ func handleImageSelectionTap(_ gesture: UITapGestureRecognizer) {
36
+ guard gesture.state == .ended, gesture.numberOfTouches == 1 else { return }
37
+ let location = gesture.location(in: self)
38
+ guard let range = imageAttachmentRange(at: location) else { return }
39
+ scheduleDeferredImageSelection(for: range)
40
+ _ = selectImageAttachment(range: range)
41
+ }
42
+
43
+ @discardableResult
44
+ func selectImageAttachmentIfNeeded(at location: CGPoint) -> Bool {
45
+ guard let range = imageAttachmentRange(at: location) else { return false }
46
+ scheduleDeferredImageSelection(for: range)
47
+ return selectImageAttachment(range: range)
48
+ }
49
+
50
+ @discardableResult
51
+ func selectImageAttachment(at location: CGPoint) -> Bool {
52
+ selectImageAttachmentIfNeeded(at: location)
53
+ }
54
+
55
+ func hasImageAttachment(at location: CGPoint) -> Bool {
56
+ imageAttachmentRange(at: location) != nil
57
+ }
58
+
59
+ func hasTaskListMarker(at location: CGPoint) -> Bool {
60
+ taskListMarkerParagraphStart(at: location) != nil
61
+ }
62
+
63
+ @discardableResult
64
+ func toggleTaskListMarker(at location: CGPoint) -> Bool {
65
+ guard editorId != 0 else { return false }
66
+ guard finishExternalTextCompositionBeforeInteractionIfNeeded() else { return false }
67
+ guard prepareForExternalEditorUpdate() else { return false }
68
+ guard let paragraphStart = taskListMarkerParagraphStart(at: location) else {
69
+ return false
70
+ }
71
+
72
+ let scalar = PositionBridge.utf16OffsetToScalar(paragraphStart, in: self)
73
+ performInterceptedInput {
74
+ toggleTaskItemCheckedAtSelectionScalarInRust(anchor: scalar, head: scalar)
75
+ }
76
+ return true
77
+ }
78
+
79
+ @discardableResult
80
+ private func selectImageAttachment(range: NSRange) -> Bool {
81
+ guard finishExternalTextCompositionBeforeInteractionIfNeeded() else { return false }
82
+ guard isSelectable,
83
+ let start = position(from: beginningOfDocument, offset: range.location),
84
+ let end = position(from: start, offset: range.length),
85
+ let textRange = textRange(from: start, to: end)
86
+ else {
87
+ return false
88
+ }
89
+
90
+ _ = becomeFirstResponder()
91
+ selectedTextRange = textRange
92
+ noteSelectionDidChange()
93
+ refreshNativeSelectionChromeVisibility()
94
+ onSelectionOrContentMayChange?()
95
+ scheduleSelectionSync()
96
+ return true
97
+ }
98
+
99
+ private func scheduleDeferredImageSelection(for range: NSRange) {
100
+ pendingDeferredImageSelectionRange = range
101
+ pendingDeferredImageSelectionGeneration &+= 1
102
+ let generation = pendingDeferredImageSelectionGeneration
103
+ DispatchQueue.main.async { [weak self] in
104
+ self?.applyDeferredImageSelectionIfNeeded(generation: generation)
105
+ }
106
+ }
107
+
108
+ private func applyDeferredImageSelectionIfNeeded(generation: UInt64) {
109
+ guard pendingDeferredImageSelectionGeneration == generation,
110
+ let pendingRange = pendingDeferredImageSelectionRange
111
+ else {
112
+ return
113
+ }
114
+ pendingDeferredImageSelectionRange = nil
115
+ guard selectedUtf16Range() != pendingRange else { return }
116
+ _ = selectImageAttachment(range: pendingRange)
117
+ }
118
+
119
+ func installImageSelectionTapDependencies() {
120
+ for view in gestureDependencyViews(startingAt: self) {
121
+ guard let recognizers = view.gestureRecognizers else { continue }
122
+ for recognizer in recognizers {
123
+ guard recognizer !== imageSelectionTapRecognizer,
124
+ let tapRecognizer = recognizer as? UITapGestureRecognizer
125
+ else {
126
+ continue
127
+ }
128
+ tapRecognizer.require(toFail: imageSelectionTapRecognizer)
129
+ }
130
+ }
131
+ }
132
+
133
+ private func gestureDependencyViews(startingAt rootView: UIView) -> [UIView] {
134
+ var views: [UIView] = [rootView]
135
+ for subview in rootView.subviews {
136
+ views.append(contentsOf: gestureDependencyViews(startingAt: subview))
137
+ }
138
+ return views
139
+ }
140
+
141
+ func imageAttachmentRange(at location: CGPoint) -> NSRange? {
142
+ guard allowImageResizing else { return nil }
143
+ guard textStorage.length > 0 else { return nil }
144
+
145
+ let fullRange = NSRange(location: 0, length: textStorage.length)
146
+ var resolvedRange: NSRange?
147
+
148
+ textStorage.enumerateAttribute(
149
+ .attachment,
150
+ in: fullRange,
151
+ options: [.longestEffectiveRangeNotRequired]
152
+ ) { value, range, stop in
153
+ guard value is NSTextAttachment, range.length > 0 else { return }
154
+
155
+ let attrs = textStorage.attributes(at: range.location, effectiveRange: nil)
156
+ guard (attrs[RenderBridgeAttributes.voidNodeType] as? String) == "image" else { return }
157
+
158
+ let glyphRange = layoutManager.glyphRange(
159
+ forCharacterRange: range,
160
+ actualCharacterRange: nil
161
+ )
162
+ guard glyphRange.length > 0 else { return }
163
+
164
+ var rect = layoutManager.boundingRect(forGlyphRange: glyphRange, in: textContainer)
165
+ rect.origin.x += textContainerInset.left
166
+ rect.origin.y += textContainerInset.top
167
+
168
+ if rect.insetBy(dx: -8, dy: -8).contains(location) {
169
+ resolvedRange = range
170
+ stop.pointee = true
171
+ }
172
+ }
173
+
174
+ return resolvedRange
175
+ }
176
+
177
+ func atomAttachmentRange(at location: CGPoint) -> NSRange? {
178
+ guard textStorage.length > 0 else { return nil }
179
+ var resolvedRange: NSRange?
180
+ textStorage.enumerateAttribute(
181
+ .attachment,
182
+ in: NSRange(location: 0, length: textStorage.length),
183
+ options: [.longestEffectiveRangeNotRequired]
184
+ ) { value, range, stop in
185
+ guard value is AtomBlockAttachment, range.length > 0 else { return }
186
+ let glyphRange = layoutManager.glyphRange(
187
+ forCharacterRange: range,
188
+ actualCharacterRange: nil
189
+ )
190
+ guard glyphRange.length > 0 else { return }
191
+ var rect = layoutManager.boundingRect(forGlyphRange: glyphRange, in: textContainer)
192
+ rect.origin.x += textContainerInset.left - contentOffset.x
193
+ rect.origin.y += textContainerInset.top - contentOffset.y
194
+ if rect.contains(location) {
195
+ resolvedRange = range
196
+ stop.pointee = true
197
+ }
198
+ }
199
+ return resolvedRange
200
+ }
201
+
202
+ func taskListMarkerParagraphStart(at location: CGPoint) -> Int? {
203
+ guard let layoutManager = layoutManager as? EditorLayoutManager else { return nil }
204
+ // Incoming points already include the scroll view's bounds origin.
205
+ let origin = CGPoint(
206
+ x: textContainerInset.left,
207
+ y: textContainerInset.top
208
+ )
209
+ return layoutManager.taskListMarkerParagraphStart(
210
+ at: location,
211
+ in: textStorage,
212
+ textContainerOrigin: origin
213
+ )
214
+ }
215
+
216
+ func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
217
+ if gestureRecognizer === caretPlacementTapRecognizer {
218
+ return touch.tapCount == 1 && canPlaceCaret(at: touch.location(in: self))
219
+ }
220
+ guard gestureRecognizer === imageSelectionTapRecognizer,
221
+ touch.tapCount == 1
222
+ else {
223
+ return true
224
+ }
225
+
226
+ return imageAttachmentRange(at: touch.location(in: self)) != nil
227
+ }
228
+
229
+ func gestureRecognizer(
230
+ _ gestureRecognizer: UIGestureRecognizer,
231
+ shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer
232
+ ) -> Bool {
233
+ (gestureRecognizer === caretPlacementTapRecognizer || otherGestureRecognizer === caretPlacementTapRecognizer)
234
+ && gestureRecognizer !== imageSelectionTapRecognizer
235
+ && otherGestureRecognizer !== imageSelectionTapRecognizer
236
+ }
237
+
238
+ func gestureRecognizer(
239
+ _ gestureRecognizer: UIGestureRecognizer,
240
+ shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer
241
+ ) -> Bool {
242
+ false
243
+ }
244
+
245
+ func gestureRecognizer(
246
+ _ gestureRecognizer: UIGestureRecognizer,
247
+ shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer
248
+ ) -> Bool {
249
+ false
250
+ }
251
+
252
+ func selectedImageSelectionState() -> (docPos: UInt32, utf16Offset: Int)? {
253
+ guard allowImageResizing else { return nil }
254
+ guard isFirstResponder else { return nil }
255
+ guard let selectedRange = selectedUtf16Range(),
256
+ selectedRange.length == 1,
257
+ selectedRange.location >= 0,
258
+ selectedRange.location < textStorage.length
259
+ else {
260
+ return nil
261
+ }
262
+
263
+ let attrs = textStorage.attributes(at: selectedRange.location, effectiveRange: nil)
264
+ guard (attrs[RenderBridgeAttributes.voidNodeType] as? String) == "image",
265
+ attrs[.attachment] is NSTextAttachment
266
+ else {
267
+ return nil
268
+ }
269
+
270
+ let docPos = v2ExactUInt32(attrs[RenderBridgeAttributes.docPos] as? NSNumber)
271
+ ?? (attrs[RenderBridgeAttributes.docPos] as? UInt32)
272
+ guard let docPos else { return nil }
273
+ return (docPos, selectedRange.location)
274
+ }
275
+
276
+ func selectedImageGeometry() -> (docPos: UInt32, rect: CGRect)? {
277
+ guard let selectionState = selectedImageSelectionState() else { return nil }
278
+
279
+ let glyphRange = layoutManager.glyphRange(
280
+ forCharacterRange: NSRange(location: selectionState.utf16Offset, length: 1),
281
+ actualCharacterRange: nil
282
+ )
283
+ guard glyphRange.length > 0 else { return nil }
284
+
285
+ var rect = layoutManager.boundingRect(forGlyphRange: glyphRange, in: textContainer)
286
+ rect.origin.x += textContainerInset.left
287
+ rect.origin.y += textContainerInset.top
288
+ guard rect.width > 0, rect.height > 0 else { return nil }
289
+ return (selectionState.docPos, rect)
290
+ }
291
+
292
+ private func blockImageAttachment(docPos: UInt32) -> (range: NSRange, attachment: BlockImageAttachment)? {
293
+ let fullRange = NSRange(location: 0, length: textStorage.length)
294
+ var resolved: (range: NSRange, attachment: BlockImageAttachment)?
295
+ textStorage.enumerateAttribute(
296
+ .attachment,
297
+ in: fullRange,
298
+ options: [.longestEffectiveRangeNotRequired]
299
+ ) { value, range, stop in
300
+ guard let attachment = value as? BlockImageAttachment, range.length > 0 else { return }
301
+ let attrs = textStorage.attributes(at: range.location, effectiveRange: nil)
302
+ guard (attrs[RenderBridgeAttributes.voidNodeType] as? String) == "image" else { return }
303
+ let attributeDocPos = v2ExactUInt32(attrs[RenderBridgeAttributes.docPos] as? NSNumber)
304
+ ?? (attrs[RenderBridgeAttributes.docPos] as? UInt32)
305
+ guard attributeDocPos == docPos else { return }
306
+ resolved = (range, attachment)
307
+ stop.pointee = true
308
+ }
309
+ return resolved
310
+ }
311
+
312
+ func imagePreviewForDocPos(_ docPos: UInt32) -> UIImage? {
313
+ blockImageAttachment(docPos: docPos)?.attachment.previewImage()
314
+ }
315
+
316
+ func maximumRenderableImageWidth() -> CGFloat {
317
+ let containerWidth: CGFloat
318
+ if bounds.width > 0 {
319
+ containerWidth = bounds.width - textContainerInset.left - textContainerInset.right
320
+ } else {
321
+ containerWidth = textContainer.size.width
322
+ }
323
+ let linePadding = textContainer.lineFragmentPadding * 2
324
+ return max(48, containerWidth - linePadding)
325
+ }
326
+
327
+ func resizeImageAtDocPos(_ docPos: UInt32, width: UInt32, height: UInt32) {
328
+ guard editorId != 0 else { return }
329
+ performInterceptedInput {
330
+ let updateJSON = EditorV2Shadow.resizeImageAtDocPos(
331
+ id: editorId,
332
+ docPos: docPos,
333
+ width: width,
334
+ height: height
335
+ )
336
+ applyUpdateJSON(updateJSON)
337
+ }
338
+ }
339
+
340
+ func previewResizeImageAtDocPos(_ docPos: UInt32, width: CGFloat, height: CGFloat) {
341
+ guard let attachmentState = blockImageAttachment(docPos: docPos) else { return }
342
+ attachmentState.attachment.setPreferredSize(width: width, height: height)
343
+ layoutManager.invalidateLayout(forCharacterRange: attachmentState.range, actualCharacterRange: nil)
344
+ layoutManager.invalidateDisplay(forCharacterRange: attachmentState.range)
345
+ textStorage.beginEditing()
346
+ textStorage.edited(.editedAttributes, range: attachmentState.range, changeInLength: 0)
347
+ textStorage.endEditing()
348
+ }
349
+
350
+ func setImageResizePreviewActive(_ active: Bool) {
351
+ isPreviewingImageResize = active
352
+ }
353
+
354
+ }
@@ -0,0 +1,200 @@
1
+ import os
2
+ import UIKit
3
+
4
+ extension EditorTextView {
5
+ struct InputTraitState {
6
+ var autoCapitalize: String?
7
+ var autoCorrect: Bool?
8
+ var keyboardType: String?
9
+ }
10
+
11
+ struct PendingInputTraitChange {
12
+ var hasAutoCapitalize = false
13
+ var autoCapitalize: String?
14
+ var hasAutoCorrect = false
15
+ var autoCorrect: Bool?
16
+ var hasKeyboardType = false
17
+ var keyboardType: String?
18
+
19
+ var isEmpty: Bool {
20
+ !hasAutoCapitalize && !hasAutoCorrect && !hasKeyboardType
21
+ }
22
+ }
23
+
24
+ func setAutoCapitalize(_ autoCapitalize: String?) {
25
+ desiredInputTraitState.autoCapitalize = autoCapitalize
26
+ guard prepareForInputTraitChange() else {
27
+ pendingInputTraitChange.hasAutoCapitalize = true
28
+ pendingInputTraitChange.autoCapitalize = autoCapitalize
29
+ scheduleInputTraitChangeRetry()
30
+ return
31
+ }
32
+ applyAutoCapitalize(autoCapitalize)
33
+ appliedInputTraitState.autoCapitalize = autoCapitalize
34
+ clearPendingAutoCapitalize()
35
+ }
36
+
37
+ private func applyAutoCapitalize(_ autoCapitalize: String?) {
38
+ switch autoCapitalize {
39
+ case "none":
40
+ autocapitalizationType = .none
41
+ case "words":
42
+ autocapitalizationType = .words
43
+ case "characters":
44
+ autocapitalizationType = .allCharacters
45
+ default:
46
+ autocapitalizationType = .sentences
47
+ }
48
+ if isFirstResponder {
49
+ reloadInputViews()
50
+ }
51
+ }
52
+
53
+ func setAutoCorrect(_ autoCorrect: Bool?) {
54
+ desiredInputTraitState.autoCorrect = autoCorrect
55
+ guard prepareForInputTraitChange() else {
56
+ pendingInputTraitChange.hasAutoCorrect = true
57
+ pendingInputTraitChange.autoCorrect = autoCorrect
58
+ scheduleInputTraitChangeRetry()
59
+ return
60
+ }
61
+ applyAutoCorrect(autoCorrect)
62
+ appliedInputTraitState.autoCorrect = autoCorrect
63
+ clearPendingAutoCorrect()
64
+ }
65
+
66
+ private func applyAutoCorrect(_ autoCorrect: Bool?) {
67
+ let isEnabled = autoCorrect ?? false
68
+ autocorrectionType = isEnabled ? .yes : .no
69
+ spellCheckingType = isEnabled ? .default : .no
70
+ if isFirstResponder {
71
+ reloadInputViews()
72
+ }
73
+ }
74
+
75
+ func setKeyboardType(_ keyboardType: String?) {
76
+ desiredInputTraitState.keyboardType = keyboardType
77
+ guard prepareForInputTraitChange() else {
78
+ pendingInputTraitChange.hasKeyboardType = true
79
+ pendingInputTraitChange.keyboardType = keyboardType
80
+ scheduleInputTraitChangeRetry()
81
+ return
82
+ }
83
+ applyKeyboardType(keyboardType)
84
+ appliedInputTraitState.keyboardType = keyboardType
85
+ clearPendingKeyboardType()
86
+ }
87
+
88
+ private func applyKeyboardType(_ keyboardType: String?) {
89
+ self.keyboardType = Self.resolvedKeyboardType(from: keyboardType)
90
+ if isFirstResponder {
91
+ reloadInputViews()
92
+ }
93
+ }
94
+
95
+ private func prepareForInputTraitChange() -> Bool {
96
+ guard isFirstResponder, editorId != 0 else { return true }
97
+ return prepareForExternalEditorUpdate()
98
+ }
99
+
100
+ private func scheduleInputTraitChangeRetry() {
101
+ guard !pendingInputTraitRetryScheduled else { return }
102
+ pendingInputTraitRetryScheduled = true
103
+ pendingInputTraitRetryGeneration &+= 1
104
+ let retryGeneration = pendingInputTraitRetryGeneration
105
+ DispatchQueue.main.async { [weak self] in
106
+ guard let self else { return }
107
+ guard retryGeneration == self.pendingInputTraitRetryGeneration else { return }
108
+ self.pendingInputTraitRetryScheduled = false
109
+ let pending = self.pendingInputTraitChange
110
+ self.pendingInputTraitChange = PendingInputTraitChange()
111
+ if pending.hasAutoCapitalize,
112
+ pending.autoCapitalize == self.desiredInputTraitState.autoCapitalize {
113
+ self.setAutoCapitalize(pending.autoCapitalize)
114
+ }
115
+ if pending.hasAutoCorrect,
116
+ pending.autoCorrect == self.desiredInputTraitState.autoCorrect {
117
+ self.setAutoCorrect(pending.autoCorrect)
118
+ }
119
+ if pending.hasKeyboardType,
120
+ pending.keyboardType == self.desiredInputTraitState.keyboardType {
121
+ self.setKeyboardType(pending.keyboardType)
122
+ }
123
+ }
124
+ }
125
+
126
+ private func clearPendingAutoCapitalize() {
127
+ pendingInputTraitChange.hasAutoCapitalize = false
128
+ pendingInputTraitChange.autoCapitalize = nil
129
+ cancelPendingInputTraitRetryIfEmpty()
130
+ }
131
+
132
+ private func clearPendingAutoCorrect() {
133
+ pendingInputTraitChange.hasAutoCorrect = false
134
+ pendingInputTraitChange.autoCorrect = nil
135
+ cancelPendingInputTraitRetryIfEmpty()
136
+ }
137
+
138
+ private func clearPendingKeyboardType() {
139
+ pendingInputTraitChange.hasKeyboardType = false
140
+ pendingInputTraitChange.keyboardType = nil
141
+ cancelPendingInputTraitRetryIfEmpty()
142
+ }
143
+
144
+ func clearPendingInputTraitRetry() {
145
+ pendingInputTraitChange = PendingInputTraitChange()
146
+ guard pendingInputTraitRetryScheduled else { return }
147
+ pendingInputTraitRetryScheduled = false
148
+ pendingInputTraitRetryGeneration &+= 1
149
+ }
150
+
151
+ private func cancelPendingInputTraitRetryIfEmpty() {
152
+ guard pendingInputTraitRetryScheduled, pendingInputTraitChange.isEmpty else { return }
153
+ pendingInputTraitRetryScheduled = false
154
+ pendingInputTraitRetryGeneration &+= 1
155
+ }
156
+
157
+ func replayDesiredInputTraitsIfNeeded() {
158
+ if desiredInputTraitState.autoCapitalize != appliedInputTraitState.autoCapitalize {
159
+ setAutoCapitalize(desiredInputTraitState.autoCapitalize)
160
+ }
161
+ if desiredInputTraitState.autoCorrect != appliedInputTraitState.autoCorrect {
162
+ setAutoCorrect(desiredInputTraitState.autoCorrect)
163
+ }
164
+ if desiredInputTraitState.keyboardType != appliedInputTraitState.keyboardType {
165
+ setKeyboardType(desiredInputTraitState.keyboardType)
166
+ }
167
+ }
168
+
169
+ private static func resolvedKeyboardType(from keyboardType: String?) -> UIKeyboardType {
170
+ switch keyboardType {
171
+ case "ascii-capable":
172
+ return .asciiCapable
173
+ case "numbers-and-punctuation":
174
+ return .numbersAndPunctuation
175
+ case "url":
176
+ return .URL
177
+ case "number-pad":
178
+ return .numberPad
179
+ case "phone-pad":
180
+ return .phonePad
181
+ case "name-phone-pad":
182
+ return .namePhonePad
183
+ case "email-address":
184
+ return .emailAddress
185
+ case "decimal-pad", "numeric":
186
+ return .decimalPad
187
+ case "twitter":
188
+ return .twitter
189
+ case "web-search":
190
+ return .webSearch
191
+ case "ascii-capable-number-pad":
192
+ return .asciiCapableNumberPad
193
+ case "visible-password":
194
+ return .asciiCapable
195
+ default:
196
+ return .default
197
+ }
198
+ }
199
+
200
+ }