@marimo-team/frontend 0.23.6-dev2 → 0.23.6-dev21

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 (97) hide show
  1. package/dist/assets/{CellStatus-DKMrz26-.js → CellStatus-eBz5dnxe.js} +1 -1
  2. package/dist/assets/{ConnectedDataExplorerComponent-DNoHDaQW.js → ConnectedDataExplorerComponent-k8s9vETJ.js} +1 -1
  3. package/dist/assets/{JsonOutput-02ehjjSC.js → JsonOutput-DCI5rUbO.js} +1 -1
  4. package/dist/assets/{MarimoErrorOutput-Dbk0HqOA.js → MarimoErrorOutput-BBRTedcZ.js} +1 -1
  5. package/dist/assets/RenderHTML-CL9ay8Ii.js +1 -0
  6. package/dist/assets/{RunButton-DHxYW_jZ.js → RunButton-BH6H93bY.js} +1 -1
  7. package/dist/assets/{add-cell-with-ai-DfniMbLM.js → add-cell-with-ai-BHu0yrkE.js} +1 -1
  8. package/dist/assets/{add-connection-dialog-8ChtH4mo.js → add-connection-dialog-BW9DyfLG.js} +1 -1
  9. package/dist/assets/{agent-panel-jsnbrvBR.js → agent-panel-08nZa_6H.js} +1 -1
  10. package/dist/assets/ai-model-dropdown-2xg-utp6.js +5 -0
  11. package/dist/assets/{app-config-button-c_2rVezv.js → app-config-button-CLx-Gg0p.js} +1 -1
  12. package/dist/assets/{cell-editor-WSoKgacR.js → cell-editor-yeOwpn5w.js} +1 -1
  13. package/dist/assets/{cell-link-BRdZl0OJ.js → cell-link-BMyYJsGH.js} +1 -1
  14. package/dist/assets/{cells-CcBfzJ1Z.js → cells-BPSZbR83.js} +47 -47
  15. package/dist/assets/{chat-display-NiFkPnNN.js → chat-display-BVtlWWyB.js} +1 -1
  16. package/dist/assets/{chat-panel-C6V6gxrr.js → chat-panel-CrPpgbFk.js} +1 -1
  17. package/dist/assets/{chat-ui-BLiRBYhk.js → chat-ui-BdBE-cwt.js} +1 -1
  18. package/dist/assets/{column-preview-rDM8Q-wn.js → column-preview-BOUfJkSp.js} +1 -1
  19. package/dist/assets/{command-palette-CUYBVGPU.js → command-palette-Bol4aUlE.js} +1 -1
  20. package/dist/assets/{common-CHmdPmWi.js → common-CUslB949.js} +1 -1
  21. package/dist/assets/{components-HCInimq-.js → components-CVmnuvKA.js} +1 -1
  22. package/dist/assets/{components-DVKf_7RU.js → components-DPRoMb_X.js} +1 -1
  23. package/dist/assets/{config-DczIUz0b.js → config-NNGlrvbj.js} +1 -1
  24. package/dist/assets/{datasource-Czm_KBfK.js → datasource-DDj2B7Ss.js} +1 -1
  25. package/dist/assets/{dependency-graph-panel-DPKylrlr.js → dependency-graph-panel-sz_gQlcU.js} +1 -1
  26. package/dist/assets/{documentation-panel-DZkIKuPv.js → documentation-panel-B3FIOHGO.js} +1 -1
  27. package/dist/assets/{download-YUQiaxS9.js → download-B97Ad3KO.js} +1 -1
  28. package/dist/assets/{edit-page-BiwFohnL.js → edit-page-DP83zVb6.js} +3 -3
  29. package/dist/assets/{error-panel-C4UQHEjp.js → error-panel-DVmhotHi.js} +1 -1
  30. package/dist/assets/{file-explorer-panel-DEJtGGUp.js → file-explorer-panel-Dk5m8SbX.js} +1 -1
  31. package/dist/assets/{file-icons-CMxkj_kV.js → file-icons-B3v9xKEQ.js} +1 -1
  32. package/dist/assets/{floating-outline-BtNnv2IX.js → floating-outline-CEDD_IFg.js} +1 -1
  33. package/dist/assets/{focus-CXQpR65O.js → focus-BYFe-tpE.js} +1 -1
  34. package/dist/assets/{form-EgPmt17c.js → form-CrtrbmNl.js} +1 -1
  35. package/dist/assets/{glide-data-editor-CxV4Ph39.js → glide-data-editor-DqqLCmqF.js} +1 -1
  36. package/dist/assets/{globals-B-ZMi0ZU.js → globals-CZHmfW40.js} +1 -1
  37. package/dist/assets/{home-page-CaIONOO0.js → home-page-DFAczvKN.js} +1 -1
  38. package/dist/assets/{hooks-CZcajTLZ.js → hooks-BBmZdZs3.js} +1 -1
  39. package/dist/assets/{html-to-image-BHdf1t5J.js → html-to-image-BFtSv8Pw.js} +1 -1
  40. package/dist/assets/{index-CL4WR8q8.js → index-DuVXA-sG.js} +6 -6
  41. package/dist/assets/{kiosk-mode-vHMq9vr1.js → kiosk-mode-GZCnZFaF.js} +1 -1
  42. package/dist/assets/layout-Csy8Kty8.js +9 -0
  43. package/dist/assets/{logs-panel-DL9WeQsv.js → logs-panel-vIAw1PAv.js} +1 -1
  44. package/dist/assets/{markdown-renderer-DmnGXdCp.js → markdown-renderer-BySoarzx.js} +1 -1
  45. package/dist/assets/{mermaid-CXmjgj4p.js → mermaid-BfdNvRSd.js} +1 -1
  46. package/dist/assets/{name-cell-input-CHuLB3H7.js → name-cell-input-CWgwtXI1.js} +1 -1
  47. package/dist/assets/{outline-panel-JaSUHnmD.js → outline-panel-B5uTq6I8.js} +1 -1
  48. package/dist/assets/{packages-panel-BB5_Iu2c.js → packages-panel-DtGLvb39.js} +1 -1
  49. package/dist/assets/{panels-D4g3bUpO.js → panels-B9MdojaM.js} +1 -1
  50. package/dist/assets/{process-output-hJso9ugZ.js → process-output-C9OGP4VN.js} +1 -1
  51. package/dist/assets/{radio-group-6t7ozlnG.js → radio-group-C-al8pQI.js} +1 -1
  52. package/dist/assets/{readonly-python-code-JBCsN3-9.js → readonly-python-code-Dq6zyequ.js} +1 -1
  53. package/dist/assets/{renderShortcut-DZpkrZaP.js → renderShortcut-Bfk4NjRL.js} +1 -1
  54. package/dist/assets/{reveal-component-BKMB17JT.js → reveal-component-BqTsSmz7.js} +1 -1
  55. package/dist/assets/{run-page-BPM6GfJo.js → run-page-B3OKplhl.js} +1 -1
  56. package/dist/assets/{scratchpad-panel-Cabu2odx.js → scratchpad-panel-BFzS53bO.js} +1 -1
  57. package/dist/assets/{session-panel-BAiIHm0d.js → session-panel-BJN9rWqs.js} +1 -1
  58. package/dist/assets/{snippets-panel-CQKr-OMs.js → snippets-panel-Byv2itpa.js} +1 -1
  59. package/dist/assets/{state-DCT6JLba.js → state-31owe31-.js} +1 -1
  60. package/dist/assets/{state-DGoUR-mM.js → state-Bb2WcLMF.js} +1 -1
  61. package/dist/assets/{switch-ecwOrzz3.js → switch-BRZnhEsx.js} +1 -1
  62. package/dist/assets/{terminal-CQZ69wrS.js → terminal-CTa0CRvJ.js} +1 -1
  63. package/dist/assets/{textarea-BI_mXP9w.js → textarea-DvLP5rPe.js} +1 -1
  64. package/dist/assets/{tracing-BF-ca60a.js → tracing-JGGF8495.js} +1 -1
  65. package/dist/assets/{tracing-panel-D1j7Fbvr.js → tracing-panel-DgYxM6Ao.js} +2 -2
  66. package/dist/assets/{useBoolean-B_vDzBHf.js → useBoolean-XOrergn4.js} +1 -1
  67. package/dist/assets/{useCellActionButton-CcXV09GQ.js → useCellActionButton-DfeGNY_S.js} +1 -1
  68. package/dist/assets/{useDeleteCell-BVX9aH-t.js → useDeleteCell-BId7kUpZ.js} +1 -1
  69. package/dist/assets/{useDependencyPanelTab-CewdyAAy.js → useDependencyPanelTab-DDU-NsHT.js} +1 -1
  70. package/dist/assets/{useHotkey-Cm0DaHEJ.js → useHotkey-DccKPSPx.js} +1 -1
  71. package/dist/assets/useNotebookActions-Dhy6t0gn.js +1 -0
  72. package/dist/assets/{useRunCells-CgXnbA14.js → useRunCells-B9oL9NIs.js} +1 -1
  73. package/dist/assets/{useSplitCell-_Q2wQXsQ.js → useSplitCell-Cc8EEdIY.js} +1 -1
  74. package/dist/assets/{useTheme-Cb4Wekek.js → useTheme-DFXuDFj9.js} +1 -1
  75. package/dist/assets/utils-BrXijSdZ.js +1 -0
  76. package/dist/assets/{vega-component-BDK4MwYT.js → vega-component-CGpxsBwV.js} +1 -1
  77. package/dist/index.html +29 -29
  78. package/package.json +5 -5
  79. package/src/components/ai/ai-provider-icon.tsx +1 -0
  80. package/src/components/ai/ai-utils.ts +1 -0
  81. package/src/components/app-config/ai-config.tsx +30 -0
  82. package/src/components/slides/slide-form.tsx +43 -0
  83. package/src/components/ui/links.tsx +2 -1
  84. package/src/core/ai/ids/ids.ts +1 -0
  85. package/src/core/cells/__tests__/apply-transaction.test.ts +193 -27
  86. package/src/core/cells/__tests__/cells.test.ts +99 -0
  87. package/src/core/cells/__tests__/document-changes.test.ts +14 -0
  88. package/src/core/cells/cells.ts +14 -1
  89. package/src/core/cells/document-changes.ts +17 -14
  90. package/src/core/config/config-schema.ts +1 -0
  91. package/src/plugins/core/RenderHTML.tsx +49 -3
  92. package/src/plugins/core/__test__/RenderHTML.test.ts +54 -0
  93. package/dist/assets/RenderHTML-8cI8zL5y.js +0 -1
  94. package/dist/assets/ai-model-dropdown-BFTnsrTP.js +0 -5
  95. package/dist/assets/layout-DNOqvNbP.js +0 -9
  96. package/dist/assets/useNotebookActions-CWpi-dx_.js +0 -1
  97. package/dist/assets/utils-DIGrmLDO.js +0 -1
@@ -60,6 +60,60 @@ describe("parseHtml", () => {
60
60
  `);
61
61
  });
62
62
 
63
+ test("img has key derived from src so React remounts on src change", () => {
64
+ const html = '<img src="https://cdn.example.com/a.png" alt="a">';
65
+ const result = parseHtml({ html }) as React.ReactElement;
66
+ expect(result.key).toBe("https://cdn.example.com/a.png-0");
67
+ });
68
+
69
+ test("multiple imgs each get distinct keys", () => {
70
+ const html =
71
+ '<div><img src="https://cdn.example.com/a.png"><img src="https://cdn.example.com/b.png"></div>';
72
+ const result = parseHtml({ html }) as React.ReactElement<{
73
+ children: React.ReactElement[];
74
+ }>;
75
+ const children = result.props.children;
76
+ expect(children[0].key).toBe("https://cdn.example.com/a.png-0");
77
+ expect(children[1].key).toBe("https://cdn.example.com/b.png-1");
78
+ });
79
+
80
+ test("img without src is left alone", () => {
81
+ const html = "<img>";
82
+ const result = parseHtml({ html }) as React.ReactElement;
83
+ expect(result.key).toBeNull();
84
+ });
85
+
86
+ test("img with data: URI is not keyed (inline, no network fetch)", () => {
87
+ const longPayload = "A".repeat(10_000);
88
+ const html = `<img src="data:image/png;base64,${longPayload}">`;
89
+ const result = parseHtml({ html }) as React.ReactElement;
90
+ // No remount-on-src needed for inline images, so we leave the key
91
+ // unset rather than bloat it with the base64 payload.
92
+ expect(result.key).toBeNull();
93
+ });
94
+
95
+ test("img with uppercase DATA: URI is also skipped (scheme is case-insensitive)", () => {
96
+ const html = `<img src="DATA:image/png;base64,${"A".repeat(100)}">`;
97
+ const result = parseHtml({ html }) as React.ReactElement;
98
+ expect(result.key).toBeNull();
99
+ });
100
+
101
+ test("img wrapped by data-tooltip is still keyed by src", () => {
102
+ const html =
103
+ '<img src="https://cdn.example.com/a.png" data-tooltip="hi" alt="a">';
104
+ const result = parseHtml({ html }) as React.ReactElement;
105
+ // Outer Tooltip carries the src-based key so it remounts on src change,
106
+ // forcing the inner <img> to remount as well.
107
+ expect(result.key).toBe("https://cdn.example.com/a.png-0");
108
+ });
109
+
110
+ test("img wrapped by data-marimo-doc is still keyed by src", () => {
111
+ const html =
112
+ '<img src="https://cdn.example.com/b.png" data-marimo-doc="foo.bar">';
113
+ const result = parseHtml({ html }) as React.ReactElement;
114
+ expect(result.key).toBe("https://cdn.example.com/b.png-0");
115
+ });
116
+
63
117
  test("codehilite with copy button", () => {
64
118
  const html =
65
119
  '<div class="codehilite"><pre><code>console.log("Hello");</code></pre></div>';
@@ -1 +0,0 @@
1
- import{s as x}from"./chunk-LvLJmgfZ.js";import{i as g,p as T,u as C}from"./useEvent-D91BmmQi.js";import{t as M}from"./react-Bj1aDYRI.js";import{Sn as H,ci as I,it as j,li as c,m as L,vn as N,yt as k}from"./cells-CcBfzJ1Z.js";import{t as E}from"./compiler-runtime-B3qBwwSJ.js";import{_ as w}from"./useEventListener-BR0C1MaI.js";import{o as _}from"./utils-DIGrmLDO.js";import{t as A}from"./jsx-runtime-BqBOg78p.js";import{t as F}from"./tooltip-Gcwqb_SK.js";import{t as O}from"./copy-icon-BYNydU7b.js";import{t as W}from"./usePress-CfcdTqJM.js";import{n as q}from"./useDebounce-CLMpJfhX.js";import{t as R}from"./useRunCells-CgXnbA14.js";var z=E(),m=x(M(),1),l=x(A(),1);const V=e=>{let t=(0,z.c)(16),r,n,i;t[0]===e?(r=t[1],n=t[2],i=t[3]):({href:n,children:r,...i}=e,t[0]=e,t[1]=r,t[2]=n,t[3]=i);let a=(0,m.useRef)(null),o;t[4]===n?o=t[5]:(o=()=>{let p=new URL(globalThis.location.href);p.hash=n,globalThis.history.pushState({},"",p.toString()),globalThis.dispatchEvent(new HashChangeEvent("hashchange"));let S=n.slice(1),y=document.getElementById(S);y&&y.scrollIntoView({behavior:"smooth",block:"start"})},t[4]=n,t[5]=o);let s=o,f;t[6]===s?f=t[7]:(f={onPress:()=>{s()}},t[6]=s,t[7]=f);let{pressProps:h}=W(f),u;t[8]===s?u=t[9]:(u=p=>{p.preventDefault(),s()},t[8]=s,t[9]=u);let b=u,d;return t[10]!==r||t[11]!==b||t[12]!==n||t[13]!==h||t[14]!==i?(d=(0,l.jsx)("a",{ref:a,href:n,...h,onClick:b,...i,children:r}),t[10]=r,t[11]=b,t[12]=n,t[13]=h,t[14]=i,t[15]=d):d=t[15],d};async function P(e){let t=L().inOrderIds.at(0);if(t)try{let r=await N.request({document:e,cellId:t});if(!r||r.options.length===0)return;let n=e.split(".").pop()??e,i=r.options[0],a=r.options.find(o=>o.name===n)??i;a!=null&&a.completion_info&&g.set(H,{documentation:a.completion_info})}catch(r){w.debug(`Doc lookup failed for "${e}"`,r)}}var D=E();const $=e=>{let t=(0,D.c)(8),{qualifiedName:r,children:n}=e,i;t[0]===r?i=t[1]:(i=()=>{P(r)},t[0]=r,t[1]=i);let a=q(i,100),o;t[2]===a?o=t[3]:(o=()=>a.cancel(),t[2]=a,t[3]=o);let s;return t[4]!==n||t[5]!==a||t[6]!==o?(s=(0,l.jsx)("span",{onMouseEnter:a,onMouseLeave:o,children:n}),t[4]=n,t[5]=a,t[6]=o,t[7]=s):s=t[7],s};function B(e){if(typeof e!="object"||!e)return!1;let t=e;return!(t.trusted!==!0||t.notebookCode!==void 0&&typeof t.notebookCode!="string")}function U(){let e=window==null?void 0:window.__MARIMO_EXPORT_CONTEXT__;return B(e)?e:void 0}function v(){var e;return((e=U())==null?void 0:e.trusted)===!0}function X(){if(g.get(R)||v()||g.get(_))return!0;try{if(j()==="read")return!0}catch{}return!1}var G=T(e=>{let t=e(R),r=e(_);if(t||r||v())return!1;let n=!0;try{n=j()==="read"}catch{return!0}return!n});function K(){return C(G)}var Z=E(),J=e=>{if(e instanceof c.Element&&!/^[A-Za-z][\w-]*$/.test(e.name))return m.createElement(m.Fragment)},Q=(e,t)=>{if(t instanceof c.Element&&t.name==="body"){if((0,m.isValidElement)(e)&&"props"in e){let r=e.props.children;return(0,l.jsx)(l.Fragment,{children:r})}return}},Y=(e,t)=>{if(t instanceof c.Element&&t.name==="html"){if((0,m.isValidElement)(e)&&"props"in e){let r=e.props.children;return(0,l.jsx)(l.Fragment,{children:r})}return}},tt=e=>{if(e instanceof c.Element&&e.attribs&&e.name==="iframe"){let t=document.createElement("iframe");return Object.entries(e.attribs).forEach(([r,n])=>{r.startsWith('"')&&r.endsWith('"')&&(r=r.slice(1,-1)),t.setAttribute(r,n)}),(0,l.jsx)("div",{dangerouslySetInnerHTML:{__html:t.outerHTML}})}},et=e=>{if(e instanceof c.Element&&e.name==="script"){let t=e.attribs.src;if(!t)return;if(!X())return w.warn(`[RenderHTML] refusing <script src> in untrusted context: ${t}`),(0,l.jsx)(l.Fragment,{});if(![...document.querySelectorAll("script[src]")].some(r=>r.getAttribute("src")===t)){let r=document.createElement("script");r.src=t,document.head.append(r)}return(0,l.jsx)(l.Fragment,{})}},rt=(e,t)=>{if(t instanceof c.Element&&t.name==="a"){let r=t.attribs.href;if(r!=null&&r.startsWith("#")&&!r.startsWith("#code/")){let n=null;return(0,m.isValidElement)(e)&&"props"in e&&(n=e.props.children),(0,l.jsx)(V,{href:r,...t.attribs,children:n})}}},nt=(e,t,r)=>{var n,i;if(t instanceof c.Element&&t.name==="div"&&((i=(n=t.attribs)==null?void 0:n.class)!=null&&i.includes("codehilite")))return(0,l.jsx)(ot,{children:e},r)},it=(e,t)=>{var r;if(t instanceof c.Element&&((r=t.attribs)!=null&&r["data-marimo-doc"])){let n=t.attribs["data-marimo-doc"];return(0,l.jsx)($,{qualifiedName:n,children:e})}},at=(e,t)=>{var r,n;if(t instanceof c.Element&&((r=t.attribs)!=null&&r["data-tooltip"])){if((((n=t.name)==null?void 0:n.toLowerCase())??"").startsWith("marimo-"))return;let i=t.attribs["data-tooltip"];return(0,l.jsx)(F,{content:i,children:e})}},ot=e=>{let t=(0,Z.c)(3),{children:r}=e,n=(0,m.useRef)(null),i;t[0]===Symbol.for("react.memo_cache_sentinel")?(i=(0,l.jsx)("div",{className:"absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity",children:(0,l.jsx)(O,{tooltip:!1,className:"p-1",value:()=>{var s;let o=(s=n.current)==null?void 0:s.firstChild;return o&&o.textContent||""}})}),t[0]=i):i=t[0];let a;return t[1]===r?a=t[2]:(a=(0,l.jsxs)("div",{className:"relative group codehilite-wrapper",ref:n,children:[r,i]}),t[1]=r,t[2]=a),a};const st=({html:e,additionalReplacements:t=[],alwaysSanitizeHtml:r=!0})=>(0,l.jsx)(lt,{html:e,alwaysSanitizeHtml:r,additionalReplacements:t});var lt=({html:e,additionalReplacements:t=[],alwaysSanitizeHtml:r})=>{let n=K();return ct({html:(0,m.useMemo)(()=>r||n?k(e):e,[e,r,n]),additionalReplacements:t})};function ct({html:e,additionalReplacements:t=[]}){let r=[J,tt,et,...t],n=[nt,rt,it,at,Q,Y];return I(e,{replace:(i,a)=>{for(let o of r){let s=o(i,a);if(s)return s}return i},transform:(i,a,o)=>{for(let s of n){let f=s(i,a,o);if(f)return f}return i}})}export{v as n,st as t};