@marimo-team/frontend 0.23.3-dev4 → 0.23.3-dev41

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 (630) hide show
  1. package/dist/assets/{CellStatus-Dtymd7Mw.js → CellStatus-BRcxaA-Z.js} +1 -1
  2. package/dist/assets/{ConnectedDataExplorerComponent-ChNjqWW0.js → ConnectedDataExplorerComponent-Bxogo_Sw.js} +1 -1
  3. package/dist/assets/{DeferredRequestRegistry-C2V-hXrK.js → DeferredRequestRegistry-Bobqy1XF.js} +1 -1
  4. package/dist/assets/{ImperativeModal-CAFE3UV7.js → ImperativeModal-QWJWbLVR.js} +1 -1
  5. package/dist/assets/JsonOutput-zJfSu-Vk.js +49 -0
  6. package/dist/assets/LazyAnyLanguageCodeMirror-B4dqgtrW.js +2 -0
  7. package/dist/assets/{MarimoErrorOutput-CUkxKVSp.js → MarimoErrorOutput-BGCTswmw.js} +1 -1
  8. package/dist/assets/{RSPContexts-CrATdGvz.js → RSPContexts-Bxv3gv46.js} +1 -1
  9. package/dist/assets/RenderHTML-DT8P6T1l.js +1 -0
  10. package/dist/assets/{add-cell-with-ai-apfqz2QF.js → add-cell-with-ai-BKhUWiT4.js} +1 -1
  11. package/dist/assets/{add-connection-dialog-D6XFTnTb.js → add-connection-dialog-DChyqh-3.js} +1 -1
  12. package/dist/assets/{agent-panel-D7n2noTX.js → agent-panel-CcLuIYse.js} +1 -1
  13. package/dist/assets/{ai-model-dropdown-CMNpHk5I.js → ai-model-dropdown-Cq8Bx0V5.js} +1 -1
  14. package/dist/assets/{any-language-editor-CFmH0GoP.js → any-language-editor-DxmolZrV.js} +1 -1
  15. package/dist/assets/apl-CuOurP-c.js +1 -0
  16. package/dist/assets/{app-config-button-CXAAPUFL.js → app-config-button-DA64Zwmh.js} +1 -1
  17. package/dist/assets/{arc-3DY1fURi.js → arc-dPVZ2r1X.js} +1 -1
  18. package/dist/assets/{architecture-7HQA4BMR-CKjkd5Dl.js → architecture-7HQA4BMR-CDlW2bIF.js} +1 -1
  19. package/dist/assets/{architectureDiagram-VXUJARFQ-x1tfs-Zy.js → architectureDiagram-VXUJARFQ-BIxSxJ1n.js} +1 -1
  20. package/dist/assets/asciiarmor-C4q0KAuh.js +1 -0
  21. package/dist/assets/asn1-gmsDz0li.js +1 -0
  22. package/dist/assets/{blockDiagram-VD42YOAC-DsnHpCid.js → blockDiagram-VD42YOAC-Bhz_qfg3.js} +1 -1
  23. package/dist/assets/brainfuck-RlYwG6Xx.js +1 -0
  24. package/dist/assets/{c4Diagram-YG6GDRKO-D32cjsO5.js → c4Diagram-YG6GDRKO-C2TPKPvJ.js} +1 -1
  25. package/dist/assets/{cache-panel-_zalrRwf.js → cache-panel-Ks8PpcN1.js} +1 -1
  26. package/dist/assets/{cell-editor-BUrhiKcX.js → cell-editor-BqklzNDV.js} +3 -3
  27. package/dist/assets/{cell-link-owqfXuA4.js → cell-link-DiZacqDz.js} +1 -1
  28. package/dist/assets/{cells-BA9ZN5Xy.js → cells-_QgKZKXb.js} +5 -5
  29. package/dist/assets/channel-DrzQ4dkV.js +1 -0
  30. package/dist/assets/{chat-display-AB-C2j6p.js → chat-display-7P_28VVE.js} +1 -1
  31. package/dist/assets/{chat-panel-C1Evz8wb.js → chat-panel-BQp1b73y.js} +1 -1
  32. package/dist/assets/{chat-ui-CcArYoMw.js → chat-ui-BNeL7YZB.js} +1 -1
  33. package/dist/assets/{chunk-4BX2VUAB-hp7-9s5b.js → chunk-4BX2VUAB-BtkoEUm5.js} +1 -1
  34. package/dist/assets/chunk-55IACEB6-C0WB3ojj.js +1 -0
  35. package/dist/assets/{chunk-5FQGJX7Z-wbiBygI_.js → chunk-5FQGJX7Z-CQS0x34U.js} +3 -3
  36. package/dist/assets/{chunk-ABZYJK2D-CSzcbtsR.js → chunk-ABZYJK2D-Djqzm08o.js} +3 -3
  37. package/dist/assets/{chunk-ATLVNIR6-BGYBu2zE.js → chunk-ATLVNIR6-BLh4jD_n.js} +1 -1
  38. package/dist/assets/{chunk-B4BG7PRW-S78japIA.js → chunk-B4BG7PRW-CEbAymbQ.js} +1 -1
  39. package/dist/assets/{chunk-CVBHYZKI-DJ6aHNEG.js → chunk-CVBHYZKI-DU48rJVu.js} +1 -1
  40. package/dist/assets/{chunk-DI55MBZ5-B1Vz0MTl.js → chunk-DI55MBZ5-D27slPkl.js} +1 -1
  41. package/dist/assets/{chunk-EXTU4WIE-D-Spa6rW.js → chunk-EXTU4WIE-CIsrjnFi.js} +1 -1
  42. package/dist/assets/{chunk-FMBD7UC4-DiqdRLvx.js → chunk-FMBD7UC4-Dt9Umy1r.js} +1 -1
  43. package/dist/assets/{chunk-HN2XXSSU-CigyI152.js → chunk-HN2XXSSU-Bdbi3Mns.js} +1 -1
  44. package/dist/assets/{chunk-JA3XYJ7Z-BJGCDHDS.js → chunk-JA3XYJ7Z-BTrWHP3y.js} +1 -1
  45. package/dist/assets/{chunk-JZLCHNYA-lm1LBIfJ.js → chunk-JZLCHNYA-LclGfauS.js} +1 -1
  46. package/dist/assets/{chunk-MI3HLSF2-vtv46ho2.js → chunk-MI3HLSF2-n3vxgSbN.js} +1 -1
  47. package/dist/assets/{chunk-N4CR4FBY-BQWUF0Ly.js → chunk-N4CR4FBY-w0eE8xM0.js} +2 -2
  48. package/dist/assets/{chunk-QN33PNHL-Buv0c3y8.js → chunk-QN33PNHL-f1vj2iOo.js} +1 -1
  49. package/dist/assets/{chunk-QXUST7PY-tI3bGlcO.js → chunk-QXUST7PY-qfZjyLmh.js} +1 -1
  50. package/dist/assets/{chunk-QZHKN3VN-BWO63iFa.js → chunk-QZHKN3VN-Cp6Fo6NS.js} +1 -1
  51. package/dist/assets/{chunk-S3R3BYOJ-BwE-T8-d.js → chunk-S3R3BYOJ-CcarQkcq.js} +1 -1
  52. package/dist/assets/{chunk-TZMSLE5B-zQ3MzIy5.js → chunk-TZMSLE5B-CWbra1hF.js} +1 -1
  53. package/dist/assets/classDiagram-2ON5EDUG-BDDARHRt.js +1 -0
  54. package/dist/assets/classDiagram-v2-WZHVMYZB-DCy5PwnC.js +1 -0
  55. package/dist/assets/{clike-B5Yp94w5.js → clike-0Uxq7Mmj.js} +1 -1
  56. package/dist/assets/clojure-DaWCBM5I.js +1 -0
  57. package/dist/assets/cmake-Nobmxv0n.js +1 -0
  58. package/dist/assets/cobol--NmnvDWE.js +1 -0
  59. package/dist/assets/{code-block-37QAKDTI-Bf-3UT2Z.js → code-block-37QAKDTI-DIqDJgVj.js} +1 -1
  60. package/dist/assets/coffeescript-Cv1Wf46X.js +1 -0
  61. package/dist/assets/{column-preview-BbSZl4gC.js → column-preview-C2_n8Cec.js} +1 -1
  62. package/dist/assets/{command-DQS2IzwJ.js → command-DAtXz-Gx.js} +1 -1
  63. package/dist/assets/{command-palette-Cc7XXZHG.js → command-palette-Ck1uQB30.js} +1 -1
  64. package/dist/assets/{common-CakcoJKZ.js → common-CP7IrRbz.js} +1 -1
  65. package/dist/assets/commonlisp-8PbUodZQ.js +1 -0
  66. package/dist/assets/{components-DVzYtTDe.js → components-BHpyAs_N.js} +1 -1
  67. package/dist/assets/components-C7yXo-zq.js +1 -0
  68. package/dist/assets/{config-Calf6e81.js → config-BwY7xK-l.js} +1 -1
  69. package/dist/assets/{context-BrNoqz7t.js → context-DgMiuV-M.js} +1 -1
  70. package/dist/assets/{copy-icon-D189KR4Z.js → copy-icon-D6J-Qe0V.js} +1 -1
  71. package/dist/assets/{cose-bilkent-S5V4N54A-DT_V8ZfF.js → cose-bilkent-S5V4N54A-w2ZbuMrq.js} +1 -1
  72. package/dist/assets/crystal-DOOJCjhq.js +1 -0
  73. package/dist/assets/{css-B68S0me4.js → css-vLkD8PfS.js} +1 -1
  74. package/dist/assets/cypher-Aazxis5r.js +1 -0
  75. package/dist/assets/d-B-5Jnu40.js +1 -0
  76. package/dist/assets/{dagre-6UL2VRFP-DGYXMu3i.js → dagre-6UL2VRFP-DPsGmD7I.js} +1 -1
  77. package/dist/assets/{data-grid-overlay-editor-CD6KDhh4.js → data-grid-overlay-editor--tsDL5t_.js} +1 -1
  78. package/dist/assets/{datasource-BZ77nRPA.js → datasource-BwNTnVse.js} +1 -1
  79. package/dist/assets/{dates-CtmdgiVR.js → dates-C-8zX5--.js} +1 -1
  80. package/dist/assets/{dependency-graph-panel-DJodxi-n.js → dependency-graph-panel-DWJUNQBd.js} +1 -1
  81. package/dist/assets/{diagram-PSM6KHXK-Df7m0-Bk.js → diagram-PSM6KHXK-B5QExXBA.js} +1 -1
  82. package/dist/assets/{diagram-QEK2KX5R-BC5JXjfp.js → diagram-QEK2KX5R-B-41avP4.js} +1 -1
  83. package/dist/assets/{diagram-S2PKOQOG-D6E97R3h.js → diagram-S2PKOQOG-CuAoGDsR.js} +1 -1
  84. package/dist/assets/diff-8GFZiZ2V.js +1 -0
  85. package/dist/assets/dist-2R4BmaTU.js +1 -0
  86. package/dist/assets/{dist-CD7-c8A4.js → dist-78cHWCwm.js} +1 -1
  87. package/dist/assets/dist-7la8MlmI.js +1 -0
  88. package/dist/assets/{dist-Cb9wJQiu.js → dist-B8l8kyRO.js} +1 -1
  89. package/dist/assets/{dist-BvefCWaz.js → dist-BCAHuLK8.js} +1 -1
  90. package/dist/assets/dist-BDO57Gzu.js +1 -0
  91. package/dist/assets/{dist-BwejP-9J.js → dist-Bd6jkjtM.js} +1 -1
  92. package/dist/assets/{dist-C5pbZROJ.js → dist-BfwIwU8S.js} +1 -1
  93. package/dist/assets/{dist-DSv2WUkf.js → dist-BjR_2YCR.js} +1 -1
  94. package/dist/assets/{dist-D8mC0RLm.js → dist-BxAV3E_D.js} +1 -1
  95. package/dist/assets/{dist-fKK_jBk2.js → dist-C6ZECnB-.js} +1 -1
  96. package/dist/assets/{dist-G8rBPeDP.js → dist-CE09e8bx.js} +1 -1
  97. package/dist/assets/dist-CYeDRMz-.js +1 -0
  98. package/dist/assets/{dist-G3xLh7ZX.js → dist-CZoX3_w7.js} +1 -1
  99. package/dist/assets/dist-Ct7IOnPn.js +1 -0
  100. package/dist/assets/{dist-CM2zL7eu.js → dist-D9A9VND-.js} +1 -1
  101. package/dist/assets/{dist-CSLszKKS.js → dist-DG5oYwLf.js} +1 -1
  102. package/dist/assets/dist-DMrvUyzG.js +1 -0
  103. package/dist/assets/{dist-DX-ejWLY.js → dist-DX7lwwkF.js} +1 -1
  104. package/dist/assets/dist-DbrS_VZM.js +1 -0
  105. package/dist/assets/{dist-D9brkCnf.js → dist-DrmtAiKa.js} +1 -1
  106. package/dist/assets/{dist-CdAQ8eZ9.js → dist-DrwAJH5c.js} +1 -1
  107. package/dist/assets/{dist-BuSjuYCJ.js → dist-DwRhpGvx.js} +1 -1
  108. package/dist/assets/{dist-BvpmHCI2.js → dist-EeiXxq6X.js} +1 -1
  109. package/dist/assets/dist-LftDLXf7.js +1 -0
  110. package/dist/assets/{dist-HIpA48xV.js → dist-Q7HIqK0H.js} +1 -1
  111. package/dist/assets/{dist-D8d8D49Y.js → dist-Sg8yY2ZO.js} +1 -1
  112. package/dist/assets/dist-TTJY3rXz.js +1 -0
  113. package/dist/assets/{dist-C2akIBaE.js → dist-b34Ig78W.js} +1 -1
  114. package/dist/assets/dist-u-Lxqf65.js +1 -0
  115. package/dist/assets/{dockerfile-COvjaTvv.js → dockerfile-BG4x0ExJ.js} +1 -1
  116. package/dist/assets/{documentation-panel-DMXEUS7v.js → documentation-panel-BJnrDC1G.js} +1 -1
  117. package/dist/assets/{download-rCRPD7IF.js → download-Bc8oaRxn.js} +1 -1
  118. package/dist/assets/dtd-DbhDFQ4b.js +1 -0
  119. package/dist/assets/dylan-4K5wZgOx.js +1 -0
  120. package/dist/assets/ecl-BCQ-LzuG.js +1 -0
  121. package/dist/assets/{edit-page-CK943x81.js → edit-page-BUArB_ce.js} +3 -3
  122. package/dist/assets/eiffel-DjgNAio4.js +1 -0
  123. package/dist/assets/elm-BJzUTgDF.js +1 -0
  124. package/dist/assets/{erDiagram-Q2GNP2WA-AvxewI5H.js → erDiagram-Q2GNP2WA-DnP7h2-r.js} +1 -1
  125. package/dist/assets/erlang-BMwCh1Tz.js +1 -0
  126. package/dist/assets/{error-banner-BxlXxssi.js → error-banner-B6M4W7BS.js} +1 -1
  127. package/dist/assets/{error-panel-4rKxybFL.js → error-panel-C3s8IlRa.js} +1 -1
  128. package/dist/assets/es-DpJU8Hx8.js +5 -0
  129. package/dist/assets/{esm-CcSYdGmP.js → esm-B4U2RMiA.js} +1 -1
  130. package/dist/assets/{esm-jhgLTcf6.js → esm-BGvvz4bU.js} +1 -1
  131. package/dist/assets/{factor-PbpmJuj6.js → factor-B-0VZGQP.js} +1 -1
  132. package/dist/assets/factor-DuQK79vi.js +1 -0
  133. package/dist/assets/{field-Dpiu3eud.js → field-Dolqshm5.js} +1 -1
  134. package/dist/assets/file-explorer-panel-Dk5S33G1.js +26 -0
  135. package/dist/assets/{file-icons-CSF7UWQn.js → file-icons-uyLXhwTt.js} +1 -1
  136. package/dist/assets/file-name-input-Cx8sGgtD.js +3 -0
  137. package/dist/assets/{floating-outline-DzcyDJwQ.js → floating-outline-CGwx3Uc3.js} +1 -1
  138. package/dist/assets/{flowDiagram-NV44I4VS-BqW0suiP.js → flowDiagram-NV44I4VS-V3Xf7aMp.js} +1 -1
  139. package/dist/assets/{focus-BRfyPUhi.js → focus-Ci7q4lAK.js} +1 -1
  140. package/dist/assets/{form-BUVFJb5I.js → form-kVlV8UJh.js} +1 -1
  141. package/dist/assets/{formats-CQbVJYLi.js → formats-O_Kup2es.js} +1 -1
  142. package/dist/assets/{formatting-CbFi9xG8.js → formatting-cNkBQVu3.js} +1 -1
  143. package/dist/assets/forth-CN0H2hBb.js +1 -0
  144. package/dist/assets/fortran-D-JaE1fl.js +1 -0
  145. package/dist/assets/{gallery-page-ClCkynuR.js → gallery-page-ry801rEh.js} +1 -1
  146. package/dist/assets/{ganttDiagram-JELNMOA3-CeCvJWgC.js → ganttDiagram-JELNMOA3-CpnbMA7j.js} +1 -1
  147. package/dist/assets/gas-B-bID6UX.js +1 -0
  148. package/dist/assets/gherkin-JGxOpXhU.js +1 -0
  149. package/dist/assets/{gitGraph-G5XIXVHT-nrZ-BMna.js → gitGraph-G5XIXVHT-CT2LFSad.js} +1 -1
  150. package/dist/assets/{gitGraphDiagram-V2S2FVAM-Dn1AbOWu.js → gitGraphDiagram-V2S2FVAM-Da6kLjST.js} +1 -1
  151. package/dist/assets/{glide-data-editor-CKiZFI5U.js → glide-data-editor-Bsfs3Z8D.js} +4 -4
  152. package/dist/assets/{globals-DY_dRKpv.js → globals-fN2Lim68.js} +1 -1
  153. package/dist/assets/groovy-BHPB9Hfx.js +1 -0
  154. package/dist/assets/haskell-By6RbCCv.js +1 -0
  155. package/dist/assets/haxe-HQiVsOCF.js +1 -0
  156. package/dist/assets/home-page-CUCcuheh.js +4 -0
  157. package/dist/assets/{hooks-CK1ac3iV.js → hooks-CVOMPk9n.js} +1 -1
  158. package/dist/assets/{html-to-image-BOWUS6J2.js → html-to-image-s8Gi2a0d.js} +1 -1
  159. package/dist/assets/idl-B2iocbwq.js +1 -0
  160. package/dist/assets/{index-DCq7udug.js → index-AQQQ__hU.js} +8 -8
  161. package/dist/assets/{info-VBDWY6EO-Bn_7XCeN.js → info-VBDWY6EO-Dek9l4Y7.js} +1 -1
  162. package/dist/assets/infoDiagram-HS3SLOUP-DbESo9Nm.js +2 -0
  163. package/dist/assets/{input-2egRGOhT.js → input-gOeJx-hY.js} +1 -1
  164. package/dist/assets/javascript-CTjlnOSz.js +1 -0
  165. package/dist/assets/{journeyDiagram-XKPGCS4Q-BQL61Vfo.js → journeyDiagram-XKPGCS4Q-BXrwe60A.js} +1 -1
  166. package/dist/assets/julia-BiUkdI9P.js +1 -0
  167. package/dist/assets/{kanban-definition-3W4ZIXB7-CMoUF4Qw.js → kanban-definition-3W4ZIXB7-DUU5VV3y.js} +1 -1
  168. package/dist/assets/katex-BpW3cI17.js +1 -0
  169. package/dist/assets/{kiosk-mode-BJNsfVZJ.js → kiosk-mode-PchJOoW7.js} +1 -1
  170. package/dist/assets/{layout-0Xp7ABJw.js → layout-BZFYst8S.js} +3 -3
  171. package/dist/assets/{line-BCZzhM6G.js → line-BGH_46b5.js} +1 -1
  172. package/dist/assets/{linear-DxS7NPzz.js → linear-DPcd3E-t.js} +1 -1
  173. package/dist/assets/{links-DhwG_EVu.js → links-DJCEkOLM.js} +1 -1
  174. package/dist/assets/livescript-uNIpKRlq.js +1 -0
  175. package/dist/assets/{logs-panel-bp6XOaLO.js → logs-panel-XG-10F8K.js} +1 -1
  176. package/dist/assets/{loro_wasm_bg-DpX928kr.js → loro_wasm_bg-BzwizXI_.js} +1 -1
  177. package/dist/assets/lua-CMIwWFMm.js +1 -0
  178. package/dist/assets/{markdown-renderer-3M2UXZOE.js → markdown-renderer-Cown6yO8.js} +3 -3
  179. package/dist/assets/mathematica-eDJrChdG.js +1 -0
  180. package/dist/assets/mbox-zqvBlhy3.js +1 -0
  181. package/dist/assets/mermaid-4DMBBIKO-CMn6CB3M.js +1 -0
  182. package/dist/assets/{mermaid-CI6k86rB.js → mermaid-LF8PrN7e.js} +3 -3
  183. package/dist/assets/{mermaid-parser.core-B0EhnNjP.js → mermaid-parser.core-C7QPzAah.js} +2 -2
  184. package/dist/assets/{mhchem-Bzl65iLm.js → mhchem-DJIKMDhe.js} +1 -1
  185. package/dist/assets/{mindmap-definition-VGOIOE7T-C0BN8YhO.js → mindmap-definition-VGOIOE7T-h5az-Gzm.js} +1 -1
  186. package/dist/assets/mirc-DA5aApOX.js +1 -0
  187. package/dist/assets/mllike-bIsNpdn1.js +1 -0
  188. package/dist/assets/modelica-0mx6heI0.js +1 -0
  189. package/dist/assets/mscgen-BKLWiiDn.js +1 -0
  190. package/dist/assets/mumps-5_kXgafg.js +1 -0
  191. package/dist/assets/{name-cell-input-CUkoykAD.js → name-cell-input-o3llo2cQ.js} +1 -1
  192. package/dist/assets/{nsis-BbDlITQ-.js → nsis-DGDbP9K4.js} +1 -1
  193. package/dist/assets/nsis-DOhuqhNG.js +1 -0
  194. package/dist/assets/ntriples-BWf6tqTo.js +1 -0
  195. package/dist/assets/{number-overlay-editor-DJEXT_Ye.js → number-overlay-editor-BNttkvY4.js} +1 -1
  196. package/dist/assets/octave-DmFvn7Va.js +1 -0
  197. package/dist/assets/{ordinal-DTOdb5Da.js → ordinal-COKHkltN.js} +1 -1
  198. package/dist/assets/{outline-panel-s7vxHE_P.js → outline-panel-DRIKTKZY.js} +1 -1
  199. package/dist/assets/oz-TIwA1cRs.js +1 -0
  200. package/dist/assets/{packages-panel-CDb4sauq.js → packages-panel-B6wpAt69.js} +1 -1
  201. package/dist/assets/{packet-DYOGHKS2-B53MIhbR.js → packet-DYOGHKS2-DlIjAe6N.js} +1 -1
  202. package/dist/assets/{panels-s8gQr6G_.js → panels-Dp6Q1Mvz.js} +1 -1
  203. package/dist/assets/pascal-BFfHjByI.js +1 -0
  204. package/dist/assets/pathUtils-B1w9iv-i.js +1 -0
  205. package/dist/assets/paths-2eb7kMpE.js +1 -0
  206. package/dist/assets/perl-iyEBGoKl.js +1 -0
  207. package/dist/assets/{pie-VRWISCQL-CsQYRyI_.js → pie-VRWISCQL-CY-XhoDk.js} +1 -1
  208. package/dist/assets/{pieDiagram-ADFJNKIX-CZ1pBex_.js → pieDiagram-ADFJNKIX-C8MBDnEw.js} +1 -1
  209. package/dist/assets/pig-Du8JEd9u.js +1 -0
  210. package/dist/assets/powershell-rJPOSwVp.js +1 -0
  211. package/dist/assets/{precisionRound-BMPhtTJQ.js → precisionRound-DaoicKhB.js} +1 -1
  212. package/dist/assets/{process-output-C6_eNZv8.js → process-output-D2bI7SXv.js} +1 -1
  213. package/dist/assets/properties-B7p1o35g.js +1 -0
  214. package/dist/assets/protobuf-DSVPm4uR.js +1 -0
  215. package/dist/assets/{pug-B2p6efPp.js → pug-5wW7Sn9S.js} +1 -1
  216. package/dist/assets/pug-BBnJinJ-.js +1 -0
  217. package/dist/assets/puppet-CvB_7oA0.js +1 -0
  218. package/dist/assets/python-D-LGD-zO.js +1 -0
  219. package/dist/assets/q-s96Dgstm.js +1 -0
  220. package/dist/assets/{quadrantDiagram-AYHSOK5B-D6LNQBr8.js → quadrantDiagram-AYHSOK5B-Behe9yHt.js} +1 -1
  221. package/dist/assets/r-DCKN0Q_M.js +1 -0
  222. package/dist/assets/{radar-ZZBFDIW7-DixuyYGz.js → radar-ZZBFDIW7-i-Te6Y8v.js} +1 -1
  223. package/dist/assets/react-vega-CPP33Ky2.js +1 -0
  224. package/dist/assets/{react-vega-D3GJC5Ll.js → react-vega-FSXcjjhW.js} +1 -1
  225. package/dist/assets/{readonly-python-code-BBLUUIbP.js → readonly-python-code-BahUauZ9.js} +1 -1
  226. package/dist/assets/{request-registry-yZbbPZkh.js → request-registry-BoWteoOD.js} +1 -1
  227. package/dist/assets/{requirementDiagram-UZGBJVZJ-BQCIkW22.js → requirementDiagram-UZGBJVZJ-BZ7h3AoJ.js} +1 -1
  228. package/dist/assets/{reveal-component-CT2scTNG.js → reveal-component-DWnqsE1_.js} +1 -1
  229. package/dist/assets/rpm-DKF6hj80.js +1 -0
  230. package/dist/assets/ruby-DrHWYpO-.js +1 -0
  231. package/dist/assets/{run-page-BebSJHhp.js → run-page-DiTeOCSw.js} +1 -1
  232. package/dist/assets/{sankeyDiagram-TZEHDZUN-WXVSVZRc.js → sankeyDiagram-TZEHDZUN-Co7WU0tF.js} +1 -1
  233. package/dist/assets/sas-Bf--oEyw.js +1 -0
  234. package/dist/assets/scheme-BZSq5_CL.js +1 -0
  235. package/dist/assets/{scratchpad-panel-CPn_yM49.js → scratchpad-panel-DDqb_fyf.js} +1 -1
  236. package/dist/assets/{secrets-panel-B6HrST_M.js → secrets-panel-Bxz9BsLr.js} +1 -1
  237. package/dist/assets/{sequenceDiagram-WL72ISMW-FSYTKWFS.js → sequenceDiagram-WL72ISMW-BKeDY4nC.js} +1 -1
  238. package/dist/assets/session-panel-NjZNmi9U.js +1 -0
  239. package/dist/assets/{share-CJEPnWjm.js → share-C7-yIyYZ.js} +1 -1
  240. package/dist/assets/shell-C5LsobAY.js +1 -0
  241. package/dist/assets/sieve-B6cTRfjv.js +1 -0
  242. package/dist/assets/{slide-CdqatvaH.js → slide-C5Pp2eO8.js} +1 -1
  243. package/dist/assets/smalltalk-B-ZeF8oP.js +1 -0
  244. package/dist/assets/{snippets-panel-tfceTIEM.js → snippets-panel-BYaK2OYv.js} +1 -1
  245. package/dist/assets/sparql-hKgXdTt3.js +1 -0
  246. package/dist/assets/{spec-6oUobewY.js → spec-C-DRirsO.js} +1 -1
  247. package/dist/assets/{src-COk1uIaa.js → src-CWJKdmqu.js} +1 -1
  248. package/dist/assets/state-BHl5TPGk.js +3 -0
  249. package/dist/assets/{state-Dlj7aAV2.js → state-BqtnroUI.js} +1 -1
  250. package/dist/assets/{state-INwBo8-b.js → state-CvCX-bpE.js} +1 -1
  251. package/dist/assets/{state-SzKMGrBW.js → state-Vt0MLBrw.js} +1 -1
  252. package/dist/assets/{stateDiagram-FKZM4ZOC-NXeF8b27.js → stateDiagram-FKZM4ZOC-DEmCk9Rd.js} +1 -1
  253. package/dist/assets/stateDiagram-v2-4FDKWEC3-BnQZW9RQ.js +1 -0
  254. package/dist/assets/{step-COhf-b0R.js → step-BEsMOrhi.js} +1 -1
  255. package/dist/assets/stex-C5zzfAG3.js +1 -0
  256. package/dist/assets/stylus-MJ5VouuS.js +1 -0
  257. package/dist/assets/swift-jqL65uqK.js +1 -0
  258. package/dist/assets/{switch-CqJGGLBT.js → switch-QpkpQKr6.js} +1 -1
  259. package/dist/assets/tcl-D9FDKTky.js +1 -0
  260. package/dist/assets/{terminal-6UFUAGzf.js → terminal-CyaX8miJ.js} +1 -1
  261. package/dist/assets/{textarea-D2liylO5.js → textarea-DLywVJ2b.js} +1 -1
  262. package/dist/assets/textile-Ne1MkNjB.js +1 -0
  263. package/dist/assets/{time-hqD5bg84.js → time-C4Bk-t_8.js} +1 -1
  264. package/dist/assets/{timeline-definition-IT6M3QCI-B3aCCYAY.js → timeline-definition-IT6M3QCI-CNeWgYoO.js} +1 -1
  265. package/dist/assets/toml-Ba1TjbvG.js +1 -0
  266. package/dist/assets/{tracing-BUxVK-Z_.js → tracing-D5CN46rG.js} +1 -1
  267. package/dist/assets/tracing-panel-CoriopUM.js +2 -0
  268. package/dist/assets/tree-actions-BEhaM9eb.js +1 -0
  269. package/dist/assets/{treemap-GDKQZRPO-C7ssVrVz.js → treemap-GDKQZRPO-M0PfNVm7.js} +1 -1
  270. package/dist/assets/troff-ClRZFpM8.js +1 -0
  271. package/dist/assets/ttcn-JOxk9-wl.js +1 -0
  272. package/dist/assets/ttcn-cfg-D-oWP0t7.js +1 -0
  273. package/dist/assets/turtle-CfJStbTs.js +1 -0
  274. package/dist/assets/{useAddCell-xtQoaf-X.js → useAddCell-DtcrFkTf.js} +1 -1
  275. package/dist/assets/{useBoolean-D2Wc5G49.js → useBoolean-CZ3cQicK.js} +1 -1
  276. package/dist/assets/{useCellActionButton-DXgH5B4A.js → useCellActionButton-DLUN-oPD.js} +1 -1
  277. package/dist/assets/{useDateFormatter-_XK-fjTQ.js → useDateFormatter-DncW9tjn.js} +1 -1
  278. package/dist/assets/{useDeleteCell-C1_f7lEy.js → useDeleteCell-Y0BbfZjx.js} +1 -1
  279. package/dist/assets/{useDependencyPanelTab-PKhgm9-V.js → useDependencyPanelTab-BTOhjR-l.js} +1 -1
  280. package/dist/assets/{useInstallPackage-BHZ1EjqC.js → useInstallPackage-DQBOxUeJ.js} +1 -1
  281. package/dist/assets/{useNotebookActions-BPt4w3KQ.js → useNotebookActions-Cg9IU5j7.js} +1 -1
  282. package/dist/assets/{useNumberFormatter-D_mZTdYK.js → useNumberFormatter-DYIfVU-H.js} +1 -1
  283. package/dist/assets/{usePress-Cj1lHaxt.js → usePress-BPoseSMY.js} +1 -1
  284. package/dist/assets/{useRunCells-cIxqHRwZ.js → useRunCells-Ce0N_5Wc.js} +1 -1
  285. package/dist/assets/{useSplitCell-B0qjEpW1.js → useSplitCell-Dby_-BDH.js} +1 -1
  286. package/dist/assets/{utils-DVodi8oQ.js → utils-B_ZkX8f0.js} +1 -1
  287. package/dist/assets/vb-DtMAcbIy.js +1 -0
  288. package/dist/assets/vbscript-CUB17r-X.js +1 -0
  289. package/dist/assets/{vega-component-Dh_sdcAu.js → vega-component-VkLCyBCX.js} +1 -1
  290. package/dist/assets/{vega-loader.browser-CRZ52CKf.js → vega-loader.browser-BlkwfOz9.js} +1 -1
  291. package/dist/assets/velocity-Dwo66olV.js +1 -0
  292. package/dist/assets/verilog-DuexQCyX.js +1 -0
  293. package/dist/assets/vhdl-Mgyyw75F.js +1 -0
  294. package/dist/assets/webidl-DZaOA0mR.js +1 -0
  295. package/dist/assets/{write-secret-modal-DNCTT09O.js → write-secret-modal-Chu5xifR.js} +1 -1
  296. package/dist/assets/xquery-DpQixCSm.js +1 -0
  297. package/dist/assets/{xychartDiagram-PRI3JC2R-eSL2LfH9.js → xychartDiagram-PRI3JC2R-eqzm3nQu.js} +1 -1
  298. package/dist/assets/yacas-B1gHpHXz.js +1 -0
  299. package/dist/assets/z80-IF9HkI5m.js +1 -0
  300. package/dist/index.html +98 -92
  301. package/package.json +2 -2
  302. package/src/components/editor/file-tree/__tests__/requesting-tree.test.ts +84 -2
  303. package/src/components/editor/file-tree/file-explorer.tsx +142 -203
  304. package/src/components/editor/file-tree/file-name-input.tsx +41 -0
  305. package/src/components/editor/file-tree/file-operations.tsx +266 -0
  306. package/src/components/editor/file-tree/renderers.tsx +1 -1
  307. package/src/components/editor/file-tree/requesting-tree.tsx +68 -49
  308. package/src/components/editor/output/JsonOutput.tsx +157 -4
  309. package/src/components/editor/output/__tests__/JsonOutput-mimetype.test.tsx +80 -0
  310. package/src/components/editor/output/__tests__/json-output.test.ts +147 -2
  311. package/src/components/home/state.ts +13 -1
  312. package/src/components/pages/home-page.tsx +116 -10
  313. package/src/core/islands/__tests__/bridge.test.ts +116 -5
  314. package/src/core/islands/bridge.ts +5 -1
  315. package/src/core/network/requests-network.ts +0 -3
  316. package/src/core/static/__tests__/export-context.test.ts +122 -0
  317. package/src/core/static/__tests__/static-state.test.ts +80 -0
  318. package/src/core/static/export-context.ts +84 -0
  319. package/src/core/static/static-state.ts +44 -6
  320. package/src/plugins/core/RenderHTML.tsx +23 -2
  321. package/src/plugins/core/__test__/RenderHTML.test.ts +86 -1
  322. package/src/plugins/core/__test__/trusted-url.test.ts +130 -18
  323. package/src/plugins/core/sanitize.ts +11 -5
  324. package/src/plugins/core/trusted-url.ts +32 -10
  325. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +29 -1
  326. package/src/plugins/impl/mpl-interactive/__tests__/MplInteractivePlugin.test.tsx +34 -0
  327. package/src/plugins/impl/panel/__tests__/PanelPlugin.test.ts +35 -2
  328. package/src/utils/__tests__/path.test.ts +20 -0
  329. package/src/utils/pathUtils.test.ts +141 -1
  330. package/src/utils/pathUtils.ts +46 -0
  331. package/src/utils/paths.ts +9 -1
  332. package/dist/assets/JsonOutput-sWUD3O5F.js +0 -49
  333. package/dist/assets/LazyAnyLanguageCodeMirror-BYkSpfWg.js +0 -2
  334. package/dist/assets/RenderHTML-aOmkRy0R.js +0 -1
  335. package/dist/assets/apl-ezh0ScS-.js +0 -1
  336. package/dist/assets/asciiarmor-DBqyln4y.js +0 -1
  337. package/dist/assets/asn1-C9Hie9a5.js +0 -1
  338. package/dist/assets/brainfuck-BDNU41Mw.js +0 -1
  339. package/dist/assets/channel-esN5troS.js +0 -1
  340. package/dist/assets/chunk-55IACEB6-C_BE0X2F.js +0 -1
  341. package/dist/assets/classDiagram-2ON5EDUG-BSpbvL3e.js +0 -1
  342. package/dist/assets/classDiagram-v2-WZHVMYZB-CQ49gdZV.js +0 -1
  343. package/dist/assets/clojure-DnkK3bSc.js +0 -1
  344. package/dist/assets/cmake-BnWrJdTV.js +0 -1
  345. package/dist/assets/cobol-HBrO1JaF.js +0 -1
  346. package/dist/assets/coffeescript-CRPuDhgD.js +0 -1
  347. package/dist/assets/commonlisp-Da4KcekY.js +0 -1
  348. package/dist/assets/components-eaRIBPb2.js +0 -1
  349. package/dist/assets/crystal-DSapLTsa.js +0 -1
  350. package/dist/assets/cypher-xFGoEou9.js +0 -1
  351. package/dist/assets/d-DgvhEIBQ.js +0 -1
  352. package/dist/assets/diff-_ncWAuCI.js +0 -1
  353. package/dist/assets/dist-BOBxlWRU.js +0 -1
  354. package/dist/assets/dist-C9byx33H.js +0 -1
  355. package/dist/assets/dist-CAjNwSwp.js +0 -1
  356. package/dist/assets/dist-ChEIZSwD.js +0 -1
  357. package/dist/assets/dist-DEsgb6r0.js +0 -1
  358. package/dist/assets/dist-DK65leDK.js +0 -1
  359. package/dist/assets/dist-DMIdeanR.js +0 -1
  360. package/dist/assets/dist-DlFpiRHv.js +0 -1
  361. package/dist/assets/dist-H-P6qorM.js +0 -1
  362. package/dist/assets/dist-vhQjV8kg.js +0 -1
  363. package/dist/assets/dtd-BnBIn3kr.js +0 -1
  364. package/dist/assets/dylan-CkGqQmFw.js +0 -1
  365. package/dist/assets/ecl-CFTIHpsV.js +0 -1
  366. package/dist/assets/eiffel-DqSKoxJh.js +0 -1
  367. package/dist/assets/elm-dL9c1n0U.js +0 -1
  368. package/dist/assets/erlang-ZIYI48gw.js +0 -1
  369. package/dist/assets/es-CjWf0wU3.js +0 -5
  370. package/dist/assets/factor-CDbckATe.js +0 -1
  371. package/dist/assets/file-explorer-panel-B5sFxYu1.js +0 -26
  372. package/dist/assets/forth-ClT6YoKq.js +0 -1
  373. package/dist/assets/fortran-D3wR_E-8.js +0 -1
  374. package/dist/assets/gas-_ShnzaTM.js +0 -1
  375. package/dist/assets/gherkin-LsHtc0Ns.js +0 -1
  376. package/dist/assets/groovy-D_Yv0Fac.js +0 -1
  377. package/dist/assets/haskell-qhM1HAIB.js +0 -1
  378. package/dist/assets/haxe-Bi62PpIr.js +0 -1
  379. package/dist/assets/home-page-BvfssQ5c.js +0 -4
  380. package/dist/assets/idl-CI42bOaI.js +0 -1
  381. package/dist/assets/infoDiagram-HS3SLOUP-DTO3Z6Cg.js +0 -2
  382. package/dist/assets/javascript-BNZ5YnSy.js +0 -1
  383. package/dist/assets/julia-dpVUKOp6.js +0 -1
  384. package/dist/assets/katex-B5wxkMHB.js +0 -1
  385. package/dist/assets/livescript-BDwSUbUd.js +0 -1
  386. package/dist/assets/lua-cGUKNtb5.js +0 -1
  387. package/dist/assets/mathematica-D4XScfvP.js +0 -1
  388. package/dist/assets/mbox-COnP75oc.js +0 -1
  389. package/dist/assets/mermaid-4DMBBIKO-D-U6KmKa.js +0 -1
  390. package/dist/assets/mirc-DXskkW6M.js +0 -1
  391. package/dist/assets/mllike-B3ebn_fS.js +0 -1
  392. package/dist/assets/modelica-Df8_BOFz.js +0 -1
  393. package/dist/assets/mscgen-ugK6iLdl.js +0 -1
  394. package/dist/assets/mumps-Qes0D9Sq.js +0 -1
  395. package/dist/assets/nsis-CvTk2ElD.js +0 -1
  396. package/dist/assets/ntriples-BrWSHgAl.js +0 -1
  397. package/dist/assets/octave--UXUC2au.js +0 -1
  398. package/dist/assets/oz-SCICUQnB.js +0 -1
  399. package/dist/assets/pascal-BZRIRN0Y.js +0 -1
  400. package/dist/assets/paths-DsQUzvvb.js +0 -1
  401. package/dist/assets/perl-BJBf_VRX.js +0 -1
  402. package/dist/assets/pig-8VtGvtGP.js +0 -1
  403. package/dist/assets/powershell-MUdKU-yo.js +0 -1
  404. package/dist/assets/properties-B_YTP79K.js +0 -1
  405. package/dist/assets/protobuf-BjqtN1d3.js +0 -1
  406. package/dist/assets/pug-pCMDyY3V.js +0 -1
  407. package/dist/assets/puppet-ByNusmmY.js +0 -1
  408. package/dist/assets/python-CeK7Mdg6.js +0 -1
  409. package/dist/assets/q-BPLn3RjU.js +0 -1
  410. package/dist/assets/r-C6hL19P_.js +0 -1
  411. package/dist/assets/react-vega-B2Q2ObPu.js +0 -1
  412. package/dist/assets/rpm-Cepx5AK5.js +0 -1
  413. package/dist/assets/ruby-8a_JNJtC.js +0 -1
  414. package/dist/assets/sas-DRXu6Kkn.js +0 -1
  415. package/dist/assets/scheme-DaBlDkbO.js +0 -1
  416. package/dist/assets/session-panel-CfLYfSX2.js +0 -1
  417. package/dist/assets/shell-CEmng-T5.js +0 -1
  418. package/dist/assets/sieve-CTG31Wbe.js +0 -1
  419. package/dist/assets/smalltalk-DlBjAIRH.js +0 -1
  420. package/dist/assets/sparql-D8XQtNgL.js +0 -1
  421. package/dist/assets/state-BFFSWzNE.js +0 -3
  422. package/dist/assets/stateDiagram-v2-4FDKWEC3-co6cLoce.js +0 -1
  423. package/dist/assets/stex-CXcPf-7C.js +0 -1
  424. package/dist/assets/stylus-DpfM4Y-0.js +0 -1
  425. package/dist/assets/swift-Bevjlmsx.js +0 -1
  426. package/dist/assets/tcl-CWB1W9St.js +0 -1
  427. package/dist/assets/textile-DrGyKlBQ.js +0 -1
  428. package/dist/assets/toml-CF49H3Gs.js +0 -1
  429. package/dist/assets/tracing-panel-BZQdh8Uh.js +0 -2
  430. package/dist/assets/tree-Dtn4o2IZ.js +0 -3
  431. package/dist/assets/troff-DS9glUnj.js +0 -1
  432. package/dist/assets/ttcn-cfg-D8JUANmi.js +0 -1
  433. package/dist/assets/ttcn-iXXxBDpr.js +0 -1
  434. package/dist/assets/turtle-IsYxGpD1.js +0 -1
  435. package/dist/assets/vb-CJBc18Ui.js +0 -1
  436. package/dist/assets/vbscript-f-536WNP.js +0 -1
  437. package/dist/assets/velocity-BKcC2FIu.js +0 -1
  438. package/dist/assets/verilog-BwwsdDY5.js +0 -1
  439. package/dist/assets/vhdl-BG8PfJd8.js +0 -1
  440. package/dist/assets/webidl-BHBWV-F6.js +0 -1
  441. package/dist/assets/xquery-BSuR2Wlv.js +0 -1
  442. package/dist/assets/yacas-DdJ1FiXV.js +0 -1
  443. package/dist/assets/z80-BWehJ3ot.js +0 -1
  444. /package/dist/assets/{Deferred-Bk0r4KDZ.js → Deferred-CcWopv8N.js} +0 -0
  445. /package/dist/assets/{ImageComparisonComponent-BDf80c-c.js → ImageComparisonComponent-BbeHudzx.js} +0 -0
  446. /package/dist/assets/{Inputs-kqHYE7dL.js → Inputs-BJt-xWQ4.js} +0 -0
  447. /package/dist/assets/{Plot-Dw2rpqfa.js → Plot-NkctaBpw.js} +0 -0
  448. /package/dist/assets/{SSRProvider-1sSrgJwI.js → SSRProvider-ChaJ6dv8.js} +0 -0
  449. /package/dist/assets/{apl-BYqtBlld.js → apl-CArdF_Ee.js} +0 -0
  450. /package/dist/assets/{array-BF0shS9G.js → array-vLcKmV3f.js} +0 -0
  451. /package/dist/assets/{asciiarmor-DUW0Iozu.js → asciiarmor-rf6n_8YZ.js} +0 -0
  452. /package/dist/assets/{asn1-ClnHsHDP.js → asn1-Bl4vlAxN.js} +0 -0
  453. /package/dist/assets/{asterisk-CO_c0gwL.js → asterisk-B04IJwAt.js} +0 -0
  454. /package/dist/assets/{azure-BGC9_IAe.js → azure-DZ9IQ5nj.js} +0 -0
  455. /package/dist/assets/{badge-IqsYSyWB.js → badge-OeIzJ2Mo.js} +0 -0
  456. /package/dist/assets/{blob-CpeNXBj-.js → blob-Gsfvuteh.js} +0 -0
  457. /package/dist/assets/{brainfuck-FB_E90sw.js → brainfuck-CWRjg_-2.js} +0 -0
  458. /package/dist/assets/{card-DaCTzD6y.js → card-CVZJbqix.js} +0 -0
  459. /package/dist/assets/{chunk-4F5CHEZ2-CiW94ehv.js → chunk-4F5CHEZ2-Cw8YQRir.js} +0 -0
  460. /package/dist/assets/{chunk-B2363JML-Dj_BsGfX.js → chunk-B2363JML-BSJ4A4O7.js} +0 -0
  461. /package/dist/assets/{chunk-DR5Q36YT-CCzZb1o4.js → chunk-DR5Q36YT-BAovSO-b.js} +0 -0
  462. /package/dist/assets/{chunk-FRFDVMJY-BB5sTbw6.js → chunk-FRFDVMJY-Ca8ZLUo3.js} +0 -0
  463. /package/dist/assets/{chunk-PL6DKKU2-BVOKRgy0.js → chunk-PL6DKKU2-BjuKxBfi.js} +0 -0
  464. /package/dist/assets/{chunk-SJTYNZTY-BY2Gu6VM.js → chunk-SJTYNZTY-wqlkd3w7.js} +0 -0
  465. /package/dist/assets/{chunk-TQ3KTPDO-BXqsqDoM.js → chunk-TQ3KTPDO-BUikk8OW.js} +0 -0
  466. /package/dist/assets/{chunk-UMXZTB3W-2RQe-UTW.js → chunk-UMXZTB3W-lROkSRJ2.js} +0 -0
  467. /package/dist/assets/{clear-button-hXGBrmNq.js → clear-button-cQS2Q-bl.js} +0 -0
  468. /package/dist/assets/{click-outside-container-7UXGgq-9.js → click-outside-container-ChOZeHlm.js} +0 -0
  469. /package/dist/assets/{clike-B7PZCnaI.js → clike-B4xEkWXN.js} +0 -0
  470. /package/dist/assets/{clojure-DtLrahuY.js → clojure-04C6o-hL.js} +0 -0
  471. /package/dist/assets/{cmake-DGfhkTv5.js → cmake-Dh64a3j4.js} +0 -0
  472. /package/dist/assets/{cobol-Cpbk-vCU.js → cobol-B24ofC4q.js} +0 -0
  473. /package/dist/assets/{coffeescript-BATQF8kE.js → coffeescript-B0i0O-b-.js} +0 -0
  474. /package/dist/assets/{colors-C3_wIR8c.js → colors-CgemTayT.js} +0 -0
  475. /package/dist/assets/{common-keywords-CvypSGuw.js → common-keywords-D6ImdZX8.js} +0 -0
  476. /package/dist/assets/{commonlisp-C9N48zGs.js → commonlisp-NXg-Bye5.js} +0 -0
  477. /package/dist/assets/{copy-BnK_ki61.js → copy-MpDsCBB6.js} +0 -0
  478. /package/dist/assets/{crystal-D2nrZv1k.js → crystal-BOjNTZjx.js} +0 -0
  479. /package/dist/assets/{css-DNoZFvlx.js → css-C_vknI7E.js} +0 -0
  480. /package/dist/assets/{cypher-6TFCZzgE.js → cypher-DwQoZmH9.js} +0 -0
  481. /package/dist/assets/{cytoscape.esm-BihqZ2_-.js → cytoscape.esm-BUYfy0ER.js} +0 -0
  482. /package/dist/assets/{d-DHH1X7PS.js → d-xedQGhmO.js} +0 -0
  483. /package/dist/assets/{defaultLocale-D_rSvXvJ.js → defaultLocale-CIhzTQNN.js} +0 -0
  484. /package/dist/assets/{defaultLocale-C92Rrpmf.js → defaultLocale-CUv_V9gw.js} +0 -0
  485. /package/dist/assets/{dialog-CqE8CV1Y.js → dialog-BEgS5oXa.js} +0 -0
  486. /package/dist/assets/{diff-DNDp4fOd.js → diff-ChFnp8JW.js} +0 -0
  487. /package/dist/assets/{dist-DfWgLTCQ.js → dist-B4jGC5bx.js} +0 -0
  488. /package/dist/assets/{dist-Dg3CCt0r.js → dist-BNScjj64.js} +0 -0
  489. /package/dist/assets/{dist-a6hqEAyw.js → dist-ByJngTCJ.js} +0 -0
  490. /package/dist/assets/{dist-D-j2KFQ4.js → dist-C1VXabOr.js} +0 -0
  491. /package/dist/assets/{dist-Bgd1ZX49.js → dist-Cqk8HSav.js} +0 -0
  492. /package/dist/assets/{dist-idZNafp8.js → dist-D80LaxlS.js} +0 -0
  493. /package/dist/assets/{dist-B5ONF0fx.js → dist-DdzMFGlM.js} +0 -0
  494. /package/dist/assets/{dist-Ct7BBGwl.js → dist-FpqIkji6.js} +0 -0
  495. /package/dist/assets/{dist-B804XDz9.js → dist-R9N_YrBH.js} +0 -0
  496. /package/dist/assets/{dist-D8llshvP.js → dist-SITbEFUx.js} +0 -0
  497. /package/dist/assets/{dist-DDWNnRcK.js → dist-fKKpzSr2.js} +0 -0
  498. /package/dist/assets/{dist-CpbLJKXc.js → dist-fOLN5Vji.js} +0 -0
  499. /package/dist/assets/{dist-BiQrY0m-.js → dist-wsxxqJfJ.js} +0 -0
  500. /package/dist/assets/{dtd-BYdB19UC.js → dtd-KbDPyUs4.js} +0 -0
  501. /package/dist/assets/{duckdb-keywords-C63auBrb.js → duckdb-keywords-5i8us9ML.js} +0 -0
  502. /package/dist/assets/{dylan-3sqQfqPE.js → dylan-0KH4Nowk.js} +0 -0
  503. /package/dist/assets/{ebnf-CJQ7hlUt.js → ebnf--2SLsnbd.js} +0 -0
  504. /package/dist/assets/{ecl-79y60Sdt.js → ecl-B5iM_b7s.js} +0 -0
  505. /package/dist/assets/{eiffel-Cy1qkCDz.js → eiffel-sVM1STl5.js} +0 -0
  506. /package/dist/assets/{elm-DrRzHEES.js → elm-BlNENVB6.js} +0 -0
  507. /package/dist/assets/{emotion-is-prop-valid.esm-UWgehH47.js → emotion-is-prop-valid.esm-BvF4JMSP.js} +0 -0
  508. /package/dist/assets/{empty-state-CrP10sqm.js → empty-state-CPvr0RGL.js} +0 -0
  509. /package/dist/assets/{en-US-B8TXLgVt.js → en-US-BXVprI6a.js} +0 -0
  510. /package/dist/assets/{erlang-D3BTE-y0.js → erlang-C0uOSFok.js} +0 -0
  511. /package/dist/assets/{errors-DVkmLSXX.js → errors-pt9sYxVM.js} +0 -0
  512. /package/dist/assets/{esm-vpVfqVb3.js → esm-D6KjvJkM.js} +0 -0
  513. /package/dist/assets/{events-CWUex2qo.js → events-CKqlBGzI.js} +0 -0
  514. /package/dist/assets/{extends-q1GgI0Ag.js → extends-DYqjHZ5t.js} +0 -0
  515. /package/dist/assets/{fcl-BM8Miy5A.js → fcl-CcJxrJDr.js} +0 -0
  516. /package/dist/assets/{forth-DGce5eRS.js → forth-Dkvgp5v0.js} +0 -0
  517. /package/dist/assets/{fortran-CS97oQQW.js → fortran-DWGt9NN5.js} +0 -0
  518. /package/dist/assets/{gas-7e_zvN4u.js → gas-ucVnXY28.js} +0 -0
  519. /package/dist/assets/{gherkin-3f1nzx4Y.js → gherkin-BRjIORXo.js} +0 -0
  520. /package/dist/assets/{groovy-Bn1MvSId.js → groovy-BwyAyRPC.js} +0 -0
  521. /package/dist/assets/{haskell-qtyafuM6.js → haskell-Cs-Andhs.js} +0 -0
  522. /package/dist/assets/{haxe-CQwWk_Ht.js → haxe-BW46cyaq.js} +0 -0
  523. /package/dist/assets/{http-DJG1eSBi.js → http-BBXW5Cu0.js} +0 -0
  524. /package/dist/assets/{idl-BnUby_AK.js → idl-BGiQ18ct.js} +0 -0
  525. /package/dist/assets/{init-AtRnKt23.js → init-NRxdWJN-.js} +0 -0
  526. /package/dist/assets/{isValid-KoNx_uxe.js → isValid-BBUyUJly.js} +0 -0
  527. /package/dist/assets/{javascript-BFKHKHDt.js → javascript-I9_Q-6Fg.js} +0 -0
  528. /package/dist/assets/{julia-BZeLe6be.js → julia-Wfay9brY.js} +0 -0
  529. /package/dist/assets/{katex-Bc4cO2Ba.js → katex-BIY1ztUE.js} +0 -0
  530. /package/dist/assets/{livescript-LB6oZdgV.js → livescript-J6EnSQWw.js} +0 -0
  531. /package/dist/assets/{loro_wasm_bg-DSqjo7Pf.js → loro_wasm_bg-BAHdi7Mz.js} +0 -0
  532. /package/dist/assets/{lua-D73MeF_d.js → lua-BO_knq_Q.js} +0 -0
  533. /package/dist/assets/{marimo-icons-Ce24dQVN.js → marimo-icons-ifBE8yqY.js} +0 -0
  534. /package/dist/assets/{math-BIeW4iGV.js → math-CIWU-TqO.js} +0 -0
  535. /package/dist/assets/{mathematica-SckqhulL.js → mathematica-DU8ikXHk.js} +0 -0
  536. /package/dist/assets/{mbox-DpdjYR8y.js → mbox-Dzzw6MxI.js} +0 -0
  537. /package/dist/assets/{mirc-9Mp8ii_5.js → mirc-82uLLidC.js} +0 -0
  538. /package/dist/assets/{mllike-CteazA5r.js → mllike-WTbu2PGL.js} +0 -0
  539. /package/dist/assets/{modelica-DruS-uJ8.js → modelica-w4uKZrXu.js} +0 -0
  540. /package/dist/assets/{mscgen-Dqm6ZJyo.js → mscgen-Bf7m7BDT.js} +0 -0
  541. /package/dist/assets/{multi-icon-nJMmVh2f.js → multi-icon-CPhrdW6o.js} +0 -0
  542. /package/dist/assets/{mumps-DAwJeUn4.js → mumps-Bicgf-gh.js} +0 -0
  543. /package/dist/assets/{nginx-B_wjuKSa.js → nginx-CiiHaY6Q.js} +0 -0
  544. /package/dist/assets/{node-sql-parser-UQ9Ur_LP.js → node-sql-parser-DllVaz4k.js} +0 -0
  545. /package/dist/assets/{ntriples-D5_p8srT.js → ntriples-CyotCBD4.js} +0 -0
  546. /package/dist/assets/{numbers-epUg4eUW.js → numbers-CHuwXNCA.js} +0 -0
  547. /package/dist/assets/{objectWithoutPropertiesLoose-BQlZis3f.js → objectWithoutPropertiesLoose-CUZPaRZf.js} +0 -0
  548. /package/dist/assets/{octave-StxXX2kg.js → octave-BP7UuRZ-.js} +0 -0
  549. /package/dist/assets/{oz-CZcv8Gut.js → oz-C9dsRBsA.js} +0 -0
  550. /package/dist/assets/{panel-context-DgIiEtMa.js → panel-context-S-AFWBnz.js} +0 -0
  551. /package/dist/assets/{pascal-BTSTYf7j.js → pascal-Do-HizJs.js} +0 -0
  552. /package/dist/assets/{path-BMloFSsK.js → path-CQRzwJPY.js} +0 -0
  553. /package/dist/assets/{perl-D3WNCnWS.js → perl-DkWjygEp.js} +0 -0
  554. /package/dist/assets/{pig-m1LfHx7X.js → pig-C5cO5Lzu.js} +0 -0
  555. /package/dist/assets/{play-CEytussU.js → play-DSUm4sBu.js} +0 -0
  556. /package/dist/assets/{plus-BueqiM86.js → plus-DgRbTQuK.js} +0 -0
  557. /package/dist/assets/{powershell-C7evXFhK.js → powershell-B7iMkhi7.js} +0 -0
  558. /package/dist/assets/{preload-helper-BFv3hW2s.js → preload-helper-DXnewu3N.js} +0 -0
  559. /package/dist/assets/{prop-types-D9vVr8W2.js → prop-types-CMQyZoIm.js} +0 -0
  560. /package/dist/assets/{properties-CX3A241c.js → properties-BojS2wNP.js} +0 -0
  561. /package/dist/assets/{protobuf-CEqDY4vo.js → protobuf-C3jQLUT4.js} +0 -0
  562. /package/dist/assets/{puppet-DlFBPmUd.js → puppet-BIu7yw7Q.js} +0 -0
  563. /package/dist/assets/{purify.es-Cg0r2qW-.js → purify.es-Lm0LKKB_.js} +0 -0
  564. /package/dist/assets/{python-kNH0316T.js → python-BvK-LeGt.js} +0 -0
  565. /package/dist/assets/{q-KQ_N2MXi.js → q-DxTFD_3l.js} +0 -0
  566. /package/dist/assets/{r-Dj_WdT8c.js → r-D9kMb9Pl.js} +0 -0
  567. /package/dist/assets/{range-Bc7-zhbC.js → range-l5y19iar.js} +0 -0
  568. /package/dist/assets/{react-icons.esm-B8rtE4cC.js → react-icons.esm-CwO5-6Hf.js} +0 -0
  569. /package/dist/assets/{refresh-ccw-BuMhEaS9.js → refresh-ccw-B-iu4wyD.js} +0 -0
  570. /package/dist/assets/{refresh-cw-BmiNHssk.js → refresh-cw-C6hZr6dA.js} +0 -0
  571. /package/dist/assets/{requests-DdU2Ap88.js → requests-dD3-AncY.js} +0 -0
  572. /package/dist/assets/{rotate-ccw-Bwso-5RT.js → rotate-ccw-CMEpyC--.js} +0 -0
  573. /package/dist/assets/{rpm-C3VyCeYo.js → rpm-DMBmptJ_.js} +0 -0
  574. /package/dist/assets/{ruby-9RpAFOsP.js → ruby-Bi66LQBu.js} +0 -0
  575. /package/dist/assets/{runs-BBFoea9K.js → runs-5FOfd9Cy.js} +0 -0
  576. /package/dist/assets/{sas-CFBIkOrK.js → sas-DDMCLlZz.js} +0 -0
  577. /package/dist/assets/{save-B_q9ApPf.js → save-B5tS7kkh.js} +0 -0
  578. /package/dist/assets/{scheme-n4WmsRUQ.js → scheme-MngEI34z.js} +0 -0
  579. /package/dist/assets/{session-DdhIEena.js → session-DI1agD5_.js} +0 -0
  580. /package/dist/assets/{settings-C_KZ1Eue.js → settings-DDffqDzb.js} +0 -0
  581. /package/dist/assets/{shell-BDAgpmgp.js → shell-BSVgrHzY.js} +0 -0
  582. /package/dist/assets/{sieve-BVNIn7Yz.js → sieve-DvUWNrPv.js} +0 -0
  583. /package/dist/assets/{simple-mode-C-nP-kAb.js → simple-mode-DxeVZov3.js} +0 -0
  584. /package/dist/assets/{smalltalk-C7nE9dmX.js → smalltalk-CeZ66qpG.js} +0 -0
  585. /package/dist/assets/{solr-CU1BrlpT.js → solr-DYYuHZ7Q.js} +0 -0
  586. /package/dist/assets/{sparkles-BRTQ46qC.js → sparkles-C9V_hOqY.js} +0 -0
  587. /package/dist/assets/{sparql-DPFIzZM3.js → sparql-oFx_t7AO.js} +0 -0
  588. /package/dist/assets/{spreadsheet-DwP77QON.js → spreadsheet-hVThRh5Z.js} +0 -0
  589. /package/dist/assets/{sql-CBifPEyZ.js → sql-DG1AJQLP.js} +0 -0
  590. /package/dist/assets/{square-function-DN3RwIjj.js → square-function-iLrgnnoW.js} +0 -0
  591. /package/dist/assets/{src-DSbF9mby.js → src-CsZby044.js} +0 -0
  592. /package/dist/assets/{stex--zUcZkER.js → stex-CHLzTK9d.js} +0 -0
  593. /package/dist/assets/{stylus-DGcebGVS.js → stylus-KE-9LQSK.js} +0 -0
  594. /package/dist/assets/{swift-DiAJo7C6.js → swift-A-ZhZWU8.js} +0 -0
  595. /package/dist/assets/{swiper-component-BIp7oQxt.js → swiper-component-DL6ct72W.js} +0 -0
  596. /package/dist/assets/{tcl-DpD837eJ.js → tcl-CREXWwrr.js} +0 -0
  597. /package/dist/assets/{textile-DEqOicm6.js → textile-Cj8L4qVJ.js} +0 -0
  598. /package/dist/assets/{tiddlywiki-CqVNI8lH.js → tiddlywiki-Dc8c_QaF.js} +0 -0
  599. /package/dist/assets/{tiki-BIINIJTn.js → tiki-CwGnGueS.js} +0 -0
  600. /package/dist/assets/{timer-DwQQMK5T.js → timer-CEUQS2Fi.js} +0 -0
  601. /package/dist/assets/{toml-BdA-7EhB.js → toml-BwSlV2Pt.js} +0 -0
  602. /package/dist/assets/{trash-2-C5AzNaHr.js → trash-2-3m1rZsYE.js} +0 -0
  603. /package/dist/assets/{trash-BUseJO4n.js → trash-D89_qya1.js} +0 -0
  604. /package/dist/assets/{treemap-DqSsE4KM.js → treemap-BYvDYG1E.js} +0 -0
  605. /package/dist/assets/{triangle-alert-CBEvAwaa.js → triangle-alert-Bt-v8HXv.js} +0 -0
  606. /package/dist/assets/{troff-iGRgQHLe.js → troff-DWonWT6V.js} +0 -0
  607. /package/dist/assets/{ttcn-CLQ1c3XL.js → ttcn--CHQduBW.js} +0 -0
  608. /package/dist/assets/{ttcn-cfg-BFj90pgD.js → ttcn-cfg-Cei3Mnk3.js} +0 -0
  609. /package/dist/assets/{turtle-DwFVq6UC.js → turtle-BaGuNPTf.js} +0 -0
  610. /package/dist/assets/{types-D8yP89N6.js → types-DOdUT9LT.js} +0 -0
  611. /package/dist/assets/{types-Bpx1EWqM.js → types-jWhVbgX6.js} +0 -0
  612. /package/dist/assets/{use-toast-PYIpV284.js → use-toast-DZOInYtM.js} +0 -0
  613. /package/dist/assets/{useDebounce-BxKDvvzN.js → useDebounce-C0E828y0.js} +0 -0
  614. /package/dist/assets/{useDeepCompareMemoize-pHFuC8FJ.js → useDeepCompareMemoize-606Ao2HX.js} +0 -0
  615. /package/dist/assets/{useHotkey-j1wCvjNq.js → useHotkey-DMv61Udq.js} +0 -0
  616. /package/dist/assets/{useInterval-BePSL0QQ.js → useInterval-zx_Q7num.js} +0 -0
  617. /package/dist/assets/{useTheme-AmxLvSQ5.js → useTheme-DhrO1NvC.js} +0 -0
  618. /package/dist/assets/{uuid-CCkGk34L.js → uuid-D_ujsK2Y.js} +0 -0
  619. /package/dist/assets/{vb-gm5P9Pn5.js → vb-DQgwufRi.js} +0 -0
  620. /package/dist/assets/{vbscript-gQvKiDdU.js → vbscript-B66XhQhu.js} +0 -0
  621. /package/dist/assets/{velocity-CkfRmD_d.js → velocity-D7CxwqhZ.js} +0 -0
  622. /package/dist/assets/{verilog-D3b05tu1.js → verilog-SCT9zECa.js} +0 -0
  623. /package/dist/assets/{vhdl-DRo1SU3e.js → vhdl-Bz6d75os.js} +0 -0
  624. /package/dist/assets/{web-vitals-CUbDLLN1.js → web-vitals-CMDkd9l8.js} +0 -0
  625. /package/dist/assets/{webidl-DFtmGFay.js → webidl-B7LbwCfy.js} +0 -0
  626. /package/dist/assets/{workflow-ktgLxNKJ.js → workflow-CyJEIDjL.js} +0 -0
  627. /package/dist/assets/{ws-BV-4clkP.js → ws-Bim0WMvW.js} +0 -0
  628. /package/dist/assets/{xquery-CzUikajR.js → xquery-BOMK2ySj.js} +0 -0
  629. /package/dist/assets/{yacas-BqvQWbYq.js → yacas-Yk74VuuD.js} +0 -0
  630. /package/dist/assets/{z80-CQqkYd-2.js → z80-BQKQ7DhX.js} +0 -0
@@ -39,4 +39,84 @@ describe("JsonOutput with enhanced mimetype handling", () => {
39
39
  expect(container).toBeInTheDocument();
40
40
  expect(container.querySelector(".marimo-json-output")).toBeInTheDocument();
41
41
  });
42
+
43
+ it("renders encoded non-string keys with Python-style affordances", () => {
44
+ // Server-side `_key_formatter` encodes non-string dict keys with
45
+ // mimetype prefixes; the frontend `keyRenderer` must decode them
46
+ // so users see the original Python types (unquoted ints, parens for
47
+ // tuples, etc.) instead of the raw encoded strings.
48
+ const data = {
49
+ "text/plain+int:2": "int_val",
50
+ "text/plain+float:2.5": "float_val",
51
+ "text/plain+bool:True": "bool_val",
52
+ "text/plain+none:": "none_val",
53
+ "text/plain+tuple:[1, 2]": "tuple_val",
54
+ "text/plain+frozenset:[3, 4]": "fs_val",
55
+ "text/plain+str:text/plain+int:2": "escaped_str_val",
56
+ plain: "unchanged",
57
+ };
58
+
59
+ const { container } = render(<JsonOutput data={data} format="tree" />);
60
+ const text = container.textContent ?? "";
61
+
62
+ // `text/plain+str:` is the escape prefix — must never survive in output.
63
+ expect(text).not.toContain("text/plain+str:");
64
+ // Other encoded prefixes must not leak as-is. (They can still appear
65
+ // inside the unescaped original string key `"text/plain+int:2"`,
66
+ // which is intentional — but not for types *other* than int.)
67
+ expect(text).not.toContain("text/plain+bool:True");
68
+ expect(text).not.toContain("text/plain+tuple:[");
69
+ expect(text).not.toContain("text/plain+frozenset:[");
70
+ expect(text).not.toContain("text/plain+none:");
71
+
72
+ // Decoded visual forms are present with Python-style affordances.
73
+ expect(text).toContain('None:"none_val"');
74
+ expect(text).toContain('True:"bool_val"');
75
+ expect(text).toContain('2:"int_val"');
76
+ expect(text).toContain('2.5:"float_val"');
77
+ expect(text).toContain('(1, 2):"tuple_val"');
78
+ expect(text).toContain('frozenset({3, 4}):"fs_val"');
79
+ // Escaped str key renders as the original literal string (quoted).
80
+ expect(text).toContain('"text/plain+int:2":"escaped_str_val"');
81
+ // Plain string key unchanged.
82
+ expect(text).toContain('"plain":"unchanged"');
83
+ });
84
+
85
+ it("renders 1-tuple and empty-frozenset keys with correct Python syntax", () => {
86
+ // Regressions caught in review: `(1)` is not a tuple (needs `(1,)`),
87
+ // and `frozenset({})` reads like constructing from an empty dict
88
+ // (should be `frozenset()`). Locks in the tree-view rendering so these
89
+ // don't slip back.
90
+ const data = {
91
+ "text/plain+tuple:[42]": "one_tuple",
92
+ "text/plain+tuple:[]": "empty_tuple",
93
+ "text/plain+frozenset:[]": "empty_fs",
94
+ "text/plain+frozenset:[1]": "one_fs",
95
+ };
96
+
97
+ const { container } = render(<JsonOutput data={data} format="tree" />);
98
+ const text = container.textContent ?? "";
99
+
100
+ expect(text).toContain('(42,):"one_tuple"'); // trailing comma
101
+ expect(text).toContain('():"empty_tuple"');
102
+ expect(text).toContain('frozenset():"empty_fs"'); // not `frozenset({})`
103
+ expect(text).toContain('frozenset({1}):"one_fs"');
104
+ });
105
+
106
+ it("quotes integer-like string keys to distinguish them from int keys", () => {
107
+ // Without this, `"2"` and the decoded int `2` look identical — the
108
+ // textea viewer drops quotes from integer-like string keys by default.
109
+ const data = {
110
+ "2": "string_two",
111
+ "text/plain+int:2": "int_two",
112
+ };
113
+
114
+ const { container } = render(<JsonOutput data={data} format="tree" />);
115
+ const text = container.textContent ?? "";
116
+
117
+ expect(text).toContain('"2":"string_two"'); // quoted
118
+ expect(text).toContain('2:"int_two"'); // unquoted
119
+ // Non-integer string keys still render without our intervention.
120
+ expect(text).not.toContain("text/plain+"); // prefix stripped from int key
121
+ });
42
122
  });
@@ -174,7 +174,21 @@ describe("getCopyValue", () => {
174
174
  it("should handle sets", () => {
175
175
  const value = "text/plain+set:[1,2,3]";
176
176
  const result = getCopyValue(value);
177
- expect(result).toMatchInlineSnapshot(`"{1,2,3}"`);
177
+ expect(result).toMatchInlineSnapshot(`"{1, 2, 3}"`);
178
+ });
179
+
180
+ it("should handle empty set", () => {
181
+ // Empty set literal in Python is `set()`, not `{}` (which is a dict).
182
+ expect(getCopyValue("text/plain+set:[]")).toMatchInlineSnapshot(`"set()"`);
183
+ });
184
+
185
+ it("should handle frozenset values", () => {
186
+ expect(getCopyValue("text/plain+frozenset:[1,2]")).toMatchInlineSnapshot(
187
+ `"frozenset({1, 2})"`,
188
+ );
189
+ expect(getCopyValue("text/plain+frozenset:[]")).toMatchInlineSnapshot(
190
+ `"frozenset()"`,
191
+ );
178
192
  });
179
193
 
180
194
  it("should handle sets in mixed types", () => {
@@ -188,7 +202,7 @@ describe("getCopyValue", () => {
188
202
  `
189
203
  "{
190
204
  "key1": 42,
191
- "key2": {1,2,3},
205
+ "key2": {1, 2, 3},
192
206
  "key3": True
193
207
  }"
194
208
  `,
@@ -311,6 +325,137 @@ describe("determineMaxDisplayLength", () => {
311
325
  });
312
326
  });
313
327
 
328
+ describe("getCopyValue with encoded non-string keys", () => {
329
+ // Keys are encoded by _key_formatter in
330
+ // marimo/_output/formatters/structures.py. Frontend must round-trip them
331
+ // to Python literals in the copy output.
332
+
333
+ it("decodes int keys unquoted", () => {
334
+ // JS reorders integer-like string keys to the front of object iteration
335
+ // (spec-mandated), so `"2"` appears before `"text/plain+int:2"` here.
336
+ // This is pre-existing and unrelated to the encoding — both entries
337
+ // survive, which is the regression this guards.
338
+ const value = { "text/plain+int:2": "no", "2": "oh" };
339
+ expect(getCopyValue(value)).toMatchInlineSnapshot(`
340
+ "{
341
+ "2": "oh",
342
+ 2: "no"
343
+ }"
344
+ `);
345
+ });
346
+
347
+ it("decodes large int keys unquoted (no BigInt precision concern)", () => {
348
+ const value = { "text/plain+int:18446744073709551616": "v" };
349
+ expect(getCopyValue(value)).toMatchInlineSnapshot(`
350
+ "{
351
+ 18446744073709551616: "v"
352
+ }"
353
+ `);
354
+ });
355
+
356
+ it("decodes float, bool, None, tuple, frozenset keys", () => {
357
+ const value = {
358
+ "text/plain+float:2.5": "f",
359
+ "text/plain+bool:True": "t",
360
+ "text/plain+bool:False": "b",
361
+ "text/plain+none:": "n",
362
+ "text/plain+tuple:[1, 2]": "tup",
363
+ "text/plain+frozenset:[3, 4]": "fs",
364
+ };
365
+ expect(getCopyValue(value)).toMatchInlineSnapshot(`
366
+ "{
367
+ 2.5: "f",
368
+ True: "t",
369
+ False: "b",
370
+ None: "n",
371
+ (1, 2): "tup",
372
+ frozenset({3, 4}): "fs"
373
+ }"
374
+ `);
375
+ });
376
+
377
+ it("emits 1-element tuple keys with a trailing comma (Python syntax)", () => {
378
+ // `(1)` is just `1` in Python — a 1-tuple needs `(1,)`.
379
+ const value = {
380
+ "text/plain+tuple:[1]": "one",
381
+ "text/plain+tuple:[]": "empty",
382
+ };
383
+ expect(getCopyValue(value)).toMatchInlineSnapshot(`
384
+ "{
385
+ (1,): "one",
386
+ (): "empty"
387
+ }"
388
+ `);
389
+ });
390
+
391
+ it("emits empty frozenset keys as `frozenset()` not `frozenset({})`", () => {
392
+ // `frozenset({})` reads like it's constructing from an empty dict.
393
+ const value = {
394
+ "text/plain+frozenset:[]": "empty",
395
+ "text/plain+frozenset:[1]": "single",
396
+ };
397
+ expect(getCopyValue(value)).toMatchInlineSnapshot(`
398
+ "{
399
+ frozenset(): "empty",
400
+ frozenset({1}): "single"
401
+ }"
402
+ `);
403
+ });
404
+
405
+ it("decodes NaN/Inf float keys to valid Python literals", () => {
406
+ const value = {
407
+ "text/plain+float:nan": "n",
408
+ "text/plain+float:inf": "p",
409
+ "text/plain+float:-inf": "m",
410
+ };
411
+ expect(getCopyValue(value)).toMatchInlineSnapshot(`
412
+ "{
413
+ float('nan'): "n",
414
+ float('inf'): "p",
415
+ -float('inf'): "m"
416
+ }"
417
+ `);
418
+ });
419
+
420
+ it("unescapes string keys that looked encoded", () => {
421
+ const value = {
422
+ "text/plain+str:text/plain+int:2": "hello",
423
+ };
424
+ expect(getCopyValue(value)).toMatchInlineSnapshot(`
425
+ "{
426
+ "text/plain+int:2": "hello"
427
+ }"
428
+ `);
429
+ });
430
+
431
+ it("decodes keys at every nesting level", () => {
432
+ const value = {
433
+ outer: {
434
+ "text/plain+int:1": "inner",
435
+ "text/plain+tuple:[2, 3]": "tup",
436
+ },
437
+ };
438
+ expect(getCopyValue(value)).toMatchInlineSnapshot(`
439
+ "{
440
+ "outer": {
441
+ 1: "inner",
442
+ (2, 3): "tup"
443
+ }
444
+ }"
445
+ `);
446
+ });
447
+
448
+ it("leaves plain string keys untouched", () => {
449
+ const value = { foo: 1, bar: 2 };
450
+ expect(getCopyValue(value)).toMatchInlineSnapshot(`
451
+ "{
452
+ "foo": 1,
453
+ "bar": 2
454
+ }"
455
+ `);
456
+ });
457
+ });
458
+
314
459
  describe("getCopyValue with application/ mimetypes", () => {
315
460
  it("should strip application/ mimetype prefix from leaf data", () => {
316
461
  expect(getCopyValue("application/json:{data}")).toBe('"{data}"');
@@ -15,7 +15,19 @@ export const RunningNotebooksContext = React.createContext<{
15
15
  runningNotebooks: new Map(),
16
16
  setRunningNotebooks: Functions.NOOP,
17
17
  });
18
- export const WorkspaceRootContext = React.createContext<string>("");
18
+
19
+ /**
20
+ * Context providing the workspace root plus a `refreshWorkspace` hook used by
21
+ * file actions (rename/duplicate/delete) so they can invalidate both the
22
+ * workspace tree and any sibling views (e.g. recent notebooks) in one call.
23
+ */
24
+ export const WorkspaceContext = React.createContext<{
25
+ root: string;
26
+ refreshWorkspace: () => void;
27
+ }>({
28
+ root: "",
29
+ refreshWorkspace: Functions.NOOP,
30
+ });
19
31
 
20
32
  export const includeMarkdownAtom = atomWithStorage<boolean>(
21
33
  "marimo:home:include-markdown",
@@ -14,7 +14,7 @@ import {
14
14
  SearchIcon,
15
15
  } from "lucide-react";
16
16
  import type React from "react";
17
- import { Suspense, use, useEffect, useRef, useState } from "react";
17
+ import { Suspense, use, useEffect, useMemo, useRef, useState } from "react";
18
18
  import {
19
19
  type NodeApi,
20
20
  type NodeRendererProps,
@@ -22,16 +22,27 @@ import {
22
22
  type TreeApi,
23
23
  } from "react-arborist";
24
24
  import { useLocale } from "react-aria";
25
+ import useEvent from "react-use-event-hook";
25
26
  import { MarkdownIcon } from "@/components/editor/cell/code/icons";
26
27
  import {
27
28
  FILE_ICON as FILE_TYPE_ICONS,
28
29
  type FileIconType as FileType,
29
30
  guessFileIconType as guessFileType,
30
31
  } from "@/components/editor/file-tree/file-icons";
32
+ import { FileNameInput } from "@/components/editor/file-tree/file-name-input";
33
+ import {
34
+ DeleteMenuItem,
35
+ DuplicateMenuItem,
36
+ FileActionsDropdown,
37
+ RenameMenuItem,
38
+ useFileOperations,
39
+ useNotebookFileActions,
40
+ } from "@/components/editor/file-tree/file-operations";
31
41
  import { useImperativeModal } from "@/components/modal/ImperativeModal";
32
42
  import { AlertDialogDestructiveAction } from "@/components/ui/alert-dialog";
33
43
  import { Button } from "@/components/ui/button";
34
44
  import { Checkbox } from "@/components/ui/checkbox";
45
+ import { DropdownMenuSeparator } from "@/components/ui/dropdown-menu";
35
46
  import { Label } from "@/components/ui/label";
36
47
  import { Tooltip } from "@/components/ui/tooltip";
37
48
  import { toast } from "@/components/ui/use-toast";
@@ -61,7 +72,7 @@ import {
61
72
  expandedFoldersAtom,
62
73
  includeMarkdownAtom,
63
74
  RunningNotebooksContext,
64
- WorkspaceRootContext,
75
+ WorkspaceContext,
65
76
  } from "../home/state";
66
77
  import { Spinner } from "../icons/spinner";
67
78
  import { Input } from "../ui/input";
@@ -131,7 +142,7 @@ const HomePage: React.FC = () => {
131
142
  files={recents.files}
132
143
  />
133
144
  <ErrorBoundary>
134
- <WorkspaceNotebooks />
145
+ <WorkspaceNotebooks onRefreshRecents={recentsResponse.refetch} />
135
146
  </ErrorBoundary>
136
147
  </div>
137
148
  </RunningNotebooksContext>
@@ -139,7 +150,9 @@ const HomePage: React.FC = () => {
139
150
  );
140
151
  };
141
152
 
142
- const WorkspaceNotebooks: React.FC = () => {
153
+ const WorkspaceNotebooks: React.FC<{ onRefreshRecents: () => void }> = ({
154
+ onRefreshRecents,
155
+ }) => {
143
156
  const { getWorkspaceFiles } = useRequestClient();
144
157
  const [includeMarkdown, setIncludeMarkdown] = useAtom(includeMarkdownAtom);
145
158
  const [searchText, setSearchText] = useState("");
@@ -154,6 +167,19 @@ const WorkspaceNotebooks: React.FC = () => {
154
167
  [includeMarkdown],
155
168
  );
156
169
 
170
+ // Fire-and-forget refresh of both the workspace tree and the "Recent
171
+ // notebooks" list — file mutations on the workspace tree can affect both,
172
+ // so we invalidate them together rather than having two refresh triggers.
173
+ const refreshWorkspace = useEvent(() => {
174
+ refetch();
175
+ onRefreshRecents();
176
+ });
177
+
178
+ const workspaceContextValue = useMemo(
179
+ () => ({ root: workspace?.root ?? "", refreshWorkspace }),
180
+ [workspace?.root, refreshWorkspace],
181
+ );
182
+
157
183
  if (isPending) {
158
184
  return <Spinner centered={true} size="xlarge" className="mt-6" />;
159
185
  }
@@ -167,7 +193,7 @@ const WorkspaceNotebooks: React.FC = () => {
167
193
  }
168
194
 
169
195
  return (
170
- <WorkspaceRootContext value={workspace.root}>
196
+ <WorkspaceContext value={workspaceContextValue}>
171
197
  <div className="flex flex-col gap-2">
172
198
  {workspace.hasMore && (
173
199
  <Banner kind="warn" className="rounded p-4">
@@ -216,7 +242,7 @@ const WorkspaceNotebooks: React.FC = () => {
216
242
  <NotebookFileTree searchText={searchText} files={workspace.files} />
217
243
  </div>
218
244
  </div>
219
- </WorkspaceRootContext>
245
+ </WorkspaceContext>
220
246
  );
221
247
  };
222
248
 
@@ -244,6 +270,8 @@ const NotebookFileTree: React.FC<{
244
270
  const [openState, setOpenState] = useAtom(expandedFoldersAtom);
245
271
  const openStateIsEmpty = Object.keys(openState).length === 0;
246
272
  const ref = useRef<TreeApi<FileInfo>>(undefined);
273
+ const { root, refreshWorkspace } = use(WorkspaceContext);
274
+ const { renameFile } = useFileOperations({ root });
247
275
 
248
276
  useEffect(() => {
249
277
  // If empty, collapse all
@@ -252,6 +280,21 @@ const NotebookFileTree: React.FC<{
252
280
  }
253
281
  }, [openStateIsEmpty]);
254
282
 
283
+ const handleRename = useEvent(async (id: string, name: string) => {
284
+ const node = ref.current?.get(id);
285
+ if (!node) {
286
+ toast({
287
+ title: "Failed",
288
+ description: `Node with id ${id} not found in the tree`,
289
+ });
290
+ return;
291
+ }
292
+ const result = await renameFile(node.data, name);
293
+ if (result) {
294
+ refreshWorkspace();
295
+ }
296
+ });
297
+
255
298
  if (files.length === 0) {
256
299
  return (
257
300
  <div className="flex flex-col px-5 py-10 items-center justify-center">
@@ -277,6 +320,9 @@ const NotebookFileTree: React.FC<{
277
320
  const prevOpen = openState[id] ?? false;
278
321
  setOpenState({ ...openState, [id]: !prevOpen });
279
322
  }}
323
+ onRename={async ({ id, name }) => {
324
+ await handleRename(id, name);
325
+ }}
280
326
  padding={5}
281
327
  rowHeight={35}
282
328
  indent={15}
@@ -286,7 +332,6 @@ const NotebookFileTree: React.FC<{
286
332
  // Disable interactions
287
333
  disableDrop={true}
288
334
  disableDrag={true}
289
- disableEdit={true}
290
335
  disableMultiSelection={true}
291
336
  >
292
337
  {Node}
@@ -301,11 +346,24 @@ const Node = ({ node, style }: NodeRendererProps<FileInfo>) => {
301
346
 
302
347
  const Icon = FILE_TYPE_ICONS[fileType];
303
348
  const iconEl = <Icon className="w-5 h-5 shrink-0" strokeWidth={1.5} />;
304
- const root = use(WorkspaceRootContext);
349
+ const { root } = use(WorkspaceContext);
350
+ const { runningNotebooks } = use(RunningNotebooksContext);
305
351
 
306
352
  const renderItem = () => {
307
353
  const itemClassName =
308
354
  "flex items-center pl-1 cursor-pointer hover:bg-accent/50 hover:text-accent-foreground rounded-l flex-1 overflow-hidden h-full pr-3 gap-2";
355
+
356
+ // Inline rename input; react-arborist flips `node.isEditing` when
357
+ // `node.edit()` is called from the FileActions menu.
358
+ if (node.isEditing) {
359
+ return (
360
+ <div className={itemClassName}>
361
+ {iconEl}
362
+ <FileNameInput node={node} />
363
+ </div>
364
+ );
365
+ }
366
+
309
367
  if (node.data.isDirectory) {
310
368
  return (
311
369
  <span className={itemClassName}>
@@ -322,6 +380,7 @@ const Node = ({ node, style }: NodeRendererProps<FileInfo>) => {
322
380
 
323
381
  const isMarkdown =
324
382
  relativePath.endsWith(".md") || relativePath.endsWith(".qmd");
383
+ const isRunning = runningNotebooks.has(relativePath);
325
384
 
326
385
  return (
327
386
  <a
@@ -334,10 +393,19 @@ const Node = ({ node, style }: NodeRendererProps<FileInfo>) => {
334
393
  {node.data.name}
335
394
  {isMarkdown && <MarkdownIcon className="ml-2 inline opacity-80" />}
336
395
  </span>
337
- <SessionShutdownButton filePath={relativePath} />
396
+
397
+ <FileActions node={node} isRunning={isRunning} />
398
+ {/*
399
+ Trailing action slots. Using a fixed-width row here (rather than
400
+ conditionally rendered inline elements) keeps every row's right
401
+ edge aligned even though any individual slot may be empty.
402
+ */}
403
+ <div className="w-8 h-8 flex items-center justify-center shrink-0">
404
+ <SessionShutdownButton filePath={relativePath} />
405
+ </div>
338
406
  <ExternalLinkIcon
339
407
  size={20}
340
- className="group-hover:opacity-100 opacity-0 text-primary"
408
+ className="group-hover:opacity-100 opacity-0 text-primary shrink-0"
341
409
  />
342
410
  </a>
343
411
  );
@@ -362,6 +430,44 @@ const Node = ({ node, style }: NodeRendererProps<FileInfo>) => {
362
430
  );
363
431
  };
364
432
 
433
+ const FileActions = ({
434
+ node,
435
+ isRunning,
436
+ }: {
437
+ node: NodeApi<FileInfo>;
438
+ isRunning: boolean;
439
+ }) => {
440
+ const { root, refreshWorkspace } = use(WorkspaceContext);
441
+ const { handleRename, handleDuplicate, handleDelete } =
442
+ useNotebookFileActions({ node, root, onAfterChange: refreshWorkspace });
443
+
444
+ const lockedReason = isRunning
445
+ ? "Stop the notebook's kernel before renaming or deleting."
446
+ : undefined;
447
+
448
+ return (
449
+ <FileActionsDropdown
450
+ testId="workspace-more-button"
451
+ buttonClassName="w-8 h-8 p-0 shrink-0"
452
+ contentClassName="print:hidden w-fit min-w-[140px]"
453
+ preventDefaultOnTrigger={true}
454
+ >
455
+ <RenameMenuItem
456
+ onSelect={handleRename}
457
+ disabled={isRunning}
458
+ title={lockedReason}
459
+ />
460
+ <DuplicateMenuItem onSelect={handleDuplicate} />
461
+ <DropdownMenuSeparator />
462
+ <DeleteMenuItem
463
+ onSelect={handleDelete}
464
+ disabled={isRunning}
465
+ title={lockedReason}
466
+ />
467
+ </FileActionsDropdown>
468
+ );
469
+ };
470
+
365
471
  const FolderArrow = ({ node }: { node: NodeApi<FileInfo> }) => {
366
472
  if (!node.data.isDirectory) {
367
473
  return <span className="w-5 h-5 shrink-0" />;
@@ -10,6 +10,14 @@ import {
10
10
  } from "@/__tests__/branded";
11
11
 
12
12
  type Base64String = components["schemas"]["Base64String"];
13
+ interface TestIslandApp {
14
+ id: string;
15
+ cells: { code: string; idx: number; output: string }[];
16
+ }
17
+ interface TestExportContext {
18
+ trusted: true;
19
+ notebookCode?: string;
20
+ }
13
21
 
14
22
  // Mock browser APIs before any imports
15
23
  vi.stubGlobal(
@@ -33,8 +41,23 @@ class MockURL {
33
41
  vi.stubGlobal("URL", MockURL);
34
42
 
35
43
  // Mock the worker RPC before importing the bridge
36
- const mockBridge = vi.fn();
37
- const mockLoadPackages = vi.fn();
44
+ const {
45
+ mockBridge,
46
+ mockLoadPackages,
47
+ mockStartSessionRequest,
48
+ mockParseMarimoIslandApps,
49
+ mockCreateMarimoFile,
50
+ mockGetMarimoExportContext,
51
+ } = vi.hoisted(() => ({
52
+ mockBridge: vi.fn(),
53
+ mockLoadPackages: vi.fn(),
54
+ mockStartSessionRequest: vi.fn(),
55
+ mockParseMarimoIslandApps: vi.fn<() => TestIslandApp[]>(() => []),
56
+ mockCreateMarimoFile: vi.fn(),
57
+ mockGetMarimoExportContext: vi.fn<() => TestExportContext | undefined>(
58
+ () => undefined,
59
+ ),
60
+ }));
38
61
 
39
62
  vi.mock("@/core/wasm/rpc", () => ({
40
63
  getWorkerRPC: () => ({
@@ -42,7 +65,7 @@ vi.mock("@/core/wasm/rpc", () => ({
42
65
  request: {
43
66
  bridge: mockBridge,
44
67
  loadPackages: mockLoadPackages,
45
- startSession: vi.fn(),
68
+ startSession: mockStartSessionRequest,
46
69
  },
47
70
  send: {
48
71
  consumerReady: vi.fn(),
@@ -54,8 +77,8 @@ vi.mock("@/core/wasm/rpc", () => ({
54
77
 
55
78
  // Mock the parse module to avoid DOM dependencies
56
79
  vi.mock("../parse", () => ({
57
- parseMarimoIslandApps: () => [],
58
- createMarimoFile: vi.fn(),
80
+ parseMarimoIslandApps: mockParseMarimoIslandApps,
81
+ createMarimoFile: mockCreateMarimoFile,
59
82
  }));
60
83
 
61
84
  // Mock uuid to have predictable tokens
@@ -63,6 +86,10 @@ vi.mock("@/utils/uuid", () => ({
63
86
  generateUUID: () => "test-uuid-12345",
64
87
  }));
65
88
 
89
+ vi.mock("@/core/static/export-context", () => ({
90
+ getMarimoExportContext: mockGetMarimoExportContext,
91
+ }));
92
+
66
93
  // Mock getMarimoVersion
67
94
  vi.mock("@/core/meta/globals", () => ({
68
95
  getMarimoVersion: () => "0.0.0-test",
@@ -71,6 +98,7 @@ vi.mock("@/core/meta/globals", () => ({
71
98
  // Mock the jotai store
72
99
  vi.mock("@/core/state/jotai", () => ({
73
100
  store: {
101
+ get: vi.fn(),
74
102
  set: vi.fn(),
75
103
  },
76
104
  }));
@@ -83,9 +111,92 @@ describe("IslandsPyodideBridge", () => {
83
111
 
84
112
  beforeEach(() => {
85
113
  vi.clearAllMocks();
114
+ mockParseMarimoIslandApps.mockReturnValue([]);
115
+ mockCreateMarimoFile.mockReset();
116
+ mockGetMarimoExportContext.mockReturnValue(undefined);
86
117
  bridge = new IslandsPyodideBridge({ autoStartSessions: false });
87
118
  });
88
119
 
120
+ describe("startSessionsForAllApps", () => {
121
+ it("should prefer trusted export notebook code when there is exactly one reactive app", async () => {
122
+ mockParseMarimoIslandApps.mockReturnValue([
123
+ {
124
+ id: "app-1",
125
+ cells: [{ code: "x = 1", idx: 0, output: "<div>1</div>" }],
126
+ },
127
+ ]);
128
+ mockGetMarimoExportContext.mockReturnValue({
129
+ trusted: true,
130
+ notebookCode:
131
+ "import marimo\napp = marimo.App()\n@app.cell\ndef __():\n x = 1\n return",
132
+ });
133
+
134
+ await (
135
+ bridge as unknown as { startSessionsForAllApps(): Promise<void> }
136
+ ).startSessionsForAllApps();
137
+
138
+ expect(mockCreateMarimoFile).not.toHaveBeenCalled();
139
+ expect(mockStartSessionRequest).toHaveBeenCalledWith({
140
+ appId: "app-1",
141
+ code: "import marimo\napp = marimo.App()\n@app.cell\ndef __():\n x = 1\n return",
142
+ });
143
+ });
144
+
145
+ it("should keep synthesized per-app files for multiple reactive apps even when export context exists", async () => {
146
+ mockParseMarimoIslandApps.mockReturnValue([
147
+ {
148
+ id: "app-1",
149
+ cells: [{ code: "x = 1", idx: 0, output: "<div>1</div>" }],
150
+ },
151
+ {
152
+ id: "app-2",
153
+ cells: [{ code: "y = 2", idx: 0, output: "<div>2</div>" }],
154
+ },
155
+ ]);
156
+ mockGetMarimoExportContext.mockReturnValue({
157
+ trusted: true,
158
+ notebookCode: "full notebook should be ignored",
159
+ });
160
+ mockCreateMarimoFile
161
+ .mockReturnValueOnce("generated app 1")
162
+ .mockReturnValueOnce("generated app 2");
163
+
164
+ await (
165
+ bridge as unknown as { startSessionsForAllApps(): Promise<void> }
166
+ ).startSessionsForAllApps();
167
+
168
+ expect(mockCreateMarimoFile).toHaveBeenCalledTimes(2);
169
+ expect(mockStartSessionRequest).toHaveBeenNthCalledWith(1, {
170
+ appId: "app-1",
171
+ code: "generated app 1",
172
+ });
173
+ expect(mockStartSessionRequest).toHaveBeenNthCalledWith(2, {
174
+ appId: "app-2",
175
+ code: "generated app 2",
176
+ });
177
+ });
178
+
179
+ it("should synthesize a file for a single app when no trusted export context is present", async () => {
180
+ mockParseMarimoIslandApps.mockReturnValue([
181
+ {
182
+ id: "app-1",
183
+ cells: [{ code: "x = 1", idx: 0, output: "<div>1</div>" }],
184
+ },
185
+ ]);
186
+ mockCreateMarimoFile.mockReturnValue("generated app 1");
187
+
188
+ await (
189
+ bridge as unknown as { startSessionsForAllApps(): Promise<void> }
190
+ ).startSessionsForAllApps();
191
+
192
+ expect(mockCreateMarimoFile).toHaveBeenCalledTimes(1);
193
+ expect(mockStartSessionRequest).toHaveBeenCalledWith({
194
+ appId: "app-1",
195
+ code: "generated app 1",
196
+ });
197
+ });
198
+ });
199
+
89
200
  describe("sendComponentValues", () => {
90
201
  it("should include type field and token in control request", async () => {
91
202
  const request = {