@marimo-team/islands 0.25.2-dev105 → 0.25.2-dev107

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 (83) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CLsD_u_F.js → ConnectedDataExplorerComponent-CNSxdKyJ.js} +11 -11
  2. package/dist/{ErrorBoundary-efyVj7rF.js → ErrorBoundary-KRp3Mdlb.js} +8 -8
  3. package/dist/{abnfDiagram-VCTEODGH-DP-j9K77.js → abnfDiagram-VCTEODGH-DQDjNXt3.js} +2 -2
  4. package/dist/{any-language-editor-D5auDtxd.js → any-language-editor-B9REGlD9.js} +3 -3
  5. package/dist/{architectureDiagram-5GKGNRK7-BeQUyxB8.js → architectureDiagram-5GKGNRK7-Nmls7Wxn.js} +1 -1
  6. package/dist/{button-e0G6suEi.js → button-CvjkwdSk.js} +1 -1
  7. package/dist/{capabilities-to826YB8.js → capabilities-CQ5IjhzL.js} +1 -1
  8. package/dist/{cells-Cuf0K7MO.js → cells-CnomFgoS.js} +2958 -2938
  9. package/dist/{chat-ui-C0-ojNzY.js → chat-ui-DIoRDU4g.js} +15 -15
  10. package/dist/{check-DLTnw68H.js → check-EDwSwP89.js} +1 -1
  11. package/dist/{chunk-IMKFNOWR-Dk2PgCm2.js → chunk-IMKFNOWR-CoIFEo-1.js} +1 -1
  12. package/dist/{chunk-SHT3W25Y-BGY-9vHH.js → chunk-SHT3W25Y-lHiGx3ZC.js} +1 -1
  13. package/dist/{chunk-SVP7TREG-teKkW9Fg.js → chunk-SVP7TREG-BvsHIrY_.js} +1 -1
  14. package/dist/{chunk-TICWLB2K-DtXuhbug.js → chunk-TICWLB2K-BC8YIm_n.js} +1 -1
  15. package/dist/{classDiagram-ZZMXUADV-DbUMcd7_.js → classDiagram-ZZMXUADV-Bt98lkkv.js} +2 -2
  16. package/dist/{classDiagram-v2-VYDZK3BY-C-3L4d5M.js → classDiagram-v2-VYDZK3BY-D9bfbcC3.js} +2 -2
  17. package/dist/{code-visibility-DE54Pz9F.js → code-visibility-Czkyfmjy.js} +6 -6
  18. package/dist/{common-CTtBH0wF.js → common-Dot4N_jK.js} +22 -22
  19. package/dist/{copy-icon-BCF4LtXi.js → copy-icon-Ft7t9bqz.js} +3 -3
  20. package/dist/{cynefinDiagram-5FMLGOSQ--q32vtYo.js → cynefinDiagram-5FMLGOSQ-CgWra7wt.js} +1 -1
  21. package/dist/{dagre-GXQ25YYZ-ClJucAkw.js → dagre-GXQ25YYZ-CFZ8-35c.js} +1 -1
  22. package/dist/{data-grid-overlay-editor-DFqPk6q5.js → data-grid-overlay-editor-CeWphgdz.js} +1 -1
  23. package/dist/{diagram-S7CK7UJ4-Cyssb9Ln.js → diagram-S7CK7UJ4-lCNQrW7d.js} +1 -1
  24. package/dist/{diagram-UQ7AKVKN-DZYSgUI7.js → diagram-UQ7AKVKN-CQPQ6pP_.js} +1 -1
  25. package/dist/{diagram-VX7I27RA-CGG722Ev.js → diagram-VX7I27RA-Cf3b0llz.js} +1 -1
  26. package/dist/{diagram-Z3DM3KII-BvQr3_De.js → diagram-Z3DM3KII-Bt4QLrpn.js} +1 -1
  27. package/dist/{dialog-CmJuVSh2.js → dialog-CEBFZNyc.js} +3 -3
  28. package/dist/{dropdown-menu-DLNl0uXY.js → dropdown-menu-CP_qCYHC.js} +7 -7
  29. package/dist/{ebnfDiagram-PWID7BFC-DR2FshJT.js → ebnfDiagram-PWID7BFC-D3NAyPFY.js} +2 -2
  30. package/dist/{erDiagram-RLTQ6QDP-xnBvU5f7.js → erDiagram-RLTQ6QDP-Tlu09_Nm.js} +1 -1
  31. package/dist/{error-banner-CSBLWQOS.js → error-banner-Da600cwz.js} +2 -2
  32. package/dist/{error-entries-C7yBRMAV.js → error-entries-uqmpke4z.js} +2 -2
  33. package/dist/{feedback-button-Bp9eebz4.js → feedback-button-4_AuZCdh.js} +10 -10
  34. package/dist/{flowDiagram-HODETNUW-Bfnw9tSj.js → flowDiagram-HODETNUW-CAYbpJmV.js} +2 -2
  35. package/dist/{formats-CJxJy0A5.js → formats-DLtvJPnj.js} +3 -3
  36. package/dist/{glide-data-editor-B3gyOR9J.js → glide-data-editor-DfjSoz7Q.js} +11 -11
  37. package/dist/{glide-utils-BNg2jWFu.js → glide-utils-DJyqh0EM.js} +3 -3
  38. package/dist/{globals-D-vVdFQv.js → globals-1QqNuGFw.js} +3 -3
  39. package/dist/{html-to-image-DJECYxR4.js → html-to-image-utL-jAuh.js} +11 -11
  40. package/dist/{infoDiagram-27XIBGKW-BAYcNcaV.js → infoDiagram-27XIBGKW-XrDxhr0x.js} +1 -1
  41. package/dist/{ishikawaDiagram-5VMMS53U-DXStWIha.js → ishikawaDiagram-5VMMS53U-CD1muzov.js} +1 -1
  42. package/dist/{kanban-definition-UXKFOSKX-DbdJswTE.js → kanban-definition-UXKFOSKX-Dg9W142_.js} +1 -1
  43. package/dist/{label-csksCK90.js → label-BDKF3Afc.js} +2 -2
  44. package/dist/{loader-BBZo0c48.js → loader-BQOfjTIJ.js} +1 -1
  45. package/dist/main.js +32 -32
  46. package/dist/{mermaid-C2NJdX2u.js → mermaid-CiAXjLpA.js} +36 -36
  47. package/dist/{mindmap-definition-YA3MSWOX-BQ8i-blD.js → mindmap-definition-YA3MSWOX-DgCidgYJ.js} +1 -1
  48. package/dist/{number-overlay-editor-D20HUk2N.js → number-overlay-editor-C02SrcZc.js} +1 -1
  49. package/dist/{pegDiagram-XKGWAZYB-DUcNNAN-.js → pegDiagram-XKGWAZYB-coOYYKB6.js} +2 -2
  50. package/dist/{pieDiagram-E7YTZNPT-CSFNZSft.js → pieDiagram-E7YTZNPT-BnXTc3bj.js} +1 -1
  51. package/dist/{process-output-Donyae-q.js → process-output-tkY7JSAu.js} +4 -4
  52. package/dist/{railroadDiagram-O6MQD6OU-DIKoeErt.js → railroadDiagram-O6MQD6OU-B28-u83n.js} +2 -2
  53. package/dist/{requirementDiagram-BXWQKSXE-DbJ4dnDA.js → requirementDiagram-BXWQKSXE-CdYCTMu0.js} +1 -1
  54. package/dist/{reveal-component-4KH8dyFk.js → reveal-component-BwWtao-Q.js} +10 -10
  55. package/dist/{select-eLd7a6qs.js → select-BButFi-d.js} +4 -4
  56. package/dist/{sequenceDiagram-WJ2MYXX4-DrFl3KeD.js → sequenceDiagram-WJ2MYXX4-CM3aRAe_.js} +1 -1
  57. package/dist/{spec-DkOU7lfi.js → spec-BwarBpUJ.js} +4 -4
  58. package/dist/{stateDiagram-D77RDMKH-CW5dERQ1.js → stateDiagram-D77RDMKH-DOZUMVj8.js} +2 -2
  59. package/dist/{stateDiagram-v2-MP3YSRHH-B1BR_34Z.js → stateDiagram-v2-MP3YSRHH-CISYxma6.js} +2 -2
  60. package/dist/{swimlanes-42K2YHIH-CXasdezK.js → swimlanes-42K2YHIH-BkSppxp8.js} +1 -1
  61. package/dist/{swimlanesDiagram-VR7AAH4N-WuS8E4Md.js → swimlanesDiagram-VR7AAH4N-c8G5pGxC.js} +2 -2
  62. package/dist/{swiper-component-Bzo0y0WO.js → swiper-component-DKntyn8p.js} +2 -2
  63. package/dist/{timeline-definition-24CTP7MA-MS0jeNYt.js → timeline-definition-24CTP7MA-CaMQayqK.js} +1 -1
  64. package/dist/{toDate-CaG7azFp.js → toDate-Dwcg_x_5.js} +3 -3
  65. package/dist/{toast-DEQUzOQE.js → toast-B9UMEi8u.js} +4 -4
  66. package/dist/{tooltip-Dbmm909v.js → tooltip-BO1REbqs.js} +2 -2
  67. package/dist/{use-restore-focus-B7_UeKnI.js → use-restore-focus-BEM7sFWl.js} +1 -1
  68. package/dist/{useAsyncData-B2hCigr0.js → useAsyncData-Deh5kszT.js} +1 -1
  69. package/dist/{useDateFormatter-DtgICMM1.js → useDateFormatter-D8XruNGG.js} +2 -2
  70. package/dist/{useDeepCompareMemoize-NxOUy83E.js → useDeepCompareMemoize-DXwzRINI.js} +1 -1
  71. package/dist/{useIframeCapabilities-DIRs8689.js → useIframeCapabilities-DBETvvPl.js} +1 -1
  72. package/dist/{useLifecycle-NfWtOhUr.js → useLifecycle-j7D9uD1o.js} +3 -3
  73. package/dist/{useTheme-DdoJP40B.js → useTheme-CRnjkku0.js} +2 -2
  74. package/dist/{vega-component-lajX4E5T.js → vega-component-DLBAQLSf.js} +9 -9
  75. package/dist/{vennDiagram-4TSXK5OY-BjY3_fWF.js → vennDiagram-4TSXK5OY-CF8pfaK3.js} +1 -1
  76. package/dist/{wardleyDiagram-VM6X3IG4-CmNH2_Vg.js → wardleyDiagram-VM6X3IG4-dGPu39d-.js} +1 -1
  77. package/dist/{xychartDiagram-S5SC5T6Z-frIXgxSb.js → xychartDiagram-S5SC5T6Z-CP6-9q56.js} +1 -1
  78. package/package.json +1 -1
  79. package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +138 -26
  80. package/src/core/codemirror/language/embedded/embedded-python.ts +47 -13
  81. package/src/core/codemirror/language/embedded/latex.ts +20 -13
  82. package/src/hooks/__tests__/useEventListener.test.tsx +45 -1
  83. package/src/hooks/useEventListener.ts +6 -1
@@ -12,11 +12,11 @@ import "./chunk-4HAMMTFA-D4eFPyFh.js";
12
12
  import "./chunk-GVQU2GXP-Cwbt-lF0.js";
13
13
  import "./chunk-L3NEJ4N5-n-zgIVSy.js";
14
14
  import "./chunk-OSK3NFVY-DXa-Cxbn.js";
15
- import "./mermaid-C2NJdX2u.js";
15
+ import "./mermaid-CiAXjLpA.js";
16
16
  import "./chunk-F27PBJKO-ufseIn5y.js";
17
17
  import "./chunk-XXDRQBXY-Dnl5VBqG.js";
18
18
  import "./chunk-POPQ4Y6H-hYOXbYH_.js";
19
- import { i as f, n as p, t as m } from "./chunk-IMKFNOWR-Dk2PgCm2.js";
19
+ import { i as f, n as p, t as m } from "./chunk-IMKFNOWR-CoIFEo-1.js";
20
20
  //#region ../node_modules/.pnpm/mermaid@11.17.2/node_modules/mermaid/dist/chunks/mermaid.core/stateDiagram-D77RDMKH.mjs
21
21
  var h = /* @__PURE__ */ s((e) => e.append("circle").attr("class", "start-state").attr("r", d().state.sizeUnit).attr("cx", d().state.padding + d().state.sizeUnit).attr("cy", d().state.padding + d().state.sizeUnit), "drawStartState"), g = /* @__PURE__ */ s((e) => e.append("line").style("stroke", "grey").style("stroke-dasharray", "3").attr("x1", d().state.textHeight).attr("class", "divider").attr("x2", d().state.textHeight * 2).attr("y1", 0).attr("y2", 0), "drawDivider"), _ = /* @__PURE__ */ s((e, t) => {
22
22
  let n = e.append("text").attr("x", 2 * d().state.padding).attr("y", d().state.textHeight + 2 * d().state.padding).attr("font-size", d().state.fontSize).attr("class", "state-title").text(t.id), r = n.node().getBBox();
@@ -9,11 +9,11 @@ import "./chunk-4HAMMTFA-D4eFPyFh.js";
9
9
  import "./chunk-GVQU2GXP-Cwbt-lF0.js";
10
10
  import "./chunk-L3NEJ4N5-n-zgIVSy.js";
11
11
  import "./chunk-OSK3NFVY-DXa-Cxbn.js";
12
- import "./mermaid-C2NJdX2u.js";
12
+ import "./mermaid-CiAXjLpA.js";
13
13
  import "./chunk-F27PBJKO-ufseIn5y.js";
14
14
  import "./chunk-XXDRQBXY-Dnl5VBqG.js";
15
15
  import "./chunk-POPQ4Y6H-hYOXbYH_.js";
16
- import { i as t, n, r, t as i } from "./chunk-IMKFNOWR-Dk2PgCm2.js";
16
+ import { i as t, n, r, t as i } from "./chunk-IMKFNOWR-CoIFEo-1.js";
17
17
  //#region ../node_modules/.pnpm/mermaid@11.17.2/node_modules/mermaid/dist/chunks/mermaid.core/stateDiagram-v2-MP3YSRHH.mjs
18
18
  var a = {
19
19
  parser: n,
@@ -9,7 +9,7 @@ import "./chunk-4HAMMTFA-D4eFPyFh.js";
9
9
  import "./chunk-GVQU2GXP-Cwbt-lF0.js";
10
10
  import "./chunk-L3NEJ4N5-n-zgIVSy.js";
11
11
  import { o as n } from "./chunk-OSK3NFVY-DXa-Cxbn.js";
12
- import { c as r } from "./mermaid-C2NJdX2u.js";
12
+ import { c as r } from "./mermaid-CiAXjLpA.js";
13
13
  //#region ../node_modules/.pnpm/mermaid@11.17.2/node_modules/mermaid/dist/chunks/mermaid.core/swimlanes-42K2YHIH.mjs
14
14
  var i = 5, a = 1e-5, o = 1e-6;
15
15
  function s(e) {
@@ -9,11 +9,11 @@ import "./chunk-4HAMMTFA-D4eFPyFh.js";
9
9
  import "./chunk-GVQU2GXP-Cwbt-lF0.js";
10
10
  import "./chunk-L3NEJ4N5-n-zgIVSy.js";
11
11
  import "./chunk-OSK3NFVY-DXa-Cxbn.js";
12
- import "./mermaid-C2NJdX2u.js";
12
+ import "./mermaid-CiAXjLpA.js";
13
13
  import "./chunk-F27PBJKO-ufseIn5y.js";
14
14
  import "./chunk-XXDRQBXY-Dnl5VBqG.js";
15
15
  import "./chunk-POPQ4Y6H-hYOXbYH_.js";
16
- import { r as t, t as n } from "./chunk-SHT3W25Y-BGY-9vHH.js";
16
+ import { r as t, t as n } from "./chunk-SHT3W25Y-lHiGx3ZC.js";
17
17
  //#region ../node_modules/.pnpm/mermaid@11.17.2/node_modules/mermaid/dist/chunks/mermaid.core/swimlanesDiagram-VR7AAH4N.mjs
18
18
  var r = n({
19
19
  defaultLayout: "swimlane",
@@ -1,9 +1,9 @@
1
1
  import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
- import { c as t, h as n, t as r } from "./button-e0G6suEi.js";
2
+ import { c as t, h as n, t as r } from "./button-CvjkwdSk.js";
3
3
  import { t as i } from "./react-sHtZdjeP.js";
4
4
  import { t as a } from "./compiler-runtime-CldRdSsv.js";
5
5
  import { t as o } from "./jsx-runtime-3BD1kT0s.js";
6
- import { t as s } from "./useIframeCapabilities-DIRs8689.js";
6
+ import { t as s } from "./useIframeCapabilities-DBETvvPl.js";
7
7
  /* empty css */
8
8
  //#region ../node_modules/.pnpm/swiper@12.2.0/node_modules/swiper/shared/ssr-window.esm.mjs
9
9
  var c = /* @__PURE__ */ e(i(), 1), l = a();
@@ -3,7 +3,7 @@ import { p as t } from "./chunk-75Z2AOVW-D7gxIs2Q.js";
3
3
  import { n, t as r } from "./src-CA_m4ONl.js";
4
4
  import { n as i, t as a } from "./chunk-Y2CYZVJY-DKKS1VyV.js";
5
5
  import { $ as o, J as s, a as c, b as l, et as u, nt as d, o as f, x as p } from "./chunk-DU6HZSFF-BwiyaNpg.js";
6
- import { p as m } from "./mermaid-C2NJdX2u.js";
6
+ import { p as m } from "./mermaid-CiAXjLpA.js";
7
7
  //#region ../node_modules/.pnpm/mermaid@11.17.2/node_modules/mermaid/dist/chunks/mermaid.core/timeline-definition-24CTP7MA.mjs
8
8
  var h = (function() {
9
9
  var e = /* @__PURE__ */ i(function(e, t, n, r) {
@@ -1,8 +1,8 @@
1
1
  import { t as e } from "./rolldown-runtime-Cb76FRpK.js";
2
- import { g as t } from "./button-e0G6suEi.js";
2
+ import { g as t } from "./button-CvjkwdSk.js";
3
3
  import { t as n } from "./compiler-runtime-CldRdSsv.js";
4
- import { h as r } from "./tooltip-Dbmm909v.js";
5
- import { C as i, E as a, _ as o, a as s, b as c } from "./useTheme-DdoJP40B.js";
4
+ import { h as r } from "./tooltip-BO1REbqs.js";
5
+ import { C as i, E as a, _ as o, a as s, b as c } from "./useTheme-CRnjkku0.js";
6
6
  import { t as l } from "./invariant-DLmrl-hA.js";
7
7
  var u = r("circle-question-mark", [
8
8
  ["circle", {
@@ -1,12 +1,12 @@
1
1
  import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
- import { h as t, p as n, r } from "./button-e0G6suEi.js";
2
+ import { h as t, p as n, r } from "./button-CvjkwdSk.js";
3
3
  import { t as i } from "./react-sHtZdjeP.js";
4
4
  import { t as a } from "./compiler-runtime-CldRdSsv.js";
5
- import { m as o } from "./tooltip-Dbmm909v.js";
6
- import { A as s, k as c } from "./select-eLd7a6qs.js";
5
+ import { m as o } from "./tooltip-BO1REbqs.js";
6
+ import { A as s, k as c } from "./select-BButFi-d.js";
7
7
  import { t as l } from "./react-dom-DUmH0GXv.js";
8
8
  import { t as u } from "./jsx-runtime-3BD1kT0s.js";
9
- import { Ct as d, St as f, Tt as p, _t as m, bt as h, ft as g, gt as ee, mt as te, wt as _, xt as v, yt as ne } from "./use-restore-focus-B7_UeKnI.js";
9
+ import { Ct as d, St as f, Tt as p, _t as m, bt as h, ft as g, gt as ee, mt as te, wt as _, xt as v, yt as ne } from "./use-restore-focus-BEM7sFWl.js";
10
10
  //#region ../node_modules/.pnpm/@radix-ui+react-toast@1.2.23_@types+react-dom@19.3.0_@types+react@19.3.0__@types+react@_69693a0157877c6dbc61617dd22ea8ee/node_modules/@radix-ui/react-toast/dist/index.mjs
11
11
  var y = /* @__PURE__ */ e(i(), 1), re = /* @__PURE__ */ e(l(), 1), b = u(), x = Object.defineProperty, S = (e, t) => x(e, "name", {
12
12
  value: t,
@@ -1,10 +1,10 @@
1
1
  import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
- import { d as t, h as n, p as r } from "./button-e0G6suEi.js";
2
+ import { d as t, h as n, p as r } from "./button-CvjkwdSk.js";
3
3
  import { t as i } from "./react-sHtZdjeP.js";
4
4
  import { t as a } from "./compiler-runtime-CldRdSsv.js";
5
5
  import { t as o } from "./react-dom-DUmH0GXv.js";
6
6
  import { t as s } from "./jsx-runtime-3BD1kT0s.js";
7
- import { Ct as c, Q as l, St as u, X as d, Y as f, _t as p, bt as m, ft as h, ht as g, vt as _, wt as v, xt as y, yt as b } from "./use-restore-focus-B7_UeKnI.js";
7
+ import { Ct as c, Q as l, St as u, X as d, Y as f, _t as p, bt as m, ft as h, ht as g, vt as _, wt as v, xt as y, yt as b } from "./use-restore-focus-BEM7sFWl.js";
8
8
  //#region ../node_modules/.pnpm/lucide-react@0.577.0_react@19.3.0/node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
9
9
  var x = /* @__PURE__ */ e(i()), S = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), C = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), w = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), T = (e) => {
10
10
  let t = w(e);
@@ -1,5 +1,5 @@
1
1
  import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
- import { c as t, p as n, u as r } from "./button-e0G6suEi.js";
2
+ import { c as t, p as n, u as r } from "./button-CvjkwdSk.js";
3
3
  import { t as i } from "./react-sHtZdjeP.js";
4
4
  import { t as a } from "./compiler-runtime-CldRdSsv.js";
5
5
  import { t as o } from "./react-dom-DUmH0GXv.js";
@@ -1,7 +1,7 @@
1
1
  import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
2
  import { t } from "./react-sHtZdjeP.js";
3
3
  import { t as n } from "./compiler-runtime-CldRdSsv.js";
4
- import { A as r } from "./useTheme-DdoJP40B.js";
4
+ import { A as r } from "./useTheme-CRnjkku0.js";
5
5
  import { t as i } from "./invariant-DLmrl-hA.js";
6
6
  //#region src/hooks/useAsyncData.ts
7
7
  var a = n(), o = /* @__PURE__ */ e(t(), 1), s = {
@@ -1,7 +1,7 @@
1
1
  import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
2
  import { t } from "./react-sHtZdjeP.js";
3
- import { h as n } from "./tooltip-Dbmm909v.js";
4
- import { i as r } from "./label-csksCK90.js";
3
+ import { h as n } from "./tooltip-BO1REbqs.js";
4
+ import { i as r } from "./label-BDKF3Afc.js";
5
5
  var i = n("chart-pie", [["path", {
6
6
  d: "M21 12c.552 0 1.005-.449.95-.998a10 10 0 0 0-8.953-8.951c-.55-.055-.998.398-.998.95v8a1 1 0 0 0 1 1z",
7
7
  key: "pzmjnu"
@@ -1,6 +1,6 @@
1
1
  import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
2
  import { t } from "./react-sHtZdjeP.js";
3
- import { k as n } from "./useTheme-DdoJP40B.js";
3
+ import { k as n } from "./useTheme-CRnjkku0.js";
4
4
  //#region src/hooks/useDeepCompareMemoize.ts
5
5
  var r = /* @__PURE__ */ e(t(), 1);
6
6
  function i(e) {
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./compiler-runtime-CldRdSsv.js";
2
- import { t } from "./capabilities-to826YB8.js";
2
+ import { t } from "./capabilities-CQ5IjhzL.js";
3
3
  //#region src/hooks/useIframeCapabilities.ts
4
4
  var n = e();
5
5
  function r() {
@@ -1,10 +1,10 @@
1
1
  import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
- import { g as t, h as n, r } from "./button-e0G6suEi.js";
2
+ import { g as t, h as n, r } from "./button-CvjkwdSk.js";
3
3
  import { t as i } from "./react-sHtZdjeP.js";
4
4
  import { t as a } from "./compiler-runtime-CldRdSsv.js";
5
- import { h as o } from "./tooltip-Dbmm909v.js";
5
+ import { h as o } from "./tooltip-BO1REbqs.js";
6
6
  import { t as s } from "./jsx-runtime-3BD1kT0s.js";
7
- import { E as c, w as l } from "./useTheme-DdoJP40B.js";
7
+ import { E as c, w as l } from "./useTheme-CRnjkku0.js";
8
8
  var u = o("calendar", [
9
9
  ["path", {
10
10
  d: "M8 2v4",
@@ -1,8 +1,8 @@
1
1
  import { a as e, r as t } from "./rolldown-runtime-Cb76FRpK.js";
2
- import { a as n, g as r, s as i } from "./button-e0G6suEi.js";
2
+ import { a as n, g as r, s as i } from "./button-CvjkwdSk.js";
3
3
  import { t as a } from "./react-sHtZdjeP.js";
4
4
  import { t as o } from "./compiler-runtime-CldRdSsv.js";
5
- import { C as s, F as c, L as l, M as u, O as d, P as f, S as p, j as m, v as h } from "./use-restore-focus-B7_UeKnI.js";
5
+ import { C as s, F as c, L as l, M as u, O as d, P as f, S as p, j as m, v as h } from "./use-restore-focus-BEM7sFWl.js";
6
6
  import { l as g, t as _ } from "./_baseMerge-BiGRwuqv.js";
7
7
  //#region ../node_modules/.pnpm/lodash-es@4.18.1/node_modules/lodash-es/mergeWith.js
8
8
  var v = g(function(e, t, n, r) {
@@ -1,21 +1,21 @@
1
1
  import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
- import { g as t, h as n, m as r, o as i } from "./button-e0G6suEi.js";
2
+ import { g as t, h as n, m as r, o as i } from "./button-CvjkwdSk.js";
3
3
  import { t as a } from "./react-sHtZdjeP.js";
4
4
  import { t as o } from "./compiler-runtime-CldRdSsv.js";
5
- import { t as s } from "./tooltip-Dbmm909v.js";
6
- import { T as c, c as l } from "./toDate-CaG7azFp.js";
5
+ import { t as s } from "./tooltip-BO1REbqs.js";
6
+ import { T as c, c as l } from "./toDate-Dwcg_x_5.js";
7
7
  import { t as u } from "./jsx-runtime-3BD1kT0s.js";
8
- import { n as d } from "./error-banner-CSBLWQOS.js";
8
+ import { n as d } from "./error-banner-Da600cwz.js";
9
9
  import { t as f } from "./debounce-C3jyATpc.js";
10
- import { A as p, n as ee } from "./useTheme-DdoJP40B.js";
10
+ import { A as p, n as ee } from "./useTheme-CRnjkku0.js";
11
11
  import { c as m } from "./arrays-CN1djC4k.js";
12
12
  import { t as te } from "./objects-CzUgoMIF.js";
13
- import { t as h } from "./useAsyncData-B2hCigr0.js";
14
- import { a as ne, i as re, n as ie, t as g } from "./formats-CJxJy0A5.js";
13
+ import { t as h } from "./useAsyncData-Deh5kszT.js";
14
+ import { a as ne, i as re, n as ie, t as g } from "./formats-DLtvJPnj.js";
15
15
  import { M as ae, n as oe } from "./vega-loader.browser-DNST6uVf.js";
16
16
  import { t as se } from "./react-vega-BED0DjiB.js";
17
- import { a as ce, n as _ } from "./loader-BBZo0c48.js";
18
- import { t as le } from "./useDeepCompareMemoize-NxOUy83E.js";
17
+ import { a as ce, n as _ } from "./loader-BQOfjTIJ.js";
18
+ import { t as le } from "./useDeepCompareMemoize-DXwzRINI.js";
19
19
  import { t as ue } from "./semaphore-89jsoHtS.js";
20
20
  import { t as de } from "./use-vega-container-remeasure-Bz4PZMtt.js";
21
21
  //#region src/plugins/impl/vega/fix-relative-url.ts
@@ -3,7 +3,7 @@ import { t } from "./src-CA_m4ONl.js";
3
3
  import { n } from "./chunk-Y2CYZVJY-DKKS1VyV.js";
4
4
  import { $ as r, H as i, K as a, U as o, a as s, b as c, c as l, et as u, f as d, nt as f, tt as p, v as m, w as h, y as g } from "./chunk-DU6HZSFF-BwiyaNpg.js";
5
5
  import { t as _ } from "./rough.esm-CtV9AnV1.js";
6
- import { p as v } from "./mermaid-C2NJdX2u.js";
6
+ import { p as v } from "./mermaid-CiAXjLpA.js";
7
7
  //#region ../node_modules/.pnpm/khroma@2.1.0/node_modules/khroma/dist/methods/transparentize.js
8
8
  var y = (e, t) => p(e, "a", -t), b = 1e-10;
9
9
  function x(e, t) {
@@ -2,7 +2,7 @@ import { i as e } from "./chunk-75Z2AOVW-D7gxIs2Q.js";
2
2
  import { n as t } from "./src-CA_m4ONl.js";
3
3
  import { n } from "./chunk-Y2CYZVJY-DKKS1VyV.js";
4
4
  import { D as r, H as i, K as a, U as o, a as s, b as c, c as l, v as u, w as d, x as f, y as p } from "./chunk-DU6HZSFF-BwiyaNpg.js";
5
- import { p as m } from "./mermaid-C2NJdX2u.js";
5
+ import { p as m } from "./mermaid-CiAXjLpA.js";
6
6
  import { n as h } from "./mermaid-parser.core-DxuSfYwJ.js";
7
7
  import { t as g } from "./chunk-JWPE2WC7-DJvv1t8U.js";
8
8
  //#region ../node_modules/.pnpm/mermaid@11.17.2/node_modules/mermaid/dist/chunks/mermaid.core/wardleyDiagram-VM6X3IG4.mjs
@@ -9,7 +9,7 @@ import { n as s } from "./chunk-Y2CYZVJY-DKKS1VyV.js";
9
9
  import { D as c, H as l, K as u, U as d, a as f, b as p, c as m, f as h, v as g, w as _, y as v, z as y } from "./chunk-DU6HZSFF-BwiyaNpg.js";
10
10
  import "./chunk-PWAF6VOD-CQw5qATZ.js";
11
11
  import { t as b } from "./chunk-GMAD6QVW-BhaJx0X3.js";
12
- import { p as x } from "./mermaid-C2NJdX2u.js";
12
+ import { p as x } from "./mermaid-CiAXjLpA.js";
13
13
  //#region ../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/band.js
14
14
  function S() {
15
15
  var e = t().unknown(void 0), r = e.domain, i = e.range, o = 0, s = 1, c, l, u = !1, d = 0, f = 0, p = .5;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marimo-team/islands",
3
- "version": "0.25.2-dev105",
3
+ "version": "0.25.2-dev107",
4
4
  "main": "dist/main.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -2,13 +2,17 @@
2
2
 
3
3
  import type { CompletionContext } from "@codemirror/autocomplete";
4
4
  import { python } from "@codemirror/lang-python";
5
+ import { StreamLanguage } from "@codemirror/language";
6
+ import { stexMath } from "@codemirror/legacy-modes/mode/stex";
5
7
  import { EditorState } from "@codemirror/state";
6
- import type { InlineContext } from "@lezer/markdown";
7
- import { beforeEach, describe, expect, it } from "vitest";
8
+ import { classHighlighter, highlightTree } from "@lezer/highlight";
9
+ import { parser as markdownParser } from "@lezer/markdown";
10
+ import { beforeEach, describe, expect, it, vi } from "vitest";
8
11
  import { cellId, variableName } from "@/__tests__/branded";
9
12
  import { store } from "@/core/state/jotai";
10
13
  import { variablesAtom } from "@/core/variables/state";
11
14
  import { parsePython, variableCompletionSource } from "../embedded-python";
15
+ import { parseLatex } from "../latex";
12
16
 
13
17
  const IS_ACTIVE = () => true;
14
18
 
@@ -23,25 +27,133 @@ describe("parsePython", () => {
23
27
  ]);
24
28
  });
25
29
 
26
- it("should not parse double curly braces", () => {
30
+ const cases = [
31
+ "{math.exp(3)}",
32
+ '${math.exp(3) + len("$}")} $',
33
+ "${math.exp(3)} + {math.sin(3)}$",
34
+ "${math.exp(3)}$",
35
+ "$$ {math.exp(3)} $$",
36
+ String.raw`\({math.exp(3)}\)`,
37
+ String.raw`\[{math.exp(3)}\]`,
38
+ String.raw`\\({math.exp(3)}\\)`,
39
+ String.raw`\\[{math.exp(3)}\\]`,
40
+ String.raw`$\frac{{{math.exp(3)}}}{{2}}$`,
41
+ String.raw`$\{math.exp(3)}$`,
42
+ '${ {"}": math.exp(3)} }$',
43
+ "${math.exp(3):{width}.{precision}f}$",
44
+ ];
45
+
46
+ function highlightedProperties(doc: string, prefix: string) {
47
+ const parser = markdownParser.configure([
48
+ parseLatex(StreamLanguage.define(stexMath).parser),
49
+ parsePython(python().language.parser, () => prefix.includes("f")),
50
+ ]);
51
+ const properties: string[] = [];
52
+ highlightTree(parser.parse(doc), classHighlighter, (from, to, classes) => {
53
+ if (classes.split(" ").includes("tok-propertyName")) {
54
+ properties.push(doc.slice(from, to));
55
+ }
56
+ });
57
+ return properties;
58
+ }
59
+
60
+ it.each(["f", "rf", "fr"])(
61
+ "highlights interpolation with %s strings",
62
+ (prefix) => {
63
+ for (const doc of cases) {
64
+ expect(highlightedProperties(doc, prefix)).toEqual(
65
+ doc.includes("math.sin") ? ["exp", "sin"] : ["exp"],
66
+ );
67
+ }
68
+ },
69
+ );
70
+
71
+ it.each(["", "r"])("does not interpolate %s strings", (prefix) => {
72
+ for (const doc of cases) {
73
+ expect(highlightedProperties(doc, prefix)).toEqual([]);
74
+ }
75
+ });
76
+
77
+ it("parses replacement boundaries once for a paragraph with many interpolations", () => {
27
78
  const pythonParser = python().language.parser;
28
- const config = parsePython(pythonParser, IS_ACTIVE);
79
+ const parse = vi.spyOn(pythonParser, "parse");
80
+ try {
81
+ const doc = "{math.exp(3)} ".repeat(1000);
82
+ const parser = markdownParser.configure([
83
+ parseLatex(StreamLanguage.define(stexMath).parser),
84
+ parsePython(pythonParser, IS_ACTIVE),
85
+ ]);
86
+ const properties: string[] = [];
87
+ highlightTree(
88
+ parser.parse(doc),
89
+ classHighlighter,
90
+ (from, to, classes) => {
91
+ if (classes.split(" ").includes("tok-propertyName")) {
92
+ properties.push(doc.slice(from, to));
93
+ }
94
+ },
95
+ );
96
+ expect(properties).toEqual(Array.from({ length: 1000 }, () => "exp"));
97
+ expect(parse).toHaveBeenCalledTimes(1);
98
+ } finally {
99
+ parse.mockRestore();
100
+ }
101
+ });
29
102
 
30
- // Create a mock context
31
- const mockContext = {
32
- slice: (from: number, to: number) => {
33
- if (from === 5 && to === 6) {
34
- return "{";
35
- }
36
- return "";
37
- },
38
- addDelimiter: () => -1,
39
- } as unknown as InlineContext;
103
+ it("preserves raw backslashes between replacements", () => {
104
+ expect(
105
+ highlightedProperties(String.raw`{math.exp(3)} \N{math.sin(3)}`, "rf"),
106
+ ).toEqual(["exp", "sin"]);
107
+ });
108
+
109
+ it("finds replacements after triple quotes in markdown text", () => {
110
+ expect(
111
+ highlightedProperties('{math.exp(3)} """ {math.sin(3)}', "f"),
112
+ ).toEqual(["exp", "sin"]);
113
+ });
40
114
 
41
- // Test with double curly braces
42
- const result = config.parseInline![0].parse(mockContext, 123, 6); // 123 is OPEN_BRACE
43
- expect(result).toBe(-1);
115
+ it("keeps replacement positions local to each paragraph", () => {
116
+ expect(
117
+ highlightedProperties("${math.exp(3)}$\n\n${math.sin(3)}$", "rf"),
118
+ ).toEqual(["exp", "sin"]);
44
119
  });
120
+
121
+ it("preserves LaTeX highlighting around Python replacements", () => {
122
+ const doc = String.raw`$\frac{{{math.exp(3)}}}{{2}} + \alpha$`;
123
+ const parser = markdownParser.configure([
124
+ parseLatex(StreamLanguage.define(stexMath).parser),
125
+ parsePython(python().language.parser, IS_ACTIVE),
126
+ ]);
127
+ const highlighted: string[] = [];
128
+ highlightTree(parser.parse(doc), classHighlighter, (from, to) => {
129
+ highlighted.push(doc.slice(from, to));
130
+ });
131
+ expect(highlighted).toEqual(
132
+ expect.arrayContaining(["\\frac", "exp", "\\alpha"]),
133
+ );
134
+ });
135
+
136
+ it.each(["${math.exp(3)$", "${math.exp(3)", "${{math.exp(3)}$"])(
137
+ "does not treat incomplete or escaped braces as replacements: %s",
138
+ (doc) => {
139
+ expect(highlightedProperties(doc, "f")).toEqual([]);
140
+ },
141
+ );
142
+
143
+ it.each(["f", "rf", "fr"])(
144
+ "keeps doubled braces literal in %s strings",
145
+ (prefix) => {
146
+ for (const doc of [
147
+ "{{math.exp(3)}}",
148
+ "${{math.exp(3)}}$",
149
+ "$ {{{{math.exp(3)}}}} $",
150
+ String.raw`$\{{math.exp(3)}}$`,
151
+ String.raw`$\frac{{1}}{{2}}$`,
152
+ ]) {
153
+ expect(highlightedProperties(doc, prefix)).toEqual([]);
154
+ }
155
+ },
156
+ );
45
157
  });
46
158
 
47
159
  describe("variableCompletionSource", () => {
@@ -72,10 +184,10 @@ describe("variableCompletionSource", () => {
72
184
  const context: Partial<CompletionContext> = {
73
185
  pos: 8,
74
186
  explicit: false,
75
- matchBefore: (expr: RegExp) => ({ from: 7, to: 8, text: "v" }),
187
+ matchBefore: (_expr: RegExp) => ({ from: 7, to: 8, text: "v" }),
76
188
  state,
77
189
  aborted: false,
78
- tokenBefore: (types: readonly string[]) => null,
190
+ tokenBefore: (_types: readonly string[]) => null,
79
191
  };
80
192
 
81
193
  const result = variableCompletionSource(context as CompletionContext);
@@ -92,10 +204,10 @@ describe("variableCompletionSource", () => {
92
204
  const context: Partial<CompletionContext> = {
93
205
  pos: 7,
94
206
  explicit: false,
95
- matchBefore: (expr: RegExp) => ({ from: 6, to: 7, text: "v" }),
207
+ matchBefore: (_expr: RegExp) => ({ from: 6, to: 7, text: "v" }),
96
208
  state,
97
209
  aborted: false,
98
- tokenBefore: (types: readonly string[]) => null,
210
+ tokenBefore: (_types: readonly string[]) => null,
99
211
  };
100
212
 
101
213
  const result = variableCompletionSource(context as CompletionContext);
@@ -110,10 +222,10 @@ describe("variableCompletionSource", () => {
110
222
  const context: Partial<CompletionContext> = {
111
223
  pos: 13,
112
224
  explicit: false,
113
- matchBefore: (expr: RegExp) => ({ from: 12, to: 13, text: "v" }),
225
+ matchBefore: (_expr: RegExp) => ({ from: 12, to: 13, text: "v" }),
114
226
  state,
115
227
  aborted: false,
116
- tokenBefore: (types: readonly string[]) => null,
228
+ tokenBefore: (_types: readonly string[]) => null,
117
229
  };
118
230
 
119
231
  const result = variableCompletionSource(context as CompletionContext);
@@ -131,7 +243,7 @@ describe("variableCompletionSource", () => {
131
243
  matchBefore: () => null,
132
244
  state,
133
245
  aborted: false,
134
- tokenBefore: (types: readonly string[]) => null,
246
+ tokenBefore: (_types: readonly string[]) => null,
135
247
  };
136
248
 
137
249
  const result = variableCompletionSource(context as CompletionContext);
@@ -146,10 +258,10 @@ describe("variableCompletionSource", () => {
146
258
  const context: Partial<CompletionContext> = {
147
259
  pos: 9,
148
260
  explicit: false,
149
- matchBefore: (expr: RegExp) => ({ from: 8, to: 9, text: "v" }),
261
+ matchBefore: (_expr: RegExp) => ({ from: 8, to: 9, text: "v" }),
150
262
  state,
151
263
  aborted: false,
152
- tokenBefore: (types: readonly string[]) => null,
264
+ tokenBefore: (_types: readonly string[]) => null,
153
265
  };
154
266
 
155
267
  const result = variableCompletionSource(context as CompletionContext);
@@ -16,11 +16,8 @@ import { getVariableCompletions } from "../../completion/variable-completions";
16
16
  const PYTHON = "Python";
17
17
 
18
18
  const OPEN_BRACE = 123; // {
19
- const CLOSE_BRACE = 125; // }
20
19
  const DELIMITER_LENGTH = 1;
21
20
 
22
- const MARK = { mark: `${PYTHON}Mark`, resolve: PYTHON };
23
-
24
21
  /**
25
22
  * Define a Python code block parser for Markdown.
26
23
  *
@@ -31,6 +28,11 @@ export function parsePython(
31
28
  pythonParser: Parser,
32
29
  isActivated: () => boolean,
33
30
  ): MarkdownConfig {
31
+ const replacements = new WeakMap<
32
+ InlineContext,
33
+ { ends: Map<number, number>; parsedTo: number }
34
+ >();
35
+
34
36
  const defineNodes = [
35
37
  { name: PYTHON, style: tags.emphasis },
36
38
  { name: `${PYTHON}Mark`, style: tags.processingInstruction },
@@ -41,26 +43,58 @@ export function parsePython(
41
43
  parseInline: [
42
44
  {
43
45
  name: PYTHON,
46
+ before: "Escape",
44
47
  parse(cx: InlineContext, next: number, pos: number): number {
45
48
  if (!isActivated()) {
46
49
  return -1;
47
50
  }
48
51
 
49
- if (next !== OPEN_BRACE && next !== CLOSE_BRACE) {
52
+ // A backslash does not escape a brace in Python f-strings.
53
+ if (next === 92 && cx.char(pos + 1) === OPEN_BRACE) {
54
+ return pos + 1;
55
+ }
56
+ if (next !== OPEN_BRACE) {
50
57
  return -1;
51
58
  }
59
+ if (cx.char(pos + 1) === OPEN_BRACE) {
60
+ return pos + 2;
61
+ }
52
62
 
53
- // Check for double curly braces
54
- if (next === OPEN_BRACE && cx.slice(pos - 1, pos) === "{") {
63
+ let cached = replacements.get(cx);
64
+ if (!cached || pos >= cached.parsedTo) {
65
+ // Cache all replacements so each brace does not reparse the paragraph.
66
+ // Keep Markdown backslashes from consuming braces as Python escapes.
67
+ const prefix = 'rf"""';
68
+ const tree = pythonParser.parse(
69
+ `${prefix}${cx.slice(pos, cx.end)}\n"""`,
70
+ );
71
+ const formatString = tree.topNode
72
+ .getChild("ExpressionStatement")
73
+ ?.getChild("FormatString");
74
+ const offset = pos - prefix.length;
75
+ const ends = new Map<number, number>();
76
+ for (const replacement of formatString?.getChildren(
77
+ "FormatReplacement",
78
+ ) ?? []) {
79
+ if (replacement.lastChild?.name === "}") {
80
+ ends.set(offset + replacement.from, offset + replacement.to);
81
+ }
82
+ }
83
+ cached = {
84
+ ends,
85
+ parsedTo: formatString ? offset + formatString.to : cx.end,
86
+ };
87
+ replacements.set(cx, cached);
88
+ }
89
+ const end = cached.ends.get(pos);
90
+ if (end === undefined) {
55
91
  return -1;
56
92
  }
57
-
58
- return cx.addDelimiter(
59
- MARK,
60
- pos,
61
- pos + DELIMITER_LENGTH,
62
- next === OPEN_BRACE,
63
- next === CLOSE_BRACE,
93
+ return cx.addElement(
94
+ cx.elt(PYTHON, pos, end, [
95
+ cx.elt(`${PYTHON}Mark`, pos, pos + 1),
96
+ cx.elt(`${PYTHON}Mark`, end - 1, end),
97
+ ]),
64
98
  );
65
99
  },
66
100
  },