Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
2.9.2 - 2026-11-08
on-codemerge 2.9.2 and @codemerge/sdk 2.9.1; the other packages are unchanged.
Fixed
- Dark theme gaps: Markdown preview text (
prose-invert), info / warn / error callouts, chart images and mermaid diagrams (baked light palette), track-changes and mention marks,<mark>, danger buttons in Charts / Calendar, plus FormBuilder, Language, Responsive, Templates, File upload, Image and Collaboration panels that used fixed gray / blue classes instead ofocm-*tokens - Tailwind
dark:variants follow the hosthtml.dark(@custom-variant), not the OS setting - Chart previews, chart widgets and mermaid diagrams repaint when the host flips
html.dark; published HTML keeps the light chart
Added
@codemerge/sdk:isDarkHost()andonColorSchemeChange(cb)demo/: dark theme andpnpm screenshots(light + dark README images from the real stand)
Changed
- README rewritten: all eight editors, light/dark screenshots, packages, develop flow
2.9.1 - 2026-11-08
on-codemerge and @codemerge/integrate 2.9.1; the other packages stay 2.9.0 / 3.0.0.
Fixed
on-codemerge/pluginstypes:dist/apps/wysiwyg/src/plugins.d.tsre-exported itself (Circular definition of import aliaswithskipLibCheck: false)@codemerge/integrate/jquery:registerJQueryPlugin($)accepts a realJQueryStaticwithout a cast@i18n-micro/runtime^2.1.0: its declarations resolve undermoduleResolution: nodenext- Docs: sidebar no longer stacks above the page on the built site; long words wrap on phones
Changed
check:packalso type-checks a consumer project that imports every typed entrypoint of the unpacked tarballs (skipLibCheck: false, nodenext + bundler)demo/: real Vite tsconfig and atypecheckscript
2.9.0 - 2026-11-08
@codemerge/collaboration-server 3.0.0 (breaking, see below); everything else 2.9.0.
Breaking
- collaboration-server: REST reads the token only from
Authorization: Bearer;?token=is ignored - collaboration-server: the
commentrole can no longer submit document ops (reject readonly, REST 403) @ocm/wysiwyg/utils/*deep imports removed — use@codemerge/sdk/@codemerge/view/@codemerge/kernel
Added
- Collaboration: client-side OT rebase of offline edits on reconnect (
join { sinceVersion, clientId }, duplicate-submit guard) - Hotkeys: Footnotes
Mod-Alt-x, TemplatesMod-Alt-s
Changed
- Markdown "clear styles" (
stripInlineMarkdown) rewritten as a CommonMark block + inline parser (verified on all 652 spec examples and ~10^6 fuzzed documents against commonmark.js) - Table sort/filter renders merged cells unmerged while active
- AI Assistant drivers use chat completions
- Docs site moved from VitePress to Nuxt + Nuxt Content + Nuxt UI: new sections (Getting started, Editors, Plugins by group, Integrate by stack, Architecture, Changelog), search, live demos kept; old
/guide/*URLs changed - Release gate: new
check:packpacks every package and runs attw on the tarball
Fixed
- Package types resolve under
moduleResolution: node16/nodenext: relative imports in.d.tscarry.js, every.d.tshas a.d.ctstwin,@codemerge/sdk/iconsdeclares icons asstringinstead of re-exporting unshipped.svgfiles - Full audit pass: listener/disposer leaks (toolbar, popups, code workspace), WS payload limit, Escape no longer swallowed when nothing is dragged, PDF embed handler result, assorted plugin edge cases
2.8.0 - 2026-10-07
Added
- First publish of
@codemerge/integrate: host adapters (React/Vue/Vue2/Svelte/jQuery/Alpine),<ocm-editor>,/mountaliases, persistence + nativepostMessagebridge, Next/Nuxt/SvelteKit helpers - Integrate docs family guides: host config, persistence, server+Vite, meta SSR, native bridge
Changed
- Integrate package surface flattened (no scaffold CLI); docs examples match real exports and
ready/CSS side-effect rules
2.7.4 - 2026-10-06
Changed
- ViewSpec
mount.updatepatches keyed nodes instead of wiping the tree; CE atom hosts stay alive across sibling edits; table cells reuse DOM (rowId/colId) - Shared SDK helpers: frame scheduler, window-drag AbortSignal, embed session store,
isEditingInside, one embed workspace host
Fixed
- Editor host
keydownis unbound on destroy; table column-resize listeners abort with the grid; Json tree no longer polls the context menu
2.7.3 - 2026-10-05
Added
- Tables cell edit: multiline textarea (
Shift+Enternewline); HTML/GFM emit<br>;getMarkdown/setMarkdown(getMd/setMd) on the tables editor - Sheet rows grow with wrapped cell lines; HTML preview cells are
min-heightso<br>is not clipped
Fixed
- Docs tables host: bottom-right resize grip (native SE ticks, translucent)
- Cell click starts edit and focuses the field (dark theme uses accent/input tokens, not sky-50)
- Enter commits and opens the next row for typing; quoted TSV paste keeps newlines inside a cell
2.7.2 - 2026-10-05
Fixed
- Stretch fit no longer overflows horizontally (account for row-index + add-column gutters)
- Sheet HTML themes (
table-modern/bordered/striped) match the grid look in published CSS + docs preview - Large tables: sheet extent no longer capped below SoT row count (bottom rows were unreachable)
2.7.1 - 2026-10-05
Added
- Demo stand mode for Tables (
on-codemerge/tables)
Changed
- Repo tooling docs: install, scripts, and publish are pnpm-only (
pnpm run releasedoes not bump versions)
Fixed
- Tables HTML preview follows
view.fit: Stretch fills host width, Fixed keeps stored column widths; toolbar + status chip to switch - Tables workspace sheet stays in a bounded host (internal scroll); docs demo can be resized vertically
2.7.0 - 2026-10-05
Added
- Tables Editor sparse Excel-like sheet (
TableGridDocv2): used SoT only,getHTML(), rename column headers, add columns on demand (+/ toolbar / paste) - WYSIWYG Insert Table mounts the same
tableGridsheet as a sized, scrollable, resizable prose atom (Resizer); HTML/Markdown interchange as<table>/ GFM - Shared platform helpers on
@codemerge/sdk(icons, ColorWell, Resizer,safeHtml,atomPath) and@codemerge/view(asAttr, clipboard,domHtml);ParseError/parseJsonPayloadon@codemerge/kernel
Changed
- TablePlugin store is a thin cache: mutations in
grid/ops.ts, viewport window in the view, no ghost columns on the right - Plugins import platform from
@codemerge/sdk/@codemerge/kernel/@codemerge/view(not@ocm/wysiwyg/utils)
Fixed
- Sheet viewport still paints while a cell is being edited, so scroll/resize cannot hide columns behind the row-index gutter
2.6.0 - 2026-10-03
Fixed
- Publish packaging: drop broken
package.jsonimports(pointed at missing.tssources)
Changed
- Plugins are private workspace packages (
plugins/*→@ocm/*-plugin, source exports like@codemerge/editor; not published) - Library CSS: virtual
virtual:ocm-package-index.cssauto-collects each pluginexports["./style.scss"]→dist/index.css(+public.css/tailwind.css); JS entries do not side-effect-import styles.@codemerge/mermaidtypes stay external via dtsexclude/aliasesExclude - Internal TS imports use
@ocm/*-plugin; barrel@ocm/plugins; pluginexports././*→./*.ts/./style.scss; Vite aliases fromplugins/*/package.json;sideEffectstrimmed to real assets
Breaking
- Removed
on-codemerge/plugins/*/style.cssandon-codemerge/sdk.css— useon-codemerge/index.css(+public.css) and@codemerge/sdk/sdk.csswhen needed
2.5.1 - 2026-10-03
Fixed
Editor.destroy()clears host chrome tokens it applied (applyHostChrome/clearHostChrome), so remounting on the same host (e.g. page → bar) no longer leaks page chrome layout
2.5.0 - 2026-10-03
Added
- Calendar Editor surface:
apps/calendar→ public entryon-codemerge/calendar(+ docs Guide / live preview) - Forms Editor / Charts Editor surfaces:
on-codemerge/forms,on-codemerge/charts(+ docs Guide / live previews) @codemerge/view— zero-dep ViewSpec DOM runtime (h/mount/ portal /DisposableScope); alsoon-codemerge/view- Opt-in Editor
diagnostics.onMeasurefor dispatch / view.update / toolbar.refresh timings @codemerge/mermaid— sync Mermaid-subset SVG renderer (8 types, typed IR, no CDN fonts); hydrate bundled inpublic.js- Opt-in plugin surface
on-codemerge/plugins(individual constructors) - SDK studio layout helpers:
studioPaneTabs,syncStudioPanel,STUDIO_POPUP_CLASS, sharedocm-studio*chrome (mobile pane tabs) - Calendar / FormBuilder / Charts dual-surface (
atom+workspace) with shared studio UI, drivers, IO adapters, default toolbars - Thin ICS import/export for Calendar (JSON
CalendarDocremains SoT) ConstrainedEditorfacade for surface apps (fixed root node type)- Shared
ParseError/parseJsonPayloadin@ocm/wysiwyg/utils/parseSoT - History undo/redo toolbar seeded from
@codemerge/editor(kernel history) check:calendar-export/check:calendar-typesgates inprepublishOnly- Per-plugin locale packs wired via
wirePluginLocalesfor many plugins
Changed
- Calendar / Charts / FormBuilder rewritten around payload SoT + driver registries (legacy managers/renderers removed)
- History / Forms / Charts / Calendar popups use shared studio popup class + responsive pane tabs
- Empty default toolbars are no longer applied (avoids blank chrome)
createCorePluginsbuilds an explicit lean list (no construct-all-then-filter)- Calendar ICS/JSON import enforces
MAX_CALENDAR_BYTES(2MB) - Root
on-codemergeentry no longer re-exports every plugin constructor (usecreateDefaultPluginsoron-codemerge/plugins)
Breaking
- History chrome is always on via editor seed — there is no
features.historyChrome/HistoryChromePlugin - Surface
app.tspublic APIs shrunk (Calendar/Charts/Forms/Json/Code/Markdown): prefer Editor + plugin entry points; middleman barrels (io/index,drivers/index) removed ParseErrorfor surface text IO lives under@ocm/wysiwyg/utils/parseSoT(not re-exported from every pluginiobarrel)- Plugin constructors moved off the root entry →
import { XPlugin } from 'on-codemerge/plugins' mermaid/@crafter/mermaidruntime removed — diagrams render with@codemerge/mermaid(subset of types; unsupported →data-ocm-mermaid-error)on-codemerge/public-mermaid.jsremoved (hydrate lives inpublic.js)
Fixed
- Docs Calendar preview: export
coerceCalendarDocfromapps/calendarapp entry - Studio desktop layout: avoid
is-studio-hiddenleak at ≥64rem ensureNodeIdsno longer writesattrs: undefinedfor empty attr bags- Root
requiretypes for./forms/./charts/./calendaremit.d.cts
Notes
- Publish:
pnpm run release(includes forms/charts/calendar lib build + export gates) - Local SPAs:
pnpm dev:forms/dev:charts/dev:calendar
2.4.0 - 2026-09-30
Added
- Published low-level packages under
@codemerge/*(product install unchanged:on-codemerge):@codemerge/kernel— headless doc / ops / selection@codemerge/sdk— plugin API + UI primitives (+sdk.css)@codemerge/hunspell— spell engine (NOTICEin tarball)@codemerge/collaboration-server— collaboration server (protocol v2)
- Workspace rename:
@on-codemerge/*→@codemerge/*(internal only) pnpm run build:packages+ release filter order for scoped packages- pnpm catalog for shared dependency versions; internal links use
workspace:^ publint --strictfor every publishable package (check→ scoped;publint/prepublishOnly→ + root)- Published package builds: per-package
vite buildvia pnpm workspace filters (no tsup / orchestrator scripts) - Collab stack rewrite (protocol v2)
- Kernel:
ensureNodeIds,transformOp/rebaseOps; editortransactionevent +dispatch(tr, { source: 'remote' }) @codemerge/collaboration-server@2.0.0: TypeScript authoritative op-log, CLI (serve/compact/inspect), embed API, static+JWT auth, SQLite/memory stores, Postgres adapter, Redis fanout, REST, webhooks, presence, comments, versionsCollaborationPlugin: FSM client, reconnect, offline IndexedDB queue, presence avatars, toolbar sync chip (align: end), share URL =?docId=only,getCollaborationHandle, no dispatch monkey-patch
- Kernel:
- SDK toolbar:
align: 'end'+ customviewfor trailing chrome (MD preview busy + collab status)
Breaking
- Demo collab protocol v1 (
join/ops+ token on every message,server.js) removed - Default WS path is
/collab; useCollaborationPlugin({ serverUrl: 'ws://host:8787/collab', getToken })
Notes
on-codemergestill bundles kernel/sdk/hunspell (Phase A). Do not mix standalone@codemerge/sdkwithon-codemergein one app bundle.@codemerge/editorandapps/*remain private; plugins stay inside the monolith.- Phase B/C (declare deps / Vite externalize) deferred.
- Publish:
pnpm run release(check + npm publish of scoped packages + root)
2.3.0 - 2026-09-30
Added
- Media gallery shared UI for Image / FileUpload: search, refresh, grid/list, delete
- Image insert modal with crop before insert; gallery + upload wired through media API
- Media API helpers (
list/upload/delete) and optionalendpoints.deleteon upload config - Markdown remote preview: busy spinner in toolbar (SDK
ToolbarButtonalign+view) - Docs DEV API (VitePress
configureServeronly): media/files/md-preview againstdocs/.vitepress/dev-api/uploads/
Changed
- ImagePlugin no longer ships a separate
ImageUploader; uses FileUpload media stack - SDK toolbar buttons support end-aligned custom views (e.g. MD preview spinner)
Fixed
- ChartMenu: clear preview/
setTimeout/rAFon popup dispose (no leftover deferred callbacks) charts-plugin.md: broken 4-backtick fences that could trip VitePress local-search Shiki WASM (memory access out of bounds)
2.2.0 - 2026-09-29
Added
- Code Editor surface:
apps/code→ public entryon-codemerge/code(+ docs Guide / plugin demos) - Source contour in
@codemerge/editor:mountSourceEditor, shared lexer/highlight (highlightHtml/lex) — used by CodeBlock, Json raw, Markdown source - In-house Hunspell (
@codemerge/hunspell): typed.aff/.dicengine (createDictionary→check/suggest); replacestypo-js - CodeBlock dual-surface (
atom+workspace), IO adapters, chrome toolbar - Markdown dual-pane: draggable middle gutter + coalesced preview / mermaid salvage
- SpellChecker: typographic apostrophe normalize, locale reload while enabled, Cyrillic-aware suggest alphabet from
.affTRY - Source-editor e2e stand + screenshots / stress specs
Changed
- SpellCheckerPlugin loads dictionaries via
@codemerge/hunspell(dictionaries still not bundled — pass URL options) - Removed runtime deps:
typo-js, CodeMirror packages (source editing is in-house) prepublishOnly/ check gates includeon-codemerge/codeexport + hunspell NOTICE attribution (dist/THIRD_PARTY_NOTICES.txt)
Fixed
- Code workspace status counts without banned
textContentassignment - Markdown preview lag with many lines (hash + deferred mermaid hydrate)
2.1.2 - 2026-09-28
Fixed
- Atom host discovery: CE shells emit
data-ocm-type; sharedqueryAtomHosts(); Calendar/Timer persist no longer miss remount after side-channel edits (e.g. calendar stayed on «No events» until unrelated text remount) - Form / CodeBlock host queries aligned with
data-type/data-ocm-type
2.1.1 - 2026-09-28
Fixed
- Markdown Editor publish IO:
getPublishedHTML/getPublishedJS/getPublishedDocumentproject preview HTML (mermaid hosts getdata-ocm-runtime="md-mermaid") - Demo stand depends on npm
on-codemerge@2.1.1again (notfile:..); published iframe loads localpublic.jswhen runtimes are needed
2.1.0 - 2026-09-28
Added
- Multi-surface apps:
apps/wysiwyg,apps/json(on-codemerge/json),apps/markdown(on-codemerge/markdown) + shared@codemerge/editor - Declarative WYSIWYG toolbar menus:
Editoroptiontoolbar.menus/defaultWysiwygToolbarMenus();{ menus: [] }→ flat bar PluginToolbarOpts/pluginToolbarPlacement: optionalmenu/group/orderon insert/review/tools plugin factories (incl. Json/Markdown atom chrome)- Typed SoT attrs: structured
DocNode.attrs(objects/arrays) withattrToHtmlValue/readJsonAttr/coerceHtmlJsonAttron the HTML boundary - ClearStylesPlugin: clear marks + block style/align (selection or whole document);
Mod-\ - Docs: focused plugin demos via
toolbar: { menus: [] }(no flatten/compact flags); Clear Styles + editors guides
Changed
- Overflow menus only from host
toolbar.menus(or plugindefineMenu); missing menu id → button on the bar - Charts / Calendar / Timer / Block / BlockStyle / Form / Footnotes SoT parsers unified on
readJsonAttr; DOM/publish encode viaattrToHtmlValue CalendarManager.importCalendaraccepts typed payload (string still supported for file import)- Kernel scale bench budget softened for CI variance
Removed
flattenOverflowMenus,defaultOverflowMenus, docscompactToolbardemo hacks
2.0.5 - 2026-09-24
Fixed
- Build: externalize runtime dependencies from
dist(correct peer/runtime resolution)
2.0.4 - 2026-09-23
Fixed
- Docs/IO: HTML/Markdown as integrate load path; link import + load tests
- Kitchen-sink HTML coverage for element round-trip
2.0.3 - 2026-09-23
Changed
- Branding / screenshots for v2; integrate guide rewrites across stacks
- Toolbar titles refresh on
setLocale
Fixed
- Demo published preview with local
public.css
2.0.2 - 2026-09-23
Fixed
- Patch release after 2.0.1 (docs/demo follow-ups)
2.0.1 - 2026-09-23
Fixed
- Docs site CSS: VitePress now loads prebuilt
dist/index.css+dist/public.cssso demos get full toolbar / atom chrome (Tailwind content-scan via docs pipeline was incomplete) - Docs
EditorComponentimports editor modules without pulling half-processedsrc/appCSS side-effects
Added
demo/npm stand + Playwright smoke (demo/README.md) against the published package- Package export
on-codemerge/package.jsonfor version probing
2.0.0 - 2026-09-23
Breaking rewrite of the editor around a virtual JSON document, SDK plugin surface, and published-page CSS/JS split. See Migration guide: v1 → v2.
Added
on-codemerge/kernel: document model, operations, selection, transactions (re-exported from the main package)on-codemerge/sdk:definePlugin, ViewSpec UI (h/mount/ portals), popup / toolbar / context-menu / notifyEditor: replacesHTMLEditor; JSON is source of truth (getJSON/setJSON); HTML/MD as boundaries viasrc/io/- Package CSS:
on-codemerge/index.css(editor chrome) +on-codemerge/public.css+on-codemerge/public.js(published page) - Workspace packages:
@codemerge/kernel/@codemerge/sdk(private; bundled intoon-codemerge) - Vitest unit + e2e (untestutils / Playwright);
oxlint+oxfmt; locale parity (check:locales) - Docs: Guide (
editor,sdk,document-model,authoring-plugins, migration), Integrate, Plugins catalog - Redesigned panels: Typography Styles, Font Settings (browser font detect), Block Style Editor (inline ColorWell), Edit History viewer
- Atom alignment via AlignmentPlugin for timer / calendar / form; shared muted atom chrome + left accent stripe
- MathPlugin TeX-subset → AST → MathML (no KaTeX runtime)
Changed
- Plugins register chrome through SDK only — no plugin-owned toolbar DOM /
document.createElement(ban script enforced) - Toolbar chrome owned by Editor / SDK;
ToolbarPlugin()only registers text marks; overflow menusinsert/review/toolsregistered by core - Styling: Tailwind v4 +
@applyin pluginstyle.scss; ColorWell for color UI - SpellChecker:
typo-js; dictionaries not bundled — pass Hunspell URLs via options - i18n: locales under
src/i18n/locales/(en + lazy locales) - Tooling: pnpm workspace, Vite 8 library build (
preserveModules+ocm-packagepost-process), publint gate
Removed
HTMLEditor, oldsrc/core/(DOMContext, PopupManager, LocaleManager, TextFormatter, …)- Per-plugin
public.scsssprawl and per-plugin CSS package exports — use bundledindex.css/public.css editor.showToolbar/hideToolbar/addToolbarTool/createToolbarButton- Jest; Prettier / ESLint configs (replaced by oxfmt / oxlint)
ToolbarDividerPluginas a real chrome plugin (no-op; separators from toolbargroup)- Bundled spellcheck dictionary texts
Fixed
- Typography Styles modal layout (vertical rows + sectioned CSS in dist)
- Font Settings empty content after remount;
t()interpolation for available font count - Block Style color picker closing the parent modal (inline ColorWell)
- Popup close-on-overlay for Font / Block Style / History
- Typed
removeAtomAtwith kernelCommand(noas neverat call sites) - Safe DOM event handling (
instanceof/ guards instead of unsafe casts) - Chart data validation (empty series / NaN / empty labels); timer payload defaults
- oxlint
--deny-warningsgate; jsdom canvasgetContextstub for unit tests
1.3.2
See git history (chore(package): update version to 1.3.2).
1.1.0 - 2024-12-19
Added
- AI Assistant, Calendar, Language, Responsive, Timer, Block plugins
- Lazy table support and enhanced Table Plugin commands
- Notification system and plugin documentation
- Localization for 18 languages
Changed
- Core architecture and shortcuts cleanup
- Charts popup behavior; dark mode styles
1.0.28 - 2024-12-19
Added
- AI Assistant plugin; Selector container parameter
Fixed
- Hotkeys / code style inconsistencies
Previous Versions
For earlier versions, please refer to the git history and commit messages.
Contributing
When contributing to this project, please update this changelog with your changes following the format above.
Categories
- Added: for new features
- Changed: for changes in existing functionality
- Deprecated: for soon-to-be removed features
- Removed: for now removed features
- Fixed: for any bug fixes
- Security: in case of vulnerabilities