Skip to content

Document model ​

Own virtual document kernel for on-codemerge. No ProseMirror / TipTap / Lexical / BlockNote / Slate / CKEditor as foundation.

Source of truth ​

EditorState = { doc, selection } in memory. DOM is a projection. All writes go through dispatch(transaction | command).

Dependency verdict (R0) ​

CandidateVerdict
ProseMirror / TipTap / Lexical / …Forbidden as editor core
dompurifyAccepted for HTML import/paste sanitization only
yjsDeferred — custom binding later; not y-prosemirror
edixRejected for now — experimental; own InputBridge covers typing
selection-rangesRejected for now — own path/offset mapping
rope-sequenceDeferred — own tree + structural sharing sufficient for Phase 0–2

JSON shape ​

json
{
  "version": 1,
  "doc": {
    "type": "doc",
    "content": [
      {
        "type": "paragraph",
        "id": "p1",
        "content": [{ "type": "text", "text": "Hello", "marks": [{ "type": "bold" }] }]
      }
    ]
  }
}

Layers ​

  • packages/kernel — pure model (no DOM); published as on-codemerge/kernel
  • src/view — reconcile + input bridge
  • src/platform — sealed extensions
  • src/io — JSON / HTML / Markdown adapters (importHTML, exportMarkdown, … on on-codemerge)
  • src/editor — public Editor facade
  • packages/sdk — definePlugin, UI services (on-codemerge/sdk) — SDK reference

Boundaries ​

APIRole
getJSON / setJSONSource of truth
getHTML / setHTMLSemantic HTML (atoms as empty data-node)
getMarkdown / setMarkdownMarkdown subset
getPublishedHTML / getPublishedDocumentHydrated public pages

Details and headless helpers: Editor API.

TDD ​

All kernel modules have __tests__. Red → green → refactor. pnpm test required before release.

Released under the MIT License.