@marimo-team/frontend 0.24.3-dev21 → 0.24.3-dev22
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.
- package/dist/assets/{ConnectedDataExplorerComponent-Bj-8QvOO.js → ConnectedDataExplorerComponent-BxEhAvf2.js} +1 -1
- package/dist/assets/{JsonOutput-CyYzc60z.js → JsonOutput-BpHpvw85.js} +1 -1
- package/dist/assets/{LazyAnyLanguageCodeMirror-BtzjduAK.js → LazyAnyLanguageCodeMirror-Da4h0YCR.js} +2 -2
- package/dist/assets/{MarimoErrorOutput-BshpkIVR.js → MarimoErrorOutput-9qSrtrSc.js} +1 -1
- package/dist/assets/{RenderHTML-BTFNYa1C.js → RenderHTML-N95NfVow.js} +2 -2
- package/dist/assets/{RunButton-Cie2TYpY.js → RunButton-C_M5WUDn.js} +1 -1
- package/dist/assets/{abnfDiagram-VCTEODGH-CTw9qxYa.js → abnfDiagram-VCTEODGH-3U62UF6W.js} +1 -1
- package/dist/assets/{add-cell-with-ai-YkPnjDjr.js → add-cell-with-ai-JrZ3dZK8.js} +1 -1
- package/dist/assets/{agent-panel-BQLa06pr.js → agent-panel-aceUbbtZ.js} +1 -1
- package/dist/assets/{ai-model-dropdown-RAsX31Hv.js → ai-model-dropdown-CuFKgpI6.js} +1 -1
- package/dist/assets/{any-language-editor-BT05ewla.js → any-language-editor-DIfV5lY9.js} +1 -1
- package/dist/assets/{app-config-button-msEMWBIk.js → app-config-button-hChgIp-1.js} +1 -1
- package/dist/assets/{architectureDiagram-5GKGNRK7-DCx0yPPP.js → architectureDiagram-5GKGNRK7-XZggJx8Z.js} +1 -1
- package/dist/assets/{cache-panel-B8useRmi.js → cache-panel-B369RVf6.js} +1 -1
- package/dist/assets/{chat-display-DZGATOY-.js → chat-display-LnKKHJET.js} +1 -1
- package/dist/assets/{chat-panel-Dl134EjA.js → chat-panel-CEutKfvM.js} +1 -1
- package/dist/assets/{chat-ui-Bnru6Vtf.js → chat-ui-DdFELeut.js} +1 -1
- package/dist/assets/{chunk-IMKFNOWR-DsbK9jlz.js → chunk-IMKFNOWR-CWWaj_eZ.js} +1 -1
- package/dist/assets/{chunk-SHT3W25Y-DwAAtWpF.js → chunk-SHT3W25Y-DhQFtMYF.js} +1 -1
- package/dist/assets/{chunk-SVP7TREG-Cm2QsNfG.js → chunk-SVP7TREG-CGAF68wY.js} +1 -1
- package/dist/assets/{chunk-TICWLB2K-DZlYBaKM.js → chunk-TICWLB2K-DUD1nSLR.js} +1 -1
- package/dist/assets/{classDiagram-ZZMXUADV-DYe7vEnn.js → classDiagram-ZZMXUADV-BIG-0Wmd.js} +1 -1
- package/dist/assets/{classDiagram-v2-VYDZK3BY-DYe7vEnn.js → classDiagram-v2-VYDZK3BY-BIG-0Wmd.js} +1 -1
- package/dist/assets/{command-palette-DOB1Bndh.js → command-palette-CWfzxEs_.js} +1 -1
- package/dist/assets/{components-BqzG--PP.js → components-BmXgqUuI.js} +1 -1
- package/dist/assets/{components-ZGavCSxx.js → components-z1r_qaTx.js} +1 -1
- package/dist/assets/{cynefinDiagram-5FMLGOSQ-5_q6hV5Z.js → cynefinDiagram-5FMLGOSQ-I2kn-8SS.js} +1 -1
- package/dist/assets/{dagre-BDRVKmaQ.js → dagre-C9a0Ci_H.js} +1 -1
- package/dist/assets/{dagre-GXQ25YYZ-CWoZAFmI.js → dagre-GXQ25YYZ-DOEexSWK.js} +1 -1
- package/dist/assets/{data-grid-overlay-editor-DFeVItiD.js → data-grid-overlay-editor-DOe6QsGf.js} +1 -1
- package/dist/assets/{dependency-graph-panel-IP6d8BbH.js → dependency-graph-panel-vdECXCkM.js} +1 -1
- package/dist/assets/{diagram-S7CK7UJ4-B8I8X0CY.js → diagram-S7CK7UJ4-CKRRJ5Hc.js} +1 -1
- package/dist/assets/{diagram-UQ7AKVKN-BcweTnXI.js → diagram-UQ7AKVKN-D7mKu_kM.js} +1 -1
- package/dist/assets/{diagram-VX7I27RA-AWiaWuJO.js → diagram-VX7I27RA-B0cVx1nI.js} +1 -1
- package/dist/assets/{diagram-Z3DM3KII-DDvreGn8.js → diagram-Z3DM3KII-CusYTO8G.js} +1 -1
- package/dist/assets/{documentation-panel-CJgkTyIx.js → documentation-panel-qwNYitZ3.js} +1 -1
- package/dist/assets/{ebnfDiagram-PWID7BFC-ButzO8HZ.js → ebnfDiagram-PWID7BFC-D46hXu0l.js} +1 -1
- package/dist/assets/{edit-page-e1AwBQu4.js → edit-page-DnnhBQPH.js} +4 -4
- package/dist/assets/{erDiagram-RLTQ6QDP-CgUjrkP9.js → erDiagram-RLTQ6QDP-Dikv0Fso.js} +1 -1
- package/dist/assets/{error-panel-5vJPqB6k.js → error-panel-CPgbldfu.js} +1 -1
- package/dist/assets/{file-explorer-panel-DNUKGUzp.js → file-explorer-panel-z-gsa-j2.js} +1 -1
- package/dist/assets/{file-name-input-DmflkfHZ.js → file-name-input-BVhk5tHx.js} +1 -1
- package/dist/assets/{flowDiagram-HODETNUW-CXcjmXAo.js → flowDiagram-HODETNUW-DyDM12jm.js} +1 -1
- package/dist/assets/{gallery-page-CZZnfSrv.js → gallery-page-btVOe2kg.js} +1 -1
- package/dist/assets/{glide-data-editor-DgiuGIF0.js → glide-data-editor-CT14Ztd8.js} +4 -4
- package/dist/assets/{home-page-ByY_ySER.js → home-page-0z6OTymR.js} +1 -1
- package/dist/assets/{index-DGRl4eiy.js → index-984Tnhsz.js} +6 -6
- package/dist/assets/{infoDiagram-27XIBGKW-BpOUg5X8.js → infoDiagram-27XIBGKW-C-JWkvBr.js} +1 -1
- package/dist/assets/{ishikawaDiagram-5VMMS53U-dBr69cQD.js → ishikawaDiagram-5VMMS53U-CuxCXtSY.js} +1 -1
- package/dist/assets/{kanban-definition-UXKFOSKX-BBcfu7Rv.js → kanban-definition-UXKFOSKX-BrvmZNoz.js} +1 -1
- package/dist/assets/{markdown-renderer-CpntV5hg.js → markdown-renderer-CrXRdVEi.js} +1 -1
- package/dist/assets/{mermaid-DR-TX3zF.js → mermaid-B6sN-hkI.js} +3 -3
- package/dist/assets/{mindmap-definition-YA3MSWOX-Cgnk0tk_.js → mindmap-definition-YA3MSWOX-DoltufX9.js} +1 -1
- package/dist/assets/{number-overlay-editor-Bl13fk4Z.js → number-overlay-editor-CT3U2G9F.js} +1 -1
- package/dist/assets/{outline-panel-uDi-sH56.js → outline-panel-Dvd5CElI.js} +1 -1
- package/dist/assets/{packages-panel-u7Zby5GB.js → packages-panel-BT-nYYbr.js} +1 -1
- package/dist/assets/{panels-CEerG3VA.js → panels-BUsHuUc8.js} +3 -3
- package/dist/assets/{pegDiagram-XKGWAZYB-DDsGRgTQ.js → pegDiagram-XKGWAZYB-d0Tx-bSJ.js} +1 -1
- package/dist/assets/{pieDiagram-E7YTZNPT-DUe_eLgm.js → pieDiagram-E7YTZNPT-C81NHOIP.js} +1 -1
- package/dist/assets/{process-output-BWxjdXY1.js → process-output-D7QVDScC.js} +1 -1
- package/dist/assets/{railroadDiagram-O6MQD6OU-DzY8nHzr.js → railroadDiagram-O6MQD6OU-DnTZDeC4.js} +1 -1
- package/dist/assets/{requirementDiagram-BXWQKSXE-DLKr649r.js → requirementDiagram-BXWQKSXE-DLAfuSPO.js} +1 -1
- package/dist/assets/{reveal-component-17zLsqZa.js → reveal-component-atpV5Uen.js} +1 -1
- package/dist/assets/{run-page-TO2BZZMp.js → run-page-BMJsOzy2.js} +1 -1
- package/dist/assets/{scratchpad-panel-VN_tBweQ.js → scratchpad-panel-Cg5zVbhC.js} +1 -1
- package/dist/assets/{sequenceDiagram-WJ2MYXX4-Cfg8qssF.js → sequenceDiagram-WJ2MYXX4-Ctefrk2W.js} +1 -1
- package/dist/assets/{session-panel-Cw_8kjDt.js → session-panel-Dwbifh51.js} +1 -1
- package/dist/assets/{snippets-panel-D7Rp5Zno.js → snippets-panel-Dvy9OdD4.js} +1 -1
- package/dist/assets/{stateDiagram-D77RDMKH-D_-rzAPC.js → stateDiagram-D77RDMKH-WccaGLAY.js} +1 -1
- package/dist/assets/{stateDiagram-v2-MP3YSRHH-FM75beyR.js → stateDiagram-v2-MP3YSRHH-BitHGOWC.js} +1 -1
- package/dist/assets/{swimlanes-42K2YHIH-ph-wyn_r.js → swimlanes-42K2YHIH-BpG4rawk.js} +1 -1
- package/dist/assets/{swimlanesDiagram-VR7AAH4N-CF7Gedcx.js → swimlanesDiagram-VR7AAH4N-9ejnJC_u.js} +1 -1
- package/dist/assets/{terminal-6SBeMqcn.js → terminal-B53u3qdG.js} +1 -1
- package/dist/assets/{timeline-definition-24CTP7MA-ByE-l4B7.js → timeline-definition-24CTP7MA-BIR9BrxG.js} +1 -1
- package/dist/assets/{tracing-DauHORbt.js → tracing-DxQsA4VC.js} +1 -1
- package/dist/assets/{tracing-panel-LaQEFD_q.js → tracing-panel-Bhq293kV.js} +2 -2
- package/dist/assets/{useCellActionButton-BYi2_TYS.js → useCellActionButton-D_9ih-0J.js} +1 -1
- package/dist/assets/{vega-component-BcSAqzv5.js → vega-component-AgTiD44W.js} +1 -1
- package/dist/assets/{vennDiagram-4TSXK5OY-Dpeno6-G.js → vennDiagram-4TSXK5OY-N8S9_E6a.js} +1 -1
- package/dist/assets/{wardleyDiagram-VM6X3IG4-C4cuSkrj.js → wardleyDiagram-VM6X3IG4-CCq_Dopz.js} +1 -1
- package/dist/assets/{xychartDiagram-S5SC5T6Z-B8RkSYF6.js → xychartDiagram-S5SC5T6Z-CtyOBwdO.js} +1 -1
- package/dist/index.html +6 -6
- package/package.json +1 -1
- package/src/plugins/core/RenderHTML.tsx +24 -12
- package/src/plugins/core/__test__/RenderHTML.test.ts +135 -12
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
import type { ExtractAtomValue } from "jotai";
|
|
3
|
+
import { isValidElement, type ReactNode } from "react";
|
|
4
|
+
import { renderToStaticMarkup } from "react-dom/server";
|
|
3
5
|
import { afterEach, beforeEach, describe, expect, test } from "vitest";
|
|
4
6
|
import { hasRunAnyCellAtom } from "@/components/editor/cell/useRunCells";
|
|
5
7
|
import { userConfigAtom } from "@/core/config/config";
|
|
@@ -458,13 +460,21 @@ describe("wrapTooltipTargets", () => {
|
|
|
458
460
|
expect(result).toMatchInlineSnapshot(`
|
|
459
461
|
<Tooltip
|
|
460
462
|
content={
|
|
461
|
-
|
|
462
|
-
"
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
463
|
+
<span
|
|
464
|
+
className="whitespace-pre-wrap"
|
|
465
|
+
>
|
|
466
|
+
<React.Fragment>
|
|
467
|
+
Line A
|
|
468
|
+
</React.Fragment>
|
|
469
|
+
<React.Fragment>
|
|
470
|
+
<br />
|
|
471
|
+
Line B
|
|
472
|
+
</React.Fragment>
|
|
473
|
+
<React.Fragment>
|
|
474
|
+
<br />
|
|
475
|
+
Line C
|
|
476
|
+
</React.Fragment>
|
|
477
|
+
</span>
|
|
468
478
|
}
|
|
469
479
|
>
|
|
470
480
|
<span
|
|
@@ -483,11 +493,17 @@ describe("wrapTooltipTargets", () => {
|
|
|
483
493
|
expect(parseHtml({ html })).toMatchInlineSnapshot(`
|
|
484
494
|
<Tooltip
|
|
485
495
|
content={
|
|
486
|
-
|
|
487
|
-
"
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
496
|
+
<span
|
|
497
|
+
className="whitespace-pre-wrap"
|
|
498
|
+
>
|
|
499
|
+
<React.Fragment>
|
|
500
|
+
Line A
|
|
501
|
+
</React.Fragment>
|
|
502
|
+
<React.Fragment>
|
|
503
|
+
<br />
|
|
504
|
+
Line B
|
|
505
|
+
</React.Fragment>
|
|
506
|
+
</span>
|
|
491
507
|
}
|
|
492
508
|
>
|
|
493
509
|
<span
|
|
@@ -514,6 +530,113 @@ describe("wrapTooltipTargets", () => {
|
|
|
514
530
|
</Tooltip>
|
|
515
531
|
`);
|
|
516
532
|
});
|
|
533
|
+
|
|
534
|
+
test.each([
|
|
535
|
+
["CRLF", "A\r\nB", '<span class="whitespace-pre-wrap">A<br/>B</span>'],
|
|
536
|
+
[
|
|
537
|
+
"encoded CRLF",
|
|
538
|
+
"A B",
|
|
539
|
+
'<span class="whitespace-pre-wrap">A<br/>B</span>',
|
|
540
|
+
],
|
|
541
|
+
["leading newline", "\nA", "A"],
|
|
542
|
+
["trailing newline", "A\n", "A"],
|
|
543
|
+
[
|
|
544
|
+
"boundary newlines",
|
|
545
|
+
"\n\nA\nB\n\n",
|
|
546
|
+
'<span class="whitespace-pre-wrap">A<br/>B</span>',
|
|
547
|
+
],
|
|
548
|
+
[
|
|
549
|
+
"boundary CRLF",
|
|
550
|
+
" A B ",
|
|
551
|
+
'<span class="whitespace-pre-wrap">A<br/>B</span>',
|
|
552
|
+
],
|
|
553
|
+
["only newlines", "\n\n", ""],
|
|
554
|
+
["only CRLF", " ", ""],
|
|
555
|
+
[
|
|
556
|
+
"internal blank line",
|
|
557
|
+
"A\n\nB",
|
|
558
|
+
'<span class="whitespace-pre-wrap">A<br/><br/>B</span>',
|
|
559
|
+
],
|
|
560
|
+
[
|
|
561
|
+
"spaces and tabs",
|
|
562
|
+
"\n A\t\n\tB \n",
|
|
563
|
+
'<span class="whitespace-pre-wrap"> A\t<br/>\tB </span>',
|
|
564
|
+
],
|
|
565
|
+
[
|
|
566
|
+
"HTML text",
|
|
567
|
+
"<b>A</b>\nB",
|
|
568
|
+
'<span class="whitespace-pre-wrap"><b>A</b><br/>B</span>',
|
|
569
|
+
],
|
|
570
|
+
])("data-tooltip handles %s", (_, content, expected) => {
|
|
571
|
+
const result = parseHtml({
|
|
572
|
+
html: `<span data-tooltip="${content}">Hover me</span>`,
|
|
573
|
+
});
|
|
574
|
+
if (!isValidElement<{ content: ReactNode }>(result)) {
|
|
575
|
+
throw new Error("Expected a Tooltip element");
|
|
576
|
+
}
|
|
577
|
+
expect(renderToStaticMarkup(result.props.content)).toBe(expected);
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
test("data-tooltip with newline renders as line breaks", () => {
|
|
581
|
+
const html = '<span data-tooltip="Line one\nLine two">Hover me</span>';
|
|
582
|
+
expect(parseHtml({ html })).toMatchInlineSnapshot(`
|
|
583
|
+
<Tooltip
|
|
584
|
+
content={
|
|
585
|
+
<span
|
|
586
|
+
className="whitespace-pre-wrap"
|
|
587
|
+
>
|
|
588
|
+
<React.Fragment>
|
|
589
|
+
Line one
|
|
590
|
+
</React.Fragment>
|
|
591
|
+
<React.Fragment>
|
|
592
|
+
<br />
|
|
593
|
+
Line two
|
|
594
|
+
</React.Fragment>
|
|
595
|
+
</span>
|
|
596
|
+
}
|
|
597
|
+
>
|
|
598
|
+
<span
|
|
599
|
+
data-tooltip="Line one
|
|
600
|
+
Line two"
|
|
601
|
+
>
|
|
602
|
+
Hover me
|
|
603
|
+
</span>
|
|
604
|
+
</Tooltip>
|
|
605
|
+
`);
|
|
606
|
+
});
|
|
607
|
+
|
|
608
|
+
test("data-tooltip with multiple newlines renders all as line breaks", () => {
|
|
609
|
+
const html = '<span data-tooltip="A\nB\nC">Hover me</span>';
|
|
610
|
+
expect(parseHtml({ html })).toMatchInlineSnapshot(`
|
|
611
|
+
<Tooltip
|
|
612
|
+
content={
|
|
613
|
+
<span
|
|
614
|
+
className="whitespace-pre-wrap"
|
|
615
|
+
>
|
|
616
|
+
<React.Fragment>
|
|
617
|
+
A
|
|
618
|
+
</React.Fragment>
|
|
619
|
+
<React.Fragment>
|
|
620
|
+
<br />
|
|
621
|
+
B
|
|
622
|
+
</React.Fragment>
|
|
623
|
+
<React.Fragment>
|
|
624
|
+
<br />
|
|
625
|
+
C
|
|
626
|
+
</React.Fragment>
|
|
627
|
+
</span>
|
|
628
|
+
}
|
|
629
|
+
>
|
|
630
|
+
<span
|
|
631
|
+
data-tooltip="A
|
|
632
|
+
B
|
|
633
|
+
C"
|
|
634
|
+
>
|
|
635
|
+
Hover me
|
|
636
|
+
</span>
|
|
637
|
+
</Tooltip>
|
|
638
|
+
`);
|
|
639
|
+
});
|
|
517
640
|
});
|
|
518
641
|
|
|
519
642
|
describe("parseHtml with < nad >", () => {
|