@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.
- package/dist/{ConnectedDataExplorerComponent-CDKkNEXK.js → ConnectedDataExplorerComponent-BW-EEUju.js} +12 -12
- package/dist/_baseIsEqual-CBSjxu-D.js +225 -0
- package/dist/{_baseProperty-zelfx9VI.js → _baseProperty-BVGrW_NZ.js} +2 -2
- package/dist/{_baseUniq-BUGws47x.js → _baseUniq-4lqa8rDi.js} +7 -8
- package/dist/{any-language-editor-vYraVrwE.js → any-language-editor-jlqKouk6.js} +16 -16
- package/dist/apl-BuwKwesW.js +4 -0
- package/dist/{arc-DXxE-tFl.js → arc-CEWBr4jc.js} +2 -2
- package/dist/architecture-U656AL7Q-COfwZju8.js +6 -0
- package/dist/{architectureDiagram-VXUJARFQ-DRLesROp.js → architectureDiagram-VXUJARFQ--NkyBn9Y.js} +18 -19
- package/dist/asciiarmor-zAEd_wtn.js +4 -0
- package/dist/asn1-DWEA66J4.js +4 -0
- package/dist/{blockDiagram-VD42YOAC-ByzG0Vzp.js → blockDiagram-VD42YOAC-DEZZaTW0.js} +13 -14
- package/dist/brainfuck-mIPR6Ong.js +4 -0
- package/dist/{c4Diagram-YG6GDRKO-Trp4lx6i.js → c4Diagram-YG6GDRKO-Bj7hwWCO.js} +5 -5
- package/dist/{channel-CPUfhCMU.js → channel-B_QrFrGg.js} +1 -1
- package/dist/{chunk-4BX2VUAB-D-P4ZvWX.js → chunk-4BX2VUAB-DZQibjKA.js} +1 -1
- package/dist/{chunk-55IACEB6-DRnX6IuG.js → chunk-55IACEB6-C3BASkh4.js} +1 -1
- package/dist/{chunk-OGVTOU66-RMy3tlM6.js → chunk-5FQGJX7Z-D5VFKHmt.js} +5206 -4212
- package/dist/{chunk-76Q3JFCE-DaBPIBvG.js → chunk-76Q3JFCE-jPuajZH_.js} +1 -1
- package/dist/{chunk-ABZYJK2D-BZDGfEE1.js → chunk-ABZYJK2D-SZPYmRzN.js} +2 -2
- package/dist/{chunk-ATLVNIR6-j8AgRnSs.js → chunk-ATLVNIR6-BI_WwH1o.js} +2 -2
- package/dist/{chunk-B4BG7PRW-DU1moE9R.js → chunk-B4BG7PRW-BlI9Gm1l.js} +7 -7
- package/dist/{chunk-CVBHYZKI-CDc7Jfcj.js → chunk-CVBHYZKI-Dhc_e3rA.js} +1 -1
- package/dist/{chunk-DI55MBZ5-BIFn9unR.js → chunk-DI55MBZ5-BXxemMn5.js} +6 -6
- package/dist/{chunk-EXTU4WIE-CaHHLmza.js → chunk-EXTU4WIE-CzWtDV99.js} +2 -2
- package/dist/{chunk-FMBD7UC4-D8xABqXe.js → chunk-FMBD7UC4-geNUIndh.js} +1 -1
- package/dist/{chunk-FPAJGGOC-B7vtXnL8.js → chunk-FPAJGGOC-CduL34ft.js} +7 -7
- package/dist/{chunk-FWNWRKHM-CoKqaHV4.js → chunk-FWNWRKHM-C-2TI4gt.js} +1 -1
- package/dist/{chunk-HN2XXSSU-DilnBn0B.js → chunk-HN2XXSSU-CqPwpolw.js} +1 -1
- package/dist/chunk-JA3XYJ7Z-DQ-2ARfa.js +1838 -0
- package/dist/{chunk-JZLCHNYA-DyKV2dUA.js → chunk-JZLCHNYA-CVfjf2vv.js} +6 -6
- package/dist/{chunk-LBM3YZW2-CuRptnLo.js → chunk-LBM3YZW2-DWgQiioW.js} +1 -1
- package/dist/{chunk-LHMN2FUI-Z6kNjtl5.js → chunk-LHMN2FUI-Dj_AHSvI.js} +1 -1
- package/dist/{chunk-MI3HLSF2-uTxL-0zC.js → chunk-MI3HLSF2-DOJkNER1.js} +1 -1
- package/dist/{chunk-N4CR4FBY-C_3rxQPk.js → chunk-N4CR4FBY-BCZvQ7Jq.js} +7 -7
- package/dist/{chunk-O7ZBX7Z2-N-4UT8hG.js → chunk-O7ZBX7Z2-CRZ8i1rP.js} +1 -1
- package/dist/{chunk-QN33PNHL-BcBASegy.js → chunk-QN33PNHL-DY_2Q2zl.js} +2 -2
- package/dist/{chunk-QXUST7PY-DMlfsgyq.js → chunk-QXUST7PY-BMCjAVR_.js} +10 -10
- package/dist/{chunk-QZHKN3VN-gCo1BI4L.js → chunk-QZHKN3VN-BF_oGUlG.js} +1 -1
- package/dist/{chunk-S3R3BYOJ-BhcrQySJ.js → chunk-S3R3BYOJ-Ddu0H4Qa.js} +5 -5
- package/dist/{chunk-S6J4BHB3-CbT4tqbg.js → chunk-S6J4BHB3-DNVMr0_v.js} +1 -1
- package/dist/{chunk-T53DSG4Q-DjWTd72f.js → chunk-T53DSG4Q-BFWkpOX5.js} +1 -1
- package/dist/{chunk-TZMSLE5B-udBrmj8R.js → chunk-TZMSLE5B-C2wVlbMl.js} +3 -3
- package/dist/classDiagram-2ON5EDUG-D-g7zbyO.js +30 -0
- package/dist/classDiagram-v2-WZHVMYZB-C7v5zNRD.js +30 -0
- package/dist/{clike-CLJYUAWw.js → clike-B1zispTy.js} +1 -1
- package/dist/clojure-DkhhNHNQ.js +4 -0
- package/dist/{clone-BImB0Zxt.js → clone-Cc_6PW77.js} +1 -1
- package/dist/cmake-1obPvqtc.js +4 -0
- package/dist/cobol-oWNTiXPE.js +4 -0
- package/dist/code-block-37QAKDTI-eUgXqGNG.js +107 -0
- package/dist/coffeescript-LtYUvf6r.js +4 -0
- package/dist/commonlisp-C_06qBYF.js +4 -0
- package/dist/{cose-bilkent-S5V4N54A-kv0JiSTh.js → cose-bilkent-S5V4N54A-CO4ORQHF.js} +2 -2
- package/dist/crystal-CDJkbx14.js +4 -0
- package/dist/css-Bi_Nk0uN.js +4 -0
- package/dist/cypher-TrG0NvZ0.js +4 -0
- package/dist/d-CFKOrZsi.js +4 -0
- package/dist/{dagre-6UL2VRFP-HiV8Yeor.js → dagre-6UL2VRFP-DKIPL74O.js} +14 -15
- package/dist/{dagre-Baw82WQV.js → dagre-D2F8UdM6.js} +10 -11
- package/dist/{data-grid-overlay-editor-BuHxKF-R.js → data-grid-overlay-editor-COyFwFmE.js} +2 -2
- package/dist/{diagram-PSM6KHXK-jDduKZjc.js → diagram-PSM6KHXK-CVTrAZaP.js} +21 -21
- package/dist/{diagram-QEK2KX5R-CiQYmuQX.js → diagram-QEK2KX5R-BqHBzu3x.js} +16 -16
- package/dist/{diagram-S2PKOQOG-3sE_WnZi.js → diagram-S2PKOQOG-CJD6owcg.js} +16 -16
- package/dist/diff-CfnSF48q.js +4 -0
- package/dist/{dist-CMZuWSBe.js → dist--Em7gfgX.js} +2 -2
- package/dist/{dist-CDxsfpyX.js → dist--JwRU9u5.js} +1 -1
- package/dist/dist-2OSzSqy2.js +5 -0
- package/dist/dist-B1H2TQGB.js +8 -0
- package/dist/{dist-Bs1IvD_X.js → dist-B7NoEgR4.js} +1 -1
- package/dist/dist-BNvasp6N.js +5 -0
- package/dist/{dist-DRA2Iv4Q.js → dist-BcXuIt-h.js} +1 -1
- package/dist/{dist-D7wDmIuC.js → dist-BhBtK2sL.js} +1 -1
- package/dist/{dist-HA2BVGuM.js → dist-BlRm4v0e.js} +4 -4
- package/dist/{dist-DNVajE3L.js → dist-C6p7UKkB.js} +1 -1
- package/dist/{dist-BZXKWoES.js → dist-CBA36Nuy.js} +1 -1
- package/dist/{dist-DY8txPM6.js → dist-CFi_P6cs.js} +1 -1
- package/dist/dist-CG4LWTPv.js +8 -0
- package/dist/{dist-BtPD-BeW.js → dist-CHWVQZ6Z.js} +2 -2
- package/dist/{dist-C011r2tf.js → dist-CITQGRtG.js} +3 -3
- package/dist/{dist-CZq4mfrw.js → dist-COp5dkis.js} +2 -2
- package/dist/dist-C_8-swED.js +5 -0
- package/dist/{dist-DW3LjXSw.js → dist-C_Kw_Kc0.js} +1 -1
- package/dist/{dist-_FVOHtWJ.js → dist-Co5PD8Fb.js} +1 -1
- package/dist/{dist-J6fsaVBE.js → dist-DA1J6LvO.js} +1 -1
- package/dist/dist-DIhtur5b.js +5 -0
- package/dist/{dist-DI1Bo5Nv.js → dist-DKnxaCRl.js} +1 -1
- package/dist/dist-DoQ7RS4e.js +5 -0
- package/dist/dist-DsMd-F9h.js +5 -0
- package/dist/dist-DurmUshd.js +8 -0
- package/dist/{dist-Bv-wYGwr.js → dist-PZgrh2z6.js} +2 -2
- package/dist/{dist-BUwAd6_d.js → dist-b7Sc3Tj8.js} +1 -1
- package/dist/{dist-DWMcVk1V.js → dist-r6N_0WG-.js} +3 -3
- package/dist/{dist--kinAuV0.js → dist-wudNDAiO.js} +1 -1
- package/dist/dist-zVskjQcA.js +8 -0
- package/dist/{dockerfile-kP2dp4Jc.js → dockerfile-BBT_Ira6.js} +1 -1
- package/dist/dtd-Ctw8_JkU.js +4 -0
- package/dist/dylan-f7rMBKDP.js +4 -0
- package/dist/ecl-C2h3oBMY.js +4 -0
- package/dist/eiffel-Ce81wv20.js +4 -0
- package/dist/elm-BVV8QQcc.js +4 -0
- package/dist/{erDiagram-Q2GNP2WA-DaNawciA.js → erDiagram-Q2GNP2WA-CqOceSf9.js} +14 -15
- package/dist/erlang-DjB35ZUh.js +4 -0
- package/dist/{error-banner-BhqH4mGj.js → error-banner-uJ4xh94e.js} +1 -1
- package/dist/{esm-DOBJQbuy.js → esm-DNwkt4aO.js} +104 -104
- package/dist/factor-CIcp3U2B.js +4 -0
- package/dist/{factor-Png_OsVt.js → factor-DdqWbSyy.js} +1 -1
- package/dist/{flatten-CP4G1KkO.js → flatten-eGRGXrC3.js} +1 -1
- package/dist/{flowDiagram-NV44I4VS-Cn7CoW5b.js → flowDiagram-NV44I4VS-K7-DUifo.js} +16 -17
- package/dist/forth-CVgjsHhD.js +4 -0
- package/dist/fortran-CcTXj0d_.js +4 -0
- package/dist/{ganttDiagram-JELNMOA3-D2MZdMJt.js → ganttDiagram-JELNMOA3-BwUFY9Nu.js} +9 -9
- package/dist/gas-JWpamkLf.js +4 -0
- package/dist/gherkin-BveSCSJV.js +4 -0
- package/dist/{gitGraph-F6HP7TQM-DAY7Pizs.js → gitGraph-F6HP7TQM-CDM3aU-T.js} +3 -3
- package/dist/{gitGraphDiagram-NY62KEGX-CQ9ts7ZP.js → gitGraphDiagram-NY62KEGX-CjGRtLb1.js} +16 -16
- package/dist/{glide-data-editor-CF27qeAl.js → glide-data-editor-QbwryjAp.js} +8 -8
- package/dist/{graphlib-C_0PYYJy.js → graphlib-7UgfJadv.js} +5 -6
- package/dist/groovy-Np3AZt00.js +4 -0
- package/dist/haskell-CVfmFALm.js +4 -0
- package/dist/haxe-C10xkMLg.js +5 -0
- package/dist/idl-CKBSGnKC.js +4 -0
- package/dist/{info-NVLQJR56-CSiFVstv.js → info-NVLQJR56-CoL1x1Fy.js} +3 -3
- package/dist/{infoDiagram-WHAUD3N6-CVDTiMub.js → infoDiagram-WHAUD3N6-DNhmDn-6.js} +14 -14
- package/dist/{isEmpty-D2-li_vO.js → isEmpty-DQXRKNtW.js} +1 -1
- package/dist/javascript-Cur-15Bn.js +4 -0
- package/dist/{journeyDiagram-XKPGCS4Q-Dqs3P2CH.js → journeyDiagram-XKPGCS4Q-BOdK47P8.js} +6 -6
- package/dist/julia-BZZH2Gnx.js +4 -0
- package/dist/{kanban-definition-3W4ZIXB7-BEhej3Aa.js → kanban-definition-3W4ZIXB7-A0JC9d0g.js} +11 -12
- package/dist/{katex-DXbA2lyH.js → katex-DJyOeQ91.js} +1 -1
- package/dist/{label-B8Ngsa38.js → label-o68OaAQk.js} +2 -2
- package/dist/{line-C1k1rG3Z.js → line-LK_5q2B9.js} +3 -3
- package/dist/{linear-Dhu2Qlw4.js → linear-vWf1Qj0e.js} +4 -4
- package/dist/livescript-D_rTTm_U.js +4 -0
- package/dist/{loader-DH7xXi-E.js → loader-WBQoIunJ.js} +1 -1
- package/dist/lua-Mf_Of7eV.js +4 -0
- package/dist/main.js +18723 -18034
- package/dist/mathematica-DCYjugDb.js +4 -0
- package/dist/mbox-KBWrT8JD.js +4 -0
- package/dist/mermaid-4DMBBIKO-o3xNphpD.js +6 -0
- package/dist/{mermaid.core-BzRPXY_i.js → mermaid-CDdsQEyr.js} +186 -108
- package/dist/{mermaid-parser.core-BFf_lpn1.js → mermaid-parser.core-D20zFbMa.js} +8 -8
- package/dist/{mhchem-D3PZqzP1.js → mhchem-BqdXeZVX.js} +1 -1
- package/dist/{min-CzysEoAP.js → min-Bg4bqmiD.js} +1 -1
- package/dist/{mindmap-definition-VGOIOE7T-DH1E7psw.js → mindmap-definition-VGOIOE7T-CS6nKN_L.js} +13 -14
- package/dist/mirc-JwEQJ8Fb.js +4 -0
- package/dist/mllike-C7TxLvh6.js +6 -0
- package/dist/modelica-uvNgvUyw.js +4 -0
- package/dist/mscgen-CGnokp5x.js +6 -0
- package/dist/mumps-Dl9QdOZz.js +4 -0
- package/dist/nsis-BbDhbgPN.js +4 -0
- package/dist/{nsis-BrAITej_.js → nsis-CunMjZ_n.js} +1 -1
- package/dist/ntriples-ChL1mlp7.js +4 -0
- package/dist/{number-overlay-editor-DHeLnLyR.js → number-overlay-editor-Bz_bDJQb.js} +1 -1
- package/dist/octave-B9ZGG6zv.js +4 -0
- package/dist/{once-C-NkXwWJ.js → once-BqS42WgZ.js} +1 -1
- package/dist/{ordinal-CUS6_Aqv.js → ordinal-IlASfRja.js} +1 -1
- package/dist/oz-XHEu31wr.js +4 -0
- package/dist/{packet-BFZMPI3H-DZ3M7UG8.js → packet-BFZMPI3H-C6aZmgV-.js} +3 -3
- package/dist/pascal-BxtYw-iH.js +4 -0
- package/dist/perl-Br5BgHPb.js +4 -0
- package/dist/{pie-7BOR55EZ-BZ7IZsm8.js → pie-7BOR55EZ-NB6xYwcB.js} +3 -3
- package/dist/{pieDiagram-ADFJNKIX-Dc8_ZPVD.js → pieDiagram-ADFJNKIX-DSa60Grk.js} +21 -21
- package/dist/pig-BByO2hBz.js +4 -0
- package/dist/powershell-Cd4Zaef3.js +4 -0
- package/dist/{precisionRound-B0z4y-te.js → precisionRound-CGLoV26P.js} +1 -1
- package/dist/properties-B-BOCIOl.js +4 -0
- package/dist/protobuf-CaLimlho.js +4 -0
- package/dist/{pug-CH-17az-.js → pug-Dr-sA_9V.js} +1 -1
- package/dist/pug-bonARSG6.js +4 -0
- package/dist/puppet-BSlT-3sc.js +4 -0
- package/dist/python-BIJhGYYP.js +4 -0
- package/dist/q-D9TX8A0B.js +4 -0
- package/dist/{quadrantDiagram-AYHSOK5B-Bi2zuCYl.js → quadrantDiagram-AYHSOK5B-CFnMbP2J.js} +4 -4
- package/dist/r-BXelX7Rl.js +4 -0
- package/dist/{radar-NHE76QYJ-BwZi8I4_.js → radar-NHE76QYJ-RKhErikV.js} +3 -3
- package/dist/{range-iDYhZkRw.js → range-LoQMRQIX.js} +2 -2
- package/dist/{react-plotly-D-b1AEMh.js → react-plotly-jVjTu07w.js} +1 -1
- package/dist/{react-vega-z40f-dXy.js → react-vega-CjiPWyw0.js} +18 -18
- package/dist/react-vega-DgHpnZ04.js +9 -0
- package/dist/{reduce-1D4AnEer.js → reduce-B9mZDxPo.js} +3 -3
- package/dist/{requirementDiagram-UZGBJVZJ-Dx4_kui2.js → requirementDiagram-UZGBJVZJ-ytLQrFTk.js} +13 -14
- package/dist/rpm-BxAh9B1A.js +5 -0
- package/dist/ruby-BCZLQyhc.js +4 -0
- package/dist/{sankeyDiagram-TZEHDZUN-CKYnHkMA.js → sankeyDiagram-TZEHDZUN-KQqXDoky.js} +4 -4
- package/dist/sas-Bo7lsyNX.js +4 -0
- package/dist/scheme-Brhptkt-.js +4 -0
- package/dist/{sequenceDiagram-WL72ISMW-C-p-8Qdz.js → sequenceDiagram-WL72ISMW-ByLI04T5.js} +7 -7
- package/dist/shell-fWWb8_qx.js +4 -0
- package/dist/sieve-Ba8_hMLn.js +4 -0
- package/dist/{slides-component-BHWhzwDN.js → slides-component-BGEYjTca.js} +1 -1
- package/dist/smalltalk-7sHxwMDT.js +4 -0
- package/dist/sparql-BBFrPJ7z.js +4 -0
- package/dist/{spec-KNxDhBEX.js → spec-CuHgWmcK.js} +3 -3
- package/dist/{src-CHUphWwL.js → src-szye8OCw.js} +1 -1
- package/dist/{stateDiagram-FKZM4ZOC-otiu7nL4.js → stateDiagram-FKZM4ZOC-Dfz8vBbP.js} +18 -19
- package/dist/stateDiagram-v2-4FDKWEC3-DRYoLdT5.js +29 -0
- package/dist/{step-BbmiiQdf.js → step-1PmBKr2y.js} +1 -1
- package/dist/stex-ChDHQs3R.js +4 -0
- package/dist/style.css +1 -1
- package/dist/stylus-CIB0KT46.js +4 -0
- package/dist/swift-CZinekXz.js +4 -0
- package/dist/tcl-DCHZJVq_.js +4 -0
- package/dist/textile-ThTMxgkN.js +4 -0
- package/dist/{time-m5v-VC8K.js → time-DC4qQGmA.js} +4 -4
- package/dist/{timeline-definition-IT6M3QCI-DhR16s4q.js → timeline-definition-IT6M3QCI-CO48XU1B.js} +3 -3
- package/dist/toml-DK17wlJ7.js +4 -0
- package/dist/{treemap-KMMF4GRG-Bp2TNEsG.js → treemap-KMMF4GRG-B37ugcLd.js} +3 -3
- package/dist/troff-CuUAOgMy.js +4 -0
- package/dist/ttcn-DS2tj6rW.js +4 -0
- package/dist/ttcn-cfg-CdZGarnc.js +4 -0
- package/dist/turtle-Bkz-FLZ7.js +4 -0
- package/dist/{types-B9fL65ao.js → types-BIvEidLq.js} +4 -4
- package/dist/{useAsyncData-kqbhbSuf.js → useAsyncData-DFBEii2l.js} +2 -2
- package/dist/{useDeepCompareMemoize-B2QEm3jo.js → useDeepCompareMemoize-HKwezUBx.js} +3 -3
- package/dist/{useIframeCapabilities-BsIPDupA.js → useIframeCapabilities-wWXCXV88.js} +1 -1
- package/dist/{useTheme-CVr6Gb_R.js → useTheme-D0zT6HZe.js} +2 -2
- package/dist/vb-ITdOmxvR.js +4 -0
- package/dist/vbscript-B7oeGyfL.js +4 -0
- package/dist/{vega-component-DAeU1_cV.js → vega-component-2gqZksJH.js} +11 -11
- package/dist/{vega-loader.browser-nTy1NZD3.js → vega-loader.browser-BJ1uJidF.js} +3 -3
- package/dist/velocity-D__EkuSd.js +4 -0
- package/dist/verilog-CPH50gr9.js +4 -0
- package/dist/vhdl-CQAwKCk_.js +4 -0
- package/dist/webidl-BnEptfVX.js +4 -0
- package/dist/xquery-D7eTv-CR.js +4 -0
- package/dist/{xychartDiagram-PRI3JC2R-DxKtZBfd.js → xychartDiagram-PRI3JC2R-CUIfjNVD.js} +12 -13
- package/dist/yacas-0x1rX89s.js +4 -0
- package/dist/z80-B25SJVDf.js +4 -0
- package/package.json +8 -7
- package/src/components/ai/__tests__/ai-utils.test.ts +20 -20
- package/src/components/ai/ai-model-dropdown.tsx +8 -10
- package/src/components/ai/ai-utils.ts +11 -9
- package/src/components/app-config/__tests__/get-dirty-values.test.ts +47 -1
- package/src/components/app-config/ai-config.tsx +20 -54
- package/src/components/app-config/state.ts +11 -1
- package/src/components/app-config/user-config-form.tsx +73 -3
- package/src/components/chat/chat-panel.tsx +5 -1
- package/src/components/editor/chrome/panels/dependency-graph-panel.tsx +46 -10
- package/src/components/markdown/markdown-renderer.tsx +6 -1
- package/src/core/ai/context/providers/cell-output.ts +1 -1
- package/src/core/export/__tests__/hooks.test.ts +7 -1
- package/src/core/export/hooks.ts +1 -1
- package/src/plugins/impl/plotly/PlotlyPlugin.tsx +11 -66
- package/src/plugins/impl/plotly/__tests__/usePlotlyLayout.test.ts +113 -0
- package/src/plugins/impl/plotly/usePlotlyLayout.ts +163 -0
- package/src/utils/__tests__/download.test.tsx +88 -16
- package/src/utils/__tests__/iframe.test.ts +139 -0
- package/src/utils/download.ts +40 -9
- package/src/utils/html-to-image.ts +41 -0
- package/src/utils/iframe.ts +142 -0
- package/dist/_baseIsEqual-BygTGUZ4.js +0 -198
- package/dist/_getTag-C91a-G2j.js +0 -31
- package/dist/abap-CKZVRcrP.js +0 -4
- package/dist/actionscript-3-CfEeiw8Q.js +0 -4
- package/dist/ada-Espzt5xk.js +0 -4
- package/dist/andromeeda-Bet9yHpN.js +0 -4
- package/dist/angular-html-D6gc6xRJ.js +0 -20
- package/dist/angular-html-DE-SuIpI.js +0 -4
- package/dist/angular-ts-BjFZRs0x.js +0 -18
- package/dist/apache-C-c0stKR.js +0 -4
- package/dist/apex-BiJpixJ-.js +0 -4
- package/dist/apl-BEQpOla5.js +0 -16
- package/dist/apl-lHFVoxx7.js +0 -4
- package/dist/applescript-BccZMr3e.js +0 -4
- package/dist/ara-DPVHfRJZ.js +0 -4
- package/dist/architecture-U656AL7Q-wavOWR6z.js +0 -6
- package/dist/asciiarmor-DqCdZUHI.js +0 -4
- package/dist/asciidoc-CCrtAKGW.js +0 -4
- package/dist/asm-C0GNzPhS.js +0 -4
- package/dist/asn1-DEcwtw-q.js +0 -4
- package/dist/astro-CxSXfOWT.js +0 -18
- package/dist/aurora-x-DBIPmgQb.js +0 -4
- package/dist/awk-7-EU_WjX.js +0 -4
- package/dist/ayu-dark-BB4DzJ08.js +0 -4
- package/dist/ballerina-5MpSVFjo.js +0 -4
- package/dist/bat-COtKSp2G.js +0 -4
- package/dist/beancount-BTyoFFVI.js +0 -4
- package/dist/berry-CNMCaTK_.js +0 -4
- package/dist/bibtex-Cti-V2Ia.js +0 -4
- package/dist/bicep-f38RkTGW.js +0 -4
- package/dist/blade-BKkPPgXV.js +0 -20
- package/dist/brainfuck-Bro9Oz5x.js +0 -4
- package/dist/bsl-CGq8JMnm.js +0 -5
- package/dist/c-BltHt-Ng.js +0 -4
- package/dist/c-C2t3MvE0.js +0 -4
- package/dist/cadence-m1eiVz08.js +0 -4
- package/dist/cairo-scf1ovh9.js +0 -5
- package/dist/catppuccin-frappe-C7063pB0.js +0 -4
- package/dist/catppuccin-latte-DMkr2vg8.js +0 -4
- package/dist/catppuccin-macchiato-BqE_ZXfu.js +0 -4
- package/dist/catppuccin-mocha-D7YJQma9.js +0 -4
- package/dist/chunk-JA3XYJ7Z-CzGXky2M.js +0 -470
- package/dist/clarity-B1pEsGP2.js +0 -4
- package/dist/classDiagram-2ON5EDUG-C2nDCJAo.js +0 -31
- package/dist/classDiagram-v2-WZHVMYZB-DORr9374.js +0 -31
- package/dist/clojure-B2uhdQPa.js +0 -4
- package/dist/clojure-BATFX9a2.js +0 -4
- package/dist/cmake-B9WXyQcc.js +0 -4
- package/dist/cmake-BRQW8t09.js +0 -4
- package/dist/cmake-jVu1cyUe.js +0 -4
- package/dist/cobol-CPD3EJfO.js +0 -4
- package/dist/cobol-D19g8SyZ.js +0 -10
- package/dist/code-block-QI2IAROF-CJ80GtCm.js +0 -8572
- package/dist/codeowners-DOHu4JsD.js +0 -4
- package/dist/codeql-Bv-kyldE.js +0 -4
- package/dist/coffee-BSWTbMgj.js +0 -5
- package/dist/coffeescript-KD9TnEnS.js +0 -4
- package/dist/common-lisp-DuUbiL1M.js +0 -4
- package/dist/commonlisp-DNEULz_Q.js +0 -4
- package/dist/coq-BLENpWYo.js +0 -4
- package/dist/cpp-BFMcsgZ1.js +0 -18
- package/dist/cpp-J7hKFkZz.js +0 -4
- package/dist/crystal-BoGe6xAc.js +0 -18
- package/dist/crystal-DVPNgAPQ.js +0 -4
- package/dist/csharp-Bi0R0O8M.js +0 -4
- package/dist/csharp-CEsbqhVz.js +0 -4
- package/dist/css-Dkaj1ML5.js +0 -4
- package/dist/css-fq3a1AH1.js +0 -4
- package/dist/css-tx1M2UYO.js +0 -4
- package/dist/csv-MeEBatsw.js +0 -4
- package/dist/cue-DBMXnBGO.js +0 -4
- package/dist/cypher-DiUnNCqR.js +0 -4
- package/dist/cypher-Dtzq0BP7.js +0 -4
- package/dist/d-CY8xRV-6.js +0 -4
- package/dist/d-DcZudIhJ.js +0 -4
- package/dist/dark-plus-Bx-XGUdv.js +0 -4
- package/dist/dart-DZ5DpAxj.js +0 -4
- package/dist/dax-Heo0fec8.js +0 -4
- package/dist/desktop-CIXrTzSI.js +0 -4
- package/dist/diff-CM1HFG4F.js +0 -4
- package/dist/diff-D9BPDC3o.js +0 -4
- package/dist/diff-FiILeNDL.js +0 -4
- package/dist/dist-8tG5l853.js +0 -5
- package/dist/dist-BXvOBlRl.js +0 -5
- package/dist/dist-BkSNcgv8.js +0 -5
- package/dist/dist-Bu4pyZoX.js +0 -8
- package/dist/dist-C1PN9EmN.js +0 -8
- package/dist/dist-C5R1jOyp.js +0 -8
- package/dist/dist-C7SYDWEd.js +0 -5
- package/dist/dist-CLZuU2Bs.js +0 -5
- package/dist/dist-Cjy_pAHy.js +0 -8
- package/dist/dist-jeJh-w1R.js +0 -5
- package/dist/docker-BpLHnOZG.js +0 -4
- package/dist/dotenv-B-FeoaI3.js +0 -4
- package/dist/dracula-soft-vgd7ckob.js +0 -4
- package/dist/dracula-yEIVSENH.js +0 -4
- package/dist/dream-maker-j9DfKXJZ.js +0 -4
- package/dist/dtd-FhG-tVom.js +0 -4
- package/dist/dylan-HWpZOBPw.js +0 -4
- package/dist/ecl-B_rcje1I.js +0 -4
- package/dist/edge-BvTSoBD4.js +0 -12
- package/dist/eiffel-oqHyHs6f.js +0 -4
- package/dist/elixir-Dy-Nd45s.js +0 -5
- package/dist/elm-B62RQEds.js +0 -4
- package/dist/elm-BbBZ4HBJ.js +0 -5
- package/dist/emacs-lisp-BlKF8SK8.js +0 -4
- package/dist/erb-DfDHVhmE.js +0 -10
- package/dist/erlang-CjRjjA-B.js +0 -4
- package/dist/erlang-DL9YWH5B.js +0 -5
- package/dist/everforest-dark-DTO3RYvZ.js +0 -4
- package/dist/everforest-light-BLftNDeA.js +0 -4
- package/dist/factor-CGH_TnIV.js +0 -4
- package/dist/fennel-CJpQobBl.js +0 -4
- package/dist/fish-Dvq3omMv.js +0 -4
- package/dist/fluent-_glkAdRk.js +0 -4
- package/dist/forth-5N06oHNp.js +0 -4
- package/dist/fortran-fixed-form-DvmVLEcO.js +0 -5
- package/dist/fortran-free-form-BRZ1-G2x.js +0 -4
- package/dist/fortran-free-form-C3kgUwfa.js +0 -4
- package/dist/fortran-wZ-sNg3h.js +0 -4
- package/dist/fsharp-B7-jsQMl.js +0 -5
- package/dist/gas-3H4_FaS8.js +0 -4
- package/dist/gdresource-7F-q_Vav.js +0 -10
- package/dist/gdscript-B0eENwgc.js +0 -4
- package/dist/gdscript-DAHEG9Ry.js +0 -4
- package/dist/gdshader-DPYtQQW0.js +0 -4
- package/dist/gdshader-o6WS_GvU.js +0 -4
- package/dist/genie-Bnhk4Ege.js +0 -4
- package/dist/gherkin-N8YTYIme.js +0 -4
- package/dist/gherkin-PEA2uy50.js +0 -4
- package/dist/git-commit-Cv7QTAeJ.js +0 -5
- package/dist/git-rebase-DwX3Nm0e.js +0 -5
- package/dist/github-dark-B0rIFWbz.js +0 -4
- package/dist/github-dark-default-nWsHqmZA.js +0 -4
- package/dist/github-dark-dimmed-CZ-OQfZw.js +0 -4
- package/dist/github-dark-high-contrast-C3y_w9do.js +0 -4
- package/dist/github-light-CNXzdGuc.js +0 -4
- package/dist/github-light-default-C332Nkmd.js +0 -4
- package/dist/github-light-high-contrast-5fIb4Zrv.js +0 -4
- package/dist/gleam-CXNzRrCZ.js +0 -4
- package/dist/glimmer-js-gufzGuES.js +0 -14
- package/dist/glimmer-ts-D4X2QK5Z.js +0 -14
- package/dist/glsl-CImM3sHk.js +0 -5
- package/dist/glsl-DEg5Ez62.js +0 -4
- package/dist/gnuplot-CBwhenUK.js +0 -4
- package/dist/go-5JnSf2Sn.js +0 -4
- package/dist/go-DY_IL4bk.js +0 -4
- package/dist/graphql-BaqLgJ_M.js +0 -4
- package/dist/graphql-DL2bM2N0.js +0 -14
- package/dist/groovy-DZzbvCP1.js +0 -4
- package/dist/groovy-bcQsAePx.js +0 -4
- package/dist/gruvbox-dark-hard-9eAHcVSP.js +0 -4
- package/dist/gruvbox-dark-medium-BcwJobmL.js +0 -4
- package/dist/gruvbox-dark-soft-DFhXDq1u.js +0 -4
- package/dist/gruvbox-light-hard-CGFqWfyc.js +0 -4
- package/dist/gruvbox-light-medium-hf-MZPsQ.js +0 -4
- package/dist/gruvbox-light-soft-CEDN8Nz_.js +0 -4
- package/dist/hack-B8wSahCf.js +0 -10
- package/dist/haml-Bu4NUveo.js +0 -10
- package/dist/haml-DIZmvqcW.js +0 -4
- package/dist/handlebars-COjOLWnq.js +0 -14
- package/dist/haskell-CExLTzho.js +0 -4
- package/dist/haskell-DCN6ynrk.js +0 -4
- package/dist/haxe-Cop3U-K-.js +0 -4
- package/dist/haxe-Dwfa4QhR.js +0 -4
- package/dist/haxe-f3pVb8qU.js +0 -5
- package/dist/hcl-Db_02Xo4.js +0 -4
- package/dist/hjson-ChDlI-VU.js +0 -4
- package/dist/hlsl-Cqu4CHBc.js +0 -4
- package/dist/hlsl-DEFh66jF.js +0 -4
- package/dist/houston-B8kM6xwu.js +0 -4
- package/dist/html-derivative-D0ctPnGn.js +0 -4
- package/dist/html-derivative-Dtt7T8QF.js +0 -5
- package/dist/html-hTZprlyJ.js +0 -10
- package/dist/html-lq9Ir_fH.js +0 -4
- package/dist/http-csf0B_nN.js +0 -14
- package/dist/hxml-BwN3yN1f.js +0 -5
- package/dist/hy-BWKVYLAU.js +0 -4
- package/dist/idl-BbWlJ0gk.js +0 -4
- package/dist/imba-BdgJpELv.js +0 -4
- package/dist/ini--03_cr_s.js +0 -4
- package/dist/java-DgtnNxg2.js +0 -4
- package/dist/java-DxqbIJE2.js +0 -4
- package/dist/javascript-BdS4qSDJ.js +0 -4
- package/dist/javascript-eMOhp6Aq.js +0 -4
- package/dist/javascript-mK9HLbGj.js +0 -4
- package/dist/jinja-CDb6qdQt.js +0 -5
- package/dist/jison-DyKFip1k.js +0 -5
- package/dist/json-DMbsiPEv.js +0 -4
- package/dist/json-DeQXWHxY.js +0 -4
- package/dist/json5-COCd-fTe.js +0 -4
- package/dist/jsonc-B_GrcWIn.js +0 -4
- package/dist/jsonl-CI61BqMn.js +0 -4
- package/dist/jsonnet-BuWuUqqD.js +0 -4
- package/dist/jssm-D7Rh9Uc6.js +0 -4
- package/dist/jsx-CI1WNtr2.js +0 -4
- package/dist/jsx-Do4BHov2.js +0 -4
- package/dist/julia-C6w3Rvqb.js +0 -4
- package/dist/julia-D5XWzItl.js +0 -16
- package/dist/kanagawa-dragon-hLxsgONk.js +0 -4
- package/dist/kanagawa-lotus-BHRbOuiK.js +0 -4
- package/dist/kanagawa-wave-CjDPcOcS.js +0 -4
- package/dist/kotlin-Do-Dqx9m.js +0 -4
- package/dist/kusto-BeQOeA5N.js +0 -4
- package/dist/laserwave-ohbp9Jiz.js +0 -4
- package/dist/latex-DqJGIiu_.js +0 -5
- package/dist/lean-Clg9aEzr.js +0 -4
- package/dist/less-C3d7xP2W.js +0 -4
- package/dist/less-UHqrKu57.js +0 -4
- package/dist/light-plus-CSE8StgD.js +0 -4
- package/dist/liquid-Dqcanmhn.js +0 -14
- package/dist/livescript-ChQl9lD-.js +0 -4
- package/dist/llvm-DWkTGdnM.js +0 -4
- package/dist/log-CErlyO_4.js +0 -4
- package/dist/logo-Yu9llBXK.js +0 -4
- package/dist/lua-BFsKLCaI.js +0 -5
- package/dist/lua-CiDvI96j.js +0 -4
- package/dist/lua-GfOSGOZ-.js +0 -4
- package/dist/luau-JH-VfaDk.js +0 -4
- package/dist/make-B4hx8tTG.js +0 -4
- package/dist/markdown-BWuRHX75.js +0 -4
- package/dist/markdown-D07chUcD.js +0 -4
- package/dist/marked.esm-BiQFxVJV.js +0 -1373
- package/dist/marko-Bxd2zSuF.js +0 -14
- package/dist/material-theme-Caotz7xa.js +0 -4
- package/dist/material-theme-darker-DA3xYhnK.js +0 -4
- package/dist/material-theme-lighter-Dt5GVhSw.js +0 -4
- package/dist/material-theme-ocean-Cn25Md08.js +0 -4
- package/dist/material-theme-palenight-BChdM80H.js +0 -4
- package/dist/mathematica-ClVO4k7N.js +0 -4
- package/dist/matlab-DhbmgJrG.js +0 -4
- package/dist/mbox-BEI7DeUg.js +0 -4
- package/dist/mdc-6jIdEm7u.js +0 -12
- package/dist/mdx-DrOosndL.js +0 -4
- package/dist/mermaid-B4Jv70w2.js +0 -4
- package/dist/mermaid-D7wtYc6C.js +0 -94
- package/dist/mermaid-NA5CF7SZ-BUMY4R2n.js +0 -8
- package/dist/mermaid.core-BfgNMETw.js +0 -19
- package/dist/min-dark-BtkGP5of.js +0 -4
- package/dist/min-light-DVB0pOsq.js +0 -4
- package/dist/mipsasm-CbiVgyrL.js +0 -4
- package/dist/mirc-DwidJ3iH.js +0 -4
- package/dist/mllike-Dspdy0xJ.js +0 -6
- package/dist/modelica-CIUejP-L.js +0 -4
- package/dist/mojo-oCJmcfe0.js +0 -4
- package/dist/monokai-sXaBCV8W.js +0 -4
- package/dist/move-uqw57ayE.js +0 -4
- package/dist/mscgen-BWXU4Omp.js +0 -6
- package/dist/mumps-PHFFoPk5.js +0 -4
- package/dist/narrat-D5L3ivBF.js +0 -4
- package/dist/nextflow-Dzk2_1yO.js +0 -4
- package/dist/nginx-BsYwbveJ.js +0 -5
- package/dist/night-owl-bwU2KJrI.js +0 -4
- package/dist/nim-B9PRs1V9.js +0 -20
- package/dist/nix-CQXQnSxk.js +0 -4
- package/dist/nord-BIb_ag00.js +0 -4
- package/dist/nsis-B7xooKLf.js +0 -4
- package/dist/ntriples-DnOgtCzG.js +0 -4
- package/dist/nushell-9HBKTMRY.js +0 -4
- package/dist/objective-c-BdQwOoOq.js +0 -4
- package/dist/objective-cpp-Dnlxu7P8.js +0 -4
- package/dist/ocaml-BPPNJmg4.js +0 -4
- package/dist/octave-Cn5kH_QT.js +0 -4
- package/dist/one-dark-pro-Cf2MYqoR.js +0 -4
- package/dist/one-light-D4J9mH5L.js +0 -4
- package/dist/oz-DR-sROpu.js +0 -4
- package/dist/pascal-CPKK1zcS.js +0 -4
- package/dist/pascal-DZawRZnt.js +0 -4
- package/dist/perl-D7FuFdyd.js +0 -4
- package/dist/perl-DcaL6DAN.js +0 -16
- package/dist/php-C3dNQJ69.js +0 -4
- package/dist/php-CQBUGN8t.js +0 -18
- package/dist/pig-CEXnOAnI.js +0 -4
- package/dist/plastic-Bxetw03u.js +0 -4
- package/dist/plsql-Cr9PKKdd.js +0 -4
- package/dist/po-Buj9_8uj.js +0 -4
- package/dist/poimandres-f5X1KNHY.js +0 -4
- package/dist/polar-DaxpU9SY.js +0 -4
- package/dist/postcss-D0yHN3os.js +0 -4
- package/dist/postcss-_e11hEYq.js +0 -4
- package/dist/powerquery-BBrNhg4L.js +0 -4
- package/dist/powershell-BKvWab7q.js +0 -4
- package/dist/powershell-xOwLOHr7.js +0 -4
- package/dist/prisma-B6USmJON.js +0 -4
- package/dist/prolog-_-xlpTu3.js +0 -4
- package/dist/properties-7jnK_vYx.js +0 -4
- package/dist/proto-Fsc93mrf.js +0 -4
- package/dist/protobuf-4rslMjEN.js +0 -4
- package/dist/pug-BVwdEv4r.js +0 -4
- package/dist/pug-DQxLbQkr.js +0 -12
- package/dist/puppet-ClkE3Bbh.js +0 -4
- package/dist/puppet-iSHg_1Z2.js +0 -4
- package/dist/purescript-DBXsSG64.js +0 -4
- package/dist/python-Be-hJfoQ.js +0 -4
- package/dist/python-D8Qe4P9O.js +0 -4
- package/dist/python-tK3wUCn0.js +0 -4
- package/dist/q-DP_Dcoox.js +0 -4
- package/dist/qml-axZuKIq7.js +0 -5
- package/dist/qmldir-U7eiStHf.js +0 -4
- package/dist/qss-C6xK3i2A.js +0 -4
- package/dist/r-B8xYZSka.js +0 -4
- package/dist/r-Bj_pNGwX.js +0 -4
- package/dist/r-C32wHLYu.js +0 -4
- package/dist/racket-Bplgy3qa.js +0 -4
- package/dist/raku-CXfaTnnI.js +0 -4
- package/dist/razor-BUotMkk4.js +0 -10
- package/dist/react-vega-TDd7xMuh.js +0 -9
- package/dist/red-B23zS7fW.js +0 -4
- package/dist/reg-BOAFDp6X.js +0 -4
- package/dist/regexp-BQX_RqKY.js +0 -4
- package/dist/regexp-CgVCPIqt.js +0 -4
- package/dist/rel-C94onwJb.js +0 -4
- package/dist/riscv-DRS1x6ty.js +0 -4
- package/dist/rose-pine-Y3EcMiNE.js +0 -4
- package/dist/rose-pine-dawn-CdolLHqO.js +0 -4
- package/dist/rose-pine-moon-C_zpj202.js +0 -4
- package/dist/rpm-BbDBUfs9.js +0 -5
- package/dist/rst-CcbqEUWW.js +0 -22
- package/dist/ruby-CFajY3gR.js +0 -30
- package/dist/ruby-COfWUiIr.js +0 -4
- package/dist/ruby-zIsg3mjP.js +0 -4
- package/dist/rust-DBsDzz6s.js +0 -4
- package/dist/sas-4hY7456Y.js +0 -5
- package/dist/sas-y_Hue2-X.js +0 -4
- package/dist/sass-Cp8wMMoM.js +0 -4
- package/dist/scala-DYheJtuA.js +0 -4
- package/dist/scheme-7jTCqHw8.js +0 -4
- package/dist/scheme-CGftW0fR.js +0 -4
- package/dist/scss-C847tmc7.js +0 -5
- package/dist/scss-COYAhSrh.js +0 -4
- package/dist/sdbl-BVPPkqm9.js +0 -4
- package/dist/sdbl-LKt9ej7G.js +0 -4
- package/dist/shaderlab-D4RJoI87.js +0 -5
- package/dist/shell-DAqJWXDk.js +0 -4
- package/dist/shellscript-Bt_mtfyS.js +0 -4
- package/dist/shellscript-DTwJmk-B.js +0 -4
- package/dist/shellsession-BXPPO6fw.js +0 -5
- package/dist/sieve-EaqnbCO3.js +0 -4
- package/dist/slack-dark-D98uHpYH.js +0 -4
- package/dist/slack-ochin-D2JGK2Dx.js +0 -4
- package/dist/smalltalk-CJQ4atCz.js +0 -4
- package/dist/smalltalk-DL03YKLJ.js +0 -4
- package/dist/snazzy-light-BhqH4Tt0.js +0 -4
- package/dist/solarized-dark-Cz8Hpdk8.js +0 -4
- package/dist/solarized-light-DSXO0VGL.js +0 -4
- package/dist/solidity-nZ_5BOHX.js +0 -4
- package/dist/soy-C8ioljmY.js +0 -5
- package/dist/sparql-DTA-tQ_q.js +0 -4
- package/dist/sparql-ntHLy-Z_.js +0 -5
- package/dist/splunk-BDj1WtBS.js +0 -4
- package/dist/sql-B_CzXDN7.js +0 -4
- package/dist/sql-hBa00soP.js +0 -4
- package/dist/ssh-config-VL2EBnHI.js +0 -4
- package/dist/stata-CAE5q-ng.js +0 -5
- package/dist/stateDiagram-v2-4FDKWEC3-B4itMUHi.js +0 -30
- package/dist/stex-KfRnSHzF.js +0 -4
- package/dist/stylus-BI8hQQzs.js +0 -4
- package/dist/stylus-CfjeFry_.js +0 -4
- package/dist/stylus-DIZq08hz.js +0 -4
- package/dist/svelte-GcilG7nn.js +0 -14
- package/dist/swift-CVCEbRPJ.js +0 -4
- package/dist/swift-Dl0RRDbH.js +0 -4
- package/dist/synthwave-84-Brwqp6Rc.js +0 -4
- package/dist/system-verilog-oFNqWct0.js +0 -4
- package/dist/systemd-Dk99d5qb.js +0 -4
- package/dist/talonscript-oS-JP1qz.js +0 -4
- package/dist/tasl-eNb7V7lL.js +0 -4
- package/dist/tcl-CQPp2bcg.js +0 -4
- package/dist/tcl-wv9O7fLZ.js +0 -4
- package/dist/templ-CBxszNIk.js +0 -12
- package/dist/terraform-CdD8ZgoG.js +0 -4
- package/dist/tex-BDBUrlZ_.js +0 -4
- package/dist/tex-Drp1pMRL.js +0 -5
- package/dist/textile-DzMRCBcV.js +0 -4
- package/dist/tokyo-night-CmOikx9i.js +0 -4
- package/dist/toml-CyIWqgbe.js +0 -4
- package/dist/toml-oDtxM9oL.js +0 -4
- package/dist/troff-_huin_CY.js +0 -4
- package/dist/ts-tags-CXewkOF3.js +0 -38
- package/dist/tsv-BseyLYQT.js +0 -4
- package/dist/tsx-D2LUWtsu.js +0 -4
- package/dist/tsx-kHCj4PrF.js +0 -4
- package/dist/ttcn-BEiJuYYc.js +0 -4
- package/dist/ttcn-cfg-DB6Ksh67.js +0 -4
- package/dist/turtle-CzEhuAap.js +0 -4
- package/dist/turtle-Dv3esCo-.js +0 -4
- package/dist/turtle-DzhzGEum.js +0 -4
- package/dist/twig-qB_T-k-S.js +0 -18
- package/dist/typescript-BN_vTPvq.js +0 -4
- package/dist/typescript-CI5sQpw1.js +0 -4
- package/dist/typespec-DHEcpagp.js +0 -4
- package/dist/typst-B9HpBJka.js +0 -4
- package/dist/v-H2_8AIAM.js +0 -4
- package/dist/vala-WHi-ThcB.js +0 -4
- package/dist/vb-CS8PoU3R.js +0 -4
- package/dist/vb-CngKZQHu.js +0 -4
- package/dist/vbscript-BV_8nbeM.js +0 -4
- package/dist/velocity-IqE7qYKE.js +0 -4
- package/dist/verilog-BGgTS1pK.js +0 -4
- package/dist/verilog-xtyaWTnc.js +0 -4
- package/dist/vesper-2sgFZerP.js +0 -4
- package/dist/vhdl-7aI3JU7f.js +0 -4
- package/dist/vhdl-BaqXCtf3.js +0 -4
- package/dist/viml-C3IDTTfq.js +0 -4
- package/dist/vitesse-black-BvCrVr8N.js +0 -4
- package/dist/vitesse-dark-DNi7aZj7.js +0 -4
- package/dist/vitesse-light-CXSVQ3oK.js +0 -4
- package/dist/vue-CHooyK57.js +0 -4
- package/dist/vue-ChlIPquu.js +0 -22
- package/dist/vue-html-DPVg93T0.js +0 -10
- package/dist/vue-vine-HiBtkWC6.js +0 -20
- package/dist/vyper-D18q9xCG.js +0 -4
- package/dist/wasm-CRlswj2T.js +0 -6
- package/dist/wasm-DZ1eFFdg.js +0 -4
- package/dist/webidl-BDB8PTTO.js +0 -4
- package/dist/wenyan-D3TBOs3h.js +0 -4
- package/dist/wgsl-BCsR2nKB.js +0 -4
- package/dist/wikitext-DIh6m2jB.js +0 -4
- package/dist/wit-Bz-r96TS.js +0 -4
- package/dist/wolfram-VIrnwGuX.js +0 -4
- package/dist/xml-CAP1bJV9.js +0 -4
- package/dist/xml-HKKjDs8r.js +0 -5
- package/dist/xquery-BIC-qj9Z.js +0 -4
- package/dist/xsl-HaaO21x0.js +0 -5
- package/dist/yacas-ifv5tftd.js +0 -4
- package/dist/yaml-BTiN8kgB.js +0 -4
- package/dist/yaml-B_O-W3eE.js +0 -4
- package/dist/z80-B8zOMVNt.js +0 -4
- package/dist/zenscript-BrGwAsAB.js +0 -4
- package/dist/zig-Chio8vL6.js +0 -4
- /package/dist/{ImageComparisonComponent-DXQrGLfG.js → ImageComparisonComponent-Bijp8beW.js} +0 -0
- /package/dist/{_arrayReduce-BoSa0zEn.js → _arrayReduce-DlK7U3Q6.js} +0 -0
- /package/dist/{_hasUnicode-zxc9hjSW.js → _hasUnicode-Bz2x6u6r.js} +0 -0
- /package/dist/{apl-DRxKiEot.js → apl-D9gTcP3Q.js} +0 -0
- /package/dist/{array-D-nrDupM.js → array-D7wW5QoO.js} +0 -0
- /package/dist/{asciiarmor-C8HoXFIm.js → asciiarmor-mLyg-Z5h.js} +0 -0
- /package/dist/{asn1-9Bo0DYT-.js → asn1-AE7eHomk.js} +0 -0
- /package/dist/{asterisk-eIhOKJFP.js → asterisk-Crp-Pien.js} +0 -0
- /package/dist/{brainfuck-Db8njC-p.js → brainfuck-Bdd6NcL6.js} +0 -0
- /package/dist/{chunk-XAJISQIX-DhEh08v5.js → chunk-XAJISQIX-CZ8Bi1-x.js} +0 -0
- /package/dist/{click-outside-container-D90VWx_r.js → click-outside-container-BCN5BtVO.js} +0 -0
- /package/dist/{clike-CFhUNtI5.js → clike-D_s3fKg5.js} +0 -0
- /package/dist/{clojure-CX7oovsp.js → clojure-zTYBCd80.js} +0 -0
- /package/dist/{cmake-C29AR2kk.js → cmake-BnJV90fC.js} +0 -0
- /package/dist/{cobol-CNkuRW9i.js → cobol-CH0OZO8A.js} +0 -0
- /package/dist/{coffeescript-BJAbfGam.js → coffeescript-CLhc1U6Q.js} +0 -0
- /package/dist/{colors-6nB_pSln.js → colors-6DRQ0kEF.js} +0 -0
- /package/dist/{common-keywords-DDkFNc6Q.js → common-keywords-NhoiR-2S.js} +0 -0
- /package/dist/{commonlisp-BTNhj2l9.js → commonlisp-8K2-IkUD.js} +0 -0
- /package/dist/{constants-DuN_eoAL.js → constants-DrOu5vvd.js} +0 -0
- /package/dist/{crystal-CZc0nIm9.js → crystal-8to4H-ep.js} +0 -0
- /package/dist/{css-L2-0OTXc.js → css-BVo-JOy5.js} +0 -0
- /package/dist/{cypher-Dnc6MXl0.js → cypher-BTFaDDd_.js} +0 -0
- /package/dist/{cytoscape.esm-Cs5lDB24.js → cytoscape.esm-CgJFiP_E.js} +0 -0
- /package/dist/{d-C6X9iIga.js → d-c9bddW2W.js} +0 -0
- /package/dist/{defaultLocale-DMZFeDB8.js → defaultLocale-Bxoo2-30.js} +0 -0
- /package/dist/{defaultLocale-DZtxSCkJ.js → defaultLocale-qS7DaAmi.js} +0 -0
- /package/dist/{diff-ZzKinYqY.js → diff-PA28xMKg.js} +0 -0
- /package/dist/{dist-wEzfBIGs.js → dist-9J8_3DZN.js} +0 -0
- /package/dist/{dist-GFp3A63i.js → dist-9trj4p6n.js} +0 -0
- /package/dist/{dist-DJTgoown.js → dist-BKGWAN8J.js} +0 -0
- /package/dist/{dist-XmKjmDjd.js → dist-BSMZYwqW.js} +0 -0
- /package/dist/{dist-BjWd_Ei9.js → dist-BYznkC5E.js} +0 -0
- /package/dist/{dist-CQ1gja1c.js → dist-BbQ-5HAA.js} +0 -0
- /package/dist/{dist-DsOyFflT.js → dist-CPd_adhw.js} +0 -0
- /package/dist/{dist-BWkp5r3D.js → dist-Cpj5BHNP.js} +0 -0
- /package/dist/{dist-BbaKVjkP.js → dist-CsN7lsea.js} +0 -0
- /package/dist/{dist-DMO79xnD.js → dist-DIVeCGlI.js} +0 -0
- /package/dist/{dist-Bhe0YLr5.js → dist-DsqQCNKw.js} +0 -0
- /package/dist/{dist-BOmxya4k.js → dist-MFzhAmKV.js} +0 -0
- /package/dist/{dist-DYUqP2g4.js → dist-l0KayR2-.js} +0 -0
- /package/dist/{dtd-CytEpkAo.js → dtd-DRlC7Bx8.js} +0 -0
- /package/dist/{duckdb-keywords-q-LipmQC.js → duckdb-keywords-BnNtuiVz.js} +0 -0
- /package/dist/{dylan-CZByFBEQ.js → dylan-d5ufc25E.js} +0 -0
- /package/dist/{ebnf-DuGDVaIM.js → ebnf-CFKHGc8c.js} +0 -0
- /package/dist/{ecl-Cp7L1F5B.js → ecl-Ci3afVKc.js} +0 -0
- /package/dist/{eiffel-C66yjnFL.js → eiffel-G6DmeEi3.js} +0 -0
- /package/dist/{elm-DtHo-73e.js → elm-ByYWHu8b.js} +0 -0
- /package/dist/{emotion-is-prop-valid.esm-_z-EwK5u.js → emotion-is-prop-valid.esm--WpIBtj8.js} +0 -0
- /package/dist/{erlang-C_sj44mF.js → erlang-C7_LcVDw.js} +0 -0
- /package/dist/{esm-JeWm05ae.js → esm-CAd2HmbR.js} +0 -0
- /package/dist/{fcl-DtWOm1i5.js → fcl-DPZwieM9.js} +0 -0
- /package/dist/{forth-CIDHh56T.js → forth-BgUerAyz.js} +0 -0
- /package/dist/{fortran-BQrDVXRU.js → fortran-BCXxm4xF.js} +0 -0
- /package/dist/{gas-D4HQPB0Q.js → gas-CKTQRKLl.js} +0 -0
- /package/dist/{gherkin-UB2gJHdT.js → gherkin-ByVP9cY_.js} +0 -0
- /package/dist/{groovy-DVz6jkOx.js → groovy-BPbrw0GZ.js} +0 -0
- /package/dist/{haskell-CpUdAPCz.js → haskell-B8fq1DW4.js} +0 -0
- /package/dist/{haxe-DCV5_cqD.js → haxe-B7SHQmJo.js} +0 -0
- /package/dist/{http-Q5Xt0h8Z.js → http-AQJFxSug.js} +0 -0
- /package/dist/{idl-D7WCIgHw.js → idl-CeJBDjsl.js} +0 -0
- /package/dist/{init-Ci8VD8ZH.js → init-BfRhston.js} +0 -0
- /package/dist/{invariant-BW72tHBT.js → invariant-D9QLJ4SZ.js} +0 -0
- /package/dist/{isString-B0JuKBai.js → isString-Clqvtgmo.js} +0 -0
- /package/dist/{javascript-B2Rn0Lmd.js → javascript-dCv9_Kn8.js} +0 -0
- /package/dist/{julia-ApprtEaw.js → julia-CD5lO88_.js} +0 -0
- /package/dist/{katex-BTobf3T8.js → katex-Dm9nZf6A.js} +0 -0
- /package/dist/{livescript-BMLIlM7C.js → livescript-Cc8RvFBv.js} +0 -0
- /package/dist/{lua-DdDaW3tC.js → lua-4nedfnvd.js} +0 -0
- /package/dist/{main-DC-71ZOX.js → main-DhFbkwoC.js} +0 -0
- /package/dist/{math-HUZifhTs.js → math-BbMyrONz.js} +0 -0
- /package/dist/{mathematica-PnNN7c2Z.js → mathematica-BIufdZr2.js} +0 -0
- /package/dist/{mbox-B84OtHBK.js → mbox-DQkYSHKe.js} +0 -0
- /package/dist/{memoize-BctRJDZ2.js → memoize-Bag7B41I.js} +0 -0
- /package/dist/{mirc-BVWXJxIq.js → mirc-CI-RWqUR.js} +0 -0
- /package/dist/{mllike-BawXWupH.js → mllike-DQzbf1xo.js} +0 -0
- /package/dist/{modelica-C8-X4Hf_.js → modelica-BnF_cDWj.js} +0 -0
- /package/dist/{mscgen-BOM6dDj8.js → mscgen-MirFrDhW.js} +0 -0
- /package/dist/{mumps-DQOY8n05.js → mumps-eNRTuWOD.js} +0 -0
- /package/dist/{nginx-Ynlf_cSR.js → nginx-hpek_Tnq.js} +0 -0
- /package/dist/{node-sql-parser-DW04P3RY.js → node-sql-parser-ChQUJk8A.js} +0 -0
- /package/dist/{ntriples-DU8VrXdW.js → ntriples-BLneip4i.js} +0 -0
- /package/dist/{octave-BzTIBsQ8.js → octave-C0eG-pKq.js} +0 -0
- /package/dist/{oz-DKFcZsoi.js → oz-BPMLow2T.js} +0 -0
- /package/dist/{pascal-DHBZ15pT.js → pascal-5eb9v5Dl.js} +0 -0
- /package/dist/{path-BVI7RNUv.js → path-C_x2ySFi.js} +0 -0
- /package/dist/{perl-75NMI3w0.js → perl-DOu6rCkF.js} +0 -0
- /package/dist/{pig-B-HY1fo_.js → pig-CRW0kne3.js} +0 -0
- /package/dist/{powershell-DEH22U53.js → powershell-CWgJhiiJ.js} +0 -0
- /package/dist/{prop-types-DTzjue2h.js → prop-types-C9QZf2SY.js} +0 -0
- /package/dist/{properties-B1MzBoJC.js → properties-CHxpmfXW.js} +0 -0
- /package/dist/{protobuf-Dr14KV0p.js → protobuf-DGUXb_-T.js} +0 -0
- /package/dist/{puppet-C4z38l7v.js → puppet-C7uSiW6_.js} +0 -0
- /package/dist/{python-D2L7Nknt.js → python-DAbhVcUr.js} +0 -0
- /package/dist/{q-PxipHfgS.js → q-DKjWHias.js} +0 -0
- /package/dist/{r-CEMMu_Tf.js → r-KD2KhyeL.js} +0 -0
- /package/dist/{range-Bieq5MNc.js → range-BYuZFTbA.js} +0 -0
- /package/dist/{rpm-D3xyahkR.js → rpm-GFtnpQ6M.js} +0 -0
- /package/dist/{ruby-DwEkwdiu.js → ruby-CBAewzLY.js} +0 -0
- /package/dist/{sas-L1W0BRft.js → sas-CCi_AaZi.js} +0 -0
- /package/dist/{scheme-CTybTrX0.js → scheme-CGGGD6kR.js} +0 -0
- /package/dist/{shell-BSx3LZnu.js → shell-b7vZ8ucI.js} +0 -0
- /package/dist/{sieve-BjUfbv-6.js → sieve-ClXOUV85.js} +0 -0
- /package/dist/{simple-mode-IPZGFbI6.js → simple-mode-Uad4lEG7.js} +0 -0
- /package/dist/{smalltalk-BlzuYrMv.js → smalltalk-_PFt9_gp.js} +0 -0
- /package/dist/{solr-B0fQ5Uwe.js → solr-BSTJW269.js} +0 -0
- /package/dist/{sparql-BXKjQ0cK.js → sparql-BCF6qcHt.js} +0 -0
- /package/dist/{spreadsheet-o1pnCmTO.js → spreadsheet-CiBky1_y.js} +0 -0
- /package/dist/{sql-C_tD2xcJ.js → sql-BXZovj-z.js} +0 -0
- /package/dist/{stex-BIsgBmK4.js → stex-DrxP7bb3.js} +0 -0
- /package/dist/{stylus-CqrLLVnG.js → stylus-DMFZWz-G.js} +0 -0
- /package/dist/{swift-DIqvj3_G.js → swift-De2YpSxT.js} +0 -0
- /package/dist/{tcl-B8bOIGVK.js → tcl-jV8Xs_1k.js} +0 -0
- /package/dist/{textile-DZsjavD_.js → textile-D_zo778l.js} +0 -0
- /package/dist/{tiddlywiki-IyzniiDM.js → tiddlywiki-DLTDKQCh.js} +0 -0
- /package/dist/{tiki-Dw2XZEnT.js → tiki-tw_kBvbp.js} +0 -0
- /package/dist/{timer-CPsmIOdm.js → timer-pEiW44EO.js} +0 -0
- /package/dist/{toml-Uc7m08nl.js → toml-_M0gsKn5.js} +0 -0
- /package/dist/{treemap-DMn4tIJ7.js → treemap-BzS5cW_6.js} +0 -0
- /package/dist/{troff-GEl5wcXR.js → troff-B06gyD33.js} +0 -0
- /package/dist/{ttcn-pr4FDOLT.js → ttcn-DoQoQNUM.js} +0 -0
- /package/dist/{ttcn-cfg-dZQ_fWTH.js → ttcn-cfg-l_6PksD2.js} +0 -0
- /package/dist/{turtle-TPRDOknA.js → turtle-zEnD4bpn.js} +0 -0
- /package/dist/{vb-BJUAeTYr.js → vb-fUsnAuzb.js} +0 -0
- /package/dist/{vbscript-CcJ6Z3ic.js → vbscript-CVlD7uZQ.js} +0 -0
- /package/dist/{velocity-pq4ZMzU3.js → velocity-CHkEIdMC.js} +0 -0
- /package/dist/{verilog-timMNjHt.js → verilog-B3ctZTB4.js} +0 -0
- /package/dist/{vhdl-DYFbVKNm.js → vhdl-rXdBgR5O.js} +0 -0
- /package/dist/{webidl-pue9oqnb.js → webidl-Cv9aQfcc.js} +0 -0
- /package/dist/{xquery-DeItGynK.js → xquery-Du0w47aa.js} +0 -0
- /package/dist/{yacas-By2Qrjba.js → yacas-Eq4p_g3L.js} +0 -0
- /package/dist/{z80-C7iLsyPC.js → z80-Dz4HTTRf.js} +0 -0
- /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(
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
|
362
|
-
|
|
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(
|
|
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
|
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { captureIframeAsImage } from "../iframe";
|
|
4
|
+
|
|
5
|
+
// Mock html-to-image
|
|
6
|
+
vi.mock("html-to-image", () => ({
|
|
7
|
+
toPng: vi.fn().mockResolvedValue("data:image/png;base64,mock"),
|
|
8
|
+
}));
|
|
9
|
+
|
|
10
|
+
describe("captureIframeAsImage", () => {
|
|
11
|
+
const originalCreateElement = document.createElement.bind(document);
|
|
12
|
+
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
// Mock devicePixelRatio
|
|
15
|
+
Object.defineProperty(window, "devicePixelRatio", {
|
|
16
|
+
value: 1,
|
|
17
|
+
writable: true,
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// Mock canvas for placeholder generation
|
|
21
|
+
vi.spyOn(document, "createElement").mockImplementation((tagName) => {
|
|
22
|
+
const element = originalCreateElement(tagName);
|
|
23
|
+
if (tagName === "canvas") {
|
|
24
|
+
const mockCtx = {
|
|
25
|
+
scale: vi.fn(),
|
|
26
|
+
fillStyle: "",
|
|
27
|
+
fillRect: vi.fn(),
|
|
28
|
+
strokeStyle: "",
|
|
29
|
+
strokeRect: vi.fn(),
|
|
30
|
+
font: "",
|
|
31
|
+
textAlign: "",
|
|
32
|
+
textBaseline: "",
|
|
33
|
+
fillText: vi.fn(),
|
|
34
|
+
measureText: vi.fn().mockReturnValue({ width: 10 }),
|
|
35
|
+
};
|
|
36
|
+
vi.spyOn(element as HTMLCanvasElement, "getContext").mockReturnValue(
|
|
37
|
+
mockCtx as unknown as CanvasRenderingContext2D,
|
|
38
|
+
);
|
|
39
|
+
vi.spyOn(element as HTMLCanvasElement, "toDataURL").mockReturnValue(
|
|
40
|
+
"data:image/png;base64,placeholder",
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
return element;
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
afterEach(() => {
|
|
48
|
+
vi.clearAllMocks();
|
|
49
|
+
vi.restoreAllMocks();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("should return null when element has no iframe", async () => {
|
|
53
|
+
const element = document.createElement("div");
|
|
54
|
+
element.innerHTML = "<p>No iframe here</p>";
|
|
55
|
+
|
|
56
|
+
const result = await captureIframeAsImage(element);
|
|
57
|
+
expect(result).toBeNull();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it("should return placeholder for external iframe", async () => {
|
|
61
|
+
const element = document.createElement("div");
|
|
62
|
+
element.innerHTML = '<iframe src="https://external.com/page"></iframe>';
|
|
63
|
+
|
|
64
|
+
const result = await captureIframeAsImage(element);
|
|
65
|
+
|
|
66
|
+
expect(result).not.toBeNull();
|
|
67
|
+
expect(result).toMatch(/^data:image\/png;base64,/);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("should return placeholder for cross-origin iframe", async () => {
|
|
71
|
+
const element = document.createElement("div");
|
|
72
|
+
element.innerHTML =
|
|
73
|
+
'<iframe src="https://www.openstreetmap.org/export/embed.html"></iframe>';
|
|
74
|
+
|
|
75
|
+
const result = await captureIframeAsImage(element);
|
|
76
|
+
|
|
77
|
+
expect(result).not.toBeNull();
|
|
78
|
+
expect(result).toMatch(/^data:image\/png;base64,/);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it("should return null for about:blank iframe without body", async () => {
|
|
82
|
+
const element = document.createElement("div");
|
|
83
|
+
const iframe = document.createElement("iframe");
|
|
84
|
+
iframe.src = "about:blank";
|
|
85
|
+
element.append(iframe);
|
|
86
|
+
|
|
87
|
+
// The iframe has no body accessible in jsdom
|
|
88
|
+
const result = await captureIframeAsImage(element);
|
|
89
|
+
|
|
90
|
+
// In jsdom, contentDocument may not be accessible
|
|
91
|
+
expect(result).toBeNull();
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("should handle iframe with relative same-origin src", async () => {
|
|
95
|
+
const element = document.createElement("div");
|
|
96
|
+
element.innerHTML = '<iframe src="./@file/123.html"></iframe>';
|
|
97
|
+
|
|
98
|
+
// Same-origin relative URL, but contentDocument not accessible in jsdom
|
|
99
|
+
const result = await captureIframeAsImage(element);
|
|
100
|
+
|
|
101
|
+
// Returns null because jsdom can't access contentDocument for file URLs
|
|
102
|
+
expect(result).toBeNull();
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("should detect external URL from various formats", async () => {
|
|
106
|
+
const externalUrls = [
|
|
107
|
+
"https://example.com",
|
|
108
|
+
"http://external.org/path",
|
|
109
|
+
"https://sub.domain.com:8080/page",
|
|
110
|
+
];
|
|
111
|
+
|
|
112
|
+
for (const url of externalUrls) {
|
|
113
|
+
const element = document.createElement("div");
|
|
114
|
+
element.innerHTML = `<iframe src="${url}"></iframe>`;
|
|
115
|
+
|
|
116
|
+
const result = await captureIframeAsImage(element);
|
|
117
|
+
|
|
118
|
+
expect(result).not.toBeNull();
|
|
119
|
+
expect(result).toMatch(/^data:image\/png;base64,/);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it("should not treat same-origin URLs as external", async () => {
|
|
124
|
+
// Same-origin URLs - these should try to capture, not return placeholder
|
|
125
|
+
const sameOriginUrls = ["/local/path", "./relative/path", "../parent/path"];
|
|
126
|
+
|
|
127
|
+
for (const url of sameOriginUrls) {
|
|
128
|
+
const element = document.createElement("div");
|
|
129
|
+
element.innerHTML = `<iframe src="${url}"></iframe>`;
|
|
130
|
+
|
|
131
|
+
const result = await captureIframeAsImage(element);
|
|
132
|
+
|
|
133
|
+
// In jsdom, these return null because contentDocument isn't accessible
|
|
134
|
+
// but they should NOT return a placeholder (which would indicate external detection)
|
|
135
|
+
// The key is they don't trigger the external URL path
|
|
136
|
+
expect(result).toBeNull();
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
});
|