@barocss/math-editor 0.2.0 → 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 +51 -1
  10. package/EMBEDDING.md +4 -0
  11. package/IMPLEMENTATION.md +27 -2
  12. package/JSON-MODEL.md +1 -0
  13. package/LATEX-GUIDE.md +13 -0
  14. package/LATEX-SCOPE.md +2 -2
  15. package/LICENSE +1 -3
  16. package/README.md +150 -36
  17. package/ROADMAP.md +96 -10
  18. package/STYLING.md +157 -0
  19. package/SUPPORT.md +29 -11
  20. package/VALIDATION.md +117 -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 +527 -126
  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 +28 -2
  70. package/dist/locales/en.json +28 -2
  71. package/dist/locales/ko.js +28 -2
  72. package/dist/locales/ko.json +28 -2
  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 +300 -44
  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 +4 -1
  94. package/dist/range.js +57 -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 +103 -13
  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/src/style.css CHANGED
@@ -6,18 +6,19 @@
6
6
  unicode-range: U+0030-0039, U+223C;
7
7
  }
8
8
  .me-editor {
9
- --me-accent: #236957;
10
- --me-line: #d9e1dd;
11
- color: #202c27;
12
- font-family: system-ui, sans-serif;
9
+ color: var(--me-text, #202c27);
10
+ font-family: var(--me-ui-font-family, system-ui, sans-serif);
11
+ background: var(--me-background, transparent);
13
12
  }
14
13
  .me-tools {
14
+ color: var(--me-text, #202c27);
15
+ background: var(--me-toolbar-background, transparent);
15
16
  display: flex;
16
17
  align-items: center;
17
18
  flex-wrap: wrap;
18
- gap: 4px;
19
- padding: 12px;
20
- border-bottom: 1px solid var(--me-line);
19
+ gap: var(--me-toolbar-gap, 4px);
20
+ padding: var(--me-toolbar-padding, 12px);
21
+ border-bottom: 1px solid var(--me-line, #d9e1dd);
21
22
  }
22
23
  .me-tools button {
23
24
  display: flex;
@@ -25,33 +26,33 @@
25
26
  gap: 7px;
26
27
  background: transparent;
27
28
  border: 1px solid transparent;
28
- border-radius: 6px;
29
+ border-radius: var(--me-control-radius, 6px);
29
30
  padding: 7px 9px;
30
31
  color: inherit;
31
32
  cursor: pointer;
32
- font: 12px system-ui;
33
+ font: 12px var(--me-ui-font-family, system-ui, sans-serif);
33
34
  }
34
35
  .me-tools button span {
35
36
  font: 20px 'Barocss Math Glyphs', Georgia, serif;
36
37
  }
37
38
  .me-tools button:hover {
38
- background: #edf3ef;
39
+ background: var(--me-hover-background, #edf3ef);
39
40
  }
40
41
  .me-tools button:disabled {
41
42
  opacity: 0.35;
42
43
  cursor: default;
43
44
  }
44
45
  .me-tools button:focus-visible {
45
- outline: 2px solid var(--me-accent);
46
+ outline: 2px solid var(--me-accent, #236957);
46
47
  }
47
48
  .me-divider {
48
49
  height: 20px;
49
- border-left: 1px solid var(--me-line);
50
+ border-left: 1px solid var(--me-line, #d9e1dd);
50
51
  margin: 0 6px;
51
52
  }
52
53
  .me-surface {
53
- min-height: 190px;
54
- padding: 48px 32px;
54
+ min-height: var(--me-surface-min-height, 190px);
55
+ padding: var(--me-surface-padding, 48px 32px);
55
56
  display: flex;
56
57
  align-items: center;
57
58
  overflow-x: auto;
@@ -82,8 +83,8 @@
82
83
  outline: none;
83
84
  }
84
85
  .me-input:focus {
85
- background: #e7f2ed;
86
- box-shadow: 0 2px 0 var(--me-accent);
86
+ background: var(--me-active-background, #e7f2ed);
87
+ box-shadow: 0 2px 0 var(--me-accent, #236957);
87
88
  }
88
89
  .me-input::placeholder {
89
90
  color: #aabbb1;
@@ -137,10 +138,10 @@
137
138
  left: 0;
138
139
  min-width: 180px;
139
140
  padding: 5px;
140
- border: 1px solid var(--me-line);
141
+ border: 1px solid var(--me-line, #d9e1dd);
141
142
  border-radius: 8px;
142
- background: white;
143
- box-shadow: 0 8px 24px #172c2420;
143
+ background: var(--me-panel-background, white);
144
+ box-shadow: var(--me-menu-shadow, 0 8px 24px #172c2420);
144
145
  display: flex;
145
146
  flex-direction: column;
146
147
  }
@@ -149,18 +150,19 @@
149
150
  justify-content: space-between;
150
151
  gap: 20px;
151
152
  border: 0;
152
- background: white;
153
+ background: var(--me-panel-background, white);
153
154
  padding: 9px;
154
155
  text-align: left;
155
- color: #202c27;
156
- border-radius: 4px;
156
+ color: var(--me-text, #202c27);
157
+ border-radius: var(--me-control-radius, 4px);
158
+ font: inherit;
157
159
  cursor: pointer;
158
160
  }
159
161
  .me-suggestions button[aria-selected='true'] {
160
- background: #e7f2ed;
162
+ background: var(--me-active-background, #e7f2ed);
161
163
  }
162
164
  .me-suggestions small {
163
- color: #6a7b72;
165
+ color: var(--me-muted, #6a7b72);
164
166
  }
165
167
 
166
168
  /* The hidden twin uses browser font shaping, including CJK fallback fonts and IME drafts.
@@ -193,36 +195,52 @@
193
195
  padding-inline: 1px;
194
196
  }
195
197
  .me-empty-boundary .me-input {
196
- border: 1px dashed var(--me-line);
198
+ border: 1px dashed var(--me-line, #d9e1dd);
197
199
  }
198
200
  .me-suggestion-panel {
199
201
  position: fixed;
200
- z-index: 1000;
202
+ z-index: var(--me-menu-z-index, 1000);
201
203
  display: flex;
202
204
  flex-direction: column;
203
205
  width: min(336px, calc(100vw - 16px));
204
- background: #fff;
205
- color: #202c27;
206
- border: 1px solid #d9e1dd;
207
- border-radius: 10px;
208
- box-shadow: 0 12px 32px #172c2426;
209
- font: 13px/1.4 system-ui, sans-serif;
206
+ background: var(--me-panel-background, #fff);
207
+ color: var(--me-text, #202c27);
208
+ border: 1px solid var(--me-line, #d9e1dd);
209
+ border-radius: var(--me-radius, 10px);
210
+ box-shadow: var(--me-menu-shadow, 0 12px 32px #172c2426);
211
+ font: 13px/1.4 var(--me-ui-font-family, system-ui, sans-serif);
212
+ /* A menu can live inside a centered or formatted host document. */
213
+ text-align: start;
214
+ text-indent: 0;
215
+ text-transform: none;
216
+ letter-spacing: normal;
217
+ word-spacing: normal;
218
+ white-space: normal;
210
219
  overflow: hidden;
211
220
  }
212
221
  .me-suggestion-heading,
213
222
  .me-suggestion-footer {
214
223
  padding: 10px 12px;
215
224
  font-size: 11px;
216
- color: #708075;
225
+ color: var(--me-muted, #708075);
217
226
  flex-shrink: 0;
218
227
  }
219
228
  .me-suggestion-heading {
220
229
  display: flex;
230
+ flex-wrap: wrap;
221
231
  justify-content: space-between;
222
- border-bottom: 1px solid #edf0eb;
232
+ gap: 4px 12px;
233
+ border-bottom: 1px solid var(--me-line, #edf0eb);
234
+ }
235
+ .me-suggestion-query {
236
+ min-width: 0;
237
+ max-width: 100%;
238
+ overflow: hidden;
239
+ text-overflow: ellipsis;
240
+ white-space: nowrap;
223
241
  }
224
242
  .me-suggestion-footer {
225
- border-top: 1px solid #edf0eb;
243
+ border-top: 1px solid var(--me-line, #edf0eb);
226
244
  }
227
245
  .me-suggestion-panel .me-suggestions {
228
246
  position: static;
@@ -244,8 +262,13 @@
244
262
  .me-candidate-glyph {
245
263
  font: 26px 'Barocss Math Glyphs', Georgia, serif;
246
264
  min-width: 42px;
265
+ flex-shrink: 0;
247
266
  text-align: center;
248
267
  }
268
+ .me-candidate-copy {
269
+ min-width: 0;
270
+ overflow-wrap: anywhere;
271
+ }
249
272
  .me-suggestions strong {
250
273
  display: block;
251
274
  font-size: 13px;
@@ -277,63 +300,63 @@
277
300
 
278
301
  /* Slot roles are presentation metadata, not a claim that text is a variable or constant. */
279
302
  .me-row {
280
- --me-ink: #2358a0;
303
+ --me-ink: var(--me-variable, #2358a0);
281
304
  --me-tint: #eff5ff;
282
305
  --me-focus: #dbeaff;
283
- --me-ring: #3676d3;
306
+ --me-ring: var(--me-focus-color, #3676d3);
284
307
  }
285
308
  .me-row[data-math-role='numerator'],
286
309
  .me-row[data-math-role='base'] {
287
- --me-ink: #2358a0;
310
+ --me-ink: var(--me-variable, #2358a0);
288
311
  --me-tint: #eff5ff;
289
312
  --me-focus: #dbeaff;
290
- --me-ring: #3676d3;
313
+ --me-ring: var(--me-focus-color, #3676d3);
291
314
  }
292
315
  .me-row[data-math-role='denominator'],
293
316
  .me-row[data-math-role='radicand'] {
294
- --me-ink: #086b60;
317
+ --me-ink: var(--me-variable, #086b60);
295
318
  --me-tint: #eaf7f1;
296
319
  --me-focus: #cef0e4;
297
- --me-ring: #138777;
320
+ --me-ring: var(--me-focus-color, #138777);
298
321
  }
299
322
  .me-row[data-math-role='exponent'],
300
323
  .me-row[data-math-role='upper'] {
301
- --me-ink: #88430b;
324
+ --me-ink: var(--me-variable, #88430b);
302
325
  --me-tint: #fff4e5;
303
326
  --me-focus: #ffe2b4;
304
- --me-ring: #bd6a18;
327
+ --me-ring: var(--me-focus-color, #bd6a18);
305
328
  }
306
329
  .me-row[data-math-role='index'],
307
330
  .me-row[data-math-role='lower'] {
308
- --me-ink: #7c3d90;
331
+ --me-ink: var(--me-variable, #7c3d90);
309
332
  --me-tint: #f8eefb;
310
333
  --me-focus: #edd7f6;
311
- --me-ring: #9d50b1;
334
+ --me-ring: var(--me-focus-color, #9d50b1);
312
335
  }
313
336
  .me-row[data-math-role='group'] {
314
- --me-ink: #4e53a4;
337
+ --me-ink: var(--me-variable, #4e53a4);
315
338
  --me-tint: #f1f0ff;
316
339
  --me-focus: #e1dfff;
317
- --me-ring: #726ad0;
340
+ --me-ring: var(--me-focus-color, #726ad0);
318
341
  }
319
342
  .me-input {
320
343
  color: var(--me-ink);
321
- background: var(--me-tint);
344
+ background: var(--me-input-background, var(--me-tint));
322
345
  border-radius: 4px;
323
346
  caret-color: var(--me-ink);
324
347
  }
325
348
  .me-input:hover:not(:focus) {
326
- background: var(--me-focus);
349
+ background: var(--me-input-focus-background, var(--me-focus));
327
350
  box-shadow: none;
328
351
  }
329
352
  .me-input:focus {
330
- background: var(--me-focus);
353
+ background: var(--me-input-focus-background, var(--me-focus));
331
354
  outline: none;
332
355
  box-shadow: none;
333
356
  }
334
357
  .me-input::selection {
335
- color: white;
336
- background: var(--me-ring);
358
+ color: var(--me-selection-color, white);
359
+ background: var(--me-selection-background, var(--me-ring));
337
360
  }
338
361
  .me-input::placeholder {
339
362
  color: var(--me-ink);
@@ -344,7 +367,7 @@
344
367
  box-shadow: none;
345
368
  }
346
369
  .me-empty-boundary .me-input:hover:not(:focus) {
347
- background: var(--me-focus);
370
+ background: var(--me-input-focus-background, var(--me-focus));
348
371
  }
349
372
  .me-empty-boundary .me-input:focus {
350
373
  border-color: transparent;
@@ -439,18 +462,18 @@
439
462
  flex-wrap: wrap;
440
463
  gap: 8px;
441
464
  padding: 10px 14px;
442
- border-bottom: 1px solid #dce2e8;
443
- background: #f4f4fb;
444
- font: 12px system-ui;
445
- color: #4e53a4;
465
+ border-bottom: 1px solid var(--me-line, #dce2e8);
466
+ background: var(--me-subtle-background, #f4f4fb);
467
+ font: 12px var(--me-ui-font-family, system-ui, sans-serif);
468
+ color: var(--me-text, #4e53a4);
446
469
  }
447
470
  .me-matrix-tools button,
448
471
  .me-matrix-tools select {
449
472
  font: inherit;
450
473
  color: inherit;
451
- background: white;
452
- border: 1px solid #d6d5e6;
453
- border-radius: 5px;
474
+ background: var(--me-panel-background, white);
475
+ border: 1px solid var(--me-line, #d6d5e6);
476
+ border-radius: var(--me-control-radius, 5px);
454
477
  padding: 6px 8px;
455
478
  }
456
479
  .me-matrix-tools button:disabled {
@@ -458,7 +481,7 @@
458
481
  }
459
482
  .me-matrix-tools small {
460
483
  font-size: 11px;
461
- color: #77758b;
484
+ color: var(--me-muted, #77758b);
462
485
  }
463
486
 
464
487
  .me-matrix-size {
@@ -466,8 +489,8 @@
466
489
  font-size: 12px;
467
490
  color: inherit;
468
491
  background: transparent;
469
- border: 1px solid #dcdfe2;
470
- border-radius: 5px;
492
+ border: 1px solid var(--me-line, #dcdfe2);
493
+ border-radius: var(--me-control-radius, 5px);
471
494
  padding: 6px;
472
495
  max-width: 100%;
473
496
  }
@@ -476,7 +499,7 @@
476
499
  display: flex;
477
500
  flex-direction: column;
478
501
  align-items: flex-start;
479
- gap: 18px;
502
+ gap: var(--me-line-gap, 18px);
480
503
  min-width: 0;
481
504
  }
482
505
  .me-document-line {
@@ -503,14 +526,14 @@
503
526
  opacity: 0.65;
504
527
  }
505
528
  .me-run[data-token-kind='variable'] .me-input {
506
- color: #245da1;
529
+ color: var(--me-variable, #245da1);
507
530
  }
508
531
  .me-run[data-token-kind='constant'] .me-input {
509
- color: #a65316;
532
+ color: var(--me-number, #a65316);
510
533
  font-style: normal;
511
534
  }
512
535
  .me-run[data-token-kind='symbol'] .me-input {
513
- color: #7853a6;
536
+ color: var(--me-symbol, #7853a6);
514
537
  font-style: normal;
515
538
  }
516
539
  .me-run[data-token-kind='constant'] .me-measure,
@@ -537,31 +560,31 @@
537
560
  align-items: center;
538
561
  gap: 14px;
539
562
  padding: 8px 16px;
540
- border-bottom: 1px solid var(--me-line);
541
- font: 11px system-ui;
542
- color: #78857e;
563
+ border-bottom: 1px solid var(--me-line, #d9e1dd);
564
+ font: 11px var(--me-ui-font-family, system-ui, sans-serif);
565
+ color: var(--me-muted, #78857e);
543
566
  }
544
567
  .me-token-legend [data-kind='variable'] {
545
- color: #245da1;
568
+ color: var(--me-variable, #245da1);
546
569
  }
547
570
  .me-token-legend [data-kind='constant'] {
548
- color: #a65316;
571
+ color: var(--me-number, #a65316);
549
572
  }
550
573
  .me-token-legend [data-kind='symbol'] {
551
- color: #7853a6;
574
+ color: var(--me-symbol, #7853a6);
552
575
  }
553
576
 
554
577
  .me-matrix[data-selected='true'] {
555
- outline: 2px solid #245da1;
578
+ outline: 2px solid var(--me-variable, #245da1);
556
579
  outline-offset: 3px;
557
- background: #245da112;
580
+ background: var(--me-selection-background, #245da112);
558
581
  border-radius: 3px;
559
582
  }
560
583
  .me-grid-selection-hint {
561
584
  padding: 8px 16px;
562
- font: 12px system-ui;
563
- color: #245da1;
564
- background: #eef5ff;
585
+ font: 12px var(--me-ui-font-family, system-ui, sans-serif);
586
+ color: var(--me-variable, #245da1);
587
+ background: var(--me-selection-background, #eef5ff);
565
588
  }
566
589
  .me-preview-token {
567
590
  position: absolute;
@@ -578,17 +601,17 @@
578
601
  user-select: none;
579
602
  }
580
603
  .me-preview-token:hover {
581
- background: var(--me-focus);
604
+ background: var(--me-input-focus-background, var(--me-focus));
582
605
  }
583
606
  .me-run[data-token-kind='variable'] .me-preview-token {
584
- color: #245da1;
607
+ color: var(--me-variable, #245da1);
585
608
  }
586
609
  .me-run[data-token-kind='constant'] .me-preview-token {
587
- color: #a65316;
610
+ color: var(--me-number, #a65316);
588
611
  font-style: normal;
589
612
  }
590
613
  .me-run[data-token-kind='symbol'] .me-preview-token {
591
- color: #7853a6;
614
+ color: var(--me-symbol, #7853a6);
592
615
  font-style: normal;
593
616
  }
594
617
  .me-superscript > .me-slot:last-child .me-preview-token,
@@ -600,7 +623,7 @@
600
623
  }
601
624
  .me-range-highlight,
602
625
  .me-empty[data-range-selected='true'] {
603
- background: #b9d8ff;
626
+ background: var(--me-selection-background, #b9d8ff);
604
627
  color: inherit;
605
628
  border-radius: 2px;
606
629
  }
@@ -608,7 +631,7 @@
608
631
  outline: none;
609
632
  }
610
633
  .me-surface:focus-visible {
611
- outline: 2px solid #3676d3;
634
+ outline: 2px solid var(--me-focus-color, #3676d3);
612
635
  outline-offset: -2px;
613
636
  }
614
637
  .me-line-number {
@@ -616,17 +639,17 @@
616
639
  margin-right: 16px;
617
640
  text-align: right;
618
641
  align-self: center;
619
- color: #8a9790;
620
- font: 11px/1.5 system-ui;
642
+ color: var(--me-muted, #8a9790);
643
+ font: 11px/1.5 var(--me-ui-font-family, system-ui, sans-serif);
621
644
  font-variant-numeric: tabular-nums;
622
645
  user-select: none;
623
646
  cursor: default;
624
647
  }
625
648
  .me-symbol-browser {
626
649
  padding: 16px;
627
- border-bottom: 1px solid var(--me-line);
628
- background: #f6f8f6;
629
- font: 12px/1.5 system-ui;
650
+ border-bottom: 1px solid var(--me-line, #d9e1dd);
651
+ background: var(--me-subtle-background, #f6f8f6);
652
+ font: 12px/1.5 var(--me-ui-font-family, system-ui, sans-serif);
630
653
  }
631
654
  .me-symbol-browser-heading {
632
655
  display: flex;
@@ -636,15 +659,15 @@
636
659
  }
637
660
  .me-symbol-browser-heading small {
638
661
  font-weight: 400;
639
- color: #6a7b72;
662
+ color: var(--me-muted, #6a7b72);
640
663
  margin-left: 8px;
641
664
  }
642
665
  .me-symbol-browser-heading button {
643
666
  font: inherit;
644
- background: white;
667
+ background: var(--me-panel-background, white);
645
668
  color: inherit;
646
- border: 1px solid var(--me-line);
647
- border-radius: 5px;
669
+ border: 1px solid var(--me-line, #d9e1dd);
670
+ border-radius: var(--me-control-radius, 5px);
648
671
  padding: 5px 10px;
649
672
  cursor: pointer;
650
673
  }
@@ -656,15 +679,15 @@
656
679
  }
657
680
  .me-symbol-search input {
658
681
  font: inherit;
659
- border: 1px solid var(--me-line);
660
- border-radius: 5px;
682
+ border: 1px solid var(--me-line, #d9e1dd);
683
+ border-radius: var(--me-control-radius, 5px);
661
684
  padding: 9px 10px;
662
685
  min-width: 0;
663
- background: white;
686
+ background: var(--me-panel-background, white);
664
687
  color: inherit;
665
688
  }
666
689
  .me-symbol-help {
667
- color: #627469;
690
+ color: var(--me-muted, #627469);
668
691
  margin: 8px 0 12px;
669
692
  }
670
693
  .me-symbol-grid {
@@ -683,24 +706,24 @@
683
706
  gap: 5px;
684
707
  min-height: 74px;
685
708
  padding: 8px 5px;
686
- border: 1px solid var(--me-line);
687
- border-radius: 6px;
688
- background: white;
709
+ border: 1px solid var(--me-line, #d9e1dd);
710
+ border-radius: var(--me-control-radius, 6px);
711
+ background: var(--me-panel-background, white);
689
712
  color: inherit;
690
- font: 11px/1.3 system-ui;
713
+ font: 11px/1.3 var(--me-ui-font-family, system-ui, sans-serif);
691
714
  cursor: pointer;
692
715
  overflow-wrap: anywhere;
693
716
  }
694
717
  .me-symbol-grid button:hover {
695
- background: #e7f2ed;
696
- border-color: #9cbbac;
718
+ background: var(--me-active-background, #e7f2ed);
719
+ border-color: var(--me-accent, #9cbbac);
697
720
  }
698
721
  .me-symbol-glyph {
699
722
  font: 25px/1.2 'Barocss Math Glyphs', Georgia, 'Times New Roman', serif;
700
723
  }
701
724
  .me-symbol-browser button:focus-visible,
702
725
  .me-symbol-search input:focus-visible {
703
- outline: 2px solid var(--me-accent);
726
+ outline: 2px solid var(--me-accent, #236957);
704
727
  outline-offset: 2px;
705
728
  }
706
729
 
@@ -725,28 +748,22 @@
725
748
  color: var(--me-symbol, #7650b2);
726
749
  }
727
750
  .me-dom-editor .me-dom-selected {
728
- background: #dbeafe;
751
+ background: var(--me-selection-background, #dbeafe);
729
752
  border-radius: 3px;
730
753
  }
731
754
  .me-dom-status {
732
755
  display: block;
733
- font: 12px/1.5 sans-serif;
756
+ font: 12px/1.5 var(--me-ui-font-family, system-ui, sans-serif);
734
757
  }
735
758
  .me-dom-status:empty {
736
759
  display: none;
737
760
  }
738
- .me-dom-menu {
739
- position: fixed;
740
- z-index: 1000;
741
- max-height: 230px;
742
- overflow-y: auto;
743
- width: 290px;
744
- }
745
761
  .me-dom-menu[hidden] {
746
762
  display: none;
747
763
  }
748
- .me-dom-menu .me-suggestions {
749
- position: static;
764
+ .me-dom-menu[data-compact='true'] .me-suggestion-heading,
765
+ .me-dom-menu[data-compact='true'] .me-suggestion-footer {
766
+ display: none;
750
767
  }
751
768
  .me-dom-editor[data-mode='inline'] {
752
769
  display: inline-block;
@@ -755,7 +772,7 @@
755
772
  }
756
773
  .me-dom-editor[data-mode='inline'] .me-surface {
757
774
  display: inline-block;
758
- padding: 2px 4px;
775
+ padding: var(--me-inline-padding, 2px 4px);
759
776
  min-height: 0;
760
777
  }
761
778
  .me-dom-editor[data-mode='inline'] .me-document-lines {
@@ -802,7 +819,7 @@
802
819
  font-family: 'Barocss Math Glyphs', Georgia, serif;
803
820
  font-style: normal;
804
821
  white-space: pre;
805
- color: #263b32;
822
+ color: var(--me-text, #263b32);
806
823
  }
807
824
  .me-textGroup .me-preview-token *,
808
825
  .me-operatorName .me-preview-token * {
@@ -946,13 +963,10 @@
946
963
  }
947
964
 
948
965
  /* Functions are semantic operator nodes, distinct from ordinary variables. */
949
- .me-editor {
950
- --me-function: #087b78;
951
- }
952
966
  .me-operatorName :is(.me-input, .me-preview-token, .me-measure),
953
967
  .me-limit-glyph,
954
968
  .me-token-legend [data-kind='function'] {
955
- color: var(--me-function);
969
+ color: var(--me-function, #087b78);
956
970
  }
957
971
 
958
972
  /* Explicit LaTeX spacing is content, independent of empty caret hit areas. */
@@ -969,7 +983,7 @@
969
983
  }
970
984
  .me-quad:hover,
971
985
  .me-qquad:hover {
972
- background: var(--me-focus);
986
+ background: var(--me-input-focus-background, var(--me-focus));
973
987
  }
974
988
 
975
989
  .me-roman :is(.me-input, .me-measure, .me-preview-token) {
@@ -1336,10 +1350,10 @@
1336
1350
  min-height: 32px;
1337
1351
  padding: 7px 12px;
1338
1352
  gap: 9px;
1339
- border: 1px solid #b8cec3;
1340
- border-radius: 7px;
1341
- background: #edf4ef;
1342
- color: #245443;
1353
+ border: 1px solid var(--me-accent, #b8cec3);
1354
+ border-radius: var(--me-control-radius, 7px);
1355
+ background: var(--me-active-background, #edf4ef);
1356
+ color: var(--me-accent, #245443);
1343
1357
  font-weight: 600;
1344
1358
  white-space: nowrap;
1345
1359
  }
@@ -1355,16 +1369,46 @@
1355
1369
  transform: translateY(2px) rotate(225deg);
1356
1370
  }
1357
1371
  .me-tools .me-toolbar-toggle:hover {
1358
- background: #dfece4;
1359
- border-color: #8fac9c;
1372
+ background: var(--me-hover-background, #dfece4);
1373
+ border-color: var(--me-accent, #8fac9c);
1360
1374
  }
1361
1375
  .me-tools .me-toolbar-toggle[aria-expanded='true'] {
1362
- background: #dfece4;
1376
+ background: var(--me-hover-background, #dfece4);
1363
1377
  }
1364
1378
  .me-tools .me-toolbar-toggle:focus-visible {
1365
1379
  outline-offset: 2px;
1366
1380
  }
1367
1381
 
1382
+ /* Native discovery panels share their toolbar's containment and iframe document. */
1383
+ .me-dom-toolbar-panels {
1384
+ display: block;
1385
+ min-width: 0;
1386
+ max-width: 100%;
1387
+ }
1388
+ .me-dom-toolbar-panels[hidden],
1389
+ .me-dom-grid-tools[hidden] {
1390
+ display: none;
1391
+ }
1392
+ .me-dom-symbol-browser {
1393
+ box-sizing: border-box;
1394
+ max-width: 100%;
1395
+ border: 1px solid var(--me-line, #d9e1dd);
1396
+ border-radius: 0 0 8px 8px;
1397
+ color: var(--me-text, #202c27);
1398
+ }
1399
+ .me-dom-symbol-browser .me-symbol-grid {
1400
+ max-height: min(350px, 45vh);
1401
+ }
1402
+ .me-dom-symbol-browser .me-symbol-grid button:focus-visible {
1403
+ background: var(--me-active-background, #e7f2ed);
1404
+ border-color: var(--me-accent, #9cbbac);
1405
+ }
1406
+ .me-dom-grid-tools {
1407
+ flex-wrap: wrap;
1408
+ margin: 0;
1409
+ border-top: 0;
1410
+ }
1411
+
1368
1412
  /* Fixed accents stay centered; wide variants follow the editable body. */
1369
1413
  :is(.me-tilde, .me-bar, .me-dot, .me-ddot, .me-widehat, .me-widetilde) {
1370
1414
  position: relative;
@@ -1602,3 +1646,84 @@
1602
1646
  justify-self: start;
1603
1647
  transform: scaleX(-1);
1604
1648
  }
1649
+ .me-matrix-cell[data-cell-selected='true'] {
1650
+ background: color-mix(in srgb, var(--me-accent, #32745d) 18%, transparent);
1651
+ border-radius: 0.12em;
1652
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--me-accent, #32745d) 35%, transparent);
1653
+ }
1654
+
1655
+ /* Shared, nonmodal utilities keep native input and host draft events contained. */
1656
+ .me-utility-panel {
1657
+ padding: 12px;
1658
+ border-top: 1px solid var(--me-line, #dcdfe2);
1659
+ font: 13px/1.5 system-ui, sans-serif;
1660
+ color: var(--me-text, #253b33);
1661
+ }
1662
+ .me-utility-panel label {
1663
+ display: grid;
1664
+ gap: 6px;
1665
+ }
1666
+ .me-utility-panel textarea {
1667
+ width: 100%;
1668
+ box-sizing: border-box;
1669
+ resize: vertical;
1670
+ padding: 8px;
1671
+ font: 14px/1.5 monospace;
1672
+ color: inherit;
1673
+ background: var(--me-control-bg, #fff);
1674
+ border: 1px solid var(--me-line, #dcdfe2);
1675
+ border-radius: var(--me-control-radius, 5px);
1676
+ }
1677
+ .me-utility-actions {
1678
+ display: flex;
1679
+ gap: 8px;
1680
+ }
1681
+ .me-utility-panel button {
1682
+ padding: 6px 10px;
1683
+ color: inherit;
1684
+ background: var(--me-control-bg, #fff);
1685
+ border: 1px solid var(--me-line, #dcdfe2);
1686
+ border-radius: var(--me-control-radius, 5px);
1687
+ cursor: pointer;
1688
+ }
1689
+ .me-utility-error {
1690
+ color: var(--me-error, #a52d2d);
1691
+ }
1692
+ .me-utility-error:empty {
1693
+ display: none;
1694
+ }
1695
+
1696
+ .me-quick-panel .me-utility-actions {
1697
+ flex-wrap: wrap;
1698
+ margin-bottom: 10px;
1699
+ }
1700
+ .me-quick-panel .me-symbol-grid {
1701
+ max-height: 260px;
1702
+ overflow: auto;
1703
+ }
1704
+ .me-quick-item {
1705
+ display: flex;
1706
+ min-width: 0;
1707
+ gap: 2px;
1708
+ }
1709
+ .me-quick-item button:first-child {
1710
+ flex: 1;
1711
+ min-width: 0;
1712
+ text-align: start;
1713
+ }
1714
+ .me-quick-item button:last-child {
1715
+ flex: none;
1716
+ }
1717
+ .me-quick-item button[aria-pressed='true'] {
1718
+ color: var(--me-number, #a65316);
1719
+ background: var(--me-active-bg, #edf3ff);
1720
+ }
1721
+
1722
+ .me-presentation-tools[hidden] {
1723
+ display: none;
1724
+ }
1725
+ .me-presentation-tools label {
1726
+ display: flex;
1727
+ align-items: center;
1728
+ gap: 8px;
1729
+ }