@marimo-team/islands 0.23.7-dev5 → 0.23.7-dev50

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 (537) hide show
  1. package/dist/{ConnectedDataExplorerComponent-PmilQqXR.js → ConnectedDataExplorerComponent-2lBNiUv6.js} +14 -14
  2. package/dist/{ErrorBoundary-Da4UeYxT.js → ErrorBoundary-D3wrPNma.js} +1 -1
  3. package/dist/{any-language-editor-BVR0l12r.js → any-language-editor-VWs_7v27.js} +15 -15
  4. package/dist/apl-Bdc61P1y.js +4 -0
  5. package/dist/{arc-CHF8PiiF.js → arc-DfkSnvZm.js} +2 -2
  6. package/dist/{architecture-7HQA4BMR-D0JB_3hE.js → architecture-7HQA4BMR-CS9jOrqM.js} +1 -1
  7. package/dist/{architectureDiagram-VXUJARFQ-BXQEUDtK.js → architectureDiagram-VXUJARFQ-CXVJxFhH.js} +16 -16
  8. package/dist/asciiarmor-DVRHDGzT.js +4 -0
  9. package/dist/asn1-BmuKfkfu.js +4 -0
  10. package/dist/assets/__vite-browser-external-CAdMKBac.js +1 -0
  11. package/dist/assets/worker-CpBbwbQo.js +73 -0
  12. package/dist/{blockDiagram-VD42YOAC-DhJe-Y9i.js → blockDiagram-VD42YOAC-DGDaxR8I.js} +11 -11
  13. package/dist/brainfuck-DPrRpyTV.js +4 -0
  14. package/dist/{button-CA5pI2YF.js → button-Dj4BTre0.js} +5 -0
  15. package/dist/{c4Diagram-YG6GDRKO-9dSfzOFR.js → c4Diagram-YG6GDRKO-C2hc6ne8.js} +5 -5
  16. package/dist/{capabilities-6laDasij.js → capabilities-C9rrYCzf.js} +1 -1
  17. package/dist/{channel-MqYIiKgS.js → channel-BBoIVUrJ.js} +1 -1
  18. package/dist/{chat-ui-B-gbqk_F.js → chat-ui-D8ZxPNTR.js} +626 -234
  19. package/dist/{check-CFM2mVDr.js → check-BcUIXnUT.js} +1 -1
  20. package/dist/{chunk-4BX2VUAB-BwfrWBqN.js → chunk-4BX2VUAB-CzXltWHN.js} +1 -1
  21. package/dist/{chunk-55IACEB6-D8THf2mi.js → chunk-55IACEB6-B-1mjMMC.js} +1 -1
  22. package/dist/{chunk-5FQGJX7Z-CO1e63h_.js → chunk-5FQGJX7Z-BOg95xG5.js} +2 -2
  23. package/dist/{chunk-ABZYJK2D-BrBb_0yY.js → chunk-ABZYJK2D-D0cLy8Bb.js} +2 -2
  24. package/dist/{chunk-ATLVNIR6-D-0XqNah.js → chunk-ATLVNIR6-BXsEjlHF.js} +2 -2
  25. package/dist/{chunk-B4BG7PRW-8iRKvugR.js → chunk-B4BG7PRW-Q1usn6T3.js} +7 -7
  26. package/dist/{chunk-CVBHYZKI-B6xhgaBd.js → chunk-CVBHYZKI-B_c5YBcW.js} +1 -1
  27. package/dist/{chunk-DI55MBZ5-C0_2D4m4.js → chunk-DI55MBZ5-D1qLYNrb.js} +6 -6
  28. package/dist/{chunk-EXTU4WIE-Jiw9ca1u.js → chunk-EXTU4WIE-BKNXdLmD.js} +2 -2
  29. package/dist/{chunk-FMBD7UC4-CHdus51S.js → chunk-FMBD7UC4-Ie8M9q0W.js} +1 -1
  30. package/dist/{chunk-HN2XXSSU-2Vfbq-kU.js → chunk-HN2XXSSU-E3n-Ys7Z.js} +1 -1
  31. package/dist/{chunk-JA3XYJ7Z-6wbaigKe.js → chunk-JA3XYJ7Z-D6c6cOBG.js} +3 -3
  32. package/dist/{chunk-JZLCHNYA-_rfptlUP.js → chunk-JZLCHNYA-BvsPHJmL.js} +6 -6
  33. package/dist/{chunk-MI3HLSF2-Do0-KRc0.js → chunk-MI3HLSF2-CUYEasXO.js} +1 -1
  34. package/dist/{chunk-N4CR4FBY-DIZG9dVD.js → chunk-N4CR4FBY-8ycT-O9a.js} +7 -7
  35. package/dist/{chunk-QN33PNHL-Cc64y40m.js → chunk-QN33PNHL-Bb-eUBW3.js} +2 -2
  36. package/dist/{chunk-QXUST7PY-BDG0-0Or.js → chunk-QXUST7PY-DV8yRwBd.js} +10 -10
  37. package/dist/{chunk-QZHKN3VN-B_Mdb8GC.js → chunk-QZHKN3VN-DRjXVwuJ.js} +1 -1
  38. package/dist/{chunk-S3R3BYOJ-DphMP0FA.js → chunk-S3R3BYOJ-mQeCz5CE.js} +4 -4
  39. package/dist/{chunk-TZMSLE5B-C9LUoYkc.js → chunk-TZMSLE5B-BqW10dHe.js} +3 -3
  40. package/dist/classDiagram-2ON5EDUG--Yh__LHb.js +30 -0
  41. package/dist/classDiagram-v2-WZHVMYZB-BC7X7Xtc.js +30 -0
  42. package/dist/{clike-sBZrGeF8.js → clike-DTxNUn7l.js} +1 -1
  43. package/dist/clojure-DEttQW5T.js +4 -0
  44. package/dist/cmake-jNlx_DaM.js +4 -0
  45. package/dist/cobol-BvvIm5MJ.js +4 -0
  46. package/dist/{code-block-37QAKDTI-0JNwiPGv.js → code-block-37QAKDTI-BsGy1AOJ.js} +1 -1
  47. package/dist/{code-visibility-D8E8Ctez.js → code-visibility-DjsEQuRb.js} +1403 -1080
  48. package/dist/coffeescript-DTpBMyFU.js +4 -0
  49. package/dist/commonlisp-BmmUG8jb.js +4 -0
  50. package/dist/{copy-TGGAUEWp.js → copy-DLf4aN7I.js} +2 -2
  51. package/dist/{cose-bilkent-S5V4N54A-DXHZkJKX.js → cose-bilkent-S5V4N54A-kjoZoid4.js} +2 -2
  52. package/dist/crystal-BxyqmEWC.js +4 -0
  53. package/dist/css-BGoCtuG3.js +4 -0
  54. package/dist/cypher-BmCbdl3u.js +4 -0
  55. package/dist/d-CFrlbjZt.js +4 -0
  56. package/dist/{dagre-6UL2VRFP-tH87fkPA.js → dagre-6UL2VRFP-DRBWoQUw.js} +10 -10
  57. package/dist/{data-grid-overlay-editor-CWUN78-s.js → data-grid-overlay-editor-efe5ZagF.js} +2 -2
  58. package/dist/{diagram-PSM6KHXK-2VjPSCDn.js → diagram-PSM6KHXK-H66ATWP2.js} +18 -18
  59. package/dist/{diagram-QEK2KX5R-CiLmNyta.js → diagram-QEK2KX5R-DItl5Wns.js} +14 -14
  60. package/dist/{diagram-S2PKOQOG-Zha_1CLx.js → diagram-S2PKOQOG-CtuW_ZuL.js} +14 -14
  61. package/dist/diff-D6XwL6P8.js +4 -0
  62. package/dist/{dist-Brkazupz.js → dist--sWVZwjW.js} +1 -1
  63. package/dist/{dist-FN0ZA_8F.js → dist-21ButRCu.js} +1 -1
  64. package/dist/{dist-BetEKbPG.js → dist-B8RaFTRF.js} +1 -1
  65. package/dist/dist-BoHGySTM.js +5 -0
  66. package/dist/dist-ByAz19Qc.js +5 -0
  67. package/dist/dist-C93EysN4.js +5 -0
  68. package/dist/{dist-BHnX0ia_.js → dist-CY-lVor6.js} +1 -1
  69. package/dist/{dist-YP-G7W0f.js → dist-CYDuv4bR.js} +1 -1
  70. package/dist/{dist-CMjD5MQb.js → dist-Cfo5EE2t.js} +1 -1
  71. package/dist/dist-CjivSDvN.js +5 -0
  72. package/dist/dist-Cqwx-MH7.js +5 -0
  73. package/dist/{dist-ESg7xyoD.js → dist-D3ZI9nhS.js} +2 -2
  74. package/dist/{dist-DkC6YEo0.js → dist-DMZNjfX4.js} +1 -1
  75. package/dist/{dist-ChC1BhqM.js → dist-DbpcoFAV.js} +1 -1
  76. package/dist/dist-FUNenbiQ.js +5 -0
  77. package/dist/{dist-BEOU2g1b.js → dist-zhSud5X3.js} +1 -1
  78. package/dist/{dockerfile-COvlVLcE.js → dockerfile-twL37N91.js} +1 -1
  79. package/dist/dtd-Bw0lRN0-.js +4 -0
  80. package/dist/dylan-B55eBHTt.js +4 -0
  81. package/dist/ecl-C8G4p0wn.js +4 -0
  82. package/dist/eiffel-BmH46VJl.js +4 -0
  83. package/dist/elm-DhzeFqkl.js +4 -0
  84. package/dist/{erDiagram-Q2GNP2WA-biHZS05w.js → erDiagram-Q2GNP2WA--19X2kU5.js} +14 -14
  85. package/dist/erlang-CY-wdlsU.js +4 -0
  86. package/dist/{error-banner-DnBPzEWg.js → error-banner-CVkfBUT3.js} +2 -2
  87. package/dist/{esm-Dd1z1auZ.js → esm-CWp0KQeK.js} +1 -1
  88. package/dist/{esm-CYEyrE3Y.js → esm-DjNnlmpf.js} +96 -96
  89. package/dist/{extends-CzJgxo2J.js → extends-vAi97cpa.js} +4 -4
  90. package/dist/{factor-C2GT7jfQ.js → factor-CajWS6mS.js} +1 -1
  91. package/dist/factor-DWkgl0xw.js +4 -0
  92. package/dist/{flowDiagram-NV44I4VS-CWWlUpBR.js → flowDiagram-NV44I4VS-DQmWlo7f.js} +16 -16
  93. package/dist/{formats-CgaK7Gmx.js → formats-CpgZM9BM.js} +3 -3
  94. package/dist/forth-Cij_ie2t.js +4 -0
  95. package/dist/fortran-Br3X9cfm.js +4 -0
  96. package/dist/{ganttDiagram-JELNMOA3-D7B2c4Z9.js → ganttDiagram-JELNMOA3-BOGXJ8Lk.js} +7 -7
  97. package/dist/gas-DYsGcMN2.js +4 -0
  98. package/dist/gherkin-eVgXQ0fQ.js +4 -0
  99. package/dist/{gitGraph-G5XIXVHT-BdepdFa_.js → gitGraph-G5XIXVHT-DGlbae5m.js} +1 -1
  100. package/dist/{gitGraphDiagram-V2S2FVAM-CtLvNR1S.js → gitGraphDiagram-V2S2FVAM-DjzxfF0P.js} +14 -14
  101. package/dist/{glide-data-editor-CvlvtPWJ.js → glide-data-editor-DucgdjRo.js} +13 -13
  102. package/dist/groovy-_NFHIXG7.js +4 -0
  103. package/dist/haskell-D6xNG_bH.js +4 -0
  104. package/dist/haxe-sU_rzAwn.js +5 -0
  105. package/dist/{html-to-image-hMMPiNe_.js → html-to-image-DaPPaVDP.js} +2395 -2301
  106. package/dist/idl-Ds_VbrUx.js +4 -0
  107. package/dist/{info-VBDWY6EO--JNA2rNu.js → info-VBDWY6EO-D2lvLLw5.js} +1 -1
  108. package/dist/{infoDiagram-HS3SLOUP-BbZyOxsP.js → infoDiagram-HS3SLOUP-ChNufFsP.js} +12 -12
  109. package/dist/{input-BAOe64zx.js → input-D4kjoQUB.js} +8 -6
  110. package/dist/javascript-CztfIl0i.js +4 -0
  111. package/dist/{journeyDiagram-XKPGCS4Q-BU2mjjzl.js → journeyDiagram-XKPGCS4Q-BO_O4Ij1.js} +6 -6
  112. package/dist/julia-DDv40QMV.js +4 -0
  113. package/dist/{kanban-definition-3W4ZIXB7-BlmczUuw.js → kanban-definition-3W4ZIXB7-CPpiiiWk.js} +11 -11
  114. package/dist/{katex-qPqrBHZ8.js → katex-9-9QRhxz.js} +1 -1
  115. package/dist/{label-BCWi-Oqu.js → label-BLqV33b1.js} +2 -2
  116. package/dist/{line-BWRi3U3S.js → line-C5s_12ee.js} +3 -3
  117. package/dist/{linear-DnHwODZa.js → linear-2NnK4cxi.js} +2 -2
  118. package/dist/livescript-BEOngLLc.js +4 -0
  119. package/dist/{loader-BvW0-YWZ.js → loader-Dr8Qem8p.js} +1 -1
  120. package/dist/lua-9-7BhQ4Y.js +4 -0
  121. package/dist/main.js +1299 -1260
  122. package/dist/mathematica-DDa0Pfxm.js +4 -0
  123. package/dist/mbox-iO03mmoE.js +4 -0
  124. package/dist/{mermaid-4DMBBIKO-CG1ECj5W.js → mermaid-4DMBBIKO-B7VQMwJx.js} +1 -1
  125. package/dist/{mermaid-CEbzCxCc.js → mermaid-DO-Daq7u.js} +46 -46
  126. package/dist/{mermaid-parser.core-CleJseNW.js → mermaid-parser.core-DreccfmS.js} +7 -7
  127. package/dist/{mhchem-BwoRNwg_.js → mhchem-yiCCuiEF.js} +1 -1
  128. package/dist/{mindmap-definition-VGOIOE7T-CcSYqYP9.js → mindmap-definition-VGOIOE7T-CC1_Vl0f.js} +13 -13
  129. package/dist/mirc-C9z5LT4X.js +4 -0
  130. package/dist/mllike-jGJbdm_C.js +6 -0
  131. package/dist/modelica-DzF7oIEL.js +4 -0
  132. package/dist/mscgen-DB-u125o.js +6 -0
  133. package/dist/mumps-CRTFHhzh.js +4 -0
  134. package/dist/nsis-C4NPTuox.js +4 -0
  135. package/dist/{nsis-B5K1qoyo.js → nsis-ClF3r5Tr.js} +1 -1
  136. package/dist/ntriples-BCOoGph1.js +4 -0
  137. package/dist/{number-overlay-editor-_GnlYFHC.js → number-overlay-editor-CpKi64Fy.js} +1 -1
  138. package/dist/octave-DTwNlazz.js +4 -0
  139. package/dist/{ordinal-2jIulmcR.js → ordinal-B43ZeR68.js} +1 -1
  140. package/dist/oz-DD38AzSz.js +4 -0
  141. package/dist/{packet-DYOGHKS2-CBxXGWNr.js → packet-DYOGHKS2-CmWtF3uO.js} +1 -1
  142. package/dist/pascal-BohSp9jV.js +4 -0
  143. package/dist/perl-f5OutoPM.js +4 -0
  144. package/dist/{pie-VRWISCQL-Bmdnqjip.js → pie-VRWISCQL-B6u8vus8.js} +1 -1
  145. package/dist/{pieDiagram-ADFJNKIX-DNyLF5H2.js → pieDiagram-ADFJNKIX-Di34MOFQ.js} +19 -19
  146. package/dist/pig-Dv7wSmHb.js +4 -0
  147. package/dist/powershell-rYgjKB39.js +4 -0
  148. package/dist/{process-output-Bza_GK7Q.js → process-output-n0RJTxcC.js} +30 -25
  149. package/dist/properties-BFUNLRDN.js +4 -0
  150. package/dist/protobuf-B9QJQPPv.js +4 -0
  151. package/dist/{pug-tjbzJCFk.js → pug-B_rby2yb.js} +1 -1
  152. package/dist/pug-DzvWpaMC.js +4 -0
  153. package/dist/puppet-B_K-n_xK.js +4 -0
  154. package/dist/python-CAiFcaA2.js +4 -0
  155. package/dist/q-cLeFIBLK.js +4 -0
  156. package/dist/{quadrantDiagram-AYHSOK5B-rXwjifrj.js → quadrantDiagram-AYHSOK5B-B9kVk1ny.js} +3 -3
  157. package/dist/r-04Y-Wco3.js +4 -0
  158. package/dist/{radar-ZZBFDIW7-BmCWDffL.js → radar-ZZBFDIW7-XAmXSa8s.js} +1 -1
  159. package/dist/{react-vega-B-rkEqtS.js → react-vega-Cavbrg4l.js} +1 -1
  160. package/dist/{react-vega-k9ODWPlI.js → react-vega-Dh6-UKKe.js} +13 -13
  161. package/dist/{requirementDiagram-UZGBJVZJ-DBdrMVbs.js → requirementDiagram-UZGBJVZJ-BxGfGYEx.js} +13 -13
  162. package/dist/{reveal-component-Ycn2n8kH.js → reveal-component-pQBz0vEK.js} +10 -10
  163. package/dist/rpm-FUdrIia9.js +5 -0
  164. package/dist/ruby-DMjFXuEW.js +4 -0
  165. package/dist/{sankeyDiagram-TZEHDZUN-CxmzalGv.js → sankeyDiagram-TZEHDZUN-D09PBJ-n.js} +4 -4
  166. package/dist/sas-DzHZxjXK.js +4 -0
  167. package/dist/scheme-DxHd_Rb9.js +4 -0
  168. package/dist/semaphore-CNDGTzkX.js +46 -0
  169. package/dist/{sequenceDiagram-WL72ISMW-CVCDsJ9h.js → sequenceDiagram-WL72ISMW-t_Dpemj0.js} +7 -7
  170. package/dist/shell-C8Kwypgf.js +4 -0
  171. package/dist/sieve-DdyqOKXZ.js +4 -0
  172. package/dist/smalltalk-pB7X1D9y.js +4 -0
  173. package/dist/sparql-NhBO6oOa.js +4 -0
  174. package/dist/{spec-DSIuqd3f.js → spec-hVaaZsY5.js} +4 -4
  175. package/dist/{src-BY0BGg6V.js → src-Bf2iLOlr.js} +1 -1
  176. package/dist/{stateDiagram-FKZM4ZOC-D_2djEhW.js → stateDiagram-FKZM4ZOC-B18gTP_j.js} +16 -16
  177. package/dist/stateDiagram-v2-4FDKWEC3-B6e_t14A.js +29 -0
  178. package/dist/{step-DGAGWg3y.js → step-CWipAYTY.js} +1 -1
  179. package/dist/{strings-B_FOH6eV.js → strings-BiIhGaI8.js} +4 -4
  180. package/dist/style.css +1 -1
  181. package/dist/stylus-SfWSnzPv.js +4 -0
  182. package/dist/swift-jRPdq2zR.js +4 -0
  183. package/dist/{swiper-component-KkEVUDd3.js → swiper-component-DlD2GU2g.js} +2 -2
  184. package/dist/tcl-_hpTHGX3.js +4 -0
  185. package/dist/textile-C9h8slqH.js +4 -0
  186. package/dist/{time-CMdrp3hw.js → time-C1SGcFMH.js} +2 -2
  187. package/dist/{timeline-definition-IT6M3QCI-E4NzxCs3.js → timeline-definition-IT6M3QCI-DJnh1ks5.js} +3 -3
  188. package/dist/{toDate-CHtl9vts.js → toDate-CJWlVNGD.js} +3 -3
  189. package/dist/toml-DWvtinD4.js +4 -0
  190. package/dist/{tooltip-B0mtKTXm.js → tooltip-DRaMBu06.js} +3 -3
  191. package/dist/{treemap-GDKQZRPO-CoKHPxa7.js → treemap-GDKQZRPO-Du95DV6u.js} +1 -1
  192. package/dist/troff-Dwo_A0y7.js +4 -0
  193. package/dist/ttcn-V--CPFKq.js +4 -0
  194. package/dist/ttcn-cfg-CPSMchTG.js +4 -0
  195. package/dist/turtle-B4rPGBWu.js +4 -0
  196. package/dist/{types-DBtDeUKD.js → types-Dzuoc3LN.js} +1 -1
  197. package/dist/{useAsyncData-B6hCGywC.js → useAsyncData-C56Khv_R.js} +1 -1
  198. package/dist/{useDateFormatter-B3mCQMP3.js → useDateFormatter-B_9k85Ex.js} +2 -2
  199. package/dist/{useDeepCompareMemoize-CmwDuYUH.js → useDeepCompareMemoize-Dt98v2ua.js} +1 -1
  200. package/dist/{useIframeCapabilities-DbdLoEDm.js → useIframeCapabilities-BkYHTrss.js} +1 -1
  201. package/dist/{useLifecycle-CjMjllqy.js → useLifecycle-BF6-z62y.js} +3 -3
  202. package/dist/{useTheme-CByZUW0p.js → useTheme-DykuNHR2.js} +2 -2
  203. package/dist/vb-DaMBBd4j.js +4 -0
  204. package/dist/vbscript-BMJQqcE2.js +4 -0
  205. package/dist/{vega-component-CC8TqWWV.js → vega-component-BtvQ-Kc4.js} +26 -24
  206. package/dist/velocity-CGq2QRq2.js +4 -0
  207. package/dist/verilog-CUNo8F5u.js +4 -0
  208. package/dist/vhdl-CCzA0msW.js +4 -0
  209. package/dist/webidl-CqIMDIBL.js +4 -0
  210. package/dist/xquery-XC5Kbr-1.js +4 -0
  211. package/dist/{xychartDiagram-PRI3JC2R-CuxTvjw5.js → xychartDiagram-PRI3JC2R-Dk2d_bX0.js} +10 -10
  212. package/dist/yacas-CGOv7Dzy.js +4 -0
  213. package/dist/z80-CXhVmi-f.js +4 -0
  214. package/dist/{zod-BxdsqRPd.js → zod-BWkcDORu.js} +1 -1
  215. package/package.json +3 -3
  216. package/src/components/chat/chat-components.tsx +47 -0
  217. package/src/components/chat/chat-display.tsx +41 -7
  218. package/src/components/chat/chat-panel.tsx +37 -10
  219. package/src/components/chat/chat-utils.ts +42 -20
  220. package/src/components/chat/reasoning-accordion.tsx +14 -3
  221. package/src/components/chat/tool-call/shared.ts +13 -0
  222. package/src/components/chat/tool-call/tool-approval-card.tsx +62 -0
  223. package/src/components/chat/tool-call/tool-args.tsx +26 -0
  224. package/src/components/chat/tool-call/tool-call-view.tsx +99 -0
  225. package/src/components/chat/tool-call/tool-error-card.tsx +81 -0
  226. package/src/components/chat/tool-call/tool-history-row.tsx +153 -0
  227. package/src/components/chat/tool-call/tool-result.tsx +101 -0
  228. package/src/components/data-table/TableTopBar.tsx +5 -1
  229. package/src/components/data-table/__tests__/column-header.test.ts +3 -1
  230. package/src/components/data-table/__tests__/column-header.test.tsx +203 -0
  231. package/src/components/data-table/__tests__/filter-by-values-picker.test.tsx +112 -0
  232. package/src/components/data-table/__tests__/filter-pill-editor.test.tsx +175 -0
  233. package/src/components/data-table/__tests__/filters.test.ts +112 -36
  234. package/src/components/data-table/charts/components/form-fields.tsx +1 -0
  235. package/src/components/data-table/column-header.tsx +210 -157
  236. package/src/components/data-table/data-table.tsx +5 -0
  237. package/src/components/data-table/download-policy/atoms.ts +10 -0
  238. package/src/components/data-table/export-actions.tsx +31 -4
  239. package/src/components/data-table/filter-by-values-picker.tsx +70 -9
  240. package/src/components/data-table/filter-pill-editor.tsx +289 -144
  241. package/src/components/data-table/filter-pills.tsx +49 -8
  242. package/src/components/data-table/filters.ts +131 -36
  243. package/src/components/data-table/header-items.tsx +8 -1
  244. package/src/components/data-table/operator-labels.ts +25 -0
  245. package/src/components/data-table/regex-input.tsx +61 -0
  246. package/src/components/editor/actions/pair-with-agent-modal.tsx +140 -49
  247. package/src/components/editor/actions/useNotebookActions.tsx +3 -1
  248. package/src/components/editor/app-container.tsx +7 -1
  249. package/src/components/editor/chrome/panels/context-aware-panel/context-aware-panel.tsx +10 -2
  250. package/src/components/editor/chrome/wrapper/app-chrome.tsx +1 -0
  251. package/src/components/editor/chrome/wrapper/footer.tsx +4 -1
  252. package/src/components/editor/chrome/wrapper/panels.tsx +4 -1
  253. package/src/components/editor/chrome/wrapper/sidebar.tsx +4 -1
  254. package/src/components/editor/controls/Controls.tsx +11 -3
  255. package/src/components/editor/file-tree/requesting-tree.tsx +27 -25
  256. package/src/components/editor/file-tree/upload.tsx +23 -24
  257. package/src/components/editor/header/__tests__/status.test.tsx +108 -0
  258. package/src/components/editor/header/status.tsx +44 -10
  259. package/src/components/editor/navigation/__tests__/clipboard.test.ts +106 -0
  260. package/src/components/editor/navigation/__tests__/navigation.test.ts +70 -0
  261. package/src/components/editor/navigation/clipboard.ts +99 -25
  262. package/src/components/editor/navigation/navigation.ts +15 -1
  263. package/src/components/editor/notebook-cell.tsx +3 -0
  264. package/src/components/home/components.tsx +6 -0
  265. package/src/components/pages/run-page.tsx +4 -1
  266. package/src/components/ui/combobox.tsx +24 -5
  267. package/src/components/ui/number-field.tsx +2 -0
  268. package/src/core/ai/tools/__tests__/registry.test.ts +10 -12
  269. package/src/core/ai/tools/registry.ts +9 -5
  270. package/src/core/cells/__tests__/cells.test.ts +187 -0
  271. package/src/core/cells/__tests__/pending-cut-service.test.tsx +123 -0
  272. package/src/core/cells/cells.ts +102 -17
  273. package/src/core/cells/document-changes.ts +6 -1
  274. package/src/core/cells/pending-cut-service.ts +55 -0
  275. package/src/core/cells/utils.ts +11 -0
  276. package/src/core/codemirror/cells/extensions.ts +10 -0
  277. package/src/core/codemirror/markdown/__tests__/commands.test.ts +3 -3
  278. package/src/core/codemirror/markdown/commands.ts +1 -2
  279. package/src/core/edit-app.tsx +2 -1
  280. package/src/core/hotkeys/hotkeys.ts +5 -0
  281. package/src/core/islands/worker/worker.tsx +3 -2
  282. package/src/core/network/requests-network.ts +21 -3
  283. package/src/core/network/types.ts +12 -1
  284. package/src/core/run-app.tsx +2 -1
  285. package/src/core/wasm/__tests__/utils.test.ts +34 -0
  286. package/src/core/wasm/bridge.ts +14 -1
  287. package/src/core/wasm/utils.ts +14 -0
  288. package/src/core/wasm/worker/bootstrap.ts +3 -2
  289. package/src/core/wasm/worker/worker.ts +3 -2
  290. package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +155 -0
  291. package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +137 -0
  292. package/src/core/websocket/transports/basic.ts +2 -0
  293. package/src/core/websocket/transports/transport.ts +1 -0
  294. package/src/core/websocket/useMarimoKernelConnection.tsx +130 -55
  295. package/src/core/websocket/useWebSocket.tsx +5 -2
  296. package/src/css/app/Cell.css +10 -0
  297. package/src/plugins/core/__test__/sanitize.test.ts +30 -0
  298. package/src/plugins/impl/DataTablePlugin.tsx +12 -0
  299. package/src/plugins/impl/DropdownPlugin.tsx +12 -1
  300. package/src/plugins/impl/MultiselectPlugin.tsx +4 -0
  301. package/src/plugins/impl/SearchableSelect.tsx +11 -1
  302. package/src/plugins/impl/TabsPlugin.tsx +35 -7
  303. package/src/plugins/impl/__tests__/DropdownPlugin.test.tsx +56 -0
  304. package/src/plugins/impl/__tests__/TabsPlugin.test.tsx +154 -0
  305. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +6 -0
  306. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +48 -36
  307. package/src/plugins/impl/data-frames/schema.ts +4 -1
  308. package/src/plugins/impl/vega/resolve-data.ts +8 -1
  309. package/src/utils/__tests__/id-tree.test.ts +71 -0
  310. package/src/utils/__tests__/semaphore.test.ts +218 -0
  311. package/src/utils/fileToBase64.ts +8 -7
  312. package/src/utils/id-tree.tsx +89 -0
  313. package/src/utils/semaphore.ts +88 -0
  314. package/dist/apl-BKoVld9y.js +0 -4
  315. package/dist/asciiarmor-DQrKIjoo.js +0 -4
  316. package/dist/asn1-BZvnj0dq.js +0 -4
  317. package/dist/assets/__vite-browser-external-rrUYDKRl.js +0 -1
  318. package/dist/assets/worker-Bfy15ViQ.js +0 -73
  319. package/dist/brainfuck-D558nlUv.js +0 -4
  320. package/dist/classDiagram-2ON5EDUG-CBHMR6ZU.js +0 -30
  321. package/dist/classDiagram-v2-WZHVMYZB-BsUtUGM_.js +0 -30
  322. package/dist/clojure-Cq8mTSrE.js +0 -4
  323. package/dist/cmake-D8HCovWK.js +0 -4
  324. package/dist/cobol-UolN-9iU.js +0 -4
  325. package/dist/coffeescript-VdNuWrt5.js +0 -4
  326. package/dist/commonlisp-ALX7fpDc.js +0 -4
  327. package/dist/crystal-PbyO9Q_s.js +0 -4
  328. package/dist/css-DFklJkr_.js +0 -4
  329. package/dist/cypher-BifNeYlv.js +0 -4
  330. package/dist/d-BA-JP4PJ.js +0 -4
  331. package/dist/diff-CtkDpav4.js +0 -4
  332. package/dist/dist-BuBwsFva.js +0 -5
  333. package/dist/dist-BzmEQ9u7.js +0 -5
  334. package/dist/dist-Cih01ssx.js +0 -5
  335. package/dist/dist-CqfONiY9.js +0 -5
  336. package/dist/dist-D0iD0Fi9.js +0 -5
  337. package/dist/dist-DtNLXm8d.js +0 -5
  338. package/dist/dtd-DW3_UFEG.js +0 -4
  339. package/dist/dylan-pDhodO2N.js +0 -4
  340. package/dist/ecl-BJT8-YD7.js +0 -4
  341. package/dist/eiffel-Dmns-9vS.js +0 -4
  342. package/dist/elm-Da4sO4Bz.js +0 -4
  343. package/dist/erlang-C-zBsDi7.js +0 -4
  344. package/dist/factor-4xPWlWB5.js +0 -4
  345. package/dist/forth-l-c75zSd.js +0 -4
  346. package/dist/fortran-DIujSODW.js +0 -4
  347. package/dist/gas-CXnG5g_b.js +0 -4
  348. package/dist/gherkin-VPeqd4-X.js +0 -4
  349. package/dist/groovy-CphhZQgg.js +0 -4
  350. package/dist/haskell-CCvlS5Iq.js +0 -4
  351. package/dist/haxe-C_bi66fP.js +0 -5
  352. package/dist/idl-1DcP4Dm8.js +0 -4
  353. package/dist/javascript-DUIGhBvO.js +0 -4
  354. package/dist/julia-Cs2G4PQi.js +0 -4
  355. package/dist/livescript-DMtVFaAN.js +0 -4
  356. package/dist/lua-BAoLtdJg.js +0 -4
  357. package/dist/mathematica-C_NoFtbo.js +0 -4
  358. package/dist/mbox-DcFJFYrH.js +0 -4
  359. package/dist/mirc-71dccf_u.js +0 -4
  360. package/dist/mllike-CWcOFVDq.js +0 -6
  361. package/dist/modelica-Ape2VXxx.js +0 -4
  362. package/dist/mscgen-Cc6TwbSN.js +0 -6
  363. package/dist/mumps-h-ZbdkJ9.js +0 -4
  364. package/dist/nsis-C0p3m7JW.js +0 -4
  365. package/dist/ntriples-c9lEeT5w.js +0 -4
  366. package/dist/octave-DzEgB_74.js +0 -4
  367. package/dist/oz-CAxvHkyQ.js +0 -4
  368. package/dist/pascal-BJzu1sgP.js +0 -4
  369. package/dist/perl--IrOzZ2Z.js +0 -4
  370. package/dist/pig-CiBKKNhC.js +0 -4
  371. package/dist/powershell-KY0j6Qop.js +0 -4
  372. package/dist/properties-BW8q3ziV.js +0 -4
  373. package/dist/protobuf-BGaeuTGV.js +0 -4
  374. package/dist/pug-DjOKK-4J.js +0 -4
  375. package/dist/puppet-DWm2o6zX.js +0 -4
  376. package/dist/python-Bp2gezZy.js +0 -4
  377. package/dist/q-DljPshos.js +0 -4
  378. package/dist/r-BajPMnEu.js +0 -4
  379. package/dist/rpm-BKx-ZZ62.js +0 -5
  380. package/dist/ruby-DJq_HNKc.js +0 -4
  381. package/dist/sas-WANvpcOU.js +0 -4
  382. package/dist/scheme-CliBbhGF.js +0 -4
  383. package/dist/shell-BwhrNUvM.js +0 -4
  384. package/dist/sieve-BIVePvMp.js +0 -4
  385. package/dist/smalltalk-D6G48JmY.js +0 -4
  386. package/dist/sparql-jjc3BmEP.js +0 -4
  387. package/dist/stateDiagram-v2-4FDKWEC3-Cv9Av10H.js +0 -29
  388. package/dist/stylus-WPBPQ4PE.js +0 -4
  389. package/dist/swift-O1Qy6iCm.js +0 -4
  390. package/dist/tcl-BAFdhvsi.js +0 -4
  391. package/dist/textile-DFuzhNLG.js +0 -4
  392. package/dist/toml-DRSTeely.js +0 -4
  393. package/dist/troff-B_ZjwBW0.js +0 -4
  394. package/dist/ttcn-CAyiB3ic.js +0 -4
  395. package/dist/ttcn-cfg-BS5_BGBJ.js +0 -4
  396. package/dist/turtle-CUBEDy3E.js +0 -4
  397. package/dist/vb-DY9S6-U2.js +0 -4
  398. package/dist/vbscript-gaHC39Jq.js +0 -4
  399. package/dist/velocity-TfCOtJZ_.js +0 -4
  400. package/dist/verilog-c2JOX8mv.js +0 -4
  401. package/dist/vhdl-dHBirRiO.js +0 -4
  402. package/dist/webidl-Bauj-i07.js +0 -4
  403. package/dist/xquery-CtaEAOt8.js +0 -4
  404. package/dist/yacas-BZ85agQP.js +0 -4
  405. package/dist/z80-hCgR-L4U.js +0 -4
  406. package/src/components/chat/tool-call-accordion.tsx +0 -247
  407. /package/dist/{ImageComparisonComponent-DaocPIse.js → ImageComparisonComponent-CNHIsPDj.js} +0 -0
  408. /package/dist/{Plot-PIeIvFnD.js → Plot-4wn-lMVn.js} +0 -0
  409. /package/dist/{apl-Dt8GMXYg.js → apl-BCgCq9iM.js} +0 -0
  410. /package/dist/{array-B-MVxRIF.js → array-tvvEqPy7.js} +0 -0
  411. /package/dist/{asciiarmor-CitDQ85h.js → asciiarmor-BtqU-KJQ.js} +0 -0
  412. /package/dist/{asn1-abrf9SMK.js → asn1-Dmb-dTMx.js} +0 -0
  413. /package/dist/{asterisk-BUZwqih-.js → asterisk-DaVJJDnV.js} +0 -0
  414. /package/dist/{brainfuck-BL-Boof0.js → brainfuck-C1HoZKlE.js} +0 -0
  415. /package/dist/{chunk-4F5CHEZ2-C6tO9vjs.js → chunk-4F5CHEZ2-BZq7Kom7.js} +0 -0
  416. /package/dist/{chunk-B2363JML-Ds8wZXyP.js → chunk-B2363JML-D9-XOau1.js} +0 -0
  417. /package/dist/{chunk-DR5Q36YT-CP69aZS_.js → chunk-DR5Q36YT-BflwErH1.js} +0 -0
  418. /package/dist/{chunk-FRFDVMJY-BgQv1HBE.js → chunk-FRFDVMJY-BSBUAX7r.js} +0 -0
  419. /package/dist/{chunk-PL6DKKU2-DHfTUHy8.js → chunk-PL6DKKU2-B0MTXvyc.js} +0 -0
  420. /package/dist/{chunk-SJTYNZTY-Diciw4sx.js → chunk-SJTYNZTY-CEG4F0pB.js} +0 -0
  421. /package/dist/{chunk-TQ3KTPDO-CQfP9npd.js → chunk-TQ3KTPDO-DiCtqVSi.js} +0 -0
  422. /package/dist/{chunk-UMXZTB3W-MSKeGL7W.js → chunk-UMXZTB3W-97iS1iEl.js} +0 -0
  423. /package/dist/{click-outside-container-BZgN7xS_.js → click-outside-container-BDd67_1U.js} +0 -0
  424. /package/dist/{clike-RWg7anhx.js → clike-CdT0yHjt.js} +0 -0
  425. /package/dist/{clojure-DaojKHow.js → clojure-CdyrCpUv.js} +0 -0
  426. /package/dist/{cmake-DN-_v0XE.js → cmake-BFlPxym7.js} +0 -0
  427. /package/dist/{cobol-C3VpMyux.js → cobol-CcJXewp8.js} +0 -0
  428. /package/dist/{coffeescript-DIkz3Tbt.js → coffeescript-DnKuIKRo.js} +0 -0
  429. /package/dist/{colors-Cn2p_FA3.js → colors-CQAOa8cK.js} +0 -0
  430. /package/dist/{common-keywords-hbLeU7VU.js → common-keywords-FBrXPTcz.js} +0 -0
  431. /package/dist/{commonlisp-CB1boOiP.js → commonlisp-B-kok83Z.js} +0 -0
  432. /package/dist/{crystal-DI2oCml6.js → crystal-FYRYjI1I.js} +0 -0
  433. /package/dist/{css-BdEVwQDV.js → css-B45lc2V3.js} +0 -0
  434. /package/dist/{cypher-BNHToqxU.js → cypher-DZMLyVY_.js} +0 -0
  435. /package/dist/{cytoscape.esm-WbbDoCfu.js → cytoscape.esm-ayF70frT.js} +0 -0
  436. /package/dist/{d-D7we7I1b.js → d-x-VVT4o9.js} +0 -0
  437. /package/dist/{diff-Cia6fzjN.js → diff-Dxe2mpXk.js} +0 -0
  438. /package/dist/{dist-BK-3fF4P.js → dist-B4LJpMEg.js} +0 -0
  439. /package/dist/{dist-CxdUraQr.js → dist-B507mf_I.js} +0 -0
  440. /package/dist/{dist-C89sHDXk.js → dist-BGdYVvOu.js} +0 -0
  441. /package/dist/{dist-DquyVv5H.js → dist-BNyrZfqT.js} +0 -0
  442. /package/dist/{dist-Zn0KNbo9.js → dist-Bc5pmZIw.js} +0 -0
  443. /package/dist/{dist-C-J0pt5p.js → dist-BvCfQQQE.js} +0 -0
  444. /package/dist/{dist-D9r7Cmw7.js → dist-C2ej4eOH.js} +0 -0
  445. /package/dist/{dist-HVuryI1a.js → dist-C34oIrQ9.js} +0 -0
  446. /package/dist/{dist-CGLzXdrt.js → dist-CDFZi-QD.js} +0 -0
  447. /package/dist/{dist-C9fmTOin.js → dist-CYEylvZA.js} +0 -0
  448. /package/dist/{dist-DadjmS-4.js → dist-DJ6zJQZ4.js} +0 -0
  449. /package/dist/{dist-CtCY55Jf.js → dist-Dh3wkoyH.js} +0 -0
  450. /package/dist/{dist-C474qFoq.js → dist-Dhk6FMb0.js} +0 -0
  451. /package/dist/{dist-DZjQ_MBo.js → dist-KnujRhFL.js} +0 -0
  452. /package/dist/{dist-CinA9Enb.js → dist-WdPUFc56.js} +0 -0
  453. /package/dist/{dist-DBLeRrPp.js → dist-t_qL7eB8.js} +0 -0
  454. /package/dist/{dist-CyFFzJTb.js → dist-usPCDYx8.js} +0 -0
  455. /package/dist/{dtd-H4Hubdwp.js → dtd-C9VM_Wfu.js} +0 -0
  456. /package/dist/{duckdb-keywords-CZ_ZTscu.js → duckdb-keywords-CvJhR_Yd.js} +0 -0
  457. /package/dist/{dylan-fVO6rnq3.js → dylan-DTSnEIFO.js} +0 -0
  458. /package/dist/{ebnf-WEXPLEWb.js → ebnf-2D4Ctp3y.js} +0 -0
  459. /package/dist/{ecl-B94VPjNR.js → ecl-N04ptnRK.js} +0 -0
  460. /package/dist/{eiffel-C_R6TusS.js → eiffel-Dd8rpqr_.js} +0 -0
  461. /package/dist/{elm-DzCHbO2g.js → elm-GT2E866W.js} +0 -0
  462. /package/dist/{erlang-BGNkx6JU.js → erlang-Cf0Bp5pY.js} +0 -0
  463. /package/dist/{esm-Bb_hbWan.js → esm-BaaaPNGl.js} +0 -0
  464. /package/dist/{fcl-B_Gv5Jfx.js → fcl-Ccj8Z5Xd.js} +0 -0
  465. /package/dist/{forth-Bybw0cJ7.js → forth-wd_XzGTg.js} +0 -0
  466. /package/dist/{fortran-C6PoCLkI.js → fortran-DcwUTZFe.js} +0 -0
  467. /package/dist/{gas-BBlhenj4.js → gas-DeALIER3.js} +0 -0
  468. /package/dist/{gherkin-NXtNG85X.js → gherkin-CKTqaJNX.js} +0 -0
  469. /package/dist/{groovy-BoFYK9xM.js → groovy-Bwdp_d8D.js} +0 -0
  470. /package/dist/{haskell-BtBdvQ1n.js → haskell-DCdCcPLK.js} +0 -0
  471. /package/dist/{haxe-D--o6dr0.js → haxe-DAyktQWJ.js} +0 -0
  472. /package/dist/{http-Dc2fv19V.js → http-_DVAYWoR.js} +0 -0
  473. /package/dist/{idl-AqTq5l7e.js → idl-CBuZiRYu.js} +0 -0
  474. /package/dist/{init-D-g0ONX1.js → init-uv0kkh4g.js} +0 -0
  475. /package/dist/{javascript-DvwNVye9.js → javascript-DzigE11c.js} +0 -0
  476. /package/dist/{julia-DoKiagZC.js → julia-PwfB-0Cm.js} +0 -0
  477. /package/dist/{katex-B7pMJpE0.js → katex-C_XRmjAP.js} +0 -0
  478. /package/dist/{livescript-DxBZMiWB.js → livescript-BJLz1EbT.js} +0 -0
  479. /package/dist/{lua-DmS_0NTu.js → lua-ZC-XC2jf.js} +0 -0
  480. /package/dist/{math-BYK36kWZ.js → math-DFcdCCU8.js} +0 -0
  481. /package/dist/{mathematica-ChlDFeIC.js → mathematica-DCYMx6qB.js} +0 -0
  482. /package/dist/{mbox-CguZuODr.js → mbox-OxMK_9XI.js} +0 -0
  483. /package/dist/{mirc-CFtY8dqz.js → mirc-nJVyhA0H.js} +0 -0
  484. /package/dist/{mllike-C0EJrEOk.js → mllike-DRO89bsU.js} +0 -0
  485. /package/dist/{modelica-C1kO1nfS.js → modelica-Don3E6ZD.js} +0 -0
  486. /package/dist/{mscgen-DEYdr7AY.js → mscgen-DJfqD3bN.js} +0 -0
  487. /package/dist/{mumps-B3NVJs2V.js → mumps-SjGTvDYL.js} +0 -0
  488. /package/dist/{nginx-ComVAAGN.js → nginx-DasThI7R.js} +0 -0
  489. /package/dist/{node-sql-parser-DNGGJ-Rw.js → node-sql-parser-B8nBD36q.js} +0 -0
  490. /package/dist/{ntriples-DHol9X9H.js → ntriples-CNBKRl3I.js} +0 -0
  491. /package/dist/{octave-CYGz0bfo.js → octave-DdeVHNlx.js} +0 -0
  492. /package/dist/{oz-kPxb2ni5.js → oz-CcKSoNvN.js} +0 -0
  493. /package/dist/{pascal-bZ0yrJKy.js → pascal-6leftwNj.js} +0 -0
  494. /package/dist/{path-Du6n3sOU.js → path-BGaWgPKg.js} +0 -0
  495. /package/dist/{perl-z4hvqyqz.js → perl-BhJIwWzN.js} +0 -0
  496. /package/dist/{pig-DZO8QDF9.js → pig-r-xDHqRf.js} +0 -0
  497. /package/dist/{powershell-BSuaDQEC.js → powershell-D-BELeNi.js} +0 -0
  498. /package/dist/{properties-BXhGLlIx.js → properties-CnuDhbll.js} +0 -0
  499. /package/dist/{protobuf-DM6iybWV.js → protobuf-CO8RBhvX.js} +0 -0
  500. /package/dist/{puppet-Bn05sQT8.js → puppet-NmXHjLy8.js} +0 -0
  501. /package/dist/{python-Cvnhm0g7.js → python-DAQXi720.js} +0 -0
  502. /package/dist/{q-B9V8hzex.js → q-DlikXfV0.js} +0 -0
  503. /package/dist/{r-Cf0gFqmq.js → r-CuohilwT.js} +0 -0
  504. /package/dist/{rpm-D-LMkTV1.js → rpm-0Pjwp0Pb.js} +0 -0
  505. /package/dist/{ruby-DeuPikpK.js → ruby-Dq8NJTDG.js} +0 -0
  506. /package/dist/{sas-C9tjgAo9.js → sas-CuwonyVP.js} +0 -0
  507. /package/dist/{scheme-D1_bUF0G.js → scheme-CYU-RRIf.js} +0 -0
  508. /package/dist/{shell-CJBmnks3.js → shell-COPmX2qE.js} +0 -0
  509. /package/dist/{sieve-1fSV75CF.js → sieve-B_3zyLne.js} +0 -0
  510. /package/dist/{simple-mode-B90Wdavj.js → simple-mode-DSBniks8.js} +0 -0
  511. /package/dist/{smalltalk-sZNPD0HO.js → smalltalk-DRft7iPv.js} +0 -0
  512. /package/dist/{solr-DTkyqJ-Z.js → solr-RZ9uTl59.js} +0 -0
  513. /package/dist/{sparql-oHc1nm77.js → sparql-CN6qj55H.js} +0 -0
  514. /package/dist/{spreadsheet-CER0raqY.js → spreadsheet-BNNUNXA2.js} +0 -0
  515. /package/dist/{sql-ByOoEONQ.js → sql-B4x8IkwU.js} +0 -0
  516. /package/dist/{stylus-KzkX6zRB.js → stylus-Bn_ZjOQ3.js} +0 -0
  517. /package/dist/{swift-DqVxZvKo.js → swift-BLUJhMbz.js} +0 -0
  518. /package/dist/{tcl-BtWSwXfA.js → tcl-C86fxecl.js} +0 -0
  519. /package/dist/{textile-CWDbn9Ql.js → textile-DmHh2rsK.js} +0 -0
  520. /package/dist/{tiddlywiki-Cr9xyOY1.js → tiddlywiki-DI0mF2WJ.js} +0 -0
  521. /package/dist/{tiki-D5JONyfZ.js → tiki-2HU6XLLn.js} +0 -0
  522. /package/dist/{timer-D7JVdX9U.js → timer-YZl28NYN.js} +0 -0
  523. /package/dist/{toml-BfehlgmL.js → toml-GWANRNAD.js} +0 -0
  524. /package/dist/{treemap-qFGzn7xk.js → treemap-D-ka1hvx.js} +0 -0
  525. /package/dist/{troff-BZBk6AAu.js → troff-BHTsomIy.js} +0 -0
  526. /package/dist/{ttcn-DVwvXg0_.js → ttcn-DQuhn5Mn.js} +0 -0
  527. /package/dist/{ttcn-cfg-gjbVLf1L.js → ttcn-cfg-HjFYtdB-.js} +0 -0
  528. /package/dist/{turtle-CgxKXorV.js → turtle-nCay33Nv.js} +0 -0
  529. /package/dist/{vb-B9kSwTdM.js → vb-BG-XlqqJ.js} +0 -0
  530. /package/dist/{vbscript-DrUKSCdb.js → vbscript-B6vyW0-D.js} +0 -0
  531. /package/dist/{velocity-AlMYTnMy.js → velocity-CWegueqO.js} +0 -0
  532. /package/dist/{verilog-DLUaM05j.js → verilog-CzSQm4cG.js} +0 -0
  533. /package/dist/{vhdl-DUJOtSmO.js → vhdl-DqnNVL7r.js} +0 -0
  534. /package/dist/{webidl-CQp4aHk_.js → webidl-DXEUpDWH.js} +0 -0
  535. /package/dist/{xquery-IxkjlwOD.js → xquery-Ba_NB5bD.js} +0 -0
  536. /package/dist/{yacas-Bnctn5w8.js → yacas-HKQU6hyk.js} +0 -0
  537. /package/dist/{z80-DrFwhx53.js → z80-CXkHXLdj.js} +0 -0
@@ -0,0 +1,154 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { fireEvent, render, screen } from "@testing-library/react";
4
+ import { beforeAll, describe, expect, it, vi } from "vitest";
5
+ import type { z } from "zod";
6
+ import { initialModeAtom } from "@/core/mode";
7
+ import { store } from "@/core/state/jotai";
8
+ import type { IPluginProps } from "../../types";
9
+ import { TabsPlugin } from "../TabsPlugin";
10
+
11
+ describe("TabsPlugin", () => {
12
+ beforeAll(() => {
13
+ store.set(initialModeAtom, "edit");
14
+ });
15
+
16
+ const renderPlugin = (
17
+ data: z.input<TabsPlugin["validator"]>,
18
+ initialValue = "0",
19
+ ) => {
20
+ const plugin = new TabsPlugin();
21
+ const host = document.createElement("div");
22
+ const setValue = vi.fn();
23
+ const children = [
24
+ <span key="0">Content 0</span>,
25
+ <span key="1">Content 1</span>,
26
+ <span key="2">Content 2</span>,
27
+ ];
28
+ const makeProps = (
29
+ value: string,
30
+ ): IPluginProps<string, z.infer<TabsPlugin["validator"]>> => ({
31
+ data: plugin.validator.parse(data),
32
+ value,
33
+ setValue,
34
+ host,
35
+ functions: {},
36
+ children,
37
+ });
38
+ const result = render(plugin.render(makeProps(initialValue)));
39
+ return {
40
+ ...result,
41
+ setValue,
42
+ rerenderWithValue: (newValue: string) =>
43
+ result.rerender(plugin.render(makeProps(newValue))),
44
+ };
45
+ };
46
+
47
+ it("renders all tab triggers", () => {
48
+ renderPlugin({
49
+ tabs: ["First", "Second", "Third"],
50
+ label: null,
51
+ });
52
+ expect(screen.getByRole("tab", { name: "First" })).toBeInTheDocument();
53
+ expect(screen.getByRole("tab", { name: "Second" })).toBeInTheDocument();
54
+ expect(screen.getByRole("tab", { name: "Third" })).toBeInTheDocument();
55
+ });
56
+
57
+ it("supports vertical orientation", () => {
58
+ renderPlugin({
59
+ tabs: ["First", "Second"],
60
+ label: null,
61
+ orientation: "vertical",
62
+ });
63
+ const tablist = screen.getByRole("tablist");
64
+ expect(tablist).toHaveAttribute("data-orientation", "vertical");
65
+ expect(tablist.className).toMatch(/flex-col/);
66
+ // Horizontal scroll classes should not be applied in vertical mode.
67
+ expect(tablist.className).not.toMatch(/overflow-x-auto/);
68
+ });
69
+
70
+ it("falls back to horizontal when orientation is omitted (back-compat)", () => {
71
+ // Older Python kernels won't send `orientation` — make sure the validator
72
+ // defaults it so the frontend keeps working.
73
+ const plugin = new TabsPlugin();
74
+ const parsed = plugin.validator.parse({
75
+ tabs: ["First"],
76
+ label: null,
77
+ });
78
+ expect(parsed.orientation).toBe("horizontal");
79
+ });
80
+
81
+ it("selects the tab matching the initial value", () => {
82
+ renderPlugin({ tabs: ["First", "Second", "Third"], label: null }, "1");
83
+ const tabs = screen.getAllByRole("tab");
84
+ expect(tabs[0]).toHaveAttribute("data-state", "inactive");
85
+ expect(tabs[1]).toHaveAttribute("data-state", "active");
86
+ expect(tabs[2]).toHaveAttribute("data-state", "inactive");
87
+ });
88
+
89
+ it("defaults to the first tab when value is empty", () => {
90
+ renderPlugin({ tabs: ["First", "Second"], label: null }, "");
91
+ const tabs = screen.getAllByRole("tab");
92
+ expect(tabs[0]).toHaveAttribute("data-state", "active");
93
+ expect(tabs[1]).toHaveAttribute("data-state", "inactive");
94
+ });
95
+
96
+ it("calls setValue with the clicked tab's index", () => {
97
+ const { setValue } = renderPlugin({
98
+ tabs: ["First", "Second", "Third"],
99
+ label: null,
100
+ });
101
+ // Radix Tabs' trigger reacts to mousedown (left button), not click —
102
+ // see https://github.com/radix-ui/primitives/blob/main/packages/react/tabs/src/Tabs.tsx
103
+ fireEvent.mouseDown(screen.getByRole("tab", { name: "Third" }), {
104
+ button: 0,
105
+ });
106
+ expect(setValue).toHaveBeenCalledWith("2");
107
+ });
108
+
109
+ it("syncs selection when value is updated externally", () => {
110
+ const { rerenderWithValue } = renderPlugin(
111
+ { tabs: ["First", "Second", "Third"], label: null },
112
+ "0",
113
+ );
114
+ expect(screen.getAllByRole("tab")[0]).toHaveAttribute(
115
+ "data-state",
116
+ "active",
117
+ );
118
+
119
+ rerenderWithValue("2");
120
+ const tabs = screen.getAllByRole("tab");
121
+ expect(tabs[0]).toHaveAttribute("data-state", "inactive");
122
+ expect(tabs[2]).toHaveAttribute("data-state", "active");
123
+ });
124
+
125
+ it("renders HTML in tab labels via renderHTML", () => {
126
+ renderPlugin({
127
+ tabs: ["<strong>Bold</strong>", "Plain"],
128
+ label: null,
129
+ });
130
+ const boldTab = screen.getByRole("tab", { name: "Bold" });
131
+ // The label markup is preserved (not escaped as text), so the trigger
132
+ // contains a real <strong> element.
133
+ expect(boldTab.querySelector("strong")).not.toBeNull();
134
+ });
135
+
136
+ it("renders no tabpanels when tabs and children are empty", () => {
137
+ // When the Python side passes `tabs={}`, slotted HTML is empty and the
138
+ // resulting React children are null/undefined. We should render zero
139
+ // `TabsContent`s — not a stray one paired to a non-existent trigger.
140
+ const plugin = new TabsPlugin();
141
+ const host = document.createElement("div");
142
+ const props: IPluginProps<string, z.infer<TabsPlugin["validator"]>> = {
143
+ data: plugin.validator.parse({ tabs: [], label: null }),
144
+ value: "",
145
+ setValue: vi.fn(),
146
+ host,
147
+ functions: {},
148
+ children: null,
149
+ };
150
+ render(plugin.render(props));
151
+ expect(screen.queryAllByRole("tab")).toHaveLength(0);
152
+ expect(screen.queryAllByRole("tabpanel")).toHaveLength(0);
153
+ });
154
+ });
@@ -64,6 +64,7 @@ type PluginFunctions = {
64
64
  column_types_per_step: FieldTypesWithExternalType[];
65
65
  python_code?: string | null;
66
66
  sql_code?: string | null;
67
+ size_bytes?: number | null;
67
68
  }>;
68
69
  get_column_values: (req: { column: string }) => Promise<{
69
70
  values: unknown[];
@@ -81,6 +82,7 @@ type PluginFunctions = {
81
82
  }) => Promise<{
82
83
  data: TableData<T>;
83
84
  total_rows: number;
85
+ size_bytes?: number | null;
84
86
  }>;
85
87
  download_as: DownloadAsArgs;
86
88
  };
@@ -118,6 +120,7 @@ export const DataFramePlugin = createPlugin<S>("marimo-dataframe")
118
120
  column_types_per_step: z.array(columnToFieldTypesSchema),
119
121
  python_code: z.string().nullish(),
120
122
  sql_code: z.string().nullish(),
123
+ size_bytes: z.number().nullish(),
121
124
  }),
122
125
  ),
123
126
  get_column_values: rpc.input(z.object({ column: z.string() })).output(
@@ -147,6 +150,7 @@ export const DataFramePlugin = createPlugin<S>("marimo-dataframe")
147
150
  z.object({
148
151
  data: z.union([z.string(), z.array(z.object({}).passthrough())]),
149
152
  total_rows: z.number(),
153
+ size_bytes: z.number().nullish(),
150
154
  }),
151
155
  ),
152
156
  download_as: DownloadAsSchema,
@@ -203,6 +207,7 @@ export const DataFrameComponent = memo(
203
207
  column_types_per_step,
204
208
  python_code,
205
209
  sql_code,
210
+ size_bytes,
206
211
  } = data || {};
207
212
 
208
213
  const totalColumns = field_types?.length;
@@ -322,6 +327,7 @@ export const DataFrameComponent = memo(
322
327
  data={url || ""}
323
328
  hasStableRowId={false}
324
329
  totalRows={total_rows ?? 0}
330
+ sizeBytes={size_bytes ?? null}
325
331
  totalColumns={totalColumns ?? 0}
326
332
  maxColumns="all"
327
333
  pageSize={pageSize}
@@ -27,11 +27,12 @@ exports[`renderZodSchema > should render a form aggregate 1`] = `
27
27
  aria-invalid="false"
28
28
  class="relative"
29
29
  >
30
- <div
30
+ <button
31
31
  aria-controls="radix-_r_27_"
32
+ aria-disabled="false"
32
33
  aria-expanded="false"
33
34
  aria-haspopup="dialog"
34
- class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid disabled:cursor-not-allowed disabled:opacity-50 min-w-[180px]"
35
+ class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid min-w-[180px]"
35
36
  data-state="closed"
36
37
  id="_r_26_-form-item"
37
38
  type="button"
@@ -58,7 +59,7 @@ exports[`renderZodSchema > should render a form aggregate 1`] = `
58
59
  d="m6 9 6 6 6-6"
59
60
  />
60
61
  </svg>
61
- </div>
62
+ </button>
62
63
  <div
63
64
  class="flex flex-col gap-1 items-start"
64
65
  />
@@ -82,11 +83,12 @@ exports[`renderZodSchema > should render a form aggregate 1`] = `
82
83
  aria-invalid="false"
83
84
  class="relative"
84
85
  >
85
- <div
86
+ <button
86
87
  aria-controls="radix-_r_29_"
88
+ aria-disabled="false"
87
89
  aria-expanded="false"
88
90
  aria-haspopup="dialog"
89
- class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid disabled:cursor-not-allowed disabled:opacity-50 min-w-[180px]"
91
+ class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid min-w-[180px]"
90
92
  data-state="closed"
91
93
  id="_r_28_-form-item"
92
94
  type="button"
@@ -113,7 +115,7 @@ exports[`renderZodSchema > should render a form aggregate 1`] = `
113
115
  d="m6 9 6 6 6-6"
114
116
  />
115
117
  </svg>
116
- </div>
118
+ </button>
117
119
  <div
118
120
  class="flex flex-col gap-1 items-start"
119
121
  />
@@ -399,11 +401,12 @@ exports[`renderZodSchema > should render a form explode_columns 1`] = `
399
401
  aria-invalid="false"
400
402
  class="relative"
401
403
  >
402
- <div
404
+ <button
403
405
  aria-controls="radix-_r_2p_"
406
+ aria-disabled="false"
404
407
  aria-expanded="false"
405
408
  aria-haspopup="dialog"
406
- class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid disabled:cursor-not-allowed disabled:opacity-50 min-w-[180px]"
409
+ class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid min-w-[180px]"
407
410
  data-state="closed"
408
411
  id="_r_2o_-form-item"
409
412
  type="button"
@@ -430,7 +433,7 @@ exports[`renderZodSchema > should render a form explode_columns 1`] = `
430
433
  d="m6 9 6 6 6-6"
431
434
  />
432
435
  </svg>
433
- </div>
436
+ </button>
434
437
  <div
435
438
  class="flex flex-col gap-1 items-start"
436
439
  />
@@ -596,11 +599,12 @@ exports[`renderZodSchema > should render a form group_by 1`] = `
596
599
  aria-invalid="false"
597
600
  class="relative"
598
601
  >
599
- <div
602
+ <button
600
603
  aria-controls="radix-_r_1p_"
604
+ aria-disabled="false"
601
605
  aria-expanded="false"
602
606
  aria-haspopup="dialog"
603
- class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid disabled:cursor-not-allowed disabled:opacity-50 min-w-[180px]"
607
+ class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid min-w-[180px]"
604
608
  data-state="closed"
605
609
  id="_r_1o_-form-item"
606
610
  type="button"
@@ -627,7 +631,7 @@ exports[`renderZodSchema > should render a form group_by 1`] = `
627
631
  d="m6 9 6 6 6-6"
628
632
  />
629
633
  </svg>
630
- </div>
634
+ </button>
631
635
  <div
632
636
  class="flex flex-col gap-1 items-start"
633
637
  />
@@ -651,11 +655,12 @@ exports[`renderZodSchema > should render a form group_by 1`] = `
651
655
  aria-invalid="false"
652
656
  class="relative"
653
657
  >
654
- <div
658
+ <button
655
659
  aria-controls="radix-_r_1r_"
660
+ aria-disabled="false"
656
661
  aria-expanded="false"
657
662
  aria-haspopup="dialog"
658
- class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid disabled:cursor-not-allowed disabled:opacity-50 min-w-[180px]"
663
+ class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid min-w-[180px]"
659
664
  data-state="closed"
660
665
  id="_r_1q_-form-item"
661
666
  type="button"
@@ -682,7 +687,7 @@ exports[`renderZodSchema > should render a form group_by 1`] = `
682
687
  d="m6 9 6 6 6-6"
683
688
  />
684
689
  </svg>
685
- </div>
690
+ </button>
686
691
  <div
687
692
  class="flex flex-col gap-1 items-start"
688
693
  />
@@ -798,11 +803,12 @@ exports[`renderZodSchema > should render a form pivot 1`] = `
798
803
  aria-invalid="false"
799
804
  class="relative"
800
805
  >
801
- <div
806
+ <button
802
807
  aria-controls="radix-_r_3b_"
808
+ aria-disabled="false"
803
809
  aria-expanded="false"
804
810
  aria-haspopup="dialog"
805
- class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid disabled:cursor-not-allowed disabled:opacity-50 min-w-[180px]"
811
+ class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid min-w-[180px]"
806
812
  data-state="closed"
807
813
  id="_r_3a_-form-item"
808
814
  type="button"
@@ -829,7 +835,7 @@ exports[`renderZodSchema > should render a form pivot 1`] = `
829
835
  d="m6 9 6 6 6-6"
830
836
  />
831
837
  </svg>
832
- </div>
838
+ </button>
833
839
  <div
834
840
  class="flex flex-col gap-1 items-start"
835
841
  />
@@ -853,11 +859,12 @@ exports[`renderZodSchema > should render a form pivot 1`] = `
853
859
  aria-invalid="false"
854
860
  class="relative"
855
861
  >
856
- <div
862
+ <button
857
863
  aria-controls="radix-_r_3d_"
864
+ aria-disabled="false"
858
865
  aria-expanded="false"
859
866
  aria-haspopup="dialog"
860
- class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid disabled:cursor-not-allowed disabled:opacity-50 min-w-[180px]"
867
+ class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid min-w-[180px]"
861
868
  data-state="closed"
862
869
  id="_r_3c_-form-item"
863
870
  type="button"
@@ -884,7 +891,7 @@ exports[`renderZodSchema > should render a form pivot 1`] = `
884
891
  d="m6 9 6 6 6-6"
885
892
  />
886
893
  </svg>
887
- </div>
894
+ </button>
888
895
  <div
889
896
  class="flex flex-col gap-1 items-start"
890
897
  />
@@ -908,11 +915,12 @@ exports[`renderZodSchema > should render a form pivot 1`] = `
908
915
  aria-invalid="false"
909
916
  class="relative"
910
917
  >
911
- <div
918
+ <button
912
919
  aria-controls="radix-_r_3f_"
920
+ aria-disabled="false"
913
921
  aria-expanded="false"
914
922
  aria-haspopup="dialog"
915
- class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid disabled:cursor-not-allowed disabled:opacity-50 min-w-[180px]"
923
+ class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid min-w-[180px]"
916
924
  data-state="closed"
917
925
  id="_r_3e_-form-item"
918
926
  type="button"
@@ -939,7 +947,7 @@ exports[`renderZodSchema > should render a form pivot 1`] = `
939
947
  d="m6 9 6 6 6-6"
940
948
  />
941
949
  </svg>
942
- </div>
950
+ </button>
943
951
  <div
944
952
  class="flex flex-col gap-1 items-start"
945
953
  />
@@ -1298,11 +1306,12 @@ exports[`renderZodSchema > should render a form select_columns 1`] = `
1298
1306
  aria-invalid="false"
1299
1307
  class="relative"
1300
1308
  >
1301
- <div
1309
+ <button
1302
1310
  aria-controls="radix-_r_4_"
1311
+ aria-disabled="false"
1303
1312
  aria-expanded="false"
1304
1313
  aria-haspopup="dialog"
1305
- class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid disabled:cursor-not-allowed disabled:opacity-50 min-w-[180px]"
1314
+ class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid min-w-[180px]"
1306
1315
  data-state="closed"
1307
1316
  id="_r_3_-form-item"
1308
1317
  type="button"
@@ -1329,7 +1338,7 @@ exports[`renderZodSchema > should render a form select_columns 1`] = `
1329
1338
  d="m6 9 6 6 6-6"
1330
1339
  />
1331
1340
  </svg>
1332
- </div>
1341
+ </button>
1333
1342
  <div
1334
1343
  class="flex flex-col gap-1 items-start"
1335
1344
  />
@@ -1581,11 +1590,12 @@ exports[`renderZodSchema > should render a form unique 1`] = `
1581
1590
  aria-invalid="false"
1582
1591
  class="relative"
1583
1592
  >
1584
- <div
1593
+ <button
1585
1594
  aria-controls="radix-_r_32_"
1595
+ aria-disabled="false"
1586
1596
  aria-expanded="false"
1587
1597
  aria-haspopup="dialog"
1588
- class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid disabled:cursor-not-allowed disabled:opacity-50 min-w-[180px]"
1598
+ class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid min-w-[180px]"
1589
1599
  data-state="closed"
1590
1600
  id="_r_31_-form-item"
1591
1601
  type="button"
@@ -1612,7 +1622,7 @@ exports[`renderZodSchema > should render a form unique 1`] = `
1612
1622
  d="m6 9 6 6 6-6"
1613
1623
  />
1614
1624
  </svg>
1615
- </div>
1625
+ </button>
1616
1626
  <div
1617
1627
  class="flex flex-col gap-1 items-start"
1618
1628
  />
@@ -1740,11 +1750,12 @@ exports[`renders custom forms column_id_array 1`] = `
1740
1750
  aria-invalid="false"
1741
1751
  class="relative"
1742
1752
  >
1743
- <div
1753
+ <button
1744
1754
  aria-controls="radix-_r_41_"
1755
+ aria-disabled="false"
1745
1756
  aria-expanded="false"
1746
1757
  aria-haspopup="dialog"
1747
- class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid disabled:cursor-not-allowed disabled:opacity-50 min-w-[180px]"
1758
+ class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid min-w-[180px]"
1748
1759
  data-state="closed"
1749
1760
  id="_r_40_-form-item"
1750
1761
  type="button"
@@ -1771,7 +1782,7 @@ exports[`renders custom forms column_id_array 1`] = `
1771
1782
  d="m6 9 6 6 6-6"
1772
1783
  />
1773
1784
  </svg>
1774
- </div>
1785
+ </button>
1775
1786
  <div
1776
1787
  class="flex flex-col gap-1 items-start"
1777
1788
  />
@@ -1790,11 +1801,12 @@ exports[`renders custom forms column_id_dot_array 1`] = `
1790
1801
  aria-invalid="false"
1791
1802
  class="relative"
1792
1803
  >
1793
- <div
1804
+ <button
1794
1805
  aria-controls="radix-_r_43_"
1806
+ aria-disabled="false"
1795
1807
  aria-expanded="false"
1796
1808
  aria-haspopup="dialog"
1797
- class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid disabled:cursor-not-allowed disabled:opacity-50 min-w-[180px]"
1809
+ class="flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid min-w-[180px]"
1798
1810
  data-state="closed"
1799
1811
  id="_r_42_-form-item"
1800
1812
  type="button"
@@ -1821,7 +1833,7 @@ exports[`renders custom forms column_id_dot_array 1`] = `
1821
1833
  d="m6 9 6 6 6-6"
1822
1834
  />
1823
1835
  </svg>
1824
- </div>
1836
+ </button>
1825
1837
  <div
1826
1838
  class="flex flex-col gap-1 items-start"
1827
1839
  />
@@ -80,7 +80,10 @@ export const FilterConditionSchema = z
80
80
  .enum(Object.keys(ALL_OPERATORS) as [OperatorType, ...OperatorType[]])
81
81
  .describe(FieldOptions.of({ label: " " })),
82
82
  type: z.literal("condition").default("condition"),
83
- value: z.any().describe(FieldOptions.of({ label: "Value" })),
83
+ value: z
84
+ .any()
85
+ .optional()
86
+ .describe(FieldOptions.of({ label: "Value" })),
84
87
  negate: z.boolean().default(false),
85
88
  })
86
89
  .describe(FieldOptions.of({ direction: "row", special: "column_filter" }));
@@ -1,6 +1,7 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import { asRemoteURL } from "@/core/runtime/config";
4
+ import { Semaphore } from "@/utils/semaphore";
4
5
  import { vegaLoadData } from "./loader";
5
6
  import type {
6
7
  FacetedUnitSpec,
@@ -17,6 +18,8 @@ type AnySpec =
17
18
  | UnitSpec<Field>
18
19
  | GenericFacetSpec<FacetedUnitSpec<Field>, LayerSpec<Field>, Field>;
19
20
 
21
+ const VEGA_DATA_FETCH_CONCURRENCY = 5;
22
+
20
23
  /**
21
24
  * Given a VegaLite spec with URL data, resolve the data and return a new spec with the resolved data.
22
25
  *
@@ -30,6 +33,9 @@ export async function resolveVegaSpecData(
30
33
  }
31
34
 
32
35
  const datasets = "datasets" in spec ? { ...spec.datasets } : {};
36
+ // Single semaphore shared across the whole spec so total in-flight fetches
37
+ // (across all nested layers/hconcat/vconcat) stay bounded.
38
+ const fetchSem = new Semaphore(VEGA_DATA_FETCH_CONCURRENCY);
33
39
 
34
40
  const traverse = async <T extends AnySpec>(spec: T): Promise<T> => {
35
41
  if (!spec) {
@@ -80,7 +86,8 @@ export async function resolveVegaSpecData(
80
86
  } catch {
81
87
  return spec;
82
88
  }
83
- const data = await vegaLoadData(url.href, spec.data.format);
89
+ const format = spec.data.format;
90
+ const data = await fetchSem.run(() => vegaLoadData(url.href, format));
84
91
 
85
92
  datasets[url.pathname] = data;
86
93
 
@@ -957,6 +957,77 @@ describe("MultiColumn", () => {
957
957
  expect(inserted.topLevelIds[1]).toEqual(["B1", "D1", "B2"]);
958
958
  });
959
959
 
960
+ describe("moveCellsRelativeTo", () => {
961
+ it("moves a single cell before target in same column", () => {
962
+ const moved = multiColumn.moveCellsRelativeTo(["A3"], "A1", "before");
963
+ expect(moved.topLevelIds).toEqual([
964
+ ["A3", "A1", "A2"],
965
+ ["B1", "B2"],
966
+ ["C1", "C2", "C3", "C4"],
967
+ ]);
968
+ });
969
+
970
+ it("moves a single cell after target in same column", () => {
971
+ const moved = multiColumn.moveCellsRelativeTo(["A1"], "A3", "after");
972
+ expect(moved.topLevelIds).toEqual([
973
+ ["A2", "A3", "A1"],
974
+ ["B1", "B2"],
975
+ ["C1", "C2", "C3", "C4"],
976
+ ]);
977
+ });
978
+
979
+ it("moves multiple cells before target", () => {
980
+ const moved = multiColumn.moveCellsRelativeTo(
981
+ ["A1", "A2"],
982
+ "B2",
983
+ "before",
984
+ );
985
+ expect(moved.topLevelIds).toEqual([
986
+ ["A3"],
987
+ ["B1", "A1", "A2", "B2"],
988
+ ["C1", "C2", "C3", "C4"],
989
+ ]);
990
+ });
991
+
992
+ it("moves multiple cells after target", () => {
993
+ const moved = multiColumn.moveCellsRelativeTo(
994
+ ["A2", "A3"],
995
+ "B1",
996
+ "after",
997
+ );
998
+ expect(moved.topLevelIds).toEqual([
999
+ ["A1"],
1000
+ ["B1", "A2", "A3", "B2"],
1001
+ ["C1", "C2", "C3", "C4"],
1002
+ ]);
1003
+ });
1004
+
1005
+ it("returns same MultiColumn when cellIds is empty", () => {
1006
+ const moved = multiColumn.moveCellsRelativeTo([], "A1", "before");
1007
+ expect(moved).toBe(multiColumn);
1008
+ });
1009
+
1010
+ it("inserts at end when target is among moved cells", () => {
1011
+ const moved = multiColumn.moveCellsRelativeTo(
1012
+ ["A1", "A2"],
1013
+ "A2",
1014
+ "after",
1015
+ );
1016
+ // Target A2 was removed; insert at end of column 0
1017
+ expect(moved.topLevelIds).toEqual([
1018
+ ["A3", "A1", "A2"],
1019
+ ["B1", "B2"],
1020
+ ["C1", "C2", "C3", "C4"],
1021
+ ]);
1022
+ });
1023
+
1024
+ it("throws when node not found", () => {
1025
+ expect(() =>
1026
+ multiColumn.moveCellsRelativeTo(["Z1"], "A1", "before"),
1027
+ ).toThrow("Cell Z1 not found in any column");
1028
+ });
1029
+ });
1030
+
960
1031
  it("deletes by id", () => {
961
1032
  const deleted = multiColumn.deleteById("B1");
962
1033
  expect(deleted.topLevelIds[1]).toEqual(["B2"]);