Skip to content

Bug Report - Setting value through ref causes extra delimiters to appear in the text input for iosΒ #516

Description

@ArnoldsManguzis

πŸ› 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***).

Image

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:

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions