This release includes 4 breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
+7 more
Affected surfaces
ReleasePort's take
Light signalDocx Editor 1.0.0 restructures all import paths (e.g., @eigenpal/docx-js-editor → @eigenpal/docx-editor-react) and renames components—FormattingBar becomes Toolbar. All packages shift to Apache 2.0 license.
Why it matters: Update import paths across codebase to new package structure. Component renames (FormattingBar → Toolbar) require template updates. License change to Apache 2.0 removes AGPL copyleft. Plan migration before next development cycle.
Summary
AI summaryBroad release touches Patch Changes, Major Changes, breaking, and English. Breaking: Import paths changed: @eigenpal/docx-js-editor → @eigenpal/docx-editor-react; @eigenpal/docx-editor-react/core → @eigenpal/docx-editor-core; etc
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Breaking | High |
All packages relicensed to Apache 2.0 (previously AGPL‑3.0 for agents). All packages relicensed to Apache 2.0 (previously AGPL‑3.0 for agents). Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Breaking | Medium |
showPrintButton prop removed from DocxEditor and Toolbar. showPrintButton prop removed from DocxEditor and Toolbar. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Breaking | Medium |
Locale strings migrate from adapters to dedicated i18n package. Locale strings migrate from adapters to dedicated i18n package. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Breaking | Medium |
Agent UI components relocate from adapters to agents package. Agent UI components relocate from adapters to agents package. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Breaking | Medium |
Toolbar component names unified across adapters; FormattingBar becomes Toolbar. Toolbar component names unified across adapters; FormattingBar becomes Toolbar. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Breaking | Medium |
All packages relicense to Apache 2.0; agents lifts AGPL copyleft obligations. All packages relicense to Apache 2.0; agents lifts AGPL copyleft obligations. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Breaking | Medium |
Monolithic package splits into framework-agnostic core and per-framework adapters. Monolithic package splits into framework-agnostic core and per-framework adapters. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Breaking | Medium |
Locale strings moved from adapters to dedicated `@eigenpal/docx-editor-i18n` package; import paths changed. Locale strings moved from adapters to dedicated `@eigenpal/docx-editor-i18n` package; import paths changed. Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Breaking | Medium |
Agent UI components (`AgentPanel`, `AgentChatLog`, etc.) relocated from adapters to `@eigenpal/docx-editor-agents` packages; import paths changed. Agent UI components (`AgentPanel`, `AgentChatLog`, etc.) relocated from adapters to `@eigenpal/docx-editor-agents` packages; import paths changed. Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Breaking | Medium |
Toolbar component names unified: `FormattingBar` → `Toolbar`; classic `Toolbar` removed, replaced by `EditorToolbar.MenuBar` + `EditorToolbar.Toolbar`. Toolbar component names unified: `FormattingBar` → `Toolbar`; classic `Toolbar` removed, replaced by `EditorToolbar.MenuBar` + `EditorToolbar.Toolbar`. Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Medium |
JSON API docs generated at docs/json with structured per-export metadata. JSON API docs generated at docs/json with structured per-export metadata. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
API Extractor snapshots guard public surface; parity contract enforces cross-adapter consistency. API Extractor snapshots guard public surface; parity contract enforces cross-adapter consistency. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Vue 3 ships as first-class adapter with API parity to React. Vue 3 ships as first-class adapter with API parity to React. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Feature | Medium |
i18n package exports tree-shakeable named imports with typed LocaleStrings. i18n package exports tree-shakeable named imports with typed LocaleStrings. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Feature | Medium |
Vue 3 adapter (`@eigenpal/docx-editor-vue`) added with API parity to React adapter. Vue 3 adapter (`@eigenpal/docx-editor-vue`) added with API parity to React adapter. Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Medium |
`@eigenpal/docx-editor-i18n` now exports tree‑shakable named imports with typed `LocaleStrings` and runtime lookup helpers. `@eigenpal/docx-editor-i18n` now exports tree‑shakable named imports with typed `LocaleStrings` and runtime lookup helpers. Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Dependency | Medium |
Updated dependencies across multiple commits; core, agents, and i18n packages bumped to 1.0.0 releases. Updated dependencies across multiple commits; core, agents, and i18n packages bumped to 1.0.0 releases. Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Bugfix | Medium |
Fields and nested SDTs inside content controls preserved on save. Fields and nested SDTs inside content controls preserved on save. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Bugfix | Medium |
Fields and math inside inline SDT content preserved on save. Fields and math inside inline SDT content preserved on save. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Bugfix | Medium |
Anchored DOCX text boxes render with square wrapping instead of standalone blocks. Anchored DOCX text boxes render with square wrapping instead of standalone blocks. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Bugfix | Medium |
Hyperlink popup anchors to link on scroll; Vue popup closes on outside click. Hyperlink popup anchors to link on scroll; Vue popup closes on outside click. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Bugfix | Medium |
Dense footnote rendering at page bottom fixed. Dense footnote rendering at page bottom fixed. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Bugfix | Medium |
Header/footer references and titlePg inherited from earlier sections per ECMA-376. Header/footer references and titlePg inherited from earlier sections per ECMA-376. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Refactor | Medium |
DocxEditor.tsx refactored into focused hooks; reduced 5158 to 3712 LOC. DocxEditor.tsx refactored into focused hooks; reduced 5158 to 3712 LOC. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Refactor | Medium |
PagedEditor.tsx refactored into focused hooks; reduced 3230 to 775 LOC. PagedEditor.tsx refactored into focused hooks; reduced 3230 to 775 LOC. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Refactor | Low |
Vue composables now declare named return interfaces (e.g., `UseClipboardReturn`), reducing declaration size and decoupling from core internals; unused `manager` field removed from `useTableSelection`. Vue composables now declare named return interfaces (e.g., `UseClipboardReturn`), reducing declaration size and decoupling from core internals; unused `manager` field removed from `useTableSelection`. Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Refactor | Low |
Internal Vue file structure aligned with React parity (component splits, style extraction), keeping public API unchanged. Internal Vue file structure aligned with React parity (component splits, style extraction), keeping public API unchanged. Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
Full changelog
Major Changes
-
6272b32: # 1.0.0
First multi-package, multi-framework release. The monolithic
@eigenpal/docx-js-editoris split into a framework-agnostic core and per-framework adapters, Vue 3 ships as a first-class adapter alongside React, and the license moves to Apache 2.0 across all packages.Package restructure (breaking)
| Old import | New import |
| ------------------------------------------ | ----------------------------------------- |
|@eigenpal/docx-js-editor|@eigenpal/docx-editor-react|
|@eigenpal/docx-js-editor/react|@eigenpal/docx-editor-react|
|@eigenpal/docx-editor-react/core|@eigenpal/docx-editor-core|
|@eigenpal/docx-editor-react/headless|@eigenpal/docx-editor-core/headless|
|@eigenpal/docx-editor-react/core-plugins|@eigenpal/docx-editor-core/core-plugins|
|@eigenpal/docx-editor-react/mcp|@eigenpal/docx-editor-agents/mcp|
|@eigenpal/docx-editor-react/i18n/*.json|@eigenpal/docx-editor-i18n/*.json|The old
@eigenpal/docx-js-editorpackage stays on 0.x for legacy maintenance — no 1.x compatibility shim ships. Framework-agnostic utilities (e.g.createEmptyDocument) move to core:- import { DocxEditor, createEmptyDocument } from '@eigenpal/docx-js-editor'; + import { DocxEditor } from '@eigenpal/docx-editor-react'; + import { createEmptyDocument } from '@eigenpal/docx-editor-core';Vue 3 adapter (
@eigenpal/docx-editor-vue)The Vue package becomes a real adapter (previously a stub). Public API mirrors React:
<DocxEditor>with matching prop surfaceuseDocxEditorcomposable +renderAsyncfor the Node.js path/ui,/composables,/dialogs,/plugin-api,/stylessubpaths
Parity gates cover insert-table, find/replace, page-setup, context menus, image overlay (resize/move/rotate/aspect-locked corners, dimension tooltip), advanced cell/row options (margins, height rule, text direction, no-wrap), menu-bar icons + shortcuts + carets, toolbar pickers, and the agent UI surface.
Shared i18n package (
@eigenpal/docx-editor-i18n)Locale strings move out of
@eigenpal/docx-editor-reactinto a dedicated package consumed by both adapters from a single source.- import de from '@eigenpal/docx-editor-react/i18n/de.json'; + import de from '@eigenpal/docx-editor-i18n/de.json';The
defaultLocalevalue (English) is still re-exported from the adapter packages, unchanged.Agent UI relocation (breaking)
AgentPanel,AgentChatLog,AgentComposer,AgentSuggestionChip,AgentTimelineno longer ship from@eigenpal/docx-editor-react. They live at:@eigenpal/docx-editor-agents/react— React components +useAgentChat@eigenpal/docx-editor-agents/vue— Vue 3 twins, plusAIContextMenuandAIResponsePreview@eigenpal/docx-editor-agents/ai-sdk/react//ai-sdk/vue—@ai-sdk/*adapters@eigenpal/docx-editor-agents/bridge— React-freecreateEditorBridge,agentTools,executeToolCall,getToolSchemas,createReviewerBridge. Safe for headless / Vue / Node.
- import { AgentPanel, AgentChatLog } from '@eigenpal/docx-editor-react'; + import { AgentPanel, AgentChatLog } from '@eigenpal/docx-editor-agents/react';The agent components no longer call
useTranslationdirectly — pass localized*Labelprops instead.<DocxEditor>'s built-in agent panel slot still forwards localized strings automatically.Accessibility polish on the agent surface: keyboard-operable resize handle, Escape-dismissable context menu, live-region chat log, WCAG AA contrast on response previews.
Toolbar naming unified (breaking)
The standalone formatting bar is
Toolbaron both adapters. The old "classic" single-rowToolbar(with File/Format/Insert menus baked in) is removed — composeEditorToolbar.MenuBar+EditorToolbar.Toolbarfor that layout.| Old (React) | New (React + Vue) |
| ------------------------------ | ----------------------- |
|FormattingBar|Toolbar|
| ClassicToolbar(with menus) |EditorToolbar|
|EditorToolbar.FormattingBar|EditorToolbar.Toolbar|Vue:
BasicToolbar/FormattingBaraliases removed;EditorToolbar'sformatting-barslot is nowtoolbar. Vue's table border-color and cell-fill pickers now use the advanced color picker matching React. VueMenuDropdown'sshowChevrondefault flips fromtruetofalse— pass:show-chevron="true"explicitly to keep the caret.showPrintButtonprop removed (breaking)Removed from
<DocxEditor>and<Toolbar>on both adapters; the Vue<Toolbar>printevent is gone with it.onPrintcallback stays.- <DocxEditor showPrintButton onPrint={handlePrint} /> + <DocxEditor onPrint={handlePrint} />To hide File > Print, omit
onPrint. Programmatic print still works viaref.current.print()/editorRef.value.print().License moves to Apache 2.0
All published packages relicense to Apache 2.0. Notably:
@eigenpal/docx-editor-agentswas AGPL-3.0-or-later — the relicense lifts copyleft obligations on agent embedders. -
fd1f9de:
@eigenpal/docx-editor-i18nships its public surface as named exports from the package root. One import path, IDE-discoverable, tree-shakeable.import { // Locale data — typed en, de, pl, tr, he, ptBR, zhCN, // Runtime lookup by BCP-47 tag locales, // Types type LocaleStrings, type Translations, type TranslationKey, type LocaleCode, } from '@eigenpal/docx-editor-i18n';enis typed asLocaleStrings(source of truth, 100% coverage). Every other locale isPartialLocaleStrings(null leaves fall back to English). Hyphenated locale codes use camelCase identifiers (ptBR,zhCN); thelocalesrecord keeps BCP-47 keys ('pt-BR','zh-CN') for runtime lookup.The package is marked
sideEffects: false, so importing one locale from the root tree-shakes the rest. Verified with esbuild: a consumer importing onlyenships ~26KB.Breaking from earlier (unpublished) shape: the
./<locale>.jsonsubpath exports are gone. Everything goes through the root. TheLocaleStrings,Translations,PartialLocaleStrings, andTranslationKeytypes are no longer re-exported from-reactor-vue. Runtime exports from the adapters (LocaleProvider,useTranslation,provideLocale,i18nPlugin,createTranslator,defaultLocale) are unchanged.
Patch Changes
-
c395aa6: Render anchored DOCX text boxes with square text wrapping instead of converting them into standalone blocks.
-
0187af2: Emit consumer-friendly JSON docs at
docs/json/<pkg-slug>/<subpath>.jsonfor every@publicexport across the published packages. Companion to the existingetc/<slug>.api.mdsnapshots — same source of truth (API Extractor), different output shape: instead of human-readable Markdown, the JSON is structured for a docs site to render any layout it wants. Includes per-export source-link URLs into the GitHub source tree, type-reference canonical IDs for cross-page linking, and TSDoc summaries/remarks/examples parsed out of the source.New tooling:
bun run docs:jsonregenerates,bun run docs:check(in CI) fails on drift. Contract documented inCLAUDE.mdunder### Docs JSON. No runtime change to any published package. -
9d4d30e: Anchor hyperlink popup to its link on scroll; close Vue popup on outside click.
-
5d11c1a: Fix dense footnote rendering at page bottom
-
bba58e4: Internal refactor: continue the DocxEditor.tsx cap effort. Extract the 432-LOC useImperativeHandle block into a useDocxEditorRefApi hook (preserves the dep array byte-for-byte so the editor-contract gate stays green). Pull the floating-overlay block (hyperlink popup, text + image context menus, toast container) into DocxEditorOverlays. Pull the lazy-loaded Suspense dialog block into DocxEditorDialogs — the lazy() import sites move with the JSX so the dialog code-split chunk is owned by the new component. Memoize the 60-line onSelectionChange closure on the PagedEditor mount. DocxEditor.tsx now 3724 → 3183 LOC. No public API change.
-
5a4ef95: Internal refactor: continue the DocxEditor.tsx cap effort, mirroring Vue's hook decomposition. Three more domain hooks extracted: useContextMenus (right-click text + image menus, contextMenuItems memo, handleContextMenuAction switch — comment-state writes routed through an onAddComment callback), useCommentManagement (controlled/uncontrolled comments routing, floating add-comment button position, new-comment workflow state, commentsRef mirror, orphaned-comments debouncer), and useCommentLifecycle (thread comments under overlapping tracked changes, auto-open sidebar on documents with existing tracked changes). DocxEditor.tsx 2634 → 2234 LOC. No public API change.
-
cff5be4: Internal refactor: continue the DocxEditor.tsx cap effort by splitting the JSX render tree. Two new child components: DocxEditorToolbar (wraps the EditorToolbar with its 30+ props plus the title-bar slots and trailing extras) and DocxEditorPagedArea (PagedEditor mount, sidebar overlay, floating add-comment button, inline header/footer editor). DocxEditor.tsx 1972 → 1815 LOC. No public API change.
-
6ff5d22: Internal refactor: split DocxEditor.tsx (5158 → 3712 LOC, -28%) into focused hooks under
components/DocxEditor/hooks/— useOutlineSidebar, useKeyboardShortcuts, useFileIO, usePageSetupControls, useHyperlinkActions, useFindReplaceBridge, useFormattingActions, useImageActions — plus 6 micro-components (CommentsSidebarToggle, LocalizedAgentPanel, PageIndicator, AgentPanelToggle, OutlineToggleButton, EditingModeDropdown) and acommentFactoriesmodule that hides the shared comment/revision ID counter behind getNextCommentId/bumpNextCommentIdAbove helpers. No public API change. -
999a48d: Internal refactor: split PagedEditor.tsx (3230 → 775 LOC) into focused hooks under
components/DocxEditor/hooks/— useLayoutPipeline, useSelectionOverlay, useImageInteractions, usePagedScrollApi, usePagesPointer, usePagedEditorRefApi, useLayoutTriggers — plus pure helpers domSelection.ts + tableResize.ts. No public API change. -
348fa6b: API Extractor snapshots for the 6 published subpaths of
@eigenpal/docx-editor-react(root,/ui,/hooks,/dialogs,/plugin-api,/styles) and@eigenpal/docx-editor-vue(root,/ui,/composables,/dialogs,/plugin-api,/styles). CI now fails on undocumented public-surface drift viabun run api:check.Adds
etc/parity.contract.json— the cross-adapter parity contract listing whichDocxEditorPropsfields andDocxEditorRefmembers are paired between React and Vue, which are deliberately deferred in Vue, and which are Vue-exclusive.bun run check:parity-contract(also gated in CI) parses both snapshots and fails on any drift the contract doesn't acknowledge. Adding a new prop or ref method to either adapter forces an explicit classification in the contract.Vue composables now declare named
Use*Returninterfaces (UseClipboardReturn,UseFindReplaceReturn,UseSelectionHighlightReturn,UseTableSelectionReturn,UseHistoryReturn,UseTableResizeReturn,UseDragAutoScrollReturn,UseVisualLineNavigationReturn,UseDocxEditorReturn). Before this change the composables returned anonymous object literals that recursively expanded core's internal types in the published.d.ts, inflatingetc/composables.api.mdto 3,526 lines and locking core's internalRun/Commentshape into Vue's public contract. Named returns drop the snapshot to ~450 lines and decouple Vue's surface from core's internals.Vue's
useTableSelectionno longer exposesmanager: TableSelectionManagerin its return — it was unused by any internal consumer and leaked core'sTableSelectionManagerclass as part of Vue's public surface.Side effect for
@eigenpal/docx-editor-vue: the build no longer writes workspace-relative source paths (e.g.../../core/src/core.ts) into published declarations. Those paths were valid in this repo but unresolvable once installed from npm; settingpathsToAliases: falseon the dts plugin keeps the package names (@eigenpal/docx-editor-core,@eigenpal/docx-editor-i18n) intact indist/*.d.ts.No runtime change for either package.
-
29f9575: Preserve fields, nested SDTs, and math inside
<w:sdt>content controls so docProps-bound titles wrapped in SDT render correctly. -
491ec9a: Preserve fields, nested SDTs, and math inside inline SDT content on save. Completes #482 by mirroring its parser-side widening in the serializer and PM → Document converter so docProps-bound title fields survive a full load → edit → save round-trip.
-
5a30387: Inherit header/footer references and titlePg from earlier sections per ECMA-376 §17.6. Fixes templates that set these on the cover sectPr only.
-
7c3f2e1: Internal Vue refactor: extract
useImageActions,useContextMenus,usePagesPointer,useSelectionSync, anduseDocxEditorRefApicomposables fromDocxEditorVue.vue. No public API change. -
9233c6e: Internal:
DocxEditorVue.vuenow under the 1000-LOC cap (897). Split template intoDocxEditorMenuBar,DocxEditorDialogs,DocxEditorOverlays; extracteduseMenuActions,useCommentLifecycle,useDocumentLifecyclecomposables; moved styles to a co-located.cssfile. No public-API change. -
372cab6: vue: internal source restructure for React parity —
DocxEditorVue.vue→DocxEditor.vue, root-leveldocx-editor-props.ts/editor-mode.ts/editor-ref.tsconsolidated intocomponents/DocxEditor/types.ts, orchestration files nested undercomponents/DocxEditor/. No public API change. -
Updated dependencies [6272b32]
-
Updated dependencies [c5125ff]
-
Updated dependencies [76093f9]
-
Updated dependencies [c5125ff]
-
Updated dependencies [348fa6b]
-
Updated dependencies [0187af2]
-
Updated dependencies [6b8f1fb]
-
Updated dependencies [61983ca]
-
Updated dependencies [f7b8dc7]
-
Updated dependencies [b2230a3]
-
Updated dependencies [8836214]
- @eigenpal/[email protected]
- @eigenpal/[email protected]
- @eigenpal/[email protected]
Breaking Changes
- Import paths changed: `@eigenpal/docx-js-editor` → `@eigenpal/docx-editor-react`; `@eigenpal/docx-editor-react/core` → `@eigenpal/docx-editor-core`; etc.
- Agent UI components (`AgentPanel`, `AgentChatLog`, etc.) moved from `@eigenpal/docx-editor-react` to `@eigenpal/docx-editor-agents/react` (and Vue equivalents).
- Toolbar naming unified: `FormattingBar` → `Toolbar`; classic single‑row `Toolbar` removed; use `EditorToolbar.MenuBar` + `EditorToolbar.Toolbar` instead.
- `showPrintButton` prop removed from both React and Vue adapters; File > Print must be hidden by omitting `onPrint` or using programmatic print methods.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About Docx Editor
All releases →Related context
Related tools
Earlier breaking changes
- v@eigenpal/[email protected] Shared i18n package extracted into @eigenpal/docx-editor-i18n.
- v@eigenpal/[email protected] `showPrintButton` prop removed from `<DocxEditor>` and toolbar components.
- v@eigenpal/[email protected] Toolbar naming unified across React and Vue adapters; classic toolbar removed.
- v@eigenpal/[email protected] Agent UI components relocated to new agent packages and API changed.
- v@eigenpal/[email protected] Shared i18n package extracted from adapters into dedicated locale bundle.
Beta — feedback welcome: [email protected]