@marimo-team/islands 0.16.5 → 0.17.1

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 (681) hide show
  1. package/dist/{fullscreen-D1yTiBlu.js → Combination-De9yoNY5.js} +855 -795
  2. package/dist/{ConnectedDataExplorerComponent-D96i9G-X.js → ConnectedDataExplorerComponent-DuvpJOKp.js} +102 -123
  3. package/dist/{ImageComparisonComponent-D4Tv9QzJ.js → ImageComparisonComponent--etUl2pp.js} +2 -2
  4. package/dist/{_baseIsEqual-oN7pRNcM.js → _baseIsEqual-BFlyFUxC.js} +20 -20
  5. package/dist/{_basePickBy-CYvzhRjy.js → _basePickBy-gCCvtjgp.js} +3 -3
  6. package/dist/{_baseProperty-DGUdIBuu.js → _baseProperty-BuqBC0Ie.js} +5 -5
  7. package/dist/{_baseUniq-B5gfSl8S.js → _baseUniq-CKN9mEDq.js} +5 -5
  8. package/dist/any-language-editor-Du2Q_6IK.js +156 -0
  9. package/dist/apl-CUm2DGqh.js +4 -0
  10. package/dist/{arc-B1iVbHTB.js → arc-C_O2hc-b.js} +2 -2
  11. package/dist/architecture-O4VJ6CD3-PFw3eFBY.js +21 -0
  12. package/dist/{architectureDiagram-W76B3OCA-DkEhipkW.js → architectureDiagram-W76B3OCA-CrK99pJi.js} +41 -40
  13. package/dist/asciiarmor-lqJ78U01.js +4 -0
  14. package/dist/asn1-CjwpSTlW.js +4 -0
  15. package/dist/assets/__vite-browser-external-DHoMWs4M.js +1 -0
  16. package/dist/assets/worker-B6tH8gPO.js +54 -0
  17. package/dist/{blockDiagram-QIGZ2CNN-DZOqLMYa.js → blockDiagram-QIGZ2CNN-BJOEyO6w.js} +101 -111
  18. package/dist/brainfuck-ClvDI1dq.js +4 -0
  19. package/dist/{button-CEcjneWG.js → button-ADXOb_gX.js} +37 -40
  20. package/dist/{c4Diagram-FPNF74CW-DVaR7c9q.js → c4Diagram-FPNF74CW-7Pz_X9wF.js} +31 -54
  21. package/dist/{channel-Uh0KpgGW.js → channel-X-wRUxX6.js} +1 -1
  22. package/dist/{check-BK9zDfQk.js → check-COlaG7Ss.js} +1 -1
  23. package/dist/{chunk-3AY6CYHV-Dk2R2-S1.js → chunk-3AY6CYHV-BQH2fFpA.js} +37 -37
  24. package/dist/{chunk-4BX2VUAB-CqO6zUIz.js → chunk-4BX2VUAB-D-QtDCKM.js} +1 -1
  25. package/dist/{chunk-4KMFLZZN-CloTfTwP.js → chunk-4KMFLZZN-BirZvvJS.js} +220 -329
  26. package/dist/{chunk-55IACEB6-I0rmqTua.js → chunk-55IACEB6-DjtPYZKs.js} +1 -1
  27. package/dist/{chunk-6OXUPJBA-BuROSTmo.js → chunk-6OXUPJBA-CTnnqlzw.js} +7 -7
  28. package/dist/{chunk-7GE3RBXV-B1-tsIPP.js → chunk-7GE3RBXV-CT47hCrL.js} +1 -1
  29. package/dist/{chunk-ABZYJK2D-CLlso8tj.js → chunk-ABZYJK2D-B6ZsU6SR.js} +484 -1043
  30. package/dist/{chunk-BN7GFLIU-Db2-FjLn.js → chunk-BN7GFLIU-DYWEsrG4.js} +1 -1
  31. package/dist/{chunk-CVBHYZKI-BONeiloK.js → chunk-CVBHYZKI-BuzDGXz0.js} +3 -3
  32. package/dist/{chunk-CXMOBAN2-U9GJSP1d.js → chunk-CXMOBAN2-Bas2S5w1.js} +46 -54
  33. package/dist/chunk-EXTU4WIE-DXwNSukz.js +10 -0
  34. package/dist/{chunk-FMBD7UC4-DyV3BR_I.js → chunk-FMBD7UC4-CYKEpuPr.js} +1 -1
  35. package/dist/{chunk-JA3XYJ7Z-C9A1076P.js → chunk-JA3XYJ7Z-DcxfkcDC.js} +21 -25
  36. package/dist/{chunk-JEIROHC2-BGnFkSVq.js → chunk-JEIROHC2-C01ZIcIG.js} +1 -1
  37. package/dist/{chunk-K7UQS3LO-033LOsjK.js → chunk-K7UQS3LO-CmbT97MV.js} +7 -7
  38. package/dist/{chunk-KMC2YHZD-DT4Sq4Ld.js → chunk-KMC2YHZD-D64m-1E1.js} +1 -1
  39. package/dist/{chunk-QN33PNHL-gs44MZla.js → chunk-QN33PNHL-DjB0j8Dr.js} +2 -2
  40. package/dist/{chunk-QYVHNE3D-B8BO1AnT.js → chunk-QYVHNE3D-VA4W4oxG.js} +3 -4
  41. package/dist/{chunk-QZHKN3VN-CeN_GkU6.js → chunk-QZHKN3VN-KT0fl3Em.js} +1 -1
  42. package/dist/chunk-S3R3BYOJ-C5zmcMvn.js +380 -0
  43. package/dist/{chunk-T44TD3VJ-BwzD6YE0.js → chunk-T44TD3VJ-BMOgu-Hk.js} +1 -1
  44. package/dist/{chunk-TVAH2DTR-Bi6jpQJQ.js → chunk-TVAH2DTR-eKm8SKnH.js} +7 -8
  45. package/dist/{chunk-TZMSLE5B-D8klz2H_.js → chunk-TZMSLE5B-CQxFRiI2.js} +5 -6
  46. package/dist/{chunk-WFRQ32O7-CzSwSlN0.js → chunk-WFRQ32O7-Dg51o277.js} +1 -1
  47. package/dist/{chunk-WFWHJNB7-DN_cavM6.js → chunk-WFWHJNB7-DVLO98ge.js} +1 -1
  48. package/dist/{chunk-XRWGC2XP-Bb5eGNM2.js → chunk-XRWGC2XP-UNFKdWQh.js} +1 -1
  49. package/dist/{chunk-ZPAFE4SF-S5UYNb0V.js → chunk-ZPAFE4SF-DbCSwfLK.js} +22 -22
  50. package/dist/classDiagram-KNZD7YFC-HUFFxNdk.js +40 -0
  51. package/dist/classDiagram-v2-RKCZMP56-Dw7Acmuf.js +40 -0
  52. package/dist/{click-outside-container-DE4e7p1p.js → click-outside-container-2BH589Bq.js} +9 -14
  53. package/dist/{clike-Cg_DBrJ0.js → clike-Bc2PZzZQ.js} +1 -1
  54. package/dist/{clike-CxAz4p9E.js → clike-CytFO-kN.js} +1 -1
  55. package/dist/clojure-8GefCgPe.js +4 -0
  56. package/dist/{clone-Dk4FkKH0.js → clone-CCgVUJ6x.js} +1 -1
  57. package/dist/cmake-yAhT9H0F.js +4 -0
  58. package/dist/cobol-BmltueOY.js +4 -0
  59. package/dist/coffeescript-C7KEQBcH.js +4 -0
  60. package/dist/commonlisp-CNbiJRU-.js +4 -0
  61. package/dist/{constants-Cjd_3kwd.js → constants-BaCMVd12.js} +3 -3
  62. package/dist/{copy-C5RFg7ok.js → copy-GNcK40wy.js} +6 -2
  63. package/dist/{cose-bilkent-S5V4N54A-B3iOTGu5.js → cose-bilkent-S5V4N54A-BnvuJG6Y.js} +20 -20
  64. package/dist/crystal-OdjZZ8bc.js +4 -0
  65. package/dist/css-DhTxMmL_.js +5 -0
  66. package/dist/cypher-CgN8E3YI.js +4 -0
  67. package/dist/{cytoscape.esm-DTDV0Nbj.js → cytoscape.esm-BFEMljQI.js} +586 -661
  68. package/dist/d-g41sJcBC.js +4 -0
  69. package/dist/{dagre-5GWH7T2D-KM4Z11yT.js → dagre-5GWH7T2D-rn7tZYaQ.js} +41 -45
  70. package/dist/{dagre-B0u1urxE.js → dagre-Bghq6VKO.js} +58 -77
  71. package/dist/data-grid-overlay-editor-B4_Caieu.js +133 -0
  72. package/dist/{diagram-N5W7TBWH-CtO7az4G.js → diagram-N5W7TBWH-lbF94o-g.js} +46 -61
  73. package/dist/diagram-QEK2KX5R-CKBhSzsO.js +246 -0
  74. package/dist/{diagram-S2PKOQOG-CiXElLNQ.js → diagram-S2PKOQOG-161_1f53.js} +35 -34
  75. package/dist/diff-ViRYYhhg.js +4 -0
  76. package/dist/{dist-C3WYsf4K.js → dist-28HYzERB.js} +4 -10
  77. package/dist/{dist-CChOkSUg.js → dist-4dtbqf8A.js} +3 -3
  78. package/dist/{dist-CUnh_3Ii.js → dist-71jYYbWP.js} +2 -2
  79. package/dist/{dist-elblfNXO.js → dist-B8Pbw5ln.js} +2 -2
  80. package/dist/{dist-DPF5TTUg.js → dist-BAqp4Vtl.js} +126 -115
  81. package/dist/{dist-BEvIw5Nh.js → dist-BBhmkni2.js} +1 -1
  82. package/dist/{dist-C7ASiFxI.js → dist-BNRdMfJH.js} +273 -263
  83. package/dist/dist-BSyYM1Gi.js +15 -0
  84. package/dist/{dist-DzOpMdwb.js → dist-BYHiiJB-.js} +4 -4
  85. package/dist/{dist-DKFaZRVk.js → dist-B_wjJqqS.js} +2 -2
  86. package/dist/{dist-CutXTm8t.js → dist-BaPjLM6s.js} +1 -1
  87. package/dist/dist-BfJO8Bm9.js +12 -0
  88. package/dist/{dist-CGIZPq3J.js → dist-BqdQPWpQ.js} +2 -2
  89. package/dist/{dist--I6Htnlv.js → dist-C2IEc8og.js} +5 -5
  90. package/dist/{dist-CLvpViod.js → dist-C9-uHBqC.js} +2 -3
  91. package/dist/{dist-DBhzmFyH.js → dist-CJb8EiFO.js} +3 -3
  92. package/dist/dist-CLuF3AtO.js +6 -0
  93. package/dist/{dist-Dzk1C8l5.js → dist-CNAkUyxv.js} +11 -14
  94. package/dist/{dist-DNnYAdRE.js → dist-CNvMOZu9.js} +2 -2
  95. package/dist/{dist-CxD5E6Sh.js → dist-CPNnKuPh.js} +24 -22
  96. package/dist/{dist-C3QUag__.js → dist-CTIyD_KU.js} +3 -3
  97. package/dist/dist-CU04U4NL.js +10 -0
  98. package/dist/{dist-CZfRM7pE.js → dist-CWh5ZwcC.js} +2 -2
  99. package/dist/{dist-DW9er3Zq.js → dist-CWqB4bg8.js} +44 -23
  100. package/dist/{dist-CbRkrKrP.js → dist-CtOeHDJp.js} +5 -5
  101. package/dist/{dist-DL_ci7Yc.js → dist-Cw0F6l-7.js} +1 -1
  102. package/dist/{dist-BZBitvuL.js → dist-CwZcC4om.js} +1 -1
  103. package/dist/dist-DNUT6b47.js +6 -0
  104. package/dist/{dist-BBlFk9ki.js → dist-Da046MhT.js} +1 -1
  105. package/dist/{dist-Cib4sGDA.js → dist-DaTVdKJa.js} +2 -2
  106. package/dist/dist-DbAb2sY7.js +6 -0
  107. package/dist/dist-DiDFQ2Rk.js +6 -0
  108. package/dist/{dist-BQmQQqFH.js → dist-DlK420ke.js} +1 -1
  109. package/dist/{dist-o7fhJC7U.js → dist-Drf3cyIW.js} +3 -3
  110. package/dist/{dist-CdE2C2In.js → dist-DxESp2-T.js} +15 -20
  111. package/dist/{dist-JCAky9ND.js → dist-DzJem5xc.js} +17 -22
  112. package/dist/{dist-C5zMs_n5.js → dist-O0zVziwn.js} +3 -3
  113. package/dist/dist-SNAyAOJ-.js +6 -0
  114. package/dist/{dist-Bar1QnNM.js → dist-_4cudra1.js} +3 -3
  115. package/dist/dist-cbW5xJNV.js +6 -0
  116. package/dist/dist-h8eGLSbK.js +10 -0
  117. package/dist/{dist-BqgkUnEN.js → dist-xLN9qCAp.js} +3 -3
  118. package/dist/{dockerfile-Dum_1b-5.js → dockerfile-Cmlcqk35.js} +1 -1
  119. package/dist/dtd-RplB6hDg.js +4 -0
  120. package/dist/dylan-BX8KJufP.js +4 -0
  121. package/dist/ecl-CWtLaNMH.js +4 -0
  122. package/dist/eiffel-C-mlZPMn.js +4 -0
  123. package/dist/elm-CWp06vcb.js +4 -0
  124. package/dist/{erDiagram-AWTI2OKA-ZTIl9iQO.js → erDiagram-AWTI2OKA-BU7Qig7n.js} +32 -31
  125. package/dist/erlang-pfp22AZM.js +4 -0
  126. package/dist/error-banner-BAWlXn49.js +1012 -0
  127. package/dist/{esm-d0g2RsOH.js → esm-AtKNNGYO.js} +7 -9
  128. package/dist/esm-B2pocBPL.js +26 -0
  129. package/dist/{esm-DxFkg7a6.js → esm-Oo8OvZ6m.js} +1529 -1493
  130. package/dist/{esm-1_Mp6VD2.js → esm-YVnxJqkD.js} +340 -411
  131. package/dist/{factor-CdgiDGiu.js → factor-BZnBK3CG.js} +1 -1
  132. package/dist/factor-CEn53jua.js +5 -0
  133. package/dist/{flowDiagram-PVAE7QVJ-DsbofOzu.js → flowDiagram-PVAE7QVJ-JKJebWeY.js} +41 -40
  134. package/dist/{formats-ChrNdVdJ.js → formats-DOEuF6TR.js} +15 -19
  135. package/dist/forth-CL8vu_y8.js +4 -0
  136. package/dist/fortran-DsmXkYtE.js +4 -0
  137. package/dist/{ganttDiagram-OWAHRB6G-FnCH1Yj3.js → ganttDiagram-OWAHRB6G-BvWRfg05.js} +17 -16
  138. package/dist/gas-mYt9Rtlx.js +4 -0
  139. package/dist/gherkin-DHNCKBNj.js +4 -0
  140. package/dist/gitGraph-ZV4HHKMB-Cpd6k0O8.js +21 -0
  141. package/dist/{gitGraphDiagram-NY62KEGX-B0wvMNqU.js → gitGraphDiagram-NY62KEGX-VEJJBf5L.js} +38 -40
  142. package/dist/{glide-data-editor-D_kEsT07.js → glide-data-editor-Bne10icG.js} +1703 -1771
  143. package/dist/{graphlib-BGmr7CYF.js → graphlib-DRS8CrjA.js} +5 -5
  144. package/dist/groovy-DzRtOS5a.js +4 -0
  145. package/dist/haskell-Bl9iT_Mp.js +4 -0
  146. package/dist/haxe-DqA0ED6k.js +5 -0
  147. package/dist/{hotkeys-yFrUwyJK.js → hotkeys-DVxFjl2s.js} +16 -7
  148. package/dist/idl-WU2hil4i.js +4 -0
  149. package/dist/info-63CPKGFF-CG-xzUJo.js +21 -0
  150. package/dist/infoDiagram-STP46IZ2-zoRBGoup.js +45 -0
  151. package/dist/invariant-D3JoRb4I.js +6 -0
  152. package/dist/{isArrayLikeObject-DiDsNamC.js → isArrayLikeObject-DU5MCuQM.js} +3 -5
  153. package/dist/{isEmpty-BBG-u1GM.js → isEmpty-Do_v2sls.js} +2 -2
  154. package/dist/{isSymbol-BxF-_8BA.js → isSymbol-CtkA8Y0a.js} +1 -1
  155. package/dist/{javascript-Dfq1qI35.js → javascript-DGukg1sB.js} +2 -2
  156. package/dist/javascript-QY2BGJeV.js +5 -0
  157. package/dist/jinja2-Czleq7Sk.js +4 -0
  158. package/dist/{journeyDiagram-BIP6EPQ6-B3PotfAW.js → journeyDiagram-BIP6EPQ6-CsgEQgxh.js} +28 -28
  159. package/dist/julia-Dru3Qi0y.js +4 -0
  160. package/dist/{kanban-definition-6OIFK2YF-BTrQZ3LN.js → kanban-definition-6OIFK2YF-Bi8Ete2P.js} +42 -41
  161. package/dist/{katex-dN__NFdn.js → katex-C-g3rKKt.js} +1 -1
  162. package/dist/{katex-BE4xflfm.js → katex-DgfMWJY9.js} +149 -173
  163. package/dist/{label-BinTsX-u.js → label-BiVIU_wb.js} +252 -253
  164. package/dist/{line-C6-zz71o.js → line-B7-GoF1m.js} +3 -3
  165. package/dist/{linear-DyTdUIqX.js → linear-DeGGALuc.js} +4 -4
  166. package/dist/livescript-Dxqi_HLT.js +4 -0
  167. package/dist/{loader-Dijti3y4.js → loader-BBqwtZWj.js} +19 -26
  168. package/dist/lua-ByH1cUQZ.js +4 -0
  169. package/dist/main.js +17025 -17039
  170. package/dist/{marked.esm-3RjvXPoO.js → marked.esm-DkVwEwtO.js} +5 -5
  171. package/dist/mathematica-CWJIFuES.js +4 -0
  172. package/dist/mbox-qhPIGaUI.js +4 -0
  173. package/dist/{memoize-Dq87l1O_.js → memoize-D7eDkf3R.js} +1 -1
  174. package/dist/{merge-BPDCIm8P.js → merge-C_6cGM6o.js} +1 -1
  175. package/dist/{mermaid-MWiyXDcI.js → mermaid-BmtvsZ2m.js} +323 -339
  176. package/dist/{mermaid-parser.core-CSFx6MQ7.js → mermaid-parser.core-geyG_6o0.js} +8 -8
  177. package/dist/{mhchem-DZ68WS0G.js → mhchem-OhAaJ0fA.js} +1 -1
  178. package/dist/{min-BzhKOmZo.js → min-Dwa_NbP6.js} +7 -7
  179. package/dist/{mindmap-definition-Q6HEUPPD-9hhnrO1k.js → mindmap-definition-Q6HEUPPD-B-wmX1oG.js} +29 -28
  180. package/dist/mirc-yYcXhXBY.js +4 -0
  181. package/dist/mllike-BfT_Nl9x.js +6 -0
  182. package/dist/modelica-lVDtz1Rm.js +4 -0
  183. package/dist/mscgen-DvwdD1QJ.js +6 -0
  184. package/dist/mumps-BiY3GwKd.js +4 -0
  185. package/dist/{node-sql-parser-13oju30e.js → node-sql-parser-CoPWN4hn.js} +14343 -14351
  186. package/dist/{now-DVBcRCoE.js → now-DumxsrcX.js} +1 -1
  187. package/dist/{nsis-BW6_XagK.js → nsis-D4bLR_Y1.js} +1 -1
  188. package/dist/nsis-Dk18Sq_4.js +5 -0
  189. package/dist/ntriples-Cj-8VqKF.js +4 -0
  190. package/dist/{number-overlay-editor-D1YdiOrm.js → number-overlay-editor-D6r-48ka.js} +18 -24
  191. package/dist/octave-BgFAaYjU.js +4 -0
  192. package/dist/once-3OSMKEsL.js +74 -0
  193. package/dist/{ordinal-BXk5xAj2.js → ordinal-DpEbSVPc.js} +1 -1
  194. package/dist/oz-IsEG1I1m.js +4 -0
  195. package/dist/packet-HUATNLJX-Cafuo3IG.js +21 -0
  196. package/dist/pascal-BVf7FtIE.js +4 -0
  197. package/dist/perl-BM0-y4mZ.js +4 -0
  198. package/dist/pie-WTHONI2E-BE0pHBwB.js +21 -0
  199. package/dist/{pieDiagram-ADFJNKIX-CSBC0ZgF.js → pieDiagram-ADFJNKIX-C3GvPNUL.js} +40 -39
  200. package/dist/pig-CLBjzQmc.js +4 -0
  201. package/dist/powershell-B_qvE33J.js +4 -0
  202. package/dist/powershell-Dr7WZMDU.js +236 -0
  203. package/dist/{precisionRound-DbP73hkf.js → precisionRound-7YYJq2rW.js} +1 -1
  204. package/dist/properties-CUTpsH2y.js +4 -0
  205. package/dist/protobuf-DqCP8a-0.js +4 -0
  206. package/dist/pug-BvexKkw4.js +5 -0
  207. package/dist/{pug-Bmups_z0.js → pug-Dv3gE36O.js} +1 -1
  208. package/dist/puppet-CoIi0R3f.js +4 -0
  209. package/dist/purify.es-CrfFzTyi.js +536 -0
  210. package/dist/python-C-11-YMh.js +5 -0
  211. package/dist/{q-BzWcnVri.js → q-BzRpKgfd.js} +3 -2
  212. package/dist/q-CCVgEip7.js +4 -0
  213. package/dist/{quadrantDiagram-LMRXKWRM-h7nHf8xG.js → quadrantDiagram-LMRXKWRM-DPXwGNVa.js} +11 -10
  214. package/dist/r-CIdR0Sfs.js +4 -0
  215. package/dist/radar-NJJJXTRR-0adgjw0u.js +21 -0
  216. package/dist/{range-CgK0-PEw.js → range-CIbLpsrs.js} +3 -3
  217. package/dist/{react-plotly-BZakcxdv.js → react-plotly-DYyvxcRD.js} +4365 -4706
  218. package/dist/{requirementDiagram-4UW4RH46-BGEurQYq.js → requirementDiagram-4UW4RH46-Cs3Hqnm0.js} +24 -23
  219. package/dist/rpm-Dwvm039g.js +5 -0
  220. package/dist/ruby-DpTnO5gb.js +4 -0
  221. package/dist/{sankeyDiagram-GR3RE2ED-CxeJ_jfl.js → sankeyDiagram-GR3RE2ED-Be1d_Xf7.js} +7 -6
  222. package/dist/sas-CK9boxgv.js +4 -0
  223. package/dist/scheme-Y1aYL-Qq.js +4 -0
  224. package/dist/{sequenceDiagram-C3RYC4MD-CbFxwyr_.js → sequenceDiagram-C3RYC4MD-lbtovKTa.js} +24 -33
  225. package/dist/shell-D3eXGsHd.js +4 -0
  226. package/dist/sieve-BdwSFdWJ.js +4 -0
  227. package/dist/{simple-mode-Cgyya8F-.js → simple-mode-BMmwP_vI.js} +1 -1
  228. package/dist/{slides-component-BEyG25AH.js → slides-component-BoeQU7-s.js} +1012 -1033
  229. package/dist/smalltalk-BTYJquCm.js +4 -0
  230. package/dist/sparql-CYF0g4Cc.js +4 -0
  231. package/dist/{src-BNNJRxz3.js → src-BTqT1mA1.js} +6 -6
  232. package/dist/{stateDiagram-KXAO66HF-A61bMf29.js → stateDiagram-KXAO66HF-BmbR-Rol.js} +48 -49
  233. package/dist/stateDiagram-v2-UMBNRL4Z-DdJ7qVWc.js +39 -0
  234. package/dist/{step-IHYrujTc.js → step-2RJrMSSG.js} +1 -1
  235. package/dist/stex-CyWhoWHt.js +5 -0
  236. package/dist/style.css +1 -1
  237. package/dist/stylus-BBiKaI2h.js +4 -0
  238. package/dist/swift-COb15qFR.js +4 -0
  239. package/dist/tcl-Jik1LXu9.js +4 -0
  240. package/dist/textile-BFHPD3wr.js +4 -0
  241. package/dist/{time-D3tzCqJ6.js → time-BB30r1tK.js} +4 -4
  242. package/dist/{timeline-definition-XQNQX7LJ-BwdsB7CR.js → timeline-definition-XQNQX7LJ-1mv5caPW.js} +17 -17
  243. package/dist/{timer-D3Zlu9ow.js → timer-CcUhugb0.js} +2 -2
  244. package/dist/{toNumber-efKT08hh.js → toNumber-D3Ystr3y.js} +2 -2
  245. package/dist/{toString-BvCd3yJc.js → toString-CbuxCRDG.js} +2 -2
  246. package/dist/{toml-CIUkU1CP.js → toml-BqNUJWRI.js} +6 -2
  247. package/dist/toml-Brp9fBXs.js +4 -0
  248. package/dist/treemap-75Q7IDZK-CyBT8_Wh.js +21 -0
  249. package/dist/troff-CcZRW4vg.js +4 -0
  250. package/dist/ttcn-Bz_6ifRd.js +4 -0
  251. package/dist/ttcn-cfg-v-yi2rKc.js +4 -0
  252. package/dist/turtle-CDOsZYhB.js +4 -0
  253. package/dist/{types-1X1uZB4y.js → types-BPohCsA7.js} +198 -278
  254. package/dist/{useAsyncData-C4IqQK0g.js → useAsyncData-DHBqeb9a.js} +3 -2
  255. package/dist/{useDateFormatter-BCsBqetx.js → useDateFormatter-BkbjKw83.js} +9 -9
  256. package/dist/useIframeCapabilities-BEvvwlwt.js +46 -0
  257. package/dist/{useTheme-C2pgJzDH.js → useTheme-CnMbo-iq.js} +32 -29
  258. package/dist/vb-CL7fRwRw.js +4 -0
  259. package/dist/vbscript-CR2xfxpw.js +4 -0
  260. package/dist/{vega-component-Cv4J8CHz.js → vega-component-BfFcXZxw.js} +40 -39
  261. package/dist/{vega-loader.browser.module-Bi3ttvdj.js → vega-loader.browser.module-CFMtdrNw.js} +4 -5
  262. package/dist/velocity-CfuZoxPt.js +4 -0
  263. package/dist/verilog-CySTkzw_.js +4 -0
  264. package/dist/vhdl-Dvcd8KHW.js +4 -0
  265. package/dist/webidl-tbJt7sKk.js +4 -0
  266. package/dist/xquery-DJQVztyc.js +4 -0
  267. package/dist/{xychartDiagram-6GGTOJPD-BJRRi5HC.js → xychartDiagram-6GGTOJPD-njc-naaw.js} +24 -24
  268. package/dist/yacas-BbgBReEH.js +4 -0
  269. package/dist/z80-DPyb8VGz.js +4 -0
  270. package/dist/{zod-UPQf9SGn.js → zod-mAEs2ITo.js} +71 -81
  271. package/package.json +21 -17
  272. package/src/__mocks__/requests.ts +2 -0
  273. package/src/components/app-config/ai-config.tsx +1 -3
  274. package/src/components/app-config/common.tsx +14 -0
  275. package/src/components/app-config/data-form.tsx +282 -0
  276. package/src/components/app-config/user-config-form.tsx +36 -219
  277. package/src/components/chat/acp/__tests__/state.test.ts +75 -2
  278. package/src/components/chat/acp/agent-panel.tsx +143 -89
  279. package/src/components/chat/acp/blocks.tsx +77 -34
  280. package/src/components/chat/acp/state.ts +5 -1
  281. package/src/components/chat/acp/thread.tsx +12 -1
  282. package/src/components/chat/chat-panel.tsx +38 -5
  283. package/src/components/chat/chat-utils.ts +16 -5
  284. package/src/components/chat/markdown-renderer.css +1 -0
  285. package/src/components/chat/tool-call-accordion.tsx +7 -1
  286. package/src/components/data-table/__tests__/header-items.test.tsx +117 -0
  287. package/src/components/data-table/charts/__tests__/storage.test.ts +12 -6
  288. package/src/components/data-table/charts/charts.tsx +8 -2
  289. package/src/components/data-table/charts/storage.ts +1 -1
  290. package/src/components/data-table/column-header.tsx +4 -2
  291. package/src/components/data-table/column-wrapping/feature.ts +2 -0
  292. package/src/components/data-table/columns.tsx +12 -3
  293. package/src/components/data-table/data-table.tsx +7 -2
  294. package/src/components/data-table/header-items.tsx +63 -10
  295. package/src/components/data-table/renderers.tsx +3 -2
  296. package/src/components/dependency-graph/custom-node.tsx +11 -11
  297. package/src/components/dependency-graph/elements.ts +9 -4
  298. package/src/components/dependency-graph/panels.tsx +6 -4
  299. package/src/components/editor/Output.tsx +34 -25
  300. package/src/components/editor/actions/useCellActionButton.tsx +20 -4
  301. package/src/components/editor/ai/add-cell-with-ai.tsx +17 -3
  302. package/src/components/editor/ai/ai-completion-editor.tsx +203 -26
  303. package/src/components/editor/ai/completion-handlers.tsx +126 -23
  304. package/src/components/editor/cell/StagedAICell.tsx +81 -12
  305. package/src/components/editor/cell/code/cell-editor.tsx +6 -2
  306. package/src/components/editor/cell/useRunCells.ts +62 -30
  307. package/src/components/editor/chrome/panels/cache-panel.tsx +216 -0
  308. package/src/components/editor/chrome/panels/empty-state.tsx +3 -1
  309. package/src/components/editor/chrome/panels/packages-panel.tsx +1 -1
  310. package/src/components/editor/chrome/state.ts +1 -1
  311. package/src/components/editor/chrome/types.ts +66 -22
  312. package/src/components/editor/chrome/wrapper/app-chrome.tsx +4 -0
  313. package/src/components/editor/chrome/wrapper/minimap.tsx +2 -0
  314. package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +108 -0
  315. package/src/components/editor/chrome/wrapper/sidebar.tsx +1 -1
  316. package/src/components/editor/code/readonly-diff.tsx +49 -0
  317. package/src/components/editor/columns/storage.ts +1 -1
  318. package/src/components/editor/errors/auto-fix.tsx +138 -32
  319. package/src/components/editor/errors/fix-mode.ts +20 -0
  320. package/src/components/editor/inputs/Inputs.styles.ts +1 -1
  321. package/src/components/editor/navigation/__tests__/clipboard.test.ts +0 -5
  322. package/src/components/editor/navigation/clipboard.ts +2 -1
  323. package/src/components/editor/notebook-cell.tsx +20 -7
  324. package/src/components/editor/output/CalloutOutput.tsx +1 -1
  325. package/src/components/editor/output/ConsoleOutput.tsx +27 -33
  326. package/src/components/editor/output/HtmlOutput.tsx +3 -2
  327. package/src/components/editor/output/JsonOutput.tsx +15 -1
  328. package/src/components/editor/output/MarimoTracebackOutput.tsx +69 -52
  329. package/src/components/editor/output/__tests__/HtmlOutput.test.tsx +134 -0
  330. package/src/components/editor/output/__tests__/json-output.test.ts +43 -0
  331. package/src/components/editor/output/__tests__/traceback.test.tsx +8 -1
  332. package/src/components/editor/output/useWrapText.ts +6 -1
  333. package/src/components/editor/package-alert.tsx +37 -32
  334. package/src/components/editor/renderers/vertical-layout/vertical-layout-wrapper.tsx +5 -2
  335. package/src/components/forms/__tests__/form-utils.test.ts +4 -2
  336. package/src/components/home/state.ts +3 -2
  337. package/src/components/icons/copy-icon.tsx +11 -5
  338. package/src/components/scratchpad/scratchpad-history.ts +6 -1
  339. package/src/components/shortcuts/renderShortcut.tsx +3 -1
  340. package/src/components/slides/slides-component.tsx +25 -21
  341. package/src/components/ui/button.tsx +2 -0
  342. package/src/components/ui/confirmation-button.tsx +85 -0
  343. package/src/components/ui/context-menu.tsx +14 -4
  344. package/src/components/ui/dropdown-menu.tsx +14 -4
  345. package/src/components/ui/fullscreen.tsx +115 -1
  346. package/src/components/ui/popover.tsx +11 -3
  347. package/src/components/ui/range-slider.tsx +1 -1
  348. package/src/components/ui/select.tsx +7 -3
  349. package/src/components/ui/slider.tsx +1 -1
  350. package/src/components/ui/switch.tsx +2 -0
  351. package/src/components/ui/tooltip.tsx +10 -3
  352. package/src/core/ai/__tests__/staged-cells.test.ts +189 -64
  353. package/src/core/ai/config.ts +6 -2
  354. package/src/core/ai/context/providers/__tests__/__snapshots__/cell-output.test.ts.snap +17 -0
  355. package/src/core/ai/context/providers/__tests__/cell-output.test.ts +194 -10
  356. package/src/core/ai/context/providers/__tests__/datasource.test.ts +9 -1
  357. package/src/core/ai/context/providers/cell-output.ts +170 -112
  358. package/src/core/ai/context/providers/datasource.ts +25 -1
  359. package/src/core/ai/context/providers/tables.ts +2 -2
  360. package/src/core/ai/staged-cells.ts +32 -16
  361. package/src/core/ai/state.ts +8 -4
  362. package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +556 -0
  363. package/src/core/ai/tools/__tests__/registry.test.ts +41 -8
  364. package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +450 -0
  365. package/src/core/ai/tools/__tests__/utils.test.ts +87 -0
  366. package/src/core/ai/tools/base.ts +109 -6
  367. package/src/core/ai/tools/edit-notebook-tool.ts +239 -0
  368. package/src/core/ai/tools/registry.ts +48 -15
  369. package/src/core/ai/tools/run-cells-tool.ts +233 -0
  370. package/src/core/ai/tools/sample-tool.ts +53 -15
  371. package/src/core/ai/tools/utils.ts +23 -0
  372. package/src/core/cache/requests.ts +5 -0
  373. package/src/core/cells/__tests__/cells.test.ts +19 -1
  374. package/src/core/cells/__tests__/session.test.ts +20 -3
  375. package/src/core/cells/cells.ts +13 -8
  376. package/src/core/cells/session.ts +1 -1
  377. package/src/core/codemirror/__tests__/__snapshots__/setup.test.ts.snap +2 -0
  378. package/src/core/codemirror/__tests__/replace-editor-content.test.ts +336 -0
  379. package/src/core/codemirror/ai/resources.ts +13 -2
  380. package/src/core/codemirror/copilot/state.ts +4 -2
  381. package/src/core/codemirror/find-replace/navigate.ts +2 -2
  382. package/src/core/codemirror/format.ts +2 -9
  383. package/src/core/codemirror/language/__tests__/extension.test.ts +10 -2
  384. package/src/core/codemirror/language/__tests__/sql.test.ts +24 -6
  385. package/src/core/codemirror/language/languages/markdown.ts +16 -153
  386. package/src/core/codemirror/language/languages/python.ts +13 -10
  387. package/src/core/codemirror/language/languages/sql/sql-mode.ts +6 -1
  388. package/src/core/codemirror/language/languages/sql/sql.ts +43 -306
  389. package/src/core/codemirror/language/panel/markdown.tsx +2 -1
  390. package/src/core/codemirror/language/panel/panel.tsx +2 -7
  391. package/src/core/codemirror/language/utils.ts +3 -8
  392. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +21 -14
  393. package/src/core/codemirror/lsp/federated-lsp.ts +20 -9
  394. package/src/core/codemirror/lsp/notebook-lsp.ts +35 -29
  395. package/src/core/codemirror/lsp/transports.ts +7 -13
  396. package/src/core/codemirror/lsp/types.ts +0 -13
  397. package/src/core/codemirror/replace-editor-content.ts +87 -0
  398. package/src/core/config/__tests__/config-schema.test.ts +3 -0
  399. package/src/core/config/config-schema.ts +12 -1
  400. package/src/core/config/feature-flag.tsx +2 -4
  401. package/src/core/errors/__tests__/errors.test.ts +1 -0
  402. package/src/core/errors/errors.ts +20 -6
  403. package/src/core/hotkeys/hotkeys.ts +12 -0
  404. package/src/core/islands/bridge.ts +2 -0
  405. package/src/core/islands/main.ts +4 -0
  406. package/src/core/kernel/messages.ts +1 -0
  407. package/src/core/lsp/__tests__/transport.test.ts +233 -0
  408. package/src/core/lsp/transport.ts +139 -0
  409. package/src/core/network/requests-network.ts +14 -0
  410. package/src/core/network/requests-static.ts +2 -0
  411. package/src/core/network/requests-toasting.ts +2 -0
  412. package/src/core/network/types.ts +5 -0
  413. package/src/core/rtc/state.ts +6 -1
  414. package/src/core/saving/save-component.tsx +43 -36
  415. package/src/core/vscode/is-in-vscode.ts +9 -0
  416. package/src/core/wasm/bridge.ts +2 -0
  417. package/src/core/wasm/store.ts +1 -1
  418. package/src/core/websocket/useMarimoWebSocket.tsx +8 -0
  419. package/src/css/app/Cell.css +31 -0
  420. package/src/css/app/codemirror-completions.css +1 -1
  421. package/src/css/globals.css +5 -0
  422. package/src/custom.d.ts +2 -0
  423. package/src/hooks/useIframeCapabilities.ts +14 -0
  424. package/src/hooks/useLocalStorage.ts +1 -1
  425. package/src/plugins/core/RenderHTML.tsx +65 -5
  426. package/src/plugins/core/__test__/RenderHTML.test.ts +25 -23
  427. package/src/plugins/core/__test__/renderHTML-sanitization.test.tsx +131 -0
  428. package/src/plugins/core/__test__/sanitize.test.ts +465 -0
  429. package/src/plugins/core/registerReactComponent.tsx +19 -2
  430. package/src/plugins/core/sanitize.ts +76 -0
  431. package/src/plugins/impl/DataTablePlugin.tsx +20 -19
  432. package/src/plugins/impl/FileBrowserPlugin.tsx +1 -3
  433. package/src/plugins/impl/FileUploadPlugin.tsx +1 -3
  434. package/src/plugins/impl/__tests__/DateTimePickerPlugin.test.tsx +40 -1
  435. package/src/plugins/impl/__tests__/DropdownPlugin.test.tsx +6 -0
  436. package/src/plugins/impl/__tests__/MultiSelectPlugin.test.ts +8 -1
  437. package/src/plugins/impl/__tests__/NumberPlugin.test.tsx +3 -0
  438. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  439. package/src/plugins/impl/chat/chat-ui.tsx +17 -2
  440. package/src/plugins/impl/chat/types.ts +1 -1
  441. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +7 -2
  442. package/src/plugins/impl/plotly/__tests__/parse-from-template.test.ts +17 -0
  443. package/src/plugins/impl/plotly/parse-from-template.ts +2 -1
  444. package/src/utils/__tests__/arrays.test.ts +42 -0
  445. package/src/utils/__tests__/capabilities.test.ts +453 -0
  446. package/src/utils/__tests__/formatting.test.ts +107 -0
  447. package/src/utils/__tests__/json-parser.test.ts +13 -0
  448. package/src/utils/__tests__/local-storage.test.ts +1 -1
  449. package/src/utils/__tests__/storage.test.ts +21 -21
  450. package/src/utils/arrays.ts +25 -0
  451. package/src/utils/capabilities.ts +114 -0
  452. package/src/utils/copy.ts +6 -0
  453. package/src/utils/formatting.ts +51 -0
  454. package/src/utils/json/json-parser.ts +28 -3
  455. package/src/utils/numbers.ts +2 -2
  456. package/src/utils/{storage.ts → storage/jotai.ts} +16 -4
  457. package/src/utils/storage/storage.ts +57 -0
  458. package/src/utils/{localStorage.ts → storage/typed.ts} +22 -12
  459. package/dist/any-language-editor-CVFQlioK.js +0 -156
  460. package/dist/apl-ChlaBfxB.js +0 -4
  461. package/dist/architecture-O4VJ6CD3-BVeaxUcM.js +0 -21
  462. package/dist/asciiarmor-CcJmm3l_.js +0 -4
  463. package/dist/asn1-ThRYxoBE.js +0 -4
  464. package/dist/assets/__vite-browser-external-Dv_SHu1h.js +0 -1
  465. package/dist/assets/worker-DVOR9oZG.js +0 -54
  466. package/dist/brainfuck-CEM0JgDn.js +0 -4
  467. package/dist/chunk-EXTU4WIE-DECT9AAK.js +0 -14
  468. package/dist/chunk-S3R3BYOJ-DMQ1yeyq.js +0 -386
  469. package/dist/classDiagram-KNZD7YFC-BG53O6Jt.js +0 -39
  470. package/dist/classDiagram-v2-RKCZMP56-BmKILsGU.js +0 -39
  471. package/dist/clojure-B7RHyE9t.js +0 -4
  472. package/dist/cmake-TeTMP4I5.js +0 -4
  473. package/dist/cobol-DI-mxUER.js +0 -4
  474. package/dist/coffeescript-DHUFLqWp.js +0 -4
  475. package/dist/commonlisp-SLiUrh1m.js +0 -4
  476. package/dist/crystal-B4fY1ZfJ.js +0 -4
  477. package/dist/css-Bdoq3TzK.js +0 -5
  478. package/dist/cypher-CBU182fp.js +0 -4
  479. package/dist/d-D8myDZeH.js +0 -4
  480. package/dist/data-grid-overlay-editor-qNmJk2x0.js +0 -135
  481. package/dist/diagram-QEK2KX5R-fu8Noi3H.js +0 -245
  482. package/dist/diff-DJF_UB7H.js +0 -4
  483. package/dist/dist-52-_pKoy.js +0 -6
  484. package/dist/dist-6DOMStFn.js +0 -6
  485. package/dist/dist-B334aW7p.js +0 -10
  486. package/dist/dist-BOI9lUz-.js +0 -12
  487. package/dist/dist-C06uhBzF.js +0 -6
  488. package/dist/dist-CGkpguCB.js +0 -6
  489. package/dist/dist-CrApzUED.js +0 -6
  490. package/dist/dist-Dp2GLdCl.js +0 -14
  491. package/dist/dist-WHFsbMDr.js +0 -6
  492. package/dist/dist-hyKcTPG9.js +0 -10
  493. package/dist/dtd-DY8q65lC.js +0 -4
  494. package/dist/dylan-CBLcjWCi.js +0 -4
  495. package/dist/ecl-BSXPNfOw.js +0 -4
  496. package/dist/eiffel-BJf0PQX-.js +0 -4
  497. package/dist/elm-DWQwPCZS.js +0 -4
  498. package/dist/erlang-BWBaGZ5e.js +0 -4
  499. package/dist/error-banner-OQIGTqFR.js +0 -1012
  500. package/dist/esm-BO9n_s6u.js +0 -26
  501. package/dist/factor-DT1-MBPl.js +0 -5
  502. package/dist/forth-D9GDt3FB.js +0 -4
  503. package/dist/fortran-DHkRhDWw.js +0 -4
  504. package/dist/gas-7lQEOM0H.js +0 -4
  505. package/dist/gherkin-BLLyroYi.js +0 -4
  506. package/dist/gitGraph-ZV4HHKMB-z2v_cInC.js +0 -21
  507. package/dist/groovy-C-wabwj0.js +0 -4
  508. package/dist/haskell-DaxVQ_d1.js +0 -4
  509. package/dist/haxe-C2yLoC7h.js +0 -5
  510. package/dist/idl-DQBP8i7k.js +0 -4
  511. package/dist/info-63CPKGFF-GS4w6pCB.js +0 -21
  512. package/dist/infoDiagram-STP46IZ2-DE9YYPFg.js +0 -44
  513. package/dist/javascript-DRwFV9r5.js +0 -5
  514. package/dist/jinja2-CNoIpVmN.js +0 -4
  515. package/dist/julia-DXDf-GhP.js +0 -4
  516. package/dist/livescript-S2uhJQx7.js +0 -4
  517. package/dist/lua-Bvgs0y2G.js +0 -4
  518. package/dist/mathematica-D2zqfwIg.js +0 -4
  519. package/dist/mbox-SBcPaDuZ.js +0 -4
  520. package/dist/mirc-hkQc7sVF.js +0 -4
  521. package/dist/mllike-DRWPBlr9.js +0 -6
  522. package/dist/modelica-CO2ROGlP.js +0 -4
  523. package/dist/mscgen-BpX61bO6.js +0 -6
  524. package/dist/mumps-BCnFeIn6.js +0 -4
  525. package/dist/nsis-BaTOxlD1.js +0 -5
  526. package/dist/ntriples-zEo5BWjr.js +0 -4
  527. package/dist/octave-BE0RnCM9.js +0 -4
  528. package/dist/oz-C4_2Ttul.js +0 -4
  529. package/dist/packet-HUATNLJX-CjHqJIqk.js +0 -21
  530. package/dist/pascal-Q3jJucpw.js +0 -4
  531. package/dist/perl-DkXZIWHF.js +0 -4
  532. package/dist/pie-WTHONI2E-D67gLWtR.js +0 -21
  533. package/dist/pig-DCgEHdsu.js +0 -4
  534. package/dist/powershell-3rK_nRRJ.js +0 -236
  535. package/dist/powershell-Eo2-7MoM.js +0 -4
  536. package/dist/properties-C0IOX8WR.js +0 -4
  537. package/dist/protobuf--lGQUSRO.js +0 -4
  538. package/dist/pug-Cf8AQHMJ.js +0 -5
  539. package/dist/puppet-D7Z3dTJn.js +0 -4
  540. package/dist/python-FHIx_i8Y.js +0 -5
  541. package/dist/q-B7UA1feM.js +0 -4
  542. package/dist/r-Cc9R2A7N.js +0 -4
  543. package/dist/radar-NJJJXTRR-C-AZP_Te.js +0 -21
  544. package/dist/rpm-vhJNlrQ6.js +0 -5
  545. package/dist/ruby-CVluPY0M.js +0 -4
  546. package/dist/sas-A8DL8oy3.js +0 -4
  547. package/dist/scheme-6xHHcSXC.js +0 -4
  548. package/dist/shell-DHN-e5rf.js +0 -4
  549. package/dist/sieve-BuQwLY02.js +0 -4
  550. package/dist/smalltalk-BA4HPg2H.js +0 -4
  551. package/dist/sparql-Bf4yCuy3.js +0 -4
  552. package/dist/stateDiagram-v2-UMBNRL4Z-C_0FUzzk.js +0 -38
  553. package/dist/stex-D-I1cYeE.js +0 -5
  554. package/dist/stylus-BMeped2l.js +0 -4
  555. package/dist/swift-lwEdlZoC.js +0 -4
  556. package/dist/tcl-B03ipeqv.js +0 -4
  557. package/dist/textile-Cy55fYGC.js +0 -4
  558. package/dist/toml-BLgrVtfu.js +0 -4
  559. package/dist/treemap-75Q7IDZK-DTvwfpWt.js +0 -21
  560. package/dist/troff-g6EjN2O2.js +0 -4
  561. package/dist/ttcn-Dzvba8jK.js +0 -4
  562. package/dist/ttcn-cfg-CadG0p1K.js +0 -4
  563. package/dist/turtle-DkXAMWo9.js +0 -4
  564. package/dist/vb-C5dCiel8.js +0 -4
  565. package/dist/vbscript-I4bDEQln.js +0 -4
  566. package/dist/velocity-mt0fDwFH.js +0 -4
  567. package/dist/verilog-Dxq3KJkc.js +0 -4
  568. package/dist/vhdl-Km0QUlV-.js +0 -4
  569. package/dist/webidl-B3lJ2MRL.js +0 -4
  570. package/dist/xquery-CcIxNPEe.js +0 -4
  571. package/dist/yacas-oMa-f-tN.js +0 -4
  572. package/dist/z80-D03Nvn6l.js +0 -4
  573. package/src/core/codemirror/language/__tests__/ast.test.ts +0 -124
  574. package/src/core/codemirror/language/utils/ast.ts +0 -84
  575. package/src/core/codemirror/language/utils/quotes.ts +0 -18
  576. /package/dist/{_arrayReduce-CVwxyrBP.js → _arrayReduce-Cd9xQjbl.js} +0 -0
  577. /package/dist/{_baseSlice-OgpvpOOJ.js → _baseSlice-CE9WsQZm.js} +0 -0
  578. /package/dist/{_hasUnicode-BgIggCqE.js → _hasUnicode-DkEebvtD.js} +0 -0
  579. /package/dist/{apl-DZqo8Elt.js → apl-aGhy11IM.js} +0 -0
  580. /package/dist/{array-aAxy08hN.js → array-DYSXIreg.js} +0 -0
  581. /package/dist/{asciiarmor-DTzHAIeX.js → asciiarmor-DJKJ3Gkn.js} +0 -0
  582. /package/dist/{asn1-DrAXKsZH.js → asn1-C6f5IeNs.js} +0 -0
  583. /package/dist/{asterisk-oF4U3h48.js → asterisk-DB1poX9_.js} +0 -0
  584. /package/dist/{brainfuck-BYgLey30.js → brainfuck-Ch9vjun0.js} +0 -0
  585. /package/dist/{chunk-57QY23SG-0TxCfmy_.js → chunk-57QY23SG-BpXU7ph4.js} +0 -0
  586. /package/dist/{clojure-Bs2M3OUY.js → clojure-B_lpr3zt.js} +0 -0
  587. /package/dist/{cmake-DpI8vxJN.js → cmake-DaocNF4I.js} +0 -0
  588. /package/dist/{cobol-BQyrWo72.js → cobol-suTPtt7c.js} +0 -0
  589. /package/dist/{coffeescript-9ke9UHmw.js → coffeescript-CPLIvtqJ.js} +0 -0
  590. /package/dist/{colors-Cr_mZ2aH.js → colors-BXlG8Lmz.js} +0 -0
  591. /package/dist/{common-keywords-BzgeAvH1.js → common-keywords-Bhll7O3b.js} +0 -0
  592. /package/dist/{commonlisp-DghUdrUH.js → commonlisp-BqM3qFK7.js} +0 -0
  593. /package/dist/{crystal-DEf_SInh.js → crystal-AsSFu4ke.js} +0 -0
  594. /package/dist/{css-BzTU9lNO.js → css-Df7Sdeyh.js} +0 -0
  595. /package/dist/{cypher-a2v0c11S.js → cypher-CaVKL6Gu.js} +0 -0
  596. /package/dist/{d-SAswny-M.js → d-DCGWK7NQ.js} +0 -0
  597. /package/dist/{defaultLocale-BAgEOGks.js → defaultLocale-CYgZlqDF.js} +0 -0
  598. /package/dist/{defaultLocale-471SYAPk.js → defaultLocale-Cto8YOmX.js} +0 -0
  599. /package/dist/{diff-OJ-xLXcG.js → diff-CsxOM4Tr.js} +0 -0
  600. /package/dist/{dist-CK8Gj3GX.js → dist-C76MUPD3.js} +0 -0
  601. /package/dist/{dtd-BsUf-rer.js → dtd-Dwr0Jmks.js} +0 -0
  602. /package/dist/{duckdb-keywords-B0NOra5o.js → duckdb-keywords-7wAWf848.js} +0 -0
  603. /package/dist/{dylan-C0ZYngjn.js → dylan-A7-ZBSey.js} +0 -0
  604. /package/dist/{ebnf-DF1xx0b_.js → ebnf-9_SaGDUz.js} +0 -0
  605. /package/dist/{ecl-Bsuvoouq.js → ecl-BzJVIQDc.js} +0 -0
  606. /package/dist/{eiffel-DgfSpLi-.js → eiffel-CO9eC_Op.js} +0 -0
  607. /package/dist/{elm-GNxDj-5E.js → elm-CVAWj8SB.js} +0 -0
  608. /package/dist/{emotion-is-prop-valid.esm-BHMWayAG.js → emotion-is-prop-valid.esm-C3Yi5GQt.js} +0 -0
  609. /package/dist/{erlang-Ds3uY1kL.js → erlang-DWbZP546.js} +0 -0
  610. /package/dist/{fcl-CqBgSioc.js → fcl-CM9t2iay.js} +0 -0
  611. /package/dist/{forth-JCaLysGk.js → forth-BTYqUuu3.js} +0 -0
  612. /package/dist/{fortran-Dc2AoKAl.js → fortran-DgAjHcCq.js} +0 -0
  613. /package/dist/{gas-Q4Uz82YW.js → gas-BjDSWPZd.js} +0 -0
  614. /package/dist/{gherkin-Dpxe49sQ.js → gherkin-ClRqqpKv.js} +0 -0
  615. /package/dist/{groovy-D8mTRCu6.js → groovy-BzNjnc8x.js} +0 -0
  616. /package/dist/{haskell-2_8cC4wY.js → haskell-DLdk34Jq.js} +0 -0
  617. /package/dist/{haxe-Bl9zkZlz.js → haxe-l6gaY_IS.js} +0 -0
  618. /package/dist/{http-DKCqY6yS.js → http-6Qg7z_h2.js} +0 -0
  619. /package/dist/{idl-Dn-HNfGW.js → idl-hlWT4D26.js} +0 -0
  620. /package/dist/{init-D6eDd7H0.js → init-tZ42Torz.js} +0 -0
  621. /package/dist/{jinja2-JjFiAGKk.js → jinja2-DI5k_Er3.js} +0 -0
  622. /package/dist/{julia-R5wne8eu.js → julia-BvDZDiIT.js} +0 -0
  623. /package/dist/{livescript-DSwokrYj.js → livescript-2YMQfkfI.js} +0 -0
  624. /package/dist/{lua-CgXfrp2-.js → lua-DIUrQRfA.js} +0 -0
  625. /package/dist/{main-Czi9-LVy.js → main-BMTpe7M0.js} +0 -0
  626. /package/dist/{math-C7wLpe9K.js → math-qsHyz2Eo.js} +0 -0
  627. /package/dist/{mathematica-BVli92MR.js → mathematica-Dqmg_BwL.js} +0 -0
  628. /package/dist/{mbox-CMFlocdS.js → mbox-Cng-P-F1.js} +0 -0
  629. /package/dist/{mirc-BkW04Zpc.js → mirc-CNDqOVhQ.js} +0 -0
  630. /package/dist/{mllike-DEjvHvNV.js → mllike-C1n2UDyX.js} +0 -0
  631. /package/dist/{modelica-CxDn-oje.js → modelica-QqQC2pFj.js} +0 -0
  632. /package/dist/{mscgen-D78wmE-w.js → mscgen-C3fl8uhp.js} +0 -0
  633. /package/dist/{mumps-Bi0IvPOV.js → mumps-BeCUbMej.js} +0 -0
  634. /package/dist/{nginx-DErPZFhX.js → nginx-ejv7DsBz.js} +0 -0
  635. /package/dist/{ntriples-Btyp6wRL.js → ntriples-CUgUpcma.js} +0 -0
  636. /package/dist/{octave-CZA6-2F8.js → octave-BD652tGl.js} +0 -0
  637. /package/dist/{oz-Bm6LSNfE.js → oz-DrRsFa0K.js} +0 -0
  638. /package/dist/{pascal-B4J6a9BH.js → pascal-hpcx9sVn.js} +0 -0
  639. /package/dist/{path-VDkDgx1I.js → path-Bbv2tLY1.js} +0 -0
  640. /package/dist/{perl-CzVqxS08.js → perl-DW8XHeFc.js} +0 -0
  641. /package/dist/{pig-Clh03cnn.js → pig-Cv7Nxbfo.js} +0 -0
  642. /package/dist/{prop-types-0wNc-99T.js → prop-types-Bd16OEUP.js} +0 -0
  643. /package/dist/{properties-D7ch1Wyb.js → properties-D-qJDXAM.js} +0 -0
  644. /package/dist/{protobuf-DrkdrMPK.js → protobuf-B48QZbd3.js} +0 -0
  645. /package/dist/{puppet-BtZG8zdO.js → puppet-15JDyiY2.js} +0 -0
  646. /package/dist/{python-B6FKOVIv.js → python-DWkQA94h.js} +0 -0
  647. /package/dist/{r-Dnvo5-96.js → r-dcNRe_Q8.js} +0 -0
  648. /package/dist/{range-PcytnUSJ.js → range-CQvYp_qE.js} +0 -0
  649. /package/dist/{rpm-B1DrgfnX.js → rpm-Djl3Dsf1.js} +0 -0
  650. /package/dist/{ruby-CelfUg17.js → ruby-Dd2CZTip.js} +0 -0
  651. /package/dist/{sas-DfSQFMWG.js → sas-DYF5_Iqu.js} +0 -0
  652. /package/dist/{scheme-BplhaWuO.js → scheme-YtWcji1H.js} +0 -0
  653. /package/dist/{shell-DqU5OS2c.js → shell-C3uC3Y0Z.js} +0 -0
  654. /package/dist/{sieve-BE4_IyGa.js → sieve-DHB17sQG.js} +0 -0
  655. /package/dist/{smalltalk-B_WPL8Nx.js → smalltalk-Y5v1Np3H.js} +0 -0
  656. /package/dist/{solr-DlJFg7H5.js → solr-DvRJLlRD.js} +0 -0
  657. /package/dist/{sparql-7XIlcOgW.js → sparql-BEt3GJwM.js} +0 -0
  658. /package/dist/{spreadsheet-BdZSVwVp.js → spreadsheet-Dp4B9_rc.js} +0 -0
  659. /package/dist/{sql-CCrq7lfJ.js → sql-DBsUs8nQ.js} +0 -0
  660. /package/dist/{stex-BiFc8QAu.js → stex-C6-x52ei.js} +0 -0
  661. /package/dist/{stylus-DlSH9xpH.js → stylus-DroA8via.js} +0 -0
  662. /package/dist/{swift-e3tMTZgJ.js → swift-DR0x1ESK.js} +0 -0
  663. /package/dist/{tcl-DfZMC20G.js → tcl-BeuTFc_c.js} +0 -0
  664. /package/dist/{textile-DaSeca5U.js → textile-C0ikhHN3.js} +0 -0
  665. /package/dist/{tiddlywiki-dfoiz8pS.js → tiddlywiki-C_2Nvsgu.js} +0 -0
  666. /package/dist/{tiki-yJbQzhma.js → tiki-CKQlhmQQ.js} +0 -0
  667. /package/dist/{treemap-BpgMKHv-.js → treemap-BYLUKIzA.js} +0 -0
  668. /package/dist/{troff-FN_FrCXR.js → troff-DkK0f2ZH.js} +0 -0
  669. /package/dist/{tslib.es6-DofFyd9S.js → tslib.es6-3ZL768sZ.js} +0 -0
  670. /package/dist/{ttcn-7_i4HlyB.js → ttcn-Bf8vrg-_.js} +0 -0
  671. /package/dist/{ttcn-cfg-B46AlBUV.js → ttcn-cfg-DjCKzd95.js} +0 -0
  672. /package/dist/{turtle-QQfeFveR.js → turtle-SSc84S9m.js} +0 -0
  673. /package/dist/{vb-DToPVnLa.js → vb-CQ6DC3cL.js} +0 -0
  674. /package/dist/{vbscript-CtsNaTz4.js → vbscript-Dw0gFssg.js} +0 -0
  675. /package/dist/{velocity-CAoNe6ns.js → velocity-BvJQyBmj.js} +0 -0
  676. /package/dist/{verilog-DrDOMiJq.js → verilog-CKGAvQjj.js} +0 -0
  677. /package/dist/{vhdl-DnO0OEPh.js → vhdl-B40_x6fM.js} +0 -0
  678. /package/dist/{webidl-Or6d1ZfA.js → webidl-Bi9hczCv.js} +0 -0
  679. /package/dist/{xquery-CEp_Mcpr.js → xquery-DwWUXvP3.js} +0 -0
  680. /package/dist/{yacas-DgnYrSlp.js → yacas-ClUs0mmH.js} +0 -0
  681. /package/dist/{z80-DlG_kyeB.js → z80-DPC4UGzR.js} +0 -0
@@ -0,0 +1,465 @@
1
+ /* Copyright 2024 Marimo. All rights reserved. */
2
+ import { describe, expect, test } from "vitest";
3
+ import { sanitizeHtml } from "../sanitize";
4
+
5
+ describe("sanitizeHtml", () => {
6
+ test("renders basic HTML", () => {
7
+ const html = "<h1>Hello World</h1>";
8
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`"<h1>Hello World</h1>"`);
9
+ });
10
+
11
+ test("renders nested HTML", () => {
12
+ const html = "<div><p>Paragraph</p><span>Span</span></div>";
13
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
14
+ `"<div><p>Paragraph</p><span>Span</span></div>"`,
15
+ );
16
+ });
17
+
18
+ test("removes script tags", () => {
19
+ const html = "<div>Hello</div><script>alert('XSS')</script>";
20
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`"<div>Hello</div>"`);
21
+ });
22
+
23
+ test("removes inline script in onclick", () => {
24
+ const html = "<button onclick=\"alert('XSS')\">Click me</button>";
25
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
26
+ `"<button>Click me</button>"`,
27
+ );
28
+ });
29
+
30
+ test("removes javascript: protocol in href", () => {
31
+ const html = "<a href=\"javascript:alert('XSS')\">Link</a>";
32
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
33
+ `"<a target="_self">Link</a>"`,
34
+ );
35
+ });
36
+
37
+ test("removes onerror attribute", () => {
38
+ const html = '<img src="x" onerror="alert(\'XSS\')" />';
39
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`"<img src="x">"`);
40
+ });
41
+
42
+ test("keeps form tags but removes action attribute", () => {
43
+ const html = '<form action="/submit"><input type="text"/></form>';
44
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
45
+ `"<form action="/submit"><input type="text"></form>"`,
46
+ );
47
+ });
48
+
49
+ test("removes iframe tags", () => {
50
+ const html = '<iframe src="https://evil.com"></iframe>';
51
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`""`);
52
+ });
53
+
54
+ test("removes embed tags", () => {
55
+ const html = '<embed src="https://evil.com" />';
56
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`""`);
57
+ });
58
+
59
+ test("removes object tags", () => {
60
+ const html = '<object data="https://evil.com"></object>';
61
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`""`);
62
+ });
63
+
64
+ test("preserves safe anchor with target=_blank", () => {
65
+ const html = '<a href="https://example.com" target="_blank">Link</a>';
66
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
67
+ `"<a href="https://example.com" target="_blank" rel="noopener">Link</a>"`,
68
+ );
69
+ });
70
+
71
+ test("adds target=_self to anchor without target", () => {
72
+ const html = '<a href="https://example.com">Link</a>';
73
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
74
+ `"<a href="https://example.com" target="_self">Link</a>"`,
75
+ );
76
+ });
77
+
78
+ test("preserves target=_self on anchor", () => {
79
+ const html = '<a href="https://example.com" target="_self">Link</a>';
80
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
81
+ `"<a href="https://example.com" target="_self">Link</a>"`,
82
+ );
83
+ });
84
+
85
+ test("preserves target=_parent on anchor", () => {
86
+ const html = '<a href="https://example.com" target="_parent">Link</a>';
87
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
88
+ `"<a href="https://example.com" target="_parent">Link</a>"`,
89
+ );
90
+ });
91
+
92
+ test("preserves SVG elements", () => {
93
+ const html =
94
+ '<svg width="100" height="100"><circle cx="50" cy="50" r="40" /></svg>';
95
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
96
+ `"<svg width="100" height="100"><circle cx="50" cy="50" r="40"></circle></svg>"`,
97
+ );
98
+ });
99
+
100
+ test("removes script from SVG", () => {
101
+ const html = '<svg><script>alert("XSS")</script><circle r="10" /></svg>';
102
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
103
+ `"<svg><circle r="10"></circle></svg>"`,
104
+ );
105
+ });
106
+
107
+ test("preserves MathML", () => {
108
+ const html = "<math><mi>x</mi><mo>=</mo><mn>2</mn></math>";
109
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
110
+ `"<math><mi>x</mi><mo>=</mo><mn>2</mn></math>"`,
111
+ );
112
+ });
113
+
114
+ test("preserves custom marimo elements", () => {
115
+ const html = '<marimo-slider value="50"></marimo-slider>';
116
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
117
+ `"<marimo-slider value="50"></marimo-slider>"`,
118
+ );
119
+ });
120
+
121
+ test("preserves marimo elements with valid naming", () => {
122
+ const html = "<marimo-custom-element></marimo-custom-element>";
123
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
124
+ `"<marimo-custom-element></marimo-custom-element>"`,
125
+ );
126
+ });
127
+
128
+ test("removes invalid custom elements (not marimo-*)", () => {
129
+ const html = "<custom-element>Content</custom-element>";
130
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`"Content"`);
131
+ });
132
+
133
+ test("keeps style tags with FORCE_BODY", () => {
134
+ const html = "<style>body { color: red; }</style><p>Text</p>";
135
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
136
+ `"<style>body { color: red; }</style><p>Text</p>"`,
137
+ );
138
+ });
139
+
140
+ test("removes link tags", () => {
141
+ const html = '<link rel="stylesheet" href="evil.css" /><p>Text</p>';
142
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`"<p>Text</p>"`);
143
+ });
144
+
145
+ test("removes meta tags", () => {
146
+ const html = '<meta http-equiv="refresh" content="0;url=evil.com" />';
147
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`""`);
148
+ });
149
+
150
+ test("removes base tags", () => {
151
+ const html = '<base href="https://evil.com" /><p>Text</p>';
152
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`"<p>Text</p>"`);
153
+ });
154
+
155
+ test("preserves safe HTML entities", () => {
156
+ const html = "<p>&lt;div&gt; &amp; &quot;quotes&quot;</p>";
157
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
158
+ `"<p>&lt;div&gt; &amp; "quotes"</p>"`,
159
+ );
160
+ });
161
+
162
+ test("preserves data attributes", () => {
163
+ const html = '<div data-id="123" data-name="test">Content</div>';
164
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
165
+ `"<div data-id="123" data-name="test">Content</div>"`,
166
+ );
167
+ });
168
+
169
+ test("preserves aria attributes", () => {
170
+ const html = '<button aria-label="Close" aria-hidden="true">X</button>';
171
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
172
+ `"<button aria-label="Close" aria-hidden="true">X</button>"`,
173
+ );
174
+ });
175
+
176
+ test("preserves class and id attributes", () => {
177
+ const html = '<div id="main" class="container primary">Content</div>';
178
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
179
+ `"<div id="main" class="container primary">Content</div>"`,
180
+ );
181
+ });
182
+
183
+ test("removes dangerous event handlers", () => {
184
+ const html =
185
+ '<div onload="alert(1)" onmouseover="alert(2)" onfocus="alert(3)">Text</div>';
186
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`"<div>Text</div>"`);
187
+ });
188
+
189
+ test("handles empty string", () => {
190
+ const html = "";
191
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`""`);
192
+ });
193
+
194
+ test("handles text without tags", () => {
195
+ const html = "Just plain text";
196
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`"Just plain text"`);
197
+ });
198
+
199
+ test("handles malformed HTML", () => {
200
+ const html = "<div><p>Unclosed div";
201
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
202
+ `"<div><p>Unclosed div</p></div>"`,
203
+ );
204
+ });
205
+
206
+ test("removes data URIs with javascript", () => {
207
+ const html = '<a href="data:text/html,<script>alert(1)</script>">Link</a>';
208
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
209
+ `"<a target="_self">Link</a>"`,
210
+ );
211
+ });
212
+
213
+ test("preserves safe data URIs", () => {
214
+ const html = '<img src="data:image/png;base64,iVBORw0KGgo=" />';
215
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
216
+ `"<img src="data:image/png;base64,iVBORw0KGgo=">"`,
217
+ );
218
+ });
219
+
220
+ test("removes srcdoc attribute from iframe", () => {
221
+ const html = '<iframe srcdoc="<script>alert(1)</script>"></iframe>';
222
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`""`);
223
+ });
224
+
225
+ test("handles complex nested structure", () => {
226
+ const html = `
227
+ <div class="container">
228
+ <header>
229
+ <h1>Title</h1>
230
+ <nav><a href="/home">Home</a></nav>
231
+ </header>
232
+ <main>
233
+ <article>
234
+ <p>Content</p>
235
+ </article>
236
+ </main>
237
+ </div>
238
+ `;
239
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`
240
+ "
241
+ <div class="container">
242
+ <header>
243
+ <h1>Title</h1>
244
+ <nav><a href="/home" target="_self">Home</a></nav>
245
+ </header>
246
+ <main>
247
+ <article>
248
+ <p>Content</p>
249
+ </article>
250
+ </main>
251
+ </div>
252
+ "
253
+ `);
254
+ });
255
+
256
+ test("keeps marquee and blink tags (not considered dangerous by DOMPurify)", () => {
257
+ const html = "<marquee>Scrolling text</marquee><blink>Blinking</blink>";
258
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
259
+ `"<marquee>Scrolling text</marquee><blink>Blinking</blink>"`,
260
+ );
261
+ });
262
+
263
+ test("preserves table structures", () => {
264
+ const html = "<table><tr><td>Cell 1</td><td>Cell 2</td></tr></table>";
265
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
266
+ `"<table><tbody><tr><td>Cell 1</td><td>Cell 2</td></tr></tbody></table>"`,
267
+ );
268
+ });
269
+
270
+ test("removes xml-stylesheet processing instructions", () => {
271
+ const html =
272
+ '<?xml-stylesheet href="evil.xsl" type="text/xsl"?><div>Text</div>';
273
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`"<div>Text</div>"`);
274
+ });
275
+
276
+ test("removes use element from SVG", () => {
277
+ const html = '<svg><use xlink:href="#icon"></use></svg>';
278
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`"<svg></svg>"`);
279
+ });
280
+
281
+ test("removes javascript in SVG href", () => {
282
+ const html =
283
+ '<svg><a href="javascript:alert(1)"><text>Click</text></a></svg>';
284
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
285
+ `"<svg><a><text>Click</text></a></svg>"`,
286
+ );
287
+ });
288
+
289
+ test("preserves img with valid src", () => {
290
+ const html = '<img src="https://example.com/image.png" alt="Image" />';
291
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
292
+ `"<img src="https://example.com/image.png" alt="Image">"`,
293
+ );
294
+ });
295
+
296
+ test("handles multiple scripts interleaved", () => {
297
+ const html =
298
+ "<div>Text1</div><script>evil1()</script><p>Text2</p><script>evil2()</script>";
299
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
300
+ `"<div>Text1</div><p>Text2</p>"`,
301
+ );
302
+ });
303
+
304
+ test("removes frameset and frame tags", () => {
305
+ const html = '<frameset><frame src="page.html" /></frameset>';
306
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`""`);
307
+ });
308
+
309
+ test("handles vbscript: protocol", () => {
310
+ const html = '<a href="vbscript:msgbox()">Link</a>';
311
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
312
+ `"<a target="_self">Link</a>"`,
313
+ );
314
+ });
315
+
316
+ test("removes autofocus and onfocus from input", () => {
317
+ const html = '<input type="hidden" autofocus onfocus="alert(1)" />';
318
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`"<input type="hidden">"`);
319
+ });
320
+
321
+ test("removes formaction attribute", () => {
322
+ const html = '<button formaction="javascript:alert(1)">Click</button>';
323
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
324
+ `"<button>Click</button>"`,
325
+ );
326
+ });
327
+
328
+ test("handles nested script-like content", () => {
329
+ const html = "<div>&lt;script&gt;alert(1)&lt;/script&gt;</div>";
330
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
331
+ `"<div>&lt;script&gt;alert(1)&lt;/script&gt;</div>"`,
332
+ );
333
+ });
334
+
335
+ test("preserves valid inline styles", () => {
336
+ const html = '<div style="color: blue; font-size: 14px;">Styled</div>';
337
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
338
+ `"<div style="color: blue; font-size: 14px;">Styled</div>"`,
339
+ );
340
+ });
341
+
342
+ test("keeps expression() in styles (legacy IE only)", () => {
343
+ const html = '<div style="width: expression(alert(1));">Text</div>';
344
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
345
+ `"<div style="width: expression(alert(1));">Text</div>"`,
346
+ );
347
+ });
348
+
349
+ test("keeps moz-binding in styles (legacy Firefox only)", () => {
350
+ const html = '<div style="-moz-binding: url(xss.xml#xss)">Text</div>';
351
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
352
+ `"<div style="-moz-binding: url(xss.xml#xss)">Text</div>"`,
353
+ );
354
+ });
355
+
356
+ test("preserves title and alt attributes", () => {
357
+ const html = '<img src="pic.jpg" alt="Picture" title="A nice picture" />';
358
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
359
+ `"<img src="pic.jpg" alt="Picture" title="A nice picture">"`,
360
+ );
361
+ });
362
+
363
+ test("handles multiple targets on links", () => {
364
+ const html = '<a href="/" target="_top">Link</a>';
365
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
366
+ `"<a href="/" target="_top">Link</a>"`,
367
+ );
368
+ });
369
+
370
+ test("removes on* attributes comprehensively", () => {
371
+ const html =
372
+ '<div onabort="alert(1)" onblur="alert(2)" onchange="alert(3)" ondblclick="alert(4)">Text</div>';
373
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`"<div>Text</div>"`);
374
+ });
375
+
376
+ test("removes SVG foreignObject", () => {
377
+ const html =
378
+ "<svg><foreignObject><body><p>Text</p></body></foreignObject></svg>";
379
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`"<svg></svg>"`);
380
+ });
381
+
382
+ test("removes xlink:href with javascript in SVG", () => {
383
+ const html = '<svg><a xlink:href="javascript:alert(1)">Click</a></svg>';
384
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
385
+ `"<svg><a>Click</a></svg>"`,
386
+ );
387
+ });
388
+
389
+ test("preserves role attributes", () => {
390
+ const html = '<div role="button" tabindex="0">Clickable</div>';
391
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
392
+ `"<div role="button" tabindex="0">Clickable</div>"`,
393
+ );
394
+ });
395
+
396
+ test("handles HTML comments", () => {
397
+ const html = "<!-- Comment --><p>Text</p>";
398
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`"<p>Text</p>"`);
399
+ });
400
+
401
+ test("removes conditional comments", () => {
402
+ const html = "<!--[if IE]><script>alert(1)</script><![endif]--><p>Text</p>";
403
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(`"<p>Text</p>"`);
404
+ });
405
+
406
+ test("preserves pre and code elements", () => {
407
+ const html = "<pre><code>const x = 1;</code></pre>";
408
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
409
+ `"<pre><code>const x = 1;</code></pre>"`,
410
+ );
411
+ });
412
+
413
+ test("handles mixed content with scripts", () => {
414
+ const html =
415
+ "<div><p>Safe</p><script>evil()</script><p>More safe</p></div>";
416
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
417
+ `"<div><p>Safe</p><p>More safe</p></div>"`,
418
+ );
419
+ });
420
+
421
+ test("preserves video and audio elements", () => {
422
+ const html = '<video src="video.mp4" controls></video>';
423
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
424
+ `"<video src="video.mp4" controls=""></video>"`,
425
+ );
426
+ });
427
+
428
+ test("handles source elements in video", () => {
429
+ const html =
430
+ '<video controls><source src="video.mp4" type="video/mp4" /></video>';
431
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
432
+ `"<video controls=""><source src="video.mp4" type="video/mp4"></video>"`,
433
+ );
434
+ });
435
+
436
+ test("removes import statement in style", () => {
437
+ const html = '<style>@import url("evil.css");</style>';
438
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
439
+ `"<style>@import url("evil.css");</style>"`,
440
+ );
441
+ });
442
+
443
+ test("handles HTML5 semantic elements", () => {
444
+ const html =
445
+ "<article><section><header>Title</header><footer>Footer</footer></section></article>";
446
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
447
+ `"<article><section><header>Title</header><footer>Footer</footer></section></article>"`,
448
+ );
449
+ });
450
+
451
+ test("preserves canvas element", () => {
452
+ const html = '<canvas id="myCanvas" width="200" height="100"></canvas>';
453
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
454
+ `"<canvas id="myCanvas" width="200" height="100"></canvas>"`,
455
+ );
456
+ });
457
+
458
+ test("handles details and summary elements", () => {
459
+ const html =
460
+ "<details><summary>Click me</summary><p>Hidden content</p></details>";
461
+ expect(sanitizeHtml(html)).toMatchInlineSnapshot(
462
+ `"<details><summary>Click me</summary><p>Hidden content</p></details>"`,
463
+ );
464
+ });
465
+ });
@@ -32,6 +32,7 @@ import { UIElementRegistry } from "@/core/dom/uiregistry";
32
32
  import { FUNCTIONS_REGISTRY } from "@/core/functions/FunctionRegistry";
33
33
  import { LocaleProvider } from "@/core/i18n/locale-provider";
34
34
  import { store } from "@/core/state/jotai";
35
+ import { isStaticNotebook } from "@/core/static/static-state";
35
36
  import {
36
37
  type HTMLElementNotDerivedFromRef,
37
38
  useEventListener,
@@ -182,10 +183,13 @@ function PluginSlotInternal<T>(
182
183
  const objectId = getUIElementObjectId(hostElement);
183
184
  invariant(objectId, "Object ID should exist");
184
185
 
186
+ const isStatic = isStaticNotebook();
187
+
185
188
  const htmlId = HTMLCellId.findElementThroughShadowDOMs(hostElement)?.id;
186
189
  const cellId = htmlId ? HTMLCellId.parse(htmlId) : null;
187
- if (cellId) {
190
+ if (cellId && !isStatic) {
188
191
  // If the cell is not initialized, throw an error
192
+ // Continue if the cell is static, so we can propagate a clearer error message.
189
193
  const notebookState = store.get(notebookAtom);
190
194
  const cellRuntime = notebookState.cellRuntime[cellId];
191
195
  const cellData = notebookState.cellData[cellId];
@@ -358,7 +362,20 @@ export function registerReactComponent<T>(plugin: IPlugin<T, unknown>): void {
358
362
  * Get the children of the element as React nodes.
359
363
  */
360
364
  private getChildren(): React.ReactNode {
361
- return renderHTML({ html: this.innerHTML });
365
+ // We don't sanitize the HTML here because it could be an iframe inside of tabs or accordions
366
+ // If we have multiple children, we need to render each one separately
367
+ if (this.children.length === 0) {
368
+ return null;
369
+ }
370
+ if (this.children.length === 1) {
371
+ return renderHTML({ html: this.innerHTML, alwaysSanitizeHtml: false });
372
+ }
373
+ // Multiple children - render each one
374
+ return Array.from(this.children).map((child, index) => (
375
+ <React.Fragment key={index}>
376
+ {renderHTML({ html: child.outerHTML, alwaysSanitizeHtml: false })}
377
+ </React.Fragment>
378
+ ));
362
379
  }
363
380
 
364
381
  /**
@@ -0,0 +1,76 @@
1
+ /* Copyright 2024 Marimo. All rights reserved. */
2
+ import DOMPurify, { type Config } from "dompurify";
3
+ import { atom, useAtomValue } from "jotai";
4
+ import { hasRunAnyCellAtom } from "@/components/editor/cell/useRunCells";
5
+ import { getInitialAppMode } from "@/core/mode";
6
+
7
+ /**
8
+ * Whether to sanitize the html.
9
+ * When running as an app or with auto_instantiate enabled
10
+ * we ignore sanitization because they should be treated as a website.
11
+ */
12
+ const sanitizeHtmlAtom = atom<boolean>((get) => {
13
+ const hasRunAnyCell = get(hasRunAnyCellAtom);
14
+
15
+ // If a user has specifically run at least one cell, we don't need to sanitize.
16
+ // HTML needs to be rich to allow for interactive widgets and other dynamic content.
17
+ if (hasRunAnyCell) {
18
+ return false;
19
+ }
20
+
21
+ const isInAppMode = getInitialAppMode() === "read";
22
+ // Apps need to run javascript and load external resources.
23
+ if (isInAppMode) {
24
+ return false;
25
+ }
26
+
27
+ return true;
28
+ });
29
+
30
+ /**
31
+ * Whether to sanitize the html.
32
+ */
33
+ export function useSanitizeHtml() {
34
+ return useAtomValue(sanitizeHtmlAtom);
35
+ }
36
+
37
+ // preserve target=_blank https://github.com/cure53/DOMPurify/issues/317#issuecomment-912474068
38
+ const TEMPORARY_ATTRIBUTE = "data-temp-href-target";
39
+ DOMPurify.addHook("beforeSanitizeAttributes", (node) => {
40
+ if (node.tagName === "A") {
41
+ if (!node.hasAttribute("target")) {
42
+ node.setAttribute("target", "_self");
43
+ }
44
+
45
+ if (node.hasAttribute("target")) {
46
+ node.setAttribute(TEMPORARY_ATTRIBUTE, node.getAttribute("target") || "");
47
+ }
48
+ }
49
+ });
50
+
51
+ DOMPurify.addHook("afterSanitizeAttributes", (node) => {
52
+ if (node.tagName === "A" && node.hasAttribute(TEMPORARY_ATTRIBUTE)) {
53
+ node.setAttribute("target", node.getAttribute(TEMPORARY_ATTRIBUTE) || "");
54
+ node.removeAttribute(TEMPORARY_ATTRIBUTE);
55
+ if (node.getAttribute("target") === "_blank") {
56
+ node.setAttribute("rel", "noopener");
57
+ }
58
+ }
59
+ });
60
+
61
+ /**
62
+ * This removes script tags, form tags, iframe tags, and other potentially dangerous tags
63
+ */
64
+ export function sanitizeHtml(html: string) {
65
+ const sanitizationOptions: Config = {
66
+ // Default to permit HTML, SVG and MathML, this limits to HTML only
67
+ USE_PROFILES: { html: true, svg: true, mathMl: true },
68
+ // glue elements like style, script or others to document.body and prevent unintuitive browser behavior in several edge-cases
69
+ FORCE_BODY: true,
70
+ CUSTOM_ELEMENT_HANDLING: {
71
+ tagNameCheck: /^marimo-[A-Za-z][\w-]*$/,
72
+ attributeNameCheck: /^[A-Za-z][\w-]*$/,
73
+ },
74
+ };
75
+ return DOMPurify.sanitize(html, sanitizationOptions);
76
+ }
@@ -205,7 +205,7 @@ type DataTableFunctions = {
205
205
  sort?: {
206
206
  by: string;
207
207
  descending: boolean;
208
- };
208
+ }[];
209
209
  query?: string;
210
210
  filters?: ConditionType[];
211
211
  page_number: number;
@@ -298,7 +298,12 @@ export const DataTablePlugin = createPlugin<S>("marimo-table")
298
298
  .input(
299
299
  z.object({
300
300
  sort: z
301
- .object({ by: z.string(), descending: z.boolean() })
301
+ .array(
302
+ z.object({
303
+ by: z.string(),
304
+ descending: z.boolean(),
305
+ }),
306
+ )
302
307
  .optional(),
303
308
  query: z.string().optional(),
304
309
  filters: z.array(ConditionSchema).optional(),
@@ -501,19 +506,15 @@ export const LoadingDataTableComponent = memo(
501
506
  !props.lazy &&
502
507
  !pageSizeChanged;
503
508
 
504
- if (sorting.length > 1) {
505
- Logger.warn("Multiple sort columns are not supported");
506
- }
509
+ // Convert sorting state to API format
510
+ const sortArgs =
511
+ sorting.length > 0
512
+ ? sorting.map((s) => ({ by: s.id, descending: s.desc }))
513
+ : undefined;
507
514
 
508
515
  // If we have sort/search/filter, use the search function
509
516
  const searchResultsPromise = search<T>({
510
- sort:
511
- sorting.length > 0
512
- ? {
513
- by: sorting[0].id,
514
- descending: sorting[0].desc,
515
- }
516
- : undefined,
517
+ sort: sortArgs,
517
518
  query: searchQuery,
518
519
  page_number: paginationState.pageIndex,
519
520
  page_size: paginationState.pageSize,
@@ -563,16 +564,15 @@ export const LoadingDataTableComponent = memo(
563
564
 
564
565
  const getRow = useCallback(
565
566
  async (rowId: number) => {
567
+ const sortArgs =
568
+ sorting.length > 0
569
+ ? sorting.map((s) => ({ by: s.id, descending: s.desc }))
570
+ : undefined;
571
+
566
572
  const result = await search<T>({
567
573
  page_number: rowId,
568
574
  page_size: 1,
569
- sort:
570
- sorting.length > 0
571
- ? {
572
- by: sorting[0].id,
573
- descending: sorting[0].desc,
574
- }
575
- : undefined,
575
+ sort: sortArgs,
576
576
  query: searchQuery,
577
577
  filters: filters.flatMap((filter) => {
578
578
  return filterToFilterCondition(
@@ -691,6 +691,7 @@ export const LoadingDataTableComponent = memo(
691
691
  {props.showChartBuilder ? (
692
692
  <TablePanel
693
693
  displayHeader={displayHeader}
694
+ data={data?.rows || []}
694
695
  dataTable={dataTable}
695
696
  getDataUrl={props.get_data_url}
696
697
  fieldTypes={props.fieldTypes}
@@ -475,9 +475,7 @@ export const FileBrowser = ({
475
475
  selected
476
476
  </span>
477
477
  <button
478
- className={cn(
479
- "text-xs text-destructive hover:underline cursor-pointer",
480
- )}
478
+ className={cn("text-xs text-destructive hover:underline")}
481
479
  onClick={() => setValue([])}
482
480
  type="button"
483
481
  >