@marimo-team/islands 0.19.7-dev2 → 0.19.7-dev21

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 (814) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CDKkNEXK.js → ConnectedDataExplorerComponent-BW-EEUju.js} +12 -12
  2. package/dist/_baseIsEqual-CBSjxu-D.js +225 -0
  3. package/dist/{_baseProperty-zelfx9VI.js → _baseProperty-BVGrW_NZ.js} +2 -2
  4. package/dist/{_baseUniq-BUGws47x.js → _baseUniq-4lqa8rDi.js} +7 -8
  5. package/dist/{any-language-editor-vYraVrwE.js → any-language-editor-jlqKouk6.js} +16 -16
  6. package/dist/apl-BuwKwesW.js +4 -0
  7. package/dist/{arc-DXxE-tFl.js → arc-CEWBr4jc.js} +2 -2
  8. package/dist/architecture-U656AL7Q-COfwZju8.js +6 -0
  9. package/dist/{architectureDiagram-VXUJARFQ-DRLesROp.js → architectureDiagram-VXUJARFQ--NkyBn9Y.js} +18 -19
  10. package/dist/asciiarmor-zAEd_wtn.js +4 -0
  11. package/dist/asn1-DWEA66J4.js +4 -0
  12. package/dist/{blockDiagram-VD42YOAC-ByzG0Vzp.js → blockDiagram-VD42YOAC-DEZZaTW0.js} +13 -14
  13. package/dist/brainfuck-mIPR6Ong.js +4 -0
  14. package/dist/{c4Diagram-YG6GDRKO-Trp4lx6i.js → c4Diagram-YG6GDRKO-Bj7hwWCO.js} +5 -5
  15. package/dist/{channel-CPUfhCMU.js → channel-B_QrFrGg.js} +1 -1
  16. package/dist/{chunk-4BX2VUAB-D-P4ZvWX.js → chunk-4BX2VUAB-DZQibjKA.js} +1 -1
  17. package/dist/{chunk-55IACEB6-DRnX6IuG.js → chunk-55IACEB6-C3BASkh4.js} +1 -1
  18. package/dist/{chunk-OGVTOU66-RMy3tlM6.js → chunk-5FQGJX7Z-D5VFKHmt.js} +5206 -4212
  19. package/dist/{chunk-76Q3JFCE-DaBPIBvG.js → chunk-76Q3JFCE-jPuajZH_.js} +1 -1
  20. package/dist/{chunk-ABZYJK2D-BZDGfEE1.js → chunk-ABZYJK2D-SZPYmRzN.js} +2 -2
  21. package/dist/{chunk-ATLVNIR6-j8AgRnSs.js → chunk-ATLVNIR6-BI_WwH1o.js} +2 -2
  22. package/dist/{chunk-B4BG7PRW-DU1moE9R.js → chunk-B4BG7PRW-BlI9Gm1l.js} +7 -7
  23. package/dist/{chunk-CVBHYZKI-CDc7Jfcj.js → chunk-CVBHYZKI-Dhc_e3rA.js} +1 -1
  24. package/dist/{chunk-DI55MBZ5-BIFn9unR.js → chunk-DI55MBZ5-BXxemMn5.js} +6 -6
  25. package/dist/{chunk-EXTU4WIE-CaHHLmza.js → chunk-EXTU4WIE-CzWtDV99.js} +2 -2
  26. package/dist/{chunk-FMBD7UC4-D8xABqXe.js → chunk-FMBD7UC4-geNUIndh.js} +1 -1
  27. package/dist/{chunk-FPAJGGOC-B7vtXnL8.js → chunk-FPAJGGOC-CduL34ft.js} +7 -7
  28. package/dist/{chunk-FWNWRKHM-CoKqaHV4.js → chunk-FWNWRKHM-C-2TI4gt.js} +1 -1
  29. package/dist/{chunk-HN2XXSSU-DilnBn0B.js → chunk-HN2XXSSU-CqPwpolw.js} +1 -1
  30. package/dist/chunk-JA3XYJ7Z-DQ-2ARfa.js +1838 -0
  31. package/dist/{chunk-JZLCHNYA-DyKV2dUA.js → chunk-JZLCHNYA-CVfjf2vv.js} +6 -6
  32. package/dist/{chunk-LBM3YZW2-CuRptnLo.js → chunk-LBM3YZW2-DWgQiioW.js} +1 -1
  33. package/dist/{chunk-LHMN2FUI-Z6kNjtl5.js → chunk-LHMN2FUI-Dj_AHSvI.js} +1 -1
  34. package/dist/{chunk-MI3HLSF2-uTxL-0zC.js → chunk-MI3HLSF2-DOJkNER1.js} +1 -1
  35. package/dist/{chunk-N4CR4FBY-C_3rxQPk.js → chunk-N4CR4FBY-BCZvQ7Jq.js} +7 -7
  36. package/dist/{chunk-O7ZBX7Z2-N-4UT8hG.js → chunk-O7ZBX7Z2-CRZ8i1rP.js} +1 -1
  37. package/dist/{chunk-QN33PNHL-BcBASegy.js → chunk-QN33PNHL-DY_2Q2zl.js} +2 -2
  38. package/dist/{chunk-QXUST7PY-DMlfsgyq.js → chunk-QXUST7PY-BMCjAVR_.js} +10 -10
  39. package/dist/{chunk-QZHKN3VN-gCo1BI4L.js → chunk-QZHKN3VN-BF_oGUlG.js} +1 -1
  40. package/dist/{chunk-S3R3BYOJ-BhcrQySJ.js → chunk-S3R3BYOJ-Ddu0H4Qa.js} +5 -5
  41. package/dist/{chunk-S6J4BHB3-CbT4tqbg.js → chunk-S6J4BHB3-DNVMr0_v.js} +1 -1
  42. package/dist/{chunk-T53DSG4Q-DjWTd72f.js → chunk-T53DSG4Q-BFWkpOX5.js} +1 -1
  43. package/dist/{chunk-TZMSLE5B-udBrmj8R.js → chunk-TZMSLE5B-C2wVlbMl.js} +3 -3
  44. package/dist/classDiagram-2ON5EDUG-D-g7zbyO.js +30 -0
  45. package/dist/classDiagram-v2-WZHVMYZB-C7v5zNRD.js +30 -0
  46. package/dist/{clike-CLJYUAWw.js → clike-B1zispTy.js} +1 -1
  47. package/dist/clojure-DkhhNHNQ.js +4 -0
  48. package/dist/{clone-BImB0Zxt.js → clone-Cc_6PW77.js} +1 -1
  49. package/dist/cmake-1obPvqtc.js +4 -0
  50. package/dist/cobol-oWNTiXPE.js +4 -0
  51. package/dist/code-block-37QAKDTI-eUgXqGNG.js +107 -0
  52. package/dist/coffeescript-LtYUvf6r.js +4 -0
  53. package/dist/commonlisp-C_06qBYF.js +4 -0
  54. package/dist/{cose-bilkent-S5V4N54A-kv0JiSTh.js → cose-bilkent-S5V4N54A-CO4ORQHF.js} +2 -2
  55. package/dist/crystal-CDJkbx14.js +4 -0
  56. package/dist/css-Bi_Nk0uN.js +4 -0
  57. package/dist/cypher-TrG0NvZ0.js +4 -0
  58. package/dist/d-CFKOrZsi.js +4 -0
  59. package/dist/{dagre-6UL2VRFP-HiV8Yeor.js → dagre-6UL2VRFP-DKIPL74O.js} +14 -15
  60. package/dist/{dagre-Baw82WQV.js → dagre-D2F8UdM6.js} +10 -11
  61. package/dist/{data-grid-overlay-editor-BuHxKF-R.js → data-grid-overlay-editor-COyFwFmE.js} +2 -2
  62. package/dist/{diagram-PSM6KHXK-jDduKZjc.js → diagram-PSM6KHXK-CVTrAZaP.js} +21 -21
  63. package/dist/{diagram-QEK2KX5R-CiQYmuQX.js → diagram-QEK2KX5R-BqHBzu3x.js} +16 -16
  64. package/dist/{diagram-S2PKOQOG-3sE_WnZi.js → diagram-S2PKOQOG-CJD6owcg.js} +16 -16
  65. package/dist/diff-CfnSF48q.js +4 -0
  66. package/dist/{dist-CMZuWSBe.js → dist--Em7gfgX.js} +2 -2
  67. package/dist/{dist-CDxsfpyX.js → dist--JwRU9u5.js} +1 -1
  68. package/dist/dist-2OSzSqy2.js +5 -0
  69. package/dist/dist-B1H2TQGB.js +8 -0
  70. package/dist/{dist-Bs1IvD_X.js → dist-B7NoEgR4.js} +1 -1
  71. package/dist/dist-BNvasp6N.js +5 -0
  72. package/dist/{dist-DRA2Iv4Q.js → dist-BcXuIt-h.js} +1 -1
  73. package/dist/{dist-D7wDmIuC.js → dist-BhBtK2sL.js} +1 -1
  74. package/dist/{dist-HA2BVGuM.js → dist-BlRm4v0e.js} +4 -4
  75. package/dist/{dist-DNVajE3L.js → dist-C6p7UKkB.js} +1 -1
  76. package/dist/{dist-BZXKWoES.js → dist-CBA36Nuy.js} +1 -1
  77. package/dist/{dist-DY8txPM6.js → dist-CFi_P6cs.js} +1 -1
  78. package/dist/dist-CG4LWTPv.js +8 -0
  79. package/dist/{dist-BtPD-BeW.js → dist-CHWVQZ6Z.js} +2 -2
  80. package/dist/{dist-C011r2tf.js → dist-CITQGRtG.js} +3 -3
  81. package/dist/{dist-CZq4mfrw.js → dist-COp5dkis.js} +2 -2
  82. package/dist/dist-C_8-swED.js +5 -0
  83. package/dist/{dist-DW3LjXSw.js → dist-C_Kw_Kc0.js} +1 -1
  84. package/dist/{dist-_FVOHtWJ.js → dist-Co5PD8Fb.js} +1 -1
  85. package/dist/{dist-J6fsaVBE.js → dist-DA1J6LvO.js} +1 -1
  86. package/dist/dist-DIhtur5b.js +5 -0
  87. package/dist/{dist-DI1Bo5Nv.js → dist-DKnxaCRl.js} +1 -1
  88. package/dist/dist-DoQ7RS4e.js +5 -0
  89. package/dist/dist-DsMd-F9h.js +5 -0
  90. package/dist/dist-DurmUshd.js +8 -0
  91. package/dist/{dist-Bv-wYGwr.js → dist-PZgrh2z6.js} +2 -2
  92. package/dist/{dist-BUwAd6_d.js → dist-b7Sc3Tj8.js} +1 -1
  93. package/dist/{dist-DWMcVk1V.js → dist-r6N_0WG-.js} +3 -3
  94. package/dist/{dist--kinAuV0.js → dist-wudNDAiO.js} +1 -1
  95. package/dist/dist-zVskjQcA.js +8 -0
  96. package/dist/{dockerfile-kP2dp4Jc.js → dockerfile-BBT_Ira6.js} +1 -1
  97. package/dist/dtd-Ctw8_JkU.js +4 -0
  98. package/dist/dylan-f7rMBKDP.js +4 -0
  99. package/dist/ecl-C2h3oBMY.js +4 -0
  100. package/dist/eiffel-Ce81wv20.js +4 -0
  101. package/dist/elm-BVV8QQcc.js +4 -0
  102. package/dist/{erDiagram-Q2GNP2WA-DaNawciA.js → erDiagram-Q2GNP2WA-CqOceSf9.js} +14 -15
  103. package/dist/erlang-DjB35ZUh.js +4 -0
  104. package/dist/{error-banner-BhqH4mGj.js → error-banner-uJ4xh94e.js} +1 -1
  105. package/dist/{esm-DOBJQbuy.js → esm-DNwkt4aO.js} +104 -104
  106. package/dist/factor-CIcp3U2B.js +4 -0
  107. package/dist/{factor-Png_OsVt.js → factor-DdqWbSyy.js} +1 -1
  108. package/dist/{flatten-CP4G1KkO.js → flatten-eGRGXrC3.js} +1 -1
  109. package/dist/{flowDiagram-NV44I4VS-Cn7CoW5b.js → flowDiagram-NV44I4VS-K7-DUifo.js} +16 -17
  110. package/dist/forth-CVgjsHhD.js +4 -0
  111. package/dist/fortran-CcTXj0d_.js +4 -0
  112. package/dist/{ganttDiagram-JELNMOA3-D2MZdMJt.js → ganttDiagram-JELNMOA3-BwUFY9Nu.js} +9 -9
  113. package/dist/gas-JWpamkLf.js +4 -0
  114. package/dist/gherkin-BveSCSJV.js +4 -0
  115. package/dist/{gitGraph-F6HP7TQM-DAY7Pizs.js → gitGraph-F6HP7TQM-CDM3aU-T.js} +3 -3
  116. package/dist/{gitGraphDiagram-NY62KEGX-CQ9ts7ZP.js → gitGraphDiagram-NY62KEGX-CjGRtLb1.js} +16 -16
  117. package/dist/{glide-data-editor-CF27qeAl.js → glide-data-editor-QbwryjAp.js} +8 -8
  118. package/dist/{graphlib-C_0PYYJy.js → graphlib-7UgfJadv.js} +5 -6
  119. package/dist/groovy-Np3AZt00.js +4 -0
  120. package/dist/haskell-CVfmFALm.js +4 -0
  121. package/dist/haxe-C10xkMLg.js +5 -0
  122. package/dist/idl-CKBSGnKC.js +4 -0
  123. package/dist/{info-NVLQJR56-CSiFVstv.js → info-NVLQJR56-CoL1x1Fy.js} +3 -3
  124. package/dist/{infoDiagram-WHAUD3N6-CVDTiMub.js → infoDiagram-WHAUD3N6-DNhmDn-6.js} +14 -14
  125. package/dist/{isEmpty-D2-li_vO.js → isEmpty-DQXRKNtW.js} +1 -1
  126. package/dist/javascript-Cur-15Bn.js +4 -0
  127. package/dist/{journeyDiagram-XKPGCS4Q-Dqs3P2CH.js → journeyDiagram-XKPGCS4Q-BOdK47P8.js} +6 -6
  128. package/dist/julia-BZZH2Gnx.js +4 -0
  129. package/dist/{kanban-definition-3W4ZIXB7-BEhej3Aa.js → kanban-definition-3W4ZIXB7-A0JC9d0g.js} +11 -12
  130. package/dist/{katex-DXbA2lyH.js → katex-DJyOeQ91.js} +1 -1
  131. package/dist/{label-B8Ngsa38.js → label-o68OaAQk.js} +2 -2
  132. package/dist/{line-C1k1rG3Z.js → line-LK_5q2B9.js} +3 -3
  133. package/dist/{linear-Dhu2Qlw4.js → linear-vWf1Qj0e.js} +4 -4
  134. package/dist/livescript-D_rTTm_U.js +4 -0
  135. package/dist/{loader-DH7xXi-E.js → loader-WBQoIunJ.js} +1 -1
  136. package/dist/lua-Mf_Of7eV.js +4 -0
  137. package/dist/main.js +18723 -18034
  138. package/dist/mathematica-DCYjugDb.js +4 -0
  139. package/dist/mbox-KBWrT8JD.js +4 -0
  140. package/dist/mermaid-4DMBBIKO-o3xNphpD.js +6 -0
  141. package/dist/{mermaid.core-BzRPXY_i.js → mermaid-CDdsQEyr.js} +186 -108
  142. package/dist/{mermaid-parser.core-BFf_lpn1.js → mermaid-parser.core-D20zFbMa.js} +8 -8
  143. package/dist/{mhchem-D3PZqzP1.js → mhchem-BqdXeZVX.js} +1 -1
  144. package/dist/{min-CzysEoAP.js → min-Bg4bqmiD.js} +1 -1
  145. package/dist/{mindmap-definition-VGOIOE7T-DH1E7psw.js → mindmap-definition-VGOIOE7T-CS6nKN_L.js} +13 -14
  146. package/dist/mirc-JwEQJ8Fb.js +4 -0
  147. package/dist/mllike-C7TxLvh6.js +6 -0
  148. package/dist/modelica-uvNgvUyw.js +4 -0
  149. package/dist/mscgen-CGnokp5x.js +6 -0
  150. package/dist/mumps-Dl9QdOZz.js +4 -0
  151. package/dist/nsis-BbDhbgPN.js +4 -0
  152. package/dist/{nsis-BrAITej_.js → nsis-CunMjZ_n.js} +1 -1
  153. package/dist/ntriples-ChL1mlp7.js +4 -0
  154. package/dist/{number-overlay-editor-DHeLnLyR.js → number-overlay-editor-Bz_bDJQb.js} +1 -1
  155. package/dist/octave-B9ZGG6zv.js +4 -0
  156. package/dist/{once-C-NkXwWJ.js → once-BqS42WgZ.js} +1 -1
  157. package/dist/{ordinal-CUS6_Aqv.js → ordinal-IlASfRja.js} +1 -1
  158. package/dist/oz-XHEu31wr.js +4 -0
  159. package/dist/{packet-BFZMPI3H-DZ3M7UG8.js → packet-BFZMPI3H-C6aZmgV-.js} +3 -3
  160. package/dist/pascal-BxtYw-iH.js +4 -0
  161. package/dist/perl-Br5BgHPb.js +4 -0
  162. package/dist/{pie-7BOR55EZ-BZ7IZsm8.js → pie-7BOR55EZ-NB6xYwcB.js} +3 -3
  163. package/dist/{pieDiagram-ADFJNKIX-Dc8_ZPVD.js → pieDiagram-ADFJNKIX-DSa60Grk.js} +21 -21
  164. package/dist/pig-BByO2hBz.js +4 -0
  165. package/dist/powershell-Cd4Zaef3.js +4 -0
  166. package/dist/{precisionRound-B0z4y-te.js → precisionRound-CGLoV26P.js} +1 -1
  167. package/dist/properties-B-BOCIOl.js +4 -0
  168. package/dist/protobuf-CaLimlho.js +4 -0
  169. package/dist/{pug-CH-17az-.js → pug-Dr-sA_9V.js} +1 -1
  170. package/dist/pug-bonARSG6.js +4 -0
  171. package/dist/puppet-BSlT-3sc.js +4 -0
  172. package/dist/python-BIJhGYYP.js +4 -0
  173. package/dist/q-D9TX8A0B.js +4 -0
  174. package/dist/{quadrantDiagram-AYHSOK5B-Bi2zuCYl.js → quadrantDiagram-AYHSOK5B-CFnMbP2J.js} +4 -4
  175. package/dist/r-BXelX7Rl.js +4 -0
  176. package/dist/{radar-NHE76QYJ-BwZi8I4_.js → radar-NHE76QYJ-RKhErikV.js} +3 -3
  177. package/dist/{range-iDYhZkRw.js → range-LoQMRQIX.js} +2 -2
  178. package/dist/{react-plotly-D-b1AEMh.js → react-plotly-jVjTu07w.js} +1 -1
  179. package/dist/{react-vega-z40f-dXy.js → react-vega-CjiPWyw0.js} +18 -18
  180. package/dist/react-vega-DgHpnZ04.js +9 -0
  181. package/dist/{reduce-1D4AnEer.js → reduce-B9mZDxPo.js} +3 -3
  182. package/dist/{requirementDiagram-UZGBJVZJ-Dx4_kui2.js → requirementDiagram-UZGBJVZJ-ytLQrFTk.js} +13 -14
  183. package/dist/rpm-BxAh9B1A.js +5 -0
  184. package/dist/ruby-BCZLQyhc.js +4 -0
  185. package/dist/{sankeyDiagram-TZEHDZUN-CKYnHkMA.js → sankeyDiagram-TZEHDZUN-KQqXDoky.js} +4 -4
  186. package/dist/sas-Bo7lsyNX.js +4 -0
  187. package/dist/scheme-Brhptkt-.js +4 -0
  188. package/dist/{sequenceDiagram-WL72ISMW-C-p-8Qdz.js → sequenceDiagram-WL72ISMW-ByLI04T5.js} +7 -7
  189. package/dist/shell-fWWb8_qx.js +4 -0
  190. package/dist/sieve-Ba8_hMLn.js +4 -0
  191. package/dist/{slides-component-BHWhzwDN.js → slides-component-BGEYjTca.js} +1 -1
  192. package/dist/smalltalk-7sHxwMDT.js +4 -0
  193. package/dist/sparql-BBFrPJ7z.js +4 -0
  194. package/dist/{spec-KNxDhBEX.js → spec-CuHgWmcK.js} +3 -3
  195. package/dist/{src-CHUphWwL.js → src-szye8OCw.js} +1 -1
  196. package/dist/{stateDiagram-FKZM4ZOC-otiu7nL4.js → stateDiagram-FKZM4ZOC-Dfz8vBbP.js} +18 -19
  197. package/dist/stateDiagram-v2-4FDKWEC3-DRYoLdT5.js +29 -0
  198. package/dist/{step-BbmiiQdf.js → step-1PmBKr2y.js} +1 -1
  199. package/dist/stex-ChDHQs3R.js +4 -0
  200. package/dist/style.css +1 -1
  201. package/dist/stylus-CIB0KT46.js +4 -0
  202. package/dist/swift-CZinekXz.js +4 -0
  203. package/dist/tcl-DCHZJVq_.js +4 -0
  204. package/dist/textile-ThTMxgkN.js +4 -0
  205. package/dist/{time-m5v-VC8K.js → time-DC4qQGmA.js} +4 -4
  206. package/dist/{timeline-definition-IT6M3QCI-DhR16s4q.js → timeline-definition-IT6M3QCI-CO48XU1B.js} +3 -3
  207. package/dist/toml-DK17wlJ7.js +4 -0
  208. package/dist/{treemap-KMMF4GRG-Bp2TNEsG.js → treemap-KMMF4GRG-B37ugcLd.js} +3 -3
  209. package/dist/troff-CuUAOgMy.js +4 -0
  210. package/dist/ttcn-DS2tj6rW.js +4 -0
  211. package/dist/ttcn-cfg-CdZGarnc.js +4 -0
  212. package/dist/turtle-Bkz-FLZ7.js +4 -0
  213. package/dist/{types-B9fL65ao.js → types-BIvEidLq.js} +4 -4
  214. package/dist/{useAsyncData-kqbhbSuf.js → useAsyncData-DFBEii2l.js} +2 -2
  215. package/dist/{useDeepCompareMemoize-B2QEm3jo.js → useDeepCompareMemoize-HKwezUBx.js} +3 -3
  216. package/dist/{useIframeCapabilities-BsIPDupA.js → useIframeCapabilities-wWXCXV88.js} +1 -1
  217. package/dist/{useTheme-CVr6Gb_R.js → useTheme-D0zT6HZe.js} +2 -2
  218. package/dist/vb-ITdOmxvR.js +4 -0
  219. package/dist/vbscript-B7oeGyfL.js +4 -0
  220. package/dist/{vega-component-DAeU1_cV.js → vega-component-2gqZksJH.js} +11 -11
  221. package/dist/{vega-loader.browser-nTy1NZD3.js → vega-loader.browser-BJ1uJidF.js} +3 -3
  222. package/dist/velocity-D__EkuSd.js +4 -0
  223. package/dist/verilog-CPH50gr9.js +4 -0
  224. package/dist/vhdl-CQAwKCk_.js +4 -0
  225. package/dist/webidl-BnEptfVX.js +4 -0
  226. package/dist/xquery-D7eTv-CR.js +4 -0
  227. package/dist/{xychartDiagram-PRI3JC2R-DxKtZBfd.js → xychartDiagram-PRI3JC2R-CUIfjNVD.js} +12 -13
  228. package/dist/yacas-0x1rX89s.js +4 -0
  229. package/dist/z80-B25SJVDf.js +4 -0
  230. package/package.json +8 -7
  231. package/src/components/ai/__tests__/ai-utils.test.ts +20 -20
  232. package/src/components/ai/ai-model-dropdown.tsx +8 -10
  233. package/src/components/ai/ai-utils.ts +11 -9
  234. package/src/components/app-config/__tests__/get-dirty-values.test.ts +47 -1
  235. package/src/components/app-config/ai-config.tsx +20 -54
  236. package/src/components/app-config/state.ts +11 -1
  237. package/src/components/app-config/user-config-form.tsx +73 -3
  238. package/src/components/chat/chat-panel.tsx +5 -1
  239. package/src/components/editor/chrome/panels/dependency-graph-panel.tsx +46 -10
  240. package/src/components/markdown/markdown-renderer.tsx +6 -1
  241. package/src/core/ai/context/providers/cell-output.ts +1 -1
  242. package/src/core/export/__tests__/hooks.test.ts +7 -1
  243. package/src/core/export/hooks.ts +1 -1
  244. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +11 -66
  245. package/src/plugins/impl/plotly/__tests__/usePlotlyLayout.test.ts +113 -0
  246. package/src/plugins/impl/plotly/usePlotlyLayout.ts +163 -0
  247. package/src/utils/__tests__/download.test.tsx +88 -16
  248. package/src/utils/__tests__/iframe.test.ts +139 -0
  249. package/src/utils/download.ts +40 -9
  250. package/src/utils/html-to-image.ts +41 -0
  251. package/src/utils/iframe.ts +142 -0
  252. package/dist/_baseIsEqual-BygTGUZ4.js +0 -198
  253. package/dist/_getTag-C91a-G2j.js +0 -31
  254. package/dist/abap-CKZVRcrP.js +0 -4
  255. package/dist/actionscript-3-CfEeiw8Q.js +0 -4
  256. package/dist/ada-Espzt5xk.js +0 -4
  257. package/dist/andromeeda-Bet9yHpN.js +0 -4
  258. package/dist/angular-html-D6gc6xRJ.js +0 -20
  259. package/dist/angular-html-DE-SuIpI.js +0 -4
  260. package/dist/angular-ts-BjFZRs0x.js +0 -18
  261. package/dist/apache-C-c0stKR.js +0 -4
  262. package/dist/apex-BiJpixJ-.js +0 -4
  263. package/dist/apl-BEQpOla5.js +0 -16
  264. package/dist/apl-lHFVoxx7.js +0 -4
  265. package/dist/applescript-BccZMr3e.js +0 -4
  266. package/dist/ara-DPVHfRJZ.js +0 -4
  267. package/dist/architecture-U656AL7Q-wavOWR6z.js +0 -6
  268. package/dist/asciiarmor-DqCdZUHI.js +0 -4
  269. package/dist/asciidoc-CCrtAKGW.js +0 -4
  270. package/dist/asm-C0GNzPhS.js +0 -4
  271. package/dist/asn1-DEcwtw-q.js +0 -4
  272. package/dist/astro-CxSXfOWT.js +0 -18
  273. package/dist/aurora-x-DBIPmgQb.js +0 -4
  274. package/dist/awk-7-EU_WjX.js +0 -4
  275. package/dist/ayu-dark-BB4DzJ08.js +0 -4
  276. package/dist/ballerina-5MpSVFjo.js +0 -4
  277. package/dist/bat-COtKSp2G.js +0 -4
  278. package/dist/beancount-BTyoFFVI.js +0 -4
  279. package/dist/berry-CNMCaTK_.js +0 -4
  280. package/dist/bibtex-Cti-V2Ia.js +0 -4
  281. package/dist/bicep-f38RkTGW.js +0 -4
  282. package/dist/blade-BKkPPgXV.js +0 -20
  283. package/dist/brainfuck-Bro9Oz5x.js +0 -4
  284. package/dist/bsl-CGq8JMnm.js +0 -5
  285. package/dist/c-BltHt-Ng.js +0 -4
  286. package/dist/c-C2t3MvE0.js +0 -4
  287. package/dist/cadence-m1eiVz08.js +0 -4
  288. package/dist/cairo-scf1ovh9.js +0 -5
  289. package/dist/catppuccin-frappe-C7063pB0.js +0 -4
  290. package/dist/catppuccin-latte-DMkr2vg8.js +0 -4
  291. package/dist/catppuccin-macchiato-BqE_ZXfu.js +0 -4
  292. package/dist/catppuccin-mocha-D7YJQma9.js +0 -4
  293. package/dist/chunk-JA3XYJ7Z-CzGXky2M.js +0 -470
  294. package/dist/clarity-B1pEsGP2.js +0 -4
  295. package/dist/classDiagram-2ON5EDUG-C2nDCJAo.js +0 -31
  296. package/dist/classDiagram-v2-WZHVMYZB-DORr9374.js +0 -31
  297. package/dist/clojure-B2uhdQPa.js +0 -4
  298. package/dist/clojure-BATFX9a2.js +0 -4
  299. package/dist/cmake-B9WXyQcc.js +0 -4
  300. package/dist/cmake-BRQW8t09.js +0 -4
  301. package/dist/cmake-jVu1cyUe.js +0 -4
  302. package/dist/cobol-CPD3EJfO.js +0 -4
  303. package/dist/cobol-D19g8SyZ.js +0 -10
  304. package/dist/code-block-QI2IAROF-CJ80GtCm.js +0 -8572
  305. package/dist/codeowners-DOHu4JsD.js +0 -4
  306. package/dist/codeql-Bv-kyldE.js +0 -4
  307. package/dist/coffee-BSWTbMgj.js +0 -5
  308. package/dist/coffeescript-KD9TnEnS.js +0 -4
  309. package/dist/common-lisp-DuUbiL1M.js +0 -4
  310. package/dist/commonlisp-DNEULz_Q.js +0 -4
  311. package/dist/coq-BLENpWYo.js +0 -4
  312. package/dist/cpp-BFMcsgZ1.js +0 -18
  313. package/dist/cpp-J7hKFkZz.js +0 -4
  314. package/dist/crystal-BoGe6xAc.js +0 -18
  315. package/dist/crystal-DVPNgAPQ.js +0 -4
  316. package/dist/csharp-Bi0R0O8M.js +0 -4
  317. package/dist/csharp-CEsbqhVz.js +0 -4
  318. package/dist/css-Dkaj1ML5.js +0 -4
  319. package/dist/css-fq3a1AH1.js +0 -4
  320. package/dist/css-tx1M2UYO.js +0 -4
  321. package/dist/csv-MeEBatsw.js +0 -4
  322. package/dist/cue-DBMXnBGO.js +0 -4
  323. package/dist/cypher-DiUnNCqR.js +0 -4
  324. package/dist/cypher-Dtzq0BP7.js +0 -4
  325. package/dist/d-CY8xRV-6.js +0 -4
  326. package/dist/d-DcZudIhJ.js +0 -4
  327. package/dist/dark-plus-Bx-XGUdv.js +0 -4
  328. package/dist/dart-DZ5DpAxj.js +0 -4
  329. package/dist/dax-Heo0fec8.js +0 -4
  330. package/dist/desktop-CIXrTzSI.js +0 -4
  331. package/dist/diff-CM1HFG4F.js +0 -4
  332. package/dist/diff-D9BPDC3o.js +0 -4
  333. package/dist/diff-FiILeNDL.js +0 -4
  334. package/dist/dist-8tG5l853.js +0 -5
  335. package/dist/dist-BXvOBlRl.js +0 -5
  336. package/dist/dist-BkSNcgv8.js +0 -5
  337. package/dist/dist-Bu4pyZoX.js +0 -8
  338. package/dist/dist-C1PN9EmN.js +0 -8
  339. package/dist/dist-C5R1jOyp.js +0 -8
  340. package/dist/dist-C7SYDWEd.js +0 -5
  341. package/dist/dist-CLZuU2Bs.js +0 -5
  342. package/dist/dist-Cjy_pAHy.js +0 -8
  343. package/dist/dist-jeJh-w1R.js +0 -5
  344. package/dist/docker-BpLHnOZG.js +0 -4
  345. package/dist/dotenv-B-FeoaI3.js +0 -4
  346. package/dist/dracula-soft-vgd7ckob.js +0 -4
  347. package/dist/dracula-yEIVSENH.js +0 -4
  348. package/dist/dream-maker-j9DfKXJZ.js +0 -4
  349. package/dist/dtd-FhG-tVom.js +0 -4
  350. package/dist/dylan-HWpZOBPw.js +0 -4
  351. package/dist/ecl-B_rcje1I.js +0 -4
  352. package/dist/edge-BvTSoBD4.js +0 -12
  353. package/dist/eiffel-oqHyHs6f.js +0 -4
  354. package/dist/elixir-Dy-Nd45s.js +0 -5
  355. package/dist/elm-B62RQEds.js +0 -4
  356. package/dist/elm-BbBZ4HBJ.js +0 -5
  357. package/dist/emacs-lisp-BlKF8SK8.js +0 -4
  358. package/dist/erb-DfDHVhmE.js +0 -10
  359. package/dist/erlang-CjRjjA-B.js +0 -4
  360. package/dist/erlang-DL9YWH5B.js +0 -5
  361. package/dist/everforest-dark-DTO3RYvZ.js +0 -4
  362. package/dist/everforest-light-BLftNDeA.js +0 -4
  363. package/dist/factor-CGH_TnIV.js +0 -4
  364. package/dist/fennel-CJpQobBl.js +0 -4
  365. package/dist/fish-Dvq3omMv.js +0 -4
  366. package/dist/fluent-_glkAdRk.js +0 -4
  367. package/dist/forth-5N06oHNp.js +0 -4
  368. package/dist/fortran-fixed-form-DvmVLEcO.js +0 -5
  369. package/dist/fortran-free-form-BRZ1-G2x.js +0 -4
  370. package/dist/fortran-free-form-C3kgUwfa.js +0 -4
  371. package/dist/fortran-wZ-sNg3h.js +0 -4
  372. package/dist/fsharp-B7-jsQMl.js +0 -5
  373. package/dist/gas-3H4_FaS8.js +0 -4
  374. package/dist/gdresource-7F-q_Vav.js +0 -10
  375. package/dist/gdscript-B0eENwgc.js +0 -4
  376. package/dist/gdscript-DAHEG9Ry.js +0 -4
  377. package/dist/gdshader-DPYtQQW0.js +0 -4
  378. package/dist/gdshader-o6WS_GvU.js +0 -4
  379. package/dist/genie-Bnhk4Ege.js +0 -4
  380. package/dist/gherkin-N8YTYIme.js +0 -4
  381. package/dist/gherkin-PEA2uy50.js +0 -4
  382. package/dist/git-commit-Cv7QTAeJ.js +0 -5
  383. package/dist/git-rebase-DwX3Nm0e.js +0 -5
  384. package/dist/github-dark-B0rIFWbz.js +0 -4
  385. package/dist/github-dark-default-nWsHqmZA.js +0 -4
  386. package/dist/github-dark-dimmed-CZ-OQfZw.js +0 -4
  387. package/dist/github-dark-high-contrast-C3y_w9do.js +0 -4
  388. package/dist/github-light-CNXzdGuc.js +0 -4
  389. package/dist/github-light-default-C332Nkmd.js +0 -4
  390. package/dist/github-light-high-contrast-5fIb4Zrv.js +0 -4
  391. package/dist/gleam-CXNzRrCZ.js +0 -4
  392. package/dist/glimmer-js-gufzGuES.js +0 -14
  393. package/dist/glimmer-ts-D4X2QK5Z.js +0 -14
  394. package/dist/glsl-CImM3sHk.js +0 -5
  395. package/dist/glsl-DEg5Ez62.js +0 -4
  396. package/dist/gnuplot-CBwhenUK.js +0 -4
  397. package/dist/go-5JnSf2Sn.js +0 -4
  398. package/dist/go-DY_IL4bk.js +0 -4
  399. package/dist/graphql-BaqLgJ_M.js +0 -4
  400. package/dist/graphql-DL2bM2N0.js +0 -14
  401. package/dist/groovy-DZzbvCP1.js +0 -4
  402. package/dist/groovy-bcQsAePx.js +0 -4
  403. package/dist/gruvbox-dark-hard-9eAHcVSP.js +0 -4
  404. package/dist/gruvbox-dark-medium-BcwJobmL.js +0 -4
  405. package/dist/gruvbox-dark-soft-DFhXDq1u.js +0 -4
  406. package/dist/gruvbox-light-hard-CGFqWfyc.js +0 -4
  407. package/dist/gruvbox-light-medium-hf-MZPsQ.js +0 -4
  408. package/dist/gruvbox-light-soft-CEDN8Nz_.js +0 -4
  409. package/dist/hack-B8wSahCf.js +0 -10
  410. package/dist/haml-Bu4NUveo.js +0 -10
  411. package/dist/haml-DIZmvqcW.js +0 -4
  412. package/dist/handlebars-COjOLWnq.js +0 -14
  413. package/dist/haskell-CExLTzho.js +0 -4
  414. package/dist/haskell-DCN6ynrk.js +0 -4
  415. package/dist/haxe-Cop3U-K-.js +0 -4
  416. package/dist/haxe-Dwfa4QhR.js +0 -4
  417. package/dist/haxe-f3pVb8qU.js +0 -5
  418. package/dist/hcl-Db_02Xo4.js +0 -4
  419. package/dist/hjson-ChDlI-VU.js +0 -4
  420. package/dist/hlsl-Cqu4CHBc.js +0 -4
  421. package/dist/hlsl-DEFh66jF.js +0 -4
  422. package/dist/houston-B8kM6xwu.js +0 -4
  423. package/dist/html-derivative-D0ctPnGn.js +0 -4
  424. package/dist/html-derivative-Dtt7T8QF.js +0 -5
  425. package/dist/html-hTZprlyJ.js +0 -10
  426. package/dist/html-lq9Ir_fH.js +0 -4
  427. package/dist/http-csf0B_nN.js +0 -14
  428. package/dist/hxml-BwN3yN1f.js +0 -5
  429. package/dist/hy-BWKVYLAU.js +0 -4
  430. package/dist/idl-BbWlJ0gk.js +0 -4
  431. package/dist/imba-BdgJpELv.js +0 -4
  432. package/dist/ini--03_cr_s.js +0 -4
  433. package/dist/java-DgtnNxg2.js +0 -4
  434. package/dist/java-DxqbIJE2.js +0 -4
  435. package/dist/javascript-BdS4qSDJ.js +0 -4
  436. package/dist/javascript-eMOhp6Aq.js +0 -4
  437. package/dist/javascript-mK9HLbGj.js +0 -4
  438. package/dist/jinja-CDb6qdQt.js +0 -5
  439. package/dist/jison-DyKFip1k.js +0 -5
  440. package/dist/json-DMbsiPEv.js +0 -4
  441. package/dist/json-DeQXWHxY.js +0 -4
  442. package/dist/json5-COCd-fTe.js +0 -4
  443. package/dist/jsonc-B_GrcWIn.js +0 -4
  444. package/dist/jsonl-CI61BqMn.js +0 -4
  445. package/dist/jsonnet-BuWuUqqD.js +0 -4
  446. package/dist/jssm-D7Rh9Uc6.js +0 -4
  447. package/dist/jsx-CI1WNtr2.js +0 -4
  448. package/dist/jsx-Do4BHov2.js +0 -4
  449. package/dist/julia-C6w3Rvqb.js +0 -4
  450. package/dist/julia-D5XWzItl.js +0 -16
  451. package/dist/kanagawa-dragon-hLxsgONk.js +0 -4
  452. package/dist/kanagawa-lotus-BHRbOuiK.js +0 -4
  453. package/dist/kanagawa-wave-CjDPcOcS.js +0 -4
  454. package/dist/kotlin-Do-Dqx9m.js +0 -4
  455. package/dist/kusto-BeQOeA5N.js +0 -4
  456. package/dist/laserwave-ohbp9Jiz.js +0 -4
  457. package/dist/latex-DqJGIiu_.js +0 -5
  458. package/dist/lean-Clg9aEzr.js +0 -4
  459. package/dist/less-C3d7xP2W.js +0 -4
  460. package/dist/less-UHqrKu57.js +0 -4
  461. package/dist/light-plus-CSE8StgD.js +0 -4
  462. package/dist/liquid-Dqcanmhn.js +0 -14
  463. package/dist/livescript-ChQl9lD-.js +0 -4
  464. package/dist/llvm-DWkTGdnM.js +0 -4
  465. package/dist/log-CErlyO_4.js +0 -4
  466. package/dist/logo-Yu9llBXK.js +0 -4
  467. package/dist/lua-BFsKLCaI.js +0 -5
  468. package/dist/lua-CiDvI96j.js +0 -4
  469. package/dist/lua-GfOSGOZ-.js +0 -4
  470. package/dist/luau-JH-VfaDk.js +0 -4
  471. package/dist/make-B4hx8tTG.js +0 -4
  472. package/dist/markdown-BWuRHX75.js +0 -4
  473. package/dist/markdown-D07chUcD.js +0 -4
  474. package/dist/marked.esm-BiQFxVJV.js +0 -1373
  475. package/dist/marko-Bxd2zSuF.js +0 -14
  476. package/dist/material-theme-Caotz7xa.js +0 -4
  477. package/dist/material-theme-darker-DA3xYhnK.js +0 -4
  478. package/dist/material-theme-lighter-Dt5GVhSw.js +0 -4
  479. package/dist/material-theme-ocean-Cn25Md08.js +0 -4
  480. package/dist/material-theme-palenight-BChdM80H.js +0 -4
  481. package/dist/mathematica-ClVO4k7N.js +0 -4
  482. package/dist/matlab-DhbmgJrG.js +0 -4
  483. package/dist/mbox-BEI7DeUg.js +0 -4
  484. package/dist/mdc-6jIdEm7u.js +0 -12
  485. package/dist/mdx-DrOosndL.js +0 -4
  486. package/dist/mermaid-B4Jv70w2.js +0 -4
  487. package/dist/mermaid-D7wtYc6C.js +0 -94
  488. package/dist/mermaid-NA5CF7SZ-BUMY4R2n.js +0 -8
  489. package/dist/mermaid.core-BfgNMETw.js +0 -19
  490. package/dist/min-dark-BtkGP5of.js +0 -4
  491. package/dist/min-light-DVB0pOsq.js +0 -4
  492. package/dist/mipsasm-CbiVgyrL.js +0 -4
  493. package/dist/mirc-DwidJ3iH.js +0 -4
  494. package/dist/mllike-Dspdy0xJ.js +0 -6
  495. package/dist/modelica-CIUejP-L.js +0 -4
  496. package/dist/mojo-oCJmcfe0.js +0 -4
  497. package/dist/monokai-sXaBCV8W.js +0 -4
  498. package/dist/move-uqw57ayE.js +0 -4
  499. package/dist/mscgen-BWXU4Omp.js +0 -6
  500. package/dist/mumps-PHFFoPk5.js +0 -4
  501. package/dist/narrat-D5L3ivBF.js +0 -4
  502. package/dist/nextflow-Dzk2_1yO.js +0 -4
  503. package/dist/nginx-BsYwbveJ.js +0 -5
  504. package/dist/night-owl-bwU2KJrI.js +0 -4
  505. package/dist/nim-B9PRs1V9.js +0 -20
  506. package/dist/nix-CQXQnSxk.js +0 -4
  507. package/dist/nord-BIb_ag00.js +0 -4
  508. package/dist/nsis-B7xooKLf.js +0 -4
  509. package/dist/ntriples-DnOgtCzG.js +0 -4
  510. package/dist/nushell-9HBKTMRY.js +0 -4
  511. package/dist/objective-c-BdQwOoOq.js +0 -4
  512. package/dist/objective-cpp-Dnlxu7P8.js +0 -4
  513. package/dist/ocaml-BPPNJmg4.js +0 -4
  514. package/dist/octave-Cn5kH_QT.js +0 -4
  515. package/dist/one-dark-pro-Cf2MYqoR.js +0 -4
  516. package/dist/one-light-D4J9mH5L.js +0 -4
  517. package/dist/oz-DR-sROpu.js +0 -4
  518. package/dist/pascal-CPKK1zcS.js +0 -4
  519. package/dist/pascal-DZawRZnt.js +0 -4
  520. package/dist/perl-D7FuFdyd.js +0 -4
  521. package/dist/perl-DcaL6DAN.js +0 -16
  522. package/dist/php-C3dNQJ69.js +0 -4
  523. package/dist/php-CQBUGN8t.js +0 -18
  524. package/dist/pig-CEXnOAnI.js +0 -4
  525. package/dist/plastic-Bxetw03u.js +0 -4
  526. package/dist/plsql-Cr9PKKdd.js +0 -4
  527. package/dist/po-Buj9_8uj.js +0 -4
  528. package/dist/poimandres-f5X1KNHY.js +0 -4
  529. package/dist/polar-DaxpU9SY.js +0 -4
  530. package/dist/postcss-D0yHN3os.js +0 -4
  531. package/dist/postcss-_e11hEYq.js +0 -4
  532. package/dist/powerquery-BBrNhg4L.js +0 -4
  533. package/dist/powershell-BKvWab7q.js +0 -4
  534. package/dist/powershell-xOwLOHr7.js +0 -4
  535. package/dist/prisma-B6USmJON.js +0 -4
  536. package/dist/prolog-_-xlpTu3.js +0 -4
  537. package/dist/properties-7jnK_vYx.js +0 -4
  538. package/dist/proto-Fsc93mrf.js +0 -4
  539. package/dist/protobuf-4rslMjEN.js +0 -4
  540. package/dist/pug-BVwdEv4r.js +0 -4
  541. package/dist/pug-DQxLbQkr.js +0 -12
  542. package/dist/puppet-ClkE3Bbh.js +0 -4
  543. package/dist/puppet-iSHg_1Z2.js +0 -4
  544. package/dist/purescript-DBXsSG64.js +0 -4
  545. package/dist/python-Be-hJfoQ.js +0 -4
  546. package/dist/python-D8Qe4P9O.js +0 -4
  547. package/dist/python-tK3wUCn0.js +0 -4
  548. package/dist/q-DP_Dcoox.js +0 -4
  549. package/dist/qml-axZuKIq7.js +0 -5
  550. package/dist/qmldir-U7eiStHf.js +0 -4
  551. package/dist/qss-C6xK3i2A.js +0 -4
  552. package/dist/r-B8xYZSka.js +0 -4
  553. package/dist/r-Bj_pNGwX.js +0 -4
  554. package/dist/r-C32wHLYu.js +0 -4
  555. package/dist/racket-Bplgy3qa.js +0 -4
  556. package/dist/raku-CXfaTnnI.js +0 -4
  557. package/dist/razor-BUotMkk4.js +0 -10
  558. package/dist/react-vega-TDd7xMuh.js +0 -9
  559. package/dist/red-B23zS7fW.js +0 -4
  560. package/dist/reg-BOAFDp6X.js +0 -4
  561. package/dist/regexp-BQX_RqKY.js +0 -4
  562. package/dist/regexp-CgVCPIqt.js +0 -4
  563. package/dist/rel-C94onwJb.js +0 -4
  564. package/dist/riscv-DRS1x6ty.js +0 -4
  565. package/dist/rose-pine-Y3EcMiNE.js +0 -4
  566. package/dist/rose-pine-dawn-CdolLHqO.js +0 -4
  567. package/dist/rose-pine-moon-C_zpj202.js +0 -4
  568. package/dist/rpm-BbDBUfs9.js +0 -5
  569. package/dist/rst-CcbqEUWW.js +0 -22
  570. package/dist/ruby-CFajY3gR.js +0 -30
  571. package/dist/ruby-COfWUiIr.js +0 -4
  572. package/dist/ruby-zIsg3mjP.js +0 -4
  573. package/dist/rust-DBsDzz6s.js +0 -4
  574. package/dist/sas-4hY7456Y.js +0 -5
  575. package/dist/sas-y_Hue2-X.js +0 -4
  576. package/dist/sass-Cp8wMMoM.js +0 -4
  577. package/dist/scala-DYheJtuA.js +0 -4
  578. package/dist/scheme-7jTCqHw8.js +0 -4
  579. package/dist/scheme-CGftW0fR.js +0 -4
  580. package/dist/scss-C847tmc7.js +0 -5
  581. package/dist/scss-COYAhSrh.js +0 -4
  582. package/dist/sdbl-BVPPkqm9.js +0 -4
  583. package/dist/sdbl-LKt9ej7G.js +0 -4
  584. package/dist/shaderlab-D4RJoI87.js +0 -5
  585. package/dist/shell-DAqJWXDk.js +0 -4
  586. package/dist/shellscript-Bt_mtfyS.js +0 -4
  587. package/dist/shellscript-DTwJmk-B.js +0 -4
  588. package/dist/shellsession-BXPPO6fw.js +0 -5
  589. package/dist/sieve-EaqnbCO3.js +0 -4
  590. package/dist/slack-dark-D98uHpYH.js +0 -4
  591. package/dist/slack-ochin-D2JGK2Dx.js +0 -4
  592. package/dist/smalltalk-CJQ4atCz.js +0 -4
  593. package/dist/smalltalk-DL03YKLJ.js +0 -4
  594. package/dist/snazzy-light-BhqH4Tt0.js +0 -4
  595. package/dist/solarized-dark-Cz8Hpdk8.js +0 -4
  596. package/dist/solarized-light-DSXO0VGL.js +0 -4
  597. package/dist/solidity-nZ_5BOHX.js +0 -4
  598. package/dist/soy-C8ioljmY.js +0 -5
  599. package/dist/sparql-DTA-tQ_q.js +0 -4
  600. package/dist/sparql-ntHLy-Z_.js +0 -5
  601. package/dist/splunk-BDj1WtBS.js +0 -4
  602. package/dist/sql-B_CzXDN7.js +0 -4
  603. package/dist/sql-hBa00soP.js +0 -4
  604. package/dist/ssh-config-VL2EBnHI.js +0 -4
  605. package/dist/stata-CAE5q-ng.js +0 -5
  606. package/dist/stateDiagram-v2-4FDKWEC3-B4itMUHi.js +0 -30
  607. package/dist/stex-KfRnSHzF.js +0 -4
  608. package/dist/stylus-BI8hQQzs.js +0 -4
  609. package/dist/stylus-CfjeFry_.js +0 -4
  610. package/dist/stylus-DIZq08hz.js +0 -4
  611. package/dist/svelte-GcilG7nn.js +0 -14
  612. package/dist/swift-CVCEbRPJ.js +0 -4
  613. package/dist/swift-Dl0RRDbH.js +0 -4
  614. package/dist/synthwave-84-Brwqp6Rc.js +0 -4
  615. package/dist/system-verilog-oFNqWct0.js +0 -4
  616. package/dist/systemd-Dk99d5qb.js +0 -4
  617. package/dist/talonscript-oS-JP1qz.js +0 -4
  618. package/dist/tasl-eNb7V7lL.js +0 -4
  619. package/dist/tcl-CQPp2bcg.js +0 -4
  620. package/dist/tcl-wv9O7fLZ.js +0 -4
  621. package/dist/templ-CBxszNIk.js +0 -12
  622. package/dist/terraform-CdD8ZgoG.js +0 -4
  623. package/dist/tex-BDBUrlZ_.js +0 -4
  624. package/dist/tex-Drp1pMRL.js +0 -5
  625. package/dist/textile-DzMRCBcV.js +0 -4
  626. package/dist/tokyo-night-CmOikx9i.js +0 -4
  627. package/dist/toml-CyIWqgbe.js +0 -4
  628. package/dist/toml-oDtxM9oL.js +0 -4
  629. package/dist/troff-_huin_CY.js +0 -4
  630. package/dist/ts-tags-CXewkOF3.js +0 -38
  631. package/dist/tsv-BseyLYQT.js +0 -4
  632. package/dist/tsx-D2LUWtsu.js +0 -4
  633. package/dist/tsx-kHCj4PrF.js +0 -4
  634. package/dist/ttcn-BEiJuYYc.js +0 -4
  635. package/dist/ttcn-cfg-DB6Ksh67.js +0 -4
  636. package/dist/turtle-CzEhuAap.js +0 -4
  637. package/dist/turtle-Dv3esCo-.js +0 -4
  638. package/dist/turtle-DzhzGEum.js +0 -4
  639. package/dist/twig-qB_T-k-S.js +0 -18
  640. package/dist/typescript-BN_vTPvq.js +0 -4
  641. package/dist/typescript-CI5sQpw1.js +0 -4
  642. package/dist/typespec-DHEcpagp.js +0 -4
  643. package/dist/typst-B9HpBJka.js +0 -4
  644. package/dist/v-H2_8AIAM.js +0 -4
  645. package/dist/vala-WHi-ThcB.js +0 -4
  646. package/dist/vb-CS8PoU3R.js +0 -4
  647. package/dist/vb-CngKZQHu.js +0 -4
  648. package/dist/vbscript-BV_8nbeM.js +0 -4
  649. package/dist/velocity-IqE7qYKE.js +0 -4
  650. package/dist/verilog-BGgTS1pK.js +0 -4
  651. package/dist/verilog-xtyaWTnc.js +0 -4
  652. package/dist/vesper-2sgFZerP.js +0 -4
  653. package/dist/vhdl-7aI3JU7f.js +0 -4
  654. package/dist/vhdl-BaqXCtf3.js +0 -4
  655. package/dist/viml-C3IDTTfq.js +0 -4
  656. package/dist/vitesse-black-BvCrVr8N.js +0 -4
  657. package/dist/vitesse-dark-DNi7aZj7.js +0 -4
  658. package/dist/vitesse-light-CXSVQ3oK.js +0 -4
  659. package/dist/vue-CHooyK57.js +0 -4
  660. package/dist/vue-ChlIPquu.js +0 -22
  661. package/dist/vue-html-DPVg93T0.js +0 -10
  662. package/dist/vue-vine-HiBtkWC6.js +0 -20
  663. package/dist/vyper-D18q9xCG.js +0 -4
  664. package/dist/wasm-CRlswj2T.js +0 -6
  665. package/dist/wasm-DZ1eFFdg.js +0 -4
  666. package/dist/webidl-BDB8PTTO.js +0 -4
  667. package/dist/wenyan-D3TBOs3h.js +0 -4
  668. package/dist/wgsl-BCsR2nKB.js +0 -4
  669. package/dist/wikitext-DIh6m2jB.js +0 -4
  670. package/dist/wit-Bz-r96TS.js +0 -4
  671. package/dist/wolfram-VIrnwGuX.js +0 -4
  672. package/dist/xml-CAP1bJV9.js +0 -4
  673. package/dist/xml-HKKjDs8r.js +0 -5
  674. package/dist/xquery-BIC-qj9Z.js +0 -4
  675. package/dist/xsl-HaaO21x0.js +0 -5
  676. package/dist/yacas-ifv5tftd.js +0 -4
  677. package/dist/yaml-BTiN8kgB.js +0 -4
  678. package/dist/yaml-B_O-W3eE.js +0 -4
  679. package/dist/z80-B8zOMVNt.js +0 -4
  680. package/dist/zenscript-BrGwAsAB.js +0 -4
  681. package/dist/zig-Chio8vL6.js +0 -4
  682. /package/dist/{ImageComparisonComponent-DXQrGLfG.js → ImageComparisonComponent-Bijp8beW.js} +0 -0
  683. /package/dist/{_arrayReduce-BoSa0zEn.js → _arrayReduce-DlK7U3Q6.js} +0 -0
  684. /package/dist/{_hasUnicode-zxc9hjSW.js → _hasUnicode-Bz2x6u6r.js} +0 -0
  685. /package/dist/{apl-DRxKiEot.js → apl-D9gTcP3Q.js} +0 -0
  686. /package/dist/{array-D-nrDupM.js → array-D7wW5QoO.js} +0 -0
  687. /package/dist/{asciiarmor-C8HoXFIm.js → asciiarmor-mLyg-Z5h.js} +0 -0
  688. /package/dist/{asn1-9Bo0DYT-.js → asn1-AE7eHomk.js} +0 -0
  689. /package/dist/{asterisk-eIhOKJFP.js → asterisk-Crp-Pien.js} +0 -0
  690. /package/dist/{brainfuck-Db8njC-p.js → brainfuck-Bdd6NcL6.js} +0 -0
  691. /package/dist/{chunk-XAJISQIX-DhEh08v5.js → chunk-XAJISQIX-CZ8Bi1-x.js} +0 -0
  692. /package/dist/{click-outside-container-D90VWx_r.js → click-outside-container-BCN5BtVO.js} +0 -0
  693. /package/dist/{clike-CFhUNtI5.js → clike-D_s3fKg5.js} +0 -0
  694. /package/dist/{clojure-CX7oovsp.js → clojure-zTYBCd80.js} +0 -0
  695. /package/dist/{cmake-C29AR2kk.js → cmake-BnJV90fC.js} +0 -0
  696. /package/dist/{cobol-CNkuRW9i.js → cobol-CH0OZO8A.js} +0 -0
  697. /package/dist/{coffeescript-BJAbfGam.js → coffeescript-CLhc1U6Q.js} +0 -0
  698. /package/dist/{colors-6nB_pSln.js → colors-6DRQ0kEF.js} +0 -0
  699. /package/dist/{common-keywords-DDkFNc6Q.js → common-keywords-NhoiR-2S.js} +0 -0
  700. /package/dist/{commonlisp-BTNhj2l9.js → commonlisp-8K2-IkUD.js} +0 -0
  701. /package/dist/{constants-DuN_eoAL.js → constants-DrOu5vvd.js} +0 -0
  702. /package/dist/{crystal-CZc0nIm9.js → crystal-8to4H-ep.js} +0 -0
  703. /package/dist/{css-L2-0OTXc.js → css-BVo-JOy5.js} +0 -0
  704. /package/dist/{cypher-Dnc6MXl0.js → cypher-BTFaDDd_.js} +0 -0
  705. /package/dist/{cytoscape.esm-Cs5lDB24.js → cytoscape.esm-CgJFiP_E.js} +0 -0
  706. /package/dist/{d-C6X9iIga.js → d-c9bddW2W.js} +0 -0
  707. /package/dist/{defaultLocale-DMZFeDB8.js → defaultLocale-Bxoo2-30.js} +0 -0
  708. /package/dist/{defaultLocale-DZtxSCkJ.js → defaultLocale-qS7DaAmi.js} +0 -0
  709. /package/dist/{diff-ZzKinYqY.js → diff-PA28xMKg.js} +0 -0
  710. /package/dist/{dist-wEzfBIGs.js → dist-9J8_3DZN.js} +0 -0
  711. /package/dist/{dist-GFp3A63i.js → dist-9trj4p6n.js} +0 -0
  712. /package/dist/{dist-DJTgoown.js → dist-BKGWAN8J.js} +0 -0
  713. /package/dist/{dist-XmKjmDjd.js → dist-BSMZYwqW.js} +0 -0
  714. /package/dist/{dist-BjWd_Ei9.js → dist-BYznkC5E.js} +0 -0
  715. /package/dist/{dist-CQ1gja1c.js → dist-BbQ-5HAA.js} +0 -0
  716. /package/dist/{dist-DsOyFflT.js → dist-CPd_adhw.js} +0 -0
  717. /package/dist/{dist-BWkp5r3D.js → dist-Cpj5BHNP.js} +0 -0
  718. /package/dist/{dist-BbaKVjkP.js → dist-CsN7lsea.js} +0 -0
  719. /package/dist/{dist-DMO79xnD.js → dist-DIVeCGlI.js} +0 -0
  720. /package/dist/{dist-Bhe0YLr5.js → dist-DsqQCNKw.js} +0 -0
  721. /package/dist/{dist-BOmxya4k.js → dist-MFzhAmKV.js} +0 -0
  722. /package/dist/{dist-DYUqP2g4.js → dist-l0KayR2-.js} +0 -0
  723. /package/dist/{dtd-CytEpkAo.js → dtd-DRlC7Bx8.js} +0 -0
  724. /package/dist/{duckdb-keywords-q-LipmQC.js → duckdb-keywords-BnNtuiVz.js} +0 -0
  725. /package/dist/{dylan-CZByFBEQ.js → dylan-d5ufc25E.js} +0 -0
  726. /package/dist/{ebnf-DuGDVaIM.js → ebnf-CFKHGc8c.js} +0 -0
  727. /package/dist/{ecl-Cp7L1F5B.js → ecl-Ci3afVKc.js} +0 -0
  728. /package/dist/{eiffel-C66yjnFL.js → eiffel-G6DmeEi3.js} +0 -0
  729. /package/dist/{elm-DtHo-73e.js → elm-ByYWHu8b.js} +0 -0
  730. /package/dist/{emotion-is-prop-valid.esm-_z-EwK5u.js → emotion-is-prop-valid.esm--WpIBtj8.js} +0 -0
  731. /package/dist/{erlang-C_sj44mF.js → erlang-C7_LcVDw.js} +0 -0
  732. /package/dist/{esm-JeWm05ae.js → esm-CAd2HmbR.js} +0 -0
  733. /package/dist/{fcl-DtWOm1i5.js → fcl-DPZwieM9.js} +0 -0
  734. /package/dist/{forth-CIDHh56T.js → forth-BgUerAyz.js} +0 -0
  735. /package/dist/{fortran-BQrDVXRU.js → fortran-BCXxm4xF.js} +0 -0
  736. /package/dist/{gas-D4HQPB0Q.js → gas-CKTQRKLl.js} +0 -0
  737. /package/dist/{gherkin-UB2gJHdT.js → gherkin-ByVP9cY_.js} +0 -0
  738. /package/dist/{groovy-DVz6jkOx.js → groovy-BPbrw0GZ.js} +0 -0
  739. /package/dist/{haskell-CpUdAPCz.js → haskell-B8fq1DW4.js} +0 -0
  740. /package/dist/{haxe-DCV5_cqD.js → haxe-B7SHQmJo.js} +0 -0
  741. /package/dist/{http-Q5Xt0h8Z.js → http-AQJFxSug.js} +0 -0
  742. /package/dist/{idl-D7WCIgHw.js → idl-CeJBDjsl.js} +0 -0
  743. /package/dist/{init-Ci8VD8ZH.js → init-BfRhston.js} +0 -0
  744. /package/dist/{invariant-BW72tHBT.js → invariant-D9QLJ4SZ.js} +0 -0
  745. /package/dist/{isString-B0JuKBai.js → isString-Clqvtgmo.js} +0 -0
  746. /package/dist/{javascript-B2Rn0Lmd.js → javascript-dCv9_Kn8.js} +0 -0
  747. /package/dist/{julia-ApprtEaw.js → julia-CD5lO88_.js} +0 -0
  748. /package/dist/{katex-BTobf3T8.js → katex-Dm9nZf6A.js} +0 -0
  749. /package/dist/{livescript-BMLIlM7C.js → livescript-Cc8RvFBv.js} +0 -0
  750. /package/dist/{lua-DdDaW3tC.js → lua-4nedfnvd.js} +0 -0
  751. /package/dist/{main-DC-71ZOX.js → main-DhFbkwoC.js} +0 -0
  752. /package/dist/{math-HUZifhTs.js → math-BbMyrONz.js} +0 -0
  753. /package/dist/{mathematica-PnNN7c2Z.js → mathematica-BIufdZr2.js} +0 -0
  754. /package/dist/{mbox-B84OtHBK.js → mbox-DQkYSHKe.js} +0 -0
  755. /package/dist/{memoize-BctRJDZ2.js → memoize-Bag7B41I.js} +0 -0
  756. /package/dist/{mirc-BVWXJxIq.js → mirc-CI-RWqUR.js} +0 -0
  757. /package/dist/{mllike-BawXWupH.js → mllike-DQzbf1xo.js} +0 -0
  758. /package/dist/{modelica-C8-X4Hf_.js → modelica-BnF_cDWj.js} +0 -0
  759. /package/dist/{mscgen-BOM6dDj8.js → mscgen-MirFrDhW.js} +0 -0
  760. /package/dist/{mumps-DQOY8n05.js → mumps-eNRTuWOD.js} +0 -0
  761. /package/dist/{nginx-Ynlf_cSR.js → nginx-hpek_Tnq.js} +0 -0
  762. /package/dist/{node-sql-parser-DW04P3RY.js → node-sql-parser-ChQUJk8A.js} +0 -0
  763. /package/dist/{ntriples-DU8VrXdW.js → ntriples-BLneip4i.js} +0 -0
  764. /package/dist/{octave-BzTIBsQ8.js → octave-C0eG-pKq.js} +0 -0
  765. /package/dist/{oz-DKFcZsoi.js → oz-BPMLow2T.js} +0 -0
  766. /package/dist/{pascal-DHBZ15pT.js → pascal-5eb9v5Dl.js} +0 -0
  767. /package/dist/{path-BVI7RNUv.js → path-C_x2ySFi.js} +0 -0
  768. /package/dist/{perl-75NMI3w0.js → perl-DOu6rCkF.js} +0 -0
  769. /package/dist/{pig-B-HY1fo_.js → pig-CRW0kne3.js} +0 -0
  770. /package/dist/{powershell-DEH22U53.js → powershell-CWgJhiiJ.js} +0 -0
  771. /package/dist/{prop-types-DTzjue2h.js → prop-types-C9QZf2SY.js} +0 -0
  772. /package/dist/{properties-B1MzBoJC.js → properties-CHxpmfXW.js} +0 -0
  773. /package/dist/{protobuf-Dr14KV0p.js → protobuf-DGUXb_-T.js} +0 -0
  774. /package/dist/{puppet-C4z38l7v.js → puppet-C7uSiW6_.js} +0 -0
  775. /package/dist/{python-D2L7Nknt.js → python-DAbhVcUr.js} +0 -0
  776. /package/dist/{q-PxipHfgS.js → q-DKjWHias.js} +0 -0
  777. /package/dist/{r-CEMMu_Tf.js → r-KD2KhyeL.js} +0 -0
  778. /package/dist/{range-Bieq5MNc.js → range-BYuZFTbA.js} +0 -0
  779. /package/dist/{rpm-D3xyahkR.js → rpm-GFtnpQ6M.js} +0 -0
  780. /package/dist/{ruby-DwEkwdiu.js → ruby-CBAewzLY.js} +0 -0
  781. /package/dist/{sas-L1W0BRft.js → sas-CCi_AaZi.js} +0 -0
  782. /package/dist/{scheme-CTybTrX0.js → scheme-CGGGD6kR.js} +0 -0
  783. /package/dist/{shell-BSx3LZnu.js → shell-b7vZ8ucI.js} +0 -0
  784. /package/dist/{sieve-BjUfbv-6.js → sieve-ClXOUV85.js} +0 -0
  785. /package/dist/{simple-mode-IPZGFbI6.js → simple-mode-Uad4lEG7.js} +0 -0
  786. /package/dist/{smalltalk-BlzuYrMv.js → smalltalk-_PFt9_gp.js} +0 -0
  787. /package/dist/{solr-B0fQ5Uwe.js → solr-BSTJW269.js} +0 -0
  788. /package/dist/{sparql-BXKjQ0cK.js → sparql-BCF6qcHt.js} +0 -0
  789. /package/dist/{spreadsheet-o1pnCmTO.js → spreadsheet-CiBky1_y.js} +0 -0
  790. /package/dist/{sql-C_tD2xcJ.js → sql-BXZovj-z.js} +0 -0
  791. /package/dist/{stex-BIsgBmK4.js → stex-DrxP7bb3.js} +0 -0
  792. /package/dist/{stylus-CqrLLVnG.js → stylus-DMFZWz-G.js} +0 -0
  793. /package/dist/{swift-DIqvj3_G.js → swift-De2YpSxT.js} +0 -0
  794. /package/dist/{tcl-B8bOIGVK.js → tcl-jV8Xs_1k.js} +0 -0
  795. /package/dist/{textile-DZsjavD_.js → textile-D_zo778l.js} +0 -0
  796. /package/dist/{tiddlywiki-IyzniiDM.js → tiddlywiki-DLTDKQCh.js} +0 -0
  797. /package/dist/{tiki-Dw2XZEnT.js → tiki-tw_kBvbp.js} +0 -0
  798. /package/dist/{timer-CPsmIOdm.js → timer-pEiW44EO.js} +0 -0
  799. /package/dist/{toml-Uc7m08nl.js → toml-_M0gsKn5.js} +0 -0
  800. /package/dist/{treemap-DMn4tIJ7.js → treemap-BzS5cW_6.js} +0 -0
  801. /package/dist/{troff-GEl5wcXR.js → troff-B06gyD33.js} +0 -0
  802. /package/dist/{ttcn-pr4FDOLT.js → ttcn-DoQoQNUM.js} +0 -0
  803. /package/dist/{ttcn-cfg-dZQ_fWTH.js → ttcn-cfg-l_6PksD2.js} +0 -0
  804. /package/dist/{turtle-TPRDOknA.js → turtle-zEnD4bpn.js} +0 -0
  805. /package/dist/{vb-BJUAeTYr.js → vb-fUsnAuzb.js} +0 -0
  806. /package/dist/{vbscript-CcJ6Z3ic.js → vbscript-CVlD7uZQ.js} +0 -0
  807. /package/dist/{velocity-pq4ZMzU3.js → velocity-CHkEIdMC.js} +0 -0
  808. /package/dist/{verilog-timMNjHt.js → verilog-B3ctZTB4.js} +0 -0
  809. /package/dist/{vhdl-DYFbVKNm.js → vhdl-rXdBgR5O.js} +0 -0
  810. /package/dist/{webidl-pue9oqnb.js → webidl-Cv9aQfcc.js} +0 -0
  811. /package/dist/{xquery-DeItGynK.js → xquery-Du0w47aa.js} +0 -0
  812. /package/dist/{yacas-By2Qrjba.js → yacas-Eq4p_g3L.js} +0 -0
  813. /package/dist/{z80-C7iLsyPC.js → z80-Dz4HTTRf.js} +0 -0
  814. /package/dist/{zod-LbXVxiL9.js → zod-DITCj31F.js} +0 -0
@@ -1,7 +1,8 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import { describe, expect, test } from "vitest";
4
- import { getDirtyValues } from "../user-config-form";
4
+ import type { UserConfig } from "@/core/config/config-schema";
5
+ import { applyManualInjections, getDirtyValues } from "../user-config-form";
5
6
 
6
7
  describe("getDirtyValues", () => {
7
8
  test("extracts only dirty fields", () => {
@@ -71,4 +72,49 @@ describe("getDirtyValues", () => {
71
72
  expect(result).toEqual({ display: { theme: "dark" } });
72
73
  expect(result).not.toHaveProperty("runtime");
73
74
  });
75
+
76
+ test("applyManualInjections injects touched ai model fields", () => {
77
+ const values = {
78
+ ai: {
79
+ models: {
80
+ displayed_models: ["openai/gpt-4"],
81
+ custom_models: ["openai/custom-model"],
82
+ },
83
+ },
84
+ } as UserConfig;
85
+ const dirtyValues: Partial<UserConfig> = {};
86
+ const touchedFields = {
87
+ ai: { models: { displayed_models: true } },
88
+ };
89
+
90
+ applyManualInjections({ values, dirtyValues, touchedFields });
91
+
92
+ expect(dirtyValues).toEqual({
93
+ ai: {
94
+ models: {
95
+ displayed_models: ["openai/gpt-4"],
96
+ custom_models: ["openai/custom-model"],
97
+ },
98
+ },
99
+ });
100
+ });
101
+
102
+ test("applyManualInjections skips when field not touched", () => {
103
+ const values = {
104
+ ai: {
105
+ models: {
106
+ displayed_models: ["openai/gpt-4"],
107
+ custom_models: ["openai/custom-model"],
108
+ },
109
+ },
110
+ } as UserConfig;
111
+ const dirtyValues: Partial<UserConfig> = {};
112
+ const touchedFields = {
113
+ ai: { models: { displayed_models: false } },
114
+ };
115
+
116
+ applyManualInjections({ values, dirtyValues, touchedFields });
117
+
118
+ expect(dirtyValues).toEqual({});
119
+ });
74
120
  });
@@ -1,10 +1,10 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
+ import { useAtom } from "jotai";
3
4
  import {
4
5
  BotIcon,
5
6
  BrainIcon,
6
7
  ChevronRightIcon,
7
- InfoIcon,
8
8
  PlusIcon,
9
9
  Trash2Icon,
10
10
  } from "lucide-react";
@@ -61,7 +61,6 @@ import {
61
61
  } from "../ui/accordion";
62
62
  import { Button } from "../ui/button";
63
63
  import { Checkbox } from "../ui/checkbox";
64
- import { DropdownMenuSeparator } from "../ui/dropdown-menu";
65
64
  import { Label } from "../ui/label";
66
65
  import { ExternalLink } from "../ui/links";
67
66
  import {
@@ -79,6 +78,7 @@ import { AWS_REGIONS } from "./constants";
79
78
  import { IncorrectModelId } from "./incorrect-model-id";
80
79
  import { IsOverridden } from "./is-overridden";
81
80
  import { MCPConfig } from "./mcp-config";
81
+ import { aiSettingsSubTabAtom } from "./state";
82
82
 
83
83
  interface AiConfigProps {
84
84
  form: UseFormReturn<UserConfig>;
@@ -234,9 +234,7 @@ interface ModelSelectorProps {
234
234
  config: UserConfig;
235
235
  name: FieldPath<UserConfig>;
236
236
  placeholder: string;
237
- testId: string;
238
237
  description?: React.ReactNode;
239
- disabled?: boolean;
240
238
  label: string;
241
239
  forRole: SupportedRole;
242
240
  onSubmit: (values: UserConfig) => void;
@@ -247,9 +245,7 @@ export const ModelSelector: React.FC<ModelSelectorProps> = ({
247
245
  config,
248
246
  name,
249
247
  placeholder,
250
- testId,
251
248
  description,
252
- disabled = false,
253
249
  label,
254
250
  forRole,
255
251
  onSubmit,
@@ -276,34 +272,6 @@ export const ModelSelector: React.FC<ModelSelectorProps> = ({
276
272
  placeholder={placeholder}
277
273
  onSelect={selectModel}
278
274
  triggerClassName="text-sm"
279
- customDropdownContent={
280
- <>
281
- <DropdownMenuSeparator />
282
- <p className="px-2 py-1.5 text-sm text-muted-secondary flex items-center gap-1">
283
- Enter a custom model
284
- <Tooltip content="Models should include the provider prefix, e.g. 'openai/gpt-4o'">
285
- <InfoIcon className="h-3 w-3" />
286
- </Tooltip>
287
- </p>
288
- <div className="px-2 py-1">
289
- <Input
290
- data-testid={testId}
291
- className="w-full border-border shadow-none focus-visible:shadow-xs"
292
- placeholder={placeholder}
293
- {...field}
294
- value={asStringOrEmpty(field.value)}
295
- disabled={disabled}
296
- onKeyDown={Events.stopPropagation()}
297
- />
298
- {value && (
299
- <IncorrectModelId
300
- value={value}
301
- includeSuggestion={false}
302
- />
303
- )}
304
- </div>
305
- </>
306
- }
307
275
  forRole={forRole}
308
276
  />
309
277
  </FormControl>
@@ -432,7 +400,6 @@ const renderCopilotProvider = ({
432
400
  config={config}
433
401
  name="ai.models.autocomplete_model"
434
402
  placeholder="ollama/qwen2.5-coder:1.5b"
435
- testId="custom-model-input"
436
403
  description="Model to use for code completion when using a custom provider."
437
404
  onSubmit={onSubmit}
438
405
  forRole="autocomplete"
@@ -1209,8 +1176,6 @@ export const AiAssistConfig: React.FC<AiConfigProps> = ({
1209
1176
  config,
1210
1177
  onSubmit,
1211
1178
  }) => {
1212
- const isWasmRuntime = isWasm();
1213
-
1214
1179
  return (
1215
1180
  <SettingGroup>
1216
1181
  <SettingSubtitle>AI Assistant</SettingSubtitle>
@@ -1244,8 +1209,6 @@ export const AiAssistConfig: React.FC<AiConfigProps> = ({
1244
1209
  config={config}
1245
1210
  name="ai.models.chat_model"
1246
1211
  placeholder={DEFAULT_AI_MODEL}
1247
- testId="ai-chat-model-input"
1248
- disabled={isWasmRuntime}
1249
1212
  description={
1250
1213
  <span>Model to use for chat conversations in the Chat panel.</span>
1251
1214
  }
@@ -1258,8 +1221,6 @@ export const AiAssistConfig: React.FC<AiConfigProps> = ({
1258
1221
  config={config}
1259
1222
  name="ai.models.edit_model"
1260
1223
  placeholder={DEFAULT_AI_MODEL}
1261
- testId="ai-edit-model-input"
1262
- disabled={isWasmRuntime}
1263
1224
  description={
1264
1225
  <span>
1265
1226
  Model to use for code editing with the{" "}
@@ -1270,18 +1231,6 @@ export const AiAssistConfig: React.FC<AiConfigProps> = ({
1270
1231
  onSubmit={onSubmit}
1271
1232
  />
1272
1233
 
1273
- <ul className="bg-muted p-2 rounded-md list-disc space-y-1 pl-6">
1274
- <li className="text-xs text-muted-secondary">
1275
- Models should include the provider name and model name separated by a
1276
- slash. For example, "anthropic/claude-3-5-sonnet-latest" or
1277
- "google/gemini-2.0-flash-exp"
1278
- </li>
1279
- <li className="text-xs text-muted-secondary">
1280
- Depending on the provider, we will use the respective API key and
1281
- additional configuration.
1282
- </li>
1283
- </ul>
1284
-
1285
1234
  <FormField
1286
1235
  control={form.control}
1287
1236
  name="ai.rules"
@@ -1434,6 +1383,7 @@ export const AiModelDisplayConfig: React.FC<AiConfigProps> = ({
1434
1383
 
1435
1384
  form.setValue("ai.models.displayed_models", newModels, {
1436
1385
  shouldDirty: true,
1386
+ shouldTouch: true,
1437
1387
  });
1438
1388
  onSubmit(form.getValues());
1439
1389
  });
@@ -1453,6 +1403,7 @@ export const AiModelDisplayConfig: React.FC<AiConfigProps> = ({
1453
1403
 
1454
1404
  form.setValue("ai.models.displayed_models", newModels, {
1455
1405
  shouldDirty: true,
1406
+ shouldTouch: true,
1456
1407
  });
1457
1408
  onSubmit(form.getValues());
1458
1409
  },
@@ -1466,9 +1417,11 @@ export const AiModelDisplayConfig: React.FC<AiConfigProps> = ({
1466
1417
  );
1467
1418
  form.setValue("ai.models.displayed_models", newDisplayedModels, {
1468
1419
  shouldDirty: true,
1420
+ shouldTouch: true,
1469
1421
  });
1470
1422
  form.setValue("ai.models.custom_models", newModels, {
1471
1423
  shouldDirty: true,
1424
+ shouldTouch: true,
1472
1425
  });
1473
1426
  onSubmit(form.getValues());
1474
1427
  });
@@ -1548,6 +1501,7 @@ export const AddModelForm: React.FC<{
1548
1501
 
1549
1502
  form.setValue("ai.models.custom_models", [newModel.id, ...customModels], {
1550
1503
  shouldDirty: true,
1504
+ shouldTouch: true,
1551
1505
  });
1552
1506
  onSubmit(form.getValues());
1553
1507
  resetForm();
@@ -1740,6 +1694,12 @@ const AddButton = ({
1740
1694
  );
1741
1695
  };
1742
1696
 
1697
+ export type AiSettingsSubTab =
1698
+ | "ai-features"
1699
+ | "ai-providers"
1700
+ | "ai-models"
1701
+ | "mcp";
1702
+
1743
1703
  export const AiConfig: React.FC<AiConfigProps> = ({
1744
1704
  form,
1745
1705
  config,
@@ -1747,8 +1707,14 @@ export const AiConfig: React.FC<AiConfigProps> = ({
1747
1707
  }) => {
1748
1708
  // MCP is not supported in WASM
1749
1709
  const wasm = isWasm();
1710
+ const [activeTab, setActiveTab] = useAtom(aiSettingsSubTabAtom);
1711
+
1750
1712
  return (
1751
- <Tabs defaultValue="ai-features" className="flex-1">
1713
+ <Tabs
1714
+ value={activeTab}
1715
+ onValueChange={(value) => setActiveTab(value as AiSettingsSubTab)}
1716
+ className="flex-1"
1717
+ >
1752
1718
  <TabsList className="mb-2">
1753
1719
  <TabsTrigger value="ai-features">AI Features</TabsTrigger>
1754
1720
  <TabsTrigger value="ai-providers">AI Providers</TabsTrigger>
@@ -1,17 +1,27 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
  import { atom, useSetAtom } from "jotai";
3
+ import type { AiSettingsSubTab } from "./ai-config";
3
4
  import {
4
5
  activeUserConfigCategoryAtom,
5
6
  type SettingCategoryId,
6
7
  } from "./user-config-form";
7
8
 
9
+ export const aiSettingsSubTabAtom = atom<AiSettingsSubTab>("ai-features");
10
+
8
11
  export const settingDialogAtom = atom<boolean>(false);
9
12
 
10
13
  export function useOpenSettingsToTab() {
11
14
  const setActiveCategory = useSetAtom(activeUserConfigCategoryAtom);
12
15
  const setSettingsDialog = useSetAtom(settingDialogAtom);
13
- const handleClick = (tab: SettingCategoryId) => {
16
+ const setAiSubTab = useSetAtom(aiSettingsSubTabAtom);
17
+
18
+ // Note: If more settings categories need sub-tabs or deep-linking is required,
19
+ // consider using a different strategy like query params
20
+ const handleClick = (tab: SettingCategoryId, subTab?: AiSettingsSubTab) => {
14
21
  setActiveCategory(tab);
22
+ if (tab === "ai") {
23
+ setAiSubTab(subTab ?? "ai-features");
24
+ }
15
25
  setSettingsDialog(true);
16
26
  };
17
27
  return { handleClick };
@@ -14,7 +14,7 @@ import {
14
14
  } from "lucide-react";
15
15
  import React, { useId, useRef } from "react";
16
16
  import { useLocale } from "react-aria";
17
- import type { FieldValues } from "react-hook-form";
17
+ import type { FieldPath, FieldValues } from "react-hook-form";
18
18
  import { useForm } from "react-hook-form";
19
19
  import type z from "zod";
20
20
  import { Button } from "@/components/ui/button";
@@ -95,6 +95,68 @@ export function getDirtyValues<T extends FieldValues>(
95
95
  return result;
96
96
  }
97
97
 
98
+ type ManualInjector = (
99
+ values: UserConfig,
100
+ dirtyValues: Partial<UserConfig>,
101
+ ) => void;
102
+
103
+ const modelsAiInjection = (
104
+ values: UserConfig,
105
+ dirtyValues: Partial<UserConfig>,
106
+ ) => {
107
+ dirtyValues.ai = {
108
+ ...dirtyValues.ai,
109
+ models: {
110
+ ...dirtyValues.ai?.models,
111
+ displayed_models: values.ai?.models?.displayed_models ?? [],
112
+ custom_models: values.ai?.models?.custom_models ?? [],
113
+ },
114
+ };
115
+ };
116
+
117
+ // Some fields (like AI model lists) have empty arrays as default values.
118
+ // If a user explicitly clears them, RHF won't mark them dirty, so we use
119
+ // touchedFields to force-include those values in the payload.
120
+ const MANUAL_INJECT_ENTRIES = [
121
+ ["ai.models.displayed_models", modelsAiInjection],
122
+ ["ai.models.custom_models", modelsAiInjection],
123
+ ] as const satisfies readonly (readonly [
124
+ FieldPath<UserConfig>,
125
+ ManualInjector,
126
+ ])[];
127
+
128
+ const MANUAL_INJECT_FIELDS = new Map(MANUAL_INJECT_ENTRIES);
129
+
130
+ const isTouchedPath = (
131
+ touched: unknown,
132
+ path: FieldPath<UserConfig>,
133
+ ): boolean => {
134
+ if (!touched) {
135
+ return false;
136
+ }
137
+ let current: unknown = touched;
138
+ for (const segment of path.split(".")) {
139
+ if (typeof current !== "object" || current === null) {
140
+ return false;
141
+ }
142
+ current = (current as Record<string, unknown>)[segment];
143
+ }
144
+ return current === true;
145
+ };
146
+
147
+ export const applyManualInjections = (opts: {
148
+ values: UserConfig;
149
+ dirtyValues: Partial<UserConfig>;
150
+ touchedFields: unknown;
151
+ }) => {
152
+ const { values, dirtyValues, touchedFields } = opts;
153
+ for (const [fieldPath, injector] of MANUAL_INJECT_FIELDS) {
154
+ if (isTouchedPath(touchedFields, fieldPath)) {
155
+ injector(values, dirtyValues);
156
+ }
157
+ }
158
+ };
159
+
98
160
  const categories = [
99
161
  {
100
162
  id: "editor",
@@ -181,7 +243,10 @@ export const UserConfigForm: React.FC = () => {
181
243
  defaultValues: config,
182
244
  });
183
245
 
184
- const setAiModels = (values: UserConfig, dirtyAiConfig: UserConfig["ai"]) => {
246
+ const setAiModels = (
247
+ values: UserConfig["ai"],
248
+ dirtyAiConfig: UserConfig["ai"],
249
+ ) => {
185
250
  const { chatModel, editModel } = autoPopulateModels(values);
186
251
  if (chatModel || editModel) {
187
252
  dirtyAiConfig = {
@@ -207,13 +272,18 @@ export const UserConfigForm: React.FC = () => {
207
272
  // Only send values that were actually changed to avoid
208
273
  // overwriting backend values the form doesn't manage
209
274
  const dirtyValues = getDirtyValues(values, form.formState.dirtyFields);
275
+ applyManualInjections({
276
+ values,
277
+ dirtyValues,
278
+ touchedFields: form.formState.touchedFields,
279
+ });
210
280
  if (Object.keys(dirtyValues).length === 0) {
211
281
  return; // Nothing changed
212
282
  }
213
283
 
214
284
  // Auto-populate AI models when credentials are set, makes it easier to get started
215
285
  if (dirtyValues.ai) {
216
- dirtyValues.ai = setAiModels(values, dirtyValues.ai);
286
+ dirtyValues.ai = setAiModels(values.ai, dirtyValues.ai);
217
287
  }
218
288
 
219
289
  await saveUserConfig({ config: dirtyValues }).then(() => {
@@ -435,7 +435,11 @@ const ChatPanel = () => {
435
435
  title="Chat with AI"
436
436
  description="No AI provider configured or model selected"
437
437
  action={
438
- <Button variant="outline" size="sm" onClick={() => handleClick("ai")}>
438
+ <Button
439
+ variant="outline"
440
+ size="sm"
441
+ onClick={() => handleClick("ai", "ai-providers")}
442
+ >
439
443
  Edit AI settings
440
444
  </Button>
441
445
  }
@@ -1,30 +1,66 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import type React from "react";
4
+ import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
4
5
  import { useCellDataAtoms, useCellIds } from "@/core/cells/cells";
5
6
  import { useVariables } from "@/core/variables/state";
6
7
  import { cn } from "@/utils/cn";
7
8
  import { DependencyGraph } from "../../../dependency-graph/dependency-graph";
8
9
  import { MinimapContent } from "../../../dependency-graph/minimap-content";
9
10
  import { useDependencyPanelTab } from "../wrapper/useDependencyPanelTab";
11
+ import { usePanelSection } from "./panel-context";
10
12
 
11
13
  const DependencyGraphPanel: React.FC = () => {
12
- const { dependencyPanelTab } = useDependencyPanelTab();
14
+ const { dependencyPanelTab, setDependencyPanelTab } = useDependencyPanelTab();
13
15
  const variables = useVariables();
14
16
  const cellIds = useCellIds();
15
17
  const [cells] = useCellDataAtoms();
18
+ const panelSection = usePanelSection();
19
+
20
+ // Show toggle inside panel when in developer panel (horizontal layout)
21
+ // since the sidebar has its own header with the toggle
22
+ const showInlineToggle = panelSection === "developer-panel";
16
23
 
17
24
  return (
18
- <div className={cn("w-full h-full flex-1 mx-auto -mb-4 relative")}>
19
- {dependencyPanelTab === "minimap" ? (
20
- <MinimapContent />
21
- ) : (
22
- <DependencyGraph
23
- cellAtoms={cells}
24
- variables={variables}
25
- cellIds={cellIds.inOrderIds}
26
- />
25
+ <div className={cn("w-full h-full flex-1 mx-auto -mb-4 flex flex-col")}>
26
+ {showInlineToggle && (
27
+ <div className="p-2 shrink-0">
28
+ <Tabs
29
+ value={dependencyPanelTab}
30
+ onValueChange={(value) => {
31
+ if (value === "minimap" || value === "graph") {
32
+ setDependencyPanelTab(value);
33
+ }
34
+ }}
35
+ >
36
+ <TabsList>
37
+ <TabsTrigger
38
+ value="minimap"
39
+ className="py-0.5 text-xs uppercase tracking-wide font-bold"
40
+ >
41
+ Minimap
42
+ </TabsTrigger>
43
+ <TabsTrigger
44
+ value="graph"
45
+ className="py-0.5 text-xs uppercase tracking-wide font-bold"
46
+ >
47
+ Graph
48
+ </TabsTrigger>
49
+ </TabsList>
50
+ </Tabs>
51
+ </div>
27
52
  )}
53
+ <div className="flex-1 min-h-0 relative">
54
+ {dependencyPanelTab === "minimap" ? (
55
+ <MinimapContent />
56
+ ) : (
57
+ <DependencyGraph
58
+ cellAtoms={cells}
59
+ variables={variables}
60
+ cellIds={cellIds.inOrderIds}
61
+ />
62
+ )}
63
+ </div>
28
64
  </div>
29
65
  );
30
66
  };
@@ -1,6 +1,7 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import { EditorView } from "@codemirror/view";
4
+ import { math } from "@streamdown/math";
4
5
  import { useAtomValue } from "jotai";
5
6
  import { BetweenHorizontalStartIcon } from "lucide-react";
6
7
  import { memo, Suspense, useState } from "react";
@@ -184,7 +185,11 @@ const COMPONENTS: Components = {
184
185
 
185
186
  export const MarkdownRenderer = memo(({ content }: { content: string }) => {
186
187
  return (
187
- <Streamdown components={COMPONENTS} className="mo-markdown-renderer">
188
+ <Streamdown
189
+ components={COMPONENTS}
190
+ plugins={{ math }}
191
+ className="mo-markdown-renderer"
192
+ >
188
193
  {content}
189
194
  </Streamdown>
190
195
  );
@@ -2,7 +2,6 @@
2
2
 
3
3
  import type { Completion } from "@codemirror/autocomplete";
4
4
  import type { FileUIPart } from "ai";
5
- import { toPng } from "html-to-image";
6
5
  import { processOutput } from "@/components/editor/output/console/process-output";
7
6
  import { type NotebookState, notebookAtom } from "@/core/cells/cells";
8
7
  import { type CellId, CellOutputId } from "@/core/cells/ids";
@@ -10,6 +9,7 @@ import { displayCellName } from "@/core/cells/names";
10
9
  import { isOutputEmpty } from "@/core/cells/outputs";
11
10
  import type { OutputMessage } from "@/core/kernel/messages";
12
11
  import type { JotaiStore } from "@/core/state/jotai";
12
+ import { toPng } from "@/utils/html-to-image";
13
13
  import { Logger } from "@/utils/Logger";
14
14
  import { type AIContextItem, AIContextProvider } from "../registry";
15
15
  import { contextToXml } from "../utils";
@@ -137,7 +137,13 @@ describe("useEnrichCellOutputs", () => {
137
137
  expect(document.getElementById).toHaveBeenCalledWith(
138
138
  CellOutputId.create(cellId),
139
139
  );
140
- expect(toPng).toHaveBeenCalledWith(mockElement);
140
+ expect(toPng).toHaveBeenCalledWith(
141
+ mockElement,
142
+ expect.objectContaining({
143
+ filter: expect.any(Function),
144
+ onImageErrorHandler: expect.any(Function),
145
+ }),
146
+ );
141
147
  expect(output).toEqual({
142
148
  [cellId]: ["image/png", mockDataUrl],
143
149
  });
@@ -132,7 +132,7 @@ export function useEnrichCellOutputs() {
132
132
  const results = await Promise.all(
133
133
  cellsToCaptureScreenshot.map(async ([cellId]) => {
134
134
  try {
135
- const dataUrl = await getImageDataUrlForCell(cellId);
135
+ const dataUrl = await getImageDataUrlForCell(cellId, false);
136
136
  if (!dataUrl) {
137
137
  Logger.error(`Failed to capture screenshot for cell ${cellId}`);
138
138
  return null;
@@ -7,15 +7,14 @@ import { Logger } from "@/utils/Logger";
7
7
 
8
8
  import "./plotly.css";
9
9
  import "./mapbox.css";
10
- import { usePrevious } from "@uidotdev/usehooks";
11
- import { isEqual, pick, set } from "lodash-es";
12
- import { type JSX, lazy, memo, useEffect, useMemo, useState } from "react";
10
+ import { pick, set } from "lodash-es";
11
+ import { type JSX, lazy, memo, useMemo } from "react";
13
12
  import useEvent from "react-use-event-hook";
14
13
  import { useDeepCompareMemoize } from "@/hooks/useDeepCompareMemoize";
15
14
  import { useScript } from "@/hooks/useScript";
16
15
  import { Arrays } from "@/utils/arrays";
17
- import { Objects } from "@/utils/objects";
18
16
  import { createParser, type PlotlyTemplateParser } from "./parse-from-template";
17
+ import { usePlotlyLayout } from "./usePlotlyLayout";
19
18
 
20
19
  interface Data {
21
20
  figure: Figure;
@@ -80,18 +79,6 @@ export const LazyPlot = lazy(() =>
80
79
  }),
81
80
  );
82
81
 
83
- function initialLayout(figure: Figure): Partial<Plotly.Layout> {
84
- // Enable autosize if width is not specified
85
- const shouldAutoSize = figure.layout.width === undefined;
86
- return {
87
- autosize: shouldAutoSize,
88
- dragmode: "select",
89
- height: 540,
90
- // Prioritize user's config
91
- ...figure.layout,
92
- };
93
- }
94
-
95
82
  const SUNBURST_DATA_KEYS: (keyof Plotly.SunburstPlotDatum)[] = [
96
83
  "color",
97
84
  "curveNumber",
@@ -111,38 +98,20 @@ const TREE_MAP_DATA_KEYS = SUNBURST_DATA_KEYS;
111
98
 
112
99
  export const PlotlyComponent = memo(
113
100
  ({ figure: originalFigure, value, setValue, config }: PlotlyPluginProps) => {
114
- const [figure, setFigure] = useState(() => {
115
- // We clone the figure since Plotly mutates the figure in place
116
- return structuredClone(originalFigure);
117
- });
118
-
119
101
  // Used for rendering LaTeX. TODO: Serve this library from Marimo
120
102
  const scriptStatus = useScript(
121
103
  "https://cdn.jsdelivr.net/npm/mathjax-full@3.2.2/es5/tex-mml-svg.min.js",
122
104
  );
123
105
  const isScriptLoaded = scriptStatus === "ready";
124
106
 
125
- useEffect(() => {
126
- const nextFigure = structuredClone(originalFigure);
127
- setFigure(nextFigure);
128
- setLayout((prev) => ({
129
- ...initialLayout(nextFigure),
130
- ...prev,
131
- }));
132
- }, [originalFigure, isScriptLoaded]);
133
-
134
- const [layout, setLayout] = useState<Partial<Plotly.Layout>>(() => {
135
- return {
136
- ...initialLayout(figure),
137
- // Override with persisted values (dragmode, xaxis, yaxis)
138
- ...value,
139
- };
107
+ const { figure, layout, handleReset } = usePlotlyLayout({
108
+ originalFigure,
109
+ initialValue: value,
110
+ isScriptLoaded,
140
111
  });
141
112
 
142
- const handleReset = useEvent(() => {
143
- const nextFigure = structuredClone(originalFigure);
144
- setFigure(nextFigure);
145
- setLayout(initialLayout(nextFigure));
113
+ const handleResetWithClear = useEvent(() => {
114
+ handleReset();
146
115
  setValue({});
147
116
  });
148
117
 
@@ -163,37 +132,13 @@ export const PlotlyComponent = memo(
163
132
  <path d="M3 3v5h5" />
164
133
  </svg>`,
165
134
  },
166
- click: handleReset,
135
+ click: handleResetWithClear,
167
136
  },
168
137
  ],
169
138
  // Prioritize user's config
170
139
  ...configMemo,
171
140
  };
172
- }, [handleReset, configMemo]);
173
-
174
- const prevFigure = usePrevious(figure) ?? figure;
175
-
176
- useEffect(() => {
177
- const omitKeys = new Set<keyof Plotly.Layout>([
178
- "autosize",
179
- "dragmode",
180
- "xaxis",
181
- "yaxis",
182
- ]);
183
-
184
- // If the key was updated externally (e.g. can be specifically passed in the config)
185
- // then we need to update the layout
186
- for (const key of omitKeys) {
187
- if (!isEqual(figure.layout[key], prevFigure.layout[key])) {
188
- omitKeys.delete(key);
189
- }
190
- }
191
-
192
- // Update layout when figure.layout changes
193
- // Omit keys that we don't want to override
194
- const layout = Objects.omit(figure.layout, omitKeys);
195
- setLayout((prev) => ({ ...prev, ...layout }));
196
- }, [figure.layout, prevFigure.layout]);
141
+ }, [handleResetWithClear, configMemo]);
197
142
 
198
143
  return (
199
144
  <LazyPlot