react-native-enriched-markdown-scaffold 0.7.4-scaffold.9 → 1.0.2-scaffold.2

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 +186 -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 +24 -0
  8. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerInterface.java +8 -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 +35 -0
  14. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +886 -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 +189 -13
  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 +54 -4
  26. package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt +901 -462
  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/FormattingStore.kt +80 -87
  43. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputFormatter.kt +109 -1
  44. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputParser.kt +116 -22
  45. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/MarkdownSerializer.kt +167 -38
  46. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/RangeEditAdjustment.kt +149 -0
  47. package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputEventEmitter.kt +66 -5
  48. package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputMeasurementStore.kt +4 -2
  49. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockRange.kt +27 -0
  50. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockType.kt +48 -0
  51. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/FormattingRange.kt +9 -4
  52. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/InputFormatterStyle.kt +39 -2
  53. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathAtom.kt +20 -0
  54. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathChipStyle.kt +1 -1
  55. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MutableRangeBounds.kt +11 -0
  56. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputBulletSpan.kt +82 -0
  57. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputHeadingSpan.kt +58 -0
  58. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputListItemSpacingSpan.kt +37 -0
  59. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputOrderedListMarkerSpan.kt +63 -0
  60. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/BlockHandler.kt +54 -0
  61. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/HeadingBlockHandler.kt +27 -0
  62. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/OrderedListBlockHandler.kt +38 -0
  63. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/UnorderedListBlockHandler.kt +37 -0
  64. package/android/src/main/java/com/swmansion/enriched/markdown/input/toolbar/InputContextMenu.kt +8 -26
  65. package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +1 -0
  66. package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +1 -0
  67. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt +9 -2
  68. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +100 -12
  69. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +16 -1
  70. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +4 -0
  71. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt +2 -1
  72. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +74 -18
  73. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +43 -4
  74. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +9 -1
  75. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SoftBreakRenderer.kt +16 -0
  76. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +30 -27
  77. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BaseListSpan.kt +24 -0
  78. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BlockquoteSpan.kt +174 -24
  79. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBackgroundSpan.kt +27 -3
  80. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBlockSpan.kt +13 -16
  81. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeSpan.kt +1 -1
  82. package/android/src/main/java/com/swmansion/enriched/markdown/spans/EmphasisSpan.kt +1 -1
  83. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +182 -46
  84. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListItemSpacingSpan.kt +33 -0
  85. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListMarkerAnchorSpan.kt +38 -0
  86. package/android/src/main/java/com/swmansion/enriched/markdown/spans/OrderedListSpan.kt +2 -0
  87. package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrongSpan.kt +1 -1
  88. package/android/src/main/java/com/swmansion/enriched/markdown/spans/TaskListSpan.kt +3 -2
  89. package/android/src/main/java/com/swmansion/enriched/markdown/spans/UnorderedListSpan.kt +3 -2
  90. package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +6 -0
  91. package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +26 -0
  92. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +7 -1
  93. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +4 -1
  94. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +13 -4
  95. package/android/src/main/java/com/swmansion/enriched/markdown/styles/TableStyle.kt +6 -0
  96. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockHighlighter.kt +90 -0
  97. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockNode.kt +57 -0
  98. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/FeatureFlags.kt +1 -0
  99. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownSegment.kt +9 -0
  100. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownViewManagerUtils.kt +37 -7
  101. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/ReadableMapExtensions.kt +3 -0
  102. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/RenderedSegment.kt +10 -0
  103. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/SegmentSignature.kt +1 -0
  104. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/StreamingMarkdownFilter.kt +83 -5
  105. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/serialization/MarkdownASTSerializer.kt +4 -0
  106. package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/MarkdownStyleParser.kt +74 -44
  107. package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/PasteTextUtils.kt +20 -0
  108. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageCache.kt +26 -3
  109. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageDownloader.kt +22 -9
  110. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/LocalImageLoader.kt +161 -0
  111. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/extensions/TextPaintExtensions.kt +23 -0
  112. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/CheckboxTouchHelper.kt +7 -0
  113. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/TaskListTapUtils.kt +41 -21
  114. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/span/BlockSpacing.kt +15 -8
  115. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkLongPressMovementMethod.kt +58 -27
  116. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionActionMode.kt +49 -15
  117. package/android/src/main/java/com/swmansion/enriched/markdown/views/BlockMenuOptions.kt +45 -0
  118. package/android/src/main/java/com/swmansion/enriched/markdown/views/CodeBlockContainerView.kt +396 -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 +36 -9
  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 +6 -4
  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 +234 -12
  152. package/docs/BREAKING_CHANGES.md +129 -0
  153. package/docs/CODE_HIGHLIGHT.md +133 -0
  154. package/docs/COPY_OPTIONS.md +47 -3
  155. package/docs/ELEMENTS_STRUCTURE.md +52 -4
  156. package/docs/IMAGE_CACHING.md +30 -0
  157. package/docs/INPUT.md +108 -11
  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 +284 -75
  169. package/ios/EnrichedMarkdownText.h +7 -0
  170. package/ios/EnrichedMarkdownText.mm +101 -73
  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 +35 -0
  179. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +886 -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/ENRMClipboardCoordinator.h +45 -0
  190. package/ios/input/ENRMClipboardCoordinator.mm +120 -0
  191. package/ios/input/ENRMDetectorPipeline.h +2 -1
  192. package/ios/input/ENRMEditPipeline.h +76 -0
  193. package/ios/input/ENRMEditPipeline.mm +228 -0
  194. package/ios/input/ENRMEditSession.h +36 -0
  195. package/ios/input/ENRMEditSession.mm +63 -0
  196. package/ios/input/ENRMFormattingStore.h +17 -0
  197. package/ios/input/ENRMFormattingStore.mm +95 -105
  198. package/ios/input/ENRMInputBlockType.h +91 -0
  199. package/ios/input/ENRMInputBlockType.mm +5 -0
  200. package/ios/input/ENRMInputDecorationDrawer.h +18 -0
  201. package/ios/input/ENRMInputEventEmitter.h +56 -0
  202. package/ios/input/ENRMInputEventEmitter.mm +308 -0
  203. package/ios/input/ENRMInputFormatter.h +29 -69
  204. package/ios/input/ENRMInputFormatter.mm +216 -124
  205. package/ios/input/ENRMInputFormatterStyle.h +99 -0
  206. package/ios/input/ENRMInputFormatterStyle.mm +188 -0
  207. package/ios/input/ENRMInputLayoutManager.h +9 -0
  208. package/ios/input/ENRMInputLayoutManager.mm +30 -0
  209. package/ios/input/ENRMInputListMarkerDrawer.h +32 -0
  210. package/ios/input/ENRMInputListMarkerDrawer.mm +426 -0
  211. package/ios/input/ENRMInputParser.h +5 -6
  212. package/ios/input/ENRMInputParser.mm +461 -178
  213. package/ios/input/ENRMInputRemend.mm +2 -2
  214. package/ios/input/ENRMInputStyleStateBuilder.h +40 -0
  215. package/ios/input/ENRMInputStyleStateBuilder.mm +60 -0
  216. package/ios/input/ENRMInputTextView.mm +103 -8
  217. package/ios/input/ENRMInputTypingAttributesController.h +42 -0
  218. package/ios/input/ENRMInputTypingAttributesController.mm +203 -0
  219. package/ios/input/ENRMLinkCoordinator.h +41 -0
  220. package/ios/input/ENRMLinkCoordinator.mm +89 -0
  221. package/ios/input/ENRMMarkdownSerializer.h +29 -5
  222. package/ios/input/ENRMMarkdownSerializer.mm +170 -48
  223. package/ios/input/ENRMMathAtom.h +26 -0
  224. package/ios/input/ENRMMathAtom.mm +12 -0
  225. package/ios/input/ENRMMentionCoordinator.h +45 -0
  226. package/ios/input/ENRMMentionCoordinator.mm +167 -0
  227. package/ios/input/ENRMRangeEditAdjustment.h +38 -0
  228. package/ios/input/ENRMRangeEditAdjustment.mm +91 -0
  229. package/ios/input/ENRMRangeStoreUtils.h +39 -0
  230. package/ios/input/EnrichedMarkdownTextInput+ContextMenu.mm +6 -6
  231. package/ios/input/EnrichedMarkdownTextInput+Internal.h +11 -3
  232. package/ios/input/EnrichedMarkdownTextInput.h +7 -1
  233. package/ios/input/EnrichedMarkdownTextInput.mm +1089 -1023
  234. package/ios/input/InputStylePropsUtils.h +109 -68
  235. package/ios/input/internals/EnrichedMarkdownTextInputShadowNode.mm +2 -1
  236. package/ios/input/styles/ENRMBlockHandler.h +46 -0
  237. package/ios/input/styles/ENRMHeadingBlockHandler.h +15 -0
  238. package/ios/input/styles/ENRMHeadingBlockHandler.mm +38 -0
  239. package/ios/input/styles/ENRMOrderedListBlockHandler.h +14 -0
  240. package/ios/input/styles/ENRMOrderedListBlockHandler.mm +48 -0
  241. package/ios/input/styles/ENRMUnorderedListBlockHandler.h +15 -0
  242. package/ios/input/styles/ENRMUnorderedListBlockHandler.mm +51 -0
  243. package/ios/internals/ENRMViewFreeMeasurement.h +331 -0
  244. package/ios/internals/EnrichedMarkdownShadowNode.h +1 -3
  245. package/ios/internals/EnrichedMarkdownShadowNode.mm +16 -20
  246. package/ios/internals/EnrichedMarkdownTextShadowNode.h +1 -3
  247. package/ios/internals/EnrichedMarkdownTextShadowNode.mm +15 -20
  248. package/ios/internals/MeasurementCache.h +33 -7
  249. package/ios/internals/ShadowMeasurementUtils.h +63 -58
  250. package/ios/math/ENRMMathChipController.h +74 -0
  251. package/ios/math/ENRMMathChipController.mm +476 -0
  252. package/ios/math/ENRMRaTeXBridge.swift +4 -1
  253. package/ios/parser/ENRMMarkdownParser.h +1 -8
  254. package/ios/parser/ENRMMarkdownParser.mm +2 -11
  255. package/ios/parser/MarkdownASTNode.h +2 -1
  256. package/ios/parser/MarkdownParserBridge.mm +4 -0
  257. package/ios/renderer/AttributedRenderer.m +20 -2
  258. package/ios/renderer/BaseRenderer.h +17 -2
  259. package/ios/renderer/BaseRenderer.m +30 -0
  260. package/ios/renderer/BlockquoteRenderer.h +1 -1
  261. package/ios/renderer/BlockquoteRenderer.m +144 -35
  262. package/ios/renderer/CodeBlockRenderer.h +1 -1
  263. package/ios/renderer/CodeBlockRenderer.m +27 -23
  264. package/ios/renderer/CodeRenderer.h +1 -1
  265. package/ios/renderer/CodeRenderer.m +3 -1
  266. package/ios/renderer/ENRMImageRenderer.h +1 -1
  267. package/ios/renderer/ENRMImageRenderer.m +5 -1
  268. package/ios/renderer/ENRMMathInlineRenderer.h +1 -1
  269. package/ios/renderer/ENRMMathInlineRenderer.m +5 -1
  270. package/ios/renderer/ENRMSpoilerRenderer.h +1 -1
  271. package/ios/renderer/ENRMSpoilerRenderer.m +3 -1
  272. package/ios/renderer/EmphasisRenderer.h +1 -1
  273. package/ios/renderer/EmphasisRenderer.m +3 -1
  274. package/ios/renderer/HeadingRenderer.h +1 -1
  275. package/ios/renderer/HeadingRenderer.m +13 -6
  276. package/ios/renderer/HighlightRenderer.h +1 -1
  277. package/ios/renderer/HighlightRenderer.m +3 -1
  278. package/ios/renderer/LinkRenderer.h +1 -1
  279. package/ios/renderer/LinkRenderer.m +3 -1
  280. package/ios/renderer/ListItemRenderer.h +13 -1
  281. package/ios/renderer/ListItemRenderer.m +102 -44
  282. package/ios/renderer/ListRenderer.h +2 -2
  283. package/ios/renderer/ListRenderer.m +63 -25
  284. package/ios/renderer/ParagraphRenderer.h +1 -1
  285. package/ios/renderer/ParagraphRenderer.m +16 -8
  286. package/ios/renderer/RenderContext.h +10 -0
  287. package/ios/renderer/RenderContext.m +44 -0
  288. package/ios/renderer/RendererFactory.m +14 -0
  289. package/ios/renderer/StrikethroughRenderer.h +1 -1
  290. package/ios/renderer/StrikethroughRenderer.m +3 -1
  291. package/ios/renderer/StrongRenderer.h +1 -1
  292. package/ios/renderer/StrongRenderer.m +3 -1
  293. package/ios/renderer/SubscriptRenderer.h +1 -1
  294. package/ios/renderer/SubscriptRenderer.m +3 -1
  295. package/ios/renderer/SuperscriptRenderer.h +1 -1
  296. package/ios/renderer/SuperscriptRenderer.m +3 -1
  297. package/ios/renderer/TextRenderer.h +2 -2
  298. package/ios/renderer/TextRenderer.m +3 -1
  299. package/ios/renderer/ThematicBreakRenderer.h +1 -1
  300. package/ios/renderer/ThematicBreakRenderer.m +3 -1
  301. package/ios/renderer/UnderlineRenderer.h +1 -1
  302. package/ios/renderer/UnderlineRenderer.m +3 -1
  303. package/ios/styles/StyleConfig.h +22 -0
  304. package/ios/styles/StyleConfig.mm +132 -0
  305. package/ios/utils/BlockquoteBorder.h +6 -0
  306. package/ios/utils/BlockquoteBorder.m +249 -52
  307. package/ios/utils/CodeBlockBackground.m +16 -2
  308. package/ios/utils/ENRMAtomicSize.h +65 -0
  309. package/ios/utils/ENRMBlockMenu.h +57 -0
  310. package/ios/utils/ENRMCodeBlockContent.h +37 -0
  311. package/ios/utils/ENRMCodeBlockContent.mm +79 -0
  312. package/ios/utils/ENRMCodeBlockHighlighter.h +37 -0
  313. package/ios/utils/ENRMCodeBlockHighlighter.mm +51 -0
  314. package/ios/utils/ENRMFeatureFlags.h +7 -0
  315. package/ios/utils/ENRMImageDownloader.h +11 -1
  316. package/ios/utils/ENRMImageDownloader.m +60 -16
  317. package/ios/utils/ENRMLocalImageLoader.h +31 -0
  318. package/ios/utils/ENRMLocalImageLoader.m +68 -0
  319. package/ios/utils/ENRMMathFallback.h +26 -0
  320. package/ios/utils/ENRMMathFallback.m +18 -0
  321. package/ios/utils/ENRMTextViewSetup.h +35 -17
  322. package/ios/utils/EditMenuUtils.h +22 -5
  323. package/ios/utils/EditMenuUtils.m +53 -9
  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 +53 -0
  338. package/ios/views/ENRMCodeBlockContainerView.m +559 -0
  339. package/ios/views/ENRMMathContainerView.h +16 -0
  340. package/ios/views/ENRMMathContainerView.m +74 -19
  341. package/ios/views/TableContainerView.h +22 -0
  342. package/ios/views/TableContainerView.m +261 -175
  343. package/jest.d.ts +1 -0
  344. package/jest.js +5 -0
  345. package/lib/module/EnrichedMarkdownNativeComponent.ts +73 -0
  346. package/lib/module/EnrichedMarkdownTextInput.js +84 -5
  347. package/lib/module/EnrichedMarkdownTextInput.js.map +1 -1
  348. package/lib/module/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
  349. package/lib/module/EnrichedMarkdownTextNativeComponent.ts +74 -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 +37 -5
  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 +66 -0
  383. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts.map +1 -1
  384. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts +94 -9
  385. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts.map +1 -1
  386. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts +69 -5
  387. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts.map +1 -1
  388. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +66 -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 +104 -9
  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 +73 -0
  433. package/src/EnrichedMarkdownTextInput.tsx +159 -8
  434. package/src/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
  435. package/src/EnrichedMarkdownTextNativeComponent.ts +74 -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 +53 -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 +101 -9
  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
  }
@@ -206,6 +278,15 @@ export interface EnrichedMarkdownTextInputProps extends Omit<
206
278
  scrollEnabled?: boolean;
207
279
  blockSyntax?: boolean;
208
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;
209
290
  multiline?: boolean;
210
291
  cursorColor?: ColorValue;
211
292
  selectionColor?: ColorValue;
@@ -215,9 +296,16 @@ export interface EnrichedMarkdownTextInputProps extends Omit<
215
296
  onChangeMarkdown?: (markdown: string) => void;
216
297
  onChangeSelection?: (selection: { start: number; end: number }) => void;
217
298
  onChangeState?: (state: StyleState) => void;
299
+ onKeyPress?: (e: NativeSyntheticEvent<OnKeyPressEvent>) => void;
218
300
  onCaretRectChange?: (rect: CaretRect) => void;
219
301
  onLinkDetected?: (event: OnLinkDetected) => void;
220
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;
221
309
  mentionIndicators?: string[];
222
310
  onStartMention?: (event: OnStartMentionEvent) => void;
223
311
  onChangeMention?: (event: OnChangeMentionEvent) => void;
@@ -287,6 +375,7 @@ export const EnrichedMarkdownTextInput = ({
287
375
  scrollEnabled = true,
288
376
  blockSyntax = true,
289
377
  autoCapitalize = 'sentences',
378
+ interceptPaste = false,
290
379
  multiline = true,
291
380
  cursorColor,
292
381
  selectionColor,
@@ -294,9 +383,11 @@ export const EnrichedMarkdownTextInput = ({
294
383
  onChangeMarkdown,
295
384
  onChangeSelection,
296
385
  onChangeState,
386
+ onKeyPress,
297
387
  onCaretRectChange,
298
388
  onLinkDetected,
299
389
  onMathPress,
390
+ onPaste,
300
391
  mentionIndicators,
301
392
  onStartMention,
302
393
  onChangeMention,
@@ -354,6 +445,27 @@ export const EnrichedMarkdownTextInput = ({
354
445
  };
355
446
  }, []);
356
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
+
357
469
  const normalizedStyle = normalizeMarkdownTextInputStyle(markdownStyle);
358
470
 
359
471
  const normalizedSelectionMenuConfig = useMemo(() => {
@@ -438,6 +550,14 @@ export const EnrichedMarkdownTextInput = ({
438
550
  [onMathPress]
439
551
  );
440
552
 
553
+ const handlePaste = useCallback(
554
+ (e: NativeSyntheticEvent<OnPasteEvent>) => {
555
+ const { text, markdown } = e.nativeEvent;
556
+ onPaste?.({ text, markdown });
557
+ },
558
+ [onPaste]
559
+ );
560
+
441
561
  const handleChangeText = useCallback(
442
562
  (e: NativeSyntheticEvent<OnChangeTextEvent>) => {
443
563
  onChangeText?.(e.nativeEvent.value);
@@ -462,8 +582,17 @@ export const EnrichedMarkdownTextInput = ({
462
582
 
463
583
  const handleChangeState = useCallback(
464
584
  (e: NativeSyntheticEvent<OnChangeStateEvent>) => {
465
- const { bold, italic, underline, strikethrough, spoiler, link } =
466
- 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;
467
596
  onChangeState?.({
468
597
  bold,
469
598
  italic,
@@ -471,6 +600,9 @@ export const EnrichedMarkdownTextInput = ({
471
600
  strikethrough,
472
601
  spoiler,
473
602
  link,
603
+ heading: { ...heading, level: toHeadingLevel(heading.level) },
604
+ unorderedList,
605
+ orderedList,
474
606
  });
475
607
  },
476
608
  [onChangeState]
@@ -506,10 +638,12 @@ export const EnrichedMarkdownTextInput = ({
506
638
  );
507
639
 
508
640
  const handleFocus = useCallback(() => {
641
+ TextInputState.focusInput(nativeRef.current);
509
642
  onFocus?.();
510
643
  }, [onFocus]);
511
644
 
512
645
  const handleBlur = useCallback(() => {
646
+ TextInputState.blurInput(nativeRef.current);
513
647
  onBlur?.();
514
648
  }, [onBlur]);
515
649
 
@@ -550,7 +684,13 @@ export const EnrichedMarkdownTextInput = ({
550
684
  callback?.({
551
685
  text: selectedText,
552
686
  selection: { start: selectionStart, end: selectionEnd },
553
- styleState,
687
+ styleState: {
688
+ ...styleState,
689
+ heading: {
690
+ ...styleState.heading,
691
+ level: toHeadingLevel(styleState.heading.level),
692
+ },
693
+ },
554
694
  });
555
695
  },
556
696
  []
@@ -576,8 +716,14 @@ export const EnrichedMarkdownTextInput = ({
576
716
  toggleUnderline: () => Commands.toggleUnderline(commandRef),
577
717
  toggleStrikethrough: () => Commands.toggleStrikethrough(commandRef),
578
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),
579
724
  setLink: (url) => Commands.setLink(commandRef, url),
580
725
  insertLink: (text, url) => Commands.insertLink(commandRef, text, url),
726
+ insertText: (text) => Commands.insertText(commandRef, text),
581
727
  insertMention: (displayText, url) =>
582
728
  Commands.insertMention(commandRef, displayText, url),
583
729
  startMention: (indicator) => Commands.startMention(commandRef, indicator),
@@ -593,6 +739,8 @@ export const EnrichedMarkdownTextInput = ({
593
739
  ),
594
740
  removeMath: (start) => Commands.removeMath(commandRef, start),
595
741
  copyToClipboard: () => Commands.copyToClipboard(commandRef),
742
+ resolvePaste: (text, markdown = '') =>
743
+ Commands.resolvePaste(commandRef, text, markdown),
596
744
  getMarkdown: () =>
597
745
  new Promise<string>((resolve, reject) => {
598
746
  const requestId = nextRequestId.current++;
@@ -624,6 +772,7 @@ export const EnrichedMarkdownTextInput = ({
624
772
  scrollEnabled={scrollEnabled}
625
773
  blockSyntax={blockSyntax}
626
774
  autoCapitalize={autoCapitalize}
775
+ interceptPaste={interceptPaste === true && onPaste != null}
627
776
  multiline={multiline}
628
777
  cursorColor={cursorColor}
629
778
  selectionColor={selectionColor}
@@ -634,8 +783,10 @@ export const EnrichedMarkdownTextInput = ({
634
783
  handleChangeSelection as NativeProps['onChangeSelection']
635
784
  }
636
785
  onChangeState={handleChangeState as NativeProps['onChangeState']}
786
+ onInputKeyPress={onKeyPress as NativeProps['onInputKeyPress']}
637
787
  onLinkDetected={handleLinkDetected as NativeProps['onLinkDetected']}
638
788
  onMathPress={handleMathPress as NativeProps['onMathPress']}
789
+ onPaste={handlePaste as NativeProps['onPaste']}
639
790
  onInputFocus={handleFocus as NativeProps['onInputFocus']}
640
791
  onInputBlur={handleBlur as NativeProps['onInputBlur']}
641
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
 
@@ -226,6 +266,16 @@ export interface NativeProps extends ViewProps {
226
266
  * Auto-capitalization behavior.
227
267
  */
228
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;
229
279
  /**
230
280
  * Whether the input supports multiple lines.
231
281
  * @default true
@@ -303,6 +353,7 @@ export interface NativeProps extends ViewProps {
303
353
  onChangeText?: CodegenTypes.DirectEventHandler<OnChangeTextEvent>;
304
354
  onChangeMarkdown?: CodegenTypes.DirectEventHandler<OnChangeMarkdownEvent>;
305
355
  onChangeSelection?: CodegenTypes.DirectEventHandler<OnChangeSelectionEvent>;
356
+ onInputKeyPress?: CodegenTypes.DirectEventHandler<OnKeyPressEvent>;
306
357
  onChangeState?: CodegenTypes.DirectEventHandler<OnChangeStateEvent>;
307
358
  onInputFocus?: CodegenTypes.DirectEventHandler<TargetedEvent>;
308
359
  onInputBlur?: CodegenTypes.DirectEventHandler<TargetedEvent>;
@@ -312,6 +363,7 @@ export interface NativeProps extends ViewProps {
312
363
  onContextMenuItemPress?: CodegenTypes.DirectEventHandler<OnContextMenuItemPressEvent>;
313
364
  onLinkDetected?: CodegenTypes.DirectEventHandler<OnLinkDetected>;
314
365
  onMathPress?: CodegenTypes.DirectEventHandler<OnMathPressNativeEvent>;
366
+ onPaste?: CodegenTypes.DirectEventHandler<OnPasteEvent>;
315
367
  onStartMention?: CodegenTypes.DirectEventHandler<OnStartMentionEvent>;
316
368
  onChangeMention?: CodegenTypes.DirectEventHandler<OnChangeMentionEvent>;
317
369
  onEndMention?: CodegenTypes.DirectEventHandler<OnEndMentionEvent>;
@@ -336,12 +388,21 @@ interface NativeCommands {
336
388
  toggleUnderline: (viewRef: React.ElementRef<ComponentType>) => void;
337
389
  toggleStrikethrough: (viewRef: React.ElementRef<ComponentType>) => void;
338
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;
339
399
  setLink: (viewRef: React.ElementRef<ComponentType>, url: string) => void;
340
400
  insertLink: (
341
401
  viewRef: React.ElementRef<ComponentType>,
342
402
  text: string,
343
403
  url: string
344
404
  ) => void;
405
+ insertText: (viewRef: React.ElementRef<ComponentType>, text: string) => void;
345
406
  insertMention: (
346
407
  viewRef: React.ElementRef<ComponentType>,
347
408
  displayText: string,
@@ -368,6 +429,11 @@ interface NativeCommands {
368
429
  start: CodegenTypes.Int32
369
430
  ) => void;
370
431
  copyToClipboard: (viewRef: React.ElementRef<ComponentType>) => void;
432
+ resolvePaste: (
433
+ viewRef: React.ElementRef<ComponentType>,
434
+ text: string,
435
+ markdown: string
436
+ ) => void;
371
437
  requestMarkdown: (
372
438
  viewRef: React.ElementRef<ComponentType>,
373
439
  requestId: CodegenTypes.Int32
@@ -389,8 +455,14 @@ export const Commands: NativeCommands = codegenNativeCommands<NativeCommands>({
389
455
  'toggleUnderline',
390
456
  'toggleStrikethrough',
391
457
  'toggleSpoiler',
458
+ 'toggleHeading',
459
+ 'toggleUnorderedList',
460
+ 'toggleOrderedList',
461
+ 'indentList',
462
+ 'outdentList',
392
463
  'setLink',
393
464
  'insertLink',
465
+ 'insertText',
394
466
  'insertMention',
395
467
  'startMention',
396
468
  'removeLink',
@@ -398,6 +470,7 @@ export const Commands: NativeCommands = codegenNativeCommands<NativeCommands>({
398
470
  'updateMath',
399
471
  'removeMath',
400
472
  'copyToClipboard',
473
+ 'resolvePaste',
401
474
  'requestMarkdown',
402
475
  'requestCaretRect',
403
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;
@@ -240,6 +277,14 @@ export interface SelectionMenuConfig {
240
277
  // Precomputed plural templates indexed by image count (0..100). Empty when no
241
278
  // pluralLabels are set; native then uses copyImageUrlLabel/copyImageUrlsLabel.
242
279
  copyImageUrlPluralTemplates: ReadonlyArray<string>;
280
+ // false removes the Copy item from the text and block menus.
281
+ copyEnabled: boolean;
282
+ // true: Copy writes Markdown (plain text) instead of rich text / raw block content.
283
+ copyFormatMarkdown: boolean;
284
+ // true: the text selection menu drops every system-provided item.
285
+ systemItemsNone: boolean;
286
+ // false hides the copy button in the code block header.
287
+ codeBlockCopyButton: boolean;
243
288
  }
244
289
 
245
290
  export interface OnContextMenuItemPressEvent {
@@ -311,10 +356,16 @@ export interface Md4cFlagsInternal {
311
356
  * @default false
312
357
  */
313
358
  highlight: boolean;
359
+ /**
360
+ * Treat soft breaks (single newlines) as hard breaks (visible line breaks).
361
+ * @default false
362
+ */
363
+ hardSoftBreaks: boolean;
314
364
  }
315
365
 
316
366
  interface StreamingConfigInternal {
317
367
  tableMode: string;
368
+ codeBlockMode: string;
318
369
  }
319
370
 
320
371
  export interface NativeProps extends ViewProps {
@@ -345,6 +396,21 @@ export interface NativeProps extends ViewProps {
345
396
  * Receives the 0-based task index, current checked state, and the item's plain text.
346
397
  */
347
398
  onTaskListItemPress?: CodegenTypes.BubblingEventHandler<TaskListItemPressEvent>;
399
+ /**
400
+ * Controls whether tapping a task list checkbox toggles its checked state.
401
+ *
402
+ * When `false`, the tap is fully inert: no visual toggle and no
403
+ * `onTaskListItemPress` emission. Text selection and links are unaffected.
404
+ *
405
+ * @default true
406
+ */
407
+ enableTaskListItemToggle?: CodegenTypes.WithDefault<boolean, true>;
408
+ /**
409
+ * Callback fired when code is copied from a fenced code block's header copy
410
+ * button, its long-press context-menu "Copy" action, or the VoiceOver copy
411
+ * action. Receives the copied code and its language.
412
+ */
413
+ onCopyPress?: CodegenTypes.BubblingEventHandler<CopyPressEvent>;
348
414
  /**
349
415
  * Controls whether the system link preview is shown on long press (iOS only).
350
416
  *
@@ -424,10 +490,18 @@ export interface NativeProps extends ViewProps {
424
490
  * @default 'particles'
425
491
  */
426
492
  spoilerOverlay?: CodegenTypes.WithDefault<string, 'particles'>;
493
+ /**
494
+ * Hides the text selection context menu while keeping text selectable.
495
+ */
496
+ contextMenuHidden?: CodegenTypes.WithDefault<boolean, false>;
427
497
  /**
428
498
  * Custom items to show in the text selection context menu.
429
499
  */
430
500
  contextMenuItems?: ReadonlyArray<Readonly<ContextMenuItemConfig>>;
501
+ /**
502
+ * HTTP headers attached to remote image requests, as name/value pairs.
503
+ */
504
+ imageRequestHeaders?: ReadonlyArray<Readonly<ImageRequestHeaderInternal>>;
431
505
  /**
432
506
  * Built-in items to show in the text selection context menu.
433
507
  */