@marimo-team/islands 0.25.2-dev3 → 0.25.2-dev30

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 (140) hide show
  1. package/dist/{ConnectedDataExplorerComponent-C2d9ysUI.js → ConnectedDataExplorerComponent-CglAbSke.js} +11 -11
  2. package/dist/{ErrorBoundary-C5H0YXQW.js → ErrorBoundary-Siz68Nx-.js} +8 -8
  3. package/dist/{abnfDiagram-VCTEODGH-AFhOQTt8.js → abnfDiagram-VCTEODGH-Bd5MYz7g.js} +3 -3
  4. package/dist/{any-language-editor-CycIVIeP.js → any-language-editor-dqxlUDlT.js} +3 -3
  5. package/dist/{architectureDiagram-5GKGNRK7-BngksAAQ.js → architectureDiagram-5GKGNRK7-12FmGgo8.js} +5 -5
  6. package/dist/assets/__vite-browser-external-BqAtzd2P.js +1 -0
  7. package/dist/assets/{worker-D7hWi02M.js → worker-Bf8dt6S-.js} +5 -5
  8. package/dist/{blockDiagram-I7D4REHJ-CvBmppdy.js → blockDiagram-I7D4REHJ-BeHOjyDk.js} +9 -9
  9. package/dist/{button-DdXAm8iz.js → button-B0Xgl-Qn.js} +12 -0
  10. package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-Bao10t_O.js} +7 -7
  11. package/dist/{capabilities-B3ce_GNu.js → capabilities-D7Ad8-zw.js} +1 -1
  12. package/dist/{cells-Cv93oav_.js → cells-BUbzm9iX.js} +13 -13
  13. package/dist/{channel-z7HZXHwv.js → channel-BxCkvUgE.js} +1 -1
  14. package/dist/{chat-ui-fVyVOhYN.js → chat-ui-DJpsSmlB.js} +18 -18
  15. package/dist/{check-B7cIK6gb.js → check-DGZ74tV2.js} +1 -1
  16. package/dist/{chunk-4HAMMTFA-BPTTOOC5.js → chunk-4HAMMTFA-CH7Gpamd.js} +5 -5
  17. package/dist/{chunk-75Z2AOVW-C4AOleKf.js → chunk-75Z2AOVW-AI7CvgKn.js} +1 -1
  18. package/dist/{chunk-DU6HZSFF-1TwWR6gh.js → chunk-DU6HZSFF-BSvuTkX4.js} +1 -1
  19. package/dist/{chunk-F27PBJKO-DMI1PBe4.js → chunk-F27PBJKO-CLshwT9T.js} +1 -1
  20. package/dist/{chunk-GMAD6QVW-vStrMz2P.js → chunk-GMAD6QVW-wnHcn-lH.js} +3 -3
  21. package/dist/{chunk-GVQU2GXP-2HwWgs4u.js → chunk-GVQU2GXP-7O2p8hut.js} +2 -2
  22. package/dist/{chunk-IMKFNOWR-UOVZuZVn.js → chunk-IMKFNOWR-BlsbbLiS.js} +6 -6
  23. package/dist/{chunk-L3NEJ4N5-RhC7i0I2.js → chunk-L3NEJ4N5-B9_Alrxb.js} +5 -5
  24. package/dist/{chunk-OSK3NFVY-CZV09N-U.js → chunk-OSK3NFVY-PeQPH2fD.js} +6 -6
  25. package/dist/{chunk-P2QGCYS3-0TAWai9C.js → chunk-P2QGCYS3-D9twiFuU.js} +1 -1
  26. package/dist/{chunk-POPQ4Y6H-Cc3_56GX.js → chunk-POPQ4Y6H-BUiNs18s.js} +1 -1
  27. package/dist/{chunk-PWAF6VOD-lNxB9k8z.js → chunk-PWAF6VOD-D8S9NPCy.js} +1 -1
  28. package/dist/{chunk-SHT3W25Y-CrEPyWy1.js → chunk-SHT3W25Y-DoIB7Bub.js} +8 -8
  29. package/dist/{chunk-SVP7TREG-uIyyySp6.js → chunk-SVP7TREG-B0dScloT.js} +2 -2
  30. package/dist/{chunk-TICWLB2K-DdXM3eg6.js → chunk-TICWLB2K-C-lzn2th.js} +6 -6
  31. package/dist/classDiagram-ZZMXUADV-C5vpBHoS.js +30 -0
  32. package/dist/classDiagram-v2-VYDZK3BY-BS2Wadt0.js +30 -0
  33. package/dist/{code-visibility-DOh8H9K5.js → code-visibility-CP3A3ANH.js} +6 -6
  34. package/dist/{common-BJXaiNuk.js → common-DYbUXmkS.js} +22 -22
  35. package/dist/{copy-icon-CLdENY__.js → copy-icon-qmRg_VTX.js} +3 -3
  36. package/dist/{cynefinDiagram-5FMLGOSQ-zknaAsGy.js → cynefinDiagram-5FMLGOSQ-fxnL4mfp.js} +3 -3
  37. package/dist/{dagre-GXQ25YYZ-BhMOoMGJ.js → dagre-GXQ25YYZ-D5NkGE9i.js} +10 -10
  38. package/dist/{data-grid-overlay-editor-DVk573OG.js → data-grid-overlay-editor-BgExvd3Z.js} +1 -1
  39. package/dist/{diagram-S7CK7UJ4-V5-Z-EDY.js → diagram-S7CK7UJ4-CATbk1XK.js} +4 -4
  40. package/dist/{diagram-UQ7AKVKN-qw8AjDal.js → diagram-UQ7AKVKN-Cjha5vrC.js} +3 -3
  41. package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-DPAWJ9Nw.js} +2 -2
  42. package/dist/{diagram-VX7I27RA-DfuqFb1E.js → diagram-VX7I27RA-BHfAjgGw.js} +5 -5
  43. package/dist/{diagram-Z3DM3KII-DpWwlYZB.js → diagram-Z3DM3KII-eAoDps6E.js} +3 -3
  44. package/dist/{dialog-CgNq6y9-.js → dialog-CILKhbsG.js} +3 -3
  45. package/dist/{dropdown-menu-CZy06LAq.js → dropdown-menu-BaqM0t4N.js} +7 -7
  46. package/dist/{ebnfDiagram-PWID7BFC-C20OnNMZ.js → ebnfDiagram-PWID7BFC-D8RYnIZC.js} +3 -3
  47. package/dist/{erDiagram-RLTQ6QDP-DBXLWO9v.js → erDiagram-RLTQ6QDP-BfmoNNce.js} +12 -12
  48. package/dist/{error-banner-B94dcDmP.js → error-banner-DzAmP0AQ.js} +2 -2
  49. package/dist/{error-entries-DLl0XqoW.js → error-entries-B9WBDeky.js} +2 -2
  50. package/dist/{feedback-button-DDiklug9.js → feedback-button-CwhEpI_T.js} +10 -10
  51. package/dist/flowDiagram-HODETNUW-Du_I0oTA.js +16 -0
  52. package/dist/{formats-Cl_67ghI.js → formats-Q9gwlLyD.js} +3 -3
  53. package/dist/{ganttDiagram-EL5Y4UJY-cRRaDt88.js → ganttDiagram-EL5Y4UJY-B4m_YsKa.js} +2 -2
  54. package/dist/{gitGraphDiagram-WWUBYQGX-Pox5k9-Y.js → gitGraphDiagram-WWUBYQGX-QRBbvWXh.js} +2 -2
  55. package/dist/{glide-data-editor-BGagFNmI.js → glide-data-editor-CrSi-w0o.js} +11 -11
  56. package/dist/{glide-utils-B3rUT5PI.js → glide-utils-CzzWU59p.js} +3 -3
  57. package/dist/{globals-dZEW_NZh.js → globals-BfBZlRMW.js} +3 -3
  58. package/dist/{html-to-image-CmkwfNkf.js → html-to-image-Btymxku9.js} +11 -11
  59. package/dist/{infoDiagram-27XIBGKW-ntpxMfrq.js → infoDiagram-27XIBGKW-CHsocw1z.js} +2 -2
  60. package/dist/{ishikawaDiagram-5VMMS53U-BllIlHE5.js → ishikawaDiagram-5VMMS53U-DZdZJdsT.js} +3 -3
  61. package/dist/{journeyDiagram-3NMN7TZE-EPJDPlt0.js → journeyDiagram-3NMN7TZE-BeeJdJo3.js} +2 -2
  62. package/dist/{kanban-definition-UXKFOSKX-GYtNMjtS.js → kanban-definition-UXKFOSKX-B1rrJRmN.js} +9 -9
  63. package/dist/{label-BslhXqL6.js → label-MNhNNoN6.js} +2 -2
  64. package/dist/{loader-DEZSzvma.js → loader-C9OUkMrj.js} +1 -1
  65. package/dist/main.js +177 -150
  66. package/dist/{mermaid-Dnzoxjt1.js → mermaid-CEceCleL.js} +54 -54
  67. package/dist/{mindmap-definition-YA3MSWOX-Cth76xgH.js → mindmap-definition-YA3MSWOX-C6-S9h9O.js} +11 -11
  68. package/dist/{number-overlay-editor-BvOlx4Sw.js → number-overlay-editor-BfFyQUmB.js} +1 -1
  69. package/dist/{pegDiagram-XKGWAZYB-Cu4uOXii.js → pegDiagram-XKGWAZYB-BL-R6P57.js} +3 -3
  70. package/dist/{pieDiagram-E7YTZNPT-Bh3eDa9s.js → pieDiagram-E7YTZNPT-DuAOxSRy.js} +3 -3
  71. package/dist/{process-output-CYN5E-iO.js → process-output-CTQmCUD0.js} +4 -4
  72. package/dist/purify.es-DMv5zIkJ.js +866 -0
  73. package/dist/{quadrantDiagram-AXDQQJYC--kqzFC3w.js → quadrantDiagram-AXDQQJYC-keLfFx9f.js} +1 -1
  74. package/dist/{railroadDiagram-O6MQD6OU-DG-M6Rnc.js → railroadDiagram-O6MQD6OU-f-sfFoX9.js} +3 -3
  75. package/dist/{requirementDiagram-BXWQKSXE-DCwsThh0.js → requirementDiagram-BXWQKSXE-BICupkaf.js} +11 -11
  76. package/dist/{reveal-component-BYSyNNYH.js → reveal-component-BJG6YrPy.js} +10 -10
  77. package/dist/{sankeyDiagram-P5KCCOFB-BdzhT0BM.js → sankeyDiagram-P5KCCOFB-Bh4EsJox.js} +1 -1
  78. package/dist/{select-C6plhmZr.js → select-BcObMjGz.js} +4 -4
  79. package/dist/{sequenceDiagram-WJ2MYXX4-CbXB1_PU.js → sequenceDiagram-WJ2MYXX4-DBFRnNGU.js} +4 -4
  80. package/dist/{spec-DQBRQSba.js → spec-BSchR9UD.js} +16 -14
  81. package/dist/{stateDiagram-D77RDMKH-A-Zf3Sb2.js → stateDiagram-D77RDMKH-CUP7QQW8.js} +13 -13
  82. package/dist/stateDiagram-v2-MP3YSRHH-B5mAItmH.js +30 -0
  83. package/dist/style.css +1 -1
  84. package/dist/{swimlanes-42K2YHIH-B_pMf0J4.js → swimlanes-42K2YHIH-BtIMdg7b.js} +10 -10
  85. package/dist/swimlanesDiagram-VR7AAH4N-CGnrrHpw.js +30 -0
  86. package/dist/{swiper-component-IOUowglM.js → swiper-component-DkV7T44B.js} +2 -2
  87. package/dist/{timeline-definition-24CTP7MA-DTXFjTTM.js → timeline-definition-24CTP7MA-UwihiSH2.js} +3 -3
  88. package/dist/{toDate-C67bxMWn.js → toDate-DWVp6uE1.js} +3 -3
  89. package/dist/{toast-DvY70eFX.js → toast-DcoJGS3-.js} +4 -4
  90. package/dist/{tooltip-qB8NlSqV.js → tooltip-Bi36DgYh.js} +2 -2
  91. package/dist/{use-restore-focus-D5D9xEjZ.js → use-restore-focus-ZgG5Br63.js} +1 -1
  92. package/dist/{useAsyncData-BD6AStMt.js → useAsyncData-BD7NLQ3_.js} +1 -1
  93. package/dist/{useDateFormatter-BXQGu86d.js → useDateFormatter-D8XWr8lL.js} +2 -2
  94. package/dist/{useDeepCompareMemoize-D_HNdyvI.js → useDeepCompareMemoize-CawMGSRU.js} +1 -1
  95. package/dist/{useIframeCapabilities-CVtNkI3Y.js → useIframeCapabilities-BUMBOpsM.js} +1 -1
  96. package/dist/{useLifecycle-DPgiiwwU.js → useLifecycle-3vGhRa1o.js} +3 -3
  97. package/dist/{useTheme-DzXmYZ5V.js → useTheme-BOw801nZ.js} +2 -2
  98. package/dist/{vega-component-tFOzgarw.js → vega-component-9siY74NS.js} +9 -9
  99. package/dist/{vennDiagram-4TSXK5OY-BPHjZo0R.js → vennDiagram-4TSXK5OY-D5LNVIRI.js} +3 -3
  100. package/dist/{wardleyDiagram-VM6X3IG4-6fTLYBuD.js → wardleyDiagram-VM6X3IG4-BwKf-b0_.js} +3 -3
  101. package/dist/{xychartDiagram-S5SC5T6Z-BYjwjrzE.js → xychartDiagram-S5SC5T6Z-Cg_vyuW2.js} +5 -5
  102. package/package.json +7 -7
  103. package/src/components/chat/tool-call/__tests__/tool-result.test.tsx +56 -0
  104. package/src/components/chat/tool-call/tool-result.tsx +3 -3
  105. package/src/components/data-table/charts/__tests__/schemas.test.ts +25 -0
  106. package/src/components/data-table/charts/__tests__/spec.test.ts +26 -23
  107. package/src/components/data-table/charts/constants.ts +11 -10
  108. package/src/components/data-table/charts/types.ts +1 -0
  109. package/src/components/editor/actions/__tests__/useSetOutputsExpanded.test.ts +42 -0
  110. package/src/components/editor/actions/useNotebookActions.tsx +20 -0
  111. package/src/components/editor/actions/useSetOutputsExpanded.ts +67 -0
  112. package/src/core/edit-app.tsx +16 -0
  113. package/src/core/hotkeys/hotkeys.ts +12 -0
  114. package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
  115. package/src/core/wasm/worker/bootstrap.ts +22 -3
  116. package/src/css/katex.min.css +145 -144
  117. package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
  118. package/src/plugins/impl/DatePickerPlugin.tsx +5 -3
  119. package/src/plugins/impl/DateRangePlugin.tsx +5 -3
  120. package/src/plugins/impl/DateTimePickerPlugin.tsx +5 -3
  121. package/src/plugins/impl/DropdownPlugin.tsx +1 -1
  122. package/src/plugins/impl/FileBrowserPlugin.tsx +45 -15
  123. package/src/plugins/impl/MultiselectPlugin.tsx +1 -1
  124. package/src/plugins/impl/NumberPlugin.tsx +1 -1
  125. package/src/plugins/impl/RadioPlugin.tsx +5 -1
  126. package/src/plugins/impl/RangeSliderPlugin.tsx +1 -1
  127. package/src/plugins/impl/SearchableSelect.tsx +1 -1
  128. package/src/plugins/impl/SliderPlugin.tsx +1 -1
  129. package/src/plugins/impl/SwitchPlugin.tsx +6 -1
  130. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +85 -2
  131. package/src/plugins/impl/__tests__/widget-labels.test.tsx +122 -0
  132. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  133. package/src/plugins/impl/common/labeled.tsx +9 -3
  134. package/dist/assets/__vite-browser-external-C9iR87Zl.js +0 -1
  135. package/dist/classDiagram-ZZMXUADV-BiATbBE4.js +0 -30
  136. package/dist/classDiagram-v2-VYDZK3BY-JnH97GYw.js +0 -30
  137. package/dist/flowDiagram-HODETNUW-DL52nMkt.js +0 -16
  138. package/dist/purify.es-DgKyQviY.js +0 -805
  139. package/dist/stateDiagram-v2-MP3YSRHH-D9YMnUGx.js +0 -30
  140. package/dist/swimlanesDiagram-VR7AAH4N-Ctgy-yGP.js +0 -30
@@ -1,15 +1,15 @@
1
- import "./chunk-75Z2AOVW-C4AOleKf.js";
1
+ import "./chunk-75Z2AOVW-AI7CvgKn.js";
2
2
  import { n as e } from "./src-CA_m4ONl.js";
3
3
  import { n as t } from "./chunk-Y2CYZVJY-DKKS1VyV.js";
4
- import "./chunk-DU6HZSFF-1TwWR6gh.js";
5
- import "./chunk-P2QGCYS3-0TAWai9C.js";
6
- import "./chunk-PWAF6VOD-lNxB9k8z.js";
7
- import "./chunk-GMAD6QVW-vStrMz2P.js";
8
- import "./chunk-4HAMMTFA-BPTTOOC5.js";
9
- import "./chunk-GVQU2GXP-2HwWgs4u.js";
10
- import "./chunk-L3NEJ4N5-RhC7i0I2.js";
11
- import { o as n } from "./chunk-OSK3NFVY-CZV09N-U.js";
12
- import { c as r } from "./mermaid-Dnzoxjt1.js";
4
+ import "./chunk-DU6HZSFF-BSvuTkX4.js";
5
+ import "./chunk-P2QGCYS3-D9twiFuU.js";
6
+ import "./chunk-PWAF6VOD-D8S9NPCy.js";
7
+ import "./chunk-GMAD6QVW-wnHcn-lH.js";
8
+ import "./chunk-4HAMMTFA-CH7Gpamd.js";
9
+ import "./chunk-GVQU2GXP-7O2p8hut.js";
10
+ import "./chunk-L3NEJ4N5-B9_Alrxb.js";
11
+ import { o as n } from "./chunk-OSK3NFVY-PeQPH2fD.js";
12
+ import { c as r } from "./mermaid-CEceCleL.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) {
@@ -0,0 +1,30 @@
1
+ import "./chunk-75Z2AOVW-AI7CvgKn.js";
2
+ import "./src-CA_m4ONl.js";
3
+ import { n as e } from "./chunk-Y2CYZVJY-DKKS1VyV.js";
4
+ import "./chunk-DU6HZSFF-BSvuTkX4.js";
5
+ import "./chunk-P2QGCYS3-D9twiFuU.js";
6
+ import "./chunk-PWAF6VOD-D8S9NPCy.js";
7
+ import "./chunk-GMAD6QVW-wnHcn-lH.js";
8
+ import "./chunk-4HAMMTFA-CH7Gpamd.js";
9
+ import "./chunk-GVQU2GXP-7O2p8hut.js";
10
+ import "./chunk-L3NEJ4N5-B9_Alrxb.js";
11
+ import "./chunk-OSK3NFVY-PeQPH2fD.js";
12
+ import "./mermaid-CEceCleL.js";
13
+ import "./chunk-F27PBJKO-CLshwT9T.js";
14
+ import "./chunk-XXDRQBXY-Dnl5VBqG.js";
15
+ import "./chunk-POPQ4Y6H-BUiNs18s.js";
16
+ import { r as t, t as n } from "./chunk-SHT3W25Y-DoIB7Bub.js";
17
+ //#region ../node_modules/.pnpm/mermaid@11.17.2/node_modules/mermaid/dist/chunks/mermaid.core/swimlanesDiagram-VR7AAH4N.mjs
18
+ var r = n({
19
+ defaultLayout: "swimlane",
20
+ styles: /* @__PURE__ */ e((e) => `${t(e)}
21
+ .swimlane.cluster rect {
22
+ stroke: ${e.clusterBorder} !important;
23
+ }
24
+ [data-look="neo"].cluster rect {
25
+ filter: none;
26
+ }
27
+ `, "getStyles")
28
+ });
29
+ //#endregion
30
+ export { r as diagram };
@@ -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-DdXAm8iz.js";
2
+ import { c as t, h as n, t as r } from "./button-B0Xgl-Qn.js";
3
3
  import { t as i } from "./react-ofJbxM4x.js";
4
4
  import { t as a } from "./compiler-runtime-Cj8ZWiNS.js";
5
5
  import { t as o } from "./jsx-runtime-DgDPJV9S.js";
6
- import { t as s } from "./useIframeCapabilities-CVtNkI3Y.js";
6
+ import { t as s } from "./useIframeCapabilities-BUMBOpsM.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();
@@ -1,9 +1,9 @@
1
1
  import { t as e } from "./arc-7ra3iNdN.js";
2
- import { p as t } from "./chunk-75Z2AOVW-C4AOleKf.js";
2
+ import { p as t } from "./chunk-75Z2AOVW-AI7CvgKn.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
- 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-1TwWR6gh.js";
6
- import { p as m } from "./mermaid-Dnzoxjt1.js";
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-BSvuTkX4.js";
6
+ import { p as m } from "./mermaid-CEceCleL.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-DdXAm8iz.js";
2
+ import { g as t } from "./button-B0Xgl-Qn.js";
3
3
  import { t as n } from "./compiler-runtime-Cj8ZWiNS.js";
4
- import { g as r } from "./tooltip-qB8NlSqV.js";
5
- import { C as i, E as a, _ as o, a as s, b as c } from "./useTheme-DzXmYZ5V.js";
4
+ import { g as r } from "./tooltip-Bi36DgYh.js";
5
+ import { C as i, E as a, _ as o, a as s, b as c } from "./useTheme-BOw801nZ.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-DdXAm8iz.js";
2
+ import { h as t, p as n, r } from "./button-B0Xgl-Qn.js";
3
3
  import { t as i } from "./react-ofJbxM4x.js";
4
4
  import { t as a } from "./compiler-runtime-Cj8ZWiNS.js";
5
- import { h as o } from "./tooltip-qB8NlSqV.js";
6
- import { A as s, k as c } from "./select-C6plhmZr.js";
5
+ import { h as o } from "./tooltip-Bi36DgYh.js";
6
+ import { A as s, k as c } from "./select-BcObMjGz.js";
7
7
  import { t as l } from "./react-dom-BUgJ-ab_.js";
8
8
  import { t as u } from "./jsx-runtime-DgDPJV9S.js";
9
- import { Ct as d, Et as f, St as p, Tt as m, _t as ee, bt as h, ht as te, pt as g, vt as _, wt as v, xt as y } from "./use-restore-focus-D5D9xEjZ.js";
9
+ import { Ct as d, Et as f, St as p, Tt as m, _t as ee, bt as h, ht as te, pt as g, vt as _, wt as v, xt as y } from "./use-restore-focus-ZgG5Br63.js";
10
10
  //#region ../node_modules/.pnpm/@radix-ui+react-toast@1.2.15_@types+react-dom@19.2.5_@types+react@19.2.18__@types+react_bf6d58ed91c2f26d21e09be1118b065a/node_modules/@radix-ui/react-toast/dist/index.mjs
11
11
  var b = /* @__PURE__ */ e(i(), 1), ne = /* @__PURE__ */ e(l(), 1), x = u(), S = "ToastProvider", [re, ie, C] = c("Toast"), [w, T] = v("Toast", [C]), [ae, E] = w(S), oe = (e) => {
12
12
  let { __scopeToast: t, label: n = "Notification", duration: r = 5e3, swipeDirection: i = "right", swipeThreshold: a = 50, children: o } = e, [s, c] = b.useState(null), [l, u] = b.useState(0), d = b.useRef(!1), f = b.useRef(!1);
@@ -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-DdXAm8iz.js";
2
+ import { d as t, h as n, p as r } from "./button-B0Xgl-Qn.js";
3
3
  import { t as i } from "./react-ofJbxM4x.js";
4
4
  import { t as a } from "./compiler-runtime-Cj8ZWiNS.js";
5
5
  import { t as o } from "./react-dom-BUgJ-ab_.js";
6
6
  import { t as s } from "./jsx-runtime-DgDPJV9S.js";
7
- import { Ct as c, Q as l, St as u, Tt as d, X as f, Y as p, bt as m, gt as h, pt as g, vt as _, wt as v, xt as y, yt as b } from "./use-restore-focus-D5D9xEjZ.js";
7
+ import { Ct as c, Q as l, St as u, Tt as d, X as f, Y as p, bt as m, gt as h, pt as g, vt as _, wt as v, xt as y, yt as b } from "./use-restore-focus-ZgG5Br63.js";
8
8
  //#region ../node_modules/.pnpm/lucide-react@0.577.0_react@19.2.8/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-DdXAm8iz.js";
2
+ import { c as t, p as n, u as r } from "./button-B0Xgl-Qn.js";
3
3
  import { t as i } from "./react-ofJbxM4x.js";
4
4
  import { t as a } from "./compiler-runtime-Cj8ZWiNS.js";
5
5
  import { t as o } from "./react-dom-BUgJ-ab_.js";
@@ -1,7 +1,7 @@
1
1
  import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
2
  import { t } from "./react-ofJbxM4x.js";
3
3
  import { t as n } from "./compiler-runtime-Cj8ZWiNS.js";
4
- import { A as r } from "./useTheme-DzXmYZ5V.js";
4
+ import { A as r } from "./useTheme-BOw801nZ.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-ofJbxM4x.js";
3
- import { g as n } from "./tooltip-qB8NlSqV.js";
4
- import { i as r } from "./label-BslhXqL6.js";
3
+ import { g as n } from "./tooltip-Bi36DgYh.js";
4
+ import { i as r } from "./label-MNhNNoN6.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-ofJbxM4x.js";
3
- import { k as n } from "./useTheme-DzXmYZ5V.js";
3
+ import { k as n } from "./useTheme-BOw801nZ.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-Cj8ZWiNS.js";
2
- import { t } from "./capabilities-B3ce_GNu.js";
2
+ import { t } from "./capabilities-D7Ad8-zw.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-DdXAm8iz.js";
2
+ import { g as t, h as n, r } from "./button-B0Xgl-Qn.js";
3
3
  import { t as i } from "./react-ofJbxM4x.js";
4
4
  import { t as a } from "./compiler-runtime-Cj8ZWiNS.js";
5
- import { g as o } from "./tooltip-qB8NlSqV.js";
5
+ import { g as o } from "./tooltip-Bi36DgYh.js";
6
6
  import { t as s } from "./jsx-runtime-DgDPJV9S.js";
7
- import { E as c, w as l } from "./useTheme-DzXmYZ5V.js";
7
+ import { E as c, w as l } from "./useTheme-BOw801nZ.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-DdXAm8iz.js";
2
+ import { a as n, g as r, s as i } from "./button-B0Xgl-Qn.js";
3
3
  import { t as a } from "./react-ofJbxM4x.js";
4
4
  import { t as o } from "./compiler-runtime-Cj8ZWiNS.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-D5D9xEjZ.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-ZgG5Br63.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-DdXAm8iz.js";
2
+ import { g as t, h as n, m as r, o as i } from "./button-B0Xgl-Qn.js";
3
3
  import { t as a } from "./react-ofJbxM4x.js";
4
4
  import { t as o } from "./compiler-runtime-Cj8ZWiNS.js";
5
- import { t as s } from "./tooltip-qB8NlSqV.js";
6
- import { T as c, c as l } from "./toDate-C67bxMWn.js";
5
+ import { t as s } from "./tooltip-Bi36DgYh.js";
6
+ import { T as c, c as l } from "./toDate-DWVp6uE1.js";
7
7
  import { t as u } from "./jsx-runtime-DgDPJV9S.js";
8
- import { n as d } from "./error-banner-B94dcDmP.js";
8
+ import { n as d } from "./error-banner-DzAmP0AQ.js";
9
9
  import { t as f } from "./debounce-C3jyATpc.js";
10
- import { A as p, n as ee } from "./useTheme-DzXmYZ5V.js";
10
+ import { A as p, n as ee } from "./useTheme-BOw801nZ.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-BD6AStMt.js";
14
- import { a as ne, i as re, n as ie, t as g } from "./formats-Cl_67ghI.js";
13
+ import { t as h } from "./useAsyncData-BD7NLQ3_.js";
14
+ import { a as ne, i as re, n as ie, t as g } from "./formats-Q9gwlLyD.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-ewj7q_U5.js";
17
- import { a as ce, n as _ } from "./loader-DEZSzvma.js";
18
- import { t as le } from "./useDeepCompareMemoize-D_HNdyvI.js";
17
+ import { a as ce, n as _ } from "./loader-C9OUkMrj.js";
18
+ import { t as le } from "./useDeepCompareMemoize-CawMGSRU.js";
19
19
  import { t as ue } from "./semaphore-89jsoHtS.js";
20
20
  import { t as de } from "./use-vega-container-remeasure-4DwJbPWu.js";
21
21
  //#region src/plugins/impl/vega/fix-relative-url.ts
@@ -1,9 +1,9 @@
1
- import { i as e } from "./chunk-75Z2AOVW-C4AOleKf.js";
1
+ import { i as e } from "./chunk-75Z2AOVW-AI7CvgKn.js";
2
2
  import { t } from "./src-CA_m4ONl.js";
3
3
  import { n } from "./chunk-Y2CYZVJY-DKKS1VyV.js";
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-1TwWR6gh.js";
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-BSvuTkX4.js";
5
5
  import { t as _ } from "./rough.esm-CtV9AnV1.js";
6
- import { p as v } from "./mermaid-Dnzoxjt1.js";
6
+ import { p as v } from "./mermaid-CEceCleL.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) {
@@ -1,8 +1,8 @@
1
- import { i as e } from "./chunk-75Z2AOVW-C4AOleKf.js";
1
+ import { i as e } from "./chunk-75Z2AOVW-AI7CvgKn.js";
2
2
  import { n as t } from "./src-CA_m4ONl.js";
3
3
  import { n } from "./chunk-Y2CYZVJY-DKKS1VyV.js";
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-1TwWR6gh.js";
5
- import { p as m } from "./mermaid-Dnzoxjt1.js";
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-BSvuTkX4.js";
5
+ import { p as m } from "./mermaid-CEceCleL.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
@@ -2,14 +2,14 @@ import { t as e } from "./linear-Cnaq3Tfb.js";
2
2
  import { n as t } from "./ordinal-c7efuCSS.js";
3
3
  import { t as n } from "./range-BAIvbVHp.js";
4
4
  import { q as r } from "./cubic-OaEBhQPK.js";
5
- import { i } from "./chunk-75Z2AOVW-C4AOleKf.js";
5
+ import { i } from "./chunk-75Z2AOVW-AI7CvgKn.js";
6
6
  import { n as a } from "./init-Ix4LXMlt.js";
7
7
  import { n as o } from "./src-CA_m4ONl.js";
8
8
  import { n as s } from "./chunk-Y2CYZVJY-DKKS1VyV.js";
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-1TwWR6gh.js";
10
- import "./chunk-PWAF6VOD-lNxB9k8z.js";
11
- import { t as b } from "./chunk-GMAD6QVW-vStrMz2P.js";
12
- import { p as x } from "./mermaid-Dnzoxjt1.js";
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-BSvuTkX4.js";
10
+ import "./chunk-PWAF6VOD-D8S9NPCy.js";
11
+ import { t as b } from "./chunk-GMAD6QVW-wnHcn-lH.js";
12
+ import { p as x } from "./mermaid-CEceCleL.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-dev3",
3
+ "version": "0.25.2-dev30",
4
4
  "main": "dist/main.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -99,7 +99,7 @@
99
99
  "date-fns": "^4.4.0",
100
100
  "dequal": "^2.0.3",
101
101
  "dnd-core": "^16.0.1",
102
- "dompurify": "^3.4.14",
102
+ "dompurify": "^3.4.16",
103
103
  "htm": "^3.1.1",
104
104
  "html-react-parser": "^5.2.17",
105
105
  "html-to-image": "1.11.13",
@@ -191,12 +191,12 @@
191
191
  "devDependencies": {
192
192
  "@codecov/vite-plugin": "^1.9.1",
193
193
  "@csstools/postcss-light-dark-function": "^2.0.11",
194
- "@playwright/test": "^1.62.1",
194
+ "@playwright/test": "^1.63.0",
195
195
  "@storybook/addon-docs": "^10.6.0",
196
196
  "@storybook/addon-links": "^10.6.0",
197
197
  "@storybook/react-vite": "^10.6.0",
198
198
  "@testing-library/jest-dom": "^7.0.1",
199
- "@testing-library/react": "^16.3.2",
199
+ "@testing-library/react": "^16.3.3",
200
200
  "@types/dompurify": "^3.2.0",
201
201
  "@types/lodash-es": "^4.17.12",
202
202
  "@types/node": "^24.13.3",
@@ -204,7 +204,7 @@
204
204
  "@types/react": "^19.2.18",
205
205
  "@types/react-dom": "^19.2.5",
206
206
  "@types/timestring": "^6.0.5",
207
- "@vitejs/plugin-react": "^6.1.0",
207
+ "@vitejs/plugin-react": "^6.1.1",
208
208
  "@vitest/coverage-v8": "4.1.11",
209
209
  "blob-polyfill": "^7.0.20220408",
210
210
  "cross-env": "^7.0.3",
@@ -214,7 +214,7 @@
214
214
  "oxc-transform-react": "0.145.0",
215
215
  "oxfmt": "^0.68.0",
216
216
  "oxlint": "^1.83.0",
217
- "postcss": "^8.5.26",
217
+ "postcss": "^8.5.28",
218
218
  "postcss-prefix-selector": "^2.2.0",
219
219
  "react": "^19.2.8",
220
220
  "react-dom": "^19.2.8",
@@ -223,7 +223,7 @@
223
223
  "stylelint-config-standard": "^36.0.1",
224
224
  "tailwindcss": "^4.3.3",
225
225
  "vega-typings": "^2.3.0",
226
- "vite": "^8.2.2",
226
+ "vite": "^8.3.0",
227
227
  "vite-plugin-wasm": "^3.6.0",
228
228
  "vitest": "^4.1.11",
229
229
  "yaml": "^2.9.0"
@@ -0,0 +1,56 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { cleanup, render, screen } from "@testing-library/react";
4
+ import { afterEach, describe, expect, it } from "vitest";
5
+ import { ResultRenderer } from "../tool-result";
6
+
7
+ afterEach(cleanup);
8
+
9
+ describe("ResultRenderer", () => {
10
+ it.each([
11
+ { status: "success", message: "No output was returned." },
12
+ { status: "success", next_steps: ["Run the edited cells."] },
13
+ {
14
+ status: "success",
15
+ action_url: null,
16
+ next_steps: null,
17
+ meta: null,
18
+ message: "Finished",
19
+ },
20
+ {
21
+ status: "success",
22
+ action_url: "/notebook",
23
+ next_steps: ["Review the output."],
24
+ meta: { source: "notebook" },
25
+ cellsToOutput: { cell: { cellOutput: "Hello", consoleOutput: "" } },
26
+ },
27
+ ])("renders structured results with optional fields: %j", (result) => {
28
+ render(<ResultRenderer result={result} />);
29
+
30
+ expect(screen.getByRole("heading", { name: "Tool Result" })).toBeVisible();
31
+ expect(screen.getByText("success")).toBeVisible();
32
+ });
33
+
34
+ it("displays messages and tool-specific output without metadata", () => {
35
+ render(
36
+ <ResultRenderer
37
+ result={{
38
+ status: "success",
39
+ message: "Cells finished running.",
40
+ cellsToOutput: { cell: { cellOutput: "Hello", consoleOutput: "" } },
41
+ }}
42
+ />,
43
+ );
44
+
45
+ expect(screen.getByText("Cells finished running.")).toBeVisible();
46
+ expect(screen.getByText("cellsToOutput")).toBeVisible();
47
+ expect(screen.getByText(/"cellOutput": "Hello"/)).toBeVisible();
48
+ });
49
+
50
+ it("preserves the fallback for unstructured results", () => {
51
+ render(<ResultRenderer result="Plain text result" />);
52
+
53
+ expect(screen.queryByRole("heading", { name: "Tool Result" })).toBeNull();
54
+ expect(screen.getByText("Plain text result")).toBeVisible();
55
+ });
56
+ });
@@ -21,9 +21,9 @@ function isUninformative(value: unknown): boolean {
21
21
  const SuccessResultSchema = z.looseObject({
22
22
  status: z.string().default("success"),
23
23
  auth_required: z.boolean().default(false),
24
- action_url: z.any(),
25
- next_steps: z.any(),
26
- meta: z.any(),
24
+ action_url: z.any().optional(),
25
+ next_steps: z.any().optional(),
26
+ meta: z.any().optional(),
27
27
  message: z.string().nullish(),
28
28
  });
29
29
 
@@ -4,6 +4,31 @@ import { describe, expect, it } from "vitest";
4
4
  import { ChartSchema } from "../schemas";
5
5
 
6
6
  describe("ChartSchema", () => {
7
+ it.each(["hours", "yearmonthdatehours"] as const)(
8
+ "preserves the %s time unit in saved chart configurations",
9
+ (timeUnit) => {
10
+ const column = {
11
+ field: "timestamp",
12
+ selectedDataType: "temporal",
13
+ sort: "ascending",
14
+ timeUnit,
15
+ };
16
+ const config = {
17
+ general: {
18
+ xColumn: { ...column, aggregate: "none" },
19
+ yColumn: { ...column, aggregate: "none" },
20
+ facet: {
21
+ row: { ...column, linkYAxis: true, binned: true, maxbins: 6 },
22
+ column: { ...column, linkXAxis: true, binned: true, maxbins: 6 },
23
+ },
24
+ },
25
+ tooltips: { auto: true, fields: [] },
26
+ };
27
+
28
+ expect(ChartSchema.parse(config)).toEqual(config);
29
+ },
30
+ );
31
+
7
32
  it("keeps a known axis column type", () => {
8
33
  const result = ChartSchema.parse({
9
34
  general: { xColumn: { field: "count", type: "integer" } },
@@ -69,30 +69,33 @@ describe("getAxisEncoding", () => {
69
69
  });
70
70
  });
71
71
 
72
- it("should return correct encoding for temporal field with timeUnit", () => {
73
- const result = getAxisEncoding(
74
- {
75
- field: "date",
76
- selectedDataType: "temporal",
77
- aggregate: NONE_VALUE,
78
- timeUnit: "yearmonth",
79
- },
80
- undefined,
81
- "Date",
82
- undefined,
83
- ChartType.LINE,
84
- );
72
+ it.each(["yearmonth", "hours", "yearmonthdatehours"] as const)(
73
+ "should preserve the %s time unit in temporal axis encodings",
74
+ (timeUnit) => {
75
+ const result = getAxisEncoding(
76
+ {
77
+ field: "date",
78
+ selectedDataType: "temporal",
79
+ aggregate: NONE_VALUE,
80
+ timeUnit,
81
+ },
82
+ undefined,
83
+ "Date",
84
+ undefined,
85
+ ChartType.LINE,
86
+ );
85
87
 
86
- expect(result).toEqual({
87
- field: "date",
88
- type: "temporal",
89
- bin: undefined,
90
- title: "Date",
91
- stack: undefined,
92
- aggregate: undefined,
93
- timeUnit: "yearmonth",
94
- });
95
- });
88
+ expect(result).toEqual({
89
+ field: "date",
90
+ type: "temporal",
91
+ bin: undefined,
92
+ title: "Date",
93
+ stack: undefined,
94
+ aggregate: undefined,
95
+ timeUnit,
96
+ });
97
+ },
98
+ );
96
99
 
97
100
  it("should return correct encoding for categorical field", () => {
98
101
  const result = getAxisEncoding(
@@ -147,17 +147,18 @@ export const TIME_UNIT_DESCRIPTIONS: Record<
147
147
  [title: string, description: string]
148
148
  > = {
149
149
  year: ["Year", "2025"],
150
- quarter: ["Quarter", "Q1 2025"],
151
- month: ["Month", "Jan 2025"],
152
- week: ["Week", "Jan 01, 2025"],
153
- day: ["Day", "Jan 01, 2025"],
154
- hours: ["Hour", "Jan 01, 2025 12:00"],
155
- minutes: ["Minute", "Jan 01, 2025 12:34"],
156
- seconds: ["Second", "Jan 01, 2025 12:34:56"],
157
- milliseconds: ["Millisecond", "Jan 01, 2025 12:34:56.789"],
158
- date: ["Date", "Jan 01, 2025"],
159
- dayofyear: ["Day of Year", "Day 1 of 2025"],
150
+ quarter: ["Quarter of year", "Q1"],
151
+ month: ["Month of year", "Jan"],
152
+ week: ["Week of year", "Week 1"],
153
+ day: ["Day of week", "Sunday"],
154
+ hours: ["Hour of day", "12:00"],
155
+ minutes: ["Minute of hour", "34"],
156
+ seconds: ["Second of minute", "56"],
157
+ milliseconds: ["Millisecond of second", "789"],
158
+ date: ["Day of month", "1"],
159
+ dayofyear: ["Day of year", "Day 1"],
160
160
  yearmonth: ["Year Month", "Jan 2025"],
161
161
  yearmonthdate: ["Year Month Date", "Jan 01, 2025"],
162
+ yearmonthdatehours: ["Year Month Date Hours", "Jan 01, 2025 12:00"],
162
163
  monthdate: ["Month Date", "Jan 01"],
163
164
  };
@@ -40,6 +40,7 @@ export const SINGLE_TIME_UNITS = [
40
40
  export const COMBINED_TIME_UNITS = [
41
41
  "yearmonth",
42
42
  "yearmonthdate",
43
+ "yearmonthdatehours",
43
44
  "monthdate",
44
45
  ] as const;
45
46
  export const TIME_UNITS = [
@@ -0,0 +1,42 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { describe, expect, it } from "vitest";
4
+ import { MockNotebook } from "@/__mocks__/notebook";
5
+ import type { OutputMessage } from "@/core/kernel/messages";
6
+ import { outputExpansionConfigs } from "../useSetOutputsExpanded";
7
+
8
+ const output: OutputMessage = {
9
+ channel: "output",
10
+ mimetype: "text/plain",
11
+ data: "hello",
12
+ timestamp: 0,
13
+ };
14
+
15
+ describe("outputExpansionConfigs", () => {
16
+ const [withOutput, withoutOutput, expanded, expandedWithoutOutput] =
17
+ MockNotebook.cellIds();
18
+ const notebook = MockNotebook.notebookState({
19
+ cellData: {
20
+ [withOutput]: {},
21
+ [withoutOutput]: {},
22
+ [expanded]: { config: { expand_output: true } },
23
+ [expandedWithoutOutput]: { config: { expand_output: true } },
24
+ },
25
+ cellRuntime: {
26
+ [withOutput]: { output },
27
+ [expanded]: { output },
28
+ },
29
+ });
30
+
31
+ it("expands clamped cells with output and skips cells without output", () => {
32
+ expect(outputExpansionConfigs(notebook, true)).toEqual({
33
+ [withOutput]: { expand_output: true },
34
+ });
35
+ });
36
+
37
+ it("clamps expanded cells with output and skips cells without output", () => {
38
+ expect(outputExpansionConfigs(notebook, false)).toEqual({
39
+ [expanded]: { expand_output: false },
40
+ });
41
+ });
42
+ });
@@ -7,6 +7,8 @@ import {
7
7
  CheckIcon,
8
8
  ChevronDownCircleIcon,
9
9
  ChevronRightCircleIcon,
10
+ ChevronsDownUpIcon,
11
+ ChevronsUpDownIcon,
10
12
  ClipboardCopyIcon,
11
13
  CodeIcon,
12
14
  CommandIcon,
@@ -100,6 +102,7 @@ import type { ActionButton } from "./types";
100
102
  import { useCopyNotebook } from "./useCopyNotebook";
101
103
  import { useRestartKernel } from "./useRestartKernel";
102
104
  import { useSetCodeVisibility } from "./useSetCodeVisibility";
105
+ import { useSetOutputsExpanded } from "./useSetOutputsExpanded";
103
106
 
104
107
  const NOOP_HANDLER = (event?: Event) => {
105
108
  event?.preventDefault();
@@ -118,6 +121,7 @@ export function useNotebookActions({
118
121
  const [viewState] = useAtom(viewStateAtom);
119
122
  const kioskMode = useAtomValue(kioskModeAtom);
120
123
  const setCodeVisibility = useSetCodeVisibility();
124
+ const setOutputsExpanded = useSetOutputsExpanded();
121
125
  const [resolvedConfig] = useResolvedMarimoConfig();
122
126
  const capabilities = useAtomValue(capabilitiesAtom);
123
127
  const aiEnabled = useAtomValue(aiEnabledAtom);
@@ -596,6 +600,22 @@ export function useNotebookActions({
596
600
  handle: () => setCodeVisibility(true, "markdown"),
597
601
  redundant: true,
598
602
  },
603
+ {
604
+ icon: <ChevronsUpDownIcon size={14} strokeWidth={1.5} />,
605
+ label: "Expand all outputs",
606
+ hotkey: "global.expandAllOutputs",
607
+ hidden: viewState.mode !== "edit",
608
+ handle: () => setOutputsExpanded(true),
609
+ redundant: true,
610
+ },
611
+ {
612
+ icon: <ChevronsDownUpIcon size={14} strokeWidth={1.5} />,
613
+ label: "Clamp all outputs",
614
+ hotkey: "global.clampAllOutputs",
615
+ hidden: viewState.mode !== "edit",
616
+ handle: () => setOutputsExpanded(false),
617
+ redundant: true,
618
+ },
599
619
  {
600
620
  icon: <ChevronRightCircleIcon size={14} strokeWidth={1.5} />,
601
621
  label: "Collapse all sections",