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

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 (812) 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/download.ts +26 -9
  249. package/src/utils/html-to-image.ts +41 -0
  250. package/dist/_baseIsEqual-BygTGUZ4.js +0 -198
  251. package/dist/_getTag-C91a-G2j.js +0 -31
  252. package/dist/abap-CKZVRcrP.js +0 -4
  253. package/dist/actionscript-3-CfEeiw8Q.js +0 -4
  254. package/dist/ada-Espzt5xk.js +0 -4
  255. package/dist/andromeeda-Bet9yHpN.js +0 -4
  256. package/dist/angular-html-D6gc6xRJ.js +0 -20
  257. package/dist/angular-html-DE-SuIpI.js +0 -4
  258. package/dist/angular-ts-BjFZRs0x.js +0 -18
  259. package/dist/apache-C-c0stKR.js +0 -4
  260. package/dist/apex-BiJpixJ-.js +0 -4
  261. package/dist/apl-BEQpOla5.js +0 -16
  262. package/dist/apl-lHFVoxx7.js +0 -4
  263. package/dist/applescript-BccZMr3e.js +0 -4
  264. package/dist/ara-DPVHfRJZ.js +0 -4
  265. package/dist/architecture-U656AL7Q-wavOWR6z.js +0 -6
  266. package/dist/asciiarmor-DqCdZUHI.js +0 -4
  267. package/dist/asciidoc-CCrtAKGW.js +0 -4
  268. package/dist/asm-C0GNzPhS.js +0 -4
  269. package/dist/asn1-DEcwtw-q.js +0 -4
  270. package/dist/astro-CxSXfOWT.js +0 -18
  271. package/dist/aurora-x-DBIPmgQb.js +0 -4
  272. package/dist/awk-7-EU_WjX.js +0 -4
  273. package/dist/ayu-dark-BB4DzJ08.js +0 -4
  274. package/dist/ballerina-5MpSVFjo.js +0 -4
  275. package/dist/bat-COtKSp2G.js +0 -4
  276. package/dist/beancount-BTyoFFVI.js +0 -4
  277. package/dist/berry-CNMCaTK_.js +0 -4
  278. package/dist/bibtex-Cti-V2Ia.js +0 -4
  279. package/dist/bicep-f38RkTGW.js +0 -4
  280. package/dist/blade-BKkPPgXV.js +0 -20
  281. package/dist/brainfuck-Bro9Oz5x.js +0 -4
  282. package/dist/bsl-CGq8JMnm.js +0 -5
  283. package/dist/c-BltHt-Ng.js +0 -4
  284. package/dist/c-C2t3MvE0.js +0 -4
  285. package/dist/cadence-m1eiVz08.js +0 -4
  286. package/dist/cairo-scf1ovh9.js +0 -5
  287. package/dist/catppuccin-frappe-C7063pB0.js +0 -4
  288. package/dist/catppuccin-latte-DMkr2vg8.js +0 -4
  289. package/dist/catppuccin-macchiato-BqE_ZXfu.js +0 -4
  290. package/dist/catppuccin-mocha-D7YJQma9.js +0 -4
  291. package/dist/chunk-JA3XYJ7Z-CzGXky2M.js +0 -470
  292. package/dist/clarity-B1pEsGP2.js +0 -4
  293. package/dist/classDiagram-2ON5EDUG-C2nDCJAo.js +0 -31
  294. package/dist/classDiagram-v2-WZHVMYZB-DORr9374.js +0 -31
  295. package/dist/clojure-B2uhdQPa.js +0 -4
  296. package/dist/clojure-BATFX9a2.js +0 -4
  297. package/dist/cmake-B9WXyQcc.js +0 -4
  298. package/dist/cmake-BRQW8t09.js +0 -4
  299. package/dist/cmake-jVu1cyUe.js +0 -4
  300. package/dist/cobol-CPD3EJfO.js +0 -4
  301. package/dist/cobol-D19g8SyZ.js +0 -10
  302. package/dist/code-block-QI2IAROF-CJ80GtCm.js +0 -8572
  303. package/dist/codeowners-DOHu4JsD.js +0 -4
  304. package/dist/codeql-Bv-kyldE.js +0 -4
  305. package/dist/coffee-BSWTbMgj.js +0 -5
  306. package/dist/coffeescript-KD9TnEnS.js +0 -4
  307. package/dist/common-lisp-DuUbiL1M.js +0 -4
  308. package/dist/commonlisp-DNEULz_Q.js +0 -4
  309. package/dist/coq-BLENpWYo.js +0 -4
  310. package/dist/cpp-BFMcsgZ1.js +0 -18
  311. package/dist/cpp-J7hKFkZz.js +0 -4
  312. package/dist/crystal-BoGe6xAc.js +0 -18
  313. package/dist/crystal-DVPNgAPQ.js +0 -4
  314. package/dist/csharp-Bi0R0O8M.js +0 -4
  315. package/dist/csharp-CEsbqhVz.js +0 -4
  316. package/dist/css-Dkaj1ML5.js +0 -4
  317. package/dist/css-fq3a1AH1.js +0 -4
  318. package/dist/css-tx1M2UYO.js +0 -4
  319. package/dist/csv-MeEBatsw.js +0 -4
  320. package/dist/cue-DBMXnBGO.js +0 -4
  321. package/dist/cypher-DiUnNCqR.js +0 -4
  322. package/dist/cypher-Dtzq0BP7.js +0 -4
  323. package/dist/d-CY8xRV-6.js +0 -4
  324. package/dist/d-DcZudIhJ.js +0 -4
  325. package/dist/dark-plus-Bx-XGUdv.js +0 -4
  326. package/dist/dart-DZ5DpAxj.js +0 -4
  327. package/dist/dax-Heo0fec8.js +0 -4
  328. package/dist/desktop-CIXrTzSI.js +0 -4
  329. package/dist/diff-CM1HFG4F.js +0 -4
  330. package/dist/diff-D9BPDC3o.js +0 -4
  331. package/dist/diff-FiILeNDL.js +0 -4
  332. package/dist/dist-8tG5l853.js +0 -5
  333. package/dist/dist-BXvOBlRl.js +0 -5
  334. package/dist/dist-BkSNcgv8.js +0 -5
  335. package/dist/dist-Bu4pyZoX.js +0 -8
  336. package/dist/dist-C1PN9EmN.js +0 -8
  337. package/dist/dist-C5R1jOyp.js +0 -8
  338. package/dist/dist-C7SYDWEd.js +0 -5
  339. package/dist/dist-CLZuU2Bs.js +0 -5
  340. package/dist/dist-Cjy_pAHy.js +0 -8
  341. package/dist/dist-jeJh-w1R.js +0 -5
  342. package/dist/docker-BpLHnOZG.js +0 -4
  343. package/dist/dotenv-B-FeoaI3.js +0 -4
  344. package/dist/dracula-soft-vgd7ckob.js +0 -4
  345. package/dist/dracula-yEIVSENH.js +0 -4
  346. package/dist/dream-maker-j9DfKXJZ.js +0 -4
  347. package/dist/dtd-FhG-tVom.js +0 -4
  348. package/dist/dylan-HWpZOBPw.js +0 -4
  349. package/dist/ecl-B_rcje1I.js +0 -4
  350. package/dist/edge-BvTSoBD4.js +0 -12
  351. package/dist/eiffel-oqHyHs6f.js +0 -4
  352. package/dist/elixir-Dy-Nd45s.js +0 -5
  353. package/dist/elm-B62RQEds.js +0 -4
  354. package/dist/elm-BbBZ4HBJ.js +0 -5
  355. package/dist/emacs-lisp-BlKF8SK8.js +0 -4
  356. package/dist/erb-DfDHVhmE.js +0 -10
  357. package/dist/erlang-CjRjjA-B.js +0 -4
  358. package/dist/erlang-DL9YWH5B.js +0 -5
  359. package/dist/everforest-dark-DTO3RYvZ.js +0 -4
  360. package/dist/everforest-light-BLftNDeA.js +0 -4
  361. package/dist/factor-CGH_TnIV.js +0 -4
  362. package/dist/fennel-CJpQobBl.js +0 -4
  363. package/dist/fish-Dvq3omMv.js +0 -4
  364. package/dist/fluent-_glkAdRk.js +0 -4
  365. package/dist/forth-5N06oHNp.js +0 -4
  366. package/dist/fortran-fixed-form-DvmVLEcO.js +0 -5
  367. package/dist/fortran-free-form-BRZ1-G2x.js +0 -4
  368. package/dist/fortran-free-form-C3kgUwfa.js +0 -4
  369. package/dist/fortran-wZ-sNg3h.js +0 -4
  370. package/dist/fsharp-B7-jsQMl.js +0 -5
  371. package/dist/gas-3H4_FaS8.js +0 -4
  372. package/dist/gdresource-7F-q_Vav.js +0 -10
  373. package/dist/gdscript-B0eENwgc.js +0 -4
  374. package/dist/gdscript-DAHEG9Ry.js +0 -4
  375. package/dist/gdshader-DPYtQQW0.js +0 -4
  376. package/dist/gdshader-o6WS_GvU.js +0 -4
  377. package/dist/genie-Bnhk4Ege.js +0 -4
  378. package/dist/gherkin-N8YTYIme.js +0 -4
  379. package/dist/gherkin-PEA2uy50.js +0 -4
  380. package/dist/git-commit-Cv7QTAeJ.js +0 -5
  381. package/dist/git-rebase-DwX3Nm0e.js +0 -5
  382. package/dist/github-dark-B0rIFWbz.js +0 -4
  383. package/dist/github-dark-default-nWsHqmZA.js +0 -4
  384. package/dist/github-dark-dimmed-CZ-OQfZw.js +0 -4
  385. package/dist/github-dark-high-contrast-C3y_w9do.js +0 -4
  386. package/dist/github-light-CNXzdGuc.js +0 -4
  387. package/dist/github-light-default-C332Nkmd.js +0 -4
  388. package/dist/github-light-high-contrast-5fIb4Zrv.js +0 -4
  389. package/dist/gleam-CXNzRrCZ.js +0 -4
  390. package/dist/glimmer-js-gufzGuES.js +0 -14
  391. package/dist/glimmer-ts-D4X2QK5Z.js +0 -14
  392. package/dist/glsl-CImM3sHk.js +0 -5
  393. package/dist/glsl-DEg5Ez62.js +0 -4
  394. package/dist/gnuplot-CBwhenUK.js +0 -4
  395. package/dist/go-5JnSf2Sn.js +0 -4
  396. package/dist/go-DY_IL4bk.js +0 -4
  397. package/dist/graphql-BaqLgJ_M.js +0 -4
  398. package/dist/graphql-DL2bM2N0.js +0 -14
  399. package/dist/groovy-DZzbvCP1.js +0 -4
  400. package/dist/groovy-bcQsAePx.js +0 -4
  401. package/dist/gruvbox-dark-hard-9eAHcVSP.js +0 -4
  402. package/dist/gruvbox-dark-medium-BcwJobmL.js +0 -4
  403. package/dist/gruvbox-dark-soft-DFhXDq1u.js +0 -4
  404. package/dist/gruvbox-light-hard-CGFqWfyc.js +0 -4
  405. package/dist/gruvbox-light-medium-hf-MZPsQ.js +0 -4
  406. package/dist/gruvbox-light-soft-CEDN8Nz_.js +0 -4
  407. package/dist/hack-B8wSahCf.js +0 -10
  408. package/dist/haml-Bu4NUveo.js +0 -10
  409. package/dist/haml-DIZmvqcW.js +0 -4
  410. package/dist/handlebars-COjOLWnq.js +0 -14
  411. package/dist/haskell-CExLTzho.js +0 -4
  412. package/dist/haskell-DCN6ynrk.js +0 -4
  413. package/dist/haxe-Cop3U-K-.js +0 -4
  414. package/dist/haxe-Dwfa4QhR.js +0 -4
  415. package/dist/haxe-f3pVb8qU.js +0 -5
  416. package/dist/hcl-Db_02Xo4.js +0 -4
  417. package/dist/hjson-ChDlI-VU.js +0 -4
  418. package/dist/hlsl-Cqu4CHBc.js +0 -4
  419. package/dist/hlsl-DEFh66jF.js +0 -4
  420. package/dist/houston-B8kM6xwu.js +0 -4
  421. package/dist/html-derivative-D0ctPnGn.js +0 -4
  422. package/dist/html-derivative-Dtt7T8QF.js +0 -5
  423. package/dist/html-hTZprlyJ.js +0 -10
  424. package/dist/html-lq9Ir_fH.js +0 -4
  425. package/dist/http-csf0B_nN.js +0 -14
  426. package/dist/hxml-BwN3yN1f.js +0 -5
  427. package/dist/hy-BWKVYLAU.js +0 -4
  428. package/dist/idl-BbWlJ0gk.js +0 -4
  429. package/dist/imba-BdgJpELv.js +0 -4
  430. package/dist/ini--03_cr_s.js +0 -4
  431. package/dist/java-DgtnNxg2.js +0 -4
  432. package/dist/java-DxqbIJE2.js +0 -4
  433. package/dist/javascript-BdS4qSDJ.js +0 -4
  434. package/dist/javascript-eMOhp6Aq.js +0 -4
  435. package/dist/javascript-mK9HLbGj.js +0 -4
  436. package/dist/jinja-CDb6qdQt.js +0 -5
  437. package/dist/jison-DyKFip1k.js +0 -5
  438. package/dist/json-DMbsiPEv.js +0 -4
  439. package/dist/json-DeQXWHxY.js +0 -4
  440. package/dist/json5-COCd-fTe.js +0 -4
  441. package/dist/jsonc-B_GrcWIn.js +0 -4
  442. package/dist/jsonl-CI61BqMn.js +0 -4
  443. package/dist/jsonnet-BuWuUqqD.js +0 -4
  444. package/dist/jssm-D7Rh9Uc6.js +0 -4
  445. package/dist/jsx-CI1WNtr2.js +0 -4
  446. package/dist/jsx-Do4BHov2.js +0 -4
  447. package/dist/julia-C6w3Rvqb.js +0 -4
  448. package/dist/julia-D5XWzItl.js +0 -16
  449. package/dist/kanagawa-dragon-hLxsgONk.js +0 -4
  450. package/dist/kanagawa-lotus-BHRbOuiK.js +0 -4
  451. package/dist/kanagawa-wave-CjDPcOcS.js +0 -4
  452. package/dist/kotlin-Do-Dqx9m.js +0 -4
  453. package/dist/kusto-BeQOeA5N.js +0 -4
  454. package/dist/laserwave-ohbp9Jiz.js +0 -4
  455. package/dist/latex-DqJGIiu_.js +0 -5
  456. package/dist/lean-Clg9aEzr.js +0 -4
  457. package/dist/less-C3d7xP2W.js +0 -4
  458. package/dist/less-UHqrKu57.js +0 -4
  459. package/dist/light-plus-CSE8StgD.js +0 -4
  460. package/dist/liquid-Dqcanmhn.js +0 -14
  461. package/dist/livescript-ChQl9lD-.js +0 -4
  462. package/dist/llvm-DWkTGdnM.js +0 -4
  463. package/dist/log-CErlyO_4.js +0 -4
  464. package/dist/logo-Yu9llBXK.js +0 -4
  465. package/dist/lua-BFsKLCaI.js +0 -5
  466. package/dist/lua-CiDvI96j.js +0 -4
  467. package/dist/lua-GfOSGOZ-.js +0 -4
  468. package/dist/luau-JH-VfaDk.js +0 -4
  469. package/dist/make-B4hx8tTG.js +0 -4
  470. package/dist/markdown-BWuRHX75.js +0 -4
  471. package/dist/markdown-D07chUcD.js +0 -4
  472. package/dist/marked.esm-BiQFxVJV.js +0 -1373
  473. package/dist/marko-Bxd2zSuF.js +0 -14
  474. package/dist/material-theme-Caotz7xa.js +0 -4
  475. package/dist/material-theme-darker-DA3xYhnK.js +0 -4
  476. package/dist/material-theme-lighter-Dt5GVhSw.js +0 -4
  477. package/dist/material-theme-ocean-Cn25Md08.js +0 -4
  478. package/dist/material-theme-palenight-BChdM80H.js +0 -4
  479. package/dist/mathematica-ClVO4k7N.js +0 -4
  480. package/dist/matlab-DhbmgJrG.js +0 -4
  481. package/dist/mbox-BEI7DeUg.js +0 -4
  482. package/dist/mdc-6jIdEm7u.js +0 -12
  483. package/dist/mdx-DrOosndL.js +0 -4
  484. package/dist/mermaid-B4Jv70w2.js +0 -4
  485. package/dist/mermaid-D7wtYc6C.js +0 -94
  486. package/dist/mermaid-NA5CF7SZ-BUMY4R2n.js +0 -8
  487. package/dist/mermaid.core-BfgNMETw.js +0 -19
  488. package/dist/min-dark-BtkGP5of.js +0 -4
  489. package/dist/min-light-DVB0pOsq.js +0 -4
  490. package/dist/mipsasm-CbiVgyrL.js +0 -4
  491. package/dist/mirc-DwidJ3iH.js +0 -4
  492. package/dist/mllike-Dspdy0xJ.js +0 -6
  493. package/dist/modelica-CIUejP-L.js +0 -4
  494. package/dist/mojo-oCJmcfe0.js +0 -4
  495. package/dist/monokai-sXaBCV8W.js +0 -4
  496. package/dist/move-uqw57ayE.js +0 -4
  497. package/dist/mscgen-BWXU4Omp.js +0 -6
  498. package/dist/mumps-PHFFoPk5.js +0 -4
  499. package/dist/narrat-D5L3ivBF.js +0 -4
  500. package/dist/nextflow-Dzk2_1yO.js +0 -4
  501. package/dist/nginx-BsYwbveJ.js +0 -5
  502. package/dist/night-owl-bwU2KJrI.js +0 -4
  503. package/dist/nim-B9PRs1V9.js +0 -20
  504. package/dist/nix-CQXQnSxk.js +0 -4
  505. package/dist/nord-BIb_ag00.js +0 -4
  506. package/dist/nsis-B7xooKLf.js +0 -4
  507. package/dist/ntriples-DnOgtCzG.js +0 -4
  508. package/dist/nushell-9HBKTMRY.js +0 -4
  509. package/dist/objective-c-BdQwOoOq.js +0 -4
  510. package/dist/objective-cpp-Dnlxu7P8.js +0 -4
  511. package/dist/ocaml-BPPNJmg4.js +0 -4
  512. package/dist/octave-Cn5kH_QT.js +0 -4
  513. package/dist/one-dark-pro-Cf2MYqoR.js +0 -4
  514. package/dist/one-light-D4J9mH5L.js +0 -4
  515. package/dist/oz-DR-sROpu.js +0 -4
  516. package/dist/pascal-CPKK1zcS.js +0 -4
  517. package/dist/pascal-DZawRZnt.js +0 -4
  518. package/dist/perl-D7FuFdyd.js +0 -4
  519. package/dist/perl-DcaL6DAN.js +0 -16
  520. package/dist/php-C3dNQJ69.js +0 -4
  521. package/dist/php-CQBUGN8t.js +0 -18
  522. package/dist/pig-CEXnOAnI.js +0 -4
  523. package/dist/plastic-Bxetw03u.js +0 -4
  524. package/dist/plsql-Cr9PKKdd.js +0 -4
  525. package/dist/po-Buj9_8uj.js +0 -4
  526. package/dist/poimandres-f5X1KNHY.js +0 -4
  527. package/dist/polar-DaxpU9SY.js +0 -4
  528. package/dist/postcss-D0yHN3os.js +0 -4
  529. package/dist/postcss-_e11hEYq.js +0 -4
  530. package/dist/powerquery-BBrNhg4L.js +0 -4
  531. package/dist/powershell-BKvWab7q.js +0 -4
  532. package/dist/powershell-xOwLOHr7.js +0 -4
  533. package/dist/prisma-B6USmJON.js +0 -4
  534. package/dist/prolog-_-xlpTu3.js +0 -4
  535. package/dist/properties-7jnK_vYx.js +0 -4
  536. package/dist/proto-Fsc93mrf.js +0 -4
  537. package/dist/protobuf-4rslMjEN.js +0 -4
  538. package/dist/pug-BVwdEv4r.js +0 -4
  539. package/dist/pug-DQxLbQkr.js +0 -12
  540. package/dist/puppet-ClkE3Bbh.js +0 -4
  541. package/dist/puppet-iSHg_1Z2.js +0 -4
  542. package/dist/purescript-DBXsSG64.js +0 -4
  543. package/dist/python-Be-hJfoQ.js +0 -4
  544. package/dist/python-D8Qe4P9O.js +0 -4
  545. package/dist/python-tK3wUCn0.js +0 -4
  546. package/dist/q-DP_Dcoox.js +0 -4
  547. package/dist/qml-axZuKIq7.js +0 -5
  548. package/dist/qmldir-U7eiStHf.js +0 -4
  549. package/dist/qss-C6xK3i2A.js +0 -4
  550. package/dist/r-B8xYZSka.js +0 -4
  551. package/dist/r-Bj_pNGwX.js +0 -4
  552. package/dist/r-C32wHLYu.js +0 -4
  553. package/dist/racket-Bplgy3qa.js +0 -4
  554. package/dist/raku-CXfaTnnI.js +0 -4
  555. package/dist/razor-BUotMkk4.js +0 -10
  556. package/dist/react-vega-TDd7xMuh.js +0 -9
  557. package/dist/red-B23zS7fW.js +0 -4
  558. package/dist/reg-BOAFDp6X.js +0 -4
  559. package/dist/regexp-BQX_RqKY.js +0 -4
  560. package/dist/regexp-CgVCPIqt.js +0 -4
  561. package/dist/rel-C94onwJb.js +0 -4
  562. package/dist/riscv-DRS1x6ty.js +0 -4
  563. package/dist/rose-pine-Y3EcMiNE.js +0 -4
  564. package/dist/rose-pine-dawn-CdolLHqO.js +0 -4
  565. package/dist/rose-pine-moon-C_zpj202.js +0 -4
  566. package/dist/rpm-BbDBUfs9.js +0 -5
  567. package/dist/rst-CcbqEUWW.js +0 -22
  568. package/dist/ruby-CFajY3gR.js +0 -30
  569. package/dist/ruby-COfWUiIr.js +0 -4
  570. package/dist/ruby-zIsg3mjP.js +0 -4
  571. package/dist/rust-DBsDzz6s.js +0 -4
  572. package/dist/sas-4hY7456Y.js +0 -5
  573. package/dist/sas-y_Hue2-X.js +0 -4
  574. package/dist/sass-Cp8wMMoM.js +0 -4
  575. package/dist/scala-DYheJtuA.js +0 -4
  576. package/dist/scheme-7jTCqHw8.js +0 -4
  577. package/dist/scheme-CGftW0fR.js +0 -4
  578. package/dist/scss-C847tmc7.js +0 -5
  579. package/dist/scss-COYAhSrh.js +0 -4
  580. package/dist/sdbl-BVPPkqm9.js +0 -4
  581. package/dist/sdbl-LKt9ej7G.js +0 -4
  582. package/dist/shaderlab-D4RJoI87.js +0 -5
  583. package/dist/shell-DAqJWXDk.js +0 -4
  584. package/dist/shellscript-Bt_mtfyS.js +0 -4
  585. package/dist/shellscript-DTwJmk-B.js +0 -4
  586. package/dist/shellsession-BXPPO6fw.js +0 -5
  587. package/dist/sieve-EaqnbCO3.js +0 -4
  588. package/dist/slack-dark-D98uHpYH.js +0 -4
  589. package/dist/slack-ochin-D2JGK2Dx.js +0 -4
  590. package/dist/smalltalk-CJQ4atCz.js +0 -4
  591. package/dist/smalltalk-DL03YKLJ.js +0 -4
  592. package/dist/snazzy-light-BhqH4Tt0.js +0 -4
  593. package/dist/solarized-dark-Cz8Hpdk8.js +0 -4
  594. package/dist/solarized-light-DSXO0VGL.js +0 -4
  595. package/dist/solidity-nZ_5BOHX.js +0 -4
  596. package/dist/soy-C8ioljmY.js +0 -5
  597. package/dist/sparql-DTA-tQ_q.js +0 -4
  598. package/dist/sparql-ntHLy-Z_.js +0 -5
  599. package/dist/splunk-BDj1WtBS.js +0 -4
  600. package/dist/sql-B_CzXDN7.js +0 -4
  601. package/dist/sql-hBa00soP.js +0 -4
  602. package/dist/ssh-config-VL2EBnHI.js +0 -4
  603. package/dist/stata-CAE5q-ng.js +0 -5
  604. package/dist/stateDiagram-v2-4FDKWEC3-B4itMUHi.js +0 -30
  605. package/dist/stex-KfRnSHzF.js +0 -4
  606. package/dist/stylus-BI8hQQzs.js +0 -4
  607. package/dist/stylus-CfjeFry_.js +0 -4
  608. package/dist/stylus-DIZq08hz.js +0 -4
  609. package/dist/svelte-GcilG7nn.js +0 -14
  610. package/dist/swift-CVCEbRPJ.js +0 -4
  611. package/dist/swift-Dl0RRDbH.js +0 -4
  612. package/dist/synthwave-84-Brwqp6Rc.js +0 -4
  613. package/dist/system-verilog-oFNqWct0.js +0 -4
  614. package/dist/systemd-Dk99d5qb.js +0 -4
  615. package/dist/talonscript-oS-JP1qz.js +0 -4
  616. package/dist/tasl-eNb7V7lL.js +0 -4
  617. package/dist/tcl-CQPp2bcg.js +0 -4
  618. package/dist/tcl-wv9O7fLZ.js +0 -4
  619. package/dist/templ-CBxszNIk.js +0 -12
  620. package/dist/terraform-CdD8ZgoG.js +0 -4
  621. package/dist/tex-BDBUrlZ_.js +0 -4
  622. package/dist/tex-Drp1pMRL.js +0 -5
  623. package/dist/textile-DzMRCBcV.js +0 -4
  624. package/dist/tokyo-night-CmOikx9i.js +0 -4
  625. package/dist/toml-CyIWqgbe.js +0 -4
  626. package/dist/toml-oDtxM9oL.js +0 -4
  627. package/dist/troff-_huin_CY.js +0 -4
  628. package/dist/ts-tags-CXewkOF3.js +0 -38
  629. package/dist/tsv-BseyLYQT.js +0 -4
  630. package/dist/tsx-D2LUWtsu.js +0 -4
  631. package/dist/tsx-kHCj4PrF.js +0 -4
  632. package/dist/ttcn-BEiJuYYc.js +0 -4
  633. package/dist/ttcn-cfg-DB6Ksh67.js +0 -4
  634. package/dist/turtle-CzEhuAap.js +0 -4
  635. package/dist/turtle-Dv3esCo-.js +0 -4
  636. package/dist/turtle-DzhzGEum.js +0 -4
  637. package/dist/twig-qB_T-k-S.js +0 -18
  638. package/dist/typescript-BN_vTPvq.js +0 -4
  639. package/dist/typescript-CI5sQpw1.js +0 -4
  640. package/dist/typespec-DHEcpagp.js +0 -4
  641. package/dist/typst-B9HpBJka.js +0 -4
  642. package/dist/v-H2_8AIAM.js +0 -4
  643. package/dist/vala-WHi-ThcB.js +0 -4
  644. package/dist/vb-CS8PoU3R.js +0 -4
  645. package/dist/vb-CngKZQHu.js +0 -4
  646. package/dist/vbscript-BV_8nbeM.js +0 -4
  647. package/dist/velocity-IqE7qYKE.js +0 -4
  648. package/dist/verilog-BGgTS1pK.js +0 -4
  649. package/dist/verilog-xtyaWTnc.js +0 -4
  650. package/dist/vesper-2sgFZerP.js +0 -4
  651. package/dist/vhdl-7aI3JU7f.js +0 -4
  652. package/dist/vhdl-BaqXCtf3.js +0 -4
  653. package/dist/viml-C3IDTTfq.js +0 -4
  654. package/dist/vitesse-black-BvCrVr8N.js +0 -4
  655. package/dist/vitesse-dark-DNi7aZj7.js +0 -4
  656. package/dist/vitesse-light-CXSVQ3oK.js +0 -4
  657. package/dist/vue-CHooyK57.js +0 -4
  658. package/dist/vue-ChlIPquu.js +0 -22
  659. package/dist/vue-html-DPVg93T0.js +0 -10
  660. package/dist/vue-vine-HiBtkWC6.js +0 -20
  661. package/dist/vyper-D18q9xCG.js +0 -4
  662. package/dist/wasm-CRlswj2T.js +0 -6
  663. package/dist/wasm-DZ1eFFdg.js +0 -4
  664. package/dist/webidl-BDB8PTTO.js +0 -4
  665. package/dist/wenyan-D3TBOs3h.js +0 -4
  666. package/dist/wgsl-BCsR2nKB.js +0 -4
  667. package/dist/wikitext-DIh6m2jB.js +0 -4
  668. package/dist/wit-Bz-r96TS.js +0 -4
  669. package/dist/wolfram-VIrnwGuX.js +0 -4
  670. package/dist/xml-CAP1bJV9.js +0 -4
  671. package/dist/xml-HKKjDs8r.js +0 -5
  672. package/dist/xquery-BIC-qj9Z.js +0 -4
  673. package/dist/xsl-HaaO21x0.js +0 -5
  674. package/dist/yacas-ifv5tftd.js +0 -4
  675. package/dist/yaml-BTiN8kgB.js +0 -4
  676. package/dist/yaml-B_O-W3eE.js +0 -4
  677. package/dist/z80-B8zOMVNt.js +0 -4
  678. package/dist/zenscript-BrGwAsAB.js +0 -4
  679. package/dist/zig-Chio8vL6.js +0 -4
  680. /package/dist/{ImageComparisonComponent-DXQrGLfG.js → ImageComparisonComponent-Bijp8beW.js} +0 -0
  681. /package/dist/{_arrayReduce-BoSa0zEn.js → _arrayReduce-DlK7U3Q6.js} +0 -0
  682. /package/dist/{_hasUnicode-zxc9hjSW.js → _hasUnicode-Bz2x6u6r.js} +0 -0
  683. /package/dist/{apl-DRxKiEot.js → apl-D9gTcP3Q.js} +0 -0
  684. /package/dist/{array-D-nrDupM.js → array-D7wW5QoO.js} +0 -0
  685. /package/dist/{asciiarmor-C8HoXFIm.js → asciiarmor-mLyg-Z5h.js} +0 -0
  686. /package/dist/{asn1-9Bo0DYT-.js → asn1-AE7eHomk.js} +0 -0
  687. /package/dist/{asterisk-eIhOKJFP.js → asterisk-Crp-Pien.js} +0 -0
  688. /package/dist/{brainfuck-Db8njC-p.js → brainfuck-Bdd6NcL6.js} +0 -0
  689. /package/dist/{chunk-XAJISQIX-DhEh08v5.js → chunk-XAJISQIX-CZ8Bi1-x.js} +0 -0
  690. /package/dist/{click-outside-container-D90VWx_r.js → click-outside-container-BCN5BtVO.js} +0 -0
  691. /package/dist/{clike-CFhUNtI5.js → clike-D_s3fKg5.js} +0 -0
  692. /package/dist/{clojure-CX7oovsp.js → clojure-zTYBCd80.js} +0 -0
  693. /package/dist/{cmake-C29AR2kk.js → cmake-BnJV90fC.js} +0 -0
  694. /package/dist/{cobol-CNkuRW9i.js → cobol-CH0OZO8A.js} +0 -0
  695. /package/dist/{coffeescript-BJAbfGam.js → coffeescript-CLhc1U6Q.js} +0 -0
  696. /package/dist/{colors-6nB_pSln.js → colors-6DRQ0kEF.js} +0 -0
  697. /package/dist/{common-keywords-DDkFNc6Q.js → common-keywords-NhoiR-2S.js} +0 -0
  698. /package/dist/{commonlisp-BTNhj2l9.js → commonlisp-8K2-IkUD.js} +0 -0
  699. /package/dist/{constants-DuN_eoAL.js → constants-DrOu5vvd.js} +0 -0
  700. /package/dist/{crystal-CZc0nIm9.js → crystal-8to4H-ep.js} +0 -0
  701. /package/dist/{css-L2-0OTXc.js → css-BVo-JOy5.js} +0 -0
  702. /package/dist/{cypher-Dnc6MXl0.js → cypher-BTFaDDd_.js} +0 -0
  703. /package/dist/{cytoscape.esm-Cs5lDB24.js → cytoscape.esm-CgJFiP_E.js} +0 -0
  704. /package/dist/{d-C6X9iIga.js → d-c9bddW2W.js} +0 -0
  705. /package/dist/{defaultLocale-DMZFeDB8.js → defaultLocale-Bxoo2-30.js} +0 -0
  706. /package/dist/{defaultLocale-DZtxSCkJ.js → defaultLocale-qS7DaAmi.js} +0 -0
  707. /package/dist/{diff-ZzKinYqY.js → diff-PA28xMKg.js} +0 -0
  708. /package/dist/{dist-wEzfBIGs.js → dist-9J8_3DZN.js} +0 -0
  709. /package/dist/{dist-GFp3A63i.js → dist-9trj4p6n.js} +0 -0
  710. /package/dist/{dist-DJTgoown.js → dist-BKGWAN8J.js} +0 -0
  711. /package/dist/{dist-XmKjmDjd.js → dist-BSMZYwqW.js} +0 -0
  712. /package/dist/{dist-BjWd_Ei9.js → dist-BYznkC5E.js} +0 -0
  713. /package/dist/{dist-CQ1gja1c.js → dist-BbQ-5HAA.js} +0 -0
  714. /package/dist/{dist-DsOyFflT.js → dist-CPd_adhw.js} +0 -0
  715. /package/dist/{dist-BWkp5r3D.js → dist-Cpj5BHNP.js} +0 -0
  716. /package/dist/{dist-BbaKVjkP.js → dist-CsN7lsea.js} +0 -0
  717. /package/dist/{dist-DMO79xnD.js → dist-DIVeCGlI.js} +0 -0
  718. /package/dist/{dist-Bhe0YLr5.js → dist-DsqQCNKw.js} +0 -0
  719. /package/dist/{dist-BOmxya4k.js → dist-MFzhAmKV.js} +0 -0
  720. /package/dist/{dist-DYUqP2g4.js → dist-l0KayR2-.js} +0 -0
  721. /package/dist/{dtd-CytEpkAo.js → dtd-DRlC7Bx8.js} +0 -0
  722. /package/dist/{duckdb-keywords-q-LipmQC.js → duckdb-keywords-BnNtuiVz.js} +0 -0
  723. /package/dist/{dylan-CZByFBEQ.js → dylan-d5ufc25E.js} +0 -0
  724. /package/dist/{ebnf-DuGDVaIM.js → ebnf-CFKHGc8c.js} +0 -0
  725. /package/dist/{ecl-Cp7L1F5B.js → ecl-Ci3afVKc.js} +0 -0
  726. /package/dist/{eiffel-C66yjnFL.js → eiffel-G6DmeEi3.js} +0 -0
  727. /package/dist/{elm-DtHo-73e.js → elm-ByYWHu8b.js} +0 -0
  728. /package/dist/{emotion-is-prop-valid.esm-_z-EwK5u.js → emotion-is-prop-valid.esm--WpIBtj8.js} +0 -0
  729. /package/dist/{erlang-C_sj44mF.js → erlang-C7_LcVDw.js} +0 -0
  730. /package/dist/{esm-JeWm05ae.js → esm-CAd2HmbR.js} +0 -0
  731. /package/dist/{fcl-DtWOm1i5.js → fcl-DPZwieM9.js} +0 -0
  732. /package/dist/{forth-CIDHh56T.js → forth-BgUerAyz.js} +0 -0
  733. /package/dist/{fortran-BQrDVXRU.js → fortran-BCXxm4xF.js} +0 -0
  734. /package/dist/{gas-D4HQPB0Q.js → gas-CKTQRKLl.js} +0 -0
  735. /package/dist/{gherkin-UB2gJHdT.js → gherkin-ByVP9cY_.js} +0 -0
  736. /package/dist/{groovy-DVz6jkOx.js → groovy-BPbrw0GZ.js} +0 -0
  737. /package/dist/{haskell-CpUdAPCz.js → haskell-B8fq1DW4.js} +0 -0
  738. /package/dist/{haxe-DCV5_cqD.js → haxe-B7SHQmJo.js} +0 -0
  739. /package/dist/{http-Q5Xt0h8Z.js → http-AQJFxSug.js} +0 -0
  740. /package/dist/{idl-D7WCIgHw.js → idl-CeJBDjsl.js} +0 -0
  741. /package/dist/{init-Ci8VD8ZH.js → init-BfRhston.js} +0 -0
  742. /package/dist/{invariant-BW72tHBT.js → invariant-D9QLJ4SZ.js} +0 -0
  743. /package/dist/{isString-B0JuKBai.js → isString-Clqvtgmo.js} +0 -0
  744. /package/dist/{javascript-B2Rn0Lmd.js → javascript-dCv9_Kn8.js} +0 -0
  745. /package/dist/{julia-ApprtEaw.js → julia-CD5lO88_.js} +0 -0
  746. /package/dist/{katex-BTobf3T8.js → katex-Dm9nZf6A.js} +0 -0
  747. /package/dist/{livescript-BMLIlM7C.js → livescript-Cc8RvFBv.js} +0 -0
  748. /package/dist/{lua-DdDaW3tC.js → lua-4nedfnvd.js} +0 -0
  749. /package/dist/{main-DC-71ZOX.js → main-DhFbkwoC.js} +0 -0
  750. /package/dist/{math-HUZifhTs.js → math-BbMyrONz.js} +0 -0
  751. /package/dist/{mathematica-PnNN7c2Z.js → mathematica-BIufdZr2.js} +0 -0
  752. /package/dist/{mbox-B84OtHBK.js → mbox-DQkYSHKe.js} +0 -0
  753. /package/dist/{memoize-BctRJDZ2.js → memoize-Bag7B41I.js} +0 -0
  754. /package/dist/{mirc-BVWXJxIq.js → mirc-CI-RWqUR.js} +0 -0
  755. /package/dist/{mllike-BawXWupH.js → mllike-DQzbf1xo.js} +0 -0
  756. /package/dist/{modelica-C8-X4Hf_.js → modelica-BnF_cDWj.js} +0 -0
  757. /package/dist/{mscgen-BOM6dDj8.js → mscgen-MirFrDhW.js} +0 -0
  758. /package/dist/{mumps-DQOY8n05.js → mumps-eNRTuWOD.js} +0 -0
  759. /package/dist/{nginx-Ynlf_cSR.js → nginx-hpek_Tnq.js} +0 -0
  760. /package/dist/{node-sql-parser-DW04P3RY.js → node-sql-parser-ChQUJk8A.js} +0 -0
  761. /package/dist/{ntriples-DU8VrXdW.js → ntriples-BLneip4i.js} +0 -0
  762. /package/dist/{octave-BzTIBsQ8.js → octave-C0eG-pKq.js} +0 -0
  763. /package/dist/{oz-DKFcZsoi.js → oz-BPMLow2T.js} +0 -0
  764. /package/dist/{pascal-DHBZ15pT.js → pascal-5eb9v5Dl.js} +0 -0
  765. /package/dist/{path-BVI7RNUv.js → path-C_x2ySFi.js} +0 -0
  766. /package/dist/{perl-75NMI3w0.js → perl-DOu6rCkF.js} +0 -0
  767. /package/dist/{pig-B-HY1fo_.js → pig-CRW0kne3.js} +0 -0
  768. /package/dist/{powershell-DEH22U53.js → powershell-CWgJhiiJ.js} +0 -0
  769. /package/dist/{prop-types-DTzjue2h.js → prop-types-C9QZf2SY.js} +0 -0
  770. /package/dist/{properties-B1MzBoJC.js → properties-CHxpmfXW.js} +0 -0
  771. /package/dist/{protobuf-Dr14KV0p.js → protobuf-DGUXb_-T.js} +0 -0
  772. /package/dist/{puppet-C4z38l7v.js → puppet-C7uSiW6_.js} +0 -0
  773. /package/dist/{python-D2L7Nknt.js → python-DAbhVcUr.js} +0 -0
  774. /package/dist/{q-PxipHfgS.js → q-DKjWHias.js} +0 -0
  775. /package/dist/{r-CEMMu_Tf.js → r-KD2KhyeL.js} +0 -0
  776. /package/dist/{range-Bieq5MNc.js → range-BYuZFTbA.js} +0 -0
  777. /package/dist/{rpm-D3xyahkR.js → rpm-GFtnpQ6M.js} +0 -0
  778. /package/dist/{ruby-DwEkwdiu.js → ruby-CBAewzLY.js} +0 -0
  779. /package/dist/{sas-L1W0BRft.js → sas-CCi_AaZi.js} +0 -0
  780. /package/dist/{scheme-CTybTrX0.js → scheme-CGGGD6kR.js} +0 -0
  781. /package/dist/{shell-BSx3LZnu.js → shell-b7vZ8ucI.js} +0 -0
  782. /package/dist/{sieve-BjUfbv-6.js → sieve-ClXOUV85.js} +0 -0
  783. /package/dist/{simple-mode-IPZGFbI6.js → simple-mode-Uad4lEG7.js} +0 -0
  784. /package/dist/{smalltalk-BlzuYrMv.js → smalltalk-_PFt9_gp.js} +0 -0
  785. /package/dist/{solr-B0fQ5Uwe.js → solr-BSTJW269.js} +0 -0
  786. /package/dist/{sparql-BXKjQ0cK.js → sparql-BCF6qcHt.js} +0 -0
  787. /package/dist/{spreadsheet-o1pnCmTO.js → spreadsheet-CiBky1_y.js} +0 -0
  788. /package/dist/{sql-C_tD2xcJ.js → sql-BXZovj-z.js} +0 -0
  789. /package/dist/{stex-BIsgBmK4.js → stex-DrxP7bb3.js} +0 -0
  790. /package/dist/{stylus-CqrLLVnG.js → stylus-DMFZWz-G.js} +0 -0
  791. /package/dist/{swift-DIqvj3_G.js → swift-De2YpSxT.js} +0 -0
  792. /package/dist/{tcl-B8bOIGVK.js → tcl-jV8Xs_1k.js} +0 -0
  793. /package/dist/{textile-DZsjavD_.js → textile-D_zo778l.js} +0 -0
  794. /package/dist/{tiddlywiki-IyzniiDM.js → tiddlywiki-DLTDKQCh.js} +0 -0
  795. /package/dist/{tiki-Dw2XZEnT.js → tiki-tw_kBvbp.js} +0 -0
  796. /package/dist/{timer-CPsmIOdm.js → timer-pEiW44EO.js} +0 -0
  797. /package/dist/{toml-Uc7m08nl.js → toml-_M0gsKn5.js} +0 -0
  798. /package/dist/{treemap-DMn4tIJ7.js → treemap-BzS5cW_6.js} +0 -0
  799. /package/dist/{troff-GEl5wcXR.js → troff-B06gyD33.js} +0 -0
  800. /package/dist/{ttcn-pr4FDOLT.js → ttcn-DoQoQNUM.js} +0 -0
  801. /package/dist/{ttcn-cfg-dZQ_fWTH.js → ttcn-cfg-l_6PksD2.js} +0 -0
  802. /package/dist/{turtle-TPRDOknA.js → turtle-zEnD4bpn.js} +0 -0
  803. /package/dist/{vb-BJUAeTYr.js → vb-fUsnAuzb.js} +0 -0
  804. /package/dist/{vbscript-CcJ6Z3ic.js → vbscript-CVlD7uZQ.js} +0 -0
  805. /package/dist/{velocity-pq4ZMzU3.js → velocity-CHkEIdMC.js} +0 -0
  806. /package/dist/{verilog-timMNjHt.js → verilog-B3ctZTB4.js} +0 -0
  807. /package/dist/{vhdl-DYFbVKNm.js → vhdl-rXdBgR5O.js} +0 -0
  808. /package/dist/{webidl-pue9oqnb.js → webidl-Cv9aQfcc.js} +0 -0
  809. /package/dist/{xquery-DeItGynK.js → xquery-Du0w47aa.js} +0 -0
  810. /package/dist/{yacas-By2Qrjba.js → yacas-Eq4p_g3L.js} +0 -0
  811. /package/dist/{z80-C7iLsyPC.js → z80-Dz4HTTRf.js} +0 -0
  812. /package/dist/{zod-LbXVxiL9.js → zod-DITCj31F.js} +0 -0
@@ -0,0 +1,113 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import type { Figure } from "react-plotly.js";
4
+ import { describe, expect, it } from "vitest";
5
+ import {
6
+ computeLayoutOnFigureChange,
7
+ computeLayoutUpdate,
8
+ computeOmitKeys,
9
+ createInitialLayout,
10
+ } from "../usePlotlyLayout";
11
+
12
+ function createFigure(layoutOverrides: Partial<Plotly.Layout> = {}): Figure {
13
+ return {
14
+ data: [],
15
+ layout: { ...layoutOverrides } as Plotly.Layout,
16
+ frames: null,
17
+ };
18
+ }
19
+
20
+ describe("createInitialLayout", () => {
21
+ it("sets defaults and merges figure layout", () => {
22
+ const figure = createFigure({ title: { text: "Test" }, dragmode: "zoom" });
23
+ const result = createInitialLayout(figure);
24
+
25
+ expect(result.autosize).toBe(true);
26
+ expect(result.height).toBe(540);
27
+ expect(result.dragmode).toBe("zoom"); // figure overrides default
28
+ expect(result.title).toEqual({ text: "Test" });
29
+ });
30
+
31
+ it("disables autosize when width is specified", () => {
32
+ const result = createInitialLayout(createFigure({ width: 800 }));
33
+ expect(result.autosize).toBe(false);
34
+ });
35
+ });
36
+
37
+ describe("computeLayoutOnFigureChange", () => {
38
+ it("preserves only dragmode/xaxis/yaxis from previous layout (#7964)", () => {
39
+ const nextFigure = createFigure({ title: { text: "New" } });
40
+ const prevLayout: Partial<Plotly.Layout> = {
41
+ dragmode: "zoom",
42
+ xaxis: { range: [0, 10] },
43
+ yaxis: { range: [0, 100] },
44
+ shapes: [{ type: "rect", x0: 0, x1: 1, y0: 0, y1: 1 }],
45
+ annotations: [{ text: "Old", x: 0, y: 0 }],
46
+ };
47
+
48
+ const result = computeLayoutOnFigureChange(nextFigure, prevLayout);
49
+
50
+ // Preserved from prev
51
+ expect(result.dragmode).toBe("zoom");
52
+ expect(result.xaxis).toEqual({ range: [0, 10] });
53
+ expect(result.yaxis).toEqual({ range: [0, 100] });
54
+ // From new figure
55
+ expect(result.title).toEqual({ text: "New" });
56
+ // NOT preserved (the bug fix)
57
+ expect(result.shapes).toBeUndefined();
58
+ expect(result.annotations).toBeUndefined();
59
+ });
60
+
61
+ it("uses shapes from new figure, not previous layout", () => {
62
+ const nextFigure = createFigure({
63
+ shapes: [{ type: "circle", x0: 0, x1: 1, y0: 0, y1: 1 }],
64
+ });
65
+ const prevLayout: Partial<Plotly.Layout> = {
66
+ shapes: [{ type: "rect", x0: 0, x1: 1, y0: 0, y1: 1 }],
67
+ };
68
+
69
+ const result = computeLayoutOnFigureChange(nextFigure, prevLayout);
70
+
71
+ expect(result.shapes).toHaveLength(1);
72
+ expect(result.shapes?.[0].type).toBe("circle");
73
+ });
74
+ });
75
+
76
+ describe("computeOmitKeys", () => {
77
+ it("omits user-interaction keys unless they changed in figure", () => {
78
+ const unchanged = computeOmitKeys({}, {});
79
+ expect([...unchanged]).toEqual(
80
+ expect.arrayContaining(["autosize", "dragmode", "xaxis", "yaxis"]),
81
+ );
82
+
83
+ const changed = computeOmitKeys(
84
+ { dragmode: "zoom", xaxis: { range: [0, 10] } },
85
+ { dragmode: "select", xaxis: { range: [0, 5] } },
86
+ );
87
+ expect(changed.has("dragmode")).toBe(false);
88
+ expect(changed.has("xaxis")).toBe(false);
89
+ expect(changed.has("autosize")).toBe(true);
90
+ });
91
+ });
92
+
93
+ describe("computeLayoutUpdate", () => {
94
+ it("merges figure layout while respecting omit keys", () => {
95
+ // dragmode unchanged in figure -> preserve prev layout's dragmode
96
+ const result1 = computeLayoutUpdate(
97
+ { dragmode: "pan", title: { text: "New" } },
98
+ { dragmode: "pan" },
99
+ { dragmode: "zoom", height: 400 },
100
+ );
101
+ expect(result1.dragmode).toBe("zoom");
102
+ expect(result1.title).toEqual({ text: "New" });
103
+ expect(result1.height).toBe(400);
104
+
105
+ // dragmode changed in figure -> use figure's dragmode
106
+ const result2 = computeLayoutUpdate(
107
+ { dragmode: "pan" },
108
+ { dragmode: "select" },
109
+ { dragmode: "zoom" },
110
+ );
111
+ expect(result2.dragmode).toBe("pan");
112
+ });
113
+ });
@@ -0,0 +1,163 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { usePrevious } from "@uidotdev/usehooks";
4
+ import { isEqual, pick } from "lodash-es";
5
+ import { useEffect, useState } from "react";
6
+ import type { Figure } from "react-plotly.js";
7
+ import { Objects } from "@/utils/objects";
8
+
9
+ /**
10
+ * Keys that are preserved across figure updates when set by user interaction.
11
+ * These include dragmode and axis settings that users may adjust.
12
+ */
13
+ export const PERSISTED_LAYOUT_KEYS = ["dragmode", "xaxis", "yaxis"] as const;
14
+
15
+ /**
16
+ * Keys that are omitted from layout updates unless they changed in the figure.
17
+ * This prevents overwriting user interactions like zoom/pan.
18
+ */
19
+ export const LAYOUT_OMIT_KEYS: (keyof Plotly.Layout)[] = [
20
+ "autosize",
21
+ "dragmode",
22
+ "xaxis",
23
+ "yaxis",
24
+ ];
25
+
26
+ /**
27
+ * Creates the initial layout for a Plotly figure with sensible defaults.
28
+ */
29
+ export function createInitialLayout(figure: Figure): Partial<Plotly.Layout> {
30
+ // Enable autosize if width is not specified
31
+ const shouldAutoSize = figure.layout.width === undefined;
32
+ return {
33
+ autosize: shouldAutoSize,
34
+ dragmode: "select",
35
+ height: 540,
36
+ // Prioritize user's config
37
+ ...figure.layout,
38
+ };
39
+ }
40
+
41
+ /**
42
+ * Computes the updated layout when the figure changes.
43
+ * Preserves user-interaction values (dragmode, xaxis, yaxis) while
44
+ * taking everything else from the new figure's layout.
45
+ */
46
+ export function computeLayoutOnFigureChange(
47
+ nextFigure: Figure,
48
+ prevLayout: Partial<Plotly.Layout>,
49
+ ): Partial<Plotly.Layout> {
50
+ return {
51
+ ...createInitialLayout(nextFigure),
52
+ ...pick(prevLayout, PERSISTED_LAYOUT_KEYS),
53
+ };
54
+ }
55
+
56
+ /**
57
+ * Computes which keys to omit from layout updates based on what changed.
58
+ * If a key changed in the figure, we should update it even if it's normally omitted.
59
+ */
60
+ export function computeOmitKeys(
61
+ currentLayout: Partial<Plotly.Layout>,
62
+ previousLayout: Partial<Plotly.Layout>,
63
+ ): Set<keyof Plotly.Layout> {
64
+ const omitKeys = new Set<keyof Plotly.Layout>(LAYOUT_OMIT_KEYS);
65
+
66
+ // If the key was updated externally (e.g. can be specifically passed in the config)
67
+ // then we need to update the layout
68
+ for (const key of omitKeys) {
69
+ if (!isEqual(currentLayout[key], previousLayout[key])) {
70
+ omitKeys.delete(key);
71
+ }
72
+ }
73
+
74
+ return omitKeys;
75
+ }
76
+
77
+ /**
78
+ * Computes the layout update when figure.layout changes.
79
+ * Omits keys that shouldn't override user interactions unless they changed.
80
+ */
81
+ export function computeLayoutUpdate(
82
+ figureLayout: Partial<Plotly.Layout>,
83
+ previousFigureLayout: Partial<Plotly.Layout>,
84
+ prevLayout: Partial<Plotly.Layout>,
85
+ ): Partial<Plotly.Layout> {
86
+ const omitKeys = computeOmitKeys(figureLayout, previousFigureLayout);
87
+ const layoutUpdate = Objects.omit(figureLayout, omitKeys);
88
+ return { ...prevLayout, ...layoutUpdate };
89
+ }
90
+
91
+ interface UsePlotlyLayoutOptions {
92
+ originalFigure: Figure;
93
+ initialValue?: Partial<Plotly.Layout>;
94
+ isScriptLoaded?: boolean;
95
+ }
96
+
97
+ interface UsePlotlyLayoutResult {
98
+ figure: Figure;
99
+ layout: Partial<Plotly.Layout>;
100
+ setLayout: React.Dispatch<React.SetStateAction<Partial<Plotly.Layout>>>;
101
+ handleReset: () => void;
102
+ }
103
+
104
+ /**
105
+ * Hook that manages the Plotly figure and layout state.
106
+ *
107
+ * This hook handles:
108
+ * - Cloning the figure to prevent Plotly mutations
109
+ * - Managing layout state with proper preservation of user interactions
110
+ * - Syncing layout when the figure changes
111
+ * - Providing a reset function to restore original state
112
+ */
113
+ export function usePlotlyLayout({
114
+ originalFigure,
115
+ initialValue,
116
+ isScriptLoaded = true,
117
+ }: UsePlotlyLayoutOptions): UsePlotlyLayoutResult {
118
+ const [figure, setFigure] = useState(() => {
119
+ // We clone the figure since Plotly mutates the figure in place
120
+ return structuredClone(originalFigure);
121
+ });
122
+
123
+ const [layout, setLayout] = useState<Partial<Plotly.Layout>>(() => {
124
+ return {
125
+ ...createInitialLayout(figure),
126
+ // Override with persisted values (dragmode, xaxis, yaxis)
127
+ ...initialValue,
128
+ };
129
+ });
130
+
131
+ // Update figure and layout when originalFigure changes
132
+ useEffect(() => {
133
+ const nextFigure = structuredClone(originalFigure);
134
+ setFigure(nextFigure);
135
+ // Start with the new figure's layout, then only preserve user-interaction
136
+ // values (dragmode, xaxis, yaxis) from the previous layout.
137
+ // We don't want to preserve other properties like `shapes` from the previous
138
+ // layout, as they should be fully controlled by the figure prop.
139
+ setLayout((prev) => computeLayoutOnFigureChange(nextFigure, prev));
140
+ }, [originalFigure, isScriptLoaded]);
141
+
142
+ const prevFigure = usePrevious(figure) ?? figure;
143
+
144
+ // Sync layout when figure.layout changes
145
+ useEffect(() => {
146
+ setLayout((prev) =>
147
+ computeLayoutUpdate(figure.layout, prevFigure.layout, prev),
148
+ );
149
+ }, [figure.layout, prevFigure.layout]);
150
+
151
+ const handleReset = () => {
152
+ const nextFigure = structuredClone(originalFigure);
153
+ setFigure(nextFigure);
154
+ setLayout(createInitialLayout(nextFigure));
155
+ };
156
+
157
+ return {
158
+ figure,
159
+ layout,
160
+ setLayout,
161
+ handleReset,
162
+ };
163
+ }
@@ -155,10 +155,16 @@ describe("getImageDataUrlForCell", () => {
155
155
  const result = await getImageDataUrlForCell("cell-1" as CellId);
156
156
 
157
157
  expect(result).toBe(mockDataUrl);
158
- expect(toPng).toHaveBeenCalledWith(mockElement);
158
+ expect(toPng).toHaveBeenCalledWith(
159
+ mockElement,
160
+ expect.objectContaining({
161
+ filter: expect.any(Function),
162
+ onImageErrorHandler: expect.any(Function),
163
+ }),
164
+ );
159
165
  });
160
166
 
161
- it("should add printing classes before capture", async () => {
167
+ it("should add printing classes before capture when enablePrintMode is true", async () => {
162
168
  vi.mocked(toPng).mockImplementation(async () => {
163
169
  // Check classes are applied during capture
164
170
  expect(mockElement.classList.contains("printing-output")).toBe(true);
@@ -167,16 +173,40 @@ describe("getImageDataUrlForCell", () => {
167
173
  return mockDataUrl;
168
174
  });
169
175
 
170
- await getImageDataUrlForCell("cell-1" as CellId);
176
+ await getImageDataUrlForCell("cell-1" as CellId, true);
171
177
  });
172
178
 
173
- it("should remove printing classes after capture", async () => {
179
+ it("should remove printing classes after capture when enablePrintMode is true", async () => {
174
180
  vi.mocked(toPng).mockResolvedValue(mockDataUrl);
175
181
 
176
- await getImageDataUrlForCell("cell-1" as CellId);
182
+ await getImageDataUrlForCell("cell-1" as CellId, true);
183
+
184
+ expect(mockElement.classList.contains("printing-output")).toBe(false);
185
+ expect(document.body.classList.contains("printing")).toBe(false);
186
+ });
187
+
188
+ it("should add printing-output but NOT body.printing when enablePrintMode is false", async () => {
189
+ vi.mocked(toPng).mockImplementation(async () => {
190
+ // printing-output should still be added to the element
191
+ expect(mockElement.classList.contains("printing-output")).toBe(true);
192
+ // but body.printing should NOT be added
193
+ expect(document.body.classList.contains("printing")).toBe(false);
194
+ expect(mockElement.style.overflow).toBe("auto");
195
+ return mockDataUrl;
196
+ });
197
+
198
+ await getImageDataUrlForCell("cell-1" as CellId, false);
199
+ });
200
+
201
+ it("should cleanup printing-output when enablePrintMode is false", async () => {
202
+ mockElement.style.overflow = "hidden";
203
+ vi.mocked(toPng).mockResolvedValue(mockDataUrl);
204
+
205
+ await getImageDataUrlForCell("cell-1" as CellId, false);
177
206
 
178
207
  expect(mockElement.classList.contains("printing-output")).toBe(false);
179
208
  expect(document.body.classList.contains("printing")).toBe(false);
209
+ expect(mockElement.style.overflow).toBe("hidden");
180
210
  });
181
211
 
182
212
  it("should restore original overflow style after capture", async () => {
@@ -207,7 +237,7 @@ describe("getImageDataUrlForCell", () => {
207
237
  expect(mockElement.style.overflow).toBe("scroll");
208
238
  });
209
239
 
210
- it("should maintain body.printing during concurrent captures", async () => {
240
+ it("should maintain body.printing during concurrent captures when enablePrintMode is true", async () => {
211
241
  // Create a second element
212
242
  const mockElement2 = document.createElement("div");
213
243
  mockElement2.id = CellOutputId.create("cell-2" as CellId);
@@ -241,9 +271,9 @@ describe("getImageDataUrlForCell", () => {
241
271
  return mockDataUrl;
242
272
  });
243
273
 
244
- // Start both captures concurrently
245
- const capture1 = getImageDataUrlForCell("cell-1" as CellId);
246
- const capture2 = getImageDataUrlForCell("cell-2" as CellId);
274
+ // Start both captures concurrently with enablePrintMode = true
275
+ const capture1 = getImageDataUrlForCell("cell-1" as CellId, true);
276
+ const capture2 = getImageDataUrlForCell("cell-2" as CellId, true);
247
277
 
248
278
  // Let second capture complete first
249
279
  resolveSecond!();
@@ -264,6 +294,30 @@ describe("getImageDataUrlForCell", () => {
264
294
 
265
295
  mockElement2.remove();
266
296
  });
297
+
298
+ it("should not interfere with body.printing during concurrent captures when enablePrintMode is false", async () => {
299
+ // Create a second element
300
+ const mockElement2 = document.createElement("div");
301
+ mockElement2.id = CellOutputId.create("cell-2" as CellId);
302
+ document.body.append(mockElement2);
303
+
304
+ vi.mocked(toPng).mockImplementation(async () => {
305
+ // body.printing should never be added when enablePrintMode is false
306
+ expect(document.body.classList.contains("printing")).toBe(false);
307
+ return mockDataUrl;
308
+ });
309
+
310
+ // Start both captures concurrently with enablePrintMode = false
311
+ const capture1 = getImageDataUrlForCell("cell-1" as CellId, false);
312
+ const capture2 = getImageDataUrlForCell("cell-2" as CellId, false);
313
+
314
+ await Promise.all([capture1, capture2]);
315
+
316
+ // body.printing should still not be present
317
+ expect(document.body.classList.contains("printing")).toBe(false);
318
+
319
+ mockElement2.remove();
320
+ });
267
321
  });
268
322
 
269
323
  describe("downloadHTMLAsImage", () => {
@@ -304,7 +358,13 @@ describe("downloadHTMLAsImage", () => {
304
358
 
305
359
  await downloadHTMLAsImage({ element: mockElement, filename: "test" });
306
360
 
307
- expect(toPng).toHaveBeenCalledWith(mockElement);
361
+ expect(toPng).toHaveBeenCalledWith(
362
+ mockElement,
363
+ expect.objectContaining({
364
+ filter: expect.any(Function),
365
+ onImageErrorHandler: expect.any(Function),
366
+ }),
367
+ );
308
368
  expect(mockAnchor.href).toBe(mockDataUrl);
309
369
  expect(mockAnchor.download).toBe("test.png");
310
370
  expect(mockAnchor.click).toHaveBeenCalled();
@@ -342,7 +402,7 @@ describe("downloadHTMLAsImage", () => {
342
402
  expect(cleanup).toHaveBeenCalled();
343
403
  });
344
404
 
345
- it("should not add body.printing when prepare is provided", async () => {
405
+ it("should delegate body.printing management to prepare function", async () => {
346
406
  let bodyPrintingDuringCapture = false;
347
407
  vi.mocked(toPng).mockImplementation(async () => {
348
408
  // Capture the state during toPng execution
@@ -350,7 +410,14 @@ describe("downloadHTMLAsImage", () => {
350
410
  return mockDataUrl;
351
411
  });
352
412
  const cleanup = vi.fn();
353
- const prepare = vi.fn().mockReturnValue(cleanup);
413
+ // Mock prepare that adds body.printing
414
+ const prepare = vi.fn().mockImplementation(() => {
415
+ document.body.classList.add("printing");
416
+ return () => {
417
+ document.body.classList.remove("printing");
418
+ cleanup();
419
+ };
420
+ });
354
421
 
355
422
  await downloadHTMLAsImage({
356
423
  element: mockElement,
@@ -358,9 +425,8 @@ describe("downloadHTMLAsImage", () => {
358
425
  prepare,
359
426
  });
360
427
 
361
- // body.printing should NOT be added by downloadHTMLAsImage when prepare is provided
362
- // (the prepare function is responsible for managing its own classes)
363
- expect(bodyPrintingDuringCapture).toBe(false);
428
+ // body.printing should be added by prepare function
429
+ expect(bodyPrintingDuringCapture).toBe(true);
364
430
  expect(document.body.classList.contains("printing")).toBe(false);
365
431
  expect(prepare).toHaveBeenCalledWith(mockElement);
366
432
  expect(cleanup).toHaveBeenCalled();
@@ -434,7 +500,13 @@ describe("downloadCellOutputAsImage", () => {
434
500
 
435
501
  await downloadCellOutputAsImage("cell-1" as CellId, "result");
436
502
 
437
- expect(toPng).toHaveBeenCalledWith(mockElement);
503
+ expect(toPng).toHaveBeenCalledWith(
504
+ mockElement,
505
+ expect.objectContaining({
506
+ filter: expect.any(Function),
507
+ onImageErrorHandler: expect.any(Function),
508
+ }),
509
+ );
438
510
  expect(mockAnchor.download).toBe("result.png");
439
511
  });
440
512
 
@@ -1,11 +1,12 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- import { toPng } from "html-to-image";
2
+
3
3
  import { toast } from "@/components/ui/use-toast";
4
4
  import { type CellId, CellOutputId } from "@/core/cells/ids";
5
5
  import { getRequestClient } from "@/core/network/requests";
6
6
  import { Filenames } from "@/utils/filenames";
7
7
  import { Paths } from "@/utils/paths";
8
8
  import { prettyError } from "./errors";
9
+ import { toPng } from "./html-to-image";
9
10
  import { Logger } from "./Logger";
10
11
 
11
12
  /**
@@ -59,34 +60,51 @@ function releaseBodyPrinting() {
59
60
  }
60
61
  }
61
62
 
62
- /*
63
+ /**
63
64
  * Prepare a cell element for screenshot capture.
64
- * Returns a cleanup function that should be called when the screenshot is complete.
65
+ *
66
+ * @param element - The cell output element to prepare
67
+ * @param enablePrintMode - When true, adds a 'printing' class to the body.
68
+ * This can cause layout shifts that cause the page to scroll.
69
+ * @returns A cleanup function to restore the element's original state
65
70
  */
66
- function prepareCellElementForScreenshot(element: HTMLElement) {
71
+ function prepareCellElementForScreenshot(
72
+ element: HTMLElement,
73
+ enablePrintMode: boolean,
74
+ ) {
67
75
  element.classList.add("printing-output");
68
- acquireBodyPrinting();
76
+ if (enablePrintMode) {
77
+ acquireBodyPrinting();
78
+ }
69
79
  const originalOverflow = element.style.overflow;
70
80
  element.style.overflow = "auto";
71
81
 
72
82
  return () => {
73
83
  element.classList.remove("printing-output");
74
- releaseBodyPrinting();
84
+ if (enablePrintMode) {
85
+ releaseBodyPrinting();
86
+ }
75
87
  element.style.overflow = originalOverflow;
76
88
  };
77
89
  }
78
90
 
79
91
  /**
80
92
  * Capture a cell output as a PNG data URL.
93
+ *
94
+ * @param cellId - The ID of the cell to capture
95
+ * @param enablePrintMode - When true, enables print mode which adds a 'printing' class to the body.
96
+ * This can cause layout shifts that cause the page to scroll.
97
+ * @returns The PNG as a data URL, or undefined if the cell element wasn't found
81
98
  */
82
99
  export async function getImageDataUrlForCell(
83
100
  cellId: CellId,
101
+ enablePrintMode = true,
84
102
  ): Promise<string | undefined> {
85
103
  const element = findElementForCell(cellId);
86
104
  if (!element) {
87
105
  return;
88
106
  }
89
- const cleanup = prepareCellElementForScreenshot(element);
107
+ const cleanup = prepareCellElementForScreenshot(element, enablePrintMode);
90
108
 
91
109
  try {
92
110
  return await toPng(element);
@@ -110,7 +128,7 @@ export async function downloadCellOutputAsImage(
110
128
  await downloadHTMLAsImage({
111
129
  element,
112
130
  filename,
113
- prepare: prepareCellElementForScreenshot,
131
+ prepare: () => prepareCellElementForScreenshot(element, true),
114
132
  });
115
133
  }
116
134
 
@@ -127,7 +145,6 @@ export async function downloadHTMLAsImage(opts: {
127
145
 
128
146
  let cleanup: (() => void) | undefined;
129
147
  if (prepare) {
130
- // Let the prepare function handle adding classes (e.g., body.printing)
131
148
  cleanup = prepare(element);
132
149
  } else {
133
150
  // When no prepare function is provided (e.g., downloading full notebook),
@@ -0,0 +1,41 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+ import { toPng as htmlToImageToPng } from "html-to-image";
3
+ import { Logger } from "./Logger";
4
+
5
+ export type HtmlToImageOptions = Parameters<typeof htmlToImageToPng>[1];
6
+
7
+ /**
8
+ * Default options for html-to-image conversions.
9
+ * These handle common edge cases like filtering out toolbars and logging errors.
10
+ */
11
+ export const defaultHtmlToImageOptions: HtmlToImageOptions = {
12
+ filter: (node) => {
13
+ try {
14
+ if ("classList" in node) {
15
+ // Filter out matplotlib toolbars
16
+ return !node.classList.contains("mpl-toolbar");
17
+ }
18
+ return true;
19
+ } catch (error) {
20
+ Logger.error("Error filtering node:", error);
21
+ return true;
22
+ }
23
+ },
24
+ onImageErrorHandler: (event) => {
25
+ Logger.error("Error loading image:", event);
26
+ },
27
+ };
28
+
29
+ /**
30
+ * Convert an HTML element to a PNG data URL.
31
+ * This is a wrapper around html-to-image's toPng with default options applied.
32
+ */
33
+ export function toPng(
34
+ element: HTMLElement,
35
+ options?: HtmlToImageOptions,
36
+ ): Promise<string> {
37
+ return htmlToImageToPng(element, {
38
+ ...defaultHtmlToImageOptions,
39
+ ...options,
40
+ });
41
+ }