@openeditor/react-native-prose-editor
v0.0.32
Published
OpenEditor-owned native rich text editor engine for React Native
Readme
React Native Prose Editor 
@openeditor/react-native-prose-editor is a native rich text editor for React Native with a Rust document core, native iOS and Android rendering, configurable schemas, and a React-facing toolbar and theme API.
This project is currently in alpha and the API, behavior, and packaging may still change.
This repository contains three main pieces:
- the editor package itself under
src,ios,android, andrust - an Expo SDK 54 development app under
example - a runnable iOS XCTest harness for native regression coverage
Features
The editor already supports:
- HTML and ProseMirror JSON content input/output
- configurable schemas
- marks such as bold, italic, underline, strike, and links
- blockquotes
- bullet and ordered lists with indent/outdent behavior
- hard breaks and horizontal rules
- native @-mentions with themed suggestion UI in the toolbar area
- native theming for text, lists, horizontal rules, mentions, and the toolbar
- configurable toolbar items, including app-defined actions
- auto-grow height behavior for parent-managed scroll containers
- a Rust-backed undo/redo history model
Repository Layout
src: React Native component API, toolbar, schemas, and TypeScript typesios: iOS native view, toolbar accessory, rendering bridge, and generated Rust bindingsandroid: Android native view, rendering bridge, and Expo module wiringRust Editor Core: document model, transforms, schema system, selection, history, serialization, and testsexample: Expo 54 app for manual QA and development
This package now lives inside the OpenEditor monorepo. Documentation is being consolidated here while the old standalone fork is retired.
Installation
This package currently requires Expo Modules. Use it in an Expo development build or in a bare React Native app that has Expo Modules configured.
The minimum tested Expo version is SDK 54.
Required peer dependencies:
exporeactreact-native@expo/vector-icons
Install the package:
npm install @openeditor/[email protected]Expo prebuild apps should add the package config plugin so Android excludes obsolete JNA ABI copies that modern NDKs cannot strip:
export default {
expo: {
plugins: ['@openeditor/react-native-prose-editor'],
},
};For bare React Native apps or existing generated Android projects, add the same
packaging exclude to android/gradle.properties when your template applies
android.packagingOptions.* properties:
android.packagingOptions.excludes=**/armeabi/libjnidispatch.so,**/mips/libjnidispatch.so,**/mips64/libjnidispatch.soIf your Android project does not read those Gradle properties, add the patterns
directly under the app module's android.packagingOptions.jniLibs.excludes.
For local package development in this repo:
npm install
npm --prefix example install
npm run example:prebuildThe installation details in this README are the current source of truth while package documentation is consolidated into the monorepo.
Basic Usage
import React, { useRef } from 'react';
import {
NativeRichTextEditor,
type NativeRichTextEditorRef,
} from '@openeditor/react-native-prose-editor';
export function EditorScreen() {
const editorRef = useRef<NativeRichTextEditorRef>(null);
return (
<NativeRichTextEditor
ref={editorRef}
initialContent="<p>Hello world</p>"
placeholder="Start typing..."
onContentChange={(html) => {
console.log(html);
}}
/>
);
}Customization
The main extension points today are:
schema: provide a custom schema definitiontheme: style text blocks, blockquotes, lists, horizontal rules, background, and toolbar chrome, including a native-looking keyboard toolbar modetoolbarItems: define the visible toolbar controls and orderonToolbarAction: handle app-defined toolbar buttonsonRequestLink: collect or edit hyperlink URLs when a toolbar link item is pressedaddons: configure optional features like @-mentionsheightBehavior: switch between internal scrolling and auto-grow
For setup and customization details, use this README and the package source as the current source of truth while documentation is consolidated into the monorepo.
For whole-document JSON loads, initialJSON, controlled valueJSON, and setContentJson() will normalize an empty root document like { type: 'doc', content: [] } to the active schema's empty text block so block-constrained schemas still load a valid empty document. For chat composer or draft-reset flows, prefer the ref method clearContent().
Development
Common commands:
npm run typecheck
npm run bench:rust -- --quick
npm run example:start
npm run example:ios
npm run example:android
npm run build:rustTests:
npm test # TypeScript unit tests
cargo test --manifest-path rust/editor-core/Cargo.toml # Rust core tests
npm run android:test # Android Robolectric tests
npm run android:test:device # Android device integration tests
npm run ios:test # iOS simulator integration tests
npm run ios:test:device # iOS device integration testsBenchmarks:
npm run bench:rust -- --quick
npm run bench:rust -- --filter collaboration
npm run bench:rust -- --json > perf-results.jsonDocumentation
The native ownership rules are normative and documented in
docs/native-editor-architecture.md.
Project Status
The project is usable and already covers the core editing flows, but the API and documentation are still evolving as the package moves toward wider use.
