About this project

Arranger is an open-source, declarative rich text editor engine and UI ecosystem for Compose Multiplatform. The README positions it as a foundational framework for building full-featured text editing experiences on Compose, comparable in role to ProseMirror or Lexical. It provides out-of-the-box paragraph formatting, dynamic enter-key strategies, semantic attribute querying, atomic undo/redo, and upcoming Markdown/WYSIWYG interoperability. The project is explicitly marked as work in progress: APIs are unstable and may change without notice; feedback, feature requests, and bug reports are invited via GitHub Issues. Platform support: Android API Level 26+, Desktop JVM on macOS, Windows, and Linux, iOS, and Web via WasmJs. Requirements list Kotlin 2.4.10+. Arranger is published to Maven Central under dev.mkeeda.arranger; artifacts include arranger-richtext-editor, arranger-richtext, arranger-richtext-markdown, arranger-richtext-html, and arranger-richtext-editor-material3 for Material 3 style resolution. Capabilities include type-safe custom attributes such as SpanStyle and domain keys like Mention, Hashtag, and LinkKey; high-level editor behaviors covering headings, blockquotes, alignments, bullet and ordered lists; a declarative mutation DSL for atomic text and formatting operations; semantic Runs for iterating, searching, and batch editing chunks with identical attributes; and Markdown/HTML import-export converters between RichString and those formats. Compose integration separates headless RichTextState from RichTextEditor UI rendering across supported targets. Editor examples cover dynamic typing that maintains existing spans, advanced paragraph formatting, bullet and ordered lists with automatic markers and indentation, custom ListMarkerResolver, and EnterKeyStrategy options: InheritParagraphStrategy, ListEnterStrategy, and HeadingEnterStrategy. Hyperlinks use LinkKey with automatic styling and LocalUriHandler navigation, plus UrlParser and detectAndApplyLinks for auto-linking. Custom attributes can be mapped to Compose styles via AttributeStyleResolver. Searching and batch editing use rangesOf, editAll, and runs(key) or runs with a predicate. Mutations such as insert, delete, and replace are performed inside RichTextState.edit with automatic span shifting. Potential uses include rich text editing, note-taking, document editing, or messaging interfaces built with Compose Multiplatform. The README includes installation snippets for Kotlin Multiplatform commonMain and Android-only projects, along with sample composables and demo images. No performance claims or benchmarks are provided in the README.