@marimo-team/islands 0.20.2 → 0.20.3-dev77

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 (570) hide show
  1. package/dist/{ConnectedDataExplorerComponent-BMiGWK57.js → ConnectedDataExplorerComponent-DUS-zJoR.js} +12 -12
  2. package/dist/{_baseIsEqual-DN5YkPnl.js → _baseIsEqual-5cAxzk6f.js} +42 -41
  3. package/dist/_basePickBy-3JVb5wYm.js +47 -0
  4. package/dist/{_baseProperty-6juuyX7Z.js → _baseProperty-D1nWkRMz.js} +12 -12
  5. package/dist/_baseSlice-BrVixxuc.js +10 -0
  6. package/dist/{_baseUniq-BlF21ach.js → _baseUniq-DSSiFuIJ.js} +10 -6
  7. package/dist/{any-language-editor-1OMbohwD.js → any-language-editor-BL9o7y0_.js} +31 -30
  8. package/dist/apl-lHFVoxx7.js +4 -0
  9. package/dist/{arc-9nABupDE.js → arc-DXxE-tFl.js} +2 -2
  10. package/dist/architecture-7HQA4BMR-BxkNpYRp.js +6 -0
  11. package/dist/{architectureDiagram-VXUJARFQ-DhN0C3Xf.js → architectureDiagram-VXUJARFQ-DrJeyFHq.js} +19 -19
  12. package/dist/asciiarmor-DqCdZUHI.js +4 -0
  13. package/dist/asn1-DEcwtw-q.js +4 -0
  14. package/dist/{blockDiagram-VD42YOAC-DrBkIcbV.js → blockDiagram-VD42YOAC-BJrP6qKc.js} +53 -53
  15. package/dist/brainfuck-Bro9Oz5x.js +4 -0
  16. package/dist/{c4Diagram-YG6GDRKO-pWt4zmu0.js → c4Diagram-YG6GDRKO-Bo4gytQ5.js} +6 -6
  17. package/dist/{channel-C56Jz8EL.js → channel-IWLGkaBE.js} +1 -1
  18. package/dist/{chunk-4BX2VUAB-WmXmzRBr.js → chunk-4BX2VUAB-CwMMQLZ_.js} +1 -1
  19. package/dist/{chunk-S6J4BHB3-zfWjyfUg.js → chunk-4F5CHEZ2-CxKDFd-t.js} +2 -2
  20. package/dist/{chunk-55IACEB6-irYMvHJu.js → chunk-55IACEB6-Dj8CzJvE.js} +1 -1
  21. package/dist/{chunk-5FQGJX7Z-pOElJy8t.js → chunk-5FQGJX7Z-BkzUmppO.js} +2 -2
  22. package/dist/{chunk-ABZYJK2D-BwNsaa1P.js → chunk-ABZYJK2D-CRwanrkd.js} +3 -3
  23. package/dist/{chunk-ATLVNIR6-DtFMAawc.js → chunk-ATLVNIR6-CMMCMvOK.js} +2 -2
  24. package/dist/{chunk-FWNWRKHM-DmrwhAQr.js → chunk-B2363JML-e_W7KW1D.js} +2 -2
  25. package/dist/{chunk-B4BG7PRW-lfWcLlzS.js → chunk-B4BG7PRW-BNsHrGHG.js} +7 -7
  26. package/dist/{chunk-CVBHYZKI-Bb2XMuXJ.js → chunk-CVBHYZKI-D8iwHsLF.js} +1 -1
  27. package/dist/{chunk-DI55MBZ5-RhhAimfG.js → chunk-DI55MBZ5-DQeYbfMV.js} +6 -6
  28. package/dist/{chunk-XAJISQIX-CZ8Bi1-x.js → chunk-DR5Q36YT-D4q96vNV.js} +2 -2
  29. package/dist/{chunk-EXTU4WIE-Bmo660a9.js → chunk-EXTU4WIE-CV_DQeaX.js} +2 -2
  30. package/dist/{chunk-FMBD7UC4-C0DZU_4q.js → chunk-FMBD7UC4-XTL4xAvH.js} +1 -1
  31. package/dist/{chunk-LBM3YZW2-BkxsqkNK.js → chunk-FRFDVMJY-C7q09nvl.js} +2 -2
  32. package/dist/{chunk-HN2XXSSU-BsB4dtgF.js → chunk-HN2XXSSU-CzO5Phf0.js} +1 -1
  33. package/dist/{chunk-JA3XYJ7Z-n8UTzfok.js → chunk-JA3XYJ7Z-Cmt--e0q.js} +3 -3
  34. package/dist/{chunk-JZLCHNYA-ChKqHUdB.js → chunk-JZLCHNYA-CkyMJnI9.js} +6 -6
  35. package/dist/{chunk-MI3HLSF2-DeDZS-tQ.js → chunk-MI3HLSF2-DvCKDmpi.js} +1 -1
  36. package/dist/{chunk-N4CR4FBY-BxOHGL3P.js → chunk-N4CR4FBY-BJfHtJbD.js} +7 -7
  37. package/dist/{chunk-T53DSG4Q-Bewz1tiU.js → chunk-PL6DKKU2-ChKBqnoD.js} +2 -2
  38. package/dist/{chunk-QN33PNHL-Dda-55xY.js → chunk-QN33PNHL-WOLIPUAJ.js} +2 -2
  39. package/dist/{chunk-QXUST7PY-ClIEpoCT.js → chunk-QXUST7PY-DYuD50pU.js} +10 -10
  40. package/dist/{chunk-QZHKN3VN-Diy_Cdek.js → chunk-QZHKN3VN-CYbwZKgJ.js} +1 -1
  41. package/dist/{chunk-S3R3BYOJ-C_1SJcWo.js → chunk-S3R3BYOJ-CsnX6RKs.js} +8 -8
  42. package/dist/{chunk-76Q3JFCE-CQ6a2yGJ.js → chunk-SJTYNZTY-j6_1s5om.js} +2 -2
  43. package/dist/{chunk-FPAJGGOC-quWdfNUB.js → chunk-TCCFYFTB-DdLCbCTn.js} +3995 -3985
  44. package/dist/{chunk-LHMN2FUI-CgYPnxfN.js → chunk-TQ3KTPDO-CGsUIC73.js} +2 -2
  45. package/dist/{chunk-TZMSLE5B-XW3duOft.js → chunk-TZMSLE5B-B3eYTGCw.js} +3 -3
  46. package/dist/{chunk-O7ZBX7Z2-CdpLwOP0.js → chunk-UMXZTB3W--LdAK3Bv.js} +2 -2
  47. package/dist/classDiagram-2ON5EDUG-C7C-oefv.js +30 -0
  48. package/dist/classDiagram-v2-WZHVMYZB-UTw37Gg8.js +30 -0
  49. package/dist/{clike-B90WKs4D.js → clike-CLJYUAWw.js} +1 -1
  50. package/dist/clojure-B2uhdQPa.js +4 -0
  51. package/dist/{clone-V9hndNcj.js → clone-BJrS4PdE.js} +1 -1
  52. package/dist/cmake-B9WXyQcc.js +4 -0
  53. package/dist/cobol-CPD3EJfO.js +4 -0
  54. package/dist/{code-block-37QAKDTI-zh5AeoJo.js → code-block-37QAKDTI-DV_ZyoUh.js} +1 -1
  55. package/dist/coffeescript-KD9TnEnS.js +4 -0
  56. package/dist/commonlisp-DNEULz_Q.js +4 -0
  57. package/dist/{constants-BGRTDzdW.js → constants-D1Tbg_6B.js} +3 -2
  58. package/dist/{cose-bilkent-S5V4N54A-BK1nIR2J.js → cose-bilkent-S5V4N54A-BCDTZDay.js} +2 -2
  59. package/dist/crystal-DVPNgAPQ.js +4 -0
  60. package/dist/css-fq3a1AH1.js +4 -0
  61. package/dist/cypher-Dtzq0BP7.js +4 -0
  62. package/dist/d-DcZudIhJ.js +4 -0
  63. package/dist/{dagre-6UL2VRFP-BArPH353.js → dagre-6UL2VRFP-BgsUhJrV.js} +88 -87
  64. package/dist/{dagre-Dcgyn_Uy.js → dagre-CyZCGfV_.js} +41 -84
  65. package/dist/{data-grid-overlay-editor-BVFT970w.js → data-grid-overlay-editor-BD0BFHzy.js} +2 -2
  66. package/dist/{diagram-PSM6KHXK-B1xAkr9y.js → diagram-PSM6KHXK-BIUUOfKo.js} +22 -22
  67. package/dist/{diagram-QEK2KX5R-CaoqwzPb.js → diagram-QEK2KX5R-BFjolZQv.js} +17 -17
  68. package/dist/{diagram-S2PKOQOG-NXCsFLvR.js → diagram-S2PKOQOG-4jfkWoZw.js} +17 -17
  69. package/dist/diff-D9BPDC3o.js +4 -0
  70. package/dist/{dist-IlWGXVjO.js → dist-7ZF--V_D.js} +2 -2
  71. package/dist/dist-BAeGo2rp.js +5 -0
  72. package/dist/{dist-Ey9hP8-j.js → dist-BBcqvpvP.js} +1 -1
  73. package/dist/{dist-DpAbrLuF.js → dist-BFL9TlzD.js} +5 -5
  74. package/dist/{dist-CD7uLx0M.js → dist-BLThQiU4.js} +2 -2
  75. package/dist/{dist-CoZ8kKKW.js → dist-BT6_J2eq.js} +1 -1
  76. package/dist/{dist-C_9IMrtt.js → dist-BTQbjEKU.js} +1 -1
  77. package/dist/dist-BqwCMSEa.js +5 -0
  78. package/dist/{dist-CUOuFgHt.js → dist-BuapEdlD.js} +113 -58
  79. package/dist/dist-Bum8FwTO.js +6 -0
  80. package/dist/{dist-LNp8svLl.js → dist-BwQHkjA9.js} +4 -4
  81. package/dist/dist-C0YiOwt_.js +5 -0
  82. package/dist/dist-C2uPv4iU.js +5 -0
  83. package/dist/{dist-Dmr_nXF6.js → dist-C4XMUaob.js} +2 -2
  84. package/dist/dist-C5hOLsJN.js +8 -0
  85. package/dist/{dist-a6Obzr07.js → dist-C6z8U-ms.js} +2 -2
  86. package/dist/dist-C9NIAKMs.js +8 -0
  87. package/dist/{dist-EZFqUJhh.js → dist-CB6qhQ8K.js} +1 -1
  88. package/dist/dist-CCrzTtvk.js +5 -0
  89. package/dist/dist-CFS9i1rS.js +8 -0
  90. package/dist/{dist-CMOy93xY.js → dist-CFToYDWO.js} +2 -2
  91. package/dist/{dist-DF_77D2B.js → dist-COpDrwi-.js} +1 -1
  92. package/dist/{dist-D8EhXZ4S.js → dist-CYo3w-nC.js} +3 -3
  93. package/dist/{dist-Dv2Phbh5.js → dist-Cb3cLT39.js} +2 -2
  94. package/dist/{dist-DOLQQtWK.js → dist-Ch_JuCvc.js} +3 -3
  95. package/dist/{dist-Cb3iqED3.js → dist-Cqpjy6bK.js} +1 -1
  96. package/dist/{dist-BswsDM4k.js → dist-CsqiXw7J.js} +2 -2
  97. package/dist/{dist-BoagoQQw.js → dist-CwtEWuFb.js} +2 -2
  98. package/dist/dist-CyHZuhPH.js +5 -0
  99. package/dist/dist-CzcjWdIk.js +6 -0
  100. package/dist/{dist-BUEi7EKT.js → dist-D0f6Yrrb.js} +1 -1
  101. package/dist/{dist-C5QB1NtD.js → dist-D7ZGWV_9.js} +3 -3
  102. package/dist/{dist-CrAYcS_4.js → dist-DEFZ7dnD.js} +2 -2
  103. package/dist/{dist-DrC0QKFK.js → dist-DMS81OrU.js} +1 -1
  104. package/dist/{dist-iyBCcLRa.js → dist-DUxS2paD.js} +2 -2
  105. package/dist/dist-DaYyUSNC.js +5 -0
  106. package/dist/{dist-W6TdeACj.js → dist-De9X_Des.js} +1 -1
  107. package/dist/dist-DpDcJYNh.js +8 -0
  108. package/dist/{dist-bz6WguLy.js → dist-I8MQW60_.js} +2 -2
  109. package/dist/{dist-BGzkWRSl.js → dist-IW_ARJ3S.js} +4 -4
  110. package/dist/{dist-xCB683Dh.js → dist-Qjf6pcqK.js} +2 -2
  111. package/dist/{dist-B_i29Q6L.js → dist-UYm1IE5s.js} +2 -2
  112. package/dist/dist-U_BfxcPn.js +5 -0
  113. package/dist/{dist-iDeoXzdN.js → dist-ovDpXuSB.js} +1 -1
  114. package/dist/{dockerfile-D1Q_4uCN.js → dockerfile-BxhYdLHL.js} +1 -1
  115. package/dist/dtd-FhG-tVom.js +4 -0
  116. package/dist/dylan-HWpZOBPw.js +4 -0
  117. package/dist/ecl-B_rcje1I.js +4 -0
  118. package/dist/eiffel-oqHyHs6f.js +4 -0
  119. package/dist/elm-B62RQEds.js +4 -0
  120. package/dist/{erDiagram-Q2GNP2WA-DWCa11g5.js → erDiagram-Q2GNP2WA-Cq5Bz5lG.js} +15 -15
  121. package/dist/erlang-CjRjjA-B.js +4 -0
  122. package/dist/{esm-DZSk8vt3.js → esm-BxMbHo0y.js} +107 -107
  123. package/dist/factor-CGH_TnIV.js +4 -0
  124. package/dist/{factor--4HHM8Rw.js → factor-Png_OsVt.js} +1 -1
  125. package/dist/{flowDiagram-NV44I4VS-BQ5PQs4L.js → flowDiagram-NV44I4VS-6WPJVFl7.js} +17 -17
  126. package/dist/forth-5N06oHNp.js +4 -0
  127. package/dist/fortran-wZ-sNg3h.js +4 -0
  128. package/dist/{ganttDiagram-JELNMOA3-NTOuNWeT.js → ganttDiagram-JELNMOA3-AfDhh9CI.js} +10 -10
  129. package/dist/gas-3H4_FaS8.js +4 -0
  130. package/dist/gherkin-PEA2uy50.js +4 -0
  131. package/dist/{gitGraph-F6HP7TQM-DfRNsaDw.js → gitGraph-G5XIXVHT-C0o6gecv.js} +3 -3
  132. package/dist/{gitGraphDiagram-NY62KEGX-CYke62Ot.js → gitGraphDiagram-V2S2FVAM-BRSwuj0Q.js} +17 -17
  133. package/dist/{glide-data-editor-DttqGjrT.js → glide-data-editor-ByPNTNVG.js} +7 -7
  134. package/dist/graphlib-DZnBMcsX.js +228 -0
  135. package/dist/groovy-DZzbvCP1.js +4 -0
  136. package/dist/haskell-CExLTzho.js +4 -0
  137. package/dist/haxe-f3pVb8qU.js +5 -0
  138. package/dist/idl-BbWlJ0gk.js +4 -0
  139. package/dist/{info-NVLQJR56-CUaoPtis.js → info-VBDWY6EO-Bzsods6X.js} +3 -3
  140. package/dist/infoDiagram-HS3SLOUP-Cmxo6jKx.js +30 -0
  141. package/dist/{_baseFor-B69PDbIz.js → isArrayLikeObject-Btu-i6_P.js} +216 -44
  142. package/dist/{isEmpty-6z2uv6gM.js → isEmpty-CZvUtYFp.js} +2 -2
  143. package/dist/{isString-D6abkXrl.js → isString-CBr7TEb7.js} +1 -1
  144. package/dist/{isSymbol-hk7foJ70.js → isSymbol-BuQsMXhk.js} +1 -1
  145. package/dist/javascript-eMOhp6Aq.js +4 -0
  146. package/dist/{journeyDiagram-XKPGCS4Q-ahXD97kr.js → journeyDiagram-XKPGCS4Q-CKYr8cSR.js} +7 -7
  147. package/dist/julia-C6w3Rvqb.js +4 -0
  148. package/dist/{kanban-definition-3W4ZIXB7-CiTIpnhy.js → kanban-definition-3W4ZIXB7-DVvAZzQD.js} +12 -12
  149. package/dist/{katex-DaGuLbVh.js → katex-pyO_klYC.js} +1 -1
  150. package/dist/{label-Cc5tEavt.js → label-CV0KYhtH.js} +4 -10
  151. package/dist/{line-Bc27KE1D.js → line-C1k1rG3Z.js} +3 -3
  152. package/dist/{linear-Bnc6E9kA.js → linear-DIp6l9sg.js} +4 -4
  153. package/dist/livescript-ChQl9lD-.js +4 -0
  154. package/dist/{loader-Cob3XFOw.js → loader-eJCvvApN.js} +2 -2
  155. package/dist/lua-CiDvI96j.js +4 -0
  156. package/dist/main-Tj_-QTyF.js +4321 -0
  157. package/dist/main.js +2019 -5031
  158. package/dist/mathematica-ClVO4k7N.js +4 -0
  159. package/dist/mbox-BEI7DeUg.js +4 -0
  160. package/dist/{memoize-Ckyqzyu_.js → memoize-P1T1IGb9.js} +1 -1
  161. package/dist/merge-CGQkMGzr.js +51 -0
  162. package/dist/{mermaid-4DMBBIKO-BmJdHPwx.js → mermaid-4DMBBIKO-PVrJfEpX.js} +1 -1
  163. package/dist/{mermaid-B5xl_2hx.js → mermaid-COOB_abB.js} +46 -46
  164. package/dist/{mermaid-parser.core-BXj7Il0J.js → mermaid-parser.core-Cd-wu4tE.js} +8 -8
  165. package/dist/{mhchem-B_tiMbKF.js → mhchem-DckvwtV8.js} +1 -1
  166. package/dist/min-CMDDtXJP.js +89 -0
  167. package/dist/{mindmap-definition-VGOIOE7T-Mni766A_.js → mindmap-definition-VGOIOE7T-1ExmnvYy.js} +14 -14
  168. package/dist/mirc-DwidJ3iH.js +4 -0
  169. package/dist/mllike-Dspdy0xJ.js +6 -0
  170. package/dist/modelica-CIUejP-L.js +4 -0
  171. package/dist/mscgen-BWXU4Omp.js +6 -0
  172. package/dist/mumps-PHFFoPk5.js +4 -0
  173. package/dist/now-BxlRp0OQ.js +7 -0
  174. package/dist/nsis-B7xooKLf.js +4 -0
  175. package/dist/{nsis-B6EN9LWI.js → nsis-BrAITej_.js} +1 -1
  176. package/dist/ntriples-DnOgtCzG.js +4 -0
  177. package/dist/{number-overlay-editor-DKVJgXpp.js → number-overlay-editor-CQrncFlP.js} +1 -1
  178. package/dist/octave-Cn5kH_QT.js +4 -0
  179. package/dist/{once-C9dA9qgQ.js → once-BqS42WgZ.js} +1 -1
  180. package/dist/{ordinal-DLLbwLkP.js → ordinal-Dcvf4J1m.js} +1 -1
  181. package/dist/oz-DR-sROpu.js +4 -0
  182. package/dist/{packet-BFZMPI3H-DHtQCusE.js → packet-DYOGHKS2-Bf1CvFco.js} +3 -3
  183. package/dist/pascal-CPKK1zcS.js +4 -0
  184. package/dist/perl-D7FuFdyd.js +4 -0
  185. package/dist/{pie-7BOR55EZ-2sVLYbpR.js → pie-VRWISCQL-LY_wbqji.js} +3 -3
  186. package/dist/{pieDiagram-ADFJNKIX-PbXpgT8_.js → pieDiagram-ADFJNKIX-CJlIsdsU.js} +22 -22
  187. package/dist/pig-CEXnOAnI.js +4 -0
  188. package/dist/powershell-BKvWab7q.js +4 -0
  189. package/dist/{precisionRound-Duzbr5ur.js → precisionRound-BAc-kQ3q.js} +1 -1
  190. package/dist/properties-7jnK_vYx.js +4 -0
  191. package/dist/protobuf-4rslMjEN.js +4 -0
  192. package/dist/pug-BVwdEv4r.js +4 -0
  193. package/dist/{pug-xrm7jQ2R.js → pug-CH-17az-.js} +1 -1
  194. package/dist/puppet-iSHg_1Z2.js +4 -0
  195. package/dist/python-tK3wUCn0.js +4 -0
  196. package/dist/q-DP_Dcoox.js +4 -0
  197. package/dist/{quadrantDiagram-AYHSOK5B-BtXGnx8i.js → quadrantDiagram-AYHSOK5B-BU78RiaH.js} +5 -5
  198. package/dist/r-C32wHLYu.js +4 -0
  199. package/dist/{radar-NHE76QYJ-Be0pEUux.js → radar-ZZBFDIW7-Ro3iXZCk.js} +3 -3
  200. package/dist/range-Dh0_-r8P.js +30 -0
  201. package/dist/{react-vega-CCNu2JE0.js → react-vega-C6kwcd86.js} +18 -18
  202. package/dist/react-vega-CFUuchds.js +9 -0
  203. package/dist/reduce-BXFHs7IQ.js +268 -0
  204. package/dist/{requirementDiagram-UZGBJVZJ-DxzXQRgq.js → requirementDiagram-UZGBJVZJ-DACHtrFr.js} +14 -14
  205. package/dist/rpm-BbDBUfs9.js +5 -0
  206. package/dist/ruby-COfWUiIr.js +4 -0
  207. package/dist/{sankeyDiagram-TZEHDZUN-D-I7dJ0_.js → sankeyDiagram-TZEHDZUN-Bzg7_UWs.js} +5 -5
  208. package/dist/sas-y_Hue2-X.js +4 -0
  209. package/dist/scheme-7jTCqHw8.js +4 -0
  210. package/dist/{sequenceDiagram-WL72ISMW-VDme2ljw.js → sequenceDiagram-WL72ISMW-agybEe9J.js} +8 -8
  211. package/dist/shell-DAqJWXDk.js +4 -0
  212. package/dist/sieve-EaqnbCO3.js +4 -0
  213. package/dist/slides-component-B0yK5GXP.js +3057 -0
  214. package/dist/smalltalk-DL03YKLJ.js +4 -0
  215. package/dist/sparql-DTA-tQ_q.js +4 -0
  216. package/dist/{spec-GwhMEXwK.js → spec-Dq_reDGM.js} +4 -4
  217. package/dist/{src-jICM_d2B.js → src-CHUphWwL.js} +1 -1
  218. package/dist/{stateDiagram-FKZM4ZOC-g3GI1EcK.js → stateDiagram-FKZM4ZOC-DehQAt8g.js} +19 -19
  219. package/dist/stateDiagram-v2-4FDKWEC3-8VzeREl9.js +29 -0
  220. package/dist/{step-BqVgkWtk.js → step-BbmiiQdf.js} +1 -1
  221. package/dist/stex-KfRnSHzF.js +4 -0
  222. package/dist/style.css +1 -1
  223. package/dist/stylus-CfjeFry_.js +4 -0
  224. package/dist/swift-Dl0RRDbH.js +4 -0
  225. package/dist/tcl-wv9O7fLZ.js +4 -0
  226. package/dist/textile-DzMRCBcV.js +4 -0
  227. package/dist/{time-CrYsYnQU.js → time-DFFVNc1Q.js} +4 -4
  228. package/dist/{timeline-definition-IT6M3QCI-bhvLlX_b.js → timeline-definition-IT6M3QCI-CdCfdaCF.js} +4 -4
  229. package/dist/toNumber-By7s5JC_.js +28 -0
  230. package/dist/{toString-BwTJvlyD.js → toString-Ckpb50uw.js} +8 -8
  231. package/dist/toml-CyIWqgbe.js +4 -0
  232. package/dist/{treemap-KMMF4GRG-Ba9ifjpG.js → treemap-GDKQZRPO-DRxfDG65.js} +3 -3
  233. package/dist/troff-_huin_CY.js +4 -0
  234. package/dist/ttcn-BEiJuYYc.js +4 -0
  235. package/dist/ttcn-cfg-DB6Ksh67.js +4 -0
  236. package/dist/turtle-DzhzGEum.js +4 -0
  237. package/dist/{types-Dsh6yC4B.js → types-BwnzGcE4.js} +31 -32
  238. package/dist/uniq-cCc07Q8K.js +8 -0
  239. package/dist/{useAsyncData-BPpyKjTJ.js → useAsyncData-B4hMFGnF.js} +2 -2
  240. package/dist/{useDeepCompareMemoize-C8Ms87P-.js → useDeepCompareMemoize-DuPhOXzr.js} +3 -3
  241. package/dist/{useIframeCapabilities-C7z8VrZ1.js → useIframeCapabilities-CAt6D2EI.js} +1 -1
  242. package/dist/{useTheme-Cq-gIssy.js → useTheme-BNYQnvu-.js} +2 -2
  243. package/dist/vb-CngKZQHu.js +4 -0
  244. package/dist/vbscript-BV_8nbeM.js +4 -0
  245. package/dist/{vega-component-B5sxdjMq.js → vega-component-DouPy8AI.js} +12 -15
  246. package/dist/{vega-loader.browser-DqHiiBeQ.js → vega-loader.browser-CQ-lnUkI.js} +3 -3
  247. package/dist/velocity-IqE7qYKE.js +4 -0
  248. package/dist/verilog-xtyaWTnc.js +4 -0
  249. package/dist/vhdl-BaqXCtf3.js +4 -0
  250. package/dist/webidl-BDB8PTTO.js +4 -0
  251. package/dist/xquery-BIC-qj9Z.js +4 -0
  252. package/dist/{xychartDiagram-PRI3JC2R-CFxuifYY.js → xychartDiagram-PRI3JC2R-rEm_SIsC.js} +13 -13
  253. package/dist/yacas-ifv5tftd.js +4 -0
  254. package/dist/z80-B8zOMVNt.js +4 -0
  255. package/package.json +11 -11
  256. package/src/__mocks__/requests.ts +2 -0
  257. package/src/components/app-config/ai-config.tsx +1 -1
  258. package/src/components/app-config/user-config-form.tsx +27 -0
  259. package/src/components/data-table/__tests__/pagination.test.tsx +16 -24
  260. package/src/components/data-table/charts/lazy-chart.tsx +1 -1
  261. package/src/components/data-table/data-table.tsx +20 -18
  262. package/src/components/data-table/pagination.tsx +138 -56
  263. package/src/components/data-table/range-focus/__tests__/cell-selection-stats.test.tsx +365 -0
  264. package/src/components/data-table/range-focus/__tests__/test-utils.ts +77 -0
  265. package/src/components/data-table/range-focus/__tests__/utils.test.ts +205 -65
  266. package/src/components/data-table/range-focus/cell-selection-stats.tsx +79 -0
  267. package/src/components/data-table/range-focus/utils.ts +69 -7
  268. package/src/components/data-table/types.ts +4 -0
  269. package/src/components/databases/engine-variable.tsx +2 -1
  270. package/src/components/databases/icons/google-cloud-storage.svg +38 -0
  271. package/src/components/datasources/components.tsx +6 -2
  272. package/src/components/dependency-graph/minimap-content.tsx +3 -5
  273. package/src/components/dependency-graph/utils/__tests__/cell-preview.test.ts +143 -0
  274. package/src/components/dependency-graph/utils/cell-preview.ts +46 -0
  275. package/src/components/editor/Output.tsx +3 -28
  276. package/src/components/editor/actions/__tests__/pdf-export.test.ts +42 -0
  277. package/src/components/editor/actions/pdf-export.ts +26 -0
  278. package/src/components/editor/actions/useNotebookActions.tsx +86 -44
  279. package/src/components/editor/cell/cell-actions.tsx +6 -5
  280. package/src/components/editor/cell/cell-context-menu.tsx +11 -7
  281. package/src/components/editor/chrome/panels/components.tsx +88 -0
  282. package/src/components/editor/chrome/panels/file-explorer-panel.tsx +120 -7
  283. package/src/components/editor/chrome/panels/outline/floating-outline.tsx +27 -15
  284. package/src/components/editor/chrome/panels/session-panel.tsx +24 -35
  285. package/src/components/editor/controls/notebook-menu-dropdown.tsx +32 -29
  286. package/src/components/editor/file-tree/__tests__/requesting-tree.test.ts +17 -1
  287. package/src/components/editor/file-tree/file-explorer.tsx +38 -6
  288. package/src/components/editor/file-tree/file-header.tsx +61 -0
  289. package/src/components/editor/file-tree/file-viewer.tsx +88 -167
  290. package/src/components/editor/file-tree/renderers.tsx +142 -21
  291. package/src/components/editor/file-tree/requesting-tree.tsx +6 -2
  292. package/src/components/editor/output/console/ConsoleOutput.tsx +34 -2
  293. package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +13 -0
  294. package/src/components/icons/marimo-icons.tsx +173 -0
  295. package/src/components/markdown/markdown-renderer.tsx +3 -20
  296. package/src/components/pages/run-page.tsx +2 -2
  297. package/src/components/storage/components.tsx +86 -0
  298. package/src/components/storage/storage-file-viewer.tsx +225 -0
  299. package/src/components/storage/storage-inspector.tsx +610 -0
  300. package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +79 -0
  301. package/src/core/ai/tools/edit-notebook-tool.ts +5 -0
  302. package/src/core/cells/__tests__/cells.test.ts +30 -0
  303. package/src/core/cells/cells.ts +6 -1
  304. package/src/core/cells/outline.ts +7 -1
  305. package/src/core/cells/outputs.ts +20 -8
  306. package/src/core/codemirror/language/languages/sql/sql.ts +76 -62
  307. package/src/core/codemirror/language/panel/sql.tsx +3 -3
  308. package/src/core/codemirror/lsp/__tests__/normalize-markdown-math.test.ts +123 -0
  309. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +196 -0
  310. package/src/core/codemirror/lsp/normalize-markdown-math.ts +381 -0
  311. package/src/core/codemirror/lsp/notebook-lsp.ts +59 -3
  312. package/src/core/config/feature-flag.tsx +2 -0
  313. package/src/core/dom/__tests__/outline.test.ts +48 -0
  314. package/src/core/dom/outline.ts +13 -2
  315. package/src/core/islands/bridge.ts +2 -0
  316. package/src/core/islands/main.ts +2 -0
  317. package/src/core/network/__tests__/requests-network.test.ts +21 -0
  318. package/src/core/network/requests-lazy.ts +2 -0
  319. package/src/core/network/requests-network.ts +16 -0
  320. package/src/core/network/requests-static.ts +2 -0
  321. package/src/core/network/requests-toasting.tsx +2 -0
  322. package/src/core/network/types.ts +6 -0
  323. package/src/core/storage/__tests__/state.test.ts +345 -0
  324. package/src/core/storage/__tests__/types.test.ts +83 -0
  325. package/src/core/storage/__tests__/useStorageEntries.test.tsx +187 -0
  326. package/src/core/storage/request-registry.ts +36 -0
  327. package/src/core/storage/state.ts +132 -0
  328. package/src/core/storage/types.ts +57 -0
  329. package/src/core/wasm/bridge.ts +2 -0
  330. package/src/core/websocket/useMarimoKernelConnection.tsx +19 -1
  331. package/src/hooks/__tests__/useNonce.test.tsx +127 -0
  332. package/src/hooks/__tests__/useOverflowDetection.test.tsx +127 -0
  333. package/src/hooks/useNonce.ts +6 -5
  334. package/src/hooks/useOverflowDetection.ts +36 -0
  335. package/src/plugins/impl/MatrixPlugin.tsx +5 -2
  336. package/src/plugins/impl/__tests__/MatrixPlugin.test.tsx +1 -1
  337. package/src/plugins/impl/code/any-language-editor.tsx +14 -3
  338. package/src/utils/__tests__/download.test.tsx +39 -0
  339. package/src/utils/__tests__/filenames.test.ts +54 -1
  340. package/src/utils/download.ts +21 -1
  341. package/src/utils/filenames.ts +42 -0
  342. package/dist/apl-C1bki_dE.js +0 -4
  343. package/dist/architecture-U656AL7Q-Jd2CvPgJ.js +0 -6
  344. package/dist/asciiarmor-BdlkCCRr.js +0 -4
  345. package/dist/asn1-CvE30hox.js +0 -4
  346. package/dist/brainfuck-BalwWy1a.js +0 -4
  347. package/dist/classDiagram-2ON5EDUG-CUJlS_eo.js +0 -30
  348. package/dist/classDiagram-v2-WZHVMYZB-BhSPpbkE.js +0 -30
  349. package/dist/clojure-CUC2I1hM.js +0 -4
  350. package/dist/cmake-8PcMxXnB.js +0 -4
  351. package/dist/cobol-DkkkDz5v.js +0 -4
  352. package/dist/coffeescript-CCupxOZf.js +0 -4
  353. package/dist/commonlisp-DhUfGX6b.js +0 -4
  354. package/dist/crystal-DSaw6rFQ.js +0 -4
  355. package/dist/css-D4QDewkG.js +0 -4
  356. package/dist/cypher-CrYVqw_F.js +0 -4
  357. package/dist/d-Cr3H3pPx.js +0 -4
  358. package/dist/diff-ODiZJGls.js +0 -4
  359. package/dist/dist-BA-HK7pI.js +0 -5
  360. package/dist/dist-BD5GU948.js +0 -5
  361. package/dist/dist-BIYmAsND.js +0 -5
  362. package/dist/dist-BcKTJXJi.js +0 -5
  363. package/dist/dist-BgnrtcWg.js +0 -8
  364. package/dist/dist-C1njTlBq.js +0 -5
  365. package/dist/dist-CSKHwJYH.js +0 -5
  366. package/dist/dist-CSKKyiIq.js +0 -5
  367. package/dist/dist-CrQ_pOuK.js +0 -6
  368. package/dist/dist-Cskx1daf.js +0 -5
  369. package/dist/dist-D4i0Ef34.js +0 -8
  370. package/dist/dist-DOcn61TX.js +0 -8
  371. package/dist/dist-DwMejAPB.js +0 -6
  372. package/dist/dist-DzSe1wby.js +0 -8
  373. package/dist/dtd-C-t2Rk7F.js +0 -4
  374. package/dist/dylan-B4ctBLGp.js +0 -4
  375. package/dist/ecl-DqWfymni.js +0 -4
  376. package/dist/eiffel-DjBKKAr7.js +0 -4
  377. package/dist/elm--fxeC0FV.js +0 -4
  378. package/dist/erlang-CaKXCX6H.js +0 -4
  379. package/dist/factor-DlLO5EFS.js +0 -4
  380. package/dist/flatten-CWZjF1fc.js +0 -8
  381. package/dist/forth-rOO6LVj_.js +0 -4
  382. package/dist/fortran-CUg15VGR.js +0 -4
  383. package/dist/gas-BMRJspiW.js +0 -4
  384. package/dist/gherkin-DRxzijZU.js +0 -4
  385. package/dist/graphlib-CwMnCnQ9.js +0 -362
  386. package/dist/groovy-BmrQ8pUP.js +0 -4
  387. package/dist/haskell-BuaYfKOz.js +0 -4
  388. package/dist/haxe-DcH9eA0a.js +0 -5
  389. package/dist/idl-DGlcm4Ls.js +0 -4
  390. package/dist/infoDiagram-WHAUD3N6-B42WjAPh.js +0 -30
  391. package/dist/javascript-CeTk7rzr.js +0 -4
  392. package/dist/julia-BoP_q1gm.js +0 -4
  393. package/dist/livescript-B7IMN-ba.js +0 -4
  394. package/dist/lua-q1InavKb.js +0 -4
  395. package/dist/main-DmxVpB19.js +0 -1089
  396. package/dist/mathematica-DvR8-_EI.js +0 -4
  397. package/dist/mbox-7h5MNBS_.js +0 -4
  398. package/dist/merge-Db4Uulx4.js +0 -222
  399. package/dist/min-ypdVXicC.js +0 -38
  400. package/dist/mirc-D-XM8A5c.js +0 -4
  401. package/dist/mllike-BQGkkbmf.js +0 -6
  402. package/dist/modelica-D_yRj_WU.js +0 -4
  403. package/dist/mscgen-B-rltAjp.js +0 -6
  404. package/dist/mumps-2kh8TU2b.js +0 -4
  405. package/dist/now-Dwu5ou19.js +0 -31
  406. package/dist/nsis-CtusEqwb.js +0 -4
  407. package/dist/ntriples-BdAXw6zV.js +0 -4
  408. package/dist/octave-CsNFmVp5.js +0 -4
  409. package/dist/oz-odIXCrKd.js +0 -4
  410. package/dist/pascal-B9Mfk3Fo.js +0 -4
  411. package/dist/perl-C48inLcz.js +0 -4
  412. package/dist/pig-uwRtAssU.js +0 -4
  413. package/dist/powershell-CXqlca-i.js +0 -4
  414. package/dist/properties-D6Zu1rpK.js +0 -4
  415. package/dist/protobuf-BlNNWZaR.js +0 -4
  416. package/dist/pug-DytcK7bv.js +0 -4
  417. package/dist/puppet-lJ8Ok3iY.js +0 -4
  418. package/dist/python-cMaF7kUp.js +0 -4
  419. package/dist/q-Dgt2HYQh.js +0 -4
  420. package/dist/r-Bm4S4awf.js +0 -4
  421. package/dist/range-D9jxVFd_.js +0 -67
  422. package/dist/react-vega-1ub36dPZ.js +0 -9
  423. package/dist/reduce-C6NEPj6s.js +0 -133
  424. package/dist/rpm-_8LbzMVc.js +0 -5
  425. package/dist/ruby-Cr8IJ5VZ.js +0 -4
  426. package/dist/sas-CFcSfo2_.js +0 -4
  427. package/dist/scheme-N4XRoKgc.js +0 -4
  428. package/dist/shell-B4L7f_ds.js +0 -4
  429. package/dist/sieve-UI6J3Gm0.js +0 -4
  430. package/dist/slides-component-ql7-5GDI.js +0 -3048
  431. package/dist/smalltalk-BuaPZAZU.js +0 -4
  432. package/dist/sparql-1rKrq463.js +0 -4
  433. package/dist/stateDiagram-v2-4FDKWEC3-7i6jBXe6.js +0 -29
  434. package/dist/stex-D2rme5UG.js +0 -4
  435. package/dist/stylus-DvSovJEP.js +0 -4
  436. package/dist/swift-D-_E7Yyb.js +0 -4
  437. package/dist/tcl-Di5sAVHN.js +0 -4
  438. package/dist/textile-Benwt66z.js +0 -4
  439. package/dist/toml-CeOvPOkY.js +0 -4
  440. package/dist/troff-DJN9hfgu.js +0 -4
  441. package/dist/ttcn-DQW2Psjf.js +0 -4
  442. package/dist/ttcn-cfg-zFG_MNpg.js +0 -4
  443. package/dist/turtle-DHRyNlSc.js +0 -4
  444. package/dist/vb-CXWH9DD-.js +0 -4
  445. package/dist/vbscript-qr8qVck5.js +0 -4
  446. package/dist/velocity-C_9pUJRx.js +0 -4
  447. package/dist/verilog-DxBstgBa.js +0 -4
  448. package/dist/vhdl-odUxAbE6.js +0 -4
  449. package/dist/webidl-Dfn5Rku4.js +0 -4
  450. package/dist/xquery-CrJs6SXr.js +0 -4
  451. package/dist/yacas-B-uDDLZe.js +0 -4
  452. package/dist/z80-51gxgAXE.js +0 -4
  453. /package/dist/{ImageComparisonComponent-CRbA-1eg.js → ImageComparisonComponent-BYQfAfSR.js} +0 -0
  454. /package/dist/{Plot-C9vQQj4X.js → Plot-DfUav0o0.js} +0 -0
  455. /package/dist/{_arrayReduce-REKcIEj3.js → _arrayReduce-BfFy684W.js} +0 -0
  456. /package/dist/{_hasUnicode-DrSAc5A5.js → _hasUnicode-C32WqUu7.js} +0 -0
  457. /package/dist/{apl-Oc3bL26_.js → apl-DRxKiEot.js} +0 -0
  458. /package/dist/{array-CEIRxyh3.js → array-D-nrDupM.js} +0 -0
  459. /package/dist/{asciiarmor-DTbPh2VI.js → asciiarmor-C8HoXFIm.js} +0 -0
  460. /package/dist/{asn1-CGhwu1Ri.js → asn1-9Bo0DYT-.js} +0 -0
  461. /package/dist/{asterisk-Crp-Pien.js → asterisk-BsiuGzWq.js} +0 -0
  462. /package/dist/{brainfuck-CA0L8lRq.js → brainfuck-Db8njC-p.js} +0 -0
  463. /package/dist/{click-outside-container-C_k38vlR.js → click-outside-container-CKfwEZqH.js} +0 -0
  464. /package/dist/{clike-CEtUBPHD.js → clike-CFhUNtI5.js} +0 -0
  465. /package/dist/{clojure-BszjvdGo.js → clojure-CX7oovsp.js} +0 -0
  466. /package/dist/{cmake-B2Gvps8b.js → cmake-C29AR2kk.js} +0 -0
  467. /package/dist/{cobol-DuMch8nn.js → cobol-CNkuRW9i.js} +0 -0
  468. /package/dist/{coffeescript-L9aKXVsJ.js → coffeescript-BJAbfGam.js} +0 -0
  469. /package/dist/{colors-DR_aHfmQ.js → colors-6nB_pSln.js} +0 -0
  470. /package/dist/{common-keywords-NhoiR-2S.js → common-keywords-BAkLFdud.js} +0 -0
  471. /package/dist/{commonlisp-CrtdssxB.js → commonlisp-BTNhj2l9.js} +0 -0
  472. /package/dist/{crystal-vvNY0LpY.js → crystal-CZc0nIm9.js} +0 -0
  473. /package/dist/{css-B1GdzqT1.js → css-L2-0OTXc.js} +0 -0
  474. /package/dist/{cypher-BtZvV7bW.js → cypher-Dnc6MXl0.js} +0 -0
  475. /package/dist/{cytoscape.esm-CgJFiP_E.js → cytoscape.esm-BXzSsA6N.js} +0 -0
  476. /package/dist/{d-B0UN3V-Z.js → d-C6X9iIga.js} +0 -0
  477. /package/dist/{defaultLocale-DjFHq3Xk.js → defaultLocale-Bklbu-Tp.js} +0 -0
  478. /package/dist/{defaultLocale-B_A76Zpk.js → defaultLocale-CfQ4kBaV.js} +0 -0
  479. /package/dist/{diff-DOpgjj1W.js → diff-ZzKinYqY.js} +0 -0
  480. /package/dist/{dist-BYznkC5E.js → dist-Bymy0kEH.js} +0 -0
  481. /package/dist/{dtd-Ctnjxrle.js → dtd-CytEpkAo.js} +0 -0
  482. /package/dist/{duckdb-keywords-BnNtuiVz.js → duckdb-keywords-C1WxmSfG.js} +0 -0
  483. /package/dist/{dylan-DFXkoaZy.js → dylan-CZByFBEQ.js} +0 -0
  484. /package/dist/{ebnf-CFKHGc8c.js → ebnf-BF2FOt-m.js} +0 -0
  485. /package/dist/{ecl-C1NExZip.js → ecl-Cp7L1F5B.js} +0 -0
  486. /package/dist/{eiffel-uXVGgleg.js → eiffel-C66yjnFL.js} +0 -0
  487. /package/dist/{elm-CBOFnnib.js → elm-DtHo-73e.js} +0 -0
  488. /package/dist/{emotion-is-prop-valid.esm--WpIBtj8.js → emotion-is-prop-valid.esm-DtW2o230.js} +0 -0
  489. /package/dist/{erlang-DMnrT8XK.js → erlang-C_sj44mF.js} +0 -0
  490. /package/dist/{error-banner-vCG-EbUQ.js → error-banner-D0tXnwl4.js} +0 -0
  491. /package/dist/{esm-0_ieXYNc.js → esm-BWftfC-A.js} +0 -0
  492. /package/dist/{fcl-DPZwieM9.js → fcl-BhLcvRo_.js} +0 -0
  493. /package/dist/{forth-DDpxS4nw.js → forth-CIDHh56T.js} +0 -0
  494. /package/dist/{fortran-B6uYqQMz.js → fortran-BQrDVXRU.js} +0 -0
  495. /package/dist/{gas-BKnWzuFz.js → gas-D4HQPB0Q.js} +0 -0
  496. /package/dist/{gherkin-pBt0wT4X.js → gherkin-UB2gJHdT.js} +0 -0
  497. /package/dist/{groovy-DKsn4ppB.js → groovy-DVz6jkOx.js} +0 -0
  498. /package/dist/{haskell-BJVBJQcy.js → haskell-CpUdAPCz.js} +0 -0
  499. /package/dist/{haxe-rLN5UZU5.js → haxe-DCV5_cqD.js} +0 -0
  500. /package/dist/{http-AQJFxSug.js → http-C_TDb8VX.js} +0 -0
  501. /package/dist/{idl-B4mwMAo-.js → idl-D7WCIgHw.js} +0 -0
  502. /package/dist/{init-TaqZJsBY.js → init-Ci8VD8ZH.js} +0 -0
  503. /package/dist/{invariant-D-K49MfV.js → invariant-D9QLJ4SZ.js} +0 -0
  504. /package/dist/{javascript-Hf2NLNC0.js → javascript-B2Rn0Lmd.js} +0 -0
  505. /package/dist/{julia-GGpx21YN.js → julia-ApprtEaw.js} +0 -0
  506. /package/dist/{katex-Ba7xZPrx.js → katex-Bk_FvVSR.js} +0 -0
  507. /package/dist/{livescript-CSvXMspZ.js → livescript-BMLIlM7C.js} +0 -0
  508. /package/dist/{lua-CVMR5LMW.js → lua-DdDaW3tC.js} +0 -0
  509. /package/dist/{math-CTnb-N1W.js → math-HUZifhTs.js} +0 -0
  510. /package/dist/{mathematica-JENNt-p4.js → mathematica-PnNN7c2Z.js} +0 -0
  511. /package/dist/{mbox-mzifoc8E.js → mbox-B84OtHBK.js} +0 -0
  512. /package/dist/{mirc-BXoiItvN.js → mirc-BVWXJxIq.js} +0 -0
  513. /package/dist/{mllike-H-KR9OuH.js → mllike-BawXWupH.js} +0 -0
  514. /package/dist/{modelica-B6Hm3mMl.js → modelica-C8-X4Hf_.js} +0 -0
  515. /package/dist/{mscgen-D8TF_Hei.js → mscgen-BOM6dDj8.js} +0 -0
  516. /package/dist/{mumps-CD-kNPt4.js → mumps-DQOY8n05.js} +0 -0
  517. /package/dist/{nginx-hpek_Tnq.js → nginx-DkMgA__9.js} +0 -0
  518. /package/dist/{node-sql-parser-ChQUJk8A.js → node-sql-parser-D53LM_7b.js} +0 -0
  519. /package/dist/{ntriples-DgnpxU40.js → ntriples-DU8VrXdW.js} +0 -0
  520. /package/dist/{octave-CkobqyVm.js → octave-BzTIBsQ8.js} +0 -0
  521. /package/dist/{oz-ChDLd9tS.js → oz-DKFcZsoi.js} +0 -0
  522. /package/dist/{pascal-CvlkwK7E.js → pascal-DHBZ15pT.js} +0 -0
  523. /package/dist/{path-7gr7eZmp.js → path-BVI7RNUv.js} +0 -0
  524. /package/dist/{perl-BNEFTNbM.js → perl-75NMI3w0.js} +0 -0
  525. /package/dist/{pig-Cd1DMS7P.js → pig-B-HY1fo_.js} +0 -0
  526. /package/dist/{powershell-CPxA0zpc.js → powershell-DEH22U53.js} +0 -0
  527. /package/dist/{properties-BaFBm-Xa.js → properties-B1MzBoJC.js} +0 -0
  528. /package/dist/{protobuf-BQV_-X0H.js → protobuf-Dr14KV0p.js} +0 -0
  529. /package/dist/{puppet-LXLST0mx.js → puppet-C4z38l7v.js} +0 -0
  530. /package/dist/{purify.es-D4vaFt5N.js → purify.es-CyOIw8ru.js} +0 -0
  531. /package/dist/{python-DLjLzX4k.js → python-D2L7Nknt.js} +0 -0
  532. /package/dist/{q-DswTX1Y9.js → q-PxipHfgS.js} +0 -0
  533. /package/dist/{r-CO7NpMwE.js → r-CEMMu_Tf.js} +0 -0
  534. /package/dist/{range-DwpxnYuB.js → range-BToS7LsA.js} +0 -0
  535. /package/dist/{rpm-BlmEDT6r.js → rpm-D3xyahkR.js} +0 -0
  536. /package/dist/{ruby-BTPKgeZZ.js → ruby-DwEkwdiu.js} +0 -0
  537. /package/dist/{sas-DTDTiNO8.js → sas-L1W0BRft.js} +0 -0
  538. /package/dist/{scheme-UzAAg4GJ.js → scheme-CTybTrX0.js} +0 -0
  539. /package/dist/{shell-DQ0hQCsB.js → shell-BSx3LZnu.js} +0 -0
  540. /package/dist/{sieve-BVyYIx9u.js → sieve-BjUfbv-6.js} +0 -0
  541. /package/dist/{simple-mode-Dryu-fC9.js → simple-mode-IPZGFbI6.js} +0 -0
  542. /package/dist/{smalltalk-DAdMAHTu.js → smalltalk-BlzuYrMv.js} +0 -0
  543. /package/dist/{solr-BSTJW269.js → solr-Cj_9RM4d.js} +0 -0
  544. /package/dist/{sparql-Bi7quYgw.js → sparql-BXKjQ0cK.js} +0 -0
  545. /package/dist/{spreadsheet-CiBky1_y.js → spreadsheet-CifI10GO.js} +0 -0
  546. /package/dist/{sql-BXZovj-z.js → sql-B0bFyY1c.js} +0 -0
  547. /package/dist/{stex-DIvyJfNO.js → stex-BIsgBmK4.js} +0 -0
  548. /package/dist/{stylus-jhpzcQ6Y.js → stylus-CqrLLVnG.js} +0 -0
  549. /package/dist/{swift-BrO8qThZ.js → swift-DIqvj3_G.js} +0 -0
  550. /package/dist/{tcl-s5QI5gv3.js → tcl-B8bOIGVK.js} +0 -0
  551. /package/dist/{textile-ClhvJrxM.js → textile-DZsjavD_.js} +0 -0
  552. /package/dist/{tiddlywiki-DLTDKQCh.js → tiddlywiki-BbGdvEjx.js} +0 -0
  553. /package/dist/{tiki-tw_kBvbp.js → tiki-BYesmRDo.js} +0 -0
  554. /package/dist/{timer-DV8t68ti.js → timer-CPsmIOdm.js} +0 -0
  555. /package/dist/{toml-TFa3EJQE.js → toml-Uc7m08nl.js} +0 -0
  556. /package/dist/{treemap-CQJ0bIDy.js → treemap-DMn4tIJ7.js} +0 -0
  557. /package/dist/{troff-SqLg0heF.js → troff-GEl5wcXR.js} +0 -0
  558. /package/dist/{ttcn-cfg-Dopc-iwE.js → ttcn-cfg-dZQ_fWTH.js} +0 -0
  559. /package/dist/{ttcn-Cfrap7HJ.js → ttcn-pr4FDOLT.js} +0 -0
  560. /package/dist/{turtle-Dt52DvVH.js → turtle-TPRDOknA.js} +0 -0
  561. /package/dist/{vb-D1pAvfDe.js → vb-BJUAeTYr.js} +0 -0
  562. /package/dist/{vbscript-DZ7RBxn5.js → vbscript-CcJ6Z3ic.js} +0 -0
  563. /package/dist/{velocity-Csau7eZy.js → velocity-pq4ZMzU3.js} +0 -0
  564. /package/dist/{verilog-gXlZACs5.js → verilog-timMNjHt.js} +0 -0
  565. /package/dist/{vhdl-NaUWbI1B.js → vhdl-DYFbVKNm.js} +0 -0
  566. /package/dist/{webidl-BJmPjW01.js → webidl-pue9oqnb.js} +0 -0
  567. /package/dist/{xquery-CJIPsC0g.js → xquery-DeItGynK.js} +0 -0
  568. /package/dist/{yacas-8f2Vjiiz.js → yacas-By2Qrjba.js} +0 -0
  569. /package/dist/{z80-s5Xk2hCP.js → z80-C7iLsyPC.js} +0 -0
  570. /package/src/components/editor/file-tree/__tests__/{file-expolorer.test.ts → file-explorer.test.ts} +0 -0
@@ -0,0 +1,143 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { describe, expect, it } from "vitest";
4
+ import { extractCellPreview } from "../cell-preview";
5
+
6
+ describe("extractCellPreview", () => {
7
+ describe("markdown cells", () => {
8
+ it("extracts heading from f-string triple-double-quoted markdown", () => {
9
+ expect(extractCellPreview('mo.md(f"""# Heading\nbody""")')).toEqual({
10
+ text: "# Heading",
11
+ type: "markdown",
12
+ });
13
+ });
14
+
15
+ it("extracts text from r-prefixed triple-double-quoted markdown", () => {
16
+ expect(extractCellPreview('mo.md(r"""text""")')).toEqual({
17
+ text: "text",
18
+ type: "markdown",
19
+ });
20
+ });
21
+
22
+ it("skips leading empty lines", () => {
23
+ expect(extractCellPreview('mo.md(f"""\n# Heading\n""")')).toEqual({
24
+ text: "# Heading",
25
+ type: "markdown",
26
+ });
27
+ });
28
+
29
+ it("returns undefined text for empty markdown", () => {
30
+ expect(extractCellPreview('mo.md("")')).toEqual({
31
+ text: undefined,
32
+ type: "markdown",
33
+ });
34
+ });
35
+
36
+ it("works with single-quoted strings", () => {
37
+ expect(extractCellPreview("mo.md('single line')")).toEqual({
38
+ text: "single line",
39
+ type: "markdown",
40
+ });
41
+ });
42
+
43
+ it("works with triple-single-quoted strings", () => {
44
+ expect(extractCellPreview("mo.md('''some text''')")).toEqual({
45
+ text: "some text",
46
+ type: "markdown",
47
+ });
48
+ });
49
+
50
+ it("works with fr prefix", () => {
51
+ expect(extractCellPreview('mo.md(fr"""# Title\n{x}""")')).toEqual({
52
+ text: "# Title",
53
+ type: "markdown",
54
+ });
55
+ });
56
+
57
+ it("works with no prefix", () => {
58
+ expect(extractCellPreview('mo.md("""plain text""")')).toEqual({
59
+ text: "plain text",
60
+ type: "markdown",
61
+ });
62
+ });
63
+ });
64
+
65
+ describe("SQL cells", () => {
66
+ it("extracts SQL from assignment with f-string", () => {
67
+ expect(
68
+ extractCellPreview('_df = mo.sql(f"""SELECT * FROM cars""")'),
69
+ ).toEqual({
70
+ text: "SELECT * FROM cars",
71
+ type: "sql",
72
+ });
73
+ });
74
+
75
+ it("skips leading newlines in SQL", () => {
76
+ expect(
77
+ extractCellPreview('_df = mo.sql(f"""\nSELECT * FROM t\n""")'),
78
+ ).toEqual({
79
+ text: "SELECT * FROM t",
80
+ type: "sql",
81
+ });
82
+ });
83
+
84
+ it("returns first line of multi-line SQL", () => {
85
+ expect(
86
+ extractCellPreview(
87
+ '_df = mo.sql(f"""SELECT *\nFROM users\nWHERE id = 1""")',
88
+ ),
89
+ ).toEqual({
90
+ text: "SELECT *",
91
+ type: "sql",
92
+ });
93
+ });
94
+
95
+ it("handles SQL with engine kwarg after string", () => {
96
+ expect(
97
+ extractCellPreview('_df = mo.sql(f"""SELECT 1""", engine=my_engine)'),
98
+ ).toEqual({
99
+ text: "SELECT 1",
100
+ type: "sql",
101
+ });
102
+ });
103
+
104
+ it("returns undefined text for empty SQL string", () => {
105
+ expect(extractCellPreview('_df = mo.sql(f"""""")')).toEqual({
106
+ text: undefined,
107
+ type: "sql",
108
+ });
109
+ });
110
+ });
111
+
112
+ describe("Python fallback", () => {
113
+ it("returns first line of Python code", () => {
114
+ expect(extractCellPreview("import pandas as pd")).toEqual({
115
+ text: "import pandas as pd",
116
+ type: "python",
117
+ });
118
+ });
119
+
120
+ it("returns first line of multi-line Python", () => {
121
+ expect(extractCellPreview("x = 1\ny = 2")).toEqual({
122
+ text: "x = 1",
123
+ type: "python",
124
+ });
125
+ });
126
+
127
+ it("returns undefined text for empty string", () => {
128
+ // MarkdownParser.isSupported("") returns true, so empty cells
129
+ // are classified as markdown — the text is undefined either way.
130
+ expect(extractCellPreview("")).toEqual({
131
+ text: undefined,
132
+ type: "markdown",
133
+ });
134
+ });
135
+
136
+ it("returns undefined text for whitespace-only string", () => {
137
+ expect(extractCellPreview(" \n ")).toEqual({
138
+ text: undefined,
139
+ type: "markdown",
140
+ });
141
+ });
142
+ });
143
+ });
@@ -0,0 +1,46 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { MarkdownParser, SQLParser } from "@marimo-team/smart-cells";
4
+
5
+ export interface CellPreview {
6
+ text: string | undefined;
7
+ type: "python" | "markdown" | "sql";
8
+ }
9
+
10
+ const markdownParser = new MarkdownParser();
11
+ const sqlParser = new SQLParser();
12
+
13
+ function firstNonEmptyLine(content: string): string | undefined {
14
+ for (const line of content.split("\n")) {
15
+ const trimmed = line.trim();
16
+ if (trimmed.length > 0) {
17
+ return trimmed;
18
+ }
19
+ }
20
+ return undefined;
21
+ }
22
+
23
+ /**
24
+ * Extract a human-readable preview and cell type from raw cell code.
25
+ *
26
+ * For markdown cells (`mo.md(...)`) and SQL cells (`mo.sql(...)`),
27
+ * returns the inner content's first non-empty line instead of the
28
+ * Python wrapper boilerplate.
29
+ */
30
+ export function extractCellPreview(code: string): CellPreview {
31
+ const trimmed = code.trim();
32
+
33
+ if (markdownParser.isSupported(trimmed)) {
34
+ const { code: inner } = markdownParser.transformIn(trimmed);
35
+ return { text: firstNonEmptyLine(inner), type: "markdown" };
36
+ }
37
+
38
+ if (sqlParser.isSupported(trimmed)) {
39
+ const { code: inner } = sqlParser.transformIn(trimmed);
40
+ return { text: firstNonEmptyLine(inner), type: "sql" };
41
+ }
42
+
43
+ // Python fallback: first line of raw code
44
+ const firstLine = trimmed.split("\n")[0]?.trim();
45
+ return { text: firstLine || undefined, type: "python" };
46
+ }
@@ -1,12 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- import React, {
3
- memo,
4
- Suspense,
5
- useEffect,
6
- useMemo,
7
- useRef,
8
- useState,
9
- } from "react";
2
+ import React, { memo, Suspense, useMemo, useRef } from "react";
10
3
  import { type CellId, CellOutputId } from "@/core/cells/ids";
11
4
  import type { CellOutput, OutputMessage } from "@/core/kernel/messages";
12
5
  import { cn } from "@/utils/cn";
@@ -30,6 +23,7 @@ import { tooltipHandler } from "@/components/charts/tooltip";
30
23
  import { useExpandedOutput } from "@/core/cells/outputs";
31
24
  import { viewStateAtom } from "@/core/mode";
32
25
  import { useIframeCapabilities } from "@/hooks/useIframeCapabilities";
26
+ import { useOverflowDetection } from "@/hooks/useOverflowDetection";
33
27
  import { renderHTML } from "@/plugins/core/RenderHTML";
34
28
  import { Banner } from "@/plugins/impl/common/error-banner";
35
29
  import type { TopLevelFacetedUnitSpec } from "@/plugins/impl/data-explorer/queries/types";
@@ -427,28 +421,9 @@ const ExpandableOutput = React.memo(
427
421
  }) => {
428
422
  const containerRef = useRef<HTMLDivElement>(null);
429
423
  const [isExpanded, setIsExpanded] = useExpandedOutput(cellId);
430
- const [isOverflowing, setIsOverflowing] = useState(false);
424
+ const isOverflowing = useOverflowDetection(containerRef);
431
425
  const { hasFullscreen } = useIframeCapabilities();
432
426
 
433
- // Create resize observer to detect overflow
434
- useEffect(() => {
435
- if (!containerRef.current) {
436
- return;
437
- }
438
- const el = containerRef.current;
439
-
440
- const detectOverflow = () => {
441
- setIsOverflowing(el.scrollHeight > el.clientHeight);
442
- };
443
-
444
- const resizeObserver = new ResizeObserver(detectOverflow);
445
- resizeObserver.observe(el);
446
-
447
- return () => {
448
- resizeObserver.disconnect();
449
- };
450
- }, [props.id]);
451
-
452
427
  return (
453
428
  <>
454
429
  <div>
@@ -0,0 +1,42 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { describe, expect, it, vi } from "vitest";
4
+ import { runServerSidePDFDownload } from "../pdf-export";
5
+
6
+ describe("runServerSidePDFDownload", () => {
7
+ it("downloads document preset via backend PDF endpoint", async () => {
8
+ const downloadPDF = vi.fn().mockResolvedValue(undefined);
9
+
10
+ await runServerSidePDFDownload({
11
+ filename: "slides.py",
12
+ preset: "document",
13
+ downloadPDF,
14
+ });
15
+
16
+ expect(downloadPDF).toHaveBeenCalledWith({
17
+ filename: "slides.py",
18
+ webpdf: true,
19
+ preset: "document",
20
+ includeInputs: false,
21
+ rasterServer: "live",
22
+ });
23
+ });
24
+
25
+ it("downloads slides preset via backend PDF endpoint", async () => {
26
+ const downloadPDF = vi.fn().mockResolvedValue(undefined);
27
+
28
+ await runServerSidePDFDownload({
29
+ filename: "slides.py",
30
+ preset: "slides",
31
+ downloadPDF,
32
+ });
33
+
34
+ expect(downloadPDF).toHaveBeenCalledWith({
35
+ filename: "slides.py",
36
+ webpdf: true,
37
+ preset: "slides",
38
+ includeInputs: false,
39
+ rasterServer: "live",
40
+ });
41
+ });
42
+ });
@@ -0,0 +1,26 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ type Preset = "document" | "slides";
4
+ type DownloadPDF = (opts: {
5
+ filename: string;
6
+ webpdf: boolean;
7
+ preset: Preset;
8
+ includeInputs: boolean;
9
+ rasterServer: "live" | "static";
10
+ }) => Promise<void>;
11
+
12
+ export async function runServerSidePDFDownload(opts: {
13
+ filename: string;
14
+ preset: Preset;
15
+ downloadPDF: DownloadPDF;
16
+ }): Promise<void> {
17
+ const { filename, preset, downloadPDF } = opts;
18
+
19
+ await downloadPDF({
20
+ filename,
21
+ webpdf: true,
22
+ preset,
23
+ includeInputs: false,
24
+ rasterServer: "live",
25
+ });
26
+ }
@@ -56,10 +56,6 @@ import { disabledCellIds } from "@/core/cells/utils";
56
56
  import { useResolvedMarimoConfig } from "@/core/config/config";
57
57
  import { getFeatureFlag } from "@/core/config/feature-flag";
58
58
  import { Constants } from "@/core/constants";
59
- import {
60
- updateCellOutputsWithScreenshots,
61
- useEnrichCellOutputs,
62
- } from "@/core/export/hooks";
63
59
  import { useLayoutActions, useLayoutState } from "@/core/layout/layout";
64
60
  import { useTogglePresenting } from "@/core/layout/useTogglePresenting";
65
61
  import { kioskModeAtom, viewStateAtom } from "@/core/mode";
@@ -78,7 +74,6 @@ import {
78
74
  } from "@/utils/download";
79
75
  import { Filenames } from "@/utils/filenames";
80
76
  import { Objects } from "@/utils/objects";
81
- import type { ProgressState } from "@/utils/progress";
82
77
  import { newNotebookURL } from "@/utils/urls";
83
78
  import { useRunAllCells } from "../cell/useRunCells";
84
79
  import { useChromeActions, useChromeState } from "../chrome/state";
@@ -88,6 +83,7 @@ import { commandPaletteAtom } from "../controls/state";
88
83
  import { AddDatabaseDialogContent } from "../database/add-database-form";
89
84
  import { displayLayoutName, getLayoutIcon } from "../renderers/layout-select";
90
85
  import { LAYOUT_TYPES } from "../renderers/types";
86
+ import { runServerSidePDFDownload } from "./pdf-export";
91
87
  import type { ActionButton } from "./types";
92
88
  import { useCopyNotebook } from "./useCopyNotebook";
93
89
  import { useHideAllMarkdownCode } from "./useHideAllMarkdownCode";
@@ -122,16 +118,13 @@ export function useNotebookActions() {
122
118
  const setCommandPaletteOpen = useSetAtom(commandPaletteAtom);
123
119
  const setSettingsDialogOpen = useSetAtom(settingDialogAtom);
124
120
  const setKeyboardShortcutsOpen = useSetAtom(keyboardShortcutsAtom);
125
- const { exportAsMarkdown, readCode, saveCellConfig, updateCellOutputs } =
126
- useRequestClient();
121
+ const { exportAsMarkdown, readCode, saveCellConfig } = useRequestClient();
127
122
 
128
123
  const hasDisabledCells = useAtomValue(hasDisabledCellsAtom);
129
124
  const canUndoDeletes = useAtomValue(canUndoDeletesAtom);
130
125
  const { selectedLayout } = useLayoutState();
131
126
  const { setLayoutView } = useLayoutActions();
132
127
  const togglePresenting = useTogglePresenting();
133
- const takeScreenshots = useEnrichCellOutputs();
134
-
135
128
  // Fallback: if sharing is undefined, both are enabled by default
136
129
  const sharingHtmlEnabled = resolvedConfig.sharing?.html ?? true;
137
130
  const sharingWasmEnabled = resolvedConfig.sharing?.wasm ?? true;
@@ -141,6 +134,7 @@ export function useNotebookActions() {
141
134
  // Default export uses browser print, which is better in present mode
142
135
  const pdfDownloadEnabled =
143
136
  isServerSidePdfExportEnabled || viewState.mode === "present";
137
+ const isSlidesLayout = selectedLayout === "slides";
144
138
 
145
139
  const renderCheckboxElement = (checked: boolean) => (
146
140
  <div className="w-8 flex justify-end">
@@ -148,6 +142,39 @@ export function useNotebookActions() {
148
142
  </div>
149
143
  );
150
144
 
145
+ const renderRecommendedElement = (recommended: boolean) => {
146
+ if (!recommended) {
147
+ return null;
148
+ }
149
+ return (
150
+ <span className="ml-3 shrink-0 rounded-full border border-emerald-200 bg-emerald-50 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-emerald-700">
151
+ Recommended
152
+ </span>
153
+ );
154
+ };
155
+
156
+ const downloadServerSidePDF = async ({
157
+ preset,
158
+ title,
159
+ }: {
160
+ preset: "document" | "slides";
161
+ title: string;
162
+ }) => {
163
+ if (!filename) {
164
+ toastNotebookMustBeNamed();
165
+ return;
166
+ }
167
+
168
+ const runDownload = async () => {
169
+ await runServerSidePDFDownload({
170
+ filename,
171
+ preset,
172
+ downloadPDF: downloadAsPDF,
173
+ });
174
+ };
175
+ await withLoadingToast(title, runDownload);
176
+ };
177
+
151
178
  const actions: ActionButton[] = [
152
179
  {
153
180
  icon: <DownloadIcon size={14} strokeWidth={1.5} />,
@@ -226,45 +253,60 @@ export function useNotebookActions() {
226
253
  },
227
254
  },
228
255
  {
256
+ divider: true,
229
257
  icon: <FileIcon size={14} strokeWidth={1.5} />,
230
258
  label: "Download as PDF",
231
- disabled: !pdfDownloadEnabled,
232
- tooltip: pdfDownloadEnabled ? undefined : (
233
- <span>
234
- Only available in app view. <br />
235
- Toggle with: {renderShortcut("global.hideCode", false)}
236
- </span>
237
- ),
238
- handle: async () => {
239
- if (isServerSidePdfExportEnabled) {
240
- if (!filename) {
241
- toastNotebookMustBeNamed();
242
- return;
243
- }
259
+ handle: NOOP_HANDLER,
260
+ disabled: !pdfDownloadEnabled && !isServerSidePdfExportEnabled,
261
+ dropdown: [
262
+ {
263
+ icon: <FileIcon size={14} strokeWidth={1.5} />,
264
+ label: "Document Layout",
265
+ rightElement: renderRecommendedElement(!isSlidesLayout),
266
+ disabled: !pdfDownloadEnabled,
267
+ tooltip: pdfDownloadEnabled ? undefined : (
268
+ <span>
269
+ Only available in app view. <br />
270
+ Toggle with: {renderShortcut("global.hideCode", false)}
271
+ </span>
272
+ ),
273
+ handle: async () => {
274
+ if (isServerSidePdfExportEnabled) {
275
+ await downloadServerSidePDF({
276
+ preset: "document",
277
+ title: "Downloading Document PDF...",
278
+ });
279
+ return;
280
+ }
244
281
 
245
- const downloadPDF = async (progress: ProgressState) => {
246
- await updateCellOutputsWithScreenshots({
247
- takeScreenshots: () => takeScreenshots({ progress }),
248
- updateCellOutputs,
249
- });
250
- await downloadAsPDF({
251
- filename: filename,
252
- webpdf: false,
282
+ const beforeprint = new Event("export-beforeprint");
283
+ const afterprint = new Event("export-afterprint");
284
+ function print() {
285
+ window.dispatchEvent(beforeprint);
286
+ setTimeout(() => window.print(), 0);
287
+ setTimeout(() => window.dispatchEvent(afterprint), 0);
288
+ }
289
+ print();
290
+ },
291
+ },
292
+ {
293
+ icon: <FileIcon size={14} strokeWidth={1.5} />,
294
+ label: "Slides Layout",
295
+ rightElement: renderRecommendedElement(isSlidesLayout),
296
+ disabled: !isServerSidePdfExportEnabled,
297
+ tooltip: isServerSidePdfExportEnabled ? undefined : (
298
+ <span>
299
+ Requires Better PDF Export in Settings &gt; Experimental.
300
+ </span>
301
+ ),
302
+ handle: async () => {
303
+ await downloadServerSidePDF({
304
+ preset: "slides",
305
+ title: "Downloading Slides PDF...",
253
306
  });
254
- };
255
- await withLoadingToast("Downloading PDF...", downloadPDF);
256
- return;
257
- }
258
-
259
- const beforeprint = new Event("export-beforeprint");
260
- const afterprint = new Event("export-afterprint");
261
- function print() {
262
- window.dispatchEvent(beforeprint);
263
- setTimeout(() => window.print(), 0);
264
- setTimeout(() => window.dispatchEvent(afterprint), 0);
265
- }
266
- print();
267
- },
307
+ },
308
+ },
309
+ ],
268
310
  },
269
311
  ],
270
312
  },
@@ -64,6 +64,10 @@ const CellActionsDropdownInternal = (
64
64
  const buttonRef = useRef<HTMLButtonElement>(null);
65
65
  const actions = useCellActionButtons({ cell: props, closePopover });
66
66
 
67
+ const visibleActions = actions
68
+ .map((group) => group.filter((action) => !action.redundant))
69
+ .filter((group) => group.length > 0);
70
+
67
71
  // store the last focused element so we can restore it when the popover closes
68
72
  const restoreFocus = useRestoreFocus();
69
73
 
@@ -112,13 +116,10 @@ const CellActionsDropdownInternal = (
112
116
  />
113
117
  <CommandList>
114
118
  <CommandEmpty>No results</CommandEmpty>
115
- {actions.map((group, i) => (
119
+ {visibleActions.map((group, i) => (
116
120
  <Fragment key={i}>
117
121
  <CommandGroup key={i}>
118
122
  {group.map((action) => {
119
- if (action.redundant) {
120
- return null;
121
- }
122
123
  let body = (
123
124
  <div className="flex items-center flex-1">
124
125
  {action.icon && (
@@ -162,7 +163,7 @@ const CellActionsDropdownInternal = (
162
163
  );
163
164
  })}
164
165
  </CommandGroup>
165
- {i < actions.length - 1 && <CommandSeparator />}
166
+ {i < visibleActions.length - 1 && <CommandSeparator />}
166
167
  </Fragment>
167
168
  ))}
168
169
  </CommandList>
@@ -26,6 +26,7 @@ import { isOutputEmpty } from "@/core/cells/outputs";
26
26
  import { goToDefinitionAtCursorPosition } from "@/core/codemirror/go-to-definition/utils";
27
27
  import { sendToPanelManager } from "@/core/vscode/vscode-bindings";
28
28
  import { copyToClipboard } from "@/utils/copy";
29
+ import { getImageExtension } from "@/utils/filenames";
29
30
  import { Logger } from "@/utils/Logger";
30
31
  import type { ActionButton } from "../actions/types";
31
32
  import {
@@ -154,8 +155,9 @@ export const CellActionsContextMenu = ({
154
155
  handle: () => {
155
156
  if (imageRightClicked) {
156
157
  const link = document.createElement("a");
157
- link.download = "image.png";
158
158
  link.href = imageRightClicked.src;
159
+ const ext = getImageExtension(imageRightClicked.src) || "png";
160
+ link.download = `image.${ext}`;
159
161
  link.click();
160
162
  }
161
163
  },
@@ -174,6 +176,12 @@ export const CellActionsContextMenu = ({
174
176
 
175
177
  const allActions: ActionButton[][] = [DEFAULT_CONTEXT_MENU_ITEMS, ...actions];
176
178
 
179
+ const visibleActions = allActions
180
+ .map((group) =>
181
+ group.filter((action) => !action.hidden && !action.redundant),
182
+ )
183
+ .filter((group) => group.length > 0);
184
+
177
185
  return (
178
186
  <ContextMenu>
179
187
  <ContextMenuTrigger
@@ -189,13 +197,9 @@ export const CellActionsContextMenu = ({
189
197
  {children}
190
198
  </ContextMenuTrigger>
191
199
  <ContextMenuContent className="w-[300px]" scrollable={true}>
192
- {allActions.map((group, i) => (
200
+ {visibleActions.map((group, i) => (
193
201
  <Fragment key={i}>
194
202
  {group.map((action) => {
195
- if (action.hidden || action.redundant) {
196
- return null;
197
- }
198
-
199
203
  let body = (
200
204
  <div className="flex items-center flex-1">
201
205
  {action.icon && (
@@ -256,7 +260,7 @@ export const CellActionsContextMenu = ({
256
260
  </Fragment>
257
261
  );
258
262
  })}
259
- {i < allActions.length - 1 && <ContextMenuSeparator />}
263
+ {i < visibleActions.length - 1 && <ContextMenuSeparator />}
260
264
  </Fragment>
261
265
  ))}
262
266
  </ContextMenuContent>
@@ -0,0 +1,88 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import * as React from "react";
4
+ import {
5
+ AccordionContent,
6
+ AccordionItem,
7
+ AccordionTrigger,
8
+ } from "@/components/ui/accordion";
9
+ import { Badge } from "@/components/ui/badge";
10
+ import { cn } from "@/utils/cn";
11
+
12
+ /**
13
+ * Styled AccordionItem for sidebar panels.
14
+ * Applies border-b by default; set `lastItem` to remove it on the final item.
15
+ */
16
+ const PanelAccordionItem = React.forwardRef<
17
+ React.ComponentRef<typeof AccordionItem>,
18
+ React.ComponentPropsWithoutRef<typeof AccordionItem> & {
19
+ lastItem?: boolean;
20
+ }
21
+ >(({ className, lastItem, ...props }, ref) => (
22
+ <AccordionItem
23
+ ref={ref}
24
+ className={cn(lastItem && "border-b-0", className)}
25
+ {...props}
26
+ />
27
+ ));
28
+ PanelAccordionItem.displayName = "PanelAccordionItem";
29
+
30
+ /**
31
+ * Styled AccordionTrigger for sidebar panels.
32
+ * Applies compact uppercase styling and wraps children in a flex container
33
+ * with gap for icon + label layout.
34
+ */
35
+ const PanelAccordionTrigger = React.forwardRef<
36
+ React.ComponentRef<typeof AccordionTrigger>,
37
+ React.ComponentPropsWithoutRef<typeof AccordionTrigger>
38
+ >(({ className, children, ...props }, ref) => (
39
+ <AccordionTrigger
40
+ ref={ref}
41
+ className={cn(
42
+ "px-3 py-2 text-xs font-semibold uppercase tracking-wide hover:no-underline",
43
+ className,
44
+ )}
45
+ {...props}
46
+ >
47
+ <span className="flex items-center gap-2">{children}</span>
48
+ </AccordionTrigger>
49
+ ));
50
+ PanelAccordionTrigger.displayName = "PanelAccordionTrigger";
51
+
52
+ /**
53
+ * Styled AccordionContent for sidebar panels.
54
+ * Removes default wrapper padding.
55
+ */
56
+ const PanelAccordionContent = React.forwardRef<
57
+ React.ComponentRef<typeof AccordionContent>,
58
+ React.ComponentPropsWithoutRef<typeof AccordionContent>
59
+ >(({ wrapperClassName, ...props }, ref) => (
60
+ <AccordionContent
61
+ ref={ref}
62
+ wrapperClassName={cn("p-0", wrapperClassName)}
63
+ {...props}
64
+ />
65
+ ));
66
+ PanelAccordionContent.displayName = "PanelAccordionContent";
67
+
68
+ /**
69
+ * Styled Badge for sidebar panels.
70
+ */
71
+ const PanelBadge = ({
72
+ className,
73
+ ...props
74
+ }: React.ComponentPropsWithoutRef<typeof Badge>) => (
75
+ <Badge
76
+ variant="secondary"
77
+ className={cn("py-0 px-1.5 text-[10px]", className)}
78
+ {...props}
79
+ />
80
+ );
81
+ PanelBadge.displayName = "PanelBadge";
82
+
83
+ export {
84
+ PanelAccordionItem,
85
+ PanelAccordionTrigger,
86
+ PanelAccordionContent,
87
+ PanelBadge,
88
+ };