@barocss/math-editor 0.2.1 → 0.5.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 (202) 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 +178 -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 +3 -1
  9. package/CHANGELOG.md +106 -0
  10. package/EDITING-SCENARIOS.md +174 -0
  11. package/EMBEDDING.md +4 -0
  12. package/IMPLEMENTATION.md +122 -2
  13. package/JSON-MODEL.md +1 -0
  14. package/LATEX-GUIDE.md +30 -1
  15. package/LATEX-MODEL.md +12 -0
  16. package/LATEX-SCOPE.md +12 -3
  17. package/LICENSE +1 -3
  18. package/README.md +201 -39
  19. package/RELEASING.md +81 -10
  20. package/RENDERING-TESTS.md +79 -0
  21. package/ROADMAP.md +220 -11
  22. package/STYLING.md +157 -0
  23. package/SUPPORT.md +24 -12
  24. package/VALIDATION.md +444 -4
  25. package/dist/context-tools.d.ts +21 -0
  26. package/dist/context-tools.js +37 -0
  27. package/dist/core.d.ts +5 -1
  28. package/dist/core.js +5 -1
  29. package/dist/document-codec.d.ts +0 -1
  30. package/dist/document-codec.js +0 -1
  31. package/dist/dom/caret-geometry.d.ts +3 -0
  32. package/dist/dom/caret-geometry.js +41 -0
  33. package/dist/dom/context-keyboard.d.ts +2 -0
  34. package/dist/dom/context-keyboard.js +22 -0
  35. package/dist/dom/elements.d.ts +1 -2
  36. package/dist/dom/elements.js +2 -3
  37. package/dist/dom/latex-panel.d.ts +10 -0
  38. package/dist/dom/latex-panel.js +59 -0
  39. package/dist/dom/matrix-selection.d.ts +11 -0
  40. package/dist/dom/matrix-selection.js +30 -0
  41. package/dist/dom/menu-position.d.ts +17 -2
  42. package/dist/dom/menu-position.js +129 -16
  43. package/dist/dom/presentation-controls.d.ts +4 -0
  44. package/dist/dom/presentation-controls.js +56 -0
  45. package/dist/dom/quick-panel.d.ts +12 -0
  46. package/dist/dom/quick-panel.js +102 -0
  47. package/dist/dom/selection.d.ts +29 -0
  48. package/dist/dom/selection.js +53 -0
  49. package/dist/dom/symbol-panel.d.ts +9 -0
  50. package/dist/dom/symbol-panel.js +146 -0
  51. package/dist/dom/theme.d.ts +6 -0
  52. package/dist/dom/theme.js +68 -0
  53. package/dist/dom/toolbar-catalog.d.ts +10 -0
  54. package/dist/dom/toolbar-catalog.js +35 -0
  55. package/dist/dom/toolbar.d.ts +13 -2
  56. package/dist/dom/toolbar.js +295 -28
  57. package/dist/dom.d.ts +9 -1
  58. package/dist/dom.js +682 -151
  59. package/dist/editor-labels.d.ts +0 -1
  60. package/dist/editor-labels.js +0 -1
  61. package/dist/enter-policy.d.ts +0 -1
  62. package/dist/enter-policy.js +0 -1
  63. package/dist/fences.d.ts +0 -1
  64. package/dist/fences.js +0 -1
  65. package/dist/i18n.d.ts +0 -1
  66. package/dist/i18n.js +0 -1
  67. package/dist/index.d.ts +4 -1
  68. package/dist/index.js +4 -1
  69. package/dist/latex-insertion.d.ts +12 -0
  70. package/dist/latex-insertion.js +26 -0
  71. package/dist/latex-paste-panel.d.ts +3 -0
  72. package/dist/latex-paste-panel.js +18 -0
  73. package/dist/latex.d.ts +0 -1
  74. package/dist/latex.js +11 -1
  75. package/dist/lines.d.ts +0 -1
  76. package/dist/lines.js +0 -1
  77. package/dist/locales/en.js +39 -1
  78. package/dist/locales/en.json +39 -1
  79. package/dist/locales/ko.js +39 -1
  80. package/dist/locales/ko.json +39 -1
  81. package/dist/math-editor-toolbar.d.ts +4 -2
  82. package/dist/math-editor-toolbar.js +3 -4
  83. package/dist/math-editor.d.ts +7 -2
  84. package/dist/math-editor.js +661 -308
  85. package/dist/math-layout.d.ts +12 -0
  86. package/dist/math-layout.js +59 -0
  87. package/dist/math-spacing.d.ts +13 -0
  88. package/dist/math-spacing.js +87 -0
  89. package/dist/matrix-range.d.ts +40 -0
  90. package/dist/matrix-range.js +242 -0
  91. package/dist/matrix.d.ts +0 -1
  92. package/dist/matrix.js +0 -1
  93. package/dist/model.d.ts +4 -1
  94. package/dist/model.js +49 -5
  95. package/dist/outputs.d.ts +0 -1
  96. package/dist/outputs.js +0 -1
  97. package/dist/preferences.d.ts +24 -0
  98. package/dist/preferences.js +66 -0
  99. package/dist/presentation-controls.d.ts +10 -0
  100. package/dist/presentation-controls.js +10 -0
  101. package/dist/presentation.d.ts +13 -0
  102. package/dist/presentation.js +86 -0
  103. package/dist/quick-panel.d.ts +2 -0
  104. package/dist/quick-panel.js +17 -0
  105. package/dist/range.d.ts +2 -1
  106. package/dist/range.js +11 -1
  107. package/dist/react.d.ts +0 -1
  108. package/dist/react.js +0 -1
  109. package/dist/root-transform.d.ts +19 -0
  110. package/dist/root-transform.js +69 -0
  111. package/dist/session.d.ts +31 -2
  112. package/dist/session.js +108 -7
  113. package/dist/solid.d.ts +0 -1
  114. package/dist/solid.js +0 -1
  115. package/dist/suggestions.d.ts +13 -1
  116. package/dist/suggestions.js +153 -12
  117. package/dist/svelte.d.ts +0 -1
  118. package/dist/svelte.js +0 -1
  119. package/dist/symbol-browser.d.ts +0 -1
  120. package/dist/symbol-browser.js +0 -1
  121. package/dist/symbols.d.ts +0 -1
  122. package/dist/symbols.js +0 -1
  123. package/dist/templates.d.ts +0 -1
  124. package/dist/templates.js +0 -1
  125. package/dist/tokens.d.ts +0 -1
  126. package/dist/tokens.js +0 -1
  127. package/dist/vertical-navigation.d.ts +15 -0
  128. package/dist/vertical-navigation.js +145 -0
  129. package/dist/vue.d.ts +0 -1
  130. package/dist/vue.js +0 -1
  131. package/dist/web-component.d.ts +0 -1
  132. package/dist/web-component.js +9 -2
  133. package/package.json +11 -3
  134. package/src/fonts/KaTeX_Math-Italic.woff2 +0 -0
  135. package/src/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  136. package/src/fonts/README.md +18 -0
  137. package/src/shapes/README.md +21 -0
  138. package/src/shapes/parenthesis-bottom.svg +1 -0
  139. package/src/shapes/parenthesis-top.svg +1 -0
  140. package/src/shapes/parenthesis.svg +1 -0
  141. package/src/shapes/radical.svg +1 -0
  142. package/src/style.css +949 -173
  143. package/dist/core.d.ts.map +0 -1
  144. package/dist/core.js.map +0 -1
  145. package/dist/document-codec.d.ts.map +0 -1
  146. package/dist/document-codec.js.map +0 -1
  147. package/dist/dom/elements.d.ts.map +0 -1
  148. package/dist/dom/elements.js.map +0 -1
  149. package/dist/dom/menu-position.d.ts.map +0 -1
  150. package/dist/dom/menu-position.js.map +0 -1
  151. package/dist/dom/toolbar.d.ts.map +0 -1
  152. package/dist/dom/toolbar.js.map +0 -1
  153. package/dist/dom.d.ts.map +0 -1
  154. package/dist/dom.js.map +0 -1
  155. package/dist/editor-labels.d.ts.map +0 -1
  156. package/dist/editor-labels.js.map +0 -1
  157. package/dist/enter-policy.d.ts.map +0 -1
  158. package/dist/enter-policy.js.map +0 -1
  159. package/dist/fences.d.ts.map +0 -1
  160. package/dist/fences.js.map +0 -1
  161. package/dist/i18n.d.ts.map +0 -1
  162. package/dist/i18n.js.map +0 -1
  163. package/dist/index.d.ts.map +0 -1
  164. package/dist/index.js.map +0 -1
  165. package/dist/latex.d.ts.map +0 -1
  166. package/dist/latex.js.map +0 -1
  167. package/dist/lines.d.ts.map +0 -1
  168. package/dist/lines.js.map +0 -1
  169. package/dist/math-editor-toolbar.d.ts.map +0 -1
  170. package/dist/math-editor-toolbar.js.map +0 -1
  171. package/dist/math-editor.d.ts.map +0 -1
  172. package/dist/math-editor.js.map +0 -1
  173. package/dist/matrix.d.ts.map +0 -1
  174. package/dist/matrix.js.map +0 -1
  175. package/dist/model.d.ts.map +0 -1
  176. package/dist/model.js.map +0 -1
  177. package/dist/outputs.d.ts.map +0 -1
  178. package/dist/outputs.js.map +0 -1
  179. package/dist/range.d.ts.map +0 -1
  180. package/dist/range.js.map +0 -1
  181. package/dist/react.d.ts.map +0 -1
  182. package/dist/react.js.map +0 -1
  183. package/dist/session.d.ts.map +0 -1
  184. package/dist/session.js.map +0 -1
  185. package/dist/solid.d.ts.map +0 -1
  186. package/dist/solid.js.map +0 -1
  187. package/dist/suggestions.d.ts.map +0 -1
  188. package/dist/suggestions.js.map +0 -1
  189. package/dist/svelte.d.ts.map +0 -1
  190. package/dist/svelte.js.map +0 -1
  191. package/dist/symbol-browser.d.ts.map +0 -1
  192. package/dist/symbol-browser.js.map +0 -1
  193. package/dist/symbols.d.ts.map +0 -1
  194. package/dist/symbols.js.map +0 -1
  195. package/dist/templates.d.ts.map +0 -1
  196. package/dist/templates.js.map +0 -1
  197. package/dist/tokens.d.ts.map +0 -1
  198. package/dist/tokens.js.map +0 -1
  199. package/dist/vue.d.ts.map +0 -1
  200. package/dist/vue.js.map +0 -1
  201. package/dist/web-component.d.ts.map +0 -1
  202. package/dist/web-component.js.map +0 -1
package/src/style.css CHANGED
@@ -1,23 +1,39 @@
1
- /* Use lining numerals for mathematical baselines and a clear similarity sign.
2
- Georgia's text numerals have uneven heights and its U+223C is unusually curled. */
1
+ /* Match the reference math faces in both editable inputs and passive runs.
2
+ The bundled fonts retain their KaTeX license in src/fonts. */
3
3
  @font-face {
4
4
  font-family: 'Barocss Math Glyphs';
5
5
  src: url('./fonts/KaTeX_Main-Regular.woff2') format('woff2');
6
- unicode-range: U+0030-0039, U+223C;
6
+ font-style: normal;
7
+ font-weight: 400;
8
+ font-display: swap;
9
+ }
10
+ @font-face {
11
+ font-family: 'Barocss Math Glyphs';
12
+ src: url('./fonts/KaTeX_Math-Italic.woff2') format('woff2');
13
+ font-style: italic;
14
+ font-weight: 400;
15
+ font-display: swap;
16
+ }
17
+ @font-face {
18
+ font-family: 'Barocss Large Operators';
19
+ src: url('./fonts/KaTeX_Size2-Regular.woff2') format('woff2');
20
+ font-style: normal;
21
+ font-display: swap;
7
22
  }
8
23
  .me-editor {
9
- --me-accent: #236957;
10
- --me-line: #d9e1dd;
11
- color: #202c27;
12
- font-family: system-ui, sans-serif;
24
+ color: var(--me-text, #202c27);
25
+ font-family: var(--me-ui-font-family, system-ui, sans-serif);
26
+ background: var(--me-background, transparent);
13
27
  }
14
28
  .me-tools {
29
+ color: var(--me-text, #202c27);
30
+ background: var(--me-toolbar-background, transparent);
15
31
  display: flex;
16
32
  align-items: center;
17
33
  flex-wrap: wrap;
18
- gap: 4px;
19
- padding: 12px;
20
- border-bottom: 1px solid var(--me-line);
34
+ gap: var(--me-toolbar-gap, 4px);
35
+ padding: var(--me-toolbar-padding, 12px);
36
+ border-bottom: 1px solid var(--me-line, #d9e1dd);
21
37
  }
22
38
  .me-tools button {
23
39
  display: flex;
@@ -25,33 +41,33 @@
25
41
  gap: 7px;
26
42
  background: transparent;
27
43
  border: 1px solid transparent;
28
- border-radius: 6px;
44
+ border-radius: var(--me-control-radius, 6px);
29
45
  padding: 7px 9px;
30
46
  color: inherit;
31
47
  cursor: pointer;
32
- font: 12px system-ui;
48
+ font: 12px var(--me-ui-font-family, system-ui, sans-serif);
33
49
  }
34
50
  .me-tools button span {
35
51
  font: 20px 'Barocss Math Glyphs', Georgia, serif;
36
52
  }
37
53
  .me-tools button:hover {
38
- background: #edf3ef;
54
+ background: var(--me-hover-background, #edf3ef);
39
55
  }
40
56
  .me-tools button:disabled {
41
57
  opacity: 0.35;
42
58
  cursor: default;
43
59
  }
44
60
  .me-tools button:focus-visible {
45
- outline: 2px solid var(--me-accent);
61
+ outline: 2px solid var(--me-accent, #236957);
46
62
  }
47
63
  .me-divider {
48
64
  height: 20px;
49
- border-left: 1px solid var(--me-line);
65
+ border-left: 1px solid var(--me-line, #d9e1dd);
50
66
  margin: 0 6px;
51
67
  }
52
68
  .me-surface {
53
- min-height: 190px;
54
- padding: 48px 32px;
69
+ min-height: var(--me-surface-min-height, 190px);
70
+ padding: var(--me-surface-padding, 48px 32px);
55
71
  display: flex;
56
72
  align-items: center;
57
73
  overflow-x: auto;
@@ -82,8 +98,8 @@
82
98
  outline: none;
83
99
  }
84
100
  .me-input:focus {
85
- background: #e7f2ed;
86
- box-shadow: 0 2px 0 var(--me-accent);
101
+ background: var(--me-active-background, #e7f2ed);
102
+ box-shadow: 0 2px 0 var(--me-accent, #236957);
87
103
  }
88
104
  .me-input::placeholder {
89
105
  color: #aabbb1;
@@ -124,11 +140,12 @@
124
140
  align-self: flex-end;
125
141
  transform: translateY(0.3em);
126
142
  }
143
+ /* Normal scripts use TeX script size; root indices use scriptscript size (VIS-004/005). */
127
144
  .me-superscript > .me-slot:last-child .me-input,
128
145
  .me-subscript > .me-slot:last-child .me-input,
129
146
  .me-superscript > .me-slot:last-child .me-measure,
130
147
  .me-subscript > .me-slot:last-child .me-measure {
131
- font-size: calc(var(--me-font-size, 22px) * 16 / 22);
148
+ font-size: calc(var(--me-font-size, 22px) * 0.7);
132
149
  }
133
150
  .me-suggestions {
134
151
  position: absolute;
@@ -137,10 +154,10 @@
137
154
  left: 0;
138
155
  min-width: 180px;
139
156
  padding: 5px;
140
- border: 1px solid var(--me-line);
157
+ border: 1px solid var(--me-line, #d9e1dd);
141
158
  border-radius: 8px;
142
- background: white;
143
- box-shadow: 0 8px 24px #172c2420;
159
+ background: var(--me-panel-background, white);
160
+ box-shadow: var(--me-menu-shadow, 0 8px 24px #172c2420);
144
161
  display: flex;
145
162
  flex-direction: column;
146
163
  }
@@ -149,18 +166,19 @@
149
166
  justify-content: space-between;
150
167
  gap: 20px;
151
168
  border: 0;
152
- background: white;
169
+ background: var(--me-panel-background, white);
153
170
  padding: 9px;
154
171
  text-align: left;
155
- color: #202c27;
156
- border-radius: 4px;
172
+ color: var(--me-text, #202c27);
173
+ border-radius: var(--me-control-radius, 4px);
174
+ font: inherit;
157
175
  cursor: pointer;
158
176
  }
159
177
  .me-suggestions button[aria-selected='true'] {
160
- background: #e7f2ed;
178
+ background: var(--me-active-background, #e7f2ed);
161
179
  }
162
180
  .me-suggestions small {
163
- color: #6a7b72;
181
+ color: var(--me-muted, #6a7b72);
164
182
  }
165
183
 
166
184
  /* The hidden twin uses browser font shaping, including CJK fallback fonts and IME drafts.
@@ -193,36 +211,52 @@
193
211
  padding-inline: 1px;
194
212
  }
195
213
  .me-empty-boundary .me-input {
196
- border: 1px dashed var(--me-line);
214
+ border: 1px dashed var(--me-line, #d9e1dd);
197
215
  }
198
216
  .me-suggestion-panel {
199
217
  position: fixed;
200
- z-index: 1000;
218
+ z-index: var(--me-menu-z-index, 1000);
201
219
  display: flex;
202
220
  flex-direction: column;
203
221
  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;
222
+ background: var(--me-panel-background, #fff);
223
+ color: var(--me-text, #202c27);
224
+ border: 1px solid var(--me-line, #d9e1dd);
225
+ border-radius: var(--me-radius, 10px);
226
+ box-shadow: var(--me-menu-shadow, 0 12px 32px #172c2426);
227
+ font: 13px/1.4 var(--me-ui-font-family, system-ui, sans-serif);
228
+ /* A menu can live inside a centered or formatted host document. */
229
+ text-align: start;
230
+ text-indent: 0;
231
+ text-transform: none;
232
+ letter-spacing: normal;
233
+ word-spacing: normal;
234
+ white-space: normal;
210
235
  overflow: hidden;
211
236
  }
212
237
  .me-suggestion-heading,
213
238
  .me-suggestion-footer {
214
239
  padding: 10px 12px;
215
240
  font-size: 11px;
216
- color: #708075;
241
+ color: var(--me-muted, #708075);
217
242
  flex-shrink: 0;
218
243
  }
219
244
  .me-suggestion-heading {
220
245
  display: flex;
246
+ flex-wrap: wrap;
221
247
  justify-content: space-between;
222
- border-bottom: 1px solid #edf0eb;
248
+ gap: 4px 12px;
249
+ border-bottom: 1px solid var(--me-line, #edf0eb);
250
+ }
251
+ .me-suggestion-query {
252
+ min-width: 0;
253
+ max-width: 100%;
254
+ overflow: hidden;
255
+ text-overflow: ellipsis;
256
+ white-space: nowrap;
223
257
  }
224
258
  .me-suggestion-footer {
225
- border-top: 1px solid #edf0eb;
259
+ border-top: 1px solid var(--me-line, #edf0eb);
226
260
  }
227
261
  .me-suggestion-panel .me-suggestions {
228
262
  position: static;
@@ -244,8 +278,13 @@
244
278
  .me-candidate-glyph {
245
279
  font: 26px 'Barocss Math Glyphs', Georgia, serif;
246
280
  min-width: 42px;
281
+ flex-shrink: 0;
247
282
  text-align: center;
248
283
  }
284
+ .me-candidate-copy {
285
+ min-width: 0;
286
+ overflow-wrap: anywhere;
287
+ }
249
288
  .me-suggestions strong {
250
289
  display: block;
251
290
  font-size: 13px;
@@ -263,10 +302,10 @@
263
302
  }
264
303
  .me-limit .me-input,
265
304
  .me-limit .me-measure {
266
- font-size: calc(var(--me-font-size, 22px) * 14 / 22);
305
+ font-size: calc(var(--me-font-size, 22px) * 0.7);
267
306
  }
268
307
  .me-operator-glyph {
269
- font: 35px/1 'Barocss Math Glyphs', Georgia, serif;
308
+ font: calc(var(--me-font-size, 22px) * 1.59) / 1 'Barocss Math Glyphs', Georgia, serif;
270
309
  }
271
310
  .me-large-operator {
272
311
  gap: 8px;
@@ -277,63 +316,63 @@
277
316
 
278
317
  /* Slot roles are presentation metadata, not a claim that text is a variable or constant. */
279
318
  .me-row {
280
- --me-ink: #2358a0;
319
+ --me-ink: var(--me-variable, #2358a0);
281
320
  --me-tint: #eff5ff;
282
321
  --me-focus: #dbeaff;
283
- --me-ring: #3676d3;
322
+ --me-ring: var(--me-focus-color, #3676d3);
284
323
  }
285
324
  .me-row[data-math-role='numerator'],
286
325
  .me-row[data-math-role='base'] {
287
- --me-ink: #2358a0;
326
+ --me-ink: var(--me-variable, #2358a0);
288
327
  --me-tint: #eff5ff;
289
328
  --me-focus: #dbeaff;
290
- --me-ring: #3676d3;
329
+ --me-ring: var(--me-focus-color, #3676d3);
291
330
  }
292
331
  .me-row[data-math-role='denominator'],
293
332
  .me-row[data-math-role='radicand'] {
294
- --me-ink: #086b60;
333
+ --me-ink: var(--me-variable, #086b60);
295
334
  --me-tint: #eaf7f1;
296
335
  --me-focus: #cef0e4;
297
- --me-ring: #138777;
336
+ --me-ring: var(--me-focus-color, #138777);
298
337
  }
299
338
  .me-row[data-math-role='exponent'],
300
339
  .me-row[data-math-role='upper'] {
301
- --me-ink: #88430b;
340
+ --me-ink: var(--me-variable, #88430b);
302
341
  --me-tint: #fff4e5;
303
342
  --me-focus: #ffe2b4;
304
- --me-ring: #bd6a18;
343
+ --me-ring: var(--me-focus-color, #bd6a18);
305
344
  }
306
345
  .me-row[data-math-role='index'],
307
346
  .me-row[data-math-role='lower'] {
308
- --me-ink: #7c3d90;
347
+ --me-ink: var(--me-variable, #7c3d90);
309
348
  --me-tint: #f8eefb;
310
349
  --me-focus: #edd7f6;
311
- --me-ring: #9d50b1;
350
+ --me-ring: var(--me-focus-color, #9d50b1);
312
351
  }
313
352
  .me-row[data-math-role='group'] {
314
- --me-ink: #4e53a4;
353
+ --me-ink: var(--me-variable, #4e53a4);
315
354
  --me-tint: #f1f0ff;
316
355
  --me-focus: #e1dfff;
317
- --me-ring: #726ad0;
356
+ --me-ring: var(--me-focus-color, #726ad0);
318
357
  }
319
358
  .me-input {
320
359
  color: var(--me-ink);
321
- background: var(--me-tint);
360
+ background: var(--me-input-background, var(--me-tint));
322
361
  border-radius: 4px;
323
362
  caret-color: var(--me-ink);
324
363
  }
325
364
  .me-input:hover:not(:focus) {
326
- background: var(--me-focus);
365
+ background: var(--me-input-focus-background, var(--me-focus));
327
366
  box-shadow: none;
328
367
  }
329
368
  .me-input:focus {
330
- background: var(--me-focus);
369
+ background: var(--me-input-focus-background, var(--me-focus));
331
370
  outline: none;
332
371
  box-shadow: none;
333
372
  }
334
373
  .me-input::selection {
335
- color: white;
336
- background: var(--me-ring);
374
+ color: var(--me-selection-color, white);
375
+ background: var(--me-selection-background, var(--me-ring));
337
376
  }
338
377
  .me-input::placeholder {
339
378
  color: var(--me-ink);
@@ -344,7 +383,7 @@
344
383
  box-shadow: none;
345
384
  }
346
385
  .me-empty-boundary .me-input:hover:not(:focus) {
347
- background: var(--me-focus);
386
+ background: var(--me-input-focus-background, var(--me-focus));
348
387
  }
349
388
  .me-empty-boundary .me-input:focus {
350
389
  border-color: transparent;
@@ -439,18 +478,18 @@
439
478
  flex-wrap: wrap;
440
479
  gap: 8px;
441
480
  padding: 10px 14px;
442
- border-bottom: 1px solid #dce2e8;
443
- background: #f4f4fb;
444
- font: 12px system-ui;
445
- color: #4e53a4;
481
+ border-bottom: 1px solid var(--me-line, #dce2e8);
482
+ background: var(--me-subtle-background, #f4f4fb);
483
+ font: 12px var(--me-ui-font-family, system-ui, sans-serif);
484
+ color: var(--me-text, #4e53a4);
446
485
  }
447
486
  .me-matrix-tools button,
448
487
  .me-matrix-tools select {
449
488
  font: inherit;
450
489
  color: inherit;
451
- background: white;
452
- border: 1px solid #d6d5e6;
453
- border-radius: 5px;
490
+ background: var(--me-panel-background, white);
491
+ border: 1px solid var(--me-line, #d6d5e6);
492
+ border-radius: var(--me-control-radius, 5px);
454
493
  padding: 6px 8px;
455
494
  }
456
495
  .me-matrix-tools button:disabled {
@@ -458,7 +497,7 @@
458
497
  }
459
498
  .me-matrix-tools small {
460
499
  font-size: 11px;
461
- color: #77758b;
500
+ color: var(--me-muted, #77758b);
462
501
  }
463
502
 
464
503
  .me-matrix-size {
@@ -466,8 +505,8 @@
466
505
  font-size: 12px;
467
506
  color: inherit;
468
507
  background: transparent;
469
- border: 1px solid #dcdfe2;
470
- border-radius: 5px;
508
+ border: 1px solid var(--me-line, #dcdfe2);
509
+ border-radius: var(--me-control-radius, 5px);
471
510
  padding: 6px;
472
511
  max-width: 100%;
473
512
  }
@@ -476,7 +515,7 @@
476
515
  display: flex;
477
516
  flex-direction: column;
478
517
  align-items: flex-start;
479
- gap: 18px;
518
+ gap: var(--me-line-gap, 18px);
480
519
  min-width: 0;
481
520
  }
482
521
  .me-document-line {
@@ -503,14 +542,14 @@
503
542
  opacity: 0.65;
504
543
  }
505
544
  .me-run[data-token-kind='variable'] .me-input {
506
- color: #245da1;
545
+ color: var(--me-variable, #245da1);
507
546
  }
508
547
  .me-run[data-token-kind='constant'] .me-input {
509
- color: #a65316;
548
+ color: var(--me-number, #a65316);
510
549
  font-style: normal;
511
550
  }
512
551
  .me-run[data-token-kind='symbol'] .me-input {
513
- color: #7853a6;
552
+ color: var(--me-symbol, #7853a6);
514
553
  font-style: normal;
515
554
  }
516
555
  .me-run[data-token-kind='constant'] .me-measure,
@@ -537,31 +576,31 @@
537
576
  align-items: center;
538
577
  gap: 14px;
539
578
  padding: 8px 16px;
540
- border-bottom: 1px solid var(--me-line);
541
- font: 11px system-ui;
542
- color: #78857e;
579
+ border-bottom: 1px solid var(--me-line, #d9e1dd);
580
+ font: 11px var(--me-ui-font-family, system-ui, sans-serif);
581
+ color: var(--me-muted, #78857e);
543
582
  }
544
583
  .me-token-legend [data-kind='variable'] {
545
- color: #245da1;
584
+ color: var(--me-variable, #245da1);
546
585
  }
547
586
  .me-token-legend [data-kind='constant'] {
548
- color: #a65316;
587
+ color: var(--me-number, #a65316);
549
588
  }
550
589
  .me-token-legend [data-kind='symbol'] {
551
- color: #7853a6;
590
+ color: var(--me-symbol, #7853a6);
552
591
  }
553
592
 
554
593
  .me-matrix[data-selected='true'] {
555
- outline: 2px solid #245da1;
594
+ outline: 2px solid var(--me-variable, #245da1);
556
595
  outline-offset: 3px;
557
- background: #245da112;
596
+ background: var(--me-selection-background, #245da112);
558
597
  border-radius: 3px;
559
598
  }
560
599
  .me-grid-selection-hint {
561
600
  padding: 8px 16px;
562
- font: 12px system-ui;
563
- color: #245da1;
564
- background: #eef5ff;
601
+ font: 12px var(--me-ui-font-family, system-ui, sans-serif);
602
+ color: var(--me-variable, #245da1);
603
+ background: var(--me-selection-background, #eef5ff);
565
604
  }
566
605
  .me-preview-token {
567
606
  position: absolute;
@@ -578,29 +617,29 @@
578
617
  user-select: none;
579
618
  }
580
619
  .me-preview-token:hover {
581
- background: var(--me-focus);
620
+ background: var(--me-input-focus-background, var(--me-focus));
582
621
  }
583
622
  .me-run[data-token-kind='variable'] .me-preview-token {
584
- color: #245da1;
623
+ color: var(--me-variable, #245da1);
585
624
  }
586
625
  .me-run[data-token-kind='constant'] .me-preview-token {
587
- color: #a65316;
626
+ color: var(--me-number, #a65316);
588
627
  font-style: normal;
589
628
  }
590
629
  .me-run[data-token-kind='symbol'] .me-preview-token {
591
- color: #7853a6;
630
+ color: var(--me-symbol, #7853a6);
592
631
  font-style: normal;
593
632
  }
594
633
  .me-superscript > .me-slot:last-child .me-preview-token,
595
634
  .me-subscript > .me-slot:last-child .me-preview-token {
596
- font-size: calc(var(--me-font-size, 22px) * 16 / 22);
635
+ font-size: calc(var(--me-font-size, 22px) * 0.7);
597
636
  }
598
637
  .me-limit .me-preview-token {
599
- font-size: calc(var(--me-font-size, 22px) * 14 / 22);
638
+ font-size: calc(var(--me-font-size, 22px) * 0.7);
600
639
  }
601
640
  .me-range-highlight,
602
641
  .me-empty[data-range-selected='true'] {
603
- background: #b9d8ff;
642
+ background: var(--me-selection-background, #b9d8ff);
604
643
  color: inherit;
605
644
  border-radius: 2px;
606
645
  }
@@ -608,7 +647,7 @@
608
647
  outline: none;
609
648
  }
610
649
  .me-surface:focus-visible {
611
- outline: 2px solid #3676d3;
650
+ outline: 2px solid var(--me-focus-color, #3676d3);
612
651
  outline-offset: -2px;
613
652
  }
614
653
  .me-line-number {
@@ -616,17 +655,17 @@
616
655
  margin-right: 16px;
617
656
  text-align: right;
618
657
  align-self: center;
619
- color: #8a9790;
620
- font: 11px/1.5 system-ui;
658
+ color: var(--me-muted, #8a9790);
659
+ font: 11px/1.5 var(--me-ui-font-family, system-ui, sans-serif);
621
660
  font-variant-numeric: tabular-nums;
622
661
  user-select: none;
623
662
  cursor: default;
624
663
  }
625
664
  .me-symbol-browser {
626
665
  padding: 16px;
627
- border-bottom: 1px solid var(--me-line);
628
- background: #f6f8f6;
629
- font: 12px/1.5 system-ui;
666
+ border-bottom: 1px solid var(--me-line, #d9e1dd);
667
+ background: var(--me-subtle-background, #f6f8f6);
668
+ font: 12px/1.5 var(--me-ui-font-family, system-ui, sans-serif);
630
669
  }
631
670
  .me-symbol-browser-heading {
632
671
  display: flex;
@@ -636,15 +675,15 @@
636
675
  }
637
676
  .me-symbol-browser-heading small {
638
677
  font-weight: 400;
639
- color: #6a7b72;
678
+ color: var(--me-muted, #6a7b72);
640
679
  margin-left: 8px;
641
680
  }
642
681
  .me-symbol-browser-heading button {
643
682
  font: inherit;
644
- background: white;
683
+ background: var(--me-panel-background, white);
645
684
  color: inherit;
646
- border: 1px solid var(--me-line);
647
- border-radius: 5px;
685
+ border: 1px solid var(--me-line, #d9e1dd);
686
+ border-radius: var(--me-control-radius, 5px);
648
687
  padding: 5px 10px;
649
688
  cursor: pointer;
650
689
  }
@@ -656,15 +695,15 @@
656
695
  }
657
696
  .me-symbol-search input {
658
697
  font: inherit;
659
- border: 1px solid var(--me-line);
660
- border-radius: 5px;
698
+ border: 1px solid var(--me-line, #d9e1dd);
699
+ border-radius: var(--me-control-radius, 5px);
661
700
  padding: 9px 10px;
662
701
  min-width: 0;
663
- background: white;
702
+ background: var(--me-panel-background, white);
664
703
  color: inherit;
665
704
  }
666
705
  .me-symbol-help {
667
- color: #627469;
706
+ color: var(--me-muted, #627469);
668
707
  margin: 8px 0 12px;
669
708
  }
670
709
  .me-symbol-grid {
@@ -683,24 +722,24 @@
683
722
  gap: 5px;
684
723
  min-height: 74px;
685
724
  padding: 8px 5px;
686
- border: 1px solid var(--me-line);
687
- border-radius: 6px;
688
- background: white;
725
+ border: 1px solid var(--me-line, #d9e1dd);
726
+ border-radius: var(--me-control-radius, 6px);
727
+ background: var(--me-panel-background, white);
689
728
  color: inherit;
690
- font: 11px/1.3 system-ui;
729
+ font: 11px/1.3 var(--me-ui-font-family, system-ui, sans-serif);
691
730
  cursor: pointer;
692
731
  overflow-wrap: anywhere;
693
732
  }
694
733
  .me-symbol-grid button:hover {
695
- background: #e7f2ed;
696
- border-color: #9cbbac;
734
+ background: var(--me-active-background, #e7f2ed);
735
+ border-color: var(--me-accent, #9cbbac);
697
736
  }
698
737
  .me-symbol-glyph {
699
738
  font: 25px/1.2 'Barocss Math Glyphs', Georgia, 'Times New Roman', serif;
700
739
  }
701
740
  .me-symbol-browser button:focus-visible,
702
741
  .me-symbol-search input:focus-visible {
703
- outline: 2px solid var(--me-accent);
742
+ outline: 2px solid var(--me-accent, #236957);
704
743
  outline-offset: 2px;
705
744
  }
706
745
 
@@ -725,28 +764,22 @@
725
764
  color: var(--me-symbol, #7650b2);
726
765
  }
727
766
  .me-dom-editor .me-dom-selected {
728
- background: #dbeafe;
767
+ background: var(--me-selection-background, #dbeafe);
729
768
  border-radius: 3px;
730
769
  }
731
770
  .me-dom-status {
732
771
  display: block;
733
- font: 12px/1.5 sans-serif;
772
+ font: 12px/1.5 var(--me-ui-font-family, system-ui, sans-serif);
734
773
  }
735
774
  .me-dom-status:empty {
736
775
  display: none;
737
776
  }
738
- .me-dom-menu {
739
- position: fixed;
740
- z-index: 1000;
741
- max-height: 230px;
742
- overflow-y: auto;
743
- width: 290px;
744
- }
745
777
  .me-dom-menu[hidden] {
746
778
  display: none;
747
779
  }
748
- .me-dom-menu .me-suggestions {
749
- position: static;
780
+ .me-dom-menu[data-compact='true'] .me-suggestion-heading,
781
+ .me-dom-menu[data-compact='true'] .me-suggestion-footer {
782
+ display: none;
750
783
  }
751
784
  .me-dom-editor[data-mode='inline'] {
752
785
  display: inline-block;
@@ -755,7 +788,7 @@
755
788
  }
756
789
  .me-dom-editor[data-mode='inline'] .me-surface {
757
790
  display: inline-block;
758
- padding: 2px 4px;
791
+ padding: var(--me-inline-padding, 2px 4px);
759
792
  min-height: 0;
760
793
  }
761
794
  .me-dom-editor[data-mode='inline'] .me-document-lines {
@@ -787,7 +820,7 @@
787
820
  grid-row: 1;
788
821
  }
789
822
  .me-scripts > .me-slot:not(:first-child) :is(.me-input, .me-measure, .me-preview-token) {
790
- font-size: calc(var(--me-font-size, 22px) * 16 / 22);
823
+ font-size: calc(var(--me-font-size, 22px) * 0.7);
791
824
  }
792
825
 
793
826
  .me-textGroup,
@@ -802,7 +835,7 @@
802
835
  font-family: 'Barocss Math Glyphs', Georgia, serif;
803
836
  font-style: normal;
804
837
  white-space: pre;
805
- color: #263b32;
838
+ color: var(--me-text, #263b32);
806
839
  }
807
840
  .me-textGroup .me-preview-token *,
808
841
  .me-operatorName .me-preview-token * {
@@ -833,7 +866,7 @@
833
866
  margin-top: 4px;
834
867
  }
835
868
  .me-indexedRoot > .me-slot:nth-last-child(2) :is(.me-input, .me-measure, .me-preview-token) {
836
- font-size: calc(var(--me-font-size, 22px) * 14 / 22);
869
+ font-size: calc(var(--me-font-size, 22px) * 0.5);
837
870
  }
838
871
 
839
872
  /* Accents follow the editable body's width, including nested structures. */
@@ -932,7 +965,7 @@
932
965
  align-self: baseline;
933
966
  }
934
967
  .me-limit-operator .me-limit :is(.me-input, .me-measure, .me-preview-token) {
935
- font-size: calc(var(--me-font-size, 22px) * 14 / 22);
968
+ font-size: calc(var(--me-font-size, 22px) * 0.7);
936
969
  line-height: 1.1;
937
970
  padding-block: 1px;
938
971
  }
@@ -946,13 +979,10 @@
946
979
  }
947
980
 
948
981
  /* Functions are semantic operator nodes, distinct from ordinary variables. */
949
- .me-editor {
950
- --me-function: #087b78;
951
- }
952
982
  .me-operatorName :is(.me-input, .me-preview-token, .me-measure),
953
983
  .me-limit-glyph,
954
984
  .me-token-legend [data-kind='function'] {
955
- color: var(--me-function);
985
+ color: var(--me-function, #087b78);
956
986
  }
957
987
 
958
988
  /* Explicit LaTeX spacing is content, independent of empty caret hit areas. */
@@ -969,7 +999,7 @@
969
999
  }
970
1000
  .me-quad:hover,
971
1001
  .me-qquad:hover {
972
- background: var(--me-focus);
1002
+ background: var(--me-input-focus-background, var(--me-focus));
973
1003
  }
974
1004
 
975
1005
  .me-roman :is(.me-input, .me-measure, .me-preview-token) {
@@ -984,7 +1014,7 @@
984
1014
  font-size: calc(var(--me-font-size, 22px) * 16 / 22);
985
1015
  }
986
1016
  .me-limit :is(.me-quad, .me-qquad) {
987
- font-size: calc(var(--me-font-size, 22px) * 14 / 22);
1017
+ font-size: calc(var(--me-font-size, 22px) * 0.7);
988
1018
  }
989
1019
 
990
1020
  /* Structured delimiters export as \left/\right and stretch with their body. */
@@ -1001,14 +1031,11 @@
1001
1031
  :is(.me-parentheses, .me-brackets, .me-absolute) > .me-delimiter:last-child {
1002
1032
  border-right: 1.5px solid currentColor;
1003
1033
  }
1004
- /* A tapered curve keeps its bow at tall sizes; an elliptical border flattens. */
1034
+ /* The outline mask is shared with mixed fences in the contour rules below. */
1005
1035
  .me-parentheses > .me-delimiter:first-child,
1006
1036
  .me-parentheses > .me-delimiter:last-child {
1007
- flex-basis: 8px;
1008
1037
  border: 0;
1009
1038
  background: currentColor;
1010
- mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 100' preserveAspectRatio='none'%3E%3Cpath d='M14 0C4 16 0 32 0 50C0 68 4 84 14 100L14 97C7 80 3 65 3 50C3 35 7 20 14 3Z'/%3E%3C/svg%3E")
1011
- center / 100% 100% no-repeat;
1012
1039
  }
1013
1040
  .me-parentheses > .me-delimiter:last-child {
1014
1041
  transform: scaleX(-1);
@@ -1038,7 +1065,7 @@
1038
1065
  :is(.me-openClosed, .me-closedOpen, .me-fenced) > :is([data-fence='('], [data-fence=')']),
1039
1066
  .me-matrix[data-environment='pmatrix'] > .me-matrix-delimiter {
1040
1067
  background: currentColor;
1041
- mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 100' preserveAspectRatio='none'%3E%3Cpath d='M14 0C4 16 0 32 0 50C0 68 4 84 14 100L14 97C7 80 3 65 3 50C3 35 7 20 14 3Z'/%3E%3C/svg%3E")
1068
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 100' preserveAspectRatio='none'%3E%3Cpath d='M14 0C4 16 0 32 0 50C0 68 4 84 14 100L14 98C7 80 2.5 65 2.5 50C2.5 35 7 20 14 2Z'/%3E%3C/svg%3E")
1042
1069
  center / 100% 100% no-repeat;
1043
1070
  }
1044
1071
  .me-delimiter[data-fence=')'] {
@@ -1090,7 +1117,7 @@
1090
1117
  :is(.me-overset, .me-underset)
1091
1118
  > .me-slot:first-child
1092
1119
  :is(.me-input, .me-preview-token, .me-measure) {
1093
- font-size: calc(var(--me-font-size, 22px) * 14 / 22);
1120
+ font-size: calc(var(--me-font-size, 22px) * 0.7);
1094
1121
  }
1095
1122
  /* Square and indexed roots share a radical joined to the radicand's overbar. */
1096
1123
  .me-root > .me-radical,
@@ -1102,17 +1129,6 @@
1102
1129
  margin-top: 4px;
1103
1130
  font-size: 0;
1104
1131
  background: currentColor;
1105
- clip-path: polygon(
1106
- 0 55%,
1107
- 6px 50%,
1108
- 12px 88%,
1109
- 21px 0,
1110
- 100% 0,
1111
- 14px 100%,
1112
- 11px 100%,
1113
- 5px 58%,
1114
- 1px 61%
1115
- );
1116
1132
  }
1117
1133
  .me-indexedRoot > .me-slot:nth-last-child(2) {
1118
1134
  margin-right: -9px;
@@ -1155,7 +1171,7 @@
1155
1171
  > .me-operator-glyph {
1156
1172
  grid-column: 1;
1157
1173
  grid-row: 1 / 3;
1158
- font-size: 44px;
1174
+ font-size: calc(var(--me-font-size, 22px) * 2);
1159
1175
  }
1160
1176
  :is(
1161
1177
  [data-structure='integral'],
@@ -1215,11 +1231,12 @@
1215
1231
  /* Keep nested fractions readable while avoiding full-size recursive stacks.
1216
1232
  Apply the same size to the input, passive glyph and measuring twin. */
1217
1233
  .me-fraction .me-fraction :is(.me-input, .me-measure, .me-preview-token) {
1218
- font-size: calc(var(--me-font-size, 22px) * 16 / 22);
1219
- line-height: 1.2;
1234
+ font-size: calc(var(--me-font-size, 22px) * 0.7);
1235
+ line-height: 1;
1236
+ padding-block: 0;
1220
1237
  }
1221
1238
  .me-fraction .me-fraction .me-fraction :is(.me-input, .me-measure, .me-preview-token) {
1222
- font-size: 12px;
1239
+ font-size: calc(var(--me-font-size, 22px) * 0.5);
1223
1240
  }
1224
1241
  .me-fraction .me-fraction .me-row {
1225
1242
  min-height: 0;
@@ -1275,8 +1292,8 @@
1275
1292
  }
1276
1293
  [data-structure='contourIntegral'][data-limit-placement] > .me-limits > .me-operator-glyph {
1277
1294
  font: normal var(--me-font-size, 22px) / 2.3 'Barocss Contour', serif;
1278
- width: 25px;
1279
- height: 51px;
1295
+ width: calc(var(--me-font-size, 22px) * 25 / 22);
1296
+ height: calc(var(--me-font-size, 22px) * 2.3);
1280
1297
  transform: none;
1281
1298
  }
1282
1299
 
@@ -1300,7 +1317,7 @@
1300
1317
  :is(.me-overbrace, .me-underbrace)
1301
1318
  > .me-slot:first-child
1302
1319
  :is(.me-input, .me-measure, .me-preview-token) {
1303
- font-size: calc(var(--me-font-size, 22px) * 14 / 22);
1320
+ font-size: calc(var(--me-font-size, 22px) * 0.7);
1304
1321
  line-height: 1.1;
1305
1322
  }
1306
1323
  :is(.me-overbrace, .me-underbrace) > .me-slot:last-child {
@@ -1308,20 +1325,23 @@
1308
1325
  width: 100%;
1309
1326
  box-sizing: border-box;
1310
1327
  }
1328
+ :is(.me-overbrace, .me-underbrace) > .me-slot:last-child {
1329
+ min-width: calc(var(--me-font-size, 22px) * 1.6);
1330
+ }
1311
1331
  .me-overbrace > .me-slot:last-child {
1312
- padding-top: 9px;
1332
+ padding-top: calc(var(--me-font-size, 22px) * 0.4);
1313
1333
  }
1314
1334
  .me-underbrace > .me-slot:last-child {
1315
- padding-bottom: 9px;
1335
+ padding-bottom: calc(var(--me-font-size, 22px) * 0.4);
1316
1336
  }
1317
1337
  :is(.me-overbrace, .me-underbrace) > .me-slot:last-child::before {
1318
1338
  content: '';
1319
1339
  position: absolute;
1320
1340
  inset-inline: 0;
1321
1341
  top: 0;
1322
- height: 8px;
1342
+ height: calc(var(--me-font-size, 22px) * 0.35);
1323
1343
  background: currentColor;
1324
- mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 12' preserveAspectRatio='none'%3E%3Cpath d='M0 12Q0 5 12 5L38 5Q48 5 50 0Q52 5 62 5L88 5Q100 5 100 12L98 12Q98 8 88 8L62 8Q53 8 50 4Q47 8 38 8L12 8Q2 8 2 12Z'/%3E%3C/svg%3E")
1344
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 12' preserveAspectRatio='none'%3E%3Cpath d='M0 12C4 6 12 7 24 5C37 3 45 2 50 0C55 2 63 3 76 5C88 7 96 6 100 12L98 12C94 9 86 10 75 8C62 6 54 5 50 3C46 5 38 6 25 8C14 10 6 9 2 12Z'/%3E%3C/svg%3E")
1325
1345
  center / 100% 100% no-repeat;
1326
1346
  pointer-events: none;
1327
1347
  }
@@ -1336,10 +1356,10 @@
1336
1356
  min-height: 32px;
1337
1357
  padding: 7px 12px;
1338
1358
  gap: 9px;
1339
- border: 1px solid #b8cec3;
1340
- border-radius: 7px;
1341
- background: #edf4ef;
1342
- color: #245443;
1359
+ border: 1px solid var(--me-accent, #b8cec3);
1360
+ border-radius: var(--me-control-radius, 7px);
1361
+ background: var(--me-active-background, #edf4ef);
1362
+ color: var(--me-accent, #245443);
1343
1363
  font-weight: 600;
1344
1364
  white-space: nowrap;
1345
1365
  }
@@ -1355,16 +1375,46 @@
1355
1375
  transform: translateY(2px) rotate(225deg);
1356
1376
  }
1357
1377
  .me-tools .me-toolbar-toggle:hover {
1358
- background: #dfece4;
1359
- border-color: #8fac9c;
1378
+ background: var(--me-hover-background, #dfece4);
1379
+ border-color: var(--me-accent, #8fac9c);
1360
1380
  }
1361
1381
  .me-tools .me-toolbar-toggle[aria-expanded='true'] {
1362
- background: #dfece4;
1382
+ background: var(--me-hover-background, #dfece4);
1363
1383
  }
1364
1384
  .me-tools .me-toolbar-toggle:focus-visible {
1365
1385
  outline-offset: 2px;
1366
1386
  }
1367
1387
 
1388
+ /* Native discovery panels share their toolbar's containment and iframe document. */
1389
+ .me-dom-toolbar-panels {
1390
+ display: block;
1391
+ min-width: 0;
1392
+ max-width: 100%;
1393
+ }
1394
+ .me-dom-toolbar-panels[hidden],
1395
+ .me-dom-grid-tools[hidden] {
1396
+ display: none;
1397
+ }
1398
+ .me-dom-symbol-browser {
1399
+ box-sizing: border-box;
1400
+ max-width: 100%;
1401
+ border: 1px solid var(--me-line, #d9e1dd);
1402
+ border-radius: 0 0 8px 8px;
1403
+ color: var(--me-text, #202c27);
1404
+ }
1405
+ .me-dom-symbol-browser .me-symbol-grid {
1406
+ max-height: min(350px, 45vh);
1407
+ }
1408
+ .me-dom-symbol-browser .me-symbol-grid button:focus-visible {
1409
+ background: var(--me-active-background, #e7f2ed);
1410
+ border-color: var(--me-accent, #9cbbac);
1411
+ }
1412
+ .me-dom-grid-tools {
1413
+ flex-wrap: wrap;
1414
+ margin: 0;
1415
+ border-top: 0;
1416
+ }
1417
+
1368
1418
  /* Fixed accents stay centered; wide variants follow the editable body. */
1369
1419
  :is(.me-tilde, .me-bar, .me-dot, .me-ddot, .me-widehat, .me-widetilde) {
1370
1420
  position: relative;
@@ -1450,7 +1500,7 @@
1450
1500
  )[data-limit-placement='nolimits']
1451
1501
  > .me-limits
1452
1502
  > .me-operator-glyph {
1453
- font-size: 44px;
1503
+ font-size: calc(var(--me-font-size, 22px) * 2);
1454
1504
  }
1455
1505
 
1456
1506
  /* TeX math units: 18mu = 1em. Negative spacing has no painted hit box. */
@@ -1485,12 +1535,12 @@
1485
1535
  /* Explicit fraction/binomial styles override the surrounding default size.
1486
1536
  Nested explicit styles use the nearest style container's inherited value. */
1487
1537
  .me-structure[data-math-style='display'] {
1488
- --me-explicit-size: 22px;
1538
+ --me-explicit-size: var(--me-font-size, 22px);
1489
1539
  }
1490
1540
  .me-structure[data-math-style='text'] {
1491
- --me-explicit-size: 16px;
1541
+ --me-explicit-size: calc(var(--me-font-size, 22px) * 0.7);
1492
1542
  }
1493
- .me-structure[data-math-style] :is(.me-input, .me-measure, .me-preview-token) {
1543
+ .me-structure[data-math-style] > .me-slot :is(.me-input, .me-measure, .me-preview-token) {
1494
1544
  font-size: var(--me-explicit-size);
1495
1545
  }
1496
1546
  .me-structure[data-math-style='text'] > .me-slot > .me-row {
@@ -1602,3 +1652,729 @@
1602
1652
  justify-self: start;
1603
1653
  transform: scaleX(-1);
1604
1654
  }
1655
+ .me-matrix-cell[data-cell-selected='true'] {
1656
+ background: color-mix(in srgb, var(--me-accent, #32745d) 18%, transparent);
1657
+ border-radius: 0.12em;
1658
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--me-accent, #32745d) 35%, transparent);
1659
+ }
1660
+
1661
+ /* Shared, nonmodal utilities keep native input and host draft events contained. */
1662
+ .me-utility-panel {
1663
+ padding: 12px;
1664
+ border-top: 1px solid var(--me-line, #dcdfe2);
1665
+ font: 13px/1.5 system-ui, sans-serif;
1666
+ color: var(--me-text, #253b33);
1667
+ }
1668
+ .me-utility-panel label {
1669
+ display: grid;
1670
+ gap: 6px;
1671
+ }
1672
+ .me-utility-panel textarea {
1673
+ width: 100%;
1674
+ box-sizing: border-box;
1675
+ resize: vertical;
1676
+ padding: 8px;
1677
+ font: 14px/1.5 monospace;
1678
+ color: inherit;
1679
+ background: var(--me-control-bg, #fff);
1680
+ border: 1px solid var(--me-line, #dcdfe2);
1681
+ border-radius: var(--me-control-radius, 5px);
1682
+ }
1683
+ .me-utility-actions {
1684
+ display: flex;
1685
+ gap: 8px;
1686
+ }
1687
+ .me-utility-panel button {
1688
+ padding: 6px 10px;
1689
+ color: inherit;
1690
+ background: var(--me-control-bg, #fff);
1691
+ border: 1px solid var(--me-line, #dcdfe2);
1692
+ border-radius: var(--me-control-radius, 5px);
1693
+ cursor: pointer;
1694
+ }
1695
+ .me-utility-error {
1696
+ color: var(--me-error, #a52d2d);
1697
+ }
1698
+ .me-utility-error:empty {
1699
+ display: none;
1700
+ }
1701
+
1702
+ .me-quick-panel .me-utility-actions {
1703
+ flex-wrap: wrap;
1704
+ margin-bottom: 10px;
1705
+ }
1706
+ .me-quick-panel .me-symbol-grid {
1707
+ max-height: 260px;
1708
+ overflow: auto;
1709
+ }
1710
+ .me-quick-item {
1711
+ display: flex;
1712
+ min-width: 0;
1713
+ gap: 2px;
1714
+ }
1715
+ .me-quick-item button:first-child {
1716
+ flex: 1;
1717
+ min-width: 0;
1718
+ text-align: start;
1719
+ }
1720
+ .me-quick-item button:last-child {
1721
+ flex: none;
1722
+ }
1723
+ .me-quick-item button[aria-pressed='true'] {
1724
+ color: var(--me-number, #a65316);
1725
+ background: var(--me-active-bg, #edf3ff);
1726
+ }
1727
+
1728
+ .me-presentation-tools[hidden] {
1729
+ display: none;
1730
+ }
1731
+ .me-presentation-tools label {
1732
+ display: flex;
1733
+ align-items: center;
1734
+ gap: 8px;
1735
+ }
1736
+
1737
+ /* A fraction inside a script uses scriptscript-sized terms. Its rows must not
1738
+ retain the body's minimum line height, including while a term is editable. */
1739
+ :is(.me-superscript, .me-subscript, .me-scripts)
1740
+ > .me-slot:not(:first-child)
1741
+ .me-fraction:not([data-math-style='display'])
1742
+ :is(.me-input, .me-measure, .me-preview-token) {
1743
+ font-size: calc(var(--me-font-size, 22px) * 0.5);
1744
+ line-height: 1.1;
1745
+ padding-block: 0;
1746
+ }
1747
+ :is(.me-superscript, .me-subscript, .me-scripts)
1748
+ > .me-slot:not(:first-child)
1749
+ .me-fraction:not([data-math-style='display'])
1750
+ .me-row {
1751
+ min-height: 0;
1752
+ }
1753
+ :is(.me-superscript, .me-subscript, .me-scripts)
1754
+ > .me-slot:not(:first-child)
1755
+ .me-fraction:not([data-math-style='display'])
1756
+ > .me-slot {
1757
+ padding: 0 2px;
1758
+ }
1759
+ /* Compact fraction terms already reduce the script height. A simple base needs
1760
+ only a small shift; a tall structured base needs height-relative clearance. */
1761
+ .me-superscript > .me-slot:last-child:has(> .me-row > .me-fraction) {
1762
+ transform: translateY(-0.2em);
1763
+ }
1764
+ .me-subscript > .me-slot:last-child:has(> .me-row > .me-fraction) {
1765
+ transform: translateY(0.2em);
1766
+ }
1767
+ .me-superscript:has(> .me-slot:first-child > .me-row > .me-structure)
1768
+ > .me-slot:last-child:has(> .me-row > .me-fraction) {
1769
+ transform: translateY(-45%);
1770
+ }
1771
+ .me-subscript:has(> .me-slot:first-child > .me-row > .me-structure)
1772
+ > .me-slot:last-child:has(> .me-row > .me-fraction) {
1773
+ transform: translateY(45%);
1774
+ }
1775
+ /* Empty model boundaries are caret targets, not extra space before a script. */
1776
+ :is(.me-superscript, .me-subscript, .me-scripts)
1777
+ > .me-slot:not(:first-child)
1778
+ > .me-row
1779
+ > .me-empty-boundary:not(:focus-within)
1780
+ > .me-measure {
1781
+ min-width: 1px;
1782
+ width: 1px;
1783
+ padding-inline: 0;
1784
+ }
1785
+ :is(.me-superscript, .me-subscript, .me-scripts)
1786
+ > .me-slot:not(:first-child)
1787
+ > .me-row
1788
+ > .me-fraction {
1789
+ margin-inline: 1px;
1790
+ }
1791
+
1792
+ /* Query-independent structure actions remain visible while their operand is edited. */
1793
+ .me-context-footer {
1794
+ display: flex;
1795
+ align-items: center;
1796
+ flex-wrap: wrap;
1797
+ gap: 8px 12px;
1798
+ padding: 10px 14px;
1799
+ border-top: 1px solid var(--me-line, #d9e1dd);
1800
+ background: var(--me-subtle-background, #f6f8f6);
1801
+ color: var(--me-text, #202c27);
1802
+ font: 12px/1.4 var(--me-ui-font-family, system-ui, sans-serif);
1803
+ text-align: start;
1804
+ }
1805
+ .me-context-footer[hidden] {
1806
+ display: none;
1807
+ }
1808
+ .me-context-label {
1809
+ font-weight: 600;
1810
+ }
1811
+ .me-context-actions {
1812
+ display: flex;
1813
+ flex-wrap: wrap;
1814
+ gap: 6px;
1815
+ }
1816
+ .me-context-button {
1817
+ appearance: none;
1818
+ font: inherit;
1819
+ color: inherit;
1820
+ background: var(--me-panel-background, white);
1821
+ border: 1px solid var(--me-line, #cbd8cf);
1822
+ border-radius: var(--me-control-radius, 6px);
1823
+ padding: 6px 10px;
1824
+ cursor: pointer;
1825
+ }
1826
+ .me-context-button:hover:not(:disabled) {
1827
+ background: var(--me-hover-background, #e7efe9);
1828
+ }
1829
+ .me-context-button:focus-visible {
1830
+ outline: 2px solid var(--me-accent, #236957);
1831
+ outline-offset: 2px;
1832
+ }
1833
+ .me-context-button:disabled {
1834
+ opacity: 0.5;
1835
+ cursor: default;
1836
+ }
1837
+ .me-context-hint {
1838
+ color: var(--me-muted, #708075);
1839
+ font-size: 11px;
1840
+ }
1841
+ .me-context-button[aria-pressed='true'] {
1842
+ background: var(--me-hover-background, #e7efe9);
1843
+ color: var(--me-accent, #236957);
1844
+ font-weight: 600;
1845
+ }
1846
+
1847
+ /* Geometry audit: remove UI line-box struts from math stacks. Keep the same
1848
+ metrics for passive text, the input, and its measuring span. */
1849
+ .me-large-operator > .me-limits > .me-limit {
1850
+ display: inline-flex;
1851
+ }
1852
+ .me-large-operator > .me-limits > .me-limit > .me-row {
1853
+ min-height: 0;
1854
+ }
1855
+ .me-large-operator .me-limit :is(.me-input, .me-measure, .me-preview-token) {
1856
+ line-height: 1.1;
1857
+ padding-block: 0;
1858
+ }
1859
+ /* Side bounds span the full integral height, with room for the glyph's slant. */
1860
+ :is(
1861
+ [data-structure='integral'],
1862
+ [data-structure='doubleIntegral'],
1863
+ [data-structure='tripleIntegral'],
1864
+ [data-structure='contourIntegral']
1865
+ )
1866
+ > .me-limits
1867
+ > :is(.me-limit:first-child, .me-limit:last-child) {
1868
+ position: relative;
1869
+ }
1870
+ :is(
1871
+ [data-structure='integral'],
1872
+ [data-structure='doubleIntegral'],
1873
+ [data-structure='tripleIntegral'],
1874
+ [data-structure='contourIntegral']
1875
+ )
1876
+ > .me-limits
1877
+ > .me-operator-glyph {
1878
+ font-size: calc(var(--me-font-size, 22px) * 2);
1879
+ }
1880
+ :is(
1881
+ [data-structure='integral'],
1882
+ [data-structure='doubleIntegral'],
1883
+ [data-structure='tripleIntegral'],
1884
+ [data-structure='contourIntegral']
1885
+ )
1886
+ > .me-limits
1887
+ > .me-limit:first-child {
1888
+ top: calc(var(--me-font-size, 22px) * -0.35);
1889
+ }
1890
+ :is(
1891
+ [data-structure='integral'],
1892
+ [data-structure='doubleIntegral'],
1893
+ [data-structure='tripleIntegral'],
1894
+ [data-structure='contourIntegral']
1895
+ )
1896
+ > .me-limits
1897
+ > .me-limit:last-child {
1898
+ top: calc(var(--me-font-size, 22px) * 0.25);
1899
+ }
1900
+ :is(
1901
+ [data-structure='integral'],
1902
+ [data-structure='doubleIntegral'],
1903
+ [data-structure='tripleIntegral'],
1904
+ [data-structure='contourIntegral']
1905
+ )[data-limit-placement='limits']
1906
+ > .me-limits
1907
+ > .me-limit {
1908
+ top: 0;
1909
+ }
1910
+ /* Annotation rows overlap their text line boxes, not their painted glyphs. */
1911
+ :is(.me-overset, .me-underset) > .me-slot {
1912
+ display: inline-flex;
1913
+ justify-content: center;
1914
+ }
1915
+ :is(.me-overset, .me-underset) > .me-slot > .me-row {
1916
+ min-height: 0;
1917
+ }
1918
+ :is(.me-overset, .me-underset) > .me-slot :is(.me-input, .me-measure, .me-preview-token) {
1919
+ line-height: 1;
1920
+ padding-block: 0;
1921
+ }
1922
+ .me-overset > .me-slot:first-child {
1923
+ margin-bottom: calc(var(--me-font-size, 22px) * -0.2);
1924
+ }
1925
+ .me-underset > .me-slot:first-child {
1926
+ margin-top: calc(var(--me-font-size, 22px) * -0.2);
1927
+ }
1928
+ /* Matrix environments use text-style cells; aligned/cases retain display rows. */
1929
+ .me-matrix[data-structure='matrix'] > .me-matrix-grid {
1930
+ row-gap: calc(var(--me-font-size, 22px) * 0.07);
1931
+ }
1932
+ .me-matrix[data-structure='matrix'] > .me-matrix-grid > .me-matrix-cell > .me-row {
1933
+ min-height: 0;
1934
+ }
1935
+ .me-matrix[data-structure='matrix']
1936
+ > .me-matrix-grid
1937
+ > .me-matrix-cell
1938
+ > .me-row
1939
+ > .me-run
1940
+ :is(.me-input, .me-measure, .me-preview-token) {
1941
+ line-height: 1.2;
1942
+ padding-block: 0;
1943
+ }
1944
+ .me-matrix[data-structure='matrix']
1945
+ .me-fraction:not([data-math-style='display'])
1946
+ :is(.me-input, .me-measure, .me-preview-token) {
1947
+ font-size: calc(var(--me-font-size, 22px) * 0.7);
1948
+ line-height: 0.85;
1949
+ padding-block: 0;
1950
+ }
1951
+ .me-matrix[data-structure='matrix'] .me-fraction:not([data-math-style='display']) .me-row {
1952
+ min-height: 0;
1953
+ }
1954
+
1955
+ /* Brace annotations need a compact body row as well as a compact label row. */
1956
+ :is(.me-overbrace, .me-underbrace) > .me-slot > .me-row {
1957
+ min-height: 0;
1958
+ }
1959
+ :is(.me-overbrace, .me-underbrace) > .me-slot :is(.me-input, .me-measure, .me-preview-token) {
1960
+ line-height: 1.1;
1961
+ padding-block: 0;
1962
+ }
1963
+ /* A display fraction in a script keeps full-size terms. Raise/lower the whole
1964
+ stack so that its near edge clears the base, not just its fraction bar. */
1965
+ .me-superscript > .me-slot:last-child:has(> .me-row > .me-fraction[data-math-style='display']) {
1966
+ transform: translateY(-30%);
1967
+ }
1968
+ .me-subscript > .me-slot:last-child:has(> .me-row > .me-fraction[data-math-style='display']) {
1969
+ transform: translateY(30%);
1970
+ }
1971
+
1972
+ /* Use the display operator glyphs themselves, including their italic correction,
1973
+ rather than enlarging/skewing a text-font integral or sum. */
1974
+ .me-large-operator[data-structure][data-limit-placement] > .me-limits > .me-operator-glyph {
1975
+ font: normal var(--me-font-size, 22px) / 1.6 'Barocss Large Operators', serif;
1976
+ transform: none;
1977
+ width: auto;
1978
+ height: calc(var(--me-font-size, 22px) * 1.6);
1979
+ }
1980
+ .me-large-operator:is(
1981
+ [data-structure='integral'],
1982
+ [data-structure='doubleIntegral'],
1983
+ [data-structure='tripleIntegral'],
1984
+ [data-structure='contourIntegral']
1985
+ )[data-limit-placement]
1986
+ > .me-limits
1987
+ > .me-operator-glyph {
1988
+ line-height: 2.3;
1989
+ height: calc(var(--me-font-size, 22px) * 2.3);
1990
+ }
1991
+ /* Keep fence curvature and stroke proportional to the chosen math size. */
1992
+ .me-parentheses > .me-delimiter,
1993
+ :is(.me-openClosed, .me-closedOpen, .me-fenced) > :is([data-fence='('], [data-fence=')']) {
1994
+ flex-basis: calc(var(--me-font-size, 22px) * 0.389);
1995
+ }
1996
+ .me-parentheses:has(> .me-slot .me-structure) > .me-delimiter,
1997
+ :is(.me-openClosed, .me-closedOpen, .me-fenced):has(> .me-slot .me-structure)
1998
+ > :is([data-fence='('], [data-fence=')']) {
1999
+ flex-basis: calc(var(--me-font-size, 22px) * 0.55);
2000
+ }
2001
+ .me-matrix[data-environment='pmatrix'] > .me-matrix-delimiter {
2002
+ width: calc(var(--me-font-size, 22px) * 0.55);
2003
+ }
2004
+ .me-delimiter:is([data-fence='{'], [data-fence='}']),
2005
+ .me-matrix:is([data-environment='Bmatrix'], [data-structure='cases']) > .me-matrix-delimiter {
2006
+ width: calc(var(--me-font-size, 22px) * 0.55);
2007
+ flex-basis: calc(var(--me-font-size, 22px) * 0.55);
2008
+ }
2009
+
2010
+ /* Brace outlines derived from KaTeX 0.16.28 svgGeometry.js (MIT; see
2011
+ fonts/LICENSE-KaTeX.txt). Clip three slices so long braces keep curved ends. */
2012
+ :is(.me-overbrace, .me-underbrace) > .me-slot:last-child::before {
2013
+ height: calc(var(--me-font-size, 22px) * 0.548);
2014
+ mask: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%3E%3Csvg%20x%3D%220%22%20width%3D%2225%25%22%20height%3D%22100%25%22%20viewBox%3D%220%200%20400000%20548%22%20preserveAspectRatio%3D%22xMinYMin%20slice%22%3E%3Cpath%20d%3D%22M6%20548l-6-6v-35l6-11c56-104%20135.3-181.3%20238-232%2057.3-28.7%20117%20-45%20179-50h399577v120H403c-43.3%207-81%2015-113%2026-100.7%2033-179.7%2091-237%20174-2.7%20%205-6%209-10%2013-.7%201-7.3%201-20%201H6z%22%2F%3E%3C%2Fsvg%3E%3Csvg%20x%3D%2225%25%22%20width%3D%2250%25%22%20height%3D%22100%25%22%20viewBox%3D%220%200%20400000%20548%22%20preserveAspectRatio%3D%22xMidYMin%20slice%22%3E%3Cpath%20d%3D%22M200428%20334%20c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7%204-5.7%208.7-9%2014%20-53.3%2086.7-123.7%20153-211%20199-66.7%2036-137.3%2056.3-212%2062H0V214h199568c178.3-11.7%20%20311.7-78.3%20403-201%206-8%209.7-12%2011-12%20.7-.7%206.7-1%2018-1s17.3.3%2018%201c1.3%200%205%204%2011%20%2012%2044.7%2059.3%20101.3%20106.3%20170%20141s145.3%2054.3%20229%2060h199572v120z%22%2F%3E%3C%2Fsvg%3E%3Csvg%20x%3D%2275%25%22%20width%3D%2225%25%22%20height%3D%22100%25%22%20viewBox%3D%220%200%20400000%20548%22%20preserveAspectRatio%3D%22xMaxYMin%20slice%22%3E%3Cpath%20d%3D%22M400000%20542l%20-6%206h-17c-12.7%200-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5%20s-117.2-55.8-184.5-66.5c-.7%200-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6%201%20c124.7%208%20235%2061.7%20331%20161%2031.3%2033.3%2059.7%2072.7%2085%20118l7%2013v35z%22%2F%3E%3C%2Fsvg%3E%3C%2Fsvg%3E')
2015
+ center / 100% 100% no-repeat;
2016
+ }
2017
+ .me-overbrace > .me-slot:last-child {
2018
+ padding-top: calc(var(--me-font-size, 22px) * 0.598);
2019
+ }
2020
+ .me-underbrace > .me-slot:last-child {
2021
+ padding-bottom: calc(var(--me-font-size, 22px) * 0.598);
2022
+ }
2023
+ .me-overbrace > .me-slot:first-child {
2024
+ margin-bottom: calc(var(--me-font-size, 22px) * -0.2);
2025
+ }
2026
+ .me-underbrace > .me-slot:first-child {
2027
+ margin-top: calc(var(--me-font-size, 22px) * -0.2);
2028
+ }
2029
+ .me-root > .me-radical,
2030
+ .me-indexedRoot > .me-radical {
2031
+ width: calc(var(--me-font-size, 22px) * 0.85);
2032
+ }
2033
+ .me-indexedRoot > .me-slot:nth-last-child(2) {
2034
+ align-self: center;
2035
+ display: inline-flex;
2036
+ margin-right: calc(var(--me-font-size, 22px) * -0.6);
2037
+ margin-top: 0;
2038
+ transform: translate(
2039
+ calc(var(--me-font-size, 22px) * 0.35),
2040
+ calc(var(--me-font-size, 22px) * -0.3)
2041
+ );
2042
+ }
2043
+ .me-indexedRoot > .me-slot:nth-last-child(2) > .me-row {
2044
+ min-height: 0;
2045
+ }
2046
+ .me-matrix[data-structure='matrix'] > .me-matrix-grid {
2047
+ column-gap: calc(var(--me-font-size, 22px) * 0.8);
2048
+ }
2049
+
2050
+ /* TeX leaves a thin space after a large operator. Integral side limits also
2051
+ need its italic correction so their upper label clears the slanted tip. */
2052
+ .me-large-operator {
2053
+ gap: calc(var(--me-font-size, 22px) / 6);
2054
+ }
2055
+ .me-large-operator:is(
2056
+ [data-structure='integral'],
2057
+ [data-structure='doubleIntegral'],
2058
+ [data-structure='tripleIntegral'],
2059
+ [data-structure='contourIntegral']
2060
+ ):not([data-limit-placement='limits'])
2061
+ > .me-limits
2062
+ > .me-limit:first-child {
2063
+ margin-left: calc(var(--me-font-size, 22px) * 0.44445);
2064
+ }
2065
+ .me-large-operator:is(
2066
+ [data-structure='integral'],
2067
+ [data-structure='doubleIntegral'],
2068
+ [data-structure='tripleIntegral'],
2069
+ [data-structure='contourIntegral']
2070
+ )[data-limit-placement='limits']
2071
+ > .me-limits
2072
+ > .me-operator-glyph {
2073
+ padding-inline-end: calc(var(--me-font-size, 22px) * 0.44445);
2074
+ }
2075
+ .me-large-operator:is(
2076
+ [data-structure='integral'],
2077
+ [data-structure='doubleIntegral'],
2078
+ [data-structure='tripleIntegral'],
2079
+ [data-structure='contourIntegral']
2080
+ )[data-limit-placement='limits']
2081
+ > .me-limits
2082
+ > .me-limit:last-child {
2083
+ transform: translateX(calc(var(--me-font-size, 22px) * -0.22222));
2084
+ }
2085
+ /* The upright glyph's lower side limit no longer needs the negative offset
2086
+ used for the skewed text-font integral. */
2087
+ .me-large-operator:is(
2088
+ [data-structure='integral'],
2089
+ [data-structure='doubleIntegral'],
2090
+ [data-structure='tripleIntegral'],
2091
+ [data-structure='contourIntegral']
2092
+ ):not([data-limit-placement='limits'])
2093
+ > .me-limits
2094
+ > .me-limit:last-child {
2095
+ margin-left: 0;
2096
+ }
2097
+ /* A radical encloses math ink rather than the taller UI text line box.
2098
+ Tall nested structures continue to determine their own row height. */
2099
+ :is(.me-root, .me-indexedRoot) > .me-slot:last-child > .me-row {
2100
+ min-height: 0;
2101
+ }
2102
+ :is(.me-root, .me-indexedRoot)
2103
+ > .me-slot:last-child
2104
+ > .me-row
2105
+ > .me-run
2106
+ :is(.me-input, .me-measure, .me-preview-token) {
2107
+ line-height: 1;
2108
+ padding-block: 0;
2109
+ }
2110
+
2111
+ /* Inline math uses text-style operator glyphs and side limits by default.
2112
+ Explicit limits/nolimits remain authoritative. */
2113
+ @font-face {
2114
+ font-family: 'Barocss Small Operators';
2115
+ src: url('./fonts/KaTeX_Size1-Regular.woff2') format('woff2');
2116
+ font-style: normal;
2117
+ font-display: swap;
2118
+ }
2119
+ /* TeX stops reducing nested scripts at scriptscript size. */
2120
+ :is(.me-superscript, .me-subscript, .me-scripts)
2121
+ > .me-slot:not(:first-child)
2122
+ :is(.me-superscript, .me-subscript, .me-scripts)
2123
+ > .me-slot:not(:first-child)
2124
+ :is(.me-input, .me-measure, .me-preview-token) {
2125
+ font-size: calc(var(--me-font-size, 22px) * 0.5);
2126
+ line-height: 1.1;
2127
+ padding-block: 0;
2128
+ }
2129
+ :is(.me-superscript, .me-subscript, .me-scripts)
2130
+ > .me-slot:not(:first-child)
2131
+ :is(.me-superscript, .me-subscript, .me-scripts)
2132
+ > .me-slot:not(:first-child)
2133
+ > .me-row {
2134
+ min-height: 0;
2135
+ }
2136
+ :is(.me-superscript, .me-subscript, .me-scripts)
2137
+ > .me-slot:not(:first-child)
2138
+ :is(.me-root, .me-indexedRoot)
2139
+ > .me-radical {
2140
+ width: calc(var(--me-font-size, 22px) * 0.595);
2141
+ min-height: calc(var(--me-font-size, 22px) * 0.7);
2142
+ }
2143
+ .me-superscript > .me-slot:last-child:has(> .me-row > :is(.me-root, .me-indexedRoot)) {
2144
+ transform: translateY(-15%);
2145
+ }
2146
+
2147
+ /* Nested scripts need less lift after their line boxes shrink. */
2148
+ :is(.me-superscript, .me-subscript, .me-scripts)
2149
+ > .me-slot:not(:first-child)
2150
+ .me-superscript
2151
+ > .me-slot:last-child {
2152
+ transform: translateY(-0.1em);
2153
+ }
2154
+
2155
+ /* KaTeX glyph contours retain the short curve and tall end caps. The cap
2156
+ length is bounded; only the straight stem extends for very tall bodies. */
2157
+ .me-parentheses > .me-delimiter,
2158
+ :is(.me-openClosed, .me-closedOpen, .me-fenced) > :is([data-fence='('], [data-fence=')']) {
2159
+ mask: url('./shapes/parenthesis.svg') center / 61.44% var(--me-font-size, 22px) no-repeat;
2160
+ }
2161
+ .me-parentheses:has(> .me-slot .me-structure) > .me-delimiter,
2162
+ :is(.me-openClosed, .me-closedOpen, .me-fenced):has(> .me-slot .me-structure)
2163
+ > :is([data-fence='('], [data-fence=')']),
2164
+ .me-matrix[data-environment='pmatrix'] > .me-matrix-delimiter {
2165
+ --me-fence-cap: min(50%, calc(var(--me-font-size, 22px) * 1.809));
2166
+ mask: url('./shapes/parenthesis-top.svg') left top / 100% var(--me-fence-cap) no-repeat,
2167
+ url('./shapes/parenthesis-bottom.svg') left bottom / 100% var(--me-fence-cap) no-repeat,
2168
+ linear-gradient(currentColor, currentColor) left center / 22.826%
2169
+ calc(100% - var(--me-fence-cap) - var(--me-fence-cap) + 1px) no-repeat;
2170
+ }
2171
+
2172
+ /* The font contour has a tapered entry and thin rising stroke. Reusing it
2173
+ avoids the thick uniform diagonal produced by the old polygon. */
2174
+ :is(.me-root, .me-indexedRoot) > .me-radical {
2175
+ clip-path: none;
2176
+ mask: url('./shapes/radical.svg') center / 100% 100% no-repeat;
2177
+ }
2178
+
2179
+ /* A nested radical needs clearance above its own rule. Without this space,
2180
+ successive rules collapse together even when the operand metrics agree. */
2181
+ :is(.me-root, .me-indexedRoot)
2182
+ > .me-slot:last-child:has(> .me-row > :is(.me-root, .me-indexedRoot)) {
2183
+ padding-top: calc(var(--me-font-size, 22px) * 0.25);
2184
+ }
2185
+
2186
+ /* Resolve reduced operator styles from model slots. Display operators retain
2187
+ their existing geometry; text/script contexts use Size1 and side limits. */
2188
+ .me-editor [data-operator-style] {
2189
+ --me-operator-scale: 1;
2190
+ --me-bound-scale: 0.7;
2191
+ --me-operator-size: calc(var(--me-font-size, 22px) * var(--me-operator-scale));
2192
+ }
2193
+ .me-editor [data-operator-style='script'] {
2194
+ --me-operator-scale: 0.7;
2195
+ --me-bound-scale: 0.5;
2196
+ }
2197
+ .me-editor [data-operator-style='scriptscript'] {
2198
+ --me-operator-scale: 0.5;
2199
+ --me-bound-scale: 0.5;
2200
+ }
2201
+ .me-editor
2202
+ .me-large-operator[data-operator-style]:not([data-operator-style='display'])
2203
+ > .me-limits
2204
+ > .me-operator-glyph {
2205
+ font: normal var(--me-operator-size) / 1.1 'Barocss Small Operators', serif;
2206
+ height: calc(var(--me-operator-size) * 1.1);
2207
+ transform: none;
2208
+ }
2209
+ .me-editor
2210
+ :is(.me-large-operator, .me-limit-operator)[data-operator-style]:not(
2211
+ [data-operator-style='display']
2212
+ ) {
2213
+ gap: calc(var(--me-operator-size) / 6);
2214
+ }
2215
+ .me-editor .me-large-operator[data-operator-style][data-layout-limits='side'] > .me-limits {
2216
+ display: inline-grid;
2217
+ grid-template-columns: max-content max-content;
2218
+ grid-template-rows: auto auto;
2219
+ align-items: center;
2220
+ }
2221
+ .me-editor
2222
+ .me-large-operator[data-operator-style][data-layout-limits='side']
2223
+ > .me-limits
2224
+ > .me-operator-glyph {
2225
+ grid-column: 1;
2226
+ grid-row: 1 / 3;
2227
+ }
2228
+ .me-editor
2229
+ .me-large-operator[data-operator-style][data-layout-limits='side']
2230
+ > .me-limits
2231
+ > .me-limit:first-child {
2232
+ grid-column: 2;
2233
+ grid-row: 1;
2234
+ }
2235
+ .me-editor
2236
+ .me-large-operator[data-operator-style][data-layout-limits='side']
2237
+ > .me-limits
2238
+ > .me-limit:last-child {
2239
+ grid-column: 2;
2240
+ grid-row: 2;
2241
+ }
2242
+ .me-editor
2243
+ .me-large-operator[data-operator-style]:not([data-operator-style='display'])
2244
+ > .me-limits
2245
+ > .me-limit {
2246
+ top: 0;
2247
+ margin-left: 0;
2248
+ }
2249
+ .me-editor
2250
+ .me-large-operator[data-operator-style]:not([data-operator-style='display']):is(
2251
+ [data-structure='integral'],
2252
+ [data-structure='doubleIntegral'],
2253
+ [data-structure='tripleIntegral'],
2254
+ [data-structure='contourIntegral']
2255
+ )[data-layout-limits='side']
2256
+ > .me-limits
2257
+ > .me-limit:first-child {
2258
+ margin-left: calc(var(--me-operator-size) * 0.19445);
2259
+ top: calc(var(--me-operator-size) * -0.12);
2260
+ }
2261
+ .me-editor
2262
+ .me-large-operator[data-operator-style]:not([data-operator-style='display']):is(
2263
+ [data-structure='integral'],
2264
+ [data-structure='doubleIntegral'],
2265
+ [data-structure='tripleIntegral'],
2266
+ [data-structure='contourIntegral']
2267
+ )[data-layout-limits='side']
2268
+ > .me-limits
2269
+ > .me-limit:last-child {
2270
+ top: calc(var(--me-operator-size) * 0.08);
2271
+ }
2272
+ .me-editor
2273
+ .me-large-operator[data-operator-style]:not([data-operator-style='display']):is(
2274
+ [data-structure='integral'],
2275
+ [data-structure='doubleIntegral'],
2276
+ [data-structure='tripleIntegral'],
2277
+ [data-structure='contourIntegral']
2278
+ )[data-layout-limits='stacked']
2279
+ > .me-limits
2280
+ > .me-operator-glyph {
2281
+ padding-inline-end: calc(var(--me-operator-size) * 0.19445);
2282
+ }
2283
+ .me-editor
2284
+ .me-large-operator[data-operator-style]:not([data-operator-style='display']):is(
2285
+ [data-structure='integral'],
2286
+ [data-structure='doubleIntegral'],
2287
+ [data-structure='tripleIntegral'],
2288
+ [data-structure='contourIntegral']
2289
+ )[data-layout-limits='stacked']
2290
+ > .me-limits
2291
+ > .me-limit:last-child {
2292
+ transform: translateX(calc(var(--me-operator-size) * -0.097225));
2293
+ }
2294
+ .me-editor
2295
+ .me-limit-operator[data-operator-style]:not([data-operator-style='display'])
2296
+ > .me-limits
2297
+ > .me-limit-glyph {
2298
+ font-size: var(--me-operator-size);
2299
+ }
2300
+ .me-editor .me-limit-operator[data-operator-style][data-layout-limits='side'] > .me-limits {
2301
+ flex-direction: row;
2302
+ align-items: center;
2303
+ gap: 0;
2304
+ }
2305
+ .me-editor
2306
+ .me-limit-operator[data-operator-style][data-layout-limits='side']
2307
+ > .me-limits
2308
+ > .me-limit {
2309
+ transform: translateY(calc(var(--me-operator-size) * 0.18));
2310
+ }
2311
+ /* Row styles distinguish a nested operator body from its own smaller bounds.
2312
+ Do not apply an ancestor bound's size to every descendant text token. */
2313
+ .me-editor [data-operator-style]:not([data-operator-style='display']) .me-row[data-layout-style] {
2314
+ min-height: 0;
2315
+ }
2316
+ .me-editor
2317
+ [data-operator-style]:not([data-operator-style='display'])
2318
+ .me-row[data-layout-style]
2319
+ > .me-run
2320
+ :is(.me-input, .me-measure, .me-preview-token) {
2321
+ font-size: var(--me-font-size, 22px);
2322
+ line-height: 1.1;
2323
+ padding-block: 0;
2324
+ }
2325
+ .me-editor
2326
+ [data-operator-style]:not([data-operator-style='display'])
2327
+ .me-row[data-layout-style='script']
2328
+ > .me-run
2329
+ :is(.me-input, .me-measure, .me-preview-token) {
2330
+ font-size: calc(var(--me-font-size, 22px) * 0.7);
2331
+ }
2332
+ .me-editor
2333
+ [data-operator-style]:not([data-operator-style='display'])
2334
+ .me-row[data-layout-style='scriptscript']
2335
+ > .me-run
2336
+ :is(.me-input, .me-measure, .me-preview-token) {
2337
+ font-size: calc(var(--me-font-size, 22px) * 0.5);
2338
+ }
2339
+
2340
+ /* Glyph width and mathematical spacing are separate from the caret hit area.
2341
+ Binary/relation/punctuation gaps disappear in script styles. Empty slots
2342
+ retain their existing minimum width; only model boundaries shrink. */
2343
+ .me-row {
2344
+ --me-spacing-unit: calc(var(--me-font-size, 22px) / 18);
2345
+ }
2346
+ .me-row[data-layout-style='script'],
2347
+ .me-row[data-layout-style='scriptscript'] {
2348
+ --me-spacing-unit: 0px;
2349
+ }
2350
+ .me-row > :is(.me-run, .me-operatorName, .me-fraction)[data-math-spacing='true'] {
2351
+ margin-left: calc(var(--me-space-before, 0) * var(--me-spacing-unit));
2352
+ margin-right: calc(var(--me-space-after, 0) * var(--me-spacing-unit));
2353
+ }
2354
+ .me-run[data-math-spacing='true']:not(.me-empty) > .me-measure {
2355
+ padding-inline: 0;
2356
+ min-width: 0;
2357
+ }
2358
+ .me-row > .me-empty-boundary:not(:focus-within) > .me-measure {
2359
+ min-width: 1px;
2360
+ width: 1px;
2361
+ padding-inline: 0;
2362
+ }
2363
+
2364
+ /* Function names contribute glyph width only. The row sets their thin spacing,
2365
+ including the suppressed gap before an opening parenthesis. */
2366
+ .me-operatorName > .me-slot > .me-row > .me-run:not(.me-empty) > .me-measure {
2367
+ min-width: 0;
2368
+ padding-inline: 0;
2369
+ }
2370
+ .me-row[data-layout-style='script'] {
2371
+ --me-tight-unit: calc(var(--me-font-size, 22px) * 0.7 / 18);
2372
+ }
2373
+ .me-row[data-layout-style='scriptscript'] {
2374
+ --me-tight-unit: calc(var(--me-font-size, 22px) * 0.5 / 18);
2375
+ }
2376
+ .me-row:is([data-layout-style='script'], [data-layout-style='scriptscript'])
2377
+ > [data-math-spacing='true'] {
2378
+ margin-left: calc(var(--me-tight-before, 0) * var(--me-tight-unit));
2379
+ margin-right: calc(var(--me-tight-after, 0) * var(--me-tight-unit));
2380
+ }