live_markdown_editor 0.1.0
live_markdown_editor: ^0.1.0 copied to clipboard
A source-preserving Flutter Markdown editor with raw, live, and read modes.
live_markdown_editor #
A source-preserving, Obsidian-inspired Markdown editor for Flutter with Raw, Live, and Read modes. It uses Flutter's foundation, services, widgets, and rendering layers only: no Material, Cupertino, third-party runtime package, filesystem, network, or URL launcher is required.
Quick start #
final controller = MarkdownEditorController(
text: '# Notes\n\n- [ ] Ship the editor',
);
LiveMarkdownEditor(
controller: controller,
onChanged: (markdown) => saveMarkdown(markdown),
onLinkTap: (url) => handleLinkInYourApp(url),
)
The host owns and must dispose the controller. The editor never persists
Markdown or opens links by itself. controller.text is always the source of
truth and round-trips unchanged between modes.
Modes #
MarkdownEditorMode.rawdisplays and edits literal Markdown source.MarkdownEditorMode.liveformats Markdown while revealing syntax at the active selection and preserving editable source offsets.MarkdownEditorMode.readremoves delimiters, remains selectable, calls the host for links, and keeps tasks interactive.
Change mode with controller.mode = MarkdownEditorMode.read. Selection, undo
history, and scroll position are retained across mode changes.
Commands and typing #
Semantic commands create atomic, undoable edits:
controller.execute(MarkdownCommand.bold);
controller.execute(MarkdownCommand.link, argument: 'https://example.com');
controller.undo();
controller.redo();
MarkdownEditingBehavior independently configures delimiter pairing,
selection wrapping, smart list continuation, fenced-code completion, and list
indentation. IME composing edits bypass Markdown transformations.
Replaceable controls #
Non-text UI is supplied through immutable builders. Applications can replace the default widgets entirely:
LiveMarkdownEditor(
controller: controller,
componentBuilders: MarkdownEditorComponentBuilders(
taskToggleBuilder: (context, task) => MyTaskWidget(
checked: task.checked,
onChanged: task.onToggle,
),
),
)
Task context includes its exact SourceRange, direction, state, theme, enabled
state, and atomic toggle callback. Selection-handle and context-menu builders
are also part of the component configuration contract.
Low-level editable foundation #
MarkdownEditableText is the shared Raw, Live, and Read rendering engine and is
also available for hosts that need the package-owned text surface directly. Its
practical API follows Flutter's EditableText inputs,
but it does not instantiate EditableText, RenderEditable, Material, or
Cupertino. It owns the delta text-input connection, source-safe selection and
clipboard behavior, semantics, scrolling, text layout, inline children, and
link recognizers, per-line direction, and renderer-owned block decorations.
Pass a MarkdownTextProjection to define visible, hidden, atomic-widget, and
decoration source ranges. Omitting it selects identity behavior. All mapping is
UTF-16 based to match TextEditingValue; grapheme navigation still uses
Flutter's Unicode boundaries. See the
API compatibility ledger for the
supported contract and deliberate differences.
Direction #
directionMode supports fixed LTR, fixed RTL, document-level Auto, and Aware.
Aware is the default. Raw, Live, and Read shape every hard source line with its
own first-strong bidi base while retaining one continuous source, IME,
hit-testing, and selection model. Logical alignment is resolved independently
from shaping. Direction detection ignores Markdown markers,
digits, whitespace, punctuation, and symbols; neutral Read lines inherit the
prior line and then use fallbackDirection.
Supported in 0.1 #
Paragraphs, ATX H1-H6, bold, italic, strikethrough, highlights, inline code, Markdown links, blockquotes, ordered and unordered lists, nested tasks, fenced code blocks, and horizontal rules.
Wikilinks, embeds, properties, comments, callouts, tables, math, footnotes,
HTML, and tags are intentionally future work. See the
compatibility ledger and
performance notes. The complete framework-neutral demo
is in example/.
License #
MIT. Contributions are welcome; see CONTRIBUTING.md.