@marimo-team/islands 0.17.0 → 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 (615) hide show
  1. package/dist/{fullscreen-blsKUrtN.js → Combination-De9yoNY5.js} +132 -69
  2. package/dist/{ConnectedDataExplorerComponent-DJEUH6Bb.js → ConnectedDataExplorerComponent-DuvpJOKp.js} +45 -44
  3. package/dist/{ImageComparisonComponent-D4Tv9QzJ.js → ImageComparisonComponent--etUl2pp.js} +2 -2
  4. package/dist/{_baseIsEqual-CN4oFUZ4.js → _baseIsEqual-BFlyFUxC.js} +1 -1
  5. package/dist/{_basePickBy-CzSvE_-f.js → _basePickBy-gCCvtjgp.js} +3 -3
  6. package/dist/{_baseProperty-DbbUiyUD.js → _baseProperty-BuqBC0Ie.js} +5 -5
  7. package/dist/{_baseUniq-DwoC-LVO.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-CoBORy6u.js → architectureDiagram-W76B3OCA-CrK99pJi.js} +38 -37
  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-vPn7gxWj.js → worker-B6tH8gPO.js} +3 -3
  17. package/dist/{blockDiagram-QIGZ2CNN-0yzoLIar.js → blockDiagram-QIGZ2CNN-BJOEyO6w.js} +47 -46
  18. package/dist/brainfuck-ClvDI1dq.js +4 -0
  19. package/dist/{button-DcnBVpVa.js → button-ADXOb_gX.js} +27 -27
  20. package/dist/{c4Diagram-FPNF74CW-CKsIA_DD.js → c4Diagram-FPNF74CW-7Pz_X9wF.js} +12 -11
  21. package/dist/{channel-3LVvQZcD.js → channel-X-wRUxX6.js} +1 -1
  22. package/dist/{check-D7ifz5op.js → check-COlaG7Ss.js} +1 -1
  23. package/dist/{chunk-3AY6CYHV-B2C-aVc3.js → chunk-3AY6CYHV-BQH2fFpA.js} +10 -10
  24. package/dist/{chunk-4BX2VUAB-DEd4VI9L.js → chunk-4BX2VUAB-D-QtDCKM.js} +1 -1
  25. package/dist/{chunk-4KMFLZZN-DnvP3O4K.js → chunk-4KMFLZZN-BirZvvJS.js} +13 -13
  26. package/dist/{chunk-55IACEB6-BcCzwOOl.js → chunk-55IACEB6-DjtPYZKs.js} +1 -1
  27. package/dist/{chunk-6OXUPJBA-eNAAfJ3Q.js → chunk-6OXUPJBA-CTnnqlzw.js} +7 -7
  28. package/dist/{chunk-7GE3RBXV-CSAeQvLz.js → chunk-7GE3RBXV-CT47hCrL.js} +1 -1
  29. package/dist/{chunk-ABZYJK2D-CZcb_1iM.js → chunk-ABZYJK2D-B6ZsU6SR.js} +484 -1039
  30. package/dist/{chunk-BN7GFLIU-pBc5O5Rh.js → chunk-BN7GFLIU-DYWEsrG4.js} +1 -1
  31. package/dist/{chunk-CVBHYZKI-CivHZg9P.js → chunk-CVBHYZKI-BuzDGXz0.js} +1 -1
  32. package/dist/{chunk-CXMOBAN2-Dd0E6qb0.js → chunk-CXMOBAN2-Bas2S5w1.js} +6 -6
  33. package/dist/{chunk-EXTU4WIE-GQ2ZWfJo.js → chunk-EXTU4WIE-DXwNSukz.js} +2 -2
  34. package/dist/{chunk-FMBD7UC4-C6YcisV6.js → chunk-FMBD7UC4-CYKEpuPr.js} +1 -1
  35. package/dist/{chunk-JA3XYJ7Z-DYeQaT57.js → chunk-JA3XYJ7Z-DcxfkcDC.js} +4 -4
  36. package/dist/{chunk-JEIROHC2-B-EZMP4V.js → chunk-JEIROHC2-C01ZIcIG.js} +1 -1
  37. package/dist/{chunk-K7UQS3LO-DENzlS-M.js → chunk-K7UQS3LO-CmbT97MV.js} +7 -7
  38. package/dist/{chunk-KMC2YHZD-SckhHdEh.js → chunk-KMC2YHZD-D64m-1E1.js} +1 -1
  39. package/dist/{chunk-QN33PNHL-Cjq5b604.js → chunk-QN33PNHL-DjB0j8Dr.js} +2 -2
  40. package/dist/{chunk-QYVHNE3D-CNUuivie.js → chunk-QYVHNE3D-VA4W4oxG.js} +2 -2
  41. package/dist/{chunk-QZHKN3VN-DugEU_bA.js → chunk-QZHKN3VN-KT0fl3Em.js} +1 -1
  42. package/dist/{chunk-S3R3BYOJ-itCT6Vif.js → chunk-S3R3BYOJ-C5zmcMvn.js} +6 -6
  43. package/dist/{chunk-T44TD3VJ-BLdfTX8J.js → chunk-T44TD3VJ-BMOgu-Hk.js} +1 -1
  44. package/dist/{chunk-TVAH2DTR-BOnwF9d8.js → chunk-TVAH2DTR-eKm8SKnH.js} +6 -6
  45. package/dist/{chunk-TZMSLE5B-DGs66AlL.js → chunk-TZMSLE5B-CQxFRiI2.js} +3 -3
  46. package/dist/{chunk-WFRQ32O7-CPsipkmJ.js → chunk-WFRQ32O7-Dg51o277.js} +1 -1
  47. package/dist/{chunk-WFWHJNB7-Cmed18Pk.js → chunk-WFWHJNB7-DVLO98ge.js} +1 -1
  48. package/dist/{chunk-XRWGC2XP-DH5GDaY8.js → chunk-XRWGC2XP-UNFKdWQh.js} +1 -1
  49. package/dist/{chunk-ZPAFE4SF-DPDwaqZm.js → chunk-ZPAFE4SF-DbCSwfLK.js} +1 -1
  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-CL_FkgGY.js → click-outside-container-2BH589Bq.js} +2 -2
  53. package/dist/{clike-DYfRWWXk.js → clike-CytFO-kN.js} +1 -1
  54. package/dist/clojure-8GefCgPe.js +4 -0
  55. package/dist/{clone-Msbhmn2a.js → clone-CCgVUJ6x.js} +1 -1
  56. package/dist/cmake-yAhT9H0F.js +4 -0
  57. package/dist/cobol-BmltueOY.js +4 -0
  58. package/dist/coffeescript-C7KEQBcH.js +4 -0
  59. package/dist/commonlisp-CNbiJRU-.js +4 -0
  60. package/dist/{constants-BCOEQoEQ.js → constants-BaCMVd12.js} +3 -3
  61. package/dist/{copy-BkZ8PkBM.js → copy-GNcK40wy.js} +2 -2
  62. package/dist/{cose-bilkent-S5V4N54A-BZnbwyVD.js → cose-bilkent-S5V4N54A-BnvuJG6Y.js} +3 -3
  63. package/dist/crystal-OdjZZ8bc.js +4 -0
  64. package/dist/css-DhTxMmL_.js +5 -0
  65. package/dist/cypher-CgN8E3YI.js +4 -0
  66. package/dist/d-g41sJcBC.js +4 -0
  67. package/dist/{dagre-5GWH7T2D-BGaiSZZO.js → dagre-5GWH7T2D-rn7tZYaQ.js} +37 -36
  68. package/dist/{dagre-pyfDIOWJ.js → dagre-Bghq6VKO.js} +13 -13
  69. package/dist/{data-grid-overlay-editor-867aBz0Y.js → data-grid-overlay-editor-B4_Caieu.js} +4 -4
  70. package/dist/{diagram-N5W7TBWH-CzLE0jZB.js → diagram-N5W7TBWH-lbF94o-g.js} +41 -40
  71. package/dist/{diagram-QEK2KX5R-AGS60xEZ.js → diagram-QEK2KX5R-CKBhSzsO.js} +35 -34
  72. package/dist/{diagram-S2PKOQOG-BxRoG6yW.js → diagram-S2PKOQOG-161_1f53.js} +35 -34
  73. package/dist/diff-ViRYYhhg.js +4 -0
  74. package/dist/{dist-PGgOcwbF.js → dist-28HYzERB.js} +2 -2
  75. package/dist/{dist-CfQHSIQC.js → dist-4dtbqf8A.js} +3 -3
  76. package/dist/{dist-CYhQCVru.js → dist-71jYYbWP.js} +2 -2
  77. package/dist/{dist-Cacac5HV.js → dist-B8Pbw5ln.js} +2 -2
  78. package/dist/{dist-z_iuDES7.js → dist-BAqp4Vtl.js} +1 -1
  79. package/dist/{dist-RwqAqkpG.js → dist-BBhmkni2.js} +1 -1
  80. package/dist/{dist-DMxl6Qbu.js → dist-BNRdMfJH.js} +2 -2
  81. package/dist/{dist-Doiq_KIP.js → dist-BSyYM1Gi.js} +6 -6
  82. package/dist/{dist-NUdHX0XE.js → dist-BYHiiJB-.js} +2 -2
  83. package/dist/{dist-B0YD1aXi.js → dist-B_wjJqqS.js} +2 -2
  84. package/dist/{dist-DBhEu3-F.js → dist-BaPjLM6s.js} +1 -1
  85. package/dist/dist-BfJO8Bm9.js +12 -0
  86. package/dist/{dist-BFkr6kAQ.js → dist-BqdQPWpQ.js} +2 -2
  87. package/dist/{dist-DlHkZUnY.js → dist-C2IEc8og.js} +5 -5
  88. package/dist/{dist-DS6nuHYK.js → dist-C9-uHBqC.js} +1 -1
  89. package/dist/{dist-B1Dv8Sdk.js → dist-CJb8EiFO.js} +3 -3
  90. package/dist/dist-CLuF3AtO.js +6 -0
  91. package/dist/{dist-CId4IPXu.js → dist-CNAkUyxv.js} +1 -1
  92. package/dist/{dist-RdxOJbBw.js → dist-CNvMOZu9.js} +2 -2
  93. package/dist/{dist-C7zhQ7K0.js → dist-CPNnKuPh.js} +1 -1
  94. package/dist/{dist-ivwkJchV.js → dist-CTIyD_KU.js} +3 -3
  95. package/dist/dist-CU04U4NL.js +10 -0
  96. package/dist/{dist-D-3fICwh.js → dist-CWh5ZwcC.js} +2 -2
  97. package/dist/{dist-d5NxvX2s.js → dist-CWqB4bg8.js} +3 -3
  98. package/dist/{dist-biZ846D9.js → dist-CtOeHDJp.js} +5 -5
  99. package/dist/{dist-BL2DSY0P.js → dist-Cw0F6l-7.js} +1 -1
  100. package/dist/{dist-wHVprCkn.js → dist-CwZcC4om.js} +1 -1
  101. package/dist/dist-DNUT6b47.js +6 -0
  102. package/dist/{dist-CZq5-ZyD.js → dist-Da046MhT.js} +1 -1
  103. package/dist/{dist-reo2kYlN.js → dist-DaTVdKJa.js} +2 -2
  104. package/dist/dist-DbAb2sY7.js +6 -0
  105. package/dist/dist-DiDFQ2Rk.js +6 -0
  106. package/dist/{dist-BpzZrRd6.js → dist-DlK420ke.js} +1 -1
  107. package/dist/{dist-CvyfRaIr.js → dist-Drf3cyIW.js} +3 -3
  108. package/dist/{dist-2Ne-33Xy.js → dist-DxESp2-T.js} +3 -3
  109. package/dist/{dist-CkvGMBAS.js → dist-DzJem5xc.js} +1 -1
  110. package/dist/{dist-y8uoXYaE.js → dist-O0zVziwn.js} +3 -3
  111. package/dist/dist-SNAyAOJ-.js +6 -0
  112. package/dist/{dist-BhVFggab.js → dist-_4cudra1.js} +3 -3
  113. package/dist/dist-cbW5xJNV.js +6 -0
  114. package/dist/dist-h8eGLSbK.js +10 -0
  115. package/dist/{dist-CBhnQKQ4.js → dist-xLN9qCAp.js} +3 -3
  116. package/dist/{dockerfile-sZMPcXVY.js → dockerfile-Cmlcqk35.js} +1 -1
  117. package/dist/dtd-RplB6hDg.js +4 -0
  118. package/dist/dylan-BX8KJufP.js +4 -0
  119. package/dist/ecl-CWtLaNMH.js +4 -0
  120. package/dist/eiffel-C-mlZPMn.js +4 -0
  121. package/dist/elm-CWp06vcb.js +4 -0
  122. package/dist/{erDiagram-AWTI2OKA-CTxzb-U8.js → erDiagram-AWTI2OKA-BU7Qig7n.js} +30 -29
  123. package/dist/erlang-pfp22AZM.js +4 -0
  124. package/dist/error-banner-BAWlXn49.js +1012 -0
  125. package/dist/{esm-CAWW9sum.js → esm-AtKNNGYO.js} +1 -1
  126. package/dist/esm-B2pocBPL.js +26 -0
  127. package/dist/{esm-BdiY4QsX.js → esm-Oo8OvZ6m.js} +110 -110
  128. package/dist/{esm-YY5zh7KV.js → esm-YVnxJqkD.js} +20 -20
  129. package/dist/{factor-CRFTmP_a.js → factor-BZnBK3CG.js} +1 -1
  130. package/dist/factor-CEn53jua.js +5 -0
  131. package/dist/{flowDiagram-PVAE7QVJ-Dck2hiJe.js → flowDiagram-PVAE7QVJ-JKJebWeY.js} +39 -38
  132. package/dist/{formats-BnqXUb1V.js → formats-DOEuF6TR.js} +8 -8
  133. package/dist/forth-CL8vu_y8.js +4 -0
  134. package/dist/fortran-DsmXkYtE.js +4 -0
  135. package/dist/{ganttDiagram-OWAHRB6G-AWzfzpup.js → ganttDiagram-OWAHRB6G-BvWRfg05.js} +17 -16
  136. package/dist/gas-mYt9Rtlx.js +4 -0
  137. package/dist/gherkin-DHNCKBNj.js +4 -0
  138. package/dist/gitGraph-ZV4HHKMB-Cpd6k0O8.js +21 -0
  139. package/dist/{gitGraphDiagram-NY62KEGX-GyNboWSV.js → gitGraphDiagram-NY62KEGX-VEJJBf5L.js} +35 -34
  140. package/dist/{glide-data-editor-DHuN8kQ8.js → glide-data-editor-Bne10icG.js} +87 -85
  141. package/dist/{graphlib-hb3zmtVD.js → graphlib-DRS8CrjA.js} +5 -5
  142. package/dist/groovy-DzRtOS5a.js +4 -0
  143. package/dist/haskell-Bl9iT_Mp.js +4 -0
  144. package/dist/haxe-DqA0ED6k.js +5 -0
  145. package/dist/{hotkeys-Ct2T3e9O.js → hotkeys-DVxFjl2s.js} +12 -0
  146. package/dist/idl-WU2hil4i.js +4 -0
  147. package/dist/info-63CPKGFF-CG-xzUJo.js +21 -0
  148. package/dist/infoDiagram-STP46IZ2-zoRBGoup.js +45 -0
  149. package/dist/invariant-D3JoRb4I.js +6 -0
  150. package/dist/{isEmpty--odfYjh1.js → isEmpty-Do_v2sls.js} +2 -2
  151. package/dist/{isSymbol-Cb1f2HgO.js → isSymbol-CtkA8Y0a.js} +1 -1
  152. package/dist/javascript-QY2BGJeV.js +5 -0
  153. package/dist/jinja2-Czleq7Sk.js +4 -0
  154. package/dist/{journeyDiagram-BIP6EPQ6-TmXYCUbT.js → journeyDiagram-BIP6EPQ6-CsgEQgxh.js} +10 -9
  155. package/dist/julia-Dru3Qi0y.js +4 -0
  156. package/dist/{kanban-definition-6OIFK2YF-B6ozleHo.js → kanban-definition-6OIFK2YF-Bi8Ete2P.js} +42 -41
  157. package/dist/{katex-mPzRsXEy.js → katex-C-g3rKKt.js} +1 -1
  158. package/dist/{label-VVRKZmrP.js → label-BiVIU_wb.js} +245 -243
  159. package/dist/{line-C6-zz71o.js → line-B7-GoF1m.js} +3 -3
  160. package/dist/{linear-iebAbJVD.js → linear-DeGGALuc.js} +4 -4
  161. package/dist/livescript-Dxqi_HLT.js +4 -0
  162. package/dist/{loader-CM0VALo9.js → loader-BBqwtZWj.js} +3 -3
  163. package/dist/lua-ByH1cUQZ.js +4 -0
  164. package/dist/main.js +11785 -11529
  165. package/dist/mathematica-CWJIFuES.js +4 -0
  166. package/dist/mbox-qhPIGaUI.js +4 -0
  167. package/dist/{memoize-DYoRBSLn.js → memoize-D7eDkf3R.js} +1 -1
  168. package/dist/{merge-BjuR6j_w.js → merge-C_6cGM6o.js} +1 -1
  169. package/dist/{mermaid-YPPMBmhk.js → mermaid-BmtvsZ2m.js} +323 -321
  170. package/dist/{mermaid-parser.core-BLkyTSZj.js → mermaid-parser.core-geyG_6o0.js} +8 -8
  171. package/dist/{mhchem-Dw7wvXtr.js → mhchem-OhAaJ0fA.js} +1 -1
  172. package/dist/{min-B_i2ahn4.js → min-Dwa_NbP6.js} +7 -7
  173. package/dist/{mindmap-definition-Q6HEUPPD-F6-JnXwq.js → mindmap-definition-Q6HEUPPD-B-wmX1oG.js} +29 -28
  174. package/dist/mirc-yYcXhXBY.js +4 -0
  175. package/dist/mllike-BfT_Nl9x.js +6 -0
  176. package/dist/modelica-lVDtz1Rm.js +4 -0
  177. package/dist/mscgen-DvwdD1QJ.js +6 -0
  178. package/dist/mumps-BiY3GwKd.js +4 -0
  179. package/dist/{now-CwRqw0nS.js → now-DumxsrcX.js} +1 -1
  180. package/dist/{nsis-BWJEeUyS.js → nsis-D4bLR_Y1.js} +1 -1
  181. package/dist/nsis-Dk18Sq_4.js +5 -0
  182. package/dist/ntriples-Cj-8VqKF.js +4 -0
  183. package/dist/{number-overlay-editor-CeyruAX4.js → number-overlay-editor-D6r-48ka.js} +2 -2
  184. package/dist/octave-BgFAaYjU.js +4 -0
  185. package/dist/once-3OSMKEsL.js +74 -0
  186. package/dist/{ordinal-BXk5xAj2.js → ordinal-DpEbSVPc.js} +1 -1
  187. package/dist/oz-IsEG1I1m.js +4 -0
  188. package/dist/packet-HUATNLJX-Cafuo3IG.js +21 -0
  189. package/dist/pascal-BVf7FtIE.js +4 -0
  190. package/dist/perl-BM0-y4mZ.js +4 -0
  191. package/dist/pie-WTHONI2E-BE0pHBwB.js +21 -0
  192. package/dist/{pieDiagram-ADFJNKIX-C5dSQVCn.js → pieDiagram-ADFJNKIX-C3GvPNUL.js} +40 -39
  193. package/dist/pig-CLBjzQmc.js +4 -0
  194. package/dist/powershell-B_qvE33J.js +4 -0
  195. package/dist/{precisionRound-DbP73hkf.js → precisionRound-7YYJq2rW.js} +1 -1
  196. package/dist/properties-CUTpsH2y.js +4 -0
  197. package/dist/protobuf-DqCP8a-0.js +4 -0
  198. package/dist/pug-BvexKkw4.js +5 -0
  199. package/dist/{pug-PJh82u1M.js → pug-Dv3gE36O.js} +1 -1
  200. package/dist/puppet-CoIi0R3f.js +4 -0
  201. package/dist/purify.es-CrfFzTyi.js +536 -0
  202. package/dist/python-C-11-YMh.js +5 -0
  203. package/dist/q-CCVgEip7.js +4 -0
  204. package/dist/{quadrantDiagram-LMRXKWRM-DlahxNiy.js → quadrantDiagram-LMRXKWRM-DPXwGNVa.js} +8 -7
  205. package/dist/r-CIdR0Sfs.js +4 -0
  206. package/dist/radar-NJJJXTRR-0adgjw0u.js +21 -0
  207. package/dist/{range-DxfkexCE.js → range-CIbLpsrs.js} +3 -3
  208. package/dist/{react-plotly-D_IAfR8f.js → react-plotly-DYyvxcRD.js} +1 -1
  209. package/dist/{requirementDiagram-4UW4RH46-DTkinyvU.js → requirementDiagram-4UW4RH46-Cs3Hqnm0.js} +24 -23
  210. package/dist/rpm-Dwvm039g.js +5 -0
  211. package/dist/ruby-DpTnO5gb.js +4 -0
  212. package/dist/{sankeyDiagram-GR3RE2ED-CsLnEnnq.js → sankeyDiagram-GR3RE2ED-Be1d_Xf7.js} +7 -6
  213. package/dist/sas-CK9boxgv.js +4 -0
  214. package/dist/scheme-Y1aYL-Qq.js +4 -0
  215. package/dist/{sequenceDiagram-C3RYC4MD-BdEOR6SC.js → sequenceDiagram-C3RYC4MD-lbtovKTa.js} +14 -13
  216. package/dist/shell-D3eXGsHd.js +4 -0
  217. package/dist/sieve-BdwSFdWJ.js +4 -0
  218. package/dist/{slides-component-2bbal1YJ.js → slides-component-BoeQU7-s.js} +999 -998
  219. package/dist/smalltalk-BTYJquCm.js +4 -0
  220. package/dist/sparql-CYF0g4Cc.js +4 -0
  221. package/dist/{src-DZkaBUmt.js → src-BTqT1mA1.js} +1 -1
  222. package/dist/{stateDiagram-KXAO66HF-DQLH2jhP.js → stateDiagram-KXAO66HF-BmbR-Rol.js} +40 -39
  223. package/dist/stateDiagram-v2-UMBNRL4Z-DdJ7qVWc.js +39 -0
  224. package/dist/{step-IHYrujTc.js → step-2RJrMSSG.js} +1 -1
  225. package/dist/stex-CyWhoWHt.js +5 -0
  226. package/dist/style.css +1 -1
  227. package/dist/stylus-BBiKaI2h.js +4 -0
  228. package/dist/swift-COb15qFR.js +4 -0
  229. package/dist/tcl-Jik1LXu9.js +4 -0
  230. package/dist/textile-BFHPD3wr.js +4 -0
  231. package/dist/{time-CFkXkVrt.js → time-BB30r1tK.js} +4 -4
  232. package/dist/{timeline-definition-XQNQX7LJ-bToVq14i.js → timeline-definition-XQNQX7LJ-1mv5caPW.js} +16 -15
  233. package/dist/{toNumber-EFF1Z9T1.js → toNumber-D3Ystr3y.js} +2 -2
  234. package/dist/{toString-C2mCkasT.js → toString-CbuxCRDG.js} +2 -2
  235. package/dist/toml-Brp9fBXs.js +4 -0
  236. package/dist/treemap-75Q7IDZK-CyBT8_Wh.js +21 -0
  237. package/dist/troff-CcZRW4vg.js +4 -0
  238. package/dist/ttcn-Bz_6ifRd.js +4 -0
  239. package/dist/ttcn-cfg-v-yi2rKc.js +4 -0
  240. package/dist/turtle-CDOsZYhB.js +4 -0
  241. package/dist/{types-CRXV0KD5.js → types-BPohCsA7.js} +141 -210
  242. package/dist/{useAsyncData-uMVTsDI9.js → useAsyncData-DHBqeb9a.js} +3 -2
  243. package/dist/{useDateFormatter-Dcz7jstn.js → useDateFormatter-BkbjKw83.js} +9 -9
  244. package/dist/useIframeCapabilities-BEvvwlwt.js +46 -0
  245. package/dist/{useTheme-NbEx-ZNV.js → useTheme-CnMbo-iq.js} +23 -23
  246. package/dist/vb-CL7fRwRw.js +4 -0
  247. package/dist/vbscript-CR2xfxpw.js +4 -0
  248. package/dist/{vega-component-hegVmfuS.js → vega-component-BfFcXZxw.js} +40 -39
  249. package/dist/{vega-loader.browser.module-DcW8jnKp.js → vega-loader.browser.module-CFMtdrNw.js} +3 -3
  250. package/dist/velocity-CfuZoxPt.js +4 -0
  251. package/dist/verilog-CySTkzw_.js +4 -0
  252. package/dist/vhdl-Dvcd8KHW.js +4 -0
  253. package/dist/webidl-tbJt7sKk.js +4 -0
  254. package/dist/xquery-DJQVztyc.js +4 -0
  255. package/dist/{xychartDiagram-6GGTOJPD-C7Bhm_yt.js → xychartDiagram-6GGTOJPD-njc-naaw.js} +23 -22
  256. package/dist/yacas-BbgBReEH.js +4 -0
  257. package/dist/z80-DPyb8VGz.js +4 -0
  258. package/package.json +10 -6
  259. package/src/components/app-config/ai-config.tsx +1 -3
  260. package/src/components/app-config/common.tsx +14 -0
  261. package/src/components/app-config/data-form.tsx +282 -0
  262. package/src/components/app-config/user-config-form.tsx +36 -223
  263. package/src/components/chat/acp/__tests__/state.test.ts +75 -2
  264. package/src/components/chat/acp/agent-panel.tsx +143 -89
  265. package/src/components/chat/acp/blocks.tsx +77 -34
  266. package/src/components/chat/acp/state.ts +5 -1
  267. package/src/components/chat/acp/thread.tsx +12 -1
  268. package/src/components/chat/chat-panel.tsx +38 -5
  269. package/src/components/chat/chat-utils.ts +5 -1
  270. package/src/components/chat/markdown-renderer.css +1 -0
  271. package/src/components/chat/tool-call-accordion.tsx +7 -1
  272. package/src/components/data-table/charts/__tests__/storage.test.ts +12 -6
  273. package/src/components/data-table/charts/charts.tsx +8 -2
  274. package/src/components/data-table/charts/storage.ts +1 -1
  275. package/src/components/data-table/column-wrapping/feature.ts +2 -0
  276. package/src/components/data-table/columns.tsx +10 -2
  277. package/src/components/data-table/renderers.tsx +3 -2
  278. package/src/components/editor/Output.tsx +28 -24
  279. package/src/components/editor/actions/useCellActionButton.tsx +20 -4
  280. package/src/components/editor/ai/add-cell-with-ai.tsx +17 -3
  281. package/src/components/editor/ai/ai-completion-editor.tsx +79 -32
  282. package/src/components/editor/ai/completion-handlers.tsx +26 -7
  283. package/src/components/editor/cell/StagedAICell.tsx +81 -12
  284. package/src/components/editor/cell/code/cell-editor.tsx +2 -3
  285. package/src/components/editor/cell/useRunCells.ts +62 -30
  286. package/src/components/editor/chrome/panels/cache-panel.tsx +2 -2
  287. package/src/components/editor/chrome/panels/packages-panel.tsx +1 -1
  288. package/src/components/editor/chrome/state.ts +1 -1
  289. package/src/components/editor/chrome/wrapper/app-chrome.tsx +2 -0
  290. package/src/components/editor/chrome/wrapper/minimap.tsx +2 -0
  291. package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +108 -0
  292. package/src/components/editor/chrome/wrapper/sidebar.tsx +1 -1
  293. package/src/components/editor/code/readonly-diff.tsx +49 -0
  294. package/src/components/editor/columns/storage.ts +1 -1
  295. package/src/components/editor/errors/fix-mode.ts +6 -1
  296. package/src/components/editor/inputs/Inputs.styles.ts +1 -1
  297. package/src/components/editor/output/CalloutOutput.tsx +1 -1
  298. package/src/components/editor/output/HtmlOutput.tsx +3 -2
  299. package/src/components/editor/output/JsonOutput.tsx +6 -1
  300. package/src/components/editor/output/MarimoTracebackOutput.tsx +59 -45
  301. package/src/components/editor/output/__tests__/HtmlOutput.test.tsx +134 -0
  302. package/src/components/editor/output/__tests__/traceback.test.tsx +8 -1
  303. package/src/components/editor/output/useWrapText.ts +6 -1
  304. package/src/components/editor/package-alert.tsx +34 -32
  305. package/src/components/editor/renderers/vertical-layout/vertical-layout-wrapper.tsx +5 -2
  306. package/src/components/home/state.ts +3 -2
  307. package/src/components/scratchpad/scratchpad-history.ts +6 -1
  308. package/src/components/slides/slides-component.tsx +25 -21
  309. package/src/components/ui/confirmation-button.tsx +1 -1
  310. package/src/components/ui/context-menu.tsx +14 -4
  311. package/src/components/ui/dropdown-menu.tsx +14 -4
  312. package/src/components/ui/fullscreen.tsx +115 -1
  313. package/src/components/ui/popover.tsx +11 -3
  314. package/src/components/ui/range-slider.tsx +1 -1
  315. package/src/components/ui/select.tsx +7 -3
  316. package/src/components/ui/slider.tsx +1 -1
  317. package/src/components/ui/tooltip.tsx +10 -3
  318. package/src/core/ai/__tests__/staged-cells.test.ts +189 -64
  319. package/src/core/ai/config.ts +6 -2
  320. package/src/core/ai/context/providers/__tests__/__snapshots__/cell-output.test.ts.snap +17 -0
  321. package/src/core/ai/context/providers/__tests__/cell-output.test.ts +194 -10
  322. package/src/core/ai/context/providers/cell-output.ts +170 -112
  323. package/src/core/ai/context/providers/tables.ts +2 -2
  324. package/src/core/ai/staged-cells.ts +32 -16
  325. package/src/core/ai/state.ts +2 -1
  326. package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +556 -0
  327. package/src/core/ai/tools/__tests__/registry.test.ts +12 -4
  328. package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +450 -0
  329. package/src/core/ai/tools/__tests__/utils.test.ts +87 -0
  330. package/src/core/ai/tools/base.ts +31 -8
  331. package/src/core/ai/tools/edit-notebook-tool.ts +239 -0
  332. package/src/core/ai/tools/registry.ts +13 -6
  333. package/src/core/ai/tools/run-cells-tool.ts +233 -0
  334. package/src/core/ai/tools/sample-tool.ts +10 -8
  335. package/src/core/ai/tools/utils.ts +23 -0
  336. package/src/core/cells/__tests__/cells.test.ts +19 -1
  337. package/src/core/cells/__tests__/session.test.ts +20 -3
  338. package/src/core/cells/cells.ts +12 -7
  339. package/src/core/cells/session.ts +1 -1
  340. package/src/core/codemirror/ai/resources.ts +13 -2
  341. package/src/core/codemirror/copilot/state.ts +4 -2
  342. package/src/core/codemirror/language/__tests__/extension.test.ts +10 -2
  343. package/src/core/codemirror/language/languages/markdown.ts +16 -153
  344. package/src/core/codemirror/language/languages/python.ts +12 -7
  345. package/src/core/codemirror/language/languages/sql/sql-mode.ts +6 -1
  346. package/src/core/codemirror/language/languages/sql/sql.ts +20 -293
  347. package/src/core/codemirror/language/panel/markdown.tsx +2 -1
  348. package/src/core/codemirror/language/panel/panel.tsx +1 -1
  349. package/src/core/codemirror/lsp/federated-lsp.ts +1 -1
  350. package/src/core/codemirror/lsp/transports.ts +7 -13
  351. package/src/core/config/config-schema.ts +4 -1
  352. package/src/core/hotkeys/hotkeys.ts +12 -0
  353. package/src/core/lsp/__tests__/transport.test.ts +233 -0
  354. package/src/core/lsp/transport.ts +139 -0
  355. package/src/core/rtc/state.ts +6 -1
  356. package/src/core/vscode/is-in-vscode.ts +9 -0
  357. package/src/core/wasm/store.ts +1 -1
  358. package/src/css/app/Cell.css +31 -0
  359. package/src/css/globals.css +5 -0
  360. package/src/hooks/useIframeCapabilities.ts +14 -0
  361. package/src/hooks/useLocalStorage.ts +1 -1
  362. package/src/plugins/core/RenderHTML.tsx +65 -5
  363. package/src/plugins/core/__test__/RenderHTML.test.ts +25 -23
  364. package/src/plugins/core/__test__/renderHTML-sanitization.test.tsx +131 -0
  365. package/src/plugins/core/__test__/sanitize.test.ts +465 -0
  366. package/src/plugins/core/registerReactComponent.tsx +14 -1
  367. package/src/plugins/core/sanitize.ts +76 -0
  368. package/src/plugins/impl/DataTablePlugin.tsx +1 -0
  369. package/src/plugins/impl/FileBrowserPlugin.tsx +1 -3
  370. package/src/plugins/impl/FileUploadPlugin.tsx +1 -3
  371. package/src/plugins/impl/__tests__/DateTimePickerPlugin.test.tsx +8 -1
  372. package/src/plugins/impl/__tests__/DropdownPlugin.test.tsx +6 -0
  373. package/src/plugins/impl/__tests__/MultiSelectPlugin.test.ts +8 -1
  374. package/src/plugins/impl/__tests__/NumberPlugin.test.tsx +3 -0
  375. package/src/plugins/impl/plotly/parse-from-template.ts +1 -1
  376. package/src/utils/__tests__/arrays.test.ts +42 -0
  377. package/src/utils/__tests__/capabilities.test.ts +453 -0
  378. package/src/utils/__tests__/formatting.test.ts +13 -13
  379. package/src/utils/__tests__/local-storage.test.ts +1 -1
  380. package/src/utils/__tests__/storage.test.ts +21 -21
  381. package/src/utils/arrays.ts +25 -0
  382. package/src/utils/capabilities.ts +114 -0
  383. package/src/utils/numbers.ts +2 -2
  384. package/src/utils/{storage.ts → storage/jotai.ts} +16 -4
  385. package/src/utils/storage/storage.ts +57 -0
  386. package/src/utils/{localStorage.ts → storage/typed.ts} +22 -12
  387. package/dist/any-language-editor-CEXn1vFs.js +0 -156
  388. package/dist/apl-DuVfHsPc.js +0 -4
  389. package/dist/architecture-O4VJ6CD3-lp-opOaL.js +0 -21
  390. package/dist/asciiarmor-qIVWsi4F.js +0 -4
  391. package/dist/asn1-BjPqARr7.js +0 -4
  392. package/dist/assets/__vite-browser-external-lX-sn9m2.js +0 -1
  393. package/dist/brainfuck-DPGTVfkE.js +0 -4
  394. package/dist/classDiagram-KNZD7YFC-azuS_99k.js +0 -39
  395. package/dist/classDiagram-v2-RKCZMP56-CQpyQQOR.js +0 -39
  396. package/dist/clojure-ATksAecl.js +0 -4
  397. package/dist/cmake-CWylaz2C.js +0 -4
  398. package/dist/cobol-BiLLCZIQ.js +0 -4
  399. package/dist/coffeescript-Ca4jipi8.js +0 -4
  400. package/dist/commonlisp-BwFjyEC7.js +0 -4
  401. package/dist/crystal-BhUsQHbh.js +0 -4
  402. package/dist/css-Cf4wlIyV.js +0 -5
  403. package/dist/cypher-Dj8Hzgxa.js +0 -4
  404. package/dist/d-DZI7tbTy.js +0 -4
  405. package/dist/diff-WQISUHG5.js +0 -4
  406. package/dist/dist-BawZu0ix.js +0 -10
  407. package/dist/dist-BiOF7987.js +0 -6
  408. package/dist/dist-Cs3McXEj.js +0 -6
  409. package/dist/dist-D3aaithT.js +0 -6
  410. package/dist/dist-DELcMSpJ.js +0 -6
  411. package/dist/dist-Dgts3WXd.js +0 -6
  412. package/dist/dist-DtpUiDG_.js +0 -6
  413. package/dist/dist-ZjnJq_jD.js +0 -10
  414. package/dist/dist-mof3iuBu.js +0 -12
  415. package/dist/dtd-B2M8dhfC.js +0 -4
  416. package/dist/dylan-CU3Vt8SC.js +0 -4
  417. package/dist/ecl-B8ESAVq4.js +0 -4
  418. package/dist/eiffel-DDfMIKeA.js +0 -4
  419. package/dist/elm-Bj6rj8jf.js +0 -4
  420. package/dist/erlang-BxyshZUq.js +0 -4
  421. package/dist/error-banner-npbEfanI.js +0 -1012
  422. package/dist/esm-svAVli9f.js +0 -26
  423. package/dist/factor-CYk6XT8r.js +0 -5
  424. package/dist/forth-fcoJkd-f.js +0 -4
  425. package/dist/fortran-IxZHu4wc.js +0 -4
  426. package/dist/gas-B8rmKcim.js +0 -4
  427. package/dist/gherkin-BTm-jIdJ.js +0 -4
  428. package/dist/gitGraph-ZV4HHKMB-DFg_OLQb.js +0 -21
  429. package/dist/groovy-01kRHFMD.js +0 -4
  430. package/dist/haskell-B3PhE05w.js +0 -4
  431. package/dist/haxe-DEoAm8oA.js +0 -5
  432. package/dist/idl-DsDJU9cV.js +0 -4
  433. package/dist/info-63CPKGFF-D3DZmDBa.js +0 -21
  434. package/dist/infoDiagram-STP46IZ2-ec08vi_U.js +0 -44
  435. package/dist/javascript-gwczVhuU.js +0 -5
  436. package/dist/jinja2-AkZRdFk3.js +0 -4
  437. package/dist/julia-_s6qe3bf.js +0 -4
  438. package/dist/livescript-CwPHQdv5.js +0 -4
  439. package/dist/lua-s7nRxkCP.js +0 -4
  440. package/dist/mathematica-Ci36yd1q.js +0 -4
  441. package/dist/mbox-DbOYMNCO.js +0 -4
  442. package/dist/mirc-VmNe8AwF.js +0 -4
  443. package/dist/mllike-BdD7SJEa.js +0 -6
  444. package/dist/modelica-BA4VqzC3.js +0 -4
  445. package/dist/mscgen-DF-5WHJm.js +0 -6
  446. package/dist/mumps-c_Uia_QN.js +0 -4
  447. package/dist/nsis-BAANGODV.js +0 -5
  448. package/dist/ntriples-Bslqh2Ki.js +0 -4
  449. package/dist/octave-DYn5ltia.js +0 -4
  450. package/dist/oz-B_N-StZq.js +0 -4
  451. package/dist/packet-HUATNLJX-CkqjFdAv.js +0 -21
  452. package/dist/pascal-DU4CtAUu.js +0 -4
  453. package/dist/perl-Bae6k32u.js +0 -4
  454. package/dist/pie-WTHONI2E-D0rWwX5P.js +0 -21
  455. package/dist/pig-DSIxUEgX.js +0 -4
  456. package/dist/powershell-31lcPgIF.js +0 -4
  457. package/dist/properties-lmYbntDG.js +0 -4
  458. package/dist/protobuf-BTYoCEpV.js +0 -4
  459. package/dist/pug-DMFM7zzO.js +0 -5
  460. package/dist/puppet-B0ub07d-.js +0 -4
  461. package/dist/python-C4jT87Nt.js +0 -5
  462. package/dist/q-YbPYlqRI.js +0 -4
  463. package/dist/r-OfNu6HAI.js +0 -4
  464. package/dist/radar-NJJJXTRR-Bxqv4O5a.js +0 -21
  465. package/dist/rpm-D_3b5peD.js +0 -5
  466. package/dist/ruby-CehsJy_T.js +0 -4
  467. package/dist/sas-DwQHzPoF.js +0 -4
  468. package/dist/scheme-B6ArxiQu.js +0 -4
  469. package/dist/shell-AHmQgDfc.js +0 -4
  470. package/dist/sieve-CgodKOcx.js +0 -4
  471. package/dist/smalltalk-BeFzDkbo.js +0 -4
  472. package/dist/sparql-BWxq-Lnx.js +0 -4
  473. package/dist/stateDiagram-v2-UMBNRL4Z-D9v8fKjF.js +0 -38
  474. package/dist/stex-Dvaq0qsm.js +0 -5
  475. package/dist/stylus-Ge0ofWlZ.js +0 -4
  476. package/dist/swift-CjQfbVxV.js +0 -4
  477. package/dist/tcl-CAGDF11K.js +0 -4
  478. package/dist/textile-CrXreJtf.js +0 -4
  479. package/dist/toml-AdLXKwEi.js +0 -4
  480. package/dist/treemap-75Q7IDZK-Da9Jv6a_.js +0 -21
  481. package/dist/troff-C-LaM2ex.js +0 -4
  482. package/dist/ttcn-DTclUi6T.js +0 -4
  483. package/dist/ttcn-cfg-BtBPbmLX.js +0 -4
  484. package/dist/turtle-BODDDg5O.js +0 -4
  485. package/dist/vb-Cb1HQHii.js +0 -4
  486. package/dist/vbscript-CpXOP4wZ.js +0 -4
  487. package/dist/velocity-Dz0rBQIk.js +0 -4
  488. package/dist/verilog-6Di9aLKw.js +0 -4
  489. package/dist/vhdl-BRNesXYc.js +0 -4
  490. package/dist/webidl-BpRNYIYn.js +0 -4
  491. package/dist/xquery-DXWcJ7b6.js +0 -4
  492. package/dist/yacas-DbSARPz4.js +0 -4
  493. package/dist/z80-DzslPj_l.js +0 -4
  494. package/src/core/codemirror/language/__tests__/ast.test.ts +0 -124
  495. package/src/core/codemirror/language/utils/ast.ts +0 -84
  496. package/src/core/codemirror/language/utils/quotes.ts +0 -18
  497. /package/dist/{_arrayReduce-CVwxyrBP.js → _arrayReduce-Cd9xQjbl.js} +0 -0
  498. /package/dist/{_baseSlice-OgpvpOOJ.js → _baseSlice-CE9WsQZm.js} +0 -0
  499. /package/dist/{_hasUnicode-BgIggCqE.js → _hasUnicode-DkEebvtD.js} +0 -0
  500. /package/dist/{apl-CEHentF4.js → apl-aGhy11IM.js} +0 -0
  501. /package/dist/{array-aAxy08hN.js → array-DYSXIreg.js} +0 -0
  502. /package/dist/{asciiarmor-DURYiCS0.js → asciiarmor-DJKJ3Gkn.js} +0 -0
  503. /package/dist/{asn1-ETAiEoXY.js → asn1-C6f5IeNs.js} +0 -0
  504. /package/dist/{asterisk-DTpbbXPb.js → asterisk-DB1poX9_.js} +0 -0
  505. /package/dist/{brainfuck-BWQep-SA.js → brainfuck-Ch9vjun0.js} +0 -0
  506. /package/dist/{chunk-57QY23SG-0TxCfmy_.js → chunk-57QY23SG-BpXU7ph4.js} +0 -0
  507. /package/dist/{clike-bzZTreP4.js → clike-Bc2PZzZQ.js} +0 -0
  508. /package/dist/{clojure-BzFapDkA.js → clojure-B_lpr3zt.js} +0 -0
  509. /package/dist/{cmake-DvlbIC8x.js → cmake-DaocNF4I.js} +0 -0
  510. /package/dist/{cobol-BrEI4cPR.js → cobol-suTPtt7c.js} +0 -0
  511. /package/dist/{coffeescript-B6cvu8mO.js → coffeescript-CPLIvtqJ.js} +0 -0
  512. /package/dist/{colors-Cr_mZ2aH.js → colors-BXlG8Lmz.js} +0 -0
  513. /package/dist/{common-keywords-WqQm7W8t.js → common-keywords-Bhll7O3b.js} +0 -0
  514. /package/dist/{commonlisp-BIT8PQqi.js → commonlisp-BqM3qFK7.js} +0 -0
  515. /package/dist/{crystal-B_UcPArT.js → crystal-AsSFu4ke.js} +0 -0
  516. /package/dist/{css-dHbnt_zl.js → css-Df7Sdeyh.js} +0 -0
  517. /package/dist/{cypher-Dh3FOpL7.js → cypher-CaVKL6Gu.js} +0 -0
  518. /package/dist/{cytoscape.esm-BTpRoPd2.js → cytoscape.esm-BFEMljQI.js} +0 -0
  519. /package/dist/{d-CQD1IHee.js → d-DCGWK7NQ.js} +0 -0
  520. /package/dist/{defaultLocale-BAgEOGks.js → defaultLocale-CYgZlqDF.js} +0 -0
  521. /package/dist/{defaultLocale-471SYAPk.js → defaultLocale-Cto8YOmX.js} +0 -0
  522. /package/dist/{diff-CpF_IDx0.js → diff-CsxOM4Tr.js} +0 -0
  523. /package/dist/{dist-CK8Gj3GX.js → dist-C76MUPD3.js} +0 -0
  524. /package/dist/{dtd-DYoNpy6c.js → dtd-Dwr0Jmks.js} +0 -0
  525. /package/dist/{duckdb-keywords-CdIsl9L0.js → duckdb-keywords-7wAWf848.js} +0 -0
  526. /package/dist/{dylan-Bc_2G1E-.js → dylan-A7-ZBSey.js} +0 -0
  527. /package/dist/{ebnf-jGVT_YpN.js → ebnf-9_SaGDUz.js} +0 -0
  528. /package/dist/{ecl-UIU-P-Ar.js → ecl-BzJVIQDc.js} +0 -0
  529. /package/dist/{eiffel-C90Oyuix.js → eiffel-CO9eC_Op.js} +0 -0
  530. /package/dist/{elm-B9fWSySj.js → elm-CVAWj8SB.js} +0 -0
  531. /package/dist/{emotion-is-prop-valid.esm-BHMWayAG.js → emotion-is-prop-valid.esm-C3Yi5GQt.js} +0 -0
  532. /package/dist/{erlang-Ccff0UAn.js → erlang-DWbZP546.js} +0 -0
  533. /package/dist/{fcl-CGR8NxAg.js → fcl-CM9t2iay.js} +0 -0
  534. /package/dist/{forth-U1ROGcBY.js → forth-BTYqUuu3.js} +0 -0
  535. /package/dist/{fortran-3nOkjDmc.js → fortran-DgAjHcCq.js} +0 -0
  536. /package/dist/{gas-B_4H5FzV.js → gas-BjDSWPZd.js} +0 -0
  537. /package/dist/{gherkin-B0eru5Uz.js → gherkin-ClRqqpKv.js} +0 -0
  538. /package/dist/{groovy-dqjtZUVf.js → groovy-BzNjnc8x.js} +0 -0
  539. /package/dist/{haskell-DFzCCQzo.js → haskell-DLdk34Jq.js} +0 -0
  540. /package/dist/{haxe-Da8Pj5RT.js → haxe-l6gaY_IS.js} +0 -0
  541. /package/dist/{http-1HACL_9s.js → http-6Qg7z_h2.js} +0 -0
  542. /package/dist/{idl-D3NXs5iM.js → idl-hlWT4D26.js} +0 -0
  543. /package/dist/{init-D6eDd7H0.js → init-tZ42Torz.js} +0 -0
  544. /package/dist/{isArrayLikeObject-BlvK28do.js → isArrayLikeObject-DU5MCuQM.js} +0 -0
  545. /package/dist/{javascript-BfCTmOnk.js → javascript-DGukg1sB.js} +0 -0
  546. /package/dist/{jinja2-gBHAxUdF.js → jinja2-DI5k_Er3.js} +0 -0
  547. /package/dist/{julia-bG-6nJ-_.js → julia-BvDZDiIT.js} +0 -0
  548. /package/dist/{katex-mkWmhPUh.js → katex-DgfMWJY9.js} +0 -0
  549. /package/dist/{livescript-BlsRC8UJ.js → livescript-2YMQfkfI.js} +0 -0
  550. /package/dist/{lua-BbDC0_5w.js → lua-DIUrQRfA.js} +0 -0
  551. /package/dist/{main-Czi9-LVy.js → main-BMTpe7M0.js} +0 -0
  552. /package/dist/{marked.esm-DJM8la36.js → marked.esm-DkVwEwtO.js} +0 -0
  553. /package/dist/{math-C7wLpe9K.js → math-qsHyz2Eo.js} +0 -0
  554. /package/dist/{mathematica-YZTe3-PF.js → mathematica-Dqmg_BwL.js} +0 -0
  555. /package/dist/{mbox-CY5idp08.js → mbox-Cng-P-F1.js} +0 -0
  556. /package/dist/{mirc-CbQuFZKk.js → mirc-CNDqOVhQ.js} +0 -0
  557. /package/dist/{mllike-DsbHMX-5.js → mllike-C1n2UDyX.js} +0 -0
  558. /package/dist/{modelica-CQuvsOQk.js → modelica-QqQC2pFj.js} +0 -0
  559. /package/dist/{mscgen-LIpBP9VR.js → mscgen-C3fl8uhp.js} +0 -0
  560. /package/dist/{mumps-Ct5NXoaG.js → mumps-BeCUbMej.js} +0 -0
  561. /package/dist/{nginx-Dvc62C8z.js → nginx-ejv7DsBz.js} +0 -0
  562. /package/dist/{node-sql-parser-BqKV-TpL.js → node-sql-parser-CoPWN4hn.js} +0 -0
  563. /package/dist/{ntriples-jVkxWUuv.js → ntriples-CUgUpcma.js} +0 -0
  564. /package/dist/{octave-jGOImUB0.js → octave-BD652tGl.js} +0 -0
  565. /package/dist/{oz-Y0FKDMS2.js → oz-DrRsFa0K.js} +0 -0
  566. /package/dist/{pascal-BaLtPWWB.js → pascal-hpcx9sVn.js} +0 -0
  567. /package/dist/{path-VDkDgx1I.js → path-Bbv2tLY1.js} +0 -0
  568. /package/dist/{perl-CjfE0JLo.js → perl-DW8XHeFc.js} +0 -0
  569. /package/dist/{pig-DE4epV99.js → pig-Cv7Nxbfo.js} +0 -0
  570. /package/dist/{powershell-BZx53Ujw.js → powershell-Dr7WZMDU.js} +0 -0
  571. /package/dist/{prop-types-0wNc-99T.js → prop-types-Bd16OEUP.js} +0 -0
  572. /package/dist/{properties-CLyCG5C-.js → properties-D-qJDXAM.js} +0 -0
  573. /package/dist/{protobuf-BjBBs_V4.js → protobuf-B48QZbd3.js} +0 -0
  574. /package/dist/{puppet-ZImLuomA.js → puppet-15JDyiY2.js} +0 -0
  575. /package/dist/{python-C9YN71pR.js → python-DWkQA94h.js} +0 -0
  576. /package/dist/{q-CMoUHJ5Q.js → q-BzRpKgfd.js} +0 -0
  577. /package/dist/{r-DILmKWWW.js → r-dcNRe_Q8.js} +0 -0
  578. /package/dist/{range-PcytnUSJ.js → range-CQvYp_qE.js} +0 -0
  579. /package/dist/{rpm-fpIsm1Kr.js → rpm-Djl3Dsf1.js} +0 -0
  580. /package/dist/{ruby-BuiQI41h.js → ruby-Dd2CZTip.js} +0 -0
  581. /package/dist/{sas-C76sJ1zF.js → sas-DYF5_Iqu.js} +0 -0
  582. /package/dist/{scheme-DHjM-txv.js → scheme-YtWcji1H.js} +0 -0
  583. /package/dist/{shell--7NmGJ9p.js → shell-C3uC3Y0Z.js} +0 -0
  584. /package/dist/{sieve-DaPvBv1M.js → sieve-DHB17sQG.js} +0 -0
  585. /package/dist/{simple-mode-BP3Jd4vf.js → simple-mode-BMmwP_vI.js} +0 -0
  586. /package/dist/{smalltalk-KPvwrjCs.js → smalltalk-Y5v1Np3H.js} +0 -0
  587. /package/dist/{solr-PvZUtEDb.js → solr-DvRJLlRD.js} +0 -0
  588. /package/dist/{sparql-CXSUIQer.js → sparql-BEt3GJwM.js} +0 -0
  589. /package/dist/{spreadsheet-DPJdGPkx.js → spreadsheet-Dp4B9_rc.js} +0 -0
  590. /package/dist/{sql-Dp4ZLSIa.js → sql-DBsUs8nQ.js} +0 -0
  591. /package/dist/{stex-CeXW4zzk.js → stex-C6-x52ei.js} +0 -0
  592. /package/dist/{stylus-BXcmrg9w.js → stylus-DroA8via.js} +0 -0
  593. /package/dist/{swift-DD8I7hKP.js → swift-DR0x1ESK.js} +0 -0
  594. /package/dist/{tcl-B9Lp4GtA.js → tcl-BeuTFc_c.js} +0 -0
  595. /package/dist/{textile-qdiY0teq.js → textile-C0ikhHN3.js} +0 -0
  596. /package/dist/{tiddlywiki-t32lkubq.js → tiddlywiki-C_2Nvsgu.js} +0 -0
  597. /package/dist/{tiki-B0qKrSMl.js → tiki-CKQlhmQQ.js} +0 -0
  598. /package/dist/{timer-CzOhIJuk.js → timer-CcUhugb0.js} +0 -0
  599. /package/dist/{toml-eSl4PUAH.js → toml-BqNUJWRI.js} +0 -0
  600. /package/dist/{treemap-BpgMKHv-.js → treemap-BYLUKIzA.js} +0 -0
  601. /package/dist/{troff-105XJOEu.js → troff-DkK0f2ZH.js} +0 -0
  602. /package/dist/{tslib.es6-DofFyd9S.js → tslib.es6-3ZL768sZ.js} +0 -0
  603. /package/dist/{ttcn-1_BxDcM8.js → ttcn-Bf8vrg-_.js} +0 -0
  604. /package/dist/{ttcn-cfg-Cn_XgXiw.js → ttcn-cfg-DjCKzd95.js} +0 -0
  605. /package/dist/{turtle-BI6LyfEu.js → turtle-SSc84S9m.js} +0 -0
  606. /package/dist/{vb-BecoBfmr.js → vb-CQ6DC3cL.js} +0 -0
  607. /package/dist/{vbscript-De-zpA4i.js → vbscript-Dw0gFssg.js} +0 -0
  608. /package/dist/{velocity-DhlYJTrD.js → velocity-BvJQyBmj.js} +0 -0
  609. /package/dist/{verilog-BDZgxDOW.js → verilog-CKGAvQjj.js} +0 -0
  610. /package/dist/{vhdl-CV0OKTbp.js → vhdl-B40_x6fM.js} +0 -0
  611. /package/dist/{webidl-BOM1Fs0O.js → webidl-Bi9hczCv.js} +0 -0
  612. /package/dist/{xquery-CltP_CGh.js → xquery-DwWUXvP3.js} +0 -0
  613. /package/dist/{yacas-Dch4E2Dg.js → yacas-ClUs0mmH.js} +0 -0
  614. /package/dist/{z80-B5Yly27o.js → z80-DPC4UGzR.js} +0 -0
  615. /package/dist/{zod-ChY6miG5.js → zod-mAEs2ITo.js} +0 -0
@@ -0,0 +1,233 @@
1
+ /* Copyright 2024 Marimo. All rights reserved. */
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+
4
+ import { WebSocketTransport } from "@open-rpc/client-js";
5
+ import { beforeEach, describe, expect, it, vi } from "vitest";
6
+ import { Mocks } from "@/__mocks__/common";
7
+ import { ReconnectingWebSocketTransport } from "../transport";
8
+
9
+ // Mock the Logger
10
+ vi.mock("@/utils/Logger", () => ({
11
+ Logger: Mocks.logger(),
12
+ }));
13
+
14
+ // Mock the WebSocketTransport
15
+ vi.mock("@open-rpc/client-js", () => {
16
+ const mockWebSocketTransport = vi.fn();
17
+ mockWebSocketTransport.prototype.connect = vi.fn();
18
+ mockWebSocketTransport.prototype.close = vi.fn();
19
+ mockWebSocketTransport.prototype.sendData = vi.fn();
20
+
21
+ return {
22
+ WebSocketTransport: mockWebSocketTransport,
23
+ };
24
+ });
25
+
26
+ describe("ReconnectingWebSocketTransport", () => {
27
+ const mockWsUrl = "ws://localhost:8080/lsp";
28
+ let mockConnection: any;
29
+
30
+ beforeEach(() => {
31
+ vi.clearAllMocks();
32
+
33
+ // Create a mock WebSocket connection with readyState
34
+ mockConnection = {
35
+ readyState: WebSocket.OPEN,
36
+ };
37
+
38
+ // Mock the WebSocketTransport constructor to set the connection
39
+ (WebSocketTransport as any).mockImplementation(function (this: any) {
40
+ this.connection = mockConnection;
41
+ this.connect = vi.fn().mockResolvedValue(undefined);
42
+ this.close = vi.fn();
43
+ this.sendData = vi.fn().mockResolvedValue({ result: "success" });
44
+ });
45
+ });
46
+
47
+ it("should create a transport with the provided URL function", () => {
48
+ const getWsUrl = vi.fn(() => mockWsUrl);
49
+ const transport = new ReconnectingWebSocketTransport({ getWsUrl });
50
+
51
+ expect(transport).toBeDefined();
52
+ expect(getWsUrl).not.toHaveBeenCalled(); // URL function not called until connect
53
+ });
54
+
55
+ it("should connect successfully", async () => {
56
+ const getWsUrl = vi.fn(() => mockWsUrl);
57
+ const transport = new ReconnectingWebSocketTransport({ getWsUrl });
58
+
59
+ await transport.connect();
60
+
61
+ expect(getWsUrl).toHaveBeenCalledTimes(1);
62
+ expect(WebSocketTransport).toHaveBeenCalledWith(mockWsUrl);
63
+ });
64
+
65
+ it("should wait for connection before connecting", async () => {
66
+ const getWsUrl = vi.fn(() => mockWsUrl);
67
+ const waitForConnection = vi.fn().mockResolvedValue(undefined);
68
+ const transport = new ReconnectingWebSocketTransport({
69
+ getWsUrl,
70
+ waitForConnection,
71
+ });
72
+
73
+ await transport.connect();
74
+
75
+ expect(waitForConnection).toHaveBeenCalledTimes(1);
76
+ expect(getWsUrl).toHaveBeenCalledTimes(1);
77
+ });
78
+
79
+ it("should reuse the same connection promise if already connecting", async () => {
80
+ const getWsUrl = vi.fn(() => mockWsUrl);
81
+ const waitForConnection = vi
82
+ .fn()
83
+ .mockImplementation(
84
+ () => new Promise((resolve) => setTimeout(resolve, 100)),
85
+ );
86
+ const transport = new ReconnectingWebSocketTransport({
87
+ getWsUrl,
88
+ waitForConnection,
89
+ });
90
+
91
+ // Start two connections concurrently
92
+ const promise1 = transport.connect();
93
+ const promise2 = transport.connect();
94
+
95
+ await Promise.all([promise1, promise2]);
96
+
97
+ // Should only create one delegate
98
+ expect(WebSocketTransport).toHaveBeenCalledTimes(1);
99
+ expect(waitForConnection).toHaveBeenCalledTimes(1);
100
+ });
101
+
102
+ it("should send data successfully when connected", async () => {
103
+ const getWsUrl = vi.fn(() => mockWsUrl);
104
+ const transport = new ReconnectingWebSocketTransport({ getWsUrl });
105
+
106
+ await transport.connect();
107
+
108
+ const data: any = { method: "test", params: [] };
109
+ const result = await transport.sendData(data, 5000);
110
+
111
+ expect(result).toEqual({ result: "success" });
112
+ });
113
+
114
+ it("should reconnect when WebSocket is in CLOSED state", async () => {
115
+ const getWsUrl = vi.fn(() => mockWsUrl);
116
+ const transport = new ReconnectingWebSocketTransport({ getWsUrl });
117
+
118
+ // First connection
119
+ await transport.connect();
120
+ expect(WebSocketTransport).toHaveBeenCalledTimes(1);
121
+
122
+ // Simulate WebSocket closing
123
+ mockConnection.readyState = WebSocket.CLOSED;
124
+
125
+ // Send data should trigger reconnection
126
+ const data: any = { method: "test", params: [] };
127
+ await transport.sendData(data, 5000);
128
+
129
+ // Should have created a new WebSocketTransport
130
+ expect(WebSocketTransport).toHaveBeenCalledTimes(2);
131
+ });
132
+
133
+ it("should reconnect when WebSocket is in CLOSING state", async () => {
134
+ const getWsUrl = vi.fn(() => mockWsUrl);
135
+ const transport = new ReconnectingWebSocketTransport({ getWsUrl });
136
+
137
+ // First connection
138
+ await transport.connect();
139
+ expect(WebSocketTransport).toHaveBeenCalledTimes(1);
140
+
141
+ // Simulate WebSocket closing
142
+ mockConnection.readyState = WebSocket.CLOSING;
143
+
144
+ // Send data should trigger reconnection
145
+ const data: any = { method: "test", params: [] };
146
+ await transport.sendData(data, 5000);
147
+
148
+ // Should have created a new WebSocketTransport
149
+ expect(WebSocketTransport).toHaveBeenCalledTimes(2);
150
+ });
151
+
152
+ it("should close the transport and prevent reconnection", async () => {
153
+ const getWsUrl = vi.fn(() => mockWsUrl);
154
+ const transport = new ReconnectingWebSocketTransport({ getWsUrl });
155
+
156
+ await transport.connect();
157
+ transport.close();
158
+
159
+ // Attempting to connect again should throw
160
+ await expect(transport.connect()).rejects.toThrow("Transport is closed");
161
+ });
162
+
163
+ it("should close old delegate when creating a new one", async () => {
164
+ const getWsUrl = vi.fn(() => mockWsUrl);
165
+ const transport = new ReconnectingWebSocketTransport({ getWsUrl });
166
+
167
+ // First connection
168
+ await transport.connect();
169
+ const firstDelegate = (transport as any).delegate;
170
+ expect(firstDelegate).toBeDefined();
171
+
172
+ // Simulate connection closed
173
+ mockConnection.readyState = WebSocket.CLOSED;
174
+
175
+ // Reconnect by sending data
176
+ const data: any = { method: "test", params: [] };
177
+ await transport.sendData(data, 5000);
178
+
179
+ // Old delegate should have been closed
180
+ expect(firstDelegate.close).toHaveBeenCalled();
181
+ });
182
+
183
+ it("should handle connection failures gracefully", async () => {
184
+ const getWsUrl = vi.fn(() => mockWsUrl);
185
+ const connectionError = new Error("Connection failed");
186
+
187
+ // Mock connect to fail
188
+ (WebSocketTransport as any).mockImplementationOnce(function (this: any) {
189
+ this.connection = mockConnection;
190
+ this.connect = vi.fn().mockRejectedValue(connectionError);
191
+ this.close = vi.fn();
192
+ this.sendData = vi.fn();
193
+ });
194
+
195
+ const transport = new ReconnectingWebSocketTransport({ getWsUrl });
196
+
197
+ await expect(transport.connect()).rejects.toThrow("Connection failed");
198
+
199
+ // Delegate should be cleared after failure
200
+ expect((transport as any).delegate).toBeUndefined();
201
+ });
202
+
203
+ it("should handle waitForConnection failures", async () => {
204
+ const getWsUrl = vi.fn(() => mockWsUrl);
205
+ const waitError = new Error("Wait failed");
206
+ const waitForConnection = vi.fn().mockRejectedValue(waitError);
207
+
208
+ const transport = new ReconnectingWebSocketTransport({
209
+ getWsUrl,
210
+ waitForConnection,
211
+ });
212
+
213
+ await expect(transport.connect()).rejects.toThrow("Wait failed");
214
+
215
+ // Should not have created a delegate
216
+ expect(WebSocketTransport).not.toHaveBeenCalled();
217
+ });
218
+
219
+ it("should automatically reconnect on sendData after connection loss", async () => {
220
+ const getWsUrl = vi.fn(() => mockWsUrl);
221
+ const transport = new ReconnectingWebSocketTransport({ getWsUrl });
222
+
223
+ // Don't connect initially
224
+ // Simulate WebSocket in closed state (no delegate exists)
225
+ expect((transport as any).delegate).toBeUndefined();
226
+
227
+ // Send data should trigger automatic connection
228
+ const data: any = { method: "test", params: [] };
229
+ await transport.sendData(data, 5000);
230
+
231
+ expect(WebSocketTransport).toHaveBeenCalledTimes(1);
232
+ });
233
+ });
@@ -0,0 +1,139 @@
1
+ /* Copyright 2024 Marimo. All rights reserved. */
2
+ import { WebSocketTransport } from "@open-rpc/client-js";
3
+ import type { JSONRPCRequestData } from "@open-rpc/client-js/build/Request";
4
+ import { Transport } from "@open-rpc/client-js/build/transports/Transport";
5
+ import { Logger } from "@/utils/Logger";
6
+
7
+ export interface ReconnectingWebSocketTransportOptions {
8
+ /**
9
+ * Function that returns the WebSocket URL to connect to.
10
+ */
11
+ getWsUrl: () => string;
12
+
13
+ /**
14
+ * Optional function to wait for before attempting to connect.
15
+ * This is useful for ensuring dependencies (like the runtime) are ready.
16
+ */
17
+ waitForConnection?: () => Promise<void>;
18
+ }
19
+
20
+ /**
21
+ * A WebSocket transport that automatically reconnects when the connection is lost.
22
+ * This handles cases like computer sleep/wake or network interruptions.
23
+ */
24
+ export class ReconnectingWebSocketTransport extends Transport {
25
+ private delegate: WebSocketTransport | undefined;
26
+ private readonly options: ReconnectingWebSocketTransportOptions;
27
+ private connectionPromise: Promise<void> | undefined;
28
+ private isClosed = false;
29
+
30
+ constructor(options: ReconnectingWebSocketTransportOptions) {
31
+ super();
32
+ this.options = options;
33
+ this.delegate = undefined;
34
+ }
35
+
36
+ /**
37
+ * Create a new WebSocket delegate, replacing any existing one.
38
+ */
39
+ private createDelegate(): WebSocketTransport {
40
+ // Close the old delegate if it exists
41
+ if (this.delegate) {
42
+ try {
43
+ this.delegate.close();
44
+ } catch (error) {
45
+ Logger.warn("Error closing old WebSocket delegate", error);
46
+ }
47
+ }
48
+
49
+ // Create a new delegate
50
+ this.delegate = new WebSocketTransport(this.options.getWsUrl());
51
+ return this.delegate;
52
+ }
53
+
54
+ /**
55
+ * Check if the current delegate's WebSocket is in a closed or closing state.
56
+ */
57
+ private isDelegateClosedOrClosing(): boolean {
58
+ if (!this.delegate) {
59
+ return true;
60
+ }
61
+
62
+ // Access the internal connection to check its readyState
63
+ const ws = this.delegate.connection;
64
+ if (!ws) {
65
+ return true;
66
+ }
67
+
68
+ // WebSocket.CLOSING = 2, WebSocket.CLOSED = 3
69
+ return (
70
+ ws.readyState === WebSocket.CLOSING || ws.readyState === WebSocket.CLOSED
71
+ );
72
+ }
73
+
74
+ override async connect() {
75
+ // Don't reconnect if explicitly closed
76
+ if (this.isClosed) {
77
+ throw new Error("Transport is closed");
78
+ }
79
+
80
+ // If already connecting, wait for that connection
81
+ if (this.connectionPromise) {
82
+ return this.connectionPromise;
83
+ }
84
+
85
+ this.connectionPromise = (async () => {
86
+ try {
87
+ // Wait for dependencies to be ready (e.g., runtime connection)
88
+ if (this.options.waitForConnection) {
89
+ await this.options.waitForConnection();
90
+ }
91
+
92
+ // Create a new delegate if needed
93
+ let delegate = this.delegate;
94
+ if (!delegate || this.isDelegateClosedOrClosing()) {
95
+ delegate = this.createDelegate();
96
+ }
97
+
98
+ // Connect the delegate
99
+ await delegate.connect();
100
+ Logger.log("WebSocket transport connected successfully");
101
+ } catch (error) {
102
+ Logger.error("WebSocket transport connection failed", error);
103
+ // Clear the delegate on failure so we create a new one on retry
104
+ this.delegate = undefined;
105
+ throw error;
106
+ } finally {
107
+ this.connectionPromise = undefined;
108
+ }
109
+ })();
110
+
111
+ return this.connectionPromise;
112
+ }
113
+
114
+ override close() {
115
+ this.isClosed = true;
116
+ this.delegate?.close();
117
+ this.delegate = undefined;
118
+ this.connectionPromise = undefined;
119
+ }
120
+
121
+ override async sendData(
122
+ data: JSONRPCRequestData,
123
+ timeout: number | null | undefined,
124
+ ) {
125
+ // If the delegate is closed or closing, try to reconnect
126
+ if (this.isDelegateClosedOrClosing()) {
127
+ Logger.warn("WebSocket is closed or closing, attempting to reconnect");
128
+ try {
129
+ await this.connect();
130
+ } catch (error) {
131
+ Logger.error("Failed to reconnect WebSocket", error);
132
+ throw error;
133
+ }
134
+ }
135
+
136
+ // Send the data using the delegate
137
+ return this.delegate?.sendData(data, timeout);
138
+ }
139
+ }
@@ -1,13 +1,18 @@
1
1
  /* Copyright 2024 Marimo. All rights reserved. */
2
2
  import { atomWithStorage } from "jotai/utils";
3
3
  import { once } from "lodash-es";
4
+ import { jotaiJsonStorage } from "@/utils/storage/jotai";
4
5
  import { getFeatureFlag } from "../config/feature-flag";
5
6
 
6
7
  /**
7
8
  * The username for the current user when using real-time collaboration.
8
9
  * This is stored in localStorage.
9
10
  */
10
- export const usernameAtom = atomWithStorage<string>("marimo:rtc:username", "");
11
+ export const usernameAtom = atomWithStorage<string>(
12
+ "marimo:rtc:username",
13
+ "",
14
+ jotaiJsonStorage,
15
+ );
11
16
 
12
17
  /**
13
18
  * Whether RTC is enabled.
@@ -0,0 +1,9 @@
1
+ /* Copyright 2024 Marimo. All rights reserved. */
2
+
3
+ /**
4
+ * Whether the current environment is in the VSCode extension
5
+ */
6
+ export function isInVscodeExtension(): boolean {
7
+ // We check if the document has a data-vscode-theme-kind attribute
8
+ return document.querySelector("[data-vscode-theme-kind]") !== null;
9
+ }
@@ -4,7 +4,7 @@ import {
4
4
  compressToEncodedURIComponent,
5
5
  decompressFromEncodedURIComponent,
6
6
  } from "lz-string";
7
- import { TypedLocalStorage } from "@/utils/localStorage";
7
+ import { TypedLocalStorage } from "@/utils/storage/typed";
8
8
  import { PyodideRouter } from "./router";
9
9
 
10
10
  export interface FileStore {
@@ -34,6 +34,37 @@
34
34
  z-index: 1;
35
35
  }
36
36
 
37
+ /* Styling for cells marked for deletion by AI */
38
+ &:has(.mo-ai-deleted-cell) {
39
+ opacity: 0.7;
40
+ position: relative;
41
+
42
+ .output-area,
43
+ .cm-gutters,
44
+ .cm {
45
+ background-color: var(--red-2);
46
+ }
47
+
48
+ /* Add a red glow to indicate deletion */
49
+ &::before {
50
+ content: "";
51
+ position: absolute;
52
+ inset: 0;
53
+ border-radius: 10px;
54
+ pointer-events: none;
55
+ opacity: 0.6;
56
+ box-shadow: 0px 0px 10px 0px var(--red-9);
57
+ z-index: 1;
58
+ }
59
+
60
+ /* Add strikethrough effect to the code */
61
+ .cm-content {
62
+ text-decoration: line-through;
63
+ text-decoration-color: var(--red-9);
64
+ text-decoration-thickness: 1px;
65
+ }
66
+ }
67
+
37
68
  &:focus-within {
38
69
  z-index: 20;
39
70
  }
@@ -135,6 +135,11 @@
135
135
  a.hyperlink:hover {
136
136
  text-decoration: underline;
137
137
  }
138
+
139
+ button:not(:disabled),
140
+ [role="button"]:not(:disabled) {
141
+ cursor: pointer;
142
+ }
138
143
  }
139
144
 
140
145
  @theme {
@@ -0,0 +1,14 @@
1
+ /* Copyright 2024 Marimo. All rights reserved. */
2
+
3
+ import { useMemo } from "react";
4
+ import {
5
+ getIframeCapabilities,
6
+ type IframeCapabilities,
7
+ } from "@/utils/capabilities";
8
+
9
+ /**
10
+ * React hook to access iframe capabilities
11
+ */
12
+ export function useIframeCapabilities(): IframeCapabilities {
13
+ return useMemo(() => getIframeCapabilities(), []);
14
+ }
@@ -1,7 +1,7 @@
1
1
  /* Copyright 2024 Marimo. All rights reserved. */
2
2
 
3
3
  import { useState } from "react";
4
- import { TypedLocalStorage } from "@/utils/localStorage";
4
+ import { TypedLocalStorage } from "@/utils/storage/typed";
5
5
 
6
6
  /**
7
7
  * React hook to use localStorage
@@ -5,14 +5,26 @@ import parse, {
5
5
  Element,
6
6
  type HTMLReactParserOptions,
7
7
  } from "html-react-parser";
8
- import React, { isValidElement, type JSX, type ReactNode, useId } from "react";
8
+ import React, {
9
+ isValidElement,
10
+ type JSX,
11
+ type ReactNode,
12
+ useMemo,
13
+ useRef,
14
+ } from "react";
9
15
  import { CopyClipboardIcon } from "@/components/icons/copy-icon";
16
+ import { sanitizeHtml, useSanitizeHtml } from "./sanitize";
10
17
 
11
18
  type ReplacementFn = NonNullable<HTMLReactParserOptions["replace"]>;
12
19
  type TransformFn = NonNullable<HTMLReactParserOptions["transform"]>;
13
20
 
14
21
  interface Options {
15
22
  html: string;
23
+ /**
24
+ * Whether to sanitize the HTML.
25
+ * @default true
26
+ */
27
+ alwaysSanitizeHtml?: boolean;
16
28
  additionalReplacements?: ReplacementFn[];
17
29
  }
18
30
 
@@ -110,9 +122,9 @@ const addCopyButtonToCodehilite: TransformFn = (
110
122
  };
111
123
 
112
124
  const CopyableCode = ({ children }: { children: ReactNode }) => {
113
- const id = useId();
125
+ const ref = useRef<HTMLDivElement>(null);
114
126
  return (
115
- <div className="relative group codehilite-wrapper" id={id}>
127
+ <div className="relative group codehilite-wrapper" ref={ref}>
116
128
  {children}
117
129
 
118
130
  <div className="absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity">
@@ -120,7 +132,7 @@ const CopyableCode = ({ children }: { children: ReactNode }) => {
120
132
  tooltip={false}
121
133
  className="p-1"
122
134
  value={() => {
123
- const codeElement = document.getElementById(id)?.firstChild;
135
+ const codeElement = ref.current?.firstChild;
124
136
  if (codeElement) {
125
137
  return codeElement.textContent || "";
126
138
  }
@@ -132,7 +144,51 @@ const CopyableCode = ({ children }: { children: ReactNode }) => {
132
144
  );
133
145
  };
134
146
 
135
- export const renderHTML = ({ html, additionalReplacements = [] }: Options) => {
147
+ /**
148
+ *
149
+ * @param html - The HTML to render.
150
+ * @param additionalReplacements - Additional replacements to apply to the HTML.
151
+ * @param alwaysSanitizeHtml - Whether to sanitize the HTML.
152
+ * @returns
153
+ */
154
+ export const renderHTML = ({
155
+ html,
156
+ additionalReplacements = [],
157
+ alwaysSanitizeHtml = true,
158
+ }: Options) => {
159
+ return (
160
+ <RenderHTML
161
+ html={html}
162
+ alwaysSanitizeHtml={alwaysSanitizeHtml}
163
+ additionalReplacements={additionalReplacements}
164
+ />
165
+ );
166
+ };
167
+
168
+ const RenderHTML = ({
169
+ html,
170
+ additionalReplacements = [],
171
+ alwaysSanitizeHtml,
172
+ }: Options) => {
173
+ const shouldSanitizeHtml = useSanitizeHtml();
174
+
175
+ const sanitizedHtml = useMemo(() => {
176
+ if (alwaysSanitizeHtml || shouldSanitizeHtml) {
177
+ return sanitizeHtml(html);
178
+ }
179
+ return html;
180
+ }, [html, alwaysSanitizeHtml, shouldSanitizeHtml]);
181
+
182
+ return parseHtml({
183
+ html: sanitizedHtml,
184
+ additionalReplacements,
185
+ });
186
+ };
187
+
188
+ function parseHtml({
189
+ html,
190
+ additionalReplacements = [],
191
+ }: Pick<Options, "html" | "additionalReplacements">) {
136
192
  const renderFunctions: ReplacementFn[] = [
137
193
  replaceValidTags,
138
194
  replaceValidIframes,
@@ -166,4 +222,8 @@ export const renderHTML = ({ html, additionalReplacements = [] }: Options) => {
166
222
  return reactNode as JSX.Element;
167
223
  },
168
224
  });
225
+ }
226
+
227
+ export const visibleForTesting = {
228
+ parseHtml,
169
229
  };