react-native-enriched-markdown-scaffold 0.7.4-scaffold.8 → 1.0.2-scaffold.1

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 (469) hide show
  1. package/README.md +54 -8
  2. package/ReactNativeEnrichedMarkdown.podspec +82 -73
  3. package/android/build.gradle +191 -1
  4. package/android/consumer-rules.pro +1 -1
  5. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerDelegate.java +9 -0
  6. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerInterface.java +3 -0
  7. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerDelegate.java +27 -0
  8. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerInterface.java +9 -0
  9. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerDelegate.java +9 -0
  10. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +3 -0
  11. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +75 -0
  12. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +63 -0
  13. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +40 -0
  14. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +839 -23
  15. package/android/src/main/baseline-prof.txt +1 -1
  16. package/android/src/main/cpp/jni-adapter.cpp +74 -0
  17. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt +175 -11
  18. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownInternalText.kt +17 -0
  19. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownManager.kt +50 -0
  20. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +48 -1
  21. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextLayoutManager.kt +10 -1
  22. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextManager.kt +42 -0
  23. package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +82 -4
  24. package/android/src/main/java/com/swmansion/enriched/markdown/events/CopyPressEvent.kt +24 -0
  25. package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputManager.kt +62 -4
  26. package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt +911 -460
  27. package/android/src/main/java/com/swmansion/enriched/markdown/input/MarkdownClipboard.kt +42 -0
  28. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/BlockEditCoordinator.kt +196 -0
  29. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/ClipboardCoordinator.kt +73 -0
  30. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditContext.kt +19 -0
  31. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditPipeline.kt +248 -0
  32. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditSession.kt +52 -0
  33. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/InputConnectionWrapper.kt +101 -7
  34. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/LinkCoordinator.kt +69 -0
  35. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownTextWatcher.kt +3 -3
  36. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MentionCoordinator.kt +118 -0
  37. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnChangeStateEvent.kt +26 -0
  38. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnContextMenuItemPressEvent.kt +26 -0
  39. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnInputKeyPressEvent.kt +24 -0
  40. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnPasteEvent.kt +24 -0
  41. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/BlockStore.kt +254 -0
  42. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/BlockSyntaxSentinel.kt +69 -0
  43. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/FormattingStore.kt +80 -87
  44. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputFormatter.kt +109 -1
  45. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputParser.kt +180 -27
  46. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/MarkdownSerializer.kt +167 -38
  47. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/RangeEditAdjustment.kt +149 -0
  48. package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputEventEmitter.kt +66 -5
  49. package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputMeasurementStore.kt +7 -2
  50. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockRange.kt +27 -0
  51. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockType.kt +48 -0
  52. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/FormattingRange.kt +9 -4
  53. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/InputFormatterStyle.kt +39 -2
  54. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathAtom.kt +20 -0
  55. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathChipStyle.kt +1 -1
  56. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MutableRangeBounds.kt +11 -0
  57. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputBulletSpan.kt +82 -0
  58. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputHeadingSpan.kt +58 -0
  59. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputListItemSpacingSpan.kt +37 -0
  60. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputOrderedListMarkerSpan.kt +63 -0
  61. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/BlockHandler.kt +54 -0
  62. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/HeadingBlockHandler.kt +27 -0
  63. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/OrderedListBlockHandler.kt +38 -0
  64. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/UnorderedListBlockHandler.kt +37 -0
  65. package/android/src/main/java/com/swmansion/enriched/markdown/input/toolbar/InputContextMenu.kt +8 -26
  66. package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +1 -0
  67. package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +1 -0
  68. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt +9 -2
  69. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +100 -12
  70. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +16 -1
  71. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +4 -0
  72. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt +2 -1
  73. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +74 -18
  74. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +43 -4
  75. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +9 -1
  76. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SoftBreakRenderer.kt +16 -0
  77. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +30 -27
  78. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BaseListSpan.kt +24 -0
  79. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BlockquoteSpan.kt +174 -24
  80. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBackgroundSpan.kt +27 -3
  81. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBlockSpan.kt +13 -16
  82. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeSpan.kt +1 -1
  83. package/android/src/main/java/com/swmansion/enriched/markdown/spans/EmphasisSpan.kt +1 -1
  84. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +182 -46
  85. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListItemSpacingSpan.kt +33 -0
  86. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListMarkerAnchorSpan.kt +38 -0
  87. package/android/src/main/java/com/swmansion/enriched/markdown/spans/OrderedListSpan.kt +2 -0
  88. package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrongSpan.kt +1 -1
  89. package/android/src/main/java/com/swmansion/enriched/markdown/spans/TaskListSpan.kt +3 -2
  90. package/android/src/main/java/com/swmansion/enriched/markdown/spans/UnorderedListSpan.kt +3 -2
  91. package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +6 -0
  92. package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +26 -0
  93. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +7 -1
  94. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +4 -1
  95. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +13 -4
  96. package/android/src/main/java/com/swmansion/enriched/markdown/styles/TableStyle.kt +6 -0
  97. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockHighlighter.kt +90 -0
  98. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockNode.kt +57 -0
  99. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/FeatureFlags.kt +1 -0
  100. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownSegment.kt +9 -0
  101. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownViewManagerUtils.kt +33 -7
  102. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/ReadableMapExtensions.kt +3 -0
  103. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/RenderedSegment.kt +10 -0
  104. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/SegmentSignature.kt +1 -0
  105. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/StreamingMarkdownFilter.kt +83 -5
  106. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/serialization/MarkdownASTSerializer.kt +4 -0
  107. package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/MarkdownStyleParser.kt +74 -44
  108. package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/PasteTextUtils.kt +20 -0
  109. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageCache.kt +26 -3
  110. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageDownloader.kt +22 -9
  111. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/LocalImageLoader.kt +161 -0
  112. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/extensions/TextPaintExtensions.kt +23 -0
  113. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/CheckboxTouchHelper.kt +7 -0
  114. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/TaskListTapUtils.kt +41 -21
  115. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/span/BlockSpacing.kt +15 -8
  116. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkLongPressMovementMethod.kt +58 -27
  117. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionActionMode.kt +19 -2
  118. package/android/src/main/java/com/swmansion/enriched/markdown/views/CodeBlockContainerView.kt +388 -0
  119. package/android/src/main/java/com/swmansion/enriched/markdown/views/ContextMenuPopup.kt +9 -6
  120. package/android/src/main/java/com/swmansion/enriched/markdown/views/CopyGlyph.kt +101 -0
  121. package/android/src/main/java/com/swmansion/enriched/markdown/views/TableContainerView.kt +32 -5
  122. package/android/src/main/jni/CMakeLists.txt +53 -0
  123. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.cpp +10 -0
  124. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.h +11 -2
  125. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +10 -0
  126. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +12 -2
  127. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.cpp +9 -0
  128. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.h +24 -0
  129. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +16 -0
  130. package/android/src/math/java/com/swmansion/enriched/markdown/input/math/MathChipControllerImpl.kt +21 -4
  131. package/android/src/math/java/com/swmansion/enriched/markdown/renderer/MathInlineRenderer.kt +7 -2
  132. package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathChipSpan.kt +1 -1
  133. package/android/src/math/java/com/swmansion/enriched/markdown/views/MathContainerView.kt +2 -0
  134. package/cpp/highlight/CodeBlockHighlighter.cpp +284 -0
  135. package/cpp/highlight/CodeBlockHighlighter.hpp +66 -0
  136. package/cpp/highlight/CodeBlockLanguages.cpp +138 -0
  137. package/cpp/highlight/CodeBlockLanguages.hpp +25 -0
  138. package/cpp/highlight/HighlightGrammars.hpp +28 -0
  139. package/cpp/highlight/code_highlight_podspec.rb +211 -0
  140. package/cpp/highlight/gen-registry.mjs +155 -0
  141. package/cpp/highlight/grammar-versions.json +159 -0
  142. package/cpp/highlight/vendor/generated/generated_queries.h +1665 -0
  143. package/cpp/highlight/vendor/generated/generated_registry.cpp +59 -0
  144. package/cpp/parser/MD4CParser.cpp +173 -61
  145. package/cpp/parser/MD4CParser.hpp +1 -0
  146. package/cpp/parser/MarkdownASTNode.hpp +2 -1
  147. package/cpp/wasm/ASTSerializer.cpp +2 -0
  148. package/cpp/wasm/build.sh +1 -0
  149. package/cpp/wasm/md4c_wasm.cpp +3 -1
  150. package/docs/ACCESSIBILITY.md +14 -2
  151. package/docs/API_REFERENCE.md +231 -8
  152. package/docs/BREAKING_CHANGES.md +129 -0
  153. package/docs/CODE_HIGHLIGHT.md +133 -0
  154. package/docs/COPY_OPTIONS.md +21 -3
  155. package/docs/ELEMENTS_STRUCTURE.md +52 -4
  156. package/docs/IMAGE_CACHING.md +30 -0
  157. package/docs/INPUT.md +146 -5
  158. package/docs/LATEX_MATH.md +87 -45
  159. package/docs/MACOS.md +1 -1
  160. package/docs/MARKDOWN_STREAMING.md +27 -1
  161. package/docs/NATIVE_ASSETS.md +127 -0
  162. package/docs/RTL.md +1 -1
  163. package/docs/STYLES.md +46 -6
  164. package/docs/TESTING.md +112 -0
  165. package/docs/TEXT.md +16 -6
  166. package/docs/WEB.md +3 -1
  167. package/ios/EnrichedMarkdown.h +7 -0
  168. package/ios/EnrichedMarkdown.mm +262 -67
  169. package/ios/EnrichedMarkdownText.h +7 -0
  170. package/ios/EnrichedMarkdownText.mm +97 -68
  171. package/ios/attachments/ENRMImageAttachment.h +9 -0
  172. package/ios/attachments/ENRMImageAttachment.m +143 -40
  173. package/ios/attachments/ENRMMathInlineAttachment.h +2 -0
  174. package/ios/attachments/ENRMMathInlineAttachment.m +48 -81
  175. package/ios/attachments/ENRMMathInlineAttachmentShared.h +2 -0
  176. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.cpp +75 -0
  177. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.h +63 -0
  178. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.cpp +40 -0
  179. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +839 -23
  180. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +131 -0
  181. package/ios/input/ENRMAutoLinkDetector.h +2 -1
  182. package/ios/input/ENRMAutoLinkDetector.mm +79 -41
  183. package/ios/input/ENRMBlockEditCoordinator.h +71 -0
  184. package/ios/input/ENRMBlockEditCoordinator.mm +195 -0
  185. package/ios/input/ENRMBlockRange.h +28 -0
  186. package/ios/input/ENRMBlockRange.mm +30 -0
  187. package/ios/input/ENRMBlockStore.h +56 -0
  188. package/ios/input/ENRMBlockStore.mm +275 -0
  189. package/ios/input/ENRMBlockSyntaxSentinel.h +25 -0
  190. package/ios/input/ENRMBlockSyntaxSentinel.mm +80 -0
  191. package/ios/input/ENRMClipboardCoordinator.h +45 -0
  192. package/ios/input/ENRMClipboardCoordinator.mm +120 -0
  193. package/ios/input/ENRMDetectorPipeline.h +2 -1
  194. package/ios/input/ENRMEditPipeline.h +76 -0
  195. package/ios/input/ENRMEditPipeline.mm +228 -0
  196. package/ios/input/ENRMEditSession.h +36 -0
  197. package/ios/input/ENRMEditSession.mm +63 -0
  198. package/ios/input/ENRMFormattingStore.h +17 -0
  199. package/ios/input/ENRMFormattingStore.mm +95 -105
  200. package/ios/input/ENRMInputBlockType.h +91 -0
  201. package/ios/input/ENRMInputBlockType.mm +5 -0
  202. package/ios/input/ENRMInputDecorationDrawer.h +18 -0
  203. package/ios/input/ENRMInputEventEmitter.h +56 -0
  204. package/ios/input/ENRMInputEventEmitter.mm +308 -0
  205. package/ios/input/ENRMInputFormatter.h +29 -69
  206. package/ios/input/ENRMInputFormatter.mm +216 -124
  207. package/ios/input/ENRMInputFormatterStyle.h +99 -0
  208. package/ios/input/ENRMInputFormatterStyle.mm +188 -0
  209. package/ios/input/ENRMInputLayoutManager.h +9 -0
  210. package/ios/input/ENRMInputLayoutManager.mm +30 -0
  211. package/ios/input/ENRMInputListMarkerDrawer.h +32 -0
  212. package/ios/input/ENRMInputListMarkerDrawer.mm +426 -0
  213. package/ios/input/ENRMInputParser.h +10 -6
  214. package/ios/input/ENRMInputParser.mm +527 -171
  215. package/ios/input/ENRMInputRemend.mm +2 -2
  216. package/ios/input/ENRMInputStyleStateBuilder.h +40 -0
  217. package/ios/input/ENRMInputStyleStateBuilder.mm +60 -0
  218. package/ios/input/ENRMInputTextView.mm +103 -8
  219. package/ios/input/ENRMInputTypingAttributesController.h +42 -0
  220. package/ios/input/ENRMInputTypingAttributesController.mm +203 -0
  221. package/ios/input/ENRMLinkCoordinator.h +41 -0
  222. package/ios/input/ENRMLinkCoordinator.mm +89 -0
  223. package/ios/input/ENRMMarkdownSerializer.h +29 -5
  224. package/ios/input/ENRMMarkdownSerializer.mm +170 -48
  225. package/ios/input/ENRMMathAtom.h +26 -0
  226. package/ios/input/ENRMMathAtom.mm +12 -0
  227. package/ios/input/ENRMMentionCoordinator.h +45 -0
  228. package/ios/input/ENRMMentionCoordinator.mm +167 -0
  229. package/ios/input/ENRMRangeEditAdjustment.h +38 -0
  230. package/ios/input/ENRMRangeEditAdjustment.mm +91 -0
  231. package/ios/input/ENRMRangeStoreUtils.h +39 -0
  232. package/ios/input/EnrichedMarkdownTextInput+ContextMenu.mm +6 -6
  233. package/ios/input/EnrichedMarkdownTextInput+Internal.h +11 -3
  234. package/ios/input/EnrichedMarkdownTextInput.h +7 -1
  235. package/ios/input/EnrichedMarkdownTextInput.mm +1104 -1024
  236. package/ios/input/InputStylePropsUtils.h +109 -68
  237. package/ios/input/internals/EnrichedMarkdownTextInputShadowNode.mm +2 -1
  238. package/ios/input/styles/ENRMBlockHandler.h +46 -0
  239. package/ios/input/styles/ENRMHeadingBlockHandler.h +15 -0
  240. package/ios/input/styles/ENRMHeadingBlockHandler.mm +38 -0
  241. package/ios/input/styles/ENRMOrderedListBlockHandler.h +14 -0
  242. package/ios/input/styles/ENRMOrderedListBlockHandler.mm +48 -0
  243. package/ios/input/styles/ENRMUnorderedListBlockHandler.h +15 -0
  244. package/ios/input/styles/ENRMUnorderedListBlockHandler.mm +51 -0
  245. package/ios/internals/ENRMViewFreeMeasurement.h +331 -0
  246. package/ios/internals/EnrichedMarkdownShadowNode.h +1 -3
  247. package/ios/internals/EnrichedMarkdownShadowNode.mm +16 -20
  248. package/ios/internals/EnrichedMarkdownTextShadowNode.h +1 -3
  249. package/ios/internals/EnrichedMarkdownTextShadowNode.mm +15 -20
  250. package/ios/internals/MeasurementCache.h +33 -7
  251. package/ios/internals/ShadowMeasurementUtils.h +63 -58
  252. package/ios/math/ENRMMathChipController.h +74 -0
  253. package/ios/math/ENRMMathChipController.mm +476 -0
  254. package/ios/math/ENRMRaTeXBridge.swift +4 -1
  255. package/ios/parser/ENRMMarkdownParser.h +1 -8
  256. package/ios/parser/ENRMMarkdownParser.mm +2 -11
  257. package/ios/parser/MarkdownASTNode.h +2 -1
  258. package/ios/parser/MarkdownParserBridge.mm +4 -0
  259. package/ios/renderer/AttributedRenderer.m +20 -2
  260. package/ios/renderer/BaseRenderer.h +17 -2
  261. package/ios/renderer/BaseRenderer.m +30 -0
  262. package/ios/renderer/BlockquoteRenderer.h +1 -1
  263. package/ios/renderer/BlockquoteRenderer.m +144 -35
  264. package/ios/renderer/CodeBlockRenderer.h +1 -1
  265. package/ios/renderer/CodeBlockRenderer.m +27 -23
  266. package/ios/renderer/CodeRenderer.h +1 -1
  267. package/ios/renderer/CodeRenderer.m +3 -1
  268. package/ios/renderer/ENRMImageRenderer.h +1 -1
  269. package/ios/renderer/ENRMImageRenderer.m +5 -1
  270. package/ios/renderer/ENRMMathInlineRenderer.h +1 -1
  271. package/ios/renderer/ENRMMathInlineRenderer.m +5 -1
  272. package/ios/renderer/ENRMSpoilerRenderer.h +1 -1
  273. package/ios/renderer/ENRMSpoilerRenderer.m +3 -1
  274. package/ios/renderer/EmphasisRenderer.h +1 -1
  275. package/ios/renderer/EmphasisRenderer.m +3 -1
  276. package/ios/renderer/HeadingRenderer.h +1 -1
  277. package/ios/renderer/HeadingRenderer.m +13 -6
  278. package/ios/renderer/HighlightRenderer.h +1 -1
  279. package/ios/renderer/HighlightRenderer.m +3 -1
  280. package/ios/renderer/LinkRenderer.h +1 -1
  281. package/ios/renderer/LinkRenderer.m +3 -1
  282. package/ios/renderer/ListItemRenderer.h +13 -1
  283. package/ios/renderer/ListItemRenderer.m +102 -44
  284. package/ios/renderer/ListRenderer.h +2 -2
  285. package/ios/renderer/ListRenderer.m +63 -25
  286. package/ios/renderer/ParagraphRenderer.h +1 -1
  287. package/ios/renderer/ParagraphRenderer.m +16 -8
  288. package/ios/renderer/RenderContext.h +10 -0
  289. package/ios/renderer/RenderContext.m +44 -0
  290. package/ios/renderer/RendererFactory.m +14 -0
  291. package/ios/renderer/StrikethroughRenderer.h +1 -1
  292. package/ios/renderer/StrikethroughRenderer.m +3 -1
  293. package/ios/renderer/StrongRenderer.h +1 -1
  294. package/ios/renderer/StrongRenderer.m +3 -1
  295. package/ios/renderer/SubscriptRenderer.h +1 -1
  296. package/ios/renderer/SubscriptRenderer.m +3 -1
  297. package/ios/renderer/SuperscriptRenderer.h +1 -1
  298. package/ios/renderer/SuperscriptRenderer.m +3 -1
  299. package/ios/renderer/TextRenderer.h +2 -2
  300. package/ios/renderer/TextRenderer.m +3 -1
  301. package/ios/renderer/ThematicBreakRenderer.h +1 -1
  302. package/ios/renderer/ThematicBreakRenderer.m +3 -1
  303. package/ios/renderer/UnderlineRenderer.h +1 -1
  304. package/ios/renderer/UnderlineRenderer.m +3 -1
  305. package/ios/styles/StyleConfig.h +22 -0
  306. package/ios/styles/StyleConfig.mm +132 -0
  307. package/ios/utils/BlockquoteBorder.h +6 -0
  308. package/ios/utils/BlockquoteBorder.m +249 -52
  309. package/ios/utils/CodeBlockBackground.m +16 -2
  310. package/ios/utils/ENRMAtomicSize.h +65 -0
  311. package/ios/utils/ENRMCodeBlockContent.h +37 -0
  312. package/ios/utils/ENRMCodeBlockContent.mm +79 -0
  313. package/ios/utils/ENRMCodeBlockHighlighter.h +37 -0
  314. package/ios/utils/ENRMCodeBlockHighlighter.mm +51 -0
  315. package/ios/utils/ENRMFeatureFlags.h +7 -0
  316. package/ios/utils/ENRMImageDownloader.h +11 -1
  317. package/ios/utils/ENRMImageDownloader.m +60 -16
  318. package/ios/utils/ENRMLocalImageLoader.h +31 -0
  319. package/ios/utils/ENRMLocalImageLoader.m +68 -0
  320. package/ios/utils/ENRMMathFallback.h +26 -0
  321. package/ios/utils/ENRMMathFallback.m +18 -0
  322. package/ios/utils/ENRMTextViewSetup.h +35 -17
  323. package/ios/utils/EditMenuUtils.m +22 -1
  324. package/ios/utils/ImageRequestHeaderUtils.h +35 -0
  325. package/ios/utils/LastElementUtils.h +1 -0
  326. package/ios/utils/ListMarkerDrawer.m +29 -42
  327. package/ios/utils/MarkdownASTSerializer.m +4 -0
  328. package/ios/utils/ParagraphStyleUtils.h +5 -0
  329. package/ios/utils/ParagraphStyleUtils.m +77 -17
  330. package/ios/utils/RenderedMarkdownSegment.h +13 -1
  331. package/ios/utils/RenderedMarkdownSegment.m +20 -0
  332. package/ios/utils/SegmentRenderer.m +17 -4
  333. package/ios/utils/StreamingMarkdownFilter.h +11 -1
  334. package/ios/utils/StreamingMarkdownFilter.m +98 -2
  335. package/ios/utils/StylePropsUtils.h +63 -0
  336. package/ios/utils/TaskListTapUtils.m +24 -0
  337. package/ios/views/ENRMCodeBlockContainerView.h +46 -0
  338. package/ios/views/ENRMCodeBlockContainerView.m +566 -0
  339. package/ios/views/ENRMMathContainerView.h +12 -0
  340. package/ios/views/ENRMMathContainerView.m +71 -1
  341. package/ios/views/TableContainerView.h +18 -0
  342. package/ios/views/TableContainerView.m +259 -159
  343. package/jest.d.ts +1 -0
  344. package/jest.js +5 -0
  345. package/lib/module/EnrichedMarkdownNativeComponent.ts +65 -0
  346. package/lib/module/EnrichedMarkdownTextInput.js +86 -5
  347. package/lib/module/EnrichedMarkdownTextInput.js.map +1 -1
  348. package/lib/module/EnrichedMarkdownTextInputNativeComponent.ts +89 -5
  349. package/lib/module/EnrichedMarkdownTextNativeComponent.ts +66 -0
  350. package/lib/module/headingDefaults.js +34 -0
  351. package/lib/module/headingDefaults.js.map +1 -0
  352. package/lib/module/index.js.map +1 -1
  353. package/lib/module/jest/index.js +191 -0
  354. package/lib/module/jest/index.js.map +1 -0
  355. package/lib/module/native/EnrichedMarkdownText.js +30 -4
  356. package/lib/module/native/EnrichedMarkdownText.js.map +1 -1
  357. package/lib/module/normalizeMarkdownStyle.js +81 -19
  358. package/lib/module/normalizeMarkdownStyle.js.map +1 -1
  359. package/lib/module/normalizeMarkdownStyle.web.js +56 -18
  360. package/lib/module/normalizeMarkdownStyle.web.js.map +1 -1
  361. package/lib/module/normalizeMarkdownTextInputStyle.js +62 -15
  362. package/lib/module/normalizeMarkdownTextInputStyle.js.map +1 -1
  363. package/lib/module/normalizeMenuItem.js +1 -1
  364. package/lib/module/utils/textInputState.js +26 -0
  365. package/lib/module/utils/textInputState.js.map +1 -0
  366. package/lib/module/web/EnrichedMarkdownText.js +9 -5
  367. package/lib/module/web/EnrichedMarkdownText.js.map +1 -1
  368. package/lib/module/web/parseMarkdown.js +4 -3
  369. package/lib/module/web/parseMarkdown.js.map +1 -1
  370. package/lib/module/web/renderers/InlineRenderers.js +6 -0
  371. package/lib/module/web/renderers/InlineRenderers.js.map +1 -1
  372. package/lib/module/web/renderers/ListRenderers.js +7 -2
  373. package/lib/module/web/renderers/ListRenderers.js.map +1 -1
  374. package/lib/module/web/renderers/index.js +7 -4
  375. package/lib/module/web/renderers/index.js.map +1 -1
  376. package/lib/module/web/styles.js +83 -6
  377. package/lib/module/web/styles.js.map +1 -1
  378. package/lib/module/web/utils.js +1 -0
  379. package/lib/module/web/utils.js.map +1 -1
  380. package/lib/module/web/wasm/md4c.js +0 -0
  381. package/lib/module/web/wasm/md4c.js.map +1 -1
  382. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts +62 -0
  383. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts.map +1 -1
  384. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts +95 -9
  385. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts.map +1 -1
  386. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts +80 -5
  387. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts.map +1 -1
  388. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +62 -0
  389. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -1
  390. package/lib/typescript/src/headingDefaults.d.ts +9 -0
  391. package/lib/typescript/src/headingDefaults.d.ts.map +1 -0
  392. package/lib/typescript/src/index.d.ts +2 -2
  393. package/lib/typescript/src/index.d.ts.map +1 -1
  394. package/lib/typescript/src/index.web.d.ts +1 -1
  395. package/lib/typescript/src/index.web.d.ts.map +1 -1
  396. package/lib/typescript/src/jest/index.d.ts +6 -0
  397. package/lib/typescript/src/jest/index.d.ts.map +1 -0
  398. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts +3 -3
  399. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts.map +1 -1
  400. package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -1
  401. package/lib/typescript/src/normalizeMarkdownStyle.web.d.ts.map +1 -1
  402. package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts +19 -5
  403. package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts.map +1 -1
  404. package/lib/typescript/src/types/MarkdownStyle.d.ts +72 -0
  405. package/lib/typescript/src/types/MarkdownStyle.d.ts.map +1 -1
  406. package/lib/typescript/src/types/MarkdownStyleInternal.d.ts +27 -0
  407. package/lib/typescript/src/types/MarkdownStyleInternal.d.ts.map +1 -1
  408. package/lib/typescript/src/types/MarkdownTextProps.d.ts +65 -1
  409. package/lib/typescript/src/types/MarkdownTextProps.d.ts.map +1 -1
  410. package/lib/typescript/src/types/MarkdownTextProps.web.d.ts +19 -0
  411. package/lib/typescript/src/types/MarkdownTextProps.web.d.ts.map +1 -1
  412. package/lib/typescript/src/types/events.d.ts +19 -0
  413. package/lib/typescript/src/types/events.d.ts.map +1 -1
  414. package/lib/typescript/src/utils/textInputState.d.ts +24 -0
  415. package/lib/typescript/src/utils/textInputState.d.ts.map +1 -0
  416. package/lib/typescript/src/web/EnrichedMarkdownText.d.ts +1 -1
  417. package/lib/typescript/src/web/EnrichedMarkdownText.d.ts.map +1 -1
  418. package/lib/typescript/src/web/parseMarkdown.d.ts +1 -1
  419. package/lib/typescript/src/web/parseMarkdown.d.ts.map +1 -1
  420. package/lib/typescript/src/web/renderers/InlineRenderers.d.ts.map +1 -1
  421. package/lib/typescript/src/web/renderers/ListRenderers.d.ts.map +1 -1
  422. package/lib/typescript/src/web/renderers/index.d.ts +2 -1
  423. package/lib/typescript/src/web/renderers/index.d.ts.map +1 -1
  424. package/lib/typescript/src/web/styles.d.ts +2 -1
  425. package/lib/typescript/src/web/styles.d.ts.map +1 -1
  426. package/lib/typescript/src/web/types.d.ts +6 -2
  427. package/lib/typescript/src/web/types.d.ts.map +1 -1
  428. package/lib/typescript/src/web/utils.d.ts.map +1 -1
  429. package/package.json +36 -9
  430. package/postinstall.mjs +131 -0
  431. package/ratex-version.json +21 -0
  432. package/src/EnrichedMarkdownNativeComponent.ts +65 -0
  433. package/src/EnrichedMarkdownTextInput.tsx +162 -8
  434. package/src/EnrichedMarkdownTextInputNativeComponent.ts +89 -5
  435. package/src/EnrichedMarkdownTextNativeComponent.ts +66 -0
  436. package/src/headingDefaults.ts +21 -0
  437. package/src/index.tsx +9 -0
  438. package/src/index.web.tsx +1 -0
  439. package/src/jest/index.tsx +215 -0
  440. package/src/native/EnrichedMarkdownText.tsx +40 -2
  441. package/src/normalizeMarkdownStyle.ts +102 -16
  442. package/src/normalizeMarkdownStyle.web.ts +63 -15
  443. package/src/normalizeMarkdownTextInputStyle.ts +110 -35
  444. package/src/normalizeMenuItem.ts +1 -1
  445. package/src/types/MarkdownStyle.ts +74 -0
  446. package/src/types/MarkdownStyleInternal.ts +39 -0
  447. package/src/types/MarkdownTextProps.ts +65 -0
  448. package/src/types/MarkdownTextProps.web.ts +19 -0
  449. package/src/types/events.ts +21 -0
  450. package/src/utils/textInputState.ts +35 -0
  451. package/src/web/EnrichedMarkdownText.tsx +16 -2
  452. package/src/web/parseMarkdown.ts +6 -2
  453. package/src/web/renderers/InlineRenderers.tsx +5 -0
  454. package/src/web/renderers/ListRenderers.tsx +14 -2
  455. package/src/web/renderers/index.tsx +6 -2
  456. package/src/web/styles.ts +89 -5
  457. package/src/web/types.ts +6 -1
  458. package/src/web/utils.ts +1 -0
  459. package/src/web/wasm/md4c.js +0 -0
  460. package/vendor-grammars.mjs +511 -0
  461. package/vendor-ratex.mjs +173 -0
  462. package/app.plugin.js +0 -2
  463. package/plugin/build/withAndroidMath.js +0 -19
  464. package/plugin/build/withIosMath.js +0 -28
  465. package/plugin/build/withReactNativeEnrichedMarkdown.js +0 -11
  466. package/plugin/src/withAndroidMath.ts +0 -24
  467. package/plugin/src/withIosMath.ts +0 -35
  468. package/plugin/src/withReactNativeEnrichedMarkdown.ts +0 -17
  469. package/plugin/tsconfig.build.json +0 -16
@@ -2,6 +2,7 @@ import {
2
2
  useCallback,
3
3
  useEffect,
4
4
  useImperativeHandle,
5
+ useLayoutEffect,
5
6
  useMemo,
6
7
  useRef,
7
8
  } from 'react';
@@ -13,6 +14,7 @@ import EnrichedMarkdownTextInputNativeComponent, {
13
14
  type OnChangeMarkdownEvent,
14
15
  type OnChangeSelectionEvent,
15
16
  type OnChangeStateEvent,
17
+ type OnKeyPressEvent,
16
18
  type OnRequestMarkdownResultEvent,
17
19
  type OnRequestCaretRectResultEvent,
18
20
  type OnCaretRectChangeEvent,
@@ -24,6 +26,7 @@ import EnrichedMarkdownTextInputNativeComponent, {
24
26
  type OnEndMentionEvent,
25
27
  } from './EnrichedMarkdownTextInputNativeComponent';
26
28
  export type {
29
+ OnKeyPressEvent,
27
30
  OnLinkDetected,
28
31
  OnStartMentionEvent,
29
32
  OnChangeMentionEvent,
@@ -37,9 +40,11 @@ import type {
37
40
  TextStyle,
38
41
  ColorValue,
39
42
  } from 'react-native';
43
+ import type { OnPasteEvent } from './types/events';
40
44
  import { normalizeMarkdownTextInputStyle } from './normalizeMarkdownTextInputStyle';
41
45
  import { normalizeMenuItem } from './normalizeMenuItem';
42
46
  import { toNativeRegexConfig } from './utils/regexParser';
47
+ import { TextInputState } from './utils/textInputState';
43
48
  import type { RefObject } from 'react';
44
49
 
45
50
  type NativeRef = HostInstance;
@@ -50,7 +55,12 @@ export interface LinkStyle {
50
55
  backgroundColor?: string;
51
56
  }
52
57
 
53
- export interface MathStyle {
58
+ /**
59
+ * Chip style for inline math (`$...$`) in the editor. Mirrors the read-only
60
+ * renderer's `markdownStyle.inlineMath`, which shares `color`; the remaining
61
+ * fields are the chip's own box and have no counterpart there.
62
+ */
63
+ export interface InputInlineMathStyle {
54
64
  color?: string;
55
65
  fontSize?: number;
56
66
  backgroundColor?: string;
@@ -64,10 +74,36 @@ export interface MathStyle {
64
74
  fontWeight?: 'bold' | 'normal';
65
75
  }
66
76
 
67
- export interface MathBlockStyle extends MathStyle {
77
+ /**
78
+ * Chip style for block math (`$$...$$`) in the editor. Field names mirror the
79
+ * read-only renderer's `markdownStyle.math` (`padding`, `marginTop`,
80
+ * `marginBottom`, `textAlign`) so the same key means the same thing on both
81
+ * surfaces; the chip additionally splits `padding` per axis.
82
+ */
83
+ export interface InputMathStyle extends InputInlineMathStyle {
84
+ /**
85
+ * Shorthand for both padding axes, matching the renderer's
86
+ * `markdownStyle.math.padding`. `paddingHorizontal` / `paddingVertical`
87
+ * override it per axis when both are given.
88
+ */
89
+ padding?: number;
68
90
  marginTop?: number;
69
91
  marginBottom?: number;
70
- alignment?: 'left' | 'center' | 'right';
92
+ textAlign?: 'left' | 'center' | 'right';
93
+ }
94
+
95
+ export type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
96
+
97
+ const VALID_HEADING_LEVELS = new Set<number>([1, 2, 3, 4, 5, 6]);
98
+
99
+ function toHeadingLevel(n: number): HeadingLevel {
100
+ return (VALID_HEADING_LEVELS.has(n) ? n : 1) as HeadingLevel;
101
+ }
102
+
103
+ export interface HeadingStyle {
104
+ fontSize?: number;
105
+ fontWeight?: string;
106
+ color?: string;
71
107
  }
72
108
 
73
109
  export interface MarkdownTextInputStyle {
@@ -83,8 +119,28 @@ export interface MarkdownTextInputStyle {
83
119
  color?: string;
84
120
  backgroundColor?: string;
85
121
  };
86
- math?: MathStyle;
87
- mathBlock?: MathBlockStyle;
122
+ inlineMath?: InputInlineMathStyle;
123
+ math?: InputMathStyle;
124
+ /**
125
+ * Per-level heading styling for the editor, mirroring the readonly
126
+ * renderer's `markdownStyle` h1..h6. Omitted levels fall back to defaults
127
+ * (font sizes 30/24/20/18/16/14).
128
+ */
129
+ h1?: HeadingStyle;
130
+ h2?: HeadingStyle;
131
+ h3?: HeadingStyle;
132
+ h4?: HeadingStyle;
133
+ h5?: HeadingStyle;
134
+ h6?: HeadingStyle;
135
+ /** List styling shared by bullet and numbered lists. */
136
+ list?: {
137
+ /**
138
+ * Vertical spacing (points) added above each list item so items read as
139
+ * separate rows. iOS uses `paragraphSpacingBefore`; Android a `LineHeightSpan`.
140
+ * @default 0
141
+ */
142
+ itemSpacing?: number;
143
+ };
88
144
  }
89
145
 
90
146
  export interface StyleState {
@@ -94,6 +150,9 @@ export interface StyleState {
94
150
  strikethrough: { isActive: boolean };
95
151
  spoiler: { isActive: boolean };
96
152
  link: { isActive: boolean };
153
+ heading: { isActive: boolean; level: HeadingLevel };
154
+ unorderedList: { isActive: boolean; depth: number };
155
+ orderedList: { isActive: boolean; depth: number };
97
156
  }
98
157
 
99
158
  export interface ContextMenuItem {
@@ -139,8 +198,14 @@ export interface EnrichedMarkdownTextInputInstance {
139
198
  toggleUnderline: () => void;
140
199
  toggleStrikethrough: () => void;
141
200
  toggleSpoiler: () => void;
201
+ toggleHeading: (level: HeadingLevel) => void;
202
+ toggleUnorderedList: () => void;
203
+ toggleOrderedList: () => void;
204
+ indentList: () => void;
205
+ outdentList: () => void;
142
206
  setLink: (url: string) => void;
143
207
  insertLink: (text: string, url: string) => void;
208
+ insertText: (text: string) => void;
144
209
  insertMention: (displayText: string, url: string) => void;
145
210
  startMention: (indicator: string) => void;
146
211
  removeLink: () => void;
@@ -152,6 +217,13 @@ export interface EnrichedMarkdownTextInputInstance {
152
217
  ) => void;
153
218
  removeMath: (start: number) => void;
154
219
  copyToClipboard: () => void;
220
+ /**
221
+ * Completes a paste reported through `onPaste`. Call it exactly once per
222
+ * event: `resolvePaste('', '')` drops the clipboard content (replacing any
223
+ * selection), a non-empty `markdown` re-applies the copied formatting, and
224
+ * plain `text` inserts verbatim.
225
+ */
226
+ resolvePaste: (text: string, markdown?: string) => void;
155
227
  getMarkdown: () => Promise<string>;
156
228
  getCaretRect: () => Promise<CaretRect>;
157
229
  }
@@ -204,7 +276,17 @@ export interface EnrichedMarkdownTextInputProps extends Omit<
204
276
  editable?: boolean;
205
277
  autoFocus?: boolean;
206
278
  scrollEnabled?: boolean;
279
+ blockSyntax?: boolean;
207
280
  autoCapitalize?: string;
281
+ /**
282
+ * Report pastes through `onPaste` instead of inserting them. Only takes
283
+ * effect when `onPaste` is also set — otherwise native would swallow every
284
+ * paste with nobody left to resolve it.
285
+ *
286
+ * macOS ignores this prop and always pastes inline.
287
+ * @default false
288
+ */
289
+ interceptPaste?: boolean;
208
290
  multiline?: boolean;
209
291
  cursorColor?: ColorValue;
210
292
  selectionColor?: ColorValue;
@@ -214,9 +296,16 @@ export interface EnrichedMarkdownTextInputProps extends Omit<
214
296
  onChangeMarkdown?: (markdown: string) => void;
215
297
  onChangeSelection?: (selection: { start: number; end: number }) => void;
216
298
  onChangeState?: (state: StyleState) => void;
299
+ onKeyPress?: (e: NativeSyntheticEvent<OnKeyPressEvent>) => void;
217
300
  onCaretRectChange?: (rect: CaretRect) => void;
218
301
  onLinkDetected?: (event: OnLinkDetected) => void;
219
302
  onMathPress?: (event: OnMathPressEvent) => void;
303
+ /**
304
+ * Fires instead of the insert when `interceptPaste` is on. The handler owns
305
+ * the paste from here: it must call `resolvePaste` exactly once, on every
306
+ * path including failures, or the paste is silently dropped.
307
+ */
308
+ onPaste?: (event: OnPasteEvent) => void;
220
309
  mentionIndicators?: string[];
221
310
  onStartMention?: (event: OnStartMentionEvent) => void;
222
311
  onChangeMention?: (event: OnChangeMentionEvent) => void;
@@ -284,7 +373,9 @@ export const EnrichedMarkdownTextInput = ({
284
373
  editable = true,
285
374
  autoFocus = false,
286
375
  scrollEnabled = true,
376
+ blockSyntax = true,
287
377
  autoCapitalize = 'sentences',
378
+ interceptPaste = false,
288
379
  multiline = true,
289
380
  cursorColor,
290
381
  selectionColor,
@@ -292,9 +383,11 @@ export const EnrichedMarkdownTextInput = ({
292
383
  onChangeMarkdown,
293
384
  onChangeSelection,
294
385
  onChangeState,
386
+ onKeyPress,
295
387
  onCaretRectChange,
296
388
  onLinkDetected,
297
389
  onMathPress,
390
+ onPaste,
298
391
  mentionIndicators,
299
392
  onStartMention,
300
393
  onChangeMention,
@@ -352,6 +445,27 @@ export const EnrichedMarkdownTextInput = ({
352
445
  };
353
446
  }, []);
354
447
 
448
+ /**
449
+ * Mirrors the built-in TextInput's TextInputState integration so scroll
450
+ * containers' keyboardShouldPersistTaps logic and Keyboard.dismiss treat
451
+ * this input like a native TextInput. See utils/textInputState.ts for the
452
+ * full rationale. The unmount cleanup blurs through blurTextInput so both
453
+ * the registry entry and the native focus are released, matching the
454
+ * TextInput unmount path.
455
+ */
456
+ useLayoutEffect(() => {
457
+ const instance = nativeRef.current;
458
+ if (instance == null) return;
459
+
460
+ TextInputState.registerInput(instance);
461
+ return () => {
462
+ if (TextInputState.currentlyFocusedInput() === instance) {
463
+ TextInputState.blurTextInput(instance);
464
+ }
465
+ TextInputState.unregisterInput(instance);
466
+ };
467
+ }, []);
468
+
355
469
  const normalizedStyle = normalizeMarkdownTextInputStyle(markdownStyle);
356
470
 
357
471
  const normalizedSelectionMenuConfig = useMemo(() => {
@@ -436,6 +550,14 @@ export const EnrichedMarkdownTextInput = ({
436
550
  [onMathPress]
437
551
  );
438
552
 
553
+ const handlePaste = useCallback(
554
+ (e: NativeSyntheticEvent<OnPasteEvent>) => {
555
+ const { text, markdown } = e.nativeEvent;
556
+ onPaste?.({ text, markdown });
557
+ },
558
+ [onPaste]
559
+ );
560
+
439
561
  const handleChangeText = useCallback(
440
562
  (e: NativeSyntheticEvent<OnChangeTextEvent>) => {
441
563
  onChangeText?.(e.nativeEvent.value);
@@ -460,8 +582,17 @@ export const EnrichedMarkdownTextInput = ({
460
582
 
461
583
  const handleChangeState = useCallback(
462
584
  (e: NativeSyntheticEvent<OnChangeStateEvent>) => {
463
- const { bold, italic, underline, strikethrough, spoiler, link } =
464
- e.nativeEvent;
585
+ const {
586
+ bold,
587
+ italic,
588
+ underline,
589
+ strikethrough,
590
+ spoiler,
591
+ link,
592
+ heading,
593
+ unorderedList,
594
+ orderedList,
595
+ } = e.nativeEvent;
465
596
  onChangeState?.({
466
597
  bold,
467
598
  italic,
@@ -469,6 +600,9 @@ export const EnrichedMarkdownTextInput = ({
469
600
  strikethrough,
470
601
  spoiler,
471
602
  link,
603
+ heading: { ...heading, level: toHeadingLevel(heading.level) },
604
+ unorderedList,
605
+ orderedList,
472
606
  });
473
607
  },
474
608
  [onChangeState]
@@ -504,10 +638,12 @@ export const EnrichedMarkdownTextInput = ({
504
638
  );
505
639
 
506
640
  const handleFocus = useCallback(() => {
641
+ TextInputState.focusInput(nativeRef.current);
507
642
  onFocus?.();
508
643
  }, [onFocus]);
509
644
 
510
645
  const handleBlur = useCallback(() => {
646
+ TextInputState.blurInput(nativeRef.current);
511
647
  onBlur?.();
512
648
  }, [onBlur]);
513
649
 
@@ -548,7 +684,13 @@ export const EnrichedMarkdownTextInput = ({
548
684
  callback?.({
549
685
  text: selectedText,
550
686
  selection: { start: selectionStart, end: selectionEnd },
551
- styleState,
687
+ styleState: {
688
+ ...styleState,
689
+ heading: {
690
+ ...styleState.heading,
691
+ level: toHeadingLevel(styleState.heading.level),
692
+ },
693
+ },
552
694
  });
553
695
  },
554
696
  []
@@ -574,8 +716,14 @@ export const EnrichedMarkdownTextInput = ({
574
716
  toggleUnderline: () => Commands.toggleUnderline(commandRef),
575
717
  toggleStrikethrough: () => Commands.toggleStrikethrough(commandRef),
576
718
  toggleSpoiler: () => Commands.toggleSpoiler(commandRef),
719
+ toggleHeading: (level) => Commands.toggleHeading(commandRef, level),
720
+ toggleUnorderedList: () => Commands.toggleUnorderedList(commandRef),
721
+ toggleOrderedList: () => Commands.toggleOrderedList(commandRef),
722
+ indentList: () => Commands.indentList(commandRef),
723
+ outdentList: () => Commands.outdentList(commandRef),
577
724
  setLink: (url) => Commands.setLink(commandRef, url),
578
725
  insertLink: (text, url) => Commands.insertLink(commandRef, text, url),
726
+ insertText: (text) => Commands.insertText(commandRef, text),
579
727
  insertMention: (displayText, url) =>
580
728
  Commands.insertMention(commandRef, displayText, url),
581
729
  startMention: (indicator) => Commands.startMention(commandRef, indicator),
@@ -591,6 +739,8 @@ export const EnrichedMarkdownTextInput = ({
591
739
  ),
592
740
  removeMath: (start) => Commands.removeMath(commandRef, start),
593
741
  copyToClipboard: () => Commands.copyToClipboard(commandRef),
742
+ resolvePaste: (text, markdown = '') =>
743
+ Commands.resolvePaste(commandRef, text, markdown),
594
744
  getMarkdown: () =>
595
745
  new Promise<string>((resolve, reject) => {
596
746
  const requestId = nextRequestId.current++;
@@ -620,7 +770,9 @@ export const EnrichedMarkdownTextInput = ({
620
770
  editable={editable}
621
771
  autoFocus={autoFocus}
622
772
  scrollEnabled={scrollEnabled}
773
+ blockSyntax={blockSyntax}
623
774
  autoCapitalize={autoCapitalize}
775
+ interceptPaste={interceptPaste === true && onPaste != null}
624
776
  multiline={multiline}
625
777
  cursorColor={cursorColor}
626
778
  selectionColor={selectionColor}
@@ -631,8 +783,10 @@ export const EnrichedMarkdownTextInput = ({
631
783
  handleChangeSelection as NativeProps['onChangeSelection']
632
784
  }
633
785
  onChangeState={handleChangeState as NativeProps['onChangeState']}
786
+ onInputKeyPress={onKeyPress as NativeProps['onInputKeyPress']}
634
787
  onLinkDetected={handleLinkDetected as NativeProps['onLinkDetected']}
635
788
  onMathPress={handleMathPress as NativeProps['onMathPress']}
789
+ onPaste={handlePaste as NativeProps['onPaste']}
636
790
  onInputFocus={handleFocus as NativeProps['onInputFocus']}
637
791
  onInputBlur={handleBlur as NativeProps['onInputBlur']}
638
792
  onRequestMarkdownResult={
@@ -8,7 +8,13 @@ import {
8
8
  } from 'react-native';
9
9
  import type React from 'react';
10
10
 
11
- interface MathStyleInternal {
11
+ interface HeadingStyleInternal {
12
+ fontSize: CodegenTypes.Float;
13
+ fontWeight: string;
14
+ color: ColorValue;
15
+ }
16
+
17
+ interface InputInlineMathStyleInternal {
12
18
  color: ColorValue;
13
19
  fontSize: CodegenTypes.Float;
14
20
  backgroundColor: ColorValue;
@@ -22,10 +28,10 @@ interface MathStyleInternal {
22
28
  fontWeight: string;
23
29
  }
24
30
 
25
- interface MathBlockStyleInternal extends MathStyleInternal {
31
+ interface InputMathStyleInternal extends InputInlineMathStyleInternal {
26
32
  marginTop: CodegenTypes.Float;
27
33
  marginBottom: CodegenTypes.Float;
28
- alignment: string;
34
+ textAlign: string;
29
35
  }
30
36
 
31
37
  interface MarkdownTextInputStyleInternal {
@@ -52,8 +58,27 @@ interface MarkdownTextInputStyleInternal {
52
58
  color: ColorValue;
53
59
  backgroundColor: ColorValue;
54
60
  };
55
- math: MathStyleInternal;
56
- mathBlock: MathBlockStyleInternal;
61
+ // Per-level heading styles, mirroring the readonly renderer's markdownStyle
62
+ // h1..h6 so heading sizing is configured consistently across read and edit
63
+ // views. Always provided with complete defaults via normalizeMarkdownTextInputStyle.
64
+ h1: HeadingStyleInternal;
65
+ h2: HeadingStyleInternal;
66
+ h3: HeadingStyleInternal;
67
+ h4: HeadingStyleInternal;
68
+ h5: HeadingStyleInternal;
69
+ h6: HeadingStyleInternal;
70
+ list: {
71
+ // Vertical spacing (points) added above each list item. iOS applies it via
72
+ // paragraphSpacingBefore; Android via a LineHeightSpan. Float for parity with
73
+ // every other spacing value in the library.
74
+ itemSpacing: CodegenTypes.Float;
75
+ };
76
+ // Inline math (`$...$`) chip; block math (`$$...$$`) chip. Key names and the
77
+ // shared field names match the read-only renderer's markdownStyle. The
78
+ // author-facing `math.padding` shorthand is expanded into the two axes by
79
+ // normalizeMarkdownTextInputStyle, so nothing below carries it.
80
+ inlineMath: InputInlineMathStyleInternal;
81
+ math: InputMathStyleInternal;
57
82
  }
58
83
 
59
84
  interface TargetedEvent {
@@ -68,6 +93,10 @@ export interface OnChangeMarkdownEvent {
68
93
  value: string;
69
94
  }
70
95
 
96
+ export interface OnKeyPressEvent {
97
+ key: string;
98
+ }
99
+
71
100
  export interface OnChangeSelectionEvent {
72
101
  start: CodegenTypes.Int32;
73
102
  end: CodegenTypes.Int32;
@@ -80,6 +109,9 @@ export interface OnChangeStateEvent {
80
109
  strikethrough: { isActive: boolean };
81
110
  spoiler: { isActive: boolean };
82
111
  link: { isActive: boolean };
112
+ heading: { isActive: boolean; level: CodegenTypes.Int32 };
113
+ unorderedList: { isActive: boolean; depth: CodegenTypes.Int32 };
114
+ orderedList: { isActive: boolean; depth: CodegenTypes.Int32 };
83
115
  }
84
116
 
85
117
  export interface OnRequestMarkdownResultEvent {
@@ -141,6 +173,11 @@ export interface OnEndMentionEvent {
141
173
  indicator: string;
142
174
  }
143
175
 
176
+ export interface OnPasteEvent {
177
+ text: string;
178
+ markdown: string;
179
+ }
180
+
144
181
  export interface ContextMenuItemConfig {
145
182
  text: string;
146
183
  icon?: string;
@@ -180,6 +217,9 @@ export interface OnContextMenuItemPressEvent {
180
217
  strikethrough: { isActive: boolean };
181
218
  spoiler: { isActive: boolean };
182
219
  link: { isActive: boolean };
220
+ heading: { isActive: boolean; level: CodegenTypes.Int32 };
221
+ unorderedList: { isActive: boolean; depth: CodegenTypes.Int32 };
222
+ orderedList: { isActive: boolean; depth: CodegenTypes.Int32 };
183
223
  };
184
224
  }
185
225
 
@@ -211,10 +251,31 @@ export interface NativeProps extends ViewProps {
211
251
  * @default true
212
252
  */
213
253
  scrollEnabled?: boolean;
254
+ /**
255
+ * Whether block-level markdown syntax is interpreted.
256
+ *
257
+ * When `false`, list markers, headings, blockquotes, tables, code blocks and
258
+ * thematic breaks stay in the text verbatim instead of being consumed as
259
+ * structure, so the markdown round-trips byte-for-byte. Inline syntax
260
+ * (`**bold**`, links, `$math$`) still applies. `\r\n` is normalized to `\n`
261
+ * and `U+000B` is stripped from the input.
262
+ * @default true
263
+ */
264
+ blockSyntax?: boolean;
214
265
  /**
215
266
  * Auto-capitalization behavior.
216
267
  */
217
268
  autoCapitalize?: string;
269
+ /**
270
+ * When `true`, a paste is reported through `onPaste` instead of being
271
+ * inserted. Native reads the clipboard and leaves the buffer untouched — the
272
+ * JS handler decides what happens and must call the `resolvePaste` command
273
+ * exactly once, or the paste is dropped.
274
+ *
275
+ * macOS ignores this prop and always pastes inline.
276
+ * @default false
277
+ */
278
+ interceptPaste?: boolean;
218
279
  /**
219
280
  * Whether the input supports multiple lines.
220
281
  * @default true
@@ -292,6 +353,7 @@ export interface NativeProps extends ViewProps {
292
353
  onChangeText?: CodegenTypes.DirectEventHandler<OnChangeTextEvent>;
293
354
  onChangeMarkdown?: CodegenTypes.DirectEventHandler<OnChangeMarkdownEvent>;
294
355
  onChangeSelection?: CodegenTypes.DirectEventHandler<OnChangeSelectionEvent>;
356
+ onInputKeyPress?: CodegenTypes.DirectEventHandler<OnKeyPressEvent>;
295
357
  onChangeState?: CodegenTypes.DirectEventHandler<OnChangeStateEvent>;
296
358
  onInputFocus?: CodegenTypes.DirectEventHandler<TargetedEvent>;
297
359
  onInputBlur?: CodegenTypes.DirectEventHandler<TargetedEvent>;
@@ -301,6 +363,7 @@ export interface NativeProps extends ViewProps {
301
363
  onContextMenuItemPress?: CodegenTypes.DirectEventHandler<OnContextMenuItemPressEvent>;
302
364
  onLinkDetected?: CodegenTypes.DirectEventHandler<OnLinkDetected>;
303
365
  onMathPress?: CodegenTypes.DirectEventHandler<OnMathPressNativeEvent>;
366
+ onPaste?: CodegenTypes.DirectEventHandler<OnPasteEvent>;
304
367
  onStartMention?: CodegenTypes.DirectEventHandler<OnStartMentionEvent>;
305
368
  onChangeMention?: CodegenTypes.DirectEventHandler<OnChangeMentionEvent>;
306
369
  onEndMention?: CodegenTypes.DirectEventHandler<OnEndMentionEvent>;
@@ -325,12 +388,21 @@ interface NativeCommands {
325
388
  toggleUnderline: (viewRef: React.ElementRef<ComponentType>) => void;
326
389
  toggleStrikethrough: (viewRef: React.ElementRef<ComponentType>) => void;
327
390
  toggleSpoiler: (viewRef: React.ElementRef<ComponentType>) => void;
391
+ toggleHeading: (
392
+ viewRef: React.ElementRef<ComponentType>,
393
+ level: CodegenTypes.Int32
394
+ ) => void;
395
+ toggleUnorderedList: (viewRef: React.ElementRef<ComponentType>) => void;
396
+ toggleOrderedList: (viewRef: React.ElementRef<ComponentType>) => void;
397
+ indentList: (viewRef: React.ElementRef<ComponentType>) => void;
398
+ outdentList: (viewRef: React.ElementRef<ComponentType>) => void;
328
399
  setLink: (viewRef: React.ElementRef<ComponentType>, url: string) => void;
329
400
  insertLink: (
330
401
  viewRef: React.ElementRef<ComponentType>,
331
402
  text: string,
332
403
  url: string
333
404
  ) => void;
405
+ insertText: (viewRef: React.ElementRef<ComponentType>, text: string) => void;
334
406
  insertMention: (
335
407
  viewRef: React.ElementRef<ComponentType>,
336
408
  displayText: string,
@@ -357,6 +429,11 @@ interface NativeCommands {
357
429
  start: CodegenTypes.Int32
358
430
  ) => void;
359
431
  copyToClipboard: (viewRef: React.ElementRef<ComponentType>) => void;
432
+ resolvePaste: (
433
+ viewRef: React.ElementRef<ComponentType>,
434
+ text: string,
435
+ markdown: string
436
+ ) => void;
360
437
  requestMarkdown: (
361
438
  viewRef: React.ElementRef<ComponentType>,
362
439
  requestId: CodegenTypes.Int32
@@ -378,8 +455,14 @@ export const Commands: NativeCommands = codegenNativeCommands<NativeCommands>({
378
455
  'toggleUnderline',
379
456
  'toggleStrikethrough',
380
457
  'toggleSpoiler',
458
+ 'toggleHeading',
459
+ 'toggleUnorderedList',
460
+ 'toggleOrderedList',
461
+ 'indentList',
462
+ 'outdentList',
381
463
  'setLink',
382
464
  'insertLink',
465
+ 'insertText',
383
466
  'insertMention',
384
467
  'startMention',
385
468
  'removeLink',
@@ -387,6 +470,7 @@ export const Commands: NativeCommands = codegenNativeCommands<NativeCommands>({
387
470
  'updateMath',
388
471
  'removeMath',
389
472
  'copyToClipboard',
473
+ 'resolvePaste',
390
474
  'requestMarkdown',
391
475
  'requestCaretRect',
392
476
  ],
@@ -29,6 +29,8 @@ interface BlockquoteStyleInternal extends BaseBlockStyleInternal {
29
29
  borderWidth: CodegenTypes.Float;
30
30
  gapWidth: CodegenTypes.Float;
31
31
  backgroundColor: ColorValue;
32
+ borderRadius: CodegenTypes.Float;
33
+ padding: CodegenTypes.Float;
32
34
  }
33
35
 
34
36
  interface ListStyleInternal extends BaseBlockStyleInternal {
@@ -39,6 +41,24 @@ interface ListStyleInternal extends BaseBlockStyleInternal {
39
41
  markerFontWeight: string;
40
42
  gapWidth: CodegenTypes.Float;
41
43
  marginLeft: CodegenTypes.Float;
44
+ itemSpacing: CodegenTypes.Float;
45
+ }
46
+
47
+ interface CodeBlockSyntaxColorsInternal {
48
+ keyword: ColorValue;
49
+ operatorColor: ColorValue;
50
+ punctuation: ColorValue;
51
+ string: ColorValue;
52
+ number: ColorValue;
53
+ constant: ColorValue;
54
+ comment: ColorValue;
55
+ function: ColorValue;
56
+ type: ColorValue;
57
+ variable: ColorValue;
58
+ property: ColorValue;
59
+ tag: ColorValue;
60
+ attribute: ColorValue;
61
+ embedded: ColorValue;
42
62
  }
43
63
 
44
64
  interface CodeBlockStyleInternal extends BaseBlockStyleInternal {
@@ -47,6 +67,7 @@ interface CodeBlockStyleInternal extends BaseBlockStyleInternal {
47
67
  borderRadius: CodegenTypes.Float;
48
68
  borderWidth: CodegenTypes.Float;
49
69
  padding: CodegenTypes.Float;
70
+ syntaxColors: CodeBlockSyntaxColorsInternal;
50
71
  }
51
72
 
52
73
  interface LinkStyleInternal {
@@ -94,6 +115,10 @@ interface CodeStyleInternal {
94
115
 
95
116
  interface ImageStyleInternal {
96
117
  height: CodegenTypes.Float;
118
+ maxHeight: CodegenTypes.Float;
119
+ aspectRatio: CodegenTypes.Float;
120
+ // Nested struct fields cannot use WithDefault; default is applied in JS normalization.
121
+ resizeMode: string;
97
122
  borderRadius: CodegenTypes.Float;
98
123
  marginTop: CodegenTypes.Float;
99
124
  marginBottom: CodegenTypes.Float;
@@ -121,6 +146,8 @@ interface TableStyleInternal extends BaseBlockStyleInternal {
121
146
  borderRadius: CodegenTypes.Float;
122
147
  cellPaddingHorizontal: CodegenTypes.Float;
123
148
  cellPaddingVertical: CodegenTypes.Float;
149
+ horizontalOverflow: CodegenTypes.Float;
150
+ align: string;
124
151
  }
125
152
 
126
153
  interface TaskListStyleInternal {
@@ -225,11 +252,21 @@ export interface TaskListItemPressEvent {
225
252
  text: string;
226
253
  }
227
254
 
255
+ export interface CopyPressEvent {
256
+ code: string;
257
+ language: string;
258
+ }
259
+
228
260
  export interface ContextMenuItemConfig {
229
261
  text: string;
230
262
  icon?: string;
231
263
  }
232
264
 
265
+ export interface ImageRequestHeaderInternal {
266
+ name: string;
267
+ value: string;
268
+ }
269
+
233
270
  export interface SelectionMenuConfig {
234
271
  copyAsMarkdown: boolean;
235
272
  copyImageUrl: boolean;
@@ -311,10 +348,16 @@ export interface Md4cFlagsInternal {
311
348
  * @default false
312
349
  */
313
350
  highlight: boolean;
351
+ /**
352
+ * Treat soft breaks (single newlines) as hard breaks (visible line breaks).
353
+ * @default false
354
+ */
355
+ hardSoftBreaks: boolean;
314
356
  }
315
357
 
316
358
  interface StreamingConfigInternal {
317
359
  tableMode: string;
360
+ codeBlockMode: string;
318
361
  }
319
362
 
320
363
  export interface NativeProps extends ViewProps {
@@ -345,6 +388,21 @@ export interface NativeProps extends ViewProps {
345
388
  * Receives the 0-based task index, current checked state, and the item's plain text.
346
389
  */
347
390
  onTaskListItemPress?: CodegenTypes.BubblingEventHandler<TaskListItemPressEvent>;
391
+ /**
392
+ * Controls whether tapping a task list checkbox toggles its checked state.
393
+ *
394
+ * When `false`, the tap is fully inert: no visual toggle and no
395
+ * `onTaskListItemPress` emission. Text selection and links are unaffected.
396
+ *
397
+ * @default true
398
+ */
399
+ enableTaskListItemToggle?: CodegenTypes.WithDefault<boolean, true>;
400
+ /**
401
+ * Callback fired when code is copied from a fenced code block's header copy
402
+ * button, its long-press context-menu "Copy" action, or the VoiceOver copy
403
+ * action. Receives the copied code and its language.
404
+ */
405
+ onCopyPress?: CodegenTypes.BubblingEventHandler<CopyPressEvent>;
348
406
  /**
349
407
  * Controls whether the system link preview is shown on long press (iOS only).
350
408
  *
@@ -424,10 +482,18 @@ export interface NativeProps extends ViewProps {
424
482
  * @default 'particles'
425
483
  */
426
484
  spoilerOverlay?: CodegenTypes.WithDefault<string, 'particles'>;
485
+ /**
486
+ * Hides the text selection context menu while keeping text selectable.
487
+ */
488
+ contextMenuHidden?: CodegenTypes.WithDefault<boolean, false>;
427
489
  /**
428
490
  * Custom items to show in the text selection context menu.
429
491
  */
430
492
  contextMenuItems?: ReadonlyArray<Readonly<ContextMenuItemConfig>>;
493
+ /**
494
+ * HTTP headers attached to remote image requests, as name/value pairs.
495
+ */
496
+ imageRequestHeaders?: ReadonlyArray<Readonly<ImageRequestHeaderInternal>>;
431
497
  /**
432
498
  * Built-in items to show in the text selection context menu.
433
499
  */