@marimo-team/islands 0.16.4 → 0.17.0

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 (589) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CCjhPKMy.js → ConnectedDataExplorerComponent-DJEUH6Bb.js} +78 -100
  2. package/dist/{_baseIsEqual-oN7pRNcM.js → _baseIsEqual-CN4oFUZ4.js} +20 -20
  3. package/dist/{_basePickBy-CYvzhRjy.js → _basePickBy-CzSvE_-f.js} +3 -3
  4. package/dist/{_baseProperty-DGUdIBuu.js → _baseProperty-DbbUiyUD.js} +5 -5
  5. package/dist/{_baseUniq-B5gfSl8S.js → _baseUniq-DwoC-LVO.js} +4 -4
  6. package/dist/any-language-editor-CEXn1vFs.js +156 -0
  7. package/dist/apl-DuVfHsPc.js +4 -0
  8. package/dist/architecture-O4VJ6CD3-lp-opOaL.js +21 -0
  9. package/dist/{architectureDiagram-W76B3OCA-DkEhipkW.js → architectureDiagram-W76B3OCA-CoBORy6u.js} +34 -34
  10. package/dist/asciiarmor-qIVWsi4F.js +4 -0
  11. package/dist/asn1-BjPqARr7.js +4 -0
  12. package/dist/assets/__vite-browser-external-lX-sn9m2.js +1 -0
  13. package/dist/assets/worker-vPn7gxWj.js +54 -0
  14. package/dist/{blockDiagram-QIGZ2CNN-DZOqLMYa.js → blockDiagram-QIGZ2CNN-0yzoLIar.js} +75 -86
  15. package/dist/brainfuck-DPGTVfkE.js +4 -0
  16. package/dist/{button-CEcjneWG.js → button-DcnBVpVa.js} +11 -14
  17. package/dist/{c4Diagram-FPNF74CW-DVaR7c9q.js → c4Diagram-FPNF74CW-CKsIA_DD.js} +27 -51
  18. package/dist/{channel-Uh0KpgGW.js → channel-3LVvQZcD.js} +1 -1
  19. package/dist/{check-BK9zDfQk.js → check-D7ifz5op.js} +1 -1
  20. package/dist/{chunk-3AY6CYHV-Dk2R2-S1.js → chunk-3AY6CYHV-B2C-aVc3.js} +35 -35
  21. package/dist/{chunk-4BX2VUAB-CqO6zUIz.js → chunk-4BX2VUAB-DEd4VI9L.js} +1 -1
  22. package/dist/{chunk-4KMFLZZN-CloTfTwP.js → chunk-4KMFLZZN-DnvP3O4K.js} +216 -325
  23. package/dist/{chunk-55IACEB6-I0rmqTua.js → chunk-55IACEB6-BcCzwOOl.js} +1 -1
  24. package/dist/{chunk-6OXUPJBA-BuROSTmo.js → chunk-6OXUPJBA-eNAAfJ3Q.js} +7 -7
  25. package/dist/{chunk-7GE3RBXV-B1-tsIPP.js → chunk-7GE3RBXV-CSAeQvLz.js} +1 -1
  26. package/dist/{chunk-ABZYJK2D-CLlso8tj.js → chunk-ABZYJK2D-CZcb_1iM.js} +16 -20
  27. package/dist/{chunk-BN7GFLIU-Db2-FjLn.js → chunk-BN7GFLIU-pBc5O5Rh.js} +1 -1
  28. package/dist/{chunk-CVBHYZKI-BONeiloK.js → chunk-CVBHYZKI-CivHZg9P.js} +3 -3
  29. package/dist/{chunk-CXMOBAN2-U9GJSP1d.js → chunk-CXMOBAN2-Dd0E6qb0.js} +46 -54
  30. package/dist/chunk-EXTU4WIE-GQ2ZWfJo.js +10 -0
  31. package/dist/{chunk-FMBD7UC4-DyV3BR_I.js → chunk-FMBD7UC4-C6YcisV6.js} +1 -1
  32. package/dist/{chunk-JA3XYJ7Z-C9A1076P.js → chunk-JA3XYJ7Z-DYeQaT57.js} +21 -25
  33. package/dist/{chunk-JEIROHC2-BGnFkSVq.js → chunk-JEIROHC2-B-EZMP4V.js} +1 -1
  34. package/dist/{chunk-K7UQS3LO-033LOsjK.js → chunk-K7UQS3LO-DENzlS-M.js} +7 -7
  35. package/dist/{chunk-KMC2YHZD-DT4Sq4Ld.js → chunk-KMC2YHZD-SckhHdEh.js} +1 -1
  36. package/dist/{chunk-QN33PNHL-gs44MZla.js → chunk-QN33PNHL-Cjq5b604.js} +2 -2
  37. package/dist/{chunk-QYVHNE3D-B8BO1AnT.js → chunk-QYVHNE3D-CNUuivie.js} +3 -4
  38. package/dist/{chunk-QZHKN3VN-CeN_GkU6.js → chunk-QZHKN3VN-DugEU_bA.js} +1 -1
  39. package/dist/chunk-S3R3BYOJ-itCT6Vif.js +380 -0
  40. package/dist/{chunk-T44TD3VJ-BwzD6YE0.js → chunk-T44TD3VJ-BLdfTX8J.js} +1 -1
  41. package/dist/{chunk-TVAH2DTR-Bi6jpQJQ.js → chunk-TVAH2DTR-BOnwF9d8.js} +7 -8
  42. package/dist/{chunk-TZMSLE5B-D8klz2H_.js → chunk-TZMSLE5B-DGs66AlL.js} +4 -5
  43. package/dist/{chunk-WFRQ32O7-CzSwSlN0.js → chunk-WFRQ32O7-CPsipkmJ.js} +1 -1
  44. package/dist/{chunk-WFWHJNB7-DN_cavM6.js → chunk-WFWHJNB7-Cmed18Pk.js} +1 -1
  45. package/dist/{chunk-XRWGC2XP-Bb5eGNM2.js → chunk-XRWGC2XP-DH5GDaY8.js} +1 -1
  46. package/dist/{chunk-ZPAFE4SF-S5UYNb0V.js → chunk-ZPAFE4SF-DPDwaqZm.js} +22 -22
  47. package/dist/classDiagram-KNZD7YFC-azuS_99k.js +39 -0
  48. package/dist/classDiagram-v2-RKCZMP56-CQpyQQOR.js +39 -0
  49. package/dist/{click-outside-container-DE4e7p1p.js → click-outside-container-CL_FkgGY.js} +7 -12
  50. package/dist/{clike-CxAz4p9E.js → clike-DYfRWWXk.js} +1 -1
  51. package/dist/{clike-Cg_DBrJ0.js → clike-bzZTreP4.js} +1 -1
  52. package/dist/clojure-ATksAecl.js +4 -0
  53. package/dist/{clone-Dk4FkKH0.js → clone-Msbhmn2a.js} +1 -1
  54. package/dist/cmake-CWylaz2C.js +4 -0
  55. package/dist/cobol-BiLLCZIQ.js +4 -0
  56. package/dist/coffeescript-Ca4jipi8.js +4 -0
  57. package/dist/commonlisp-BwFjyEC7.js +4 -0
  58. package/dist/{constants-Cjd_3kwd.js → constants-BCOEQoEQ.js} +3 -3
  59. package/dist/{copy-C5RFg7ok.js → copy-BkZ8PkBM.js} +6 -2
  60. package/dist/{cose-bilkent-S5V4N54A-B3iOTGu5.js → cose-bilkent-S5V4N54A-BZnbwyVD.js} +20 -20
  61. package/dist/crystal-BhUsQHbh.js +4 -0
  62. package/dist/css-Cf4wlIyV.js +5 -0
  63. package/dist/cypher-Dj8Hzgxa.js +4 -0
  64. package/dist/{cytoscape.esm-DTDV0Nbj.js → cytoscape.esm-BTpRoPd2.js} +586 -661
  65. package/dist/d-DZI7tbTy.js +4 -0
  66. package/dist/{dagre-5GWH7T2D-KM4Z11yT.js → dagre-5GWH7T2D-BGaiSZZO.js} +32 -37
  67. package/dist/{dagre-B0u1urxE.js → dagre-pyfDIOWJ.js} +57 -76
  68. package/dist/data-grid-overlay-editor-867aBz0Y.js +133 -0
  69. package/dist/{diagram-N5W7TBWH-CtO7az4G.js → diagram-N5W7TBWH-CzLE0jZB.js} +35 -51
  70. package/dist/diagram-QEK2KX5R-AGS60xEZ.js +245 -0
  71. package/dist/{diagram-S2PKOQOG-CiXElLNQ.js → diagram-S2PKOQOG-BxRoG6yW.js} +28 -28
  72. package/dist/diff-WQISUHG5.js +4 -0
  73. package/dist/{dist-CdE2C2In.js → dist-2Ne-33Xy.js} +15 -20
  74. package/dist/{dist-DKFaZRVk.js → dist-B0YD1aXi.js} +2 -2
  75. package/dist/{dist-DBhzmFyH.js → dist-B1Dv8Sdk.js} +3 -3
  76. package/dist/{dist-CGIZPq3J.js → dist-BFkr6kAQ.js} +2 -2
  77. package/dist/{dist-DL_ci7Yc.js → dist-BL2DSY0P.js} +1 -1
  78. package/dist/dist-BawZu0ix.js +10 -0
  79. package/dist/{dist-Bar1QnNM.js → dist-BhVFggab.js} +3 -3
  80. package/dist/{textile-Cy55fYGC.js → dist-BiOF7987.js} +4 -2
  81. package/dist/{dist-BQmQQqFH.js → dist-BpzZrRd6.js} +1 -1
  82. package/dist/{dist-CxD5E6Sh.js → dist-C7zhQ7K0.js} +24 -22
  83. package/dist/{dist-BqgkUnEN.js → dist-CBhnQKQ4.js} +3 -3
  84. package/dist/{dist-Dzk1C8l5.js → dist-CId4IPXu.js} +10 -13
  85. package/dist/{dist-CUnh_3Ii.js → dist-CYhQCVru.js} +2 -2
  86. package/dist/{dist-BBlFk9ki.js → dist-CZq5-ZyD.js} +1 -1
  87. package/dist/{dist-elblfNXO.js → dist-Cacac5HV.js} +2 -2
  88. package/dist/{dist-CChOkSUg.js → dist-CfQHSIQC.js} +3 -3
  89. package/dist/{dist-JCAky9ND.js → dist-CkvGMBAS.js} +17 -22
  90. package/dist/dist-Cs3McXEj.js +6 -0
  91. package/dist/{dist-o7fhJC7U.js → dist-CvyfRaIr.js} +3 -3
  92. package/dist/{dist-CZfRM7pE.js → dist-D-3fICwh.js} +2 -2
  93. package/dist/dist-D3aaithT.js +6 -0
  94. package/dist/{dist-CutXTm8t.js → dist-DBhEu3-F.js} +1 -1
  95. package/dist/dist-DELcMSpJ.js +6 -0
  96. package/dist/{dist-C7ASiFxI.js → dist-DMxl6Qbu.js} +273 -263
  97. package/dist/{dist-CLvpViod.js → dist-DS6nuHYK.js} +2 -3
  98. package/dist/dist-Dgts3WXd.js +6 -0
  99. package/dist/{dist--I6Htnlv.js → dist-DlHkZUnY.js} +5 -5
  100. package/dist/dist-Doiq_KIP.js +15 -0
  101. package/dist/dist-DtpUiDG_.js +6 -0
  102. package/dist/{dist-DzOpMdwb.js → dist-NUdHX0XE.js} +4 -4
  103. package/dist/{dist-C3WYsf4K.js → dist-PGgOcwbF.js} +4 -10
  104. package/dist/{dist-DNnYAdRE.js → dist-RdxOJbBw.js} +2 -2
  105. package/dist/{dist-BEvIw5Nh.js → dist-RwqAqkpG.js} +1 -1
  106. package/dist/dist-ZjnJq_jD.js +10 -0
  107. package/dist/{dist-CbRkrKrP.js → dist-biZ846D9.js} +5 -5
  108. package/dist/{dist-DW9er3Zq.js → dist-d5NxvX2s.js} +44 -23
  109. package/dist/{dist-C3QUag__.js → dist-ivwkJchV.js} +3 -3
  110. package/dist/dist-mof3iuBu.js +12 -0
  111. package/dist/{dist-Cib4sGDA.js → dist-reo2kYlN.js} +2 -2
  112. package/dist/{dist-BZBitvuL.js → dist-wHVprCkn.js} +1 -1
  113. package/dist/{dist-C5zMs_n5.js → dist-y8uoXYaE.js} +3 -3
  114. package/dist/{dist-DPF5TTUg.js → dist-z_iuDES7.js} +126 -115
  115. package/dist/{dockerfile-Dum_1b-5.js → dockerfile-sZMPcXVY.js} +1 -1
  116. package/dist/dtd-B2M8dhfC.js +4 -0
  117. package/dist/dylan-CU3Vt8SC.js +4 -0
  118. package/dist/ecl-B8ESAVq4.js +4 -0
  119. package/dist/eiffel-DDfMIKeA.js +4 -0
  120. package/dist/elm-Bj6rj8jf.js +4 -0
  121. package/dist/{erDiagram-AWTI2OKA-ZTIl9iQO.js → erDiagram-AWTI2OKA-CTxzb-U8.js} +20 -20
  122. package/dist/erlang-BxyshZUq.js +4 -0
  123. package/dist/{error-banner-OQIGTqFR.js → error-banner-npbEfanI.js} +13 -13
  124. package/dist/{esm-DxFkg7a6.js → esm-BdiY4QsX.js} +1528 -1492
  125. package/dist/{esm-d0g2RsOH.js → esm-CAWW9sum.js} +6 -8
  126. package/dist/{esm-1_Mp6VD2.js → esm-YY5zh7KV.js} +324 -395
  127. package/dist/{esm-BO9n_s6u.js → esm-svAVli9f.js} +5 -5
  128. package/dist/{factor-CdgiDGiu.js → factor-CRFTmP_a.js} +1 -1
  129. package/dist/factor-CYk6XT8r.js +5 -0
  130. package/dist/{flowDiagram-PVAE7QVJ-DsbofOzu.js → flowDiagram-PVAE7QVJ-Dck2hiJe.js} +22 -22
  131. package/dist/{formats-D5C6JAJf.js → formats-BnqXUb1V.js} +13 -17
  132. package/dist/forth-fcoJkd-f.js +4 -0
  133. package/dist/fortran-IxZHu4wc.js +4 -0
  134. package/dist/{fullscreen-D1yTiBlu.js → fullscreen-blsKUrtN.js} +741 -744
  135. package/dist/{ganttDiagram-OWAHRB6G-FnCH1Yj3.js → ganttDiagram-OWAHRB6G-AWzfzpup.js} +9 -9
  136. package/dist/gas-B8rmKcim.js +4 -0
  137. package/dist/gherkin-BTm-jIdJ.js +4 -0
  138. package/dist/gitGraph-ZV4HHKMB-DFg_OLQb.js +21 -0
  139. package/dist/{gitGraphDiagram-NY62KEGX-B0wvMNqU.js → gitGraphDiagram-NY62KEGX-GyNboWSV.js} +31 -34
  140. package/dist/{glide-data-editor-CYfKmSNp.js → glide-data-editor-DHuN8kQ8.js} +1701 -1771
  141. package/dist/{graphlib-BGmr7CYF.js → graphlib-hb3zmtVD.js} +5 -5
  142. package/dist/groovy-01kRHFMD.js +4 -0
  143. package/dist/haskell-B3PhE05w.js +4 -0
  144. package/dist/haxe-DEoAm8oA.js +5 -0
  145. package/dist/{hotkeys-yFrUwyJK.js → hotkeys-Ct2T3e9O.js} +4 -7
  146. package/dist/idl-DsDJU9cV.js +4 -0
  147. package/dist/info-63CPKGFF-D3DZmDBa.js +21 -0
  148. package/dist/infoDiagram-STP46IZ2-ec08vi_U.js +44 -0
  149. package/dist/{isArrayLikeObject-DiDsNamC.js → isArrayLikeObject-BlvK28do.js} +3 -5
  150. package/dist/{isEmpty-BBG-u1GM.js → isEmpty--odfYjh1.js} +2 -2
  151. package/dist/{isSymbol-BxF-_8BA.js → isSymbol-Cb1f2HgO.js} +1 -1
  152. package/dist/{javascript-Dfq1qI35.js → javascript-BfCTmOnk.js} +2 -2
  153. package/dist/javascript-gwczVhuU.js +5 -0
  154. package/dist/jinja2-AkZRdFk3.js +4 -0
  155. package/dist/{journeyDiagram-BIP6EPQ6-B3PotfAW.js → journeyDiagram-BIP6EPQ6-TmXYCUbT.js} +23 -24
  156. package/dist/julia-_s6qe3bf.js +4 -0
  157. package/dist/{kanban-definition-6OIFK2YF-BTrQZ3LN.js → kanban-definition-6OIFK2YF-B6ozleHo.js} +15 -15
  158. package/dist/{katex-dN__NFdn.js → katex-mPzRsXEy.js} +1 -1
  159. package/dist/{katex-BE4xflfm.js → katex-mkWmhPUh.js} +149 -173
  160. package/dist/{label-BinTsX-u.js → label-VVRKZmrP.js} +21 -24
  161. package/dist/{linear-DyTdUIqX.js → linear-iebAbJVD.js} +1 -1
  162. package/dist/livescript-CwPHQdv5.js +4 -0
  163. package/dist/{loader-Dijti3y4.js → loader-CM0VALo9.js} +19 -26
  164. package/dist/lua-s7nRxkCP.js +4 -0
  165. package/dist/main.js +8234 -8633
  166. package/dist/{marked.esm-3RjvXPoO.js → marked.esm-DJM8la36.js} +5 -5
  167. package/dist/mathematica-Ci36yd1q.js +4 -0
  168. package/dist/mbox-DbOYMNCO.js +4 -0
  169. package/dist/{memoize-Dq87l1O_.js → memoize-DYoRBSLn.js} +1 -1
  170. package/dist/{merge-BPDCIm8P.js → merge-BjuR6j_w.js} +1 -1
  171. package/dist/{mermaid-BlJDcO4M.js → mermaid-YPPMBmhk.js} +58 -76
  172. package/dist/{mermaid-parser.core-CSFx6MQ7.js → mermaid-parser.core-BLkyTSZj.js} +8 -8
  173. package/dist/{mhchem-DZ68WS0G.js → mhchem-Dw7wvXtr.js} +1 -1
  174. package/dist/{min-BzhKOmZo.js → min-B_i2ahn4.js} +7 -7
  175. package/dist/{mindmap-definition-Q6HEUPPD-9hhnrO1k.js → mindmap-definition-Q6HEUPPD-F6-JnXwq.js} +17 -17
  176. package/dist/mirc-VmNe8AwF.js +4 -0
  177. package/dist/mllike-BdD7SJEa.js +6 -0
  178. package/dist/modelica-BA4VqzC3.js +4 -0
  179. package/dist/mscgen-DF-5WHJm.js +6 -0
  180. package/dist/mumps-c_Uia_QN.js +4 -0
  181. package/dist/{node-sql-parser-13oju30e.js → node-sql-parser-BqKV-TpL.js} +14343 -14351
  182. package/dist/{now-DVBcRCoE.js → now-CwRqw0nS.js} +1 -1
  183. package/dist/nsis-BAANGODV.js +5 -0
  184. package/dist/{nsis-BW6_XagK.js → nsis-BWJEeUyS.js} +1 -1
  185. package/dist/ntriples-Bslqh2Ki.js +4 -0
  186. package/dist/{number-overlay-editor-D1YdiOrm.js → number-overlay-editor-CeyruAX4.js} +17 -23
  187. package/dist/octave-DYn5ltia.js +4 -0
  188. package/dist/oz-B_N-StZq.js +4 -0
  189. package/dist/packet-HUATNLJX-CkqjFdAv.js +21 -0
  190. package/dist/pascal-DU4CtAUu.js +4 -0
  191. package/dist/perl-Bae6k32u.js +4 -0
  192. package/dist/pie-WTHONI2E-D0rWwX5P.js +21 -0
  193. package/dist/{pieDiagram-ADFJNKIX-CSBC0ZgF.js → pieDiagram-ADFJNKIX-C5dSQVCn.js} +28 -28
  194. package/dist/pig-DSIxUEgX.js +4 -0
  195. package/dist/powershell-31lcPgIF.js +4 -0
  196. package/dist/powershell-BZx53Ujw.js +236 -0
  197. package/dist/properties-lmYbntDG.js +4 -0
  198. package/dist/protobuf-BTYoCEpV.js +4 -0
  199. package/dist/pug-DMFM7zzO.js +5 -0
  200. package/dist/{pug-Bmups_z0.js → pug-PJh82u1M.js} +1 -1
  201. package/dist/puppet-B0ub07d-.js +4 -0
  202. package/dist/python-C4jT87Nt.js +5 -0
  203. package/dist/{q-BzWcnVri.js → q-CMoUHJ5Q.js} +3 -2
  204. package/dist/q-YbPYlqRI.js +4 -0
  205. package/dist/{quadrantDiagram-LMRXKWRM-h7nHf8xG.js → quadrantDiagram-LMRXKWRM-DlahxNiy.js} +7 -7
  206. package/dist/r-OfNu6HAI.js +4 -0
  207. package/dist/radar-NJJJXTRR-Bxqv4O5a.js +21 -0
  208. package/dist/{range-CgK0-PEw.js → range-DxfkexCE.js} +3 -3
  209. package/dist/{react-plotly-BZakcxdv.js → react-plotly-D_IAfR8f.js} +4364 -4705
  210. package/dist/{requirementDiagram-4UW4RH46-BGEurQYq.js → requirementDiagram-4UW4RH46-DTkinyvU.js} +17 -17
  211. package/dist/rpm-D_3b5peD.js +5 -0
  212. package/dist/ruby-CehsJy_T.js +4 -0
  213. package/dist/{sankeyDiagram-GR3RE2ED-CxeJ_jfl.js → sankeyDiagram-GR3RE2ED-CsLnEnnq.js} +3 -3
  214. package/dist/sas-DwQHzPoF.js +4 -0
  215. package/dist/scheme-B6ArxiQu.js +4 -0
  216. package/dist/{sequenceDiagram-C3RYC4MD-CbFxwyr_.js → sequenceDiagram-C3RYC4MD-BdEOR6SC.js} +20 -30
  217. package/dist/shell-AHmQgDfc.js +4 -0
  218. package/dist/sieve-CgodKOcx.js +4 -0
  219. package/dist/{simple-mode-Cgyya8F-.js → simple-mode-BP3Jd4vf.js} +1 -1
  220. package/dist/{slides-component-BEyG25AH.js → slides-component-2bbal1YJ.js} +24 -46
  221. package/dist/smalltalk-BeFzDkbo.js +4 -0
  222. package/dist/sparql-BWxq-Lnx.js +4 -0
  223. package/dist/{src-BNNJRxz3.js → src-DZkaBUmt.js} +6 -6
  224. package/dist/{stateDiagram-KXAO66HF-A61bMf29.js → stateDiagram-KXAO66HF-DQLH2jhP.js} +39 -41
  225. package/dist/stateDiagram-v2-UMBNRL4Z-D9v8fKjF.js +38 -0
  226. package/dist/stex-Dvaq0qsm.js +5 -0
  227. package/dist/style.css +1 -1
  228. package/dist/stylus-Ge0ofWlZ.js +4 -0
  229. package/dist/swift-CjQfbVxV.js +4 -0
  230. package/dist/tcl-CAGDF11K.js +4 -0
  231. package/dist/textile-CrXreJtf.js +4 -0
  232. package/dist/{time-D3tzCqJ6.js → time-CFkXkVrt.js} +1 -1
  233. package/dist/{timeline-definition-XQNQX7LJ-BwdsB7CR.js → timeline-definition-XQNQX7LJ-bToVq14i.js} +4 -5
  234. package/dist/{timer-D3Zlu9ow.js → timer-CzOhIJuk.js} +2 -2
  235. package/dist/{toNumber-efKT08hh.js → toNumber-EFF1Z9T1.js} +2 -2
  236. package/dist/{toString-BvCd3yJc.js → toString-C2mCkasT.js} +2 -2
  237. package/dist/toml-AdLXKwEi.js +4 -0
  238. package/dist/{toml-CIUkU1CP.js → toml-eSl4PUAH.js} +6 -2
  239. package/dist/treemap-75Q7IDZK-Da9Jv6a_.js +21 -0
  240. package/dist/troff-C-LaM2ex.js +4 -0
  241. package/dist/ttcn-DTclUi6T.js +4 -0
  242. package/dist/ttcn-cfg-BtBPbmLX.js +4 -0
  243. package/dist/turtle-BODDDg5O.js +4 -0
  244. package/dist/{types-Dcb1hf55.js → types-CRXV0KD5.js} +385 -252
  245. package/dist/{useAsyncData-DAtPzJzP.js → useAsyncData-uMVTsDI9.js} +1 -1
  246. package/dist/{useDateFormatter-CiUlIu7v.js → useDateFormatter-Dcz7jstn.js} +6 -6
  247. package/dist/{useTheme-CmsvrO5o.js → useTheme-NbEx-ZNV.js} +14 -10
  248. package/dist/vb-Cb1HQHii.js +4 -0
  249. package/dist/vbscript-CpXOP4wZ.js +4 -0
  250. package/dist/{vega-component-B3LA6qbm.js → vega-component-hegVmfuS.js} +21 -21
  251. package/dist/{vega-loader.browser.module-Bi3ttvdj.js → vega-loader.browser.module-DcW8jnKp.js} +1 -2
  252. package/dist/velocity-Dz0rBQIk.js +4 -0
  253. package/dist/verilog-6Di9aLKw.js +4 -0
  254. package/dist/vhdl-BRNesXYc.js +4 -0
  255. package/dist/webidl-BpRNYIYn.js +4 -0
  256. package/dist/xquery-DXWcJ7b6.js +4 -0
  257. package/dist/{xychartDiagram-6GGTOJPD-BJRRi5HC.js → xychartDiagram-6GGTOJPD-C7Bhm_yt.js} +12 -13
  258. package/dist/yacas-DbSARPz4.js +4 -0
  259. package/dist/z80-DzslPj_l.js +4 -0
  260. package/dist/{zod-UPQf9SGn.js → zod-ChY6miG5.js} +71 -81
  261. package/package.json +12 -12
  262. package/src/__mocks__/requests.ts +2 -0
  263. package/src/__tests__/chat-history.test.ts +123 -0
  264. package/src/components/app-config/ai-config.tsx +23 -0
  265. package/src/components/app-config/mcp-config.tsx +42 -2
  266. package/src/components/app-config/user-config-form.tsx +29 -49
  267. package/src/components/chat/acp/__tests__/context-utils.test.ts +1 -1
  268. package/src/components/chat/acp/agent-panel.tsx +1 -1
  269. package/src/components/chat/acp/blocks.tsx +46 -53
  270. package/src/components/chat/acp/common.tsx +1 -1
  271. package/src/components/chat/acp/context-utils.ts +1 -1
  272. package/src/components/chat/acp/session-tabs.tsx +1 -1
  273. package/src/components/chat/chat-history-popover.tsx +125 -0
  274. package/src/components/chat/chat-history-utils.ts +69 -0
  275. package/src/components/chat/chat-panel.tsx +9 -57
  276. package/src/components/chat/chat-utils.ts +11 -4
  277. package/src/components/data-table/__tests__/header-items.test.tsx +117 -0
  278. package/src/components/data-table/column-header.tsx +4 -2
  279. package/src/components/data-table/columns.tsx +2 -1
  280. package/src/components/data-table/data-table.tsx +7 -2
  281. package/src/components/data-table/header-items.tsx +63 -10
  282. package/src/components/dependency-graph/custom-node.tsx +11 -11
  283. package/src/components/dependency-graph/elements.ts +9 -4
  284. package/src/components/dependency-graph/panels.tsx +6 -4
  285. package/src/components/editor/Output.tsx +6 -1
  286. package/src/components/editor/__tests__/data-attributes.test.tsx +1 -1
  287. package/src/components/editor/actions/useNotebookActions.tsx +2 -4
  288. package/src/components/editor/ai/__tests__/completion-utils.test.ts +23 -31
  289. package/src/components/editor/ai/ai-completion-editor.tsx +135 -5
  290. package/src/components/editor/ai/completion-handlers.tsx +106 -22
  291. package/src/components/editor/cell/CreateCellButton.tsx +14 -2
  292. package/src/components/editor/cell/code/cell-editor.tsx +6 -0
  293. package/src/components/editor/chrome/panels/cache-panel.tsx +216 -0
  294. package/src/components/editor/chrome/panels/empty-state.tsx +3 -1
  295. package/src/components/editor/chrome/types.ts +66 -22
  296. package/src/components/editor/chrome/wrapper/app-chrome.tsx +2 -0
  297. package/src/components/editor/database/schemas.ts +2 -10
  298. package/src/components/editor/errors/auto-fix.tsx +138 -32
  299. package/src/components/editor/errors/fix-mode.ts +15 -0
  300. package/src/components/editor/navigation/__tests__/clipboard.test.ts +0 -5
  301. package/src/components/editor/navigation/clipboard.ts +2 -1
  302. package/src/components/editor/{Cell.tsx → notebook-cell.tsx} +25 -8
  303. package/src/components/editor/output/ConsoleOutput.tsx +27 -33
  304. package/src/components/editor/output/JsonOutput.tsx +9 -0
  305. package/src/components/editor/output/MarimoErrorOutput.tsx +4 -34
  306. package/src/components/editor/output/MarimoTracebackOutput.tsx +10 -7
  307. package/src/components/editor/output/__tests__/json-output.test.ts +43 -0
  308. package/src/components/editor/package-alert.tsx +3 -0
  309. package/src/components/editor/renderers/{CellArray.tsx → cell-array.tsx} +1 -1
  310. package/src/components/forms/__tests__/form-utils.test.ts +6 -4
  311. package/src/components/icons/copy-icon.tsx +11 -5
  312. package/src/components/mcp/hooks.ts +48 -0
  313. package/src/components/mcp/mcp-status-indicator.tsx +144 -0
  314. package/src/components/shortcuts/renderShortcut.tsx +3 -1
  315. package/src/components/ui/button.tsx +2 -0
  316. package/src/components/ui/confirmation-button.tsx +85 -0
  317. package/src/components/ui/number-field.tsx +4 -1
  318. package/src/components/ui/switch.tsx +2 -0
  319. package/src/core/ai/context/providers/__tests__/__snapshots__/tables.test.ts.snap +13 -19
  320. package/src/core/ai/context/providers/__tests__/cell-output.test.ts +0 -1
  321. package/src/core/ai/context/providers/__tests__/datasource.test.ts +14 -7
  322. package/src/core/ai/context/providers/__tests__/error.test.ts +24 -15
  323. package/src/core/ai/context/providers/cell-output.ts +5 -5
  324. package/src/core/ai/context/providers/common.ts +13 -4
  325. package/src/core/ai/context/providers/datasource.ts +56 -21
  326. package/src/core/ai/context/providers/error.ts +3 -4
  327. package/src/core/ai/context/providers/file.ts +2 -2
  328. package/src/core/ai/context/providers/tables.ts +36 -8
  329. package/src/core/ai/context/providers/variable.ts +2 -3
  330. package/src/core/ai/state.ts +6 -3
  331. package/src/core/ai/tools/__tests__/registry.test.ts +33 -8
  332. package/src/core/ai/tools/base.ts +81 -1
  333. package/src/core/ai/tools/registry.ts +36 -10
  334. package/src/core/ai/tools/sample-tool.ts +44 -8
  335. package/src/core/cache/requests.ts +5 -0
  336. package/src/core/cells/__tests__/cells.test.ts +6 -6
  337. package/src/core/cells/cells.ts +13 -14
  338. package/src/core/cells/scrollCellIntoView.ts +1 -1
  339. package/src/core/codemirror/__tests__/__snapshots__/setup.test.ts.snap +2 -0
  340. package/src/core/codemirror/__tests__/replace-editor-content.test.ts +336 -0
  341. package/src/core/codemirror/__tests__/setup.test.ts +1 -0
  342. package/src/core/codemirror/cm.ts +3 -2
  343. package/src/core/codemirror/find-replace/navigate.ts +2 -2
  344. package/src/core/codemirror/format.ts +2 -9
  345. package/src/core/codemirror/language/__tests__/sql.test.ts +24 -6
  346. package/src/core/codemirror/language/languages/python.ts +1 -3
  347. package/src/core/codemirror/language/languages/sql/sql.ts +23 -13
  348. package/src/core/codemirror/language/panel/panel.tsx +1 -6
  349. package/src/core/codemirror/language/utils.ts +3 -8
  350. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +21 -14
  351. package/src/core/codemirror/lsp/federated-lsp.ts +20 -9
  352. package/src/core/codemirror/lsp/notebook-lsp.ts +35 -29
  353. package/src/core/codemirror/lsp/types.ts +0 -13
  354. package/src/core/codemirror/replace-editor-content.ts +87 -0
  355. package/src/core/config/__tests__/config-schema.test.ts +5 -0
  356. package/src/core/config/config-schema.ts +10 -0
  357. package/src/core/config/feature-flag.tsx +2 -6
  358. package/src/core/edit-app.tsx +1 -1
  359. package/src/core/errors/__tests__/errors.test.ts +1 -0
  360. package/src/core/errors/errors.ts +20 -6
  361. package/src/core/islands/bridge.ts +2 -0
  362. package/src/core/islands/main.ts +4 -0
  363. package/src/core/kernel/messages.ts +1 -0
  364. package/src/core/network/CachingRequestRegistry.ts +2 -2
  365. package/src/core/network/requests-network.ts +14 -0
  366. package/src/core/network/requests-static.ts +2 -0
  367. package/src/core/network/requests-toasting.ts +2 -0
  368. package/src/core/network/types.ts +5 -0
  369. package/src/core/saving/save-component.tsx +43 -36
  370. package/src/core/wasm/bridge.ts +2 -0
  371. package/src/core/websocket/useMarimoWebSocket.tsx +8 -0
  372. package/src/css/app/codemirror-completions.css +1 -1
  373. package/src/custom.d.ts +2 -0
  374. package/src/plugins/core/registerReactComponent.tsx +5 -1
  375. package/src/plugins/impl/DataTablePlugin.tsx +19 -19
  376. package/src/plugins/impl/__tests__/DateTimePickerPlugin.test.tsx +32 -0
  377. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  378. package/src/plugins/impl/chat/chat-ui.tsx +17 -2
  379. package/src/plugins/impl/chat/types.ts +1 -1
  380. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +7 -2
  381. package/src/plugins/impl/plotly/__tests__/parse-from-template.test.ts +17 -0
  382. package/src/plugins/impl/plotly/parse-from-template.ts +2 -1
  383. package/src/stories/cell.stories.tsx +1 -1
  384. package/src/stories/layout/vertical/one-column.stories.tsx +1 -1
  385. package/src/utils/__tests__/formatting.test.ts +107 -0
  386. package/src/utils/__tests__/json-parser.test.ts +13 -0
  387. package/src/utils/copy.ts +6 -0
  388. package/src/utils/formatting.ts +51 -0
  389. package/src/utils/json/json-parser.ts +28 -3
  390. package/src/utils/numbers.ts +24 -1
  391. package/dist/any-language-editor-CVFQlioK.js +0 -156
  392. package/dist/apl-ChlaBfxB.js +0 -4
  393. package/dist/architecture-O4VJ6CD3-BVeaxUcM.js +0 -21
  394. package/dist/asciiarmor-CcJmm3l_.js +0 -4
  395. package/dist/asn1-ThRYxoBE.js +0 -4
  396. package/dist/assets/__vite-browser-external-BeNtI_tJ.js +0 -1
  397. package/dist/assets/worker-DnuXpGWN.js +0 -54
  398. package/dist/brainfuck-CEM0JgDn.js +0 -4
  399. package/dist/chunk-EXTU4WIE-DECT9AAK.js +0 -14
  400. package/dist/chunk-S3R3BYOJ-DMQ1yeyq.js +0 -386
  401. package/dist/classDiagram-KNZD7YFC-BG53O6Jt.js +0 -39
  402. package/dist/classDiagram-v2-RKCZMP56-BmKILsGU.js +0 -39
  403. package/dist/clojure-B7RHyE9t.js +0 -4
  404. package/dist/cmake-TeTMP4I5.js +0 -4
  405. package/dist/cobol-DI-mxUER.js +0 -4
  406. package/dist/coffeescript-DHUFLqWp.js +0 -4
  407. package/dist/commonlisp-SLiUrh1m.js +0 -4
  408. package/dist/crystal-B4fY1ZfJ.js +0 -4
  409. package/dist/css-Bdoq3TzK.js +0 -5
  410. package/dist/cypher-CBU182fp.js +0 -4
  411. package/dist/d-D8myDZeH.js +0 -4
  412. package/dist/data-grid-overlay-editor-qNmJk2x0.js +0 -135
  413. package/dist/diagram-QEK2KX5R-fu8Noi3H.js +0 -245
  414. package/dist/diff-DJF_UB7H.js +0 -4
  415. package/dist/dist-52-_pKoy.js +0 -6
  416. package/dist/dist-6DOMStFn.js +0 -6
  417. package/dist/dist-B334aW7p.js +0 -10
  418. package/dist/dist-BOI9lUz-.js +0 -12
  419. package/dist/dist-C06uhBzF.js +0 -6
  420. package/dist/dist-CGkpguCB.js +0 -6
  421. package/dist/dist-CrApzUED.js +0 -6
  422. package/dist/dist-Dp2GLdCl.js +0 -14
  423. package/dist/dist-WHFsbMDr.js +0 -6
  424. package/dist/dist-hyKcTPG9.js +0 -10
  425. package/dist/dtd-DY8q65lC.js +0 -4
  426. package/dist/dylan-CBLcjWCi.js +0 -4
  427. package/dist/ecl-BSXPNfOw.js +0 -4
  428. package/dist/eiffel-BJf0PQX-.js +0 -4
  429. package/dist/elm-DWQwPCZS.js +0 -4
  430. package/dist/erlang-BWBaGZ5e.js +0 -4
  431. package/dist/factor-DT1-MBPl.js +0 -5
  432. package/dist/forth-D9GDt3FB.js +0 -4
  433. package/dist/fortran-DHkRhDWw.js +0 -4
  434. package/dist/gas-7lQEOM0H.js +0 -4
  435. package/dist/gherkin-BLLyroYi.js +0 -4
  436. package/dist/gitGraph-ZV4HHKMB-z2v_cInC.js +0 -21
  437. package/dist/groovy-C-wabwj0.js +0 -4
  438. package/dist/haskell-DaxVQ_d1.js +0 -4
  439. package/dist/haxe-C2yLoC7h.js +0 -5
  440. package/dist/idl-DQBP8i7k.js +0 -4
  441. package/dist/info-63CPKGFF-GS4w6pCB.js +0 -21
  442. package/dist/infoDiagram-STP46IZ2-DE9YYPFg.js +0 -44
  443. package/dist/javascript-DRwFV9r5.js +0 -5
  444. package/dist/jinja2-CNoIpVmN.js +0 -4
  445. package/dist/julia-DXDf-GhP.js +0 -4
  446. package/dist/livescript-S2uhJQx7.js +0 -4
  447. package/dist/lua-Bvgs0y2G.js +0 -4
  448. package/dist/mathematica-D2zqfwIg.js +0 -4
  449. package/dist/mbox-SBcPaDuZ.js +0 -4
  450. package/dist/mirc-hkQc7sVF.js +0 -4
  451. package/dist/mllike-DRWPBlr9.js +0 -6
  452. package/dist/modelica-CO2ROGlP.js +0 -4
  453. package/dist/mscgen-BpX61bO6.js +0 -6
  454. package/dist/mumps-BCnFeIn6.js +0 -4
  455. package/dist/nsis-BaTOxlD1.js +0 -5
  456. package/dist/ntriples-zEo5BWjr.js +0 -4
  457. package/dist/octave-BE0RnCM9.js +0 -4
  458. package/dist/oz-C4_2Ttul.js +0 -4
  459. package/dist/packet-HUATNLJX-CjHqJIqk.js +0 -21
  460. package/dist/pascal-Q3jJucpw.js +0 -4
  461. package/dist/perl-DkXZIWHF.js +0 -4
  462. package/dist/pie-WTHONI2E-D67gLWtR.js +0 -21
  463. package/dist/pig-DCgEHdsu.js +0 -4
  464. package/dist/powershell-3rK_nRRJ.js +0 -236
  465. package/dist/powershell-Eo2-7MoM.js +0 -4
  466. package/dist/properties-C0IOX8WR.js +0 -4
  467. package/dist/protobuf--lGQUSRO.js +0 -4
  468. package/dist/pug-Cf8AQHMJ.js +0 -5
  469. package/dist/puppet-D7Z3dTJn.js +0 -4
  470. package/dist/python-FHIx_i8Y.js +0 -5
  471. package/dist/q-B7UA1feM.js +0 -4
  472. package/dist/r-Cc9R2A7N.js +0 -4
  473. package/dist/radar-NJJJXTRR-C-AZP_Te.js +0 -21
  474. package/dist/rpm-vhJNlrQ6.js +0 -5
  475. package/dist/ruby-CVluPY0M.js +0 -4
  476. package/dist/sas-A8DL8oy3.js +0 -4
  477. package/dist/scheme-6xHHcSXC.js +0 -4
  478. package/dist/shell-DHN-e5rf.js +0 -4
  479. package/dist/sieve-BuQwLY02.js +0 -4
  480. package/dist/smalltalk-BA4HPg2H.js +0 -4
  481. package/dist/sparql-Bf4yCuy3.js +0 -4
  482. package/dist/stateDiagram-v2-UMBNRL4Z-C_0FUzzk.js +0 -38
  483. package/dist/stex-D-I1cYeE.js +0 -5
  484. package/dist/stylus-BMeped2l.js +0 -4
  485. package/dist/swift-lwEdlZoC.js +0 -4
  486. package/dist/tcl-B03ipeqv.js +0 -4
  487. package/dist/toml-BLgrVtfu.js +0 -4
  488. package/dist/treemap-75Q7IDZK-DTvwfpWt.js +0 -21
  489. package/dist/troff-g6EjN2O2.js +0 -4
  490. package/dist/ttcn-Dzvba8jK.js +0 -4
  491. package/dist/ttcn-cfg-CadG0p1K.js +0 -4
  492. package/dist/turtle-DkXAMWo9.js +0 -4
  493. package/dist/vb-C5dCiel8.js +0 -4
  494. package/dist/vbscript-I4bDEQln.js +0 -4
  495. package/dist/velocity-mt0fDwFH.js +0 -4
  496. package/dist/verilog-Dxq3KJkc.js +0 -4
  497. package/dist/vhdl-Km0QUlV-.js +0 -4
  498. package/dist/webidl-B3lJ2MRL.js +0 -4
  499. package/dist/xquery-CcIxNPEe.js +0 -4
  500. package/dist/yacas-oMa-f-tN.js +0 -4
  501. package/dist/z80-D03Nvn6l.js +0 -4
  502. /package/dist/{apl-DZqo8Elt.js → apl-CEHentF4.js} +0 -0
  503. /package/dist/{asciiarmor-DTzHAIeX.js → asciiarmor-DURYiCS0.js} +0 -0
  504. /package/dist/{asn1-DrAXKsZH.js → asn1-ETAiEoXY.js} +0 -0
  505. /package/dist/{asterisk-oF4U3h48.js → asterisk-DTpbbXPb.js} +0 -0
  506. /package/dist/{brainfuck-BYgLey30.js → brainfuck-BWQep-SA.js} +0 -0
  507. /package/dist/{clojure-Bs2M3OUY.js → clojure-BzFapDkA.js} +0 -0
  508. /package/dist/{cmake-DpI8vxJN.js → cmake-DvlbIC8x.js} +0 -0
  509. /package/dist/{cobol-BQyrWo72.js → cobol-BrEI4cPR.js} +0 -0
  510. /package/dist/{coffeescript-9ke9UHmw.js → coffeescript-B6cvu8mO.js} +0 -0
  511. /package/dist/{common-keywords-BzgeAvH1.js → common-keywords-WqQm7W8t.js} +0 -0
  512. /package/dist/{commonlisp-DghUdrUH.js → commonlisp-BIT8PQqi.js} +0 -0
  513. /package/dist/{crystal-DEf_SInh.js → crystal-B_UcPArT.js} +0 -0
  514. /package/dist/{css-BzTU9lNO.js → css-dHbnt_zl.js} +0 -0
  515. /package/dist/{cypher-a2v0c11S.js → cypher-Dh3FOpL7.js} +0 -0
  516. /package/dist/{d-SAswny-M.js → d-CQD1IHee.js} +0 -0
  517. /package/dist/{diff-OJ-xLXcG.js → diff-CpF_IDx0.js} +0 -0
  518. /package/dist/{dtd-BsUf-rer.js → dtd-DYoNpy6c.js} +0 -0
  519. /package/dist/{duckdb-keywords-B0NOra5o.js → duckdb-keywords-CdIsl9L0.js} +0 -0
  520. /package/dist/{dylan-C0ZYngjn.js → dylan-Bc_2G1E-.js} +0 -0
  521. /package/dist/{ebnf-DF1xx0b_.js → ebnf-jGVT_YpN.js} +0 -0
  522. /package/dist/{ecl-Bsuvoouq.js → ecl-UIU-P-Ar.js} +0 -0
  523. /package/dist/{eiffel-DgfSpLi-.js → eiffel-C90Oyuix.js} +0 -0
  524. /package/dist/{elm-GNxDj-5E.js → elm-B9fWSySj.js} +0 -0
  525. /package/dist/{erlang-Ds3uY1kL.js → erlang-Ccff0UAn.js} +0 -0
  526. /package/dist/{fcl-CqBgSioc.js → fcl-CGR8NxAg.js} +0 -0
  527. /package/dist/{forth-JCaLysGk.js → forth-U1ROGcBY.js} +0 -0
  528. /package/dist/{fortran-Dc2AoKAl.js → fortran-3nOkjDmc.js} +0 -0
  529. /package/dist/{gas-Q4Uz82YW.js → gas-B_4H5FzV.js} +0 -0
  530. /package/dist/{gherkin-Dpxe49sQ.js → gherkin-B0eru5Uz.js} +0 -0
  531. /package/dist/{groovy-D8mTRCu6.js → groovy-dqjtZUVf.js} +0 -0
  532. /package/dist/{haskell-2_8cC4wY.js → haskell-DFzCCQzo.js} +0 -0
  533. /package/dist/{haxe-Bl9zkZlz.js → haxe-Da8Pj5RT.js} +0 -0
  534. /package/dist/{http-DKCqY6yS.js → http-1HACL_9s.js} +0 -0
  535. /package/dist/{idl-Dn-HNfGW.js → idl-D3NXs5iM.js} +0 -0
  536. /package/dist/{jinja2-JjFiAGKk.js → jinja2-gBHAxUdF.js} +0 -0
  537. /package/dist/{julia-R5wne8eu.js → julia-bG-6nJ-_.js} +0 -0
  538. /package/dist/{livescript-DSwokrYj.js → livescript-BlsRC8UJ.js} +0 -0
  539. /package/dist/{lua-CgXfrp2-.js → lua-BbDC0_5w.js} +0 -0
  540. /package/dist/{mathematica-BVli92MR.js → mathematica-YZTe3-PF.js} +0 -0
  541. /package/dist/{mbox-CMFlocdS.js → mbox-CY5idp08.js} +0 -0
  542. /package/dist/{mirc-BkW04Zpc.js → mirc-CbQuFZKk.js} +0 -0
  543. /package/dist/{mllike-DEjvHvNV.js → mllike-DsbHMX-5.js} +0 -0
  544. /package/dist/{modelica-CxDn-oje.js → modelica-CQuvsOQk.js} +0 -0
  545. /package/dist/{mscgen-D78wmE-w.js → mscgen-LIpBP9VR.js} +0 -0
  546. /package/dist/{mumps-Bi0IvPOV.js → mumps-Ct5NXoaG.js} +0 -0
  547. /package/dist/{nginx-DErPZFhX.js → nginx-Dvc62C8z.js} +0 -0
  548. /package/dist/{ntriples-Btyp6wRL.js → ntriples-jVkxWUuv.js} +0 -0
  549. /package/dist/{octave-CZA6-2F8.js → octave-jGOImUB0.js} +0 -0
  550. /package/dist/{oz-Bm6LSNfE.js → oz-Y0FKDMS2.js} +0 -0
  551. /package/dist/{pascal-B4J6a9BH.js → pascal-BaLtPWWB.js} +0 -0
  552. /package/dist/{perl-CzVqxS08.js → perl-CjfE0JLo.js} +0 -0
  553. /package/dist/{pig-Clh03cnn.js → pig-DE4epV99.js} +0 -0
  554. /package/dist/{properties-D7ch1Wyb.js → properties-CLyCG5C-.js} +0 -0
  555. /package/dist/{protobuf-DrkdrMPK.js → protobuf-BjBBs_V4.js} +0 -0
  556. /package/dist/{puppet-BtZG8zdO.js → puppet-ZImLuomA.js} +0 -0
  557. /package/dist/{python-B6FKOVIv.js → python-C9YN71pR.js} +0 -0
  558. /package/dist/{r-Dnvo5-96.js → r-DILmKWWW.js} +0 -0
  559. /package/dist/{rpm-B1DrgfnX.js → rpm-fpIsm1Kr.js} +0 -0
  560. /package/dist/{ruby-CelfUg17.js → ruby-BuiQI41h.js} +0 -0
  561. /package/dist/{sas-DfSQFMWG.js → sas-C76sJ1zF.js} +0 -0
  562. /package/dist/{scheme-BplhaWuO.js → scheme-DHjM-txv.js} +0 -0
  563. /package/dist/{shell-DqU5OS2c.js → shell--7NmGJ9p.js} +0 -0
  564. /package/dist/{sieve-BE4_IyGa.js → sieve-DaPvBv1M.js} +0 -0
  565. /package/dist/{smalltalk-B_WPL8Nx.js → smalltalk-KPvwrjCs.js} +0 -0
  566. /package/dist/{solr-DlJFg7H5.js → solr-PvZUtEDb.js} +0 -0
  567. /package/dist/{sparql-7XIlcOgW.js → sparql-CXSUIQer.js} +0 -0
  568. /package/dist/{spreadsheet-BdZSVwVp.js → spreadsheet-DPJdGPkx.js} +0 -0
  569. /package/dist/{sql-CCrq7lfJ.js → sql-Dp4ZLSIa.js} +0 -0
  570. /package/dist/{stex-BiFc8QAu.js → stex-CeXW4zzk.js} +0 -0
  571. /package/dist/{stylus-DlSH9xpH.js → stylus-BXcmrg9w.js} +0 -0
  572. /package/dist/{swift-e3tMTZgJ.js → swift-DD8I7hKP.js} +0 -0
  573. /package/dist/{tcl-DfZMC20G.js → tcl-B9Lp4GtA.js} +0 -0
  574. /package/dist/{textile-DaSeca5U.js → textile-qdiY0teq.js} +0 -0
  575. /package/dist/{tiddlywiki-dfoiz8pS.js → tiddlywiki-t32lkubq.js} +0 -0
  576. /package/dist/{tiki-yJbQzhma.js → tiki-B0qKrSMl.js} +0 -0
  577. /package/dist/{troff-FN_FrCXR.js → troff-105XJOEu.js} +0 -0
  578. /package/dist/{ttcn-7_i4HlyB.js → ttcn-1_BxDcM8.js} +0 -0
  579. /package/dist/{ttcn-cfg-B46AlBUV.js → ttcn-cfg-Cn_XgXiw.js} +0 -0
  580. /package/dist/{turtle-QQfeFveR.js → turtle-BI6LyfEu.js} +0 -0
  581. /package/dist/{vb-DToPVnLa.js → vb-BecoBfmr.js} +0 -0
  582. /package/dist/{vbscript-CtsNaTz4.js → vbscript-De-zpA4i.js} +0 -0
  583. /package/dist/{velocity-CAoNe6ns.js → velocity-DhlYJTrD.js} +0 -0
  584. /package/dist/{verilog-DrDOMiJq.js → verilog-BDZgxDOW.js} +0 -0
  585. /package/dist/{vhdl-DnO0OEPh.js → vhdl-CV0OKTbp.js} +0 -0
  586. /package/dist/{webidl-Or6d1ZfA.js → webidl-BOM1Fs0O.js} +0 -0
  587. /package/dist/{xquery-CEp_Mcpr.js → xquery-CltP_CGh.js} +0 -0
  588. /package/dist/{yacas-DgnYrSlp.js → yacas-Dch4E2Dg.js} +0 -0
  589. /package/dist/{z80-DlG_kyeB.js → z80-B5Yly27o.js} +0 -0
@@ -0,0 +1,125 @@
1
+ /* Copyright 2024 Marimo. All rights reserved. */
2
+
3
+ import { useAtomValue } from "jotai";
4
+ import { BotMessageSquareIcon, ClockIcon, SearchIcon } from "lucide-react";
5
+ import { useMemo, useState } from "react";
6
+ import { useLocale } from "react-aria";
7
+ import { Button } from "@/components/ui/button";
8
+ import { Input } from "@/components/ui/input";
9
+ import {
10
+ Popover,
11
+ PopoverContent,
12
+ PopoverTrigger,
13
+ } from "@/components/ui/popover";
14
+ import { ScrollArea } from "@/components/ui/scroll-area";
15
+ import { Tooltip } from "@/components/ui/tooltip";
16
+ import { type ChatId, chatStateAtom } from "@/core/ai/state";
17
+ import { cn } from "@/utils/cn";
18
+ import { timeAgo } from "@/utils/dates";
19
+ import { PanelEmptyState } from "../editor/chrome/panels/empty-state";
20
+ import { groupChatsByDate } from "./chat-history-utils";
21
+
22
+ interface ChatHistoryPopoverProps {
23
+ activeChatId: ChatId | undefined;
24
+ setActiveChat: (id: ChatId | null) => void;
25
+ }
26
+
27
+ export const ChatHistoryPopover: React.FC<ChatHistoryPopoverProps> = ({
28
+ activeChatId,
29
+ setActiveChat,
30
+ }) => {
31
+ const chatState = useAtomValue(chatStateAtom);
32
+ const { locale } = useLocale();
33
+ const [searchQuery, setSearchQuery] = useState("");
34
+
35
+ const chats = useMemo(() => {
36
+ return [...chatState.chats.values()].sort(
37
+ (a, b) => b.updatedAt - a.updatedAt,
38
+ );
39
+ }, [chatState.chats]);
40
+
41
+ const filteredChats = useMemo(() => {
42
+ if (!searchQuery.trim()) {
43
+ return chats;
44
+ }
45
+ return chats.filter((chat) =>
46
+ chat.title.toLowerCase().includes(searchQuery.toLowerCase()),
47
+ );
48
+ }, [chats, searchQuery]);
49
+
50
+ const groupedChats = useMemo(() => {
51
+ return groupChatsByDate(filteredChats);
52
+ }, [filteredChats]);
53
+
54
+ return (
55
+ <Popover>
56
+ <Tooltip content="Previous chats">
57
+ <PopoverTrigger asChild={true}>
58
+ <Button variant="text" size="icon">
59
+ <ClockIcon className="h-4 w-4" />
60
+ </Button>
61
+ </PopoverTrigger>
62
+ </Tooltip>
63
+ <PopoverContent className="w-[480px] p-0" align="start" side="right">
64
+ <div className="pt-3 px-3 w-full">
65
+ <Input
66
+ placeholder="Search chat history..."
67
+ value={searchQuery}
68
+ onChange={(e) => setSearchQuery(e.target.value)}
69
+ className="text-xs"
70
+ />
71
+ </div>
72
+ <ScrollArea className="h-[450px] p-2">
73
+ <div className="space-y-3">
74
+ {chats.length === 0 && (
75
+ <PanelEmptyState
76
+ title="No chats yet"
77
+ description="Start a new chat to get started"
78
+ icon={<BotMessageSquareIcon />}
79
+ />
80
+ )}
81
+ {filteredChats.length === 0 && searchQuery && chats.length > 0 && (
82
+ <PanelEmptyState
83
+ title="No chats found"
84
+ description={`No chats match "${searchQuery}"`}
85
+ icon={<SearchIcon />}
86
+ />
87
+ )}
88
+ {groupedChats.map((group, idx) => (
89
+ <div key={group.label} className="space-y-2">
90
+ <div className="text-xs px-1 text-muted-foreground/60">
91
+ {group.label}
92
+ </div>
93
+ <div>
94
+ {group.chats.map((chat) => (
95
+ <button
96
+ key={chat.id}
97
+ className={cn(
98
+ "w-full p-1 rounded-md cursor-pointer text-left flex items-center justify-between",
99
+ chat.id === activeChatId && "bg-accent",
100
+ chat.id !== activeChatId && "hover:bg-muted/20",
101
+ )}
102
+ onClick={() => {
103
+ setActiveChat(chat.id);
104
+ }}
105
+ type="button"
106
+ >
107
+ <div className="flex-1 min-w-0">
108
+ <div className="text-sm truncate">{chat.title}</div>
109
+ </div>
110
+ <div className="text-xs text-muted-foreground/60 ml-2 flex-shrink-0">
111
+ {timeAgo(chat.updatedAt, locale)}
112
+ </div>
113
+ </button>
114
+ ))}
115
+ </div>
116
+ {/* If last group, don't show a divider */}
117
+ {idx !== groupedChats.length - 1 && <hr />}
118
+ </div>
119
+ ))}
120
+ </div>
121
+ </ScrollArea>
122
+ </PopoverContent>
123
+ </Popover>
124
+ );
125
+ };
@@ -0,0 +1,69 @@
1
+ /* Copyright 2024 Marimo. All rights reserved. */
2
+
3
+ import type { Chat } from "@/core/ai/state";
4
+
5
+ const DATE_GROUP_CONFIG = [
6
+ { label: "Today", days: 0 },
7
+ { label: "Yesterday", days: 1 },
8
+ { label: "2d ago", days: 2 },
9
+ { label: "3d ago", days: 3 },
10
+ { label: "This week", days: 7 },
11
+ { label: "This month", days: 30 },
12
+ ] as const;
13
+
14
+ interface DateGroup {
15
+ label: string;
16
+ days: number;
17
+ chats: Chat[];
18
+ }
19
+
20
+ // Utility function to group chats by date periods
21
+ export const groupChatsByDate = (chats: Chat[]): DateGroup[] => {
22
+ const now = Date.now();
23
+ const oneDayMs = 24 * 60 * 60 * 1000;
24
+
25
+ // Initialize groups with empty chat arrays
26
+ const groups: DateGroup[] = DATE_GROUP_CONFIG.map((config) => ({
27
+ ...config,
28
+ chats: [],
29
+ }));
30
+
31
+ const olderGroup: DateGroup = {
32
+ label: "Older",
33
+ days: Infinity,
34
+ chats: [],
35
+ };
36
+
37
+ // Helper function to determine which group a chat belongs to
38
+ const getGroupForChat = (daysDiff: number): DateGroup => {
39
+ // Use switch for exact day matches, then handle ranges
40
+ switch (daysDiff) {
41
+ case 0:
42
+ return groups[0]; // Today
43
+ case 1:
44
+ return groups[1]; // Yesterday
45
+ case 2:
46
+ return groups[2]; // 2d ago
47
+ case 3:
48
+ return groups[3]; // 3d ago
49
+ default:
50
+ // Handle range-based grouping for older chats
51
+ if (daysDiff >= 4 && daysDiff <= 7) {
52
+ return groups[4]; // This week
53
+ } else if (daysDiff >= 8 && daysDiff <= 30) {
54
+ return groups[5]; // This month
55
+ }
56
+ // Everything else goes to Older
57
+ return olderGroup;
58
+ }
59
+ };
60
+
61
+ for (const chat of chats) {
62
+ const daysDiff = Math.floor((now - chat.updatedAt) / oneDayMs);
63
+ const targetGroup = getGroupForChat(daysDiff);
64
+ targetGroup.chats.push(chat);
65
+ }
66
+
67
+ // Return only non-empty groups
68
+ return [...groups, olderGroup].filter((group) => group.chats.length > 0);
69
+ };
@@ -9,7 +9,6 @@ import { useAtom, useAtomValue, useSetAtom } from "jotai";
9
9
  import {
10
10
  AtSignIcon,
11
11
  BotMessageSquareIcon,
12
- ClockIcon,
13
12
  Loader2,
14
13
  PaperclipIcon,
15
14
  PlusIcon,
@@ -17,16 +16,9 @@ import {
17
16
  SettingsIcon,
18
17
  SquareIcon,
19
18
  } from "lucide-react";
20
- import { memo, useEffect, useMemo, useRef, useState } from "react";
21
- import { useLocale } from "react-aria";
19
+ import { memo, useEffect, useRef, useState } from "react";
22
20
  import useEvent from "react-use-event-hook";
23
21
  import { Button } from "@/components/ui/button";
24
- import {
25
- Popover,
26
- PopoverContent,
27
- PopoverTrigger,
28
- } from "@/components/ui/popover";
29
- import { ScrollArea } from "@/components/ui/scroll-area";
30
22
  import {
31
23
  Select,
32
24
  SelectContent,
@@ -52,8 +44,8 @@ import { useRequestClient } from "@/core/network/requests";
52
44
  import { useRuntimeManager } from "@/core/runtime/config";
53
45
  import { ErrorBanner } from "@/plugins/impl/common/error-banner";
54
46
  import { cn } from "@/utils/cn";
55
- import { timeAgo } from "@/utils/dates";
56
47
  import { Logger } from "@/utils/Logger";
48
+
57
49
  import { AIModelDropdown } from "../ai/ai-model-dropdown";
58
50
  import { useOpenSettingsToTab } from "../app-config/state";
59
51
  import { PromptInput } from "../editor/ai/add-cell-with-ai";
@@ -63,10 +55,12 @@ import {
63
55
  } from "../editor/ai/completion-utils";
64
56
  import { PanelEmptyState } from "../editor/chrome/panels/empty-state";
65
57
  import { CopyClipboardIcon } from "../icons/copy-icon";
58
+ import { MCPStatusIndicator } from "../mcp/mcp-status-indicator";
66
59
  import { Input } from "../ui/input";
67
60
  import { Tooltip, TooltipProvider } from "../ui/tooltip";
68
61
  import { toast } from "../ui/use-toast";
69
62
  import { AttachmentRenderer, FileAttachmentPill } from "./chat-components";
63
+ import { ChatHistoryPopover } from "./chat-history-popover";
70
64
  import {
71
65
  buildCompletionRequestBody,
72
66
  convertToFileUIPart,
@@ -104,13 +98,6 @@ const ChatHeader: React.FC<ChatHeaderProps> = ({
104
98
  setActiveChat,
105
99
  }) => {
106
100
  const { handleClick } = useOpenSettingsToTab();
107
- const chatState = useAtomValue(chatStateAtom);
108
- const { locale } = useLocale();
109
- const chats = useMemo(() => {
110
- return [...chatState.chats.values()].sort(
111
- (a, b) => b.updatedAt - a.updatedAt,
112
- );
113
- }, [chatState.chats]);
114
101
 
115
102
  return (
116
103
  <div className="flex border-b px-2 py-1 justify-between shrink-0 items-center">
@@ -120,6 +107,7 @@ const ChatHeader: React.FC<ChatHeaderProps> = ({
120
107
  </Button>
121
108
  </Tooltip>
122
109
  <div className="flex items-center gap-2">
110
+ <MCPStatusIndicator />
123
111
  <Tooltip content="AI Settings">
124
112
  <Button
125
113
  variant="text"
@@ -130,46 +118,10 @@ const ChatHeader: React.FC<ChatHeaderProps> = ({
130
118
  <SettingsIcon className="h-4 w-4" />
131
119
  </Button>
132
120
  </Tooltip>
133
- <Popover>
134
- <Tooltip content="Previous chats">
135
- <PopoverTrigger asChild={true}>
136
- <Button variant="text" size="icon">
137
- <ClockIcon className="h-4 w-4" />
138
- </Button>
139
- </PopoverTrigger>
140
- </Tooltip>
141
- <PopoverContent className="w-[520px] p-0" align="start" side="right">
142
- <ScrollArea className="h-[500px] p-4">
143
- <div className="space-y-4">
144
- {chats.length === 0 && (
145
- <PanelEmptyState
146
- title="No chats yet"
147
- description="Start a new chat to get started"
148
- icon={<BotMessageSquareIcon />}
149
- />
150
- )}
151
- {chats.map((chat) => (
152
- <button
153
- key={chat.id}
154
- className={cn(
155
- "w-full p-3 rounded-md cursor-pointer hover:bg-accent text-left",
156
- chat.id === activeChatId && "bg-accent",
157
- )}
158
- onClick={() => {
159
- setActiveChat(chat.id);
160
- }}
161
- type="button"
162
- >
163
- <div className="font-medium">{chat.title}</div>
164
- <div className="text-sm text-muted-foreground">
165
- {timeAgo(chat.updatedAt, locale)}
166
- </div>
167
- </button>
168
- ))}
169
- </div>
170
- </ScrollArea>
171
- </PopoverContent>
172
- </Popover>
121
+ <ChatHistoryPopover
122
+ activeChatId={activeChatId}
123
+ setActiveChat={setActiveChat}
124
+ />
173
125
  </div>
174
126
  </div>
175
127
  );
@@ -127,7 +127,7 @@ export async function handleToolCall({
127
127
  addToolResult({
128
128
  tool: toolCall.toolName,
129
129
  toolCallId: toolCall.toolCallId,
130
- output: response,
130
+ output: response.result || response.error,
131
131
  });
132
132
  } else {
133
133
  // Invoke the backend/mcp tool
@@ -153,7 +153,7 @@ export async function handleToolCall({
153
153
 
154
154
  /**
155
155
  * Checks if we should send a message automatically based on the messages.
156
- * We only want to send a message if we have completed tool calls and there is no reply yet.
156
+ * We only want to send a message if all tool calls are completed and there is no reply yet.
157
157
  */
158
158
  export function hasPendingToolCalls(messages: UIMessage[]): boolean {
159
159
  if (messages.length === 0) {
@@ -177,7 +177,12 @@ export function hasPendingToolCalls(messages: UIMessage[]): boolean {
177
177
  part.type.startsWith("tool-"),
178
178
  ) as ToolUIPart[];
179
179
 
180
- const hasCompletedToolCalls = toolParts.some(
180
+ // Guard against no tool parts
181
+ if (toolParts.length === 0) {
182
+ return false;
183
+ }
184
+
185
+ const allToolCallsCompleted = toolParts.every(
181
186
  (part) => part.state === "output-available",
182
187
  );
183
188
 
@@ -186,6 +191,8 @@ export function hasPendingToolCalls(messages: UIMessage[]): boolean {
186
191
  const hasTextContent =
187
192
  lastPart.type === "text" && lastPart.text?.trim().length > 0;
188
193
 
194
+ Logger.warn("All tool calls completed: %s", allToolCallsCompleted);
195
+
189
196
  // Only auto-send if we have completed tool calls and there is no reply yet
190
- return hasCompletedToolCalls && !hasTextContent;
197
+ return allToolCallsCompleted && !hasTextContent;
191
198
  }
@@ -0,0 +1,117 @@
1
+ /* Copyright 2024 Marimo. All rights reserved. */
2
+
3
+ import type { SortingState } from "@tanstack/react-table";
4
+ import { describe, expect, it, vi } from "vitest";
5
+
6
+ describe("multi-column sorting logic", () => {
7
+ // Extract the core sorting logic to test in isolation
8
+ const handleSort = (
9
+ columnId: string,
10
+ desc: boolean,
11
+ sortingState: SortingState,
12
+ setSorting: (state: SortingState) => void,
13
+ clearSorting: () => void,
14
+ ) => {
15
+ const currentSort = sortingState.find((s) => s.id === columnId);
16
+
17
+ if (currentSort && currentSort.desc === desc) {
18
+ // Clicking the same sort again - remove it
19
+ clearSorting();
20
+ } else {
21
+ // New sort or different direction - move to end of stack
22
+ const otherSorts = sortingState.filter((s) => s.id !== columnId);
23
+ const newSort = { id: columnId, desc };
24
+ setSorting([...otherSorts, newSort]);
25
+ }
26
+ };
27
+
28
+ it("implements stack-based sorting: moves re-clicked column to end", () => {
29
+ const sortingState: SortingState = [
30
+ { id: "name", desc: false },
31
+ { id: "age", desc: false },
32
+ ];
33
+ const setSorting = vi.fn();
34
+ const clearSorting = vi.fn();
35
+
36
+ // Click Desc on age - should move age to end with desc=true
37
+ handleSort("age", true, sortingState, setSorting, clearSorting);
38
+
39
+ expect(setSorting).toHaveBeenCalledWith([
40
+ { id: "name", desc: false },
41
+ { id: "age", desc: true },
42
+ ]);
43
+ expect(clearSorting).not.toHaveBeenCalled();
44
+ });
45
+
46
+ it("removes sort when clicking same direction twice", () => {
47
+ const sortingState: SortingState = [{ id: "age", desc: false }];
48
+ const setSorting = vi.fn();
49
+ const clearSorting = vi.fn();
50
+
51
+ // Click Asc on age again - should remove the sort
52
+ handleSort("age", false, sortingState, setSorting, clearSorting);
53
+
54
+ expect(clearSorting).toHaveBeenCalled();
55
+ expect(setSorting).not.toHaveBeenCalled();
56
+ });
57
+
58
+ it("adds new column to end of stack", () => {
59
+ const sortingState: SortingState = [{ id: "name", desc: false }];
60
+ const setSorting = vi.fn();
61
+ const clearSorting = vi.fn();
62
+
63
+ // Click Asc on age - should add age to end
64
+ handleSort("age", false, sortingState, setSorting, clearSorting);
65
+
66
+ expect(setSorting).toHaveBeenCalledWith([
67
+ { id: "name", desc: false },
68
+ { id: "age", desc: false },
69
+ ]);
70
+ expect(clearSorting).not.toHaveBeenCalled();
71
+ });
72
+
73
+ it("toggles sort direction when clicking opposite", () => {
74
+ const sortingState: SortingState = [{ id: "age", desc: false }];
75
+ const setSorting = vi.fn();
76
+ const clearSorting = vi.fn();
77
+
78
+ // Click Desc on age - should toggle to descending
79
+ handleSort("age", true, sortingState, setSorting, clearSorting);
80
+
81
+ expect(setSorting).toHaveBeenCalledWith([{ id: "age", desc: true }]);
82
+ expect(clearSorting).not.toHaveBeenCalled();
83
+ });
84
+
85
+ it("correctly calculates priority numbers", () => {
86
+ const sortingState: SortingState = [
87
+ { id: "name", desc: false },
88
+ { id: "age", desc: true },
89
+ { id: "dept", desc: false },
90
+ ];
91
+
92
+ // Priority is index + 1
93
+ const nameSort = sortingState.find((s) => s.id === "name");
94
+ const namePriority = nameSort ? sortingState.indexOf(nameSort) + 1 : null;
95
+ expect(namePriority).toBe(1);
96
+
97
+ const deptSort = sortingState.find((s) => s.id === "dept");
98
+ const deptPriority = deptSort ? sortingState.indexOf(deptSort) + 1 : null;
99
+ expect(deptPriority).toBe(3);
100
+ });
101
+
102
+ it("handles removing column from middle of stack", () => {
103
+ const sortingState: SortingState = [
104
+ { id: "name", desc: false },
105
+ { id: "age", desc: true },
106
+ { id: "dept", desc: false },
107
+ ];
108
+ const setSorting = vi.fn();
109
+ const clearSorting = vi.fn();
110
+
111
+ // Click Desc on age again - should remove it
112
+ handleSort("age", true, sortingState, setSorting, clearSorting);
113
+
114
+ expect(clearSorting).toHaveBeenCalled();
115
+ // After removal, dept should move from priority 3 to priority 2
116
+ });
117
+ });
@@ -1,7 +1,7 @@
1
1
  /* Copyright 2024 Marimo. All rights reserved. */
2
2
  "use no memo";
3
3
 
4
- import type { Column } from "@tanstack/react-table";
4
+ import type { Column, Table } from "@tanstack/react-table";
5
5
  import { capitalize } from "lodash-es";
6
6
  import { FilterIcon, MinusIcon, TextIcon, XIcon } from "lucide-react";
7
7
  import { useMemo, useRef, useState } from "react";
@@ -68,6 +68,7 @@ interface DataTableColumnHeaderProps<TData, TValue>
68
68
  column: Column<TData, TValue>;
69
69
  header: React.ReactNode;
70
70
  calculateTopKRows?: CalculateTopKRows;
71
+ table?: Table<TData>;
71
72
  }
72
73
 
73
74
  export const DataTableColumnHeader = <TData, TValue>({
@@ -75,6 +76,7 @@ export const DataTableColumnHeader = <TData, TValue>({
75
76
  header,
76
77
  className,
77
78
  calculateTopKRows,
79
+ table,
78
80
  }: DataTableColumnHeaderProps<TData, TValue>) => {
79
81
  const [isFilterValueOpen, setIsFilterValueOpen] = useState(false);
80
82
  const { locale } = useLocale();
@@ -117,7 +119,7 @@ export const DataTableColumnHeader = <TData, TValue>({
117
119
  </DropdownMenuTrigger>
118
120
  <DropdownMenuContent align="start">
119
121
  {renderDataType(column)}
120
- {renderSorts(column)}
122
+ {renderSorts(column, table)}
121
123
  {renderCopyColumn(column)}
122
124
  {renderColumnPinning(column)}
123
125
  {renderColumnWrapping(column)}
@@ -165,7 +165,7 @@ export function generateColumns<T>({
165
165
  return row[key as keyof T];
166
166
  },
167
167
 
168
- header: ({ column }) => {
168
+ header: ({ column, table }) => {
169
169
  const stats = chartSpecModel?.getColumnStats(key);
170
170
  const dtype = column.columnDef.meta?.dtype;
171
171
  const headerTitle = headerTooltip?.[key];
@@ -208,6 +208,7 @@ export function generateColumns<T>({
208
208
  header={headerWithTooltip}
209
209
  column={column}
210
210
  calculateTopKRows={calculateTopKRows}
211
+ table={table}
211
212
  />
212
213
  );
213
214
 
@@ -215,8 +215,13 @@ const DataTableInternal = <TData,>({
215
215
  manualPagination: manualPagination,
216
216
  getPaginationRowModel: getPaginationRowModel(),
217
217
  // sorting
218
- ...(setSorting ? { onSortingChange: setSorting } : {}),
218
+ ...(setSorting
219
+ ? {
220
+ onSortingChange: setSorting,
221
+ }
222
+ : {}),
219
223
  manualSorting: manualSorting,
224
+ enableMultiSort: true,
220
225
  getSortedRowModel: getSortedRowModel(),
221
226
  // filtering
222
227
  manualFiltering: true,
@@ -302,7 +307,7 @@ const DataTableInternal = <TData,>({
302
307
  )}
303
308
  <Table className="relative" ref={tableRef}>
304
309
  {showLoadingBar && (
305
- <div className="absolute top-0 left-0 h-[3px] w-1/2 bg-primary animate-slide" />
310
+ <thead className="absolute top-0 left-0 h-[3px] w-1/2 bg-primary animate-slide" />
306
311
  )}
307
312
  {renderTableHeader(table, Boolean(maxHeight))}
308
313
  <CellSelectionProvider>
@@ -1,7 +1,7 @@
1
1
  /* Copyright 2024 Marimo. All rights reserved. */
2
2
 
3
3
  import { PinLeftIcon, PinRightIcon } from "@radix-ui/react-icons";
4
- import type { Column } from "@tanstack/react-table";
4
+ import type { Column, SortDirection, Table } from "@tanstack/react-table";
5
5
  import {
6
6
  AlignJustifyIcon,
7
7
  ArrowDownWideNarrowIcon,
@@ -163,27 +163,80 @@ export function renderCopyColumn<TData, TValue>(column: Column<TData, TValue>) {
163
163
  const AscIcon = ArrowUpNarrowWideIcon;
164
164
  const DescIcon = ArrowDownWideNarrowIcon;
165
165
 
166
- export function renderSorts<TData, TValue>(column: Column<TData, TValue>) {
166
+ export function renderSorts<TData, TValue>(
167
+ column: Column<TData, TValue>,
168
+ table?: Table<TData>,
169
+ ) {
167
170
  if (!column.getCanSort()) {
168
171
  return null;
169
172
  }
170
173
 
174
+ const sortDirection = column.getIsSorted();
175
+ const sortingIndex = column.getSortIndex();
176
+
177
+ const sortingState = table?.getState().sorting;
178
+ const hasMultiSort = sortingState?.length && sortingState.length > 1;
179
+
180
+ const renderSortIndex = () => {
181
+ return (
182
+ <span className="ml-auto text-xs font-medium">{sortingIndex + 1}</span>
183
+ );
184
+ };
185
+
186
+ const renderClearSort = () => {
187
+ if (!sortDirection) {
188
+ return null;
189
+ }
190
+
191
+ if (!hasMultiSort) {
192
+ // render clear sort for this column
193
+ return (
194
+ <DropdownMenuItem onClick={() => column.clearSorting()}>
195
+ <ChevronsUpDown className="mo-dropdown-icon" />
196
+ Clear sort
197
+ </DropdownMenuItem>
198
+ );
199
+ }
200
+
201
+ // render clear sort for all columns
202
+ return (
203
+ <DropdownMenuItem onClick={() => table?.resetSorting()}>
204
+ <ChevronsUpDown className="mo-dropdown-icon" />
205
+ Clear all sorts
206
+ </DropdownMenuItem>
207
+ );
208
+ };
209
+
210
+ const toggleSort = (direction: SortDirection) => {
211
+ // Clear sort if clicking the same direction
212
+ if (sortDirection === direction) {
213
+ column.clearSorting();
214
+ } else {
215
+ // Toggle sort direction
216
+ const descending = direction === "desc";
217
+ column.toggleSorting(descending, true);
218
+ }
219
+ };
220
+
171
221
  return (
172
222
  <>
173
- <DropdownMenuItem onClick={() => column.toggleSorting(false)}>
223
+ <DropdownMenuItem
224
+ onClick={() => toggleSort("asc")}
225
+ className={sortDirection === "asc" ? "bg-accent" : ""}
226
+ >
174
227
  <AscIcon className="mo-dropdown-icon" />
175
228
  Asc
229
+ {sortDirection === "asc" && renderSortIndex()}
176
230
  </DropdownMenuItem>
177
- <DropdownMenuItem onClick={() => column.toggleSorting(true)}>
231
+ <DropdownMenuItem
232
+ onClick={() => toggleSort("desc")}
233
+ className={sortDirection === "desc" ? "bg-accent" : ""}
234
+ >
178
235
  <DescIcon className="mo-dropdown-icon" />
179
236
  Desc
237
+ {sortDirection === "desc" && renderSortIndex()}
180
238
  </DropdownMenuItem>
181
- {column.getIsSorted() && (
182
- <DropdownMenuItem onClick={() => column.clearSorting()}>
183
- <ChevronsUpDown className="mo-dropdown-icon" />
184
- Clear sort
185
- </DropdownMenuItem>
186
- )}
239
+ {renderClearSort()}
187
240
  <DropdownMenuSeparator />
188
241
  </>
189
242
  );