π Bug report β [iOS] Combined bold+italic (***) wrapping a strikethrough leaves a literal ***
Bug summary
On iOS, when an EnrichedMarkdownTextInput is given markdown where a combined bold+italic run (***) directly wraps a strikethrough (β¦), the closing *** is not consumed β it shows up as literal text in the input. The word itself is still styled, but a stray *** is left after it.
This is the exact markdown the input serializes for a bold+italic+strikethrough selection, so its own output does not survive a round-trip (serialize β set back via defaultValue/setValue).
Input markdown:
tes
Expected: the word tes rendered as bold + italic + strikethrough.
Actual (iOS): tes is styled, but a literal *** appears after it (visible content becomes tes***).
Android: renders correctly β no stray ***.
The trigger is specific to *** immediately adjacent to ~~. In isolation, bold, italic, strike, and even bolditalic (without an adjacent strikethrough) all work fine.
Library version
0.7.3
Environment info
Expo (bare workflow) project, so react-native info isn't available β output of npx expo-env-info:
expo-env-info 2.1.0 environment info:
System:
OS: macOS 26.4.1
Shell: 5.9 - /bin/zsh
Binaries:
Node: 20.19.4
Yarn: 4.12.0
npm: 10.8.2
Watchman: 2026.03.30.00
Managers:
CocoaPods: 1.16.2
SDKs:
iOS SDK:
Platforms: DriverKit 25.4, iOS 26.4, macOS 26.4, tvOS 26.4, visionOS 26.4, watchOS 26.4
IDEs:
Xcode: 26.4/17E192
npmPackages:
expo: ^55.0.0 => 55.0.26
react: 19.2.0 => 19.2.0
react-native: 0.83.6 => 0.83.6
Expo Workflow: bare
Reproduced on the iOS 26.4 simulator (iPhone 17). New Architecture enabled.
Steps to reproduce
- Render an EnrichedMarkdownTextInput seeded with the combined markdown:
- import { EnrichedMarkdownTextInput } from "react-native-enriched-markdown";
- export default function App() {return ;}
(The same happens via the imperative API: ref.current?.setValue("tes").)
- Run on iOS and look at the input.
- Result: the word is styled (bold + italic + strikethrough) followed by a literal ; the input's content is tes instead of tes. On Android the same input renders correctly.
- The same is observable Any time more than 1 style is applied to the input
- e.g Bold + italic will return test*
- Bold + strikethrough will return test**
- strikethrough + italic will return test*
- Similarly an issue can be observed with links, as they seem to get double wrapped, so:
[Testing](http://example.com) turns into [Testing](https://[Testing](http://example.com))
Reproducible example repository
Reproduces with the single component above in a fresh app β no repository needed:
π Bug report β [iOS] Combined bold+italic (***) wrapping a strikethrough leaves a literal ***
Bug summary
On iOS, when an EnrichedMarkdownTextInput is given markdown where a combined bold+italic run (***) directly wraps a strikethrough (
β¦), the closing *** is not consumed β it shows up as literal text in the input. The word itself is still styled, but a stray *** is left after it.This is the exact markdown the input serializes for a bold+italic+strikethrough selection, so its own output does not survive a round-trip (serialize β set back via defaultValue/setValue).
Input markdown:
tesExpected: the word tes rendered as bold + italic + strikethrough.
Actual (iOS): tes is styled, but a literal *** appears after it (visible content becomes tes***).
Android: renders correctly β no stray ***.
The trigger is specific to *** immediately adjacent to ~~. In isolation, bold, italic,
strike, and even bolditalic (without an adjacent strikethrough) all work fine.Library version
0.7.3
Environment info
Expo (bare workflow) project, so react-native info isn't available β output of npx expo-env-info:
expo-env-info 2.1.0 environment info:
System:
OS: macOS 26.4.1
Shell: 5.9 - /bin/zsh
Binaries:
Node: 20.19.4
Yarn: 4.12.0
npm: 10.8.2
Watchman: 2026.03.30.00
Managers:
CocoaPods: 1.16.2
SDKs:
iOS SDK:
Platforms: DriverKit 25.4, iOS 26.4, macOS 26.4, tvOS 26.4, visionOS 26.4, watchOS 26.4
IDEs:
Xcode: 26.4/17E192
npmPackages:
expo: ^55.0.0 => 55.0.26
react: 19.2.0 => 19.2.0
react-native: 0.83.6 => 0.83.6
Expo Workflow: bare
Reproduced on the iOS 26.4 simulator (iPhone 17). New Architecture enabled.
Steps to reproduce
(The same happens via the imperative API: ref.current?.setValue("
tes").)[Testing](http://example.com) turns into [Testing](https://[Testing](http://example.com))Reproducible example repository
Reproduces with the single component above in a fresh app β no repository needed: