@barocss/math-editor 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/ADAPTERS.md +25 -14
  2. package/API-JAVASCRIPT.md +1 -1
  3. package/API-REACT.md +5 -1
  4. package/API-SESSION.md +168 -6
  5. package/API-SOLID.md +1 -1
  6. package/API-SVELTE.md +1 -1
  7. package/API-VUE.md +1 -1
  8. package/API-WEB-COMPONENT.md +1 -1
  9. package/CHANGELOG.md +45 -0
  10. package/EMBEDDING.md +4 -0
  11. package/IMPLEMENTATION.md +27 -2
  12. package/JSON-MODEL.md +1 -0
  13. package/LATEX-GUIDE.md +8 -1
  14. package/LATEX-SCOPE.md +2 -2
  15. package/LICENSE +1 -3
  16. package/README.md +145 -37
  17. package/ROADMAP.md +93 -11
  18. package/STYLING.md +157 -0
  19. package/SUPPORT.md +24 -12
  20. package/VALIDATION.md +113 -4
  21. package/dist/core.d.ts +5 -1
  22. package/dist/core.js +5 -1
  23. package/dist/document-codec.d.ts +0 -1
  24. package/dist/document-codec.js +0 -1
  25. package/dist/dom/caret-geometry.d.ts +3 -0
  26. package/dist/dom/caret-geometry.js +41 -0
  27. package/dist/dom/elements.d.ts +1 -2
  28. package/dist/dom/elements.js +2 -3
  29. package/dist/dom/latex-panel.d.ts +10 -0
  30. package/dist/dom/latex-panel.js +59 -0
  31. package/dist/dom/matrix-selection.d.ts +11 -0
  32. package/dist/dom/matrix-selection.js +30 -0
  33. package/dist/dom/menu-position.d.ts +14 -2
  34. package/dist/dom/menu-position.js +84 -15
  35. package/dist/dom/presentation-controls.d.ts +4 -0
  36. package/dist/dom/presentation-controls.js +56 -0
  37. package/dist/dom/quick-panel.d.ts +12 -0
  38. package/dist/dom/quick-panel.js +102 -0
  39. package/dist/dom/selection.d.ts +29 -0
  40. package/dist/dom/selection.js +53 -0
  41. package/dist/dom/symbol-panel.d.ts +9 -0
  42. package/dist/dom/symbol-panel.js +146 -0
  43. package/dist/dom/theme.d.ts +6 -0
  44. package/dist/dom/theme.js +68 -0
  45. package/dist/dom/toolbar-catalog.d.ts +10 -0
  46. package/dist/dom/toolbar-catalog.js +35 -0
  47. package/dist/dom/toolbar.d.ts +13 -2
  48. package/dist/dom/toolbar.js +295 -28
  49. package/dist/dom.d.ts +7 -1
  50. package/dist/dom.js +510 -128
  51. package/dist/editor-labels.d.ts +0 -1
  52. package/dist/editor-labels.js +0 -1
  53. package/dist/enter-policy.d.ts +0 -1
  54. package/dist/enter-policy.js +0 -1
  55. package/dist/fences.d.ts +0 -1
  56. package/dist/fences.js +0 -1
  57. package/dist/i18n.d.ts +0 -1
  58. package/dist/i18n.js +0 -1
  59. package/dist/index.d.ts +4 -1
  60. package/dist/index.js +4 -1
  61. package/dist/latex-insertion.d.ts +12 -0
  62. package/dist/latex-insertion.js +26 -0
  63. package/dist/latex-paste-panel.d.ts +3 -0
  64. package/dist/latex-paste-panel.js +18 -0
  65. package/dist/latex.d.ts +0 -1
  66. package/dist/latex.js +0 -1
  67. package/dist/lines.d.ts +0 -1
  68. package/dist/lines.js +0 -1
  69. package/dist/locales/en.js +27 -1
  70. package/dist/locales/en.json +27 -1
  71. package/dist/locales/ko.js +27 -1
  72. package/dist/locales/ko.json +27 -1
  73. package/dist/math-editor-toolbar.d.ts +4 -2
  74. package/dist/math-editor-toolbar.js +3 -4
  75. package/dist/math-editor.d.ts +5 -2
  76. package/dist/math-editor.js +285 -46
  77. package/dist/matrix-range.d.ts +40 -0
  78. package/dist/matrix-range.js +242 -0
  79. package/dist/matrix.d.ts +0 -1
  80. package/dist/matrix.js +0 -1
  81. package/dist/model.d.ts +0 -1
  82. package/dist/model.js +0 -1
  83. package/dist/outputs.d.ts +0 -1
  84. package/dist/outputs.js +0 -1
  85. package/dist/preferences.d.ts +24 -0
  86. package/dist/preferences.js +66 -0
  87. package/dist/presentation-controls.d.ts +10 -0
  88. package/dist/presentation-controls.js +10 -0
  89. package/dist/presentation.d.ts +13 -0
  90. package/dist/presentation.js +86 -0
  91. package/dist/quick-panel.d.ts +2 -0
  92. package/dist/quick-panel.js +17 -0
  93. package/dist/range.d.ts +2 -1
  94. package/dist/range.js +11 -1
  95. package/dist/react.d.ts +0 -1
  96. package/dist/react.js +0 -1
  97. package/dist/session.d.ts +31 -2
  98. package/dist/session.js +108 -7
  99. package/dist/solid.d.ts +0 -1
  100. package/dist/solid.js +0 -1
  101. package/dist/suggestions.d.ts +4 -1
  102. package/dist/suggestions.js +100 -12
  103. package/dist/svelte.d.ts +0 -1
  104. package/dist/svelte.js +0 -1
  105. package/dist/symbol-browser.d.ts +0 -1
  106. package/dist/symbol-browser.js +0 -1
  107. package/dist/symbols.d.ts +0 -1
  108. package/dist/symbols.js +0 -1
  109. package/dist/templates.d.ts +0 -1
  110. package/dist/templates.js +0 -1
  111. package/dist/tokens.d.ts +0 -1
  112. package/dist/tokens.js +0 -1
  113. package/dist/vertical-navigation.d.ts +15 -0
  114. package/dist/vertical-navigation.js +145 -0
  115. package/dist/vue.d.ts +0 -1
  116. package/dist/vue.js +0 -1
  117. package/dist/web-component.d.ts +0 -1
  118. package/dist/web-component.js +0 -1
  119. package/package.json +1 -1
  120. package/src/style.css +254 -129
  121. package/dist/core.d.ts.map +0 -1
  122. package/dist/core.js.map +0 -1
  123. package/dist/document-codec.d.ts.map +0 -1
  124. package/dist/document-codec.js.map +0 -1
  125. package/dist/dom/elements.d.ts.map +0 -1
  126. package/dist/dom/elements.js.map +0 -1
  127. package/dist/dom/menu-position.d.ts.map +0 -1
  128. package/dist/dom/menu-position.js.map +0 -1
  129. package/dist/dom/toolbar.d.ts.map +0 -1
  130. package/dist/dom/toolbar.js.map +0 -1
  131. package/dist/dom.d.ts.map +0 -1
  132. package/dist/dom.js.map +0 -1
  133. package/dist/editor-labels.d.ts.map +0 -1
  134. package/dist/editor-labels.js.map +0 -1
  135. package/dist/enter-policy.d.ts.map +0 -1
  136. package/dist/enter-policy.js.map +0 -1
  137. package/dist/fences.d.ts.map +0 -1
  138. package/dist/fences.js.map +0 -1
  139. package/dist/i18n.d.ts.map +0 -1
  140. package/dist/i18n.js.map +0 -1
  141. package/dist/index.d.ts.map +0 -1
  142. package/dist/index.js.map +0 -1
  143. package/dist/latex.d.ts.map +0 -1
  144. package/dist/latex.js.map +0 -1
  145. package/dist/lines.d.ts.map +0 -1
  146. package/dist/lines.js.map +0 -1
  147. package/dist/math-editor-toolbar.d.ts.map +0 -1
  148. package/dist/math-editor-toolbar.js.map +0 -1
  149. package/dist/math-editor.d.ts.map +0 -1
  150. package/dist/math-editor.js.map +0 -1
  151. package/dist/matrix.d.ts.map +0 -1
  152. package/dist/matrix.js.map +0 -1
  153. package/dist/model.d.ts.map +0 -1
  154. package/dist/model.js.map +0 -1
  155. package/dist/outputs.d.ts.map +0 -1
  156. package/dist/outputs.js.map +0 -1
  157. package/dist/range.d.ts.map +0 -1
  158. package/dist/range.js.map +0 -1
  159. package/dist/react.d.ts.map +0 -1
  160. package/dist/react.js.map +0 -1
  161. package/dist/session.d.ts.map +0 -1
  162. package/dist/session.js.map +0 -1
  163. package/dist/solid.d.ts.map +0 -1
  164. package/dist/solid.js.map +0 -1
  165. package/dist/suggestions.d.ts.map +0 -1
  166. package/dist/suggestions.js.map +0 -1
  167. package/dist/svelte.d.ts.map +0 -1
  168. package/dist/svelte.js.map +0 -1
  169. package/dist/symbol-browser.d.ts.map +0 -1
  170. package/dist/symbol-browser.js.map +0 -1
  171. package/dist/symbols.d.ts.map +0 -1
  172. package/dist/symbols.js.map +0 -1
  173. package/dist/templates.d.ts.map +0 -1
  174. package/dist/templates.js.map +0 -1
  175. package/dist/tokens.d.ts.map +0 -1
  176. package/dist/tokens.js.map +0 -1
  177. package/dist/vue.d.ts.map +0 -1
  178. package/dist/vue.js.map +0 -1
  179. package/dist/web-component.d.ts.map +0 -1
  180. package/dist/web-component.js.map +0 -1
package/README.md CHANGED
@@ -1,34 +1,72 @@
1
1
  # @barocss/math-editor
2
2
 
3
- See the [JSON model specification](JSON-MODEL.md) for required fields, exact slot order, invariants and persistence limits.
3
+ An embeddable math editor for writing LaTeX-compatible formulas. Edit expressions in place, select existing math, and wrap it in fractions, roots, powers or delimiters. The package includes a framework-independent model, a rich React editor, and a native DOM editor with framework adapters.
4
4
 
5
+ **Release:** core **0.4.0**, with nine host editor plugins at **0.1.0**. This editor does not calculate, solve equations or parse arbitrary LaTeX.
5
6
 
6
- ## Framework-specific API guides
7
+ ## Editing additions in 0.4.0
7
8
 
8
- [Pure JavaScript](API-JAVASCRIPT.md) · [React](API-REACT.md) · [Web Component](API-WEB-COMPONENT.md) · [Vue 3](API-VUE.md) · [Svelte](API-SVELTE.md) · [Solid](API-SOLID.md) · [Session and DOM API](API-SESSION.md)
9
+ The native renderer now edits one lexical token at a time, matching the main React field's role colors. New utilities provide **Paste as LaTeX** (Alt+Shift+V), **Recent & favorites** for symbols/templates, and contextual **bracket, fraction-size and limit-placement settings**. These utilities are included in 0.4.0. See [editing utilities and API](API-SESSION.md#editing-utilities--workspace).
9
10
 
10
- Each guide covers installation, a complete integration, document replacement, saving, lifecycle cleanup and host limitations.
11
+ ## Packages
11
12
 
13
+ Choose the core package for a standalone math field. Choose one additional host package to embed that field in an existing editor. The host packages share the same math model, parser, suggestions and toolbar. Each requires the core and its own host SDK as peer dependencies.
12
14
 
13
- An embeddable math editor with a framework-independent model, an existing rich React UI, and a new native DOM surface for pure JavaScript, Web Components, Vue, Svelte, Solid and React. Write expressions in place, select existing math, and wrap it in fractions, roots, powers or delimiters. The demo includes a live KaTeX preview.
15
+ | Package | Purpose | Formula placement | Release status |
16
+ | --- | --- | --- | --- |
17
+ | `@barocss/math-editor` | Math model, LaTeX import/export, editor, toolbar and framework adapters | Standalone, inline or multiline | 0.4.0; MIT |
18
+ | `@barocss/math-editor-tiptap` | Tiptap node extension | Inline and block | 0.1.0; MIT |
19
+ | `@barocss/math-editor-prosemirror` | ProseMirror schema, commands and node views | Inline and block | 0.1.0; MIT |
20
+ | `@barocss/math-editor-lexical` | Lexical math node and registration | Inline and block | 0.1.0; MIT |
21
+ | `@barocss/math-editor-editorjs` | Editor.js math Tool | Block | 0.1.0; MIT |
22
+ | `@barocss/math-editor-tinymce` | TinyMCE plugin with in-place or panel editing | Inline and block | 0.1.0; MIT |
23
+ | `@barocss/math-editor-ckeditor` | CKEditor 5 model objects and widgets | Inline and block | 0.1.0; MIT |
24
+ | `@barocss/math-editor-quill` | Quill math embeds and registration | Inline and block | 0.1.0; MIT |
25
+ | `@barocss/math-editor-slate` | Slate void elements and React rendering | Inline and block | 0.1.0; MIT |
26
+ | `@barocss/math-editor-gutenberg` | WordPress Gutenberg math block | Block | 0.1.0; MIT |
27
+ | `@barocss/math-editor-integrations` | Shared implementation used to build the nine host packages | Internal development | Private; not an install target |
14
28
 
15
- **Status:** working prototype, not yet a production-ready replacement for the math features in Note, Word or Slides. This package does not calculate, solve equations or parse arbitrary LaTeX.
29
+ The host plugins require `@barocss/math-editor@^0.4.0`. The core and all nine host packages use the MIT license, with copyright attributed to barocss.com. Each package includes its own LICENSE file. Host SDKs retain their own licenses.
16
30
 
17
- See [framework adapters and inline/custom toolbar integration](ADAPTERS.md), [custom locales](LOCALIZATION.md), and [progress / roadmap](ROADMAP.md). The new native renderer has explicit parity gaps; existing React consumers keep their current UI.
31
+ Each host package exports its adapter, `/shared` helpers and `/style.css`. Load the core stylesheet as well. Gutenberg also exports `/data` for its stored-data codec. Install only the host package you use; there is no public all-host bundle. Formula placement, keyboard entry, history and clipboard behavior depend on the host.
18
32
 
19
- For editor-only, external toolbar, LaTeX, preview, inline and popup compositions, see [Embedding](EMBEDDING.md) and `/layouts.html` in the demo.
33
+ Host guides: [Tiptap](https://math-editor.barocss.com/docs/integrations/tiptap.html) · [ProseMirror](https://math-editor.barocss.com/docs/integrations/prosemirror.html) · [Lexical](https://math-editor.barocss.com/docs/integrations/lexical.html) · [Editor.js](https://math-editor.barocss.com/docs/integrations/editorjs.html) · [TinyMCE](https://math-editor.barocss.com/docs/integrations/tinymce.html) · [CKEditor 5](https://math-editor.barocss.com/docs/integrations/ckeditor.html) · [Quill](https://math-editor.barocss.com/docs/integrations/quill.html) · [Slate](https://math-editor.barocss.com/docs/integrations/slate.html) · [WordPress Gutenberg](https://math-editor.barocss.com/docs/integrations/gutenberg.html).
34
+
35
+ The [unified host sample](https://math-editor.barocss.com/integrations/) includes all nine editors. During development, guides are served under `http://localhost:5184/docs/integrations/`, and the host sample runs on port 5185. Website deployment is separate from npm publication.
36
+
37
+ ## Framework adapters in the core package
38
+
39
+ These are subpath exports of `@barocss/math-editor`, not separate npm packages.
40
+
41
+ | Environment | Import | Guide |
42
+ | --- | --- | --- |
43
+ | Model and sessions without a UI | `@barocss/math-editor/core` | [Session API](https://math-editor.barocss.com/docs/api-session.html) |
44
+ | Pure JavaScript | `@barocss/math-editor/dom` | [JavaScript](https://math-editor.barocss.com/docs/api-javascript.html) |
45
+ | React | `@barocss/math-editor` for the rich UI; `/react` for the native DOM surface | [React](https://math-editor.barocss.com/docs/api-react.html) |
46
+ | Web Component | `@barocss/math-editor/web-component` | [Web Component](https://math-editor.barocss.com/docs/api-web-component.html) |
47
+ | Vue 3 | `@barocss/math-editor/vue` | [Vue](https://math-editor.barocss.com/docs/api-vue.html) |
48
+ | Svelte | `@barocss/math-editor/svelte` | [Svelte](https://math-editor.barocss.com/docs/api-svelte.html) |
49
+ | Solid | `@barocss/math-editor/solid` | [Solid](https://math-editor.barocss.com/docs/api-solid.html) |
50
+
51
+ Each guide covers installation, document replacement, saving and lifecycle cleanup. See the [framework samples](https://math-editor.barocss.com/adapters.html) to try each environment, and the [JSON model specification](https://math-editor.barocss.com/docs/json-model.html) for the storage contract.
52
+
53
+ See [framework adapters and inline/custom toolbar integration](https://math-editor.barocss.com/docs/adapters.html), [custom locales](https://math-editor.barocss.com/docs/localization.html), and [progress / roadmap](https://math-editor.barocss.com/docs/roadmap.html). The new native renderer has explicit parity gaps; existing React consumers keep their current UI.
54
+
55
+ **Included in 0.4.0:** the native toolbar now includes searchable All symbols, templates, matrix presets and active-grid controls. Native ranges show exact partial-text highlights, and a drag can start in the active input and continue across structures. See [renderer parity](https://math-editor.barocss.com/docs/adapters.html#current-renderer-parity) for the remaining limits.
56
+
57
+ For editor-only, external toolbar, LaTeX, preview, inline and popup compositions, see [Embedding](https://math-editor.barocss.com/docs/embedding.html) and the [layout examples](https://math-editor.barocss.com/layouts.html).
20
58
 
21
59
  ## Quick start
22
60
 
23
- Install version 0.2.1 from npm:
61
+ Install version 0.4.0 from npm:
24
62
 
25
63
  ```sh
26
- npm install @barocss/math-editor@0.2.1
64
+ npm install @barocss/math-editor@0.4.0
27
65
  # For the rich React UI:
28
66
  npm install react react-dom
29
67
  ```
30
68
 
31
- Import `@barocss/math-editor/style.css` once. Framework-free consumers use `/core` and `/dom`; each framework adapter has its own subpath. See [ADAPTERS.md](ADAPTERS.md).
69
+ Import `@barocss/math-editor/style.css` once. Framework-free consumers use `/core` and `/dom`; each framework adapter has its own subpath. See [ADAPTERS.md](https://math-editor.barocss.com/docs/adapters.html).
32
70
 
33
71
  To develop the package and demo from this monorepo:
34
72
 
@@ -67,10 +105,11 @@ function Formula({ documentId, saved, save }: {
67
105
  | `defaultValue?: MathDocument` | Read on mount. Change the React `key` to open another document. This is not a controlled `value` prop. |
68
106
  | `locale?: MathLocale` | Defaults to `ko`. Changes UI text without resetting the document or undo history. |
69
107
  | `autoFocus?: boolean` | Start in the initial editable token. Defaults to `false`. |
70
- | `enterBehavior?: 'newline' | 'commit'` | `commit` calls `onCommit` on Enter after suggestions/selection handling; Shift+Enter retains normal row behavior. |
108
+ | `enterBehavior?: 'newline' \| 'commit'` | `commit` calls `onCommit` on Enter after suggestions/selection handling; Shift+Enter retains normal row behavior. |
71
109
  | `onCommit?()` / `onCancel?()` | Host draft apply/cancel callbacks. Escape dismisses suggestions first; composition reserves its own keys. |
72
110
  | `showPopovers?: boolean` | Defaults to `true`. Set `false` while keeping the editor mounted in an inactive host tab; its undo history is preserved. |
73
- | `toolbar?: boolean` | Show the rich React toolbar panels; defaults to `true`. |
111
+ | `toolbar?: boolean \| readonly StructureKind[]` | Show or filter rich React structure buttons; defaults to `true`. |
112
+ | `toolbarMaxItems?: number` | Initially visible structure buttons; defaults to eight. |
74
113
  | `toolbarEnd?: ReactNode` | Host actions such as reset/save appended to the toolbar. |
75
114
  | `showTokenLegend?: boolean` | Show lexical color guidance; defaults to `true`. |
76
115
  | `showLineNumbers?: boolean` | Defaults to `true`. Displays UI-only line numbers when there are two or more top-level rows. Never included in the model, clipboard or LaTeX. |
@@ -84,19 +123,21 @@ Matching literal characters appear before editable structures and templates. For
84
123
 
85
124
  ## Editing flows
86
125
 
87
- Use **All symbols** to browse all 90 symbols without knowing a name in advance. Search by glyph, English/Korean name, alias or LaTeX command, then click to insert at the last caret or replace the model selection. Escape closes the browser. Search-field clipboard actions do not affect the formula.
126
+ Use **All symbols** to browse the complete symbol catalog without knowing a name in advance. Search by glyph, English/Korean name, alias or LaTeX command, then click to insert at the last caret or replace the model selection. Escape closes the browser. Search-field clipboard actions do not affect the formula. The workspace native toolbar exposes this browser through More tools.
88
127
 
89
- - Type `x/`, then Enter: convert to a fraction and enter the denominator. `/`, `^` and `_` remain opt-in suggestions, not immediate structural conversions.
90
- - Type `matrix`, `identity`, `aligned` or `cases`, then choose a suggestion. Korean aliases work in both UI languages.
128
+ - Type `x/`, choose Fraction, then Enter to enter its denominator. The literal `÷` candidate comes first. `/`, `^` and `_` remain opt-in suggestions, not immediate structural conversions.
129
+ - Type `matrix`, `identity`, `aligned` or `cases`, then choose a suggestion. Korean aliases work in both UI languages. In the 0.4.0 release, type `rows x columns` without spaces, such as `2x1`, `1x2`, `3x7` or `4x4`. Each dimension can be 1–20. Suggestions offer an empty matrix and a zero matrix; square sizes also offer an identity matrix. Uppercase `X` and `×` also work. Enter accepts a suggestion; Space or Escape keeps the typed expression.
91
130
  - Type `30degree`, `30도` or `30각도`, then Enter to insert `30°` on the current line. `angle` inserts the separate symbol `∠`.
92
- - Search `reals`, `integers`, `setminus`, `parallel`, or their Korean names. [The complete catalog](./SUPPORT.md) lists every symbol and alias.
131
+ - Search `reals`, `integers`, `setminus`, `parallel`, or their Korean names. [The complete catalog](https://math-editor.barocss.com/docs/support.html) lists every symbol and alias.
93
132
  - Use the template selector for zero matrices, column vectors, the quadratic formula and the Pythagorean theorem. Every part remains editable. Template insertion replaces a model selection if one is active; otherwise it inserts at the caret.
94
- - Click a token to edit it. Only the current token mounts a native `input`; the others are ordinary elements. Blur switches to preview. Escape closes suggestions first, then returns to preview.
133
+ - Click text to edit it. Rich React activates one lexical token; the native renderer activates a whole logical text run. Only that active text mounts an `input`. Blur switches to preview. Escape closes suggestions first, then returns to preview.
95
134
  - Drag to select math. The selection tools and main toolbar wrap it in a fraction, root, power, subscript, parentheses, brackets or absolute value. Fractions focus the denominator; powers/subscripts focus their new slot; roots/delimiters place the caret after the structure.
96
135
  - Complex power bases receive parentheses. Existing structured delimiters are preserved. This is a conservative display rule, not symbolic algebra.
97
136
 
98
137
  Variables, numeric literals and symbols use distinct colors. Classification is lexical: a letter named `c` or `e` is not automatically a declared constant. The model does not resolve names or binding scopes.
99
138
 
139
+ Native passive text preserves these lexical colors; its whole active run still uses one role color. Precise selection highlights do not change that input granularity.
140
+
100
141
  ## Keyboard reference
101
142
 
102
143
  | Context | Key | Action |
@@ -104,6 +145,7 @@ Variables, numeric literals and symbols use distinct colors. Classification is l
104
145
  | Suggestions | Up / Down, Enter | Choose and apply; IME composition reserves these keys for the input method |
105
146
  | Any active slot | Tab / Shift+Tab | Traverse tokens and structural slots |
106
147
  | Token boundary | Left / Right | Move into a neighboring token or slot |
148
+ | Fraction, scripts, indexed root or operator slots | Up / Down | Move to a related slot at the nearest rendered horizontal caret position |
107
149
  | Top-level row | Enter | Split the row, unless applying a suggestion |
108
150
  | Start of a later top-level row | Backspace | Join the previous row |
109
151
  | Grid | Up / Down | Move to the same column in the adjacent row |
@@ -115,19 +157,27 @@ Variables, numeric literals and symbols use distinct colors. Classification is l
115
157
  | Just after a fraction/root/delimiter | Backspace | Unwrap, preserving contents |
116
158
  | Outer grid edge | Backspace / Delete | Delete empty grid; select filled grid first, press again to delete |
117
159
  | Preview surface | Cmd/Ctrl+A | Select the whole math document |
118
- | Active input | Cmd/Ctrl+A | Select the current token text |
160
+ | Active input | Cmd/Ctrl+A | Select the current input text: a React token or native logical run |
161
+ | Editor | Shift+Left / Right | Extend or shrink the model range across text and balanced structures |
162
+ | Editor | Shift+Up / Down | Extend the model range across top-level lines using logical offsets |
119
163
  | Preview surface | Enter / F2 | Enter editing |
120
164
  | Model selection | Cmd/Ctrl+C / X / V | Copy / cut / replace with clipboard contents |
121
165
  | Model selection | Backspace / Delete | Delete selection |
122
166
  | Editor | Cmd/Ctrl+Z / Cmd/Ctrl+Shift+Z | Undo / redo |
123
167
 
168
+ Vertical arrows use the nearest inner structure before an enclosing grid, then fall back to another equation line. Paired scripts can move along their shared column; a base moves up to its superscript and down to its subscript. Suggestions retain arrow-key priority. Composition, literal text and noncollapsed text selections do not trigger structural movement. React and native surfaces share this behavior.
169
+
170
+ The framework-free `moveVertical(state, direction, geometry?)` helper is exported from `/core`. Without rendered geometry, it selects the first text run in the target slot and clamps the current offset. At a lexical token boundary, rendered geometry distinguishes the previous token's end from the next token's start. Each move uses the current caret's horizontal position; a preferred column is not retained across repeated moves through shorter rows. Shift+arrow selection remains a separate operation.
171
+
124
172
  ## Selection and clipboard boundaries
125
173
 
126
- A range within one row preserves partial text and balanced structures. Selecting across a numerator and denominator expands to their common fraction; selecting across matrix cells expands to their common matrix. This is not a spreadsheet-style rectangular cell selection. Multiple document lines can be copied, replaced or deleted, but cannot be wrapped into a single structure.
174
+ A range within one row preserves partial text and balanced structures. Selecting across a numerator and denominator expands to their common fraction; cross-cell pointer selection now creates a matrix rectangle in the workspace. A structural `MathRange` still expands to the common matrix; rectangular editing uses the separate `MathMatrixRange` contract. Multiple document lines can be copied, replaced or deleted, but cannot be wrapped into a single structure.
175
+
176
+ Workspace native highlights now show the exact selected text endpoints. A drag inside the active input uses native text selection until it leaves the input; it can then continue as a model range across structures. These refinements are included in 0.4.0 and retain the same clipboard and balanced-structure rules.
127
177
 
128
178
  Internal copies include `application/x-barocss-math+json` and plain-text LaTeX. Paste validates the custom payload and generates fresh IDs. Plain external text is inserted literally; newlines become top-level rows. Multiple-line paste into a nested slot is rejected without changing the document. If a destination strips custom clipboard formats, pasting back provides text rather than reconstructed math.
129
179
 
130
- The demo's **Copy** button exports LaTeX only. Workspace builds also provide explicit bounded LaTeX import; see [the import contract](LATEX-SCOPE.md). Version 0.2.0 includes bounded LaTeX import. Ordinary clipboard text is still inserted literally.
180
+ The demo's LaTeX Copy action exports source text; its separate sized PNG download/copy controls render the website preview. The library exports mathematical data and LaTeX, with no reusable SVG/PNG image-export API yet. Version 0.2.0 includes explicit bounded LaTeX import; see [the import contract](https://math-editor.barocss.com/docs/latex-scope.html). Ordinary clipboard text is still inserted literally.
131
181
 
132
182
  ## Model and package boundaries
133
183
 
@@ -158,12 +208,12 @@ pnpm --filter @barocss/math-demo test:e2e
158
208
 
159
209
  The demo consumes package exports from `dist`; rebuild the package before browser tests. Browser tests use Playwright Chromium and start port 5184 if needed. Actual OS Korean IME tests remain deferred at the user's request.
160
210
 
161
- - [Symbol / English / Korean name table](./SYMBOLS.md)
162
- - [LaTeX editing guide and upcoming notation](./LATEX-GUIDE.md)
163
- - [Supported formulas, templates and full symbol catalog](./SUPPORT.md)
164
- - [Implementation guide](./IMPLEMENTATION.md)
165
- - [Validation evidence and limitations](./VALIDATION.md)
166
- - [Roadmap and acceptance criteria](./ROADMAP.md)
211
+ - [Symbol / English / Korean name table](https://math-editor.barocss.com/docs/symbols.html)
212
+ - [LaTeX editing guide and upcoming notation](https://math-editor.barocss.com/docs/latex-guide.html)
213
+ - [Supported formulas, templates and full symbol catalog](https://math-editor.barocss.com/docs/support.html)
214
+ - [Implementation guide](https://math-editor.barocss.com/docs/implementation.html)
215
+ - [Validation evidence and limitations](https://math-editor.barocss.com/docs/validation.html)
216
+ - [Roadmap and acceptance criteria](https://math-editor.barocss.com/docs/roadmap.html)
167
217
 
168
218
 
169
219
  ## LaTeX loading (0.2.0)
@@ -180,12 +230,12 @@ if (result.ok) {
180
230
  }
181
231
  ```
182
232
 
183
- The shared contract is **editable structure ↔ exported LaTeX ↔ imported structure**, within the [documented limits](LATEX-SCOPE.md). It covers the current structure and symbol catalog, not arbitrary KaTeX input. Failed imports never modify a session. Framework adapters do not implement their own parsers. Use source editing as a fallback in hosts.
233
+ The shared contract is **editable structure ↔ exported LaTeX ↔ imported structure**, within the [documented limits](https://math-editor.barocss.com/docs/latex-scope.html). It covers the current structure and symbol catalog, not arbitrary KaTeX input. Failed imports never modify a session. Framework adapters do not implement their own parsers. Use source editing as a fallback in hosts.
184
234
 
185
235
 
186
- During an existing edit, use `session.importLatex(source)` rather than resetting `defaultValue`: this preserves Undo/Redo and enforces inline policy. The rich React editor exposes `MathEditorHandle.importLatex` through `apiRef`; see [React import](API-REACT.md) and [shared session import](API-SESSION.md). Both paths use the same parser and fail without a partial update.
236
+ During an existing edit, use `session.importLatex(source)` rather than resetting `defaultValue`: this preserves Undo/Redo and enforces inline policy. The rich React editor exposes `MathEditorHandle.importLatex` through `apiRef`; see [React import](https://math-editor.barocss.com/docs/api-react.html) and [shared session import](https://math-editor.barocss.com/docs/api-session.html). Both paths use the same parser and fail without a partial update.
187
237
 
188
- Workspace presentation refinements include aligned script bases, lining numerals and background-only token focus. See [implementation notes](IMPLEMENTATION.md#editing-typography-and-focus-2026-09-08-workspace), [supported notation](SUPPORT.md) and the [remaining LaTeX priorities](ROADMAP.md#remaining-latex-priorities-workspace-review-2026-09-08). These changes are included in 0.2.0.
238
+ Workspace presentation refinements include aligned script bases, lining numerals and background-only token focus. See [implementation notes](https://math-editor.barocss.com/docs/implementation.html#editing-typography-and-focus-2026-09-08-workspace), [supported notation](https://math-editor.barocss.com/docs/support.html) and the [remaining LaTeX priorities](https://math-editor.barocss.com/docs/roadmap.html#remaining-latex-priorities-workspace-review-2026-09-08). These changes are included in 0.2.0.
189
239
 
190
240
  Workspace norm support: one editable body, shared double-bar fences, `norm`/`노름`/`||` suggestions, range wrapping and LaTeX import/export. The parser accepts short `\lVert…\rVert` and scalable double-bar aliases; export uses `\left\Vert…\right\Vert`. Available in 0.2.0.
191
241
 
@@ -195,7 +245,9 @@ Workspace: `\overbrace`/`\underbrace` support includes LaTeX parsing/export, loc
195
245
 
196
246
  ## Compact and filtered toolbars (workspace)
197
247
 
198
- Toolbars initially show up to eight structure buttons. More tools / Fewer tools toggles the remainder without changing the formula or history. Rich React also places matrix presets, templates and symbol shortcuts in the expanded section; Undo, Redo and `toolbarEnd` stay visible. Native toolbars contain structure buttons and history only and show a toggle when needed. The layout wraps naturally on narrow screens; this is not a guaranteed single-row toolbar.
248
+ Toolbars initially show up to eight structure buttons. More tools / Fewer tools toggles the expanded section without changing the formula or history. In the workspace native toolbar, More tools also reveals All symbols search, templates, 2×2/3×3/4×4 matrix and identity presets, and symbol shortcuts. More remains available even when all selected structures already fit. Undo and Redo stay visible; rich React also retains `toolbarEnd`. The layout wraps on narrow screens.
249
+
250
+ The workspace native grid toolbar follows the active caret. Matrices expose row/column insertion and deletion plus delimiter selection; aligned/cases expose row operations. Text or model selections disable row/column and delimiter mutations. The workspace adds Select cells, Select all cells and Transpose matrix in both renderers. These additions are included in 0.4.0.
199
251
 
200
252
  ```tsx
201
253
  <MathEditor toolbar={['fraction', 'root', 'superscript', 'matrix']}
@@ -203,7 +255,8 @@ Toolbars initially show up to eight structure buttons. More tools / Fewer tools
203
255
  ```
204
256
 
205
257
  ```js
206
- mountMathEditor(host, session, {
258
+ mountMathEditor(host, {
259
+ session,
207
260
  toolbar: ['fraction', 'root', 'norm'],
208
261
  toolbarMaxItems: 2,
209
262
  });
@@ -213,7 +266,7 @@ mountMathToolbar(toolbarHost, session, {
213
266
  });
214
267
  ```
215
268
 
216
- `toolbar: false` hides the toolbar. A structure array filters its structure buttons only: it does not disable those structures in suggestions, parsing or the model, and does not filter React's auxiliary template/symbol controls. `toolbarMaxItems` (independent toolbar: `maxItems`) is a nonnegative count; zero initially hides all structure buttons behind More. A sufficiently large count shows all selected structure buttons initially. Expanded state belongs to the mounted toolbar and is not saved in the math document. The rich React `toolbar` array and compact behavior are available in 0.2.0.
269
+ `toolbar: false` hides the toolbar. A structure array filters structure buttons; the workspace native toolbar also filters templates by their structure kinds and limits grid presets/context controls to allowed kinds. Symbol search remains available. Rich React's auxiliary controls retain their existing behavior. Toolbar filtering does not restrict suggestions, parsing or the model. `toolbarMaxItems` (independent toolbar: `maxItems`) is a nonnegative count; zero initially hides all structure buttons behind More. A sufficiently large count shows all selected structure buttons initially. Expanded state is not saved in the math document. The rich React `toolbar` array and compact behavior are available in 0.2.0; the native discovery/context additions are included in 0.4.0.
217
270
 
218
271
  Workspace: added `\tilde`, `\bar`, `\dot`, `\ddot`, `\widehat` and `\widetilde` with exact-command parsing/export, localized suggestions, one-slot wrapping and fixed/stretchy accent rendering. Available in 0.2.0.
219
272
 
@@ -227,18 +280,73 @@ Set `--me-font-size` on the host (for example `18px`) to keep React token previe
227
280
 
228
281
  ### Explicit fraction sizes (workspace)
229
282
 
230
- Import or type the suggestions `dfrac`, `tfrac`, `dbinom`, and `tbinom` for display/text fraction and binomial presets. The editor preserves their size on export. See [LaTeX guide](LATEX-GUIDE.md); available in 0.2.0.
283
+ Import or type the suggestions `dfrac`, `tfrac`, `dbinom`, and `tbinom` for display/text fraction and binomial presets. The editor preserves their size on export. See [LaTeX guide](https://math-editor.barocss.com/docs/latex-guide.html); available in 0.2.0.
231
284
 
232
285
  ### Math alphabet support (workspace)
233
286
 
234
- `\mathbf`, `\mathcal` and multi-letter `\mathbb` now support import, suggestions, range wrapping, editing and export. See [alphabet scope and examples](LATEX-GUIDE.md#mathematical-alphabets--020). Available in 0.2.0.
287
+ `\mathbf`, `\mathcal` and multi-letter `\mathbb` now support import, suggestions, range wrapping, editing and export. See [alphabet scope and examples](https://math-editor.barocss.com/docs/latex-guide.html#mathematical-alphabets--020). Available in 0.2.0.
235
288
 
236
289
  ### Labeled arrows (workspace)
237
290
 
238
- `\xrightarrow[below]{above}` and `\xleftarrow[below]{above}` support parsing, suggestions, editable math labels and export. See [label syntax and slot order](LATEX-GUIDE.md#labeled-arrows--020). Available in 0.2.0.
291
+ `\xrightarrow[below]{above}` and `\xleftarrow[below]{above}` support parsing, suggestions, editable math labels and export. See [label syntax and slot order](https://math-editor.barocss.com/docs/latex-guide.html#labeled-arrows--020). Available in 0.2.0.
239
292
 
240
293
  ## Keyboard ranges and brace discovery (0.2.1)
241
294
 
242
- Shift+Left/Right extends or shrinks the same model range used by dragging. Structures are crossed as balanced units; copied and deleted ranges use existing model normalization. Shift+Up/Down extends to an adjacent top-level document line, using a logical text offset rather than pixel-based column matching; grid-cell rectangular selection is not added. Copy, cut, wrapping, deletion and Undo use the existing range behavior. IME composition and modifier shortcuts retain their existing handling.
295
+ Shift+Left/Right extends or shrinks the same model range used by dragging. Structures are crossed as balanced units; copied and deleted ranges use existing model normalization. Shift+Up/Down extends to an adjacent top-level document line, using a logical text offset rather than pixel-based column matching; when a matrix-cell selection is active, Shift+arrows instead moves its rectangular focus corner. Copy, cut, wrapping, deletion and Undo use the existing range behavior. IME composition and modifier shortcuts retain their existing handling.
296
+
297
+ After a model selection, plain Left/Up restores the caret at its document-ordered
298
+ start; Right/Down restores it at the end. The same rule applies to reverse drags
299
+ and Shift+arrow selections, without consuming another character or changing the
300
+ formula. Alt+Up/Down browses the wrapping suggestions while retaining the range;
301
+ Enter applies a candidate. Ordinary input suggestions still use Up/Down.
243
302
 
244
303
  Typing `{` offers both paired braces and cases. Paired braces remain the first candidate; choose Cases explicitly to insert its editable grid.
304
+
305
+
306
+ ### Sharing a native toolbar between editors (workspace)
307
+
308
+ `mountMathToolbar(host, sessionOrNull, options)` now returns
309
+ `{ setSession, setDisabled, destroy }`. Call `setSession(activeEditor.session)` when an editor
310
+ becomes active and `setSession(null)` when editing ends. Detaching disables editing
311
+ actions and unsubscribes from the previous session. `options.locale` supplies labels
312
+ before the first session is attached; active sessions supply their own locale.
313
+ `setDisabled(true)` keeps the session attached while disabling mutations and closing
314
+ symbol search; restore it with `false` after composition. An internally mounted
315
+ native toolbar coordinates this automatically. Independent toolbar hosts own focus,
316
+ draft lifecycle and composition handling. `onExecute` runs after a successful command
317
+ so the host can return focus to the math editor; browsing tools does not commit the
318
+ draft. See the [session toolbar API](https://math-editor.barocss.com/docs/api-session.html#independent-toolbar-and-outputs).
319
+ The Tiptap/ProseMirror integration coordinates these through its `toolbarHost` option.
320
+
321
+ These native UI additions use the existing model and LaTeX grammar. English/Korean
322
+ remain the complete bundled locale packs, and actual OS IME testing remains deferred.
323
+
324
+ ## Matrix cell editing — workspace
325
+
326
+ Drag across matrix cells or Shift+click another cell to select a rectangle. For
327
+ keyboard selection, choose **Select cells**, then extend with Shift+arrows;
328
+ **Select all cells** selects the whole matrix. Copy and cut include nested formulas.
329
+ Delete clears selected contents while keeping the grid; typing replaces the
330
+ rectangle with text in its upper-left cell. Enter or Escape returns to editing.
331
+
332
+ Paste a copied rectangle into a matching selection, or start at one cell and let
333
+ the matrix grow within 20 × 20. A single copied cell fills a larger selection.
334
+ Rectangular tab-separated spreadsheet text is also accepted inside matrices;
335
+ ragged or mismatched shapes fail without partial writes. Copied cells pasted
336
+ outside a matrix become a new matrix. The plain-text clipboard fallback is LaTeX.
337
+
338
+ **Transpose matrix** exchanges all rows and columns, preserving the delimiter,
339
+ nested content and caret. Paste, cut, clear and transpose each take one Undo.
340
+ These operations are available in both renderers and the framework-free
341
+ [session API](https://math-editor.barocss.com/docs/api-session.html#matrix-cell-selections).
342
+
343
+ ## Style customization
344
+
345
+ Use inherited CSS variables for colors, slot backgrounds, typography, toolbar density and menu appearance. Scoped themes also follow portaled suggestions in both renderers. See [Styling & themes](https://math-editor.barocss.com/docs/styling.html) for the public variables, dark/monochrome examples, shared toolbars and iframe/plugin sizing.
346
+
347
+ ## License
348
+
349
+ MIT License. Copyright (c) 2026 barocss.com.
350
+
351
+ The npm package includes the full license in `LICENSE`. Bundled KaTeX fonts retain
352
+ their separate copyright and MIT notice in `src/fonts/LICENSE-KaTeX.txt`.
package/ROADMAP.md CHANGED
@@ -2,6 +2,71 @@
2
2
 
3
3
  This roadmap describes priorities, not release promises. The current package is an independent editing prototype. Production integration requires the reliability work below even if additional notation is implemented first.
4
4
 
5
+
6
+
7
+ ## Editing utilities — workspace, 2026-09-09
8
+
9
+ Included in 0.4.0:
10
+
11
+ - Native lexical-token input now matches rich React colors and offsets. Token-boundary navigation/deletion preserves surrounding text; composition retains the input until commit.
12
+ - Explicit LaTeX insertion at the caret or range, exposed as `pasteLatex`, More tools → Paste as LaTeX, and Alt+Shift+V. Parsing/placement failures preserve the document. Ordinary paste stays literal.
13
+ - Recent symbols/templates and favorites, with a shareable validated preference store. Preferences are separate from formula history; persistence belongs to the host.
14
+ - Contextual fence, fraction/binomial size, and operator-bound placement controls. Existing contents, IDs and caret are preserved with one-step Undo.
15
+
16
+ See [API and usage](API-SESSION.md#editing-utilities--workspace). No new LaTeX grammar or automatic algebraic transformation is added. Persistent vertical columns, broader browsers, performance budgets and accessibility remain open.
17
+
18
+ ## Scoped style customization — workspace, 2026-09-09
19
+
20
+ Implemented: inherited CSS variables for UI/token colors, slot backgrounds,
21
+ controls, toolbar density and floating menus. Both renderers retain per-editor
22
+ palette values on suggestion/selection portals and follow live ancestor theme
23
+ switches. Shared plugin panels/actions use the same palette; persisted host
24
+ formula sizing remains document data. The site includes default/dark/monochrome,
25
+ base-size and compact-spacing controls. See [Styling & themes](STYLING.md).
26
+
27
+
28
+ ## Selection-to-caret keyboard behavior — workspace, 2026-09-09
29
+
30
+ Both renderers now restore the caret when a plain arrow follows a Shift+arrow or
31
+ pointer model selection. Left/Up uses the ordered start; Right/Down uses the end.
32
+ Typing continues at that position without replacing the former range. Wrapping
33
+ suggestions remain selectable with Alt+Up/Down or the pointer. The operation does
34
+ not change the formula or create Undo entries.
35
+
36
+ ## Matrix rectangles and transpose — workspace, 2026-09-09
37
+
38
+ Both editing surfaces now distinguish cross-cell rectangles from text selection
39
+ inside a cell. Drag between cells or Shift+click to select a rectangle. Select
40
+ cells starts keyboard selection; Shift+arrows changes the focus corner. Copy/cut
41
+ preserves nested formula trees; paste accepts matching rectangles or grows from
42
+ a single cell within 20 × 20. One copied cell can fill a rectangle. Ragged TSV,
43
+ invalid clipboard data, mismatched shapes and oversized results are rejected
44
+ without changing the formula. Delete clears cells; Enter/Escape resumes editing.
45
+
46
+ Transpose matrix moves the entire matrix, preserving cell IDs, nested caret,
47
+ delimiters and one-step Undo. No numerical evaluation or new LaTeX grammar is
48
+ introduced. See [the API contract](API-SESSION.md#matrix-cell-selections) for payloads
49
+ and paste rules. Real OS clipboard and touch selection remain separate checks.
50
+
51
+ ## Native toolbar and selection parity — workspace, 2026-09-09
52
+
53
+ Included in 0.4.0: More tools exposes searchable All symbols,
54
+ templates, matrix/identity presets and symbol shortcuts. The active grid toolbar
55
+ offers matrix row/column operations and delimiter changes, with row operations for
56
+ aligned/cases. External toolbar handles now expose `setDisabled` alongside
57
+ `setSession` and `destroy` for composition and draft lifecycle coordination.
58
+
59
+ Native selection highlights now preserve partial text endpoints. A drag can begin
60
+ inside the active input and continue across structures as a model range. Shift+arrow
61
+ model ranges are already implemented; vertical range extension uses logical line
62
+ offsets. The new work does not add LaTeX syntax.
63
+
64
+ Remaining work includes persistent vertical preferred
65
+ columns, and wider browser/accessibility coverage. English/Korean remain the complete
66
+ bundled locale packs; additional complete packs remain open. Native OS IME validation
67
+ is still deferred at the user's request. See [renderer parity](ADAPTERS.md#current-renderer-parity)
68
+ and [validation](VALIDATION.md) for the current boundary and evidence.
69
+
5
70
  ## Remaining LaTeX priorities: workspace review, 2026-09-08
6
71
 
7
72
  These are proposals, not accepted import syntax. Complete each feature through the model, parser, exporter, suggestions and both editing surfaces before calling it supported.
@@ -53,7 +118,7 @@ Norms are implemented in the workspace. Triple and contour integrals are impleme
53
118
  | Host Enter/commit/cancel contract and modal suggestions | Implemented | Product selection/undo integration and real IME/browser matrix |
54
119
  | Layout lab: inline, next-block flow, popup draft/cancel/apply | Implemented | Integrate the actual Note node view first |
55
120
  | Note/Word/Site/Slide persistence adapters | Note workspace popup trial implemented | Validate other browsers and real host caret/undo workflows; Word/Site/Slide adapters and OMML conversion remain open |
56
- | Downloadable SVG/PNG output | Not implemented | Dedicated renderer/export contract, fonts and scaling |
121
+ | Reusable library SVG/PNG output | Not implemented | Dedicated renderer/export contract, fonts and scaling; the website already provides sized PNG download/copy from its preview |
57
122
 
58
123
  See [Embedding](EMBEDDING.md) for existing Note/Word model boundaries. Note has a popup integration trial. The user confirmed that Note inline editing is resolved. This release focuses on math-editor; product-specific validation is tracked separately.
59
124
 
@@ -62,15 +127,15 @@ See [Embedding](EMBEDDING.md) for existing Note/Word model boundaries. Note has
62
127
  | Work | Status | Remaining gate |
63
128
  |---|---|---|
64
129
  | Framework-free session / public commands | Implemented | Host-wide undo integration, performance and document validation |
65
- | Native DOM surface / pure JS entry | Integration preview | Rich React selection, catalog and composition parity |
130
+ | Native DOM surface / pure JS entry | Integration preview | Native discovery/context tools and precise pointer ranges implemented in workspace; token-level input/color is implemented; wider composition coverage remains |
66
131
  | Web Component / Vue / Svelte / Solid / React native wrappers | Implemented | Wider framework-version matrix and SSR/hydration strategy |
67
- | Optional and separately mounted toolbar | Implemented in native surface | Context-sensitive professional toolbar and symbol browser |
132
+ | Optional and separately mounted toolbar | Implemented in native surface | Symbol browser, templates/presets and grid context controls added in workspace; broader context grouping and user customization remain |
68
133
  | Inline single-top-level-line policy | Implemented in native surface | Real product prose integration, baseline/keyboard exit UX |
69
134
  | External locale dictionary / aliases / fallback / direction | Implemented | Complete extra language packs and RTL audit |
70
135
  | ESM subpath distribution / optional framework peers | Implemented | Release approval, registry publication, bundle budgets |
71
136
  | Rich React renderer remains available | Preserved | Move main export only after measured parity |
72
137
 
73
- Next integration work: finish the native symbol panel and precise range highlights; unify token editing/composition behavior; add keyboard structural selection. Measure load/typing cost in host products; Note inline editing is already resolved. Do not add new notation to both renderers independently before shared behavior is stable. See [adapter parity and API](ADAPTERS.md).
138
+ Next integration work: verify the new active-input parity across more browsers, extend browser/accessibility coverage, and measure load/typing cost in host products. The native symbol panel, precise range highlights, active-input cross-structure drag and Shift+arrow model selection are implemented in the workspace. Note inline editing is already resolved. Do not add new notation to both renderers independently before shared behavior is stable. See [adapter parity and API](ADAPTERS.md).
74
139
 
75
140
  ## Delivered baseline
76
141
 
@@ -86,8 +151,8 @@ Next integration work: finish the native symbol panel and precise range highligh
86
151
  | Work | Acceptance criteria |
87
152
  |---|---|
88
153
  | Real input-method matrix | macOS and Windows Korean composition, cancellation, blur and locale change preserve text and commit once; currently deferred by user request |
89
- | Keyboard model ranges | Shift+arrows extend/collapse across tokens and structures; typing replaces selection; undo restores a predictable caret |
90
- | Structural navigation | Predictable up/down movement in fractions, roots and scripts; direction and selection affinity covered by tests |
154
+ | Keyboard model ranges — implemented | Shift+arrows extend/collapse across text and structures; typing replaces selection; wider browser/IME coverage and pixel-column vertical extension remain |
155
+ | Structural navigation — implemented in workspace | Shared React/native Up/Down movement for fractions, scripts, indexed roots and operator slots; nearest rendered horizontal caret, inner-structure precedence and matrix columns covered by model tests. Persistent preferred-column state and wider browser coverage remain open |
91
156
  | Saved-document validation | Shape/duplicate-ID validation is implemented; version migration and host recovery remain |
92
157
  | Host session adapter | Enter/exit and save work in one target product; a single coherent undo path across host and formula |
93
158
  | Browser/accessibility coverage | Safari, Firefox and Windows Chromium; screen-reader names and suggestion announcements; touch selection and narrow layouts |
@@ -114,8 +179,8 @@ See the [LaTeX editing guide](LATEX-GUIDE.md) for supported examples and the nex
114
179
  | Feature | Acceptance criteria |
115
180
  |---|---|
116
181
  | Subset LaTeX import — implemented in workspace | Extend the documented grammar incrementally; preserve unsupported input without changing the existing formula |
117
- | Rectangular cell selection | Row/column geometry, copy/paste shape rules, partial destination handling and undo |
118
- | Matrix transformations | Transpose and delimiter changes preserve all cell contents and caret; no implicit numeric computation |
182
+ | Rectangular cell selection — implemented in workspace | Cross-cell drag, Shift+click, keyboard expansion, shape-checked copy/paste, clear and one-step Undo; external clipboard/touch validation remains |
183
+ | Matrix transformations — implemented in workspace | Delimiter changes and full-matrix transpose preserve cell contents, nested caret and Undo; selected-submatrix transforms and numeric computation are not included |
119
184
  | Drag matrix size picker | Accessible keyboard equivalent, touch behavior, 1–20 bounds and one-step insertion |
120
185
  | Multi-alignment and multiline wrapping | Explicit grouping semantics; do not flatten lines or move relation signs unexpectedly |
121
186
  | External clipboard compatibility | Verify custom-format survival and LaTeX fallback across target browsers and applications |
@@ -164,7 +229,7 @@ the npm version and deployed runtime artifact are unchanged.
164
229
  - [x] Vector, hat and overline accents with editable bodies and selection wrapping.
165
230
  - [x] Additional delimiters, mixed/invisible ends and overset/underset annotations.
166
231
  - [x] Over/under brace annotations with editable annotation/body slots.
167
- - [x] Explicit side-placement import/export (`\nolimits`); a dedicated toolbar switch remains open.
232
+ - [x] Explicit side-placement import/export (`\nolimits`) and contextual toolbar placement controls.
168
233
 
169
234
  - [x] Workspace: `limit` condition/body model, LaTeX import/export, localized suggestions and React/native editing.
170
235
  - [x] Semantic function color for named/custom operators and the limit glyph.
@@ -188,10 +253,27 @@ Seven rich React/KaTeX comparisons are complete; production fixes are pending. P
188
253
 
189
254
  Spacing follow-up implemented: shared grid fence shapes, tighter grid/fraction/script/accent layouts, bounded nested fraction sizes, and a smaller boundary focus target. Chromium import/edit checks pass; the measured first-boundary expansion fell from 20px to 8px. Full recursive math-style sizing, additional browser/accessibility checks and eliminating all cursor-induced movement remain open.
190
255
 
191
- Workspace toolbar overflow is implemented: configurable structure-button limits and More/Fewer controls, rich React/native filtering, and always-visible history actions. Context-sensitive grouping and user-persisted toolbar customization remain future work.
256
+ Workspace toolbar overflow is implemented: configurable structure-button limits and More/Fewer controls, rich React/native filtering, and always-visible history actions. Native symbol/template discovery and grid context controls are also implemented as described above. Broader context-sensitive grouping and user-persisted toolbar customization remain future work.
192
257
 
193
258
  Locale regression: misplaced alphabet/arrow messages moved inside `messages`; pack-shape/build validation and en/ko browser coverage added.
194
259
 
195
260
  ### 0.2.1
196
261
 
197
- Keyboard model selection with Shift+arrows and `{` cases discovery are implemented. The dedicated demo adds sized PNG download/copy and fit preview; image generation remains site-only. Pixel-column vertical selection and rectangular grid ranges remain future work.
262
+ Keyboard model selection with Shift+arrows and `{` cases discovery are implemented. The dedicated demo adds sized PNG download/copy and fit preview; image generation remains site-only. Pixel-column vertical selection remains future work. Matrix cell rectangles and transpose are implemented in the workspace; aligned/cases retain structural ranges.
263
+
264
+ ## Tiptap / ProseMirror integration preview (2026-09-08)
265
+
266
+ A separate private development package, `packages/math-editor-integrations`, now
267
+ provides Tiptap 3 and ProseMirror 1 math nodes using the existing DOM editor. It
268
+ supports direct editing in the text flow, optional panel editing, JSON/LaTeX storage,
269
+ HTML clipboard round trips, Apply/Cancel, and host Undo. The sample runs from
270
+ `apps/math-integrations` at port 5185.
271
+
272
+ As of 2026-09-09, the integration preview covers nine hosts in one sample page.
273
+ Site staging includes `/integrations/` and rendered integration documentation.
274
+ The shared source package stays private; nine host-specific npm packages have
275
+ separate Changesets and artifact preparation. The release set is core `0.4.0` and plugins `0.1.0`. The
276
+ core and all nine plugins now use MIT, with a LICENSE file in each package.
277
+ Plugin publication remains pending. See the [integration roadmap](../math-editor-integrations/ROADMAP.md),
278
+ [validation record](../math-editor-integrations/VALIDATION.md), and
279
+ [release guide](../math-editor-integrations/docs/RELEASING.md).