@marimo-team/frontend 0.17.4 → 0.17.5

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 (68) hide show
  1. package/dist/assets/{CellStatus-c0SAQ-F-.js → CellStatus-DjUtGUqj.js} +1 -1
  2. package/dist/assets/{ConnectedDataExplorerComponent-f8cXX1lE.js → ConnectedDataExplorerComponent-Bjfp6wiJ.js} +1 -1
  3. package/dist/assets/{ConsoleOutput-CDSftFlX.js → ConsoleOutput-C4nRvbNL.js} +1 -1
  4. package/dist/assets/{MarimoErrorOutput-BMyX5A6l.js → MarimoErrorOutput-DKtP9DfP.js} +1 -1
  5. package/dist/assets/{Output-pZgeySyq.js → Output-x6LACtkd.js} +1 -1
  6. package/dist/assets/{RenderHTML-BUSbsjNK.js → RenderHTML-B4Xlxz9Q.js} +1 -1
  7. package/dist/assets/{add-cell-with-ai-D5ovEhXx.js → add-cell-with-ai-D94Om7DS.js} +1 -1
  8. package/dist/assets/{add-database-form-p8983nDn.js → add-database-form-BDX2uZCC.js} +1 -1
  9. package/dist/assets/{add-missing-import-BwGZ98W0.js → add-missing-import-Cy6g_y6i.js} +1 -1
  10. package/dist/assets/{agent-panel-B5iI79QW.js → agent-panel-DPCsTGPU.js} +1 -1
  11. package/dist/assets/{app-config-button-BFmqvqPu.js → app-config-button-C02qSaV5.js} +1 -1
  12. package/dist/assets/{cell-actions-Cc2JYtcT.js → cell-actions-CNcpitg7.js} +1 -1
  13. package/dist/assets/{cell-editor-DJ46IITP.js → cell-editor-oXchtd-2.js} +1 -1
  14. package/dist/assets/{cell-link-DFNTDaPd.js → cell-link-d9BMXpwm.js} +1 -1
  15. package/dist/assets/{cells-DNq9ng4B.js → cells-CZmitpcp.js} +3 -4
  16. package/dist/assets/{chat-components-BJMCzZRK.js → chat-components-u_00E1Iv.js} +1 -1
  17. package/dist/assets/{chat-panel-DajnoQHz.js → chat-panel-BBQVqm6k.js} +1 -1
  18. package/dist/assets/{client-B0dO9skM.js → client-Co0Fvwib.js} +1 -1
  19. package/dist/assets/{column-preview-BiiXdwvw.js → column-preview-BsCKvnq_.js} +1 -1
  20. package/dist/assets/{command-palette-DbfvqoOB.js → command-palette-C9_cNlJc.js} +1 -1
  21. package/dist/assets/{common-U0RDob8X.js → common-BWlM0NQw.js} +1 -1
  22. package/dist/assets/{datasources-panel-Bo6UM72J.js → datasources-panel-CRS3I41j.js} +1 -1
  23. package/dist/assets/{dependency-graph-panel-DcOypoYV.js → dependency-graph-panel-PEDmfewV.js} +1 -1
  24. package/dist/assets/{documentation-panel-BPa77v-x.js → documentation-panel-Caz5K_OT.js} +1 -1
  25. package/dist/assets/{edit-page-CYfYSIzk.js → edit-page-DuRQ1eIB.js} +3 -3
  26. package/dist/assets/{error-panel-C4Dh4_Gz.js → error-panel-D0ZJmprT.js} +1 -1
  27. package/dist/assets/{file-explorer-panel-BTjjB1ys.js → file-explorer-panel-Jnmw434H.js} +1 -1
  28. package/dist/assets/{floating-outline-DwAgRZTh.js → floating-outline-BXSB3SQ6.js} +1 -1
  29. package/dist/assets/{focus-BwMl5m5_.js → focus-CUS3ckCE.js} +1 -1
  30. package/dist/assets/{form-CQCzdh1o.js → form-BlnK1x-p.js} +1 -1
  31. package/dist/assets/{form-D69llIWP.js → form-nAUuUhu3.js} +1 -1
  32. package/dist/assets/{home-page-F1w05vyJ.js → home-page-DIYkvTFf.js} +1 -1
  33. package/dist/assets/{index-q8eVuDDk.js → index-DsdBxblV.js} +6 -6
  34. package/dist/assets/{kiosk-mode-Dd1ooBaF.js → kiosk-mode-CHVximkk.js} +1 -1
  35. package/dist/assets/{layout-C8ytLSQd.js → layout-CRXL9551.js} +1 -1
  36. package/dist/assets/{lazy-tfeVHpGH.js → lazy-ijSQmhmN.js} +2 -2
  37. package/dist/assets/{logs-panel-C8ChYhO8.js → logs-panel-9HAqKVuS.js} +1 -1
  38. package/dist/assets/{mode-BWw7rz82.js → mode-CtH3Xe58.js} +1 -1
  39. package/dist/assets/{name-cell-input-F8bM4E5e.js → name-cell-input-DZWpmHYT.js} +1 -1
  40. package/dist/assets/{outline-panel-QjRV3Zps.js → outline-panel-D0DvfWbQ.js} +1 -1
  41. package/dist/assets/{packages-panel-_yihtFbB.js → packages-panel-DmqfeORQ.js} +1 -1
  42. package/dist/assets/react-vega-CoPJaJAh.js +194 -0
  43. package/dist/assets/{react-vega-5InfQEZl.js → react-vega-D5EPmHUL.js} +1 -1
  44. package/dist/assets/{readonly-python-code-gmO6162d.js → readonly-python-code-Ba_IF_mK.js} +1 -1
  45. package/dist/assets/{run-page-BsulC5PQ.js → run-page-Dtlg4eqe.js} +1 -1
  46. package/dist/assets/{scratchpad-panel-A9G8o9jf.js → scratchpad-panel-5EljtEkX.js} +1 -1
  47. package/dist/assets/{snippets-panel-C6FwSaZz.js → snippets-panel-Cg9ksbKX.js} +1 -1
  48. package/dist/assets/{state-CIEHjRfF.js → state-7Nd5UYc6.js} +1 -1
  49. package/dist/assets/{state-C7T5AXo0.js → state-BDyZ5-wH.js} +1 -1
  50. package/dist/assets/{storage-CmIwledL.js → storage-DczTxxXy.js} +1 -1
  51. package/dist/assets/{tracing-Cq1z4XC3.js → tracing-CbAnhOdo.js} +1 -1
  52. package/dist/assets/{tracing-panel-Mt1B8lhs.js → tracing-panel-B3iny2EN.js} +2 -2
  53. package/dist/assets/{types-UoG2cq5J.js → types-h5wz3HYN.js} +1 -1
  54. package/dist/assets/{useAddCell-xX3fIjF2.js → useAddCell-CWXmrhes.js} +1 -1
  55. package/dist/assets/{useCellActionButton-jH-t2BrR.js → useCellActionButton-fVEGFa_R.js} +1 -1
  56. package/dist/assets/{useDeleteCell-CJ4WX9R2.js → useDeleteCell-Bg8Hgk6e.js} +1 -1
  57. package/dist/assets/{useNotebookActions-Cf9b-Ef9.js → useNotebookActions-BurReKKo.js} +1 -1
  58. package/dist/assets/{useRunCells-DjmsNJ7r.js → useRunCells-BiWuvMY1.js} +1 -1
  59. package/dist/assets/{useSplitCell-ueztloAj.js → useSplitCell-DhhZ7xVP.js} +1 -1
  60. package/dist/assets/{utilities.esm-D8HYU14D.js → utilities.esm-CCw2KKJk.js} +1 -1
  61. package/dist/assets/{variable-panel-DAhAueP9.js → variable-panel-Dkhq2h3W.js} +1 -1
  62. package/dist/assets/{vega-component-B7kKQDi7.js → vega-component-CrZQsWq8.js} +1 -1
  63. package/dist/index.html +24 -24
  64. package/package.json +2 -2
  65. package/src/core/codemirror/language/__tests__/markdown.test.ts +36 -13
  66. package/src/core/codemirror/language/__tests__/utils.test.ts +6 -2
  67. package/src/plugins/layout/TexPlugin.tsx +33 -5
  68. package/dist/assets/react-vega-Kdht4Pfp.js +0 -192
package/dist/index.html CHANGED
@@ -66,7 +66,7 @@
66
66
  <marimo-server-token data-token="{{ server_token }}" hidden></marimo-server-token>
67
67
  <!-- /TODO -->
68
68
  <title>{{ title }}</title>
69
- <script type="module" crossorigin src="./assets/index-q8eVuDDk.js"></script>
69
+ <script type="module" crossorigin src="./assets/index-DsdBxblV.js"></script>
70
70
  <link rel="modulepreload" crossorigin href="./assets/preload-helper-DImqtvgl.js">
71
71
  <link rel="modulepreload" crossorigin href="./assets/chunk-DZLz74EQ.js">
72
72
  <link rel="modulepreload" crossorigin href="./assets/react-BcIddLXZ.js">
@@ -138,12 +138,12 @@
138
138
  <link rel="modulepreload" crossorigin href="./assets/type-DVCC-93H.js">
139
139
  <link rel="modulepreload" crossorigin href="./assets/marked.esm-BB_RKOA5.js">
140
140
  <link rel="modulepreload" crossorigin href="./assets/main-CCaZmKLi.js">
141
- <link rel="modulepreload" crossorigin href="./assets/cells-DNq9ng4B.js">
141
+ <link rel="modulepreload" crossorigin href="./assets/cells-CZmitpcp.js">
142
142
  <link rel="modulepreload" crossorigin href="./assets/kbd-BfBY_QKr.js">
143
143
  <link rel="modulepreload" crossorigin href="./assets/renderShortcut-a-3t8sis.js">
144
144
  <link rel="modulepreload" crossorigin href="./assets/useEvent-itkPNnCe.js">
145
- <link rel="modulepreload" crossorigin href="./assets/useDeleteCell-CJ4WX9R2.js">
146
- <link rel="modulepreload" crossorigin href="./assets/lazy-tfeVHpGH.js">
145
+ <link rel="modulepreload" crossorigin href="./assets/useDeleteCell-Bg8Hgk6e.js">
146
+ <link rel="modulepreload" crossorigin href="./assets/lazy-ijSQmhmN.js">
147
147
  <link rel="modulepreload" crossorigin href="./assets/defaultLocale-DEWTIUVh.js">
148
148
  <link rel="modulepreload" crossorigin href="./assets/precisionRound-BLxyDkD7.js">
149
149
  <link rel="modulepreload" crossorigin href="./assets/defaultLocale-B9-NA0ur.js">
@@ -160,24 +160,24 @@
160
160
  <link rel="modulepreload" crossorigin href="./assets/usePress-C2JVmCUi.js">
161
161
  <link rel="modulepreload" crossorigin href="./assets/input-DuVApvWu.js">
162
162
  <link rel="modulepreload" crossorigin href="./assets/ImperativeModal-ExH1h9et.js">
163
- <link rel="modulepreload" crossorigin href="./assets/cell-link-DFNTDaPd.js">
163
+ <link rel="modulepreload" crossorigin href="./assets/cell-link-d9BMXpwm.js">
164
164
  <link rel="modulepreload" crossorigin href="./assets/alert-B5fh2kMN.js">
165
165
  <link rel="modulepreload" crossorigin href="./assets/links-90C38wV6.js">
166
- <link rel="modulepreload" crossorigin href="./assets/state-CIEHjRfF.js">
167
- <link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-BMyX5A6l.js">
166
+ <link rel="modulepreload" crossorigin href="./assets/state-7Nd5UYc6.js">
167
+ <link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-DKtP9DfP.js">
168
168
  <link rel="modulepreload" crossorigin href="./assets/spinner-1oeuzoUk.js">
169
169
  <link rel="modulepreload" crossorigin href="./assets/_arrayReduce-DV4IVFuG.js">
170
170
  <link rel="modulepreload" crossorigin href="./assets/startCase-RfubwhHM.js">
171
171
  <link rel="modulepreload" crossorigin href="./assets/strings-DRRWXNT2.js">
172
172
  <link rel="modulepreload" crossorigin href="./assets/command-DhuV6_de.js">
173
173
  <link rel="modulepreload" crossorigin href="./assets/popover-BoRNi4dY.js">
174
- <link rel="modulepreload" crossorigin href="./assets/useRunCells-DjmsNJ7r.js">
174
+ <link rel="modulepreload" crossorigin href="./assets/useRunCells-BiWuvMY1.js">
175
175
  <link rel="modulepreload" crossorigin href="./assets/copy-SPzF4B1M.js">
176
176
  <link rel="modulepreload" crossorigin href="./assets/copy-CDDalEhv.js">
177
177
  <link rel="modulepreload" crossorigin href="./assets/copy-icon-Ckew1l1_.js">
178
- <link rel="modulepreload" crossorigin href="./assets/mode-BWw7rz82.js">
178
+ <link rel="modulepreload" crossorigin href="./assets/mode-CtH3Xe58.js">
179
179
  <link rel="modulepreload" crossorigin href="./assets/purify.es-CmG1k0Cr.js">
180
- <link rel="modulepreload" crossorigin href="./assets/RenderHTML-BUSbsjNK.js">
180
+ <link rel="modulepreload" crossorigin href="./assets/RenderHTML-B4Xlxz9Q.js">
181
181
  <link rel="modulepreload" crossorigin href="./assets/table-Bj1zHGNd.js">
182
182
  <link rel="modulepreload" crossorigin href="./assets/tabs-CGHt3Blh.js">
183
183
  <link rel="modulepreload" crossorigin href="./assets/useAsyncData-BPaRR7vx.js">
@@ -194,8 +194,8 @@
194
194
  <link rel="modulepreload" crossorigin href="./assets/useDateFormatter-CQ9jB95h.js">
195
195
  <link rel="modulepreload" crossorigin href="./assets/range-ZclXTdAh.js">
196
196
  <link rel="modulepreload" crossorigin href="./assets/table-CmDieCGZ.js">
197
- <link rel="modulepreload" crossorigin href="./assets/Output-pZgeySyq.js">
198
- <link rel="modulepreload" crossorigin href="./assets/name-cell-input-F8bM4E5e.js">
197
+ <link rel="modulepreload" crossorigin href="./assets/Output-x6LACtkd.js">
198
+ <link rel="modulepreload" crossorigin href="./assets/name-cell-input-DZWpmHYT.js">
199
199
  <link rel="modulepreload" crossorigin href="./assets/useHotkey-Ca6pS8sJ.js">
200
200
  <link rel="modulepreload" crossorigin href="./assets/objectWithoutPropertiesLoose-CNyONSoo.js">
201
201
  <link rel="modulepreload" crossorigin href="./assets/esm-D8ZMWeYP.js">
@@ -298,18 +298,18 @@
298
298
  <link rel="modulepreload" crossorigin href="./assets/z80-CJYC52xh.js">
299
299
  <link rel="modulepreload" crossorigin href="./assets/esm-DXHMyc8g.js">
300
300
  <link rel="modulepreload" crossorigin href="./assets/trash-DpmcvlCC.js">
301
- <link rel="modulepreload" crossorigin href="./assets/ConsoleOutput-CDSftFlX.js">
301
+ <link rel="modulepreload" crossorigin href="./assets/ConsoleOutput-C4nRvbNL.js">
302
302
  <link rel="modulepreload" crossorigin href="./assets/icons-HGhpVPVr.js">
303
- <link rel="modulepreload" crossorigin href="./assets/add-missing-import-BwGZ98W0.js">
303
+ <link rel="modulepreload" crossorigin href="./assets/add-missing-import-Cy6g_y6i.js">
304
304
  <link rel="modulepreload" crossorigin href="./assets/blob-B96v6VlX.js">
305
- <link rel="modulepreload" crossorigin href="./assets/add-cell-with-ai-D5ovEhXx.js">
305
+ <link rel="modulepreload" crossorigin href="./assets/add-cell-with-ai-D94Om7DS.js">
306
306
  <link rel="modulepreload" crossorigin href="./assets/chart-no-axes-column-C2nGNVra.js">
307
307
  <link rel="modulepreload" crossorigin href="./assets/square-function-DncO0xCM.js">
308
308
  <link rel="modulepreload" crossorigin href="./assets/spec-Cdxt7KQF.js">
309
- <link rel="modulepreload" crossorigin href="./assets/focus-BwMl5m5_.js">
309
+ <link rel="modulepreload" crossorigin href="./assets/focus-CUS3ckCE.js">
310
310
  <link rel="modulepreload" crossorigin href="./assets/useInstallPackage-B1IBfLxp.js">
311
- <link rel="modulepreload" crossorigin href="./assets/column-preview-BiiXdwvw.js">
312
- <link rel="modulepreload" crossorigin href="./assets/useAddCell-xX3fIjF2.js">
311
+ <link rel="modulepreload" crossorigin href="./assets/column-preview-BsCKvnq_.js">
312
+ <link rel="modulepreload" crossorigin href="./assets/useAddCell-CWXmrhes.js">
313
313
  <link rel="modulepreload" crossorigin href="./assets/toggle-CPnmDQd7.js">
314
314
  <link rel="modulepreload" crossorigin href="./assets/api-qc-D7yz9.js">
315
315
  <link rel="modulepreload" crossorigin href="./assets/globals-Bcw0dX52.js">
@@ -318,22 +318,22 @@
318
318
  <link rel="modulepreload" crossorigin href="./assets/memoize-DhF8x4Aa.js">
319
319
  <link rel="modulepreload" crossorigin href="./assets/_toKey-16owuO_q.js">
320
320
  <link rel="modulepreload" crossorigin href="./assets/_baseSet-L2qemYhz.js">
321
- <link rel="modulepreload" crossorigin href="./assets/utilities.esm-D8HYU14D.js">
322
- <link rel="modulepreload" crossorigin href="./assets/floating-outline-DwAgRZTh.js">
321
+ <link rel="modulepreload" crossorigin href="./assets/utilities.esm-CCw2KKJk.js">
322
+ <link rel="modulepreload" crossorigin href="./assets/floating-outline-BXSB3SQ6.js">
323
323
  <link rel="modulepreload" crossorigin href="./assets/eye-off-BIDUS-iw.js">
324
324
  <link rel="modulepreload" crossorigin href="./assets/plus-DWAWtOBJ.js">
325
- <link rel="modulepreload" crossorigin href="./assets/readonly-python-code-gmO6162d.js">
325
+ <link rel="modulepreload" crossorigin href="./assets/readonly-python-code-Ba_IF_mK.js">
326
326
  <link rel="modulepreload" crossorigin href="./assets/file-video-camera-gcIrLbdD.js">
327
327
  <link rel="modulepreload" crossorigin href="./assets/file-text-Z92DzmMA.js">
328
328
  <link rel="modulepreload" crossorigin href="./assets/file-Cesos4Qp.js">
329
- <link rel="modulepreload" crossorigin href="./assets/types-UoG2cq5J.js">
329
+ <link rel="modulepreload" crossorigin href="./assets/types-h5wz3HYN.js">
330
330
  <link rel="modulepreload" crossorigin href="./assets/label-FIGQlkj5.js">
331
- <link rel="modulepreload" crossorigin href="./assets/form-D69llIWP.js">
331
+ <link rel="modulepreload" crossorigin href="./assets/form-nAUuUhu3.js">
332
332
  <link rel="modulepreload" crossorigin href="./assets/textarea-DA_SbCD5.js">
333
333
  <link rel="modulepreload" crossorigin href="./assets/circle-x-Bb-EcEyG.js">
334
334
  <link rel="modulepreload" crossorigin href="./assets/refresh-ccw-ETV_gv20.js">
335
335
  <link rel="modulepreload" crossorigin href="./assets/trash-2-D1jEfGpj.js">
336
- <link rel="modulepreload" crossorigin href="./assets/form-CQCzdh1o.js">
336
+ <link rel="modulepreload" crossorigin href="./assets/form-BlnK1x-p.js">
337
337
  <link rel="modulepreload" crossorigin href="./assets/field-mNGJv_67.js">
338
338
  <link rel="modulepreload" crossorigin href="./assets/switch-p-zRh0zu.js">
339
339
  <link rel="modulepreload" crossorigin href="./assets/useBoolean-CG31RE8p.js">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marimo-team/frontend",
3
- "version": "0.17.4",
3
+ "version": "0.17.5",
4
4
  "main": "dist/main.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -168,7 +168,7 @@
168
168
  "typescript-memoize": "^1.1.1",
169
169
  "use-acp": "0.2.5",
170
170
  "use-resize-observer": "^9.1.0",
171
- "vega-lite": "^6.4.1",
171
+ "vega-lite": "6.2.0",
172
172
  "vega-loader": "^5.1.0",
173
173
  "vega-parser": "^7.1.0",
174
174
  "vega-tooltip": "^1.1.0",
@@ -27,8 +27,10 @@ describe("MarkdownLanguageAdapter", () => {
27
27
  const out = adapter.transformOut(innerCode, metadata);
28
28
  expect(out).toMatchInlineSnapshot(`
29
29
  [
30
- "mo.md(r""" """)",
31
- 10,
30
+ "mo.md(r"""
31
+
32
+ """)",
33
+ 12,
32
34
  ]
33
35
  `);
34
36
  });
@@ -227,8 +229,10 @@ describe("MarkdownLanguageAdapter", () => {
227
229
  it("empty string", () => {
228
230
  const code = "";
229
231
  const [wrappedCode, offset] = adapter.transformOut(code, metadata);
230
- expect(wrappedCode).toBe(`mo.md(""" """)`);
231
- expect(offset).toBe(9);
232
+ expect(wrappedCode).toBe(`mo.md("""
233
+
234
+ """)`);
235
+ expect(offset).toBe(11);
232
236
  });
233
237
 
234
238
  it("defaults to r-string when there is no last quote prefix", () => {
@@ -236,15 +240,19 @@ describe("MarkdownLanguageAdapter", () => {
236
240
  const code = "Hello world";
237
241
  metadata.quotePrefix = "r";
238
242
  const [wrappedCode, offset] = adapter.transformOut(code, metadata);
239
- expect(wrappedCode).toBe(`mo.md(r"""Hello world""")`);
240
- expect(offset).toBe(10);
243
+ expect(wrappedCode).toBe(`mo.md(r"""
244
+ Hello world
245
+ """)`);
246
+ expect(offset).toBe(12);
241
247
  });
242
248
 
243
249
  it("single line", () => {
244
250
  const code = "Hello world";
245
251
  const [wrappedCode, offset] = adapter.transformOut(code, metadata);
246
- expect(wrappedCode).toBe(`mo.md("""Hello world""")`);
247
- expect(offset).toBe(9);
252
+ expect(wrappedCode).toBe(`mo.md("""
253
+ Hello world
254
+ """)`);
255
+ expect(offset).toBe(11);
248
256
  });
249
257
 
250
258
  it("starts with quote", () => {
@@ -283,21 +291,36 @@ describe("MarkdownLanguageAdapter", () => {
283
291
  });
284
292
 
285
293
  it("should escape triple quotes in the Markdown code", () => {
286
- const code = 'Markdown with an escaped """quote"""!!';
294
+ const code = 'Markdown with an escaped """quote""""!!';
287
295
  const [wrappedCode, offset] = adapter.transformOut(code, metadata);
288
296
  expect(wrappedCode).toBe(
289
- `mo.md("""Markdown with an escaped \\"""quote\\"""!!""")`,
297
+ `mo.md("""
298
+ Markdown with an escaped "\\""quote"\\""\\"!!
299
+ """)`,
290
300
  );
291
- expect(offset).toBe(9);
301
+ expect(offset).toBe(11);
302
+ });
303
+
304
+ it("should escape triple quotes in the Markdown code with backslash", () => {
305
+ const code = 'Markdown with an escaped \\"""quote\\""""!!';
306
+ const [wrappedCode, offset] = adapter.transformOut(code, metadata);
307
+ expect(wrappedCode).toBe(
308
+ `mo.md("""
309
+ Markdown with an escaped \\"\\""quote\\"\\""\\"!!
310
+ """)`,
311
+ );
312
+ expect(offset).toBe(11);
292
313
  });
293
314
 
294
315
  it("should preserve r strings", () => {
295
316
  const code = String.raw`$\nu = \mathllap{}\cdot\mathllap{\alpha}$`;
296
317
  metadata.quotePrefix = "r";
297
318
  const [wrappedCode, offset] = adapter.transformOut(code, metadata);
298
- const pythonCode = `mo.md(r"""$\\nu = \\mathllap{}\\cdot\\mathllap{\\alpha}$""")`;
319
+ const pythonCode = `mo.md(r"""
320
+ $\\nu = \\mathllap{}\\cdot\\mathllap{\\alpha}$
321
+ """)`;
299
322
  expect(wrappedCode).toBe(pythonCode);
300
- expect(offset).toBe(10);
323
+ expect(offset).toBe(12);
301
324
  });
302
325
 
303
326
  it("should handle f-strings in transformOut", () => {
@@ -146,8 +146,12 @@ describe("splitEditor", () => {
146
146
  selection: { anchor: "Hello,".length },
147
147
  });
148
148
  const result = splitEditor(mockEditor);
149
- expect(result.beforeCursorCode).toEqual('mo.md("""Hello,""")');
150
- expect(result.afterCursorCode).toEqual('mo.md(""" World!""")');
149
+ expect(result.beforeCursorCode).toEqual(`mo.md("""
150
+ Hello,
151
+ """)`);
152
+ expect(result.afterCursorCode).toEqual(`mo.md("""
153
+ World!
154
+ """)`);
151
155
  });
152
156
 
153
157
  // f-strings not currently supported
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2024 Marimo. All rights reserved. */
2
- import { type JSX, useLayoutEffect, useRef } from "react";
2
+ import { type JSX, useLayoutEffect, useRef, useState } from "react";
3
3
 
4
4
  import { z } from "zod";
5
5
  import { once } from "@/utils/once";
@@ -21,7 +21,10 @@ export class TexPlugin implements IStatelessPlugin<{}> {
21
21
 
22
22
  render(props: IStatelessPluginProps<{}>): JSX.Element {
23
23
  return (
24
- <TexComponent tex={props.host.textContent || props.host.innerHTML} />
24
+ <TexComponent
25
+ host={props.host}
26
+ tex={props.host.textContent || props.host.innerHTML}
27
+ />
25
28
  );
26
29
  }
27
30
  }
@@ -67,8 +70,33 @@ async function renderLatex(mount: HTMLElement, tex: string): Promise<void> {
67
70
  }
68
71
  }
69
72
 
70
- const TexComponent = ({ tex }: { tex: string }): JSX.Element => {
73
+ const TexComponent = ({
74
+ host,
75
+ tex,
76
+ }: {
77
+ host: HTMLElement;
78
+ tex: string;
79
+ }): JSX.Element => {
71
80
  const ref = useRef<HTMLSpanElement>(null);
81
+ const [currentTex, setCurrentTex] = useState(tex);
82
+
83
+ // Watch for changes to the host element's direct children
84
+ useLayoutEffect(() => {
85
+ const observer = new MutationObserver(() => {
86
+ const newTex = host.textContent || host.innerHTML;
87
+ setCurrentTex(newTex);
88
+ });
89
+
90
+ observer.observe(host, {
91
+ childList: true,
92
+ characterData: true,
93
+ subtree: true,
94
+ });
95
+
96
+ return () => {
97
+ observer.disconnect();
98
+ };
99
+ }, [host]);
72
100
 
73
101
  // The arithmatex markdown extension we use in Python produces nested
74
102
  // marimo-tex tags when $$...$$ math is used in a paragraph, with dummy
@@ -94,9 +122,9 @@ const TexComponent = ({ tex }: { tex: string }): JSX.Element => {
94
122
  // Re-render when the text content changes.
95
123
  useLayoutEffect(() => {
96
124
  if (ref.current) {
97
- renderLatex(ref.current, tex);
125
+ renderLatex(ref.current, currentTex);
98
126
  }
99
- }, [tex]);
127
+ }, [currentTex]);
100
128
 
101
129
  return <span ref={ref} />;
102
130
  };