@marimo-team/islands 0.21.2-dev8 → 0.21.2-dev81

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 (664) hide show
  1. package/dist/{Combination-BBPQRrDo.js → Combination-B_FmEi05.js} +3 -3
  2. package/dist/{ConnectedDataExplorerComponent-D0GoOd_c.js → ConnectedDataExplorerComponent-CLLlotD4.js} +30 -29
  3. package/dist/{ImageComparisonComponent-BYQfAfSR.js → ImageComparisonComponent-BC00mJmw.js} +1 -1
  4. package/dist/{Plot-DfUav0o0.js → Plot-B1ahrLui.js} +1 -1
  5. package/dist/{_baseIsEqual-CvgsjYoW.js → _baseIsEqual-QWfxbVqg.js} +1 -1
  6. package/dist/_basePickBy-Do49cXgl.js +34 -0
  7. package/dist/{_baseUniq-BUFhl85h.js → _baseUniq-vFmWNipH.js} +1 -1
  8. package/dist/{any-language-editor-DlsjUw_l.js → any-language-editor-BBegsg-m.js} +22 -21
  9. package/dist/apl-e1B5LPEL.js +4 -0
  10. package/dist/{arc-DXxE-tFl.js → arc-CHF8PiiF.js} +2 -2
  11. package/dist/architecture-7HQA4BMR-KeUc82D1.js +6 -0
  12. package/dist/{architectureDiagram-VXUJARFQ-Df0FNeBR.js → architectureDiagram-VXUJARFQ-CIl7H_7A.js} +19 -19
  13. package/dist/asciiarmor-B-gwgesP.js +4 -0
  14. package/dist/asn1-DF2ckRB4.js +4 -0
  15. package/dist/{blockDiagram-VD42YOAC-DszWqlLz.js → blockDiagram-VD42YOAC-Bxg4bo7H.js} +14 -14
  16. package/dist/brainfuck-4G-7_gq_.js +4 -0
  17. package/dist/{button-BKkuUpZh.js → button-B1ZgJ7Cc.js} +2 -2
  18. package/dist/{c4Diagram-YG6GDRKO-Dyj8LoUX.js → c4Diagram-YG6GDRKO-k4TEDUb8.js} +6 -6
  19. package/dist/capabilities-DAGZLwa6.js +36 -0
  20. package/dist/{channel-CUFaIkTh.js → channel-CCR8wXOx.js} +1 -1
  21. package/dist/chat-ui-Dbn0M4Oo.js +7295 -0
  22. package/dist/{check-Diwc5emq.js → check-B2OoWw2h.js} +1 -1
  23. package/dist/{chunk-4BX2VUAB-CwMMQLZ_.js → chunk-4BX2VUAB-BwfrWBqN.js} +1 -1
  24. package/dist/{chunk-4F5CHEZ2-CRwwZ2ED.js → chunk-4F5CHEZ2-BigWQaTs.js} +1 -1
  25. package/dist/{chunk-55IACEB6-Dj8CzJvE.js → chunk-55IACEB6-D8THf2mi.js} +1 -1
  26. package/dist/{chunk-5FQGJX7Z-BkzUmppO.js → chunk-5FQGJX7Z-Cz2QbNIw.js} +1504 -2846
  27. package/dist/{chunk-ABZYJK2D-7QYXAAhe.js → chunk-ABZYJK2D-NPoevJcI.js} +3 -3
  28. package/dist/{chunk-ATLVNIR6-pmHPAPSd.js → chunk-ATLVNIR6-DAhC1FCG.js} +2 -2
  29. package/dist/{chunk-B2363JML-BuBMltZc.js → chunk-B2363JML-DOYwB798.js} +1 -1
  30. package/dist/{chunk-B4BG7PRW-Dbta9cTX.js → chunk-B4BG7PRW-BDmytgmO.js} +7 -7
  31. package/dist/{chunk-CVBHYZKI-D8iwHsLF.js → chunk-CVBHYZKI-B6xhgaBd.js} +1 -1
  32. package/dist/{chunk-DI55MBZ5-DyKB35wC.js → chunk-DI55MBZ5-C6iNEV8U.js} +6 -6
  33. package/dist/{chunk-EXTU4WIE-BRFl4iNd.js → chunk-EXTU4WIE-BtA6WdD4.js} +2 -2
  34. package/dist/{chunk-FMBD7UC4-XTL4xAvH.js → chunk-FMBD7UC4-CHdus51S.js} +1 -1
  35. package/dist/{chunk-FRFDVMJY-Bk2LD5Te.js → chunk-FRFDVMJY-Bo7Hv3UF.js} +1 -1
  36. package/dist/{chunk-HN2XXSSU-CzO5Phf0.js → chunk-HN2XXSSU-2Vfbq-kU.js} +1 -1
  37. package/dist/{chunk-JA3XYJ7Z-BkrY9SdL.js → chunk-JA3XYJ7Z-BeXqAsc9.js} +3 -3
  38. package/dist/{chunk-JZLCHNYA-Bk_Lil-q.js → chunk-JZLCHNYA-ibE7xTEx.js} +6 -6
  39. package/dist/{chunk-MI3HLSF2-DvCKDmpi.js → chunk-MI3HLSF2-Do0-KRc0.js} +1 -1
  40. package/dist/{chunk-N4CR4FBY-f5n6meOd.js → chunk-N4CR4FBY-CHAcubAf.js} +7 -7
  41. package/dist/{chunk-PL6DKKU2-DiFkzMfM.js → chunk-PL6DKKU2-D3wYz-iW.js} +1 -1
  42. package/dist/{chunk-QN33PNHL-CXfJywHv.js → chunk-QN33PNHL-CDWJY_kT.js} +2 -2
  43. package/dist/{chunk-QXUST7PY-D7-26sj3.js → chunk-QXUST7PY-CV37xRZd.js} +10 -10
  44. package/dist/{chunk-QZHKN3VN-CYbwZKgJ.js → chunk-QZHKN3VN-B_Mdb8GC.js} +1 -1
  45. package/dist/{chunk-S3R3BYOJ-BRT9vd1R.js → chunk-S3R3BYOJ-CGlk8NH-.js} +6 -6
  46. package/dist/{chunk-SJTYNZTY-BvVkbShU.js → chunk-SJTYNZTY-Bauwp2-p.js} +1 -1
  47. package/dist/{chunk-TCCFYFTB-DqxhgXG0.js → chunk-TCCFYFTB-C5_FjmXA.js} +15 -14
  48. package/dist/{chunk-TQ3KTPDO-CPkEruAA.js → chunk-TQ3KTPDO-TjHW8xfv.js} +1 -1
  49. package/dist/{chunk-TZMSLE5B-DSfBOnzx.js → chunk-TZMSLE5B-DfY6C3FB.js} +3 -3
  50. package/dist/{chunk-UMXZTB3W-C4ypIY3V.js → chunk-UMXZTB3W-DdRiIIOF.js} +1 -1
  51. package/dist/classDiagram-2ON5EDUG-DbWOiPgs.js +30 -0
  52. package/dist/classDiagram-v2-WZHVMYZB-COnXBrRA.js +30 -0
  53. package/dist/{clike-CLJYUAWw.js → clike-7lgyEYRk.js} +1 -1
  54. package/dist/clojure-CUybM11R.js +4 -0
  55. package/dist/{clone-CEQ-pda1.js → clone-BM9_Wkaf.js} +1 -1
  56. package/dist/cmake-BPjGcuDL.js +4 -0
  57. package/dist/cobol-BETk_nb6.js +4 -0
  58. package/dist/{code-block-37QAKDTI-DV_ZyoUh.js → code-block-37QAKDTI-DW3JC11U.js} +2 -2
  59. package/dist/coffeescript-CManZxXL.js +4 -0
  60. package/dist/commonlisp-DWkn7GW8.js +4 -0
  61. package/dist/{constants-CytQ_3LM.js → constants-LmeAawHa.js} +3 -3
  62. package/dist/{copy-DIK6DiIA.js → copy-B7XqFjF_.js} +14 -4
  63. package/dist/{cose-bilkent-S5V4N54A-BCDTZDay.js → cose-bilkent-S5V4N54A-DXHZkJKX.js} +2 -2
  64. package/dist/crystal-CCbg5EUH.js +4 -0
  65. package/dist/css-By8eo-XS.js +4 -0
  66. package/dist/cypher-DwfHg3nP.js +4 -0
  67. package/dist/d-Brs1wNbw.js +4 -0
  68. package/dist/{dagre-6UL2VRFP-DGEbtmgU.js → dagre-6UL2VRFP-B8UW0fXE.js} +16 -16
  69. package/dist/{dagre-BVnNvbvD.js → dagre-B3-rUlCT.js} +14 -14
  70. package/dist/{data-grid-overlay-editor-BD0BFHzy.js → data-grid-overlay-editor-CpL5Zajy.js} +3 -3
  71. package/dist/{diagram-PSM6KHXK-CG_usglE.js → diagram-PSM6KHXK-DGD-j1bM.js} +22 -22
  72. package/dist/{diagram-QEK2KX5R-CtGFEwzJ.js → diagram-QEK2KX5R-DgsT6ZW4.js} +17 -17
  73. package/dist/{diagram-S2PKOQOG-ClKAGmbv.js → diagram-S2PKOQOG-CDh5Ij8z.js} +17 -17
  74. package/dist/diff-DJIRmJ1g.js +4 -0
  75. package/dist/{dist-DEj2X26M.js → dist-1-E4bC9V.js} +2 -2
  76. package/dist/{dist-RNGn_-uD.js → dist-APyhcmvq.js} +1 -1
  77. package/dist/{dist-i-ud9aCA.js → dist-B5thW2rT.js} +1 -1
  78. package/dist/{dist-BpMlUdNO.js → dist-BFe8Nc_2.js} +3 -3
  79. package/dist/dist-BHGf2Zey.js +5 -0
  80. package/dist/dist-BImOGJZM.js +5 -0
  81. package/dist/{dist-lNe4i1Nm.js → dist-BJvk9DSp.js} +1 -1
  82. package/dist/{dist-DUretbKK.js → dist-BLrc9iNb.js} +2 -2
  83. package/dist/{dist-CSEWGuDq.js → dist-BYr4a-wE.js} +1 -1
  84. package/dist/dist-BbJfmCHJ.js +5 -0
  85. package/dist/{dist-C0Rnbr-_.js → dist-BiNtCiQ9.js} +4 -4
  86. package/dist/{dist-D4gcY469.js → dist-BrJQDkv_.js} +2 -2
  87. package/dist/dist-C0v-nFs_.js +8 -0
  88. package/dist/{dist-C4K7pumm.js → dist-C16JG-Ok.js} +2 -2
  89. package/dist/dist-C8N7114Z.js +5 -0
  90. package/dist/dist-C9TDg2aq.js +8 -0
  91. package/dist/{dist-gc9KgJuA.js → dist-CGH6Jw-c.js} +1 -1
  92. package/dist/{dist-BSfYc7vq.js → dist-CKVkWFcB.js} +2 -2
  93. package/dist/dist-CN4RKgNR.js +5 -0
  94. package/dist/{dist-DodLQWPg.js → dist-CQ3XmGIH.js} +1 -1
  95. package/dist/{dist-BGZ7TWS9.js → dist-CSiTW5NO.js} +3 -3
  96. package/dist/dist-CVOkf_3P.js +6 -0
  97. package/dist/{dist-CAKwXCWI.js → dist-CYuoqvce.js} +2 -2
  98. package/dist/dist-Cbkga3s5.js +5 -0
  99. package/dist/{dist-Ux6dL_VB.js → dist-Cm4SOB1A.js} +1 -1
  100. package/dist/dist-CwEBZkrQ.js +550 -0
  101. package/dist/{dist-D_-CGmlh.js → dist-CxczluAk.js} +2 -2
  102. package/dist/dist-D6YTv0Kj.js +5 -0
  103. package/dist/{dist-Bq5eYK43.js → dist-D75XqRaT.js} +2 -2
  104. package/dist/dist-D9vawryf.js +8 -0
  105. package/dist/{dist-CseYuPtL.js → dist-DFBjYgbq.js} +2 -2
  106. package/dist/{dist-Bq9zYwJs.js → dist-DUg5n_x5.js} +5 -5
  107. package/dist/dist-DasJgTvL.js +6 -0
  108. package/dist/{dist-D5NMgbbv.js → dist-DbyoYfBn.js} +2 -2
  109. package/dist/{dist-CPlGUbk-.js → dist-Dd9vDQtp.js} +2 -2
  110. package/dist/{dist-Cl5iM8xL.js → dist-Dk13KZ54.js} +3 -3
  111. package/dist/{dist-COpDrwi-.js → dist-Dl9_0tkc.js} +1 -1
  112. package/dist/dist-Ui51qXMz.js +8 -0
  113. package/dist/{dist-BFxYppVR.js → dist-XYBhoeSX.js} +4 -4
  114. package/dist/{dist-DERtJN02.js → dist-Y9GfSR6_.js} +2 -2
  115. package/dist/{dist-B9EjSb9T.js → dist-aW74oyUt.js} +1 -1
  116. package/dist/dist-d2msfN-B.js +5 -0
  117. package/dist/{dist-BUrWeMEP.js → dist-iM9VwH8Z.js} +1 -1
  118. package/dist/{dist-HoZO6brh.js → dist-uR-o9IVx.js} +2 -2
  119. package/dist/{dist-CDHl2i1x.js → dist-zGOEySUQ.js} +4 -4
  120. package/dist/{dockerfile-BxhYdLHL.js → dockerfile-DG6A2DdH.js} +1 -1
  121. package/dist/dtd-Dyiazv4N.js +4 -0
  122. package/dist/dylan-D8Fcw7NA.js +4 -0
  123. package/dist/ecl-CjKp8Vii.js +4 -0
  124. package/dist/eiffel-K9ViOX5r.js +4 -0
  125. package/dist/elm-B5NVtRco.js +4 -0
  126. package/dist/{erDiagram-Q2GNP2WA-DPMseVVp.js → erDiagram-Q2GNP2WA-CGK0SUdu.js} +15 -15
  127. package/dist/erlang-BnLzgk7R.js +4 -0
  128. package/dist/{error-banner-Dmi5ujan.js → error-banner-D-KBGvBj.js} +3 -3
  129. package/dist/esm-CCD9xN05.js +1587 -0
  130. package/dist/esm-CxoKu9RN.js +2805 -0
  131. package/dist/{factor-Png_OsVt.js → factor-Bq2mGIHt.js} +1 -1
  132. package/dist/factor-C7f9Jz5R.js +4 -0
  133. package/dist/{flowDiagram-NV44I4VS-BpAIFwW7.js → flowDiagram-NV44I4VS-PjhviPI_.js} +17 -17
  134. package/dist/forth-rGM8jLao.js +4 -0
  135. package/dist/fortran-B3acSe0i.js +4 -0
  136. package/dist/{ganttDiagram-JELNMOA3-DXYghZ9C.js → ganttDiagram-JELNMOA3-CUVtQqgT.js} +10 -10
  137. package/dist/gas-Bb1Vmv_N.js +4 -0
  138. package/dist/gherkin-C9Lyidgd.js +4 -0
  139. package/dist/{gitGraph-G5XIXVHT-ChHUSAop.js → gitGraph-G5XIXVHT-B6b-Z3mr.js} +3 -3
  140. package/dist/{gitGraphDiagram-V2S2FVAM-CBL-7g3_.js → gitGraphDiagram-V2S2FVAM-CNdrlK1I.js} +17 -17
  141. package/dist/{glide-data-editor-pZyd9UJ_.js → glide-data-editor-DQEuWuu_.js} +94 -93
  142. package/dist/{graphlib-D18eZCT4.js → graphlib-CIQjMxKw.js} +6 -6
  143. package/dist/groovy-DQk6XcGH.js +4 -0
  144. package/dist/{hasIn-B9AbGLj3.js → hasIn-eLCPDloT.js} +5 -5
  145. package/dist/haskell-mV0Vw9gv.js +4 -0
  146. package/dist/haxe-DqxN89zH.js +5 -0
  147. package/dist/idl-ya8W561J.js +4 -0
  148. package/dist/{info-VBDWY6EO-CwyXEo8E.js → info-VBDWY6EO-DfFl0Z8H.js} +3 -3
  149. package/dist/infoDiagram-HS3SLOUP-DGimKb9k.js +30 -0
  150. package/dist/{types-CGc7peZV.js → input-B8CM-AuM.js} +208 -405
  151. package/dist/{isEmpty-C-xMag79.js → isEmpty-CI9akcsL.js} +2 -2
  152. package/dist/{isString-D-vNYDBA.js → isString-xiQUcgm4.js} +1 -1
  153. package/dist/{isSymbol-Dyt2NSnN.js → isSymbol-DFp8040B.js} +1 -1
  154. package/dist/javascript-CgqgptVu.js +4 -0
  155. package/dist/{journeyDiagram-XKPGCS4Q-D5BIjS4N.js → journeyDiagram-XKPGCS4Q-CyoESVVb.js} +7 -7
  156. package/dist/julia-CFQ-HusI.js +4 -0
  157. package/dist/{kanban-definition-3W4ZIXB7-DhDkqxFB.js → kanban-definition-3W4ZIXB7-Doc2YV80.js} +12 -12
  158. package/dist/{katex-pyO_klYC.js → katex-qPqrBHZ8.js} +1 -1
  159. package/dist/{label-BbpGrh4j.js → label-e5-84vsp.js} +10 -10
  160. package/dist/{line-C1k1rG3Z.js → line-BWRi3U3S.js} +3 -3
  161. package/dist/{linear-DIp6l9sg.js → linear-DZ8_CGCd.js} +4 -4
  162. package/dist/livescript-D__3TmDo.js +4 -0
  163. package/dist/{loader-CABJs6GU.js → loader-C51Irhxm.js} +3 -3
  164. package/dist/lua-Bytcgj_W.js +4 -0
  165. package/dist/main.js +35383 -70488
  166. package/dist/mathematica-DJhvVKvl.js +4 -0
  167. package/dist/mbox-IGHPCjfR.js +4 -0
  168. package/dist/{memoize-Cs8aS5RW.js → memoize-zYM53m8l.js} +1 -1
  169. package/dist/{merge-NuyC7LN7.js → merge-CqBPpP0q.js} +1 -1
  170. package/dist/mermaid-4DMBBIKO-DQdI9xDR.js +6 -0
  171. package/dist/{mermaid-CrKqsE2j.js → mermaid-CzWpf81s.js} +50 -50
  172. package/dist/{mermaid-parser.core-OkWZ8nr-.js → mermaid-parser.core-CrrqF1ZZ.js} +8 -8
  173. package/dist/{mhchem-DckvwtV8.js → mhchem-BwoRNwg_.js} +1 -1
  174. package/dist/micromark-factory-space-DQCQsiYz.js +1341 -0
  175. package/dist/{min-ECVRnCdn.js → min-IJGSWMpU.js} +8 -8
  176. package/dist/{mindmap-definition-VGOIOE7T-BxQi78Vl.js → mindmap-definition-VGOIOE7T-L2ybicpO.js} +14 -14
  177. package/dist/mirc-tcwvVugm.js +4 -0
  178. package/dist/mllike-Dx91i62r.js +6 -0
  179. package/dist/modelica-_SRt-yU5.js +4 -0
  180. package/dist/mscgen-GZrGS9gt.js +6 -0
  181. package/dist/mumps-Cv3ygyod.js +4 -0
  182. package/dist/{now-BC2mX0ZT.js → now-CnuN5fN5.js} +1 -1
  183. package/dist/nsis-BU7GeGbI.js +4 -0
  184. package/dist/{nsis-BrAITej_.js → nsis-i9_sgigf.js} +1 -1
  185. package/dist/ntriples-CL-FCYXb.js +4 -0
  186. package/dist/{number-overlay-editor-CQrncFlP.js → number-overlay-editor-D2Y0RpcH.js} +1 -1
  187. package/dist/octave-Dc6_3DIu.js +4 -0
  188. package/dist/{once-BqS42WgZ.js → once-DjP4Kbhy.js} +1 -1
  189. package/dist/{ordinal-Dcvf4J1m.js → ordinal-B4zYMadD.js} +1 -1
  190. package/dist/oz-DpUAJCXf.js +4 -0
  191. package/dist/{packet-DYOGHKS2-C62XQjZh.js → packet-DYOGHKS2-DIf3Dotq.js} +3 -3
  192. package/dist/pascal-B17mncXs.js +4 -0
  193. package/dist/perl-BTpK97q9.js +4 -0
  194. package/dist/{pie-VRWISCQL-nfAKQJw3.js → pie-VRWISCQL-Dj_gvPcD.js} +3 -3
  195. package/dist/{pieDiagram-ADFJNKIX-DfSJXUHa.js → pieDiagram-ADFJNKIX-x5w7q6Yp.js} +22 -22
  196. package/dist/pig-CFb638Ap.js +4 -0
  197. package/dist/powershell-Cxo-_2A5.js +4 -0
  198. package/dist/{precisionRound-BAc-kQ3q.js → precisionRound-C-DW449D.js} +1 -1
  199. package/dist/process-output-BD2HO0W_.js +28024 -0
  200. package/dist/properties-BPgT1xTB.js +4 -0
  201. package/dist/protobuf-BgHBaIIK.js +4 -0
  202. package/dist/pug-25-oS0SG.js +4 -0
  203. package/dist/{pug-CH-17az-.js → pug-BhE2JRSg.js} +1 -1
  204. package/dist/puppet-DarIr20S.js +4 -0
  205. package/dist/python-BqmOsBsi.js +4 -0
  206. package/dist/q-D3QJCTup.js +4 -0
  207. package/dist/{quadrantDiagram-AYHSOK5B-CAcVWXc-.js → quadrantDiagram-AYHSOK5B-D5j_5qG_.js} +5 -5
  208. package/dist/r-Cz_yBX4z.js +4 -0
  209. package/dist/{radar-ZZBFDIW7-lopS8_4j.js → radar-ZZBFDIW7-DXDVq3gi.js} +3 -3
  210. package/dist/{range-BKaWvVUE.js → range-DffmqG6L.js} +4 -3
  211. package/dist/{react-vega-C6kwcd86.js → react-vega-BBUxfZoV.js} +19 -19
  212. package/dist/react-vega-Cs3lfDw8.js +9 -0
  213. package/dist/{reduce-CqQo8ppc.js → reduce-CGwzfrDo.js} +5 -5
  214. package/dist/{requirementDiagram-UZGBJVZJ-BU7dwzFM.js → requirementDiagram-UZGBJVZJ-3SoJH6yP.js} +14 -14
  215. package/dist/rpm-DGOtYwAI.js +5 -0
  216. package/dist/ruby-DBZu4rPc.js +4 -0
  217. package/dist/{sankeyDiagram-TZEHDZUN-BVJnR4_b.js → sankeyDiagram-TZEHDZUN-fGkFNe5q.js} +5 -5
  218. package/dist/sas-Dd1D9qTq.js +4 -0
  219. package/dist/scheme-BmDjvTHX.js +4 -0
  220. package/dist/{sequenceDiagram-WL72ISMW-CQcFQTwX.js → sequenceDiagram-WL72ISMW-BE2uTn_d.js} +8 -8
  221. package/dist/shell-BL8zFSaj.js +4 -0
  222. package/dist/sieve-BAx2WqUP.js +4 -0
  223. package/dist/{slides-component-GkilRW21.js → slides-component-Cjo6LzW9.js} +3 -3
  224. package/dist/smalltalk-CYRzF7VV.js +4 -0
  225. package/dist/sparql-YWaDRO4A.js +4 -0
  226. package/dist/{spec-Bfvf9Hre.js → spec-UGFYIDJb.js} +12 -422
  227. package/dist/{src-CHUphWwL.js → src-BY0BGg6V.js} +1 -1
  228. package/dist/{stateDiagram-FKZM4ZOC-Dx9AIGDe.js → stateDiagram-FKZM4ZOC-Dmk9IAOx.js} +19 -19
  229. package/dist/stateDiagram-v2-4FDKWEC3-BGF0BvU6.js +29 -0
  230. package/dist/{step-BbmiiQdf.js → step-DGAGWg3y.js} +1 -1
  231. package/dist/stex-BvZqVamL.js +4 -0
  232. package/dist/style.css +1 -1
  233. package/dist/stylus-lYsyLFc1.js +4 -0
  234. package/dist/swift-ClQz9z1n.js +4 -0
  235. package/dist/tcl-B3jhsfqY.js +4 -0
  236. package/dist/textile-Cb1Dw7Aq.js +4 -0
  237. package/dist/{time-DFFVNc1Q.js → time-C_pvjzP0.js} +4 -4
  238. package/dist/{timeline-definition-IT6M3QCI-D8B3p7ID.js → timeline-definition-IT6M3QCI-CvB4yGrN.js} +4 -4
  239. package/dist/toDate-COI3hP-5.js +637 -0
  240. package/dist/toInteger-BUeg_O0F.js +15 -0
  241. package/dist/{toNumber-CbZ70FdN.js → toNumber-xFPoy1OI.js} +2 -2
  242. package/dist/{toString-DbIAWQpF.js → toString-CtXX84W6.js} +2 -2
  243. package/dist/toml-nHZhetdO.js +4 -0
  244. package/dist/{tooltip-CKG75XQa.js → tooltip-DnI4CwIS.js} +4 -4
  245. package/dist/{treemap-GDKQZRPO-CkR-5ai2.js → treemap-GDKQZRPO-CIG6WH-x.js} +3 -3
  246. package/dist/troff-DuJAGWKH.js +4 -0
  247. package/dist/ttcn-BxrcwP21.js +4 -0
  248. package/dist/ttcn-cfg-BAg_9dcc.js +4 -0
  249. package/dist/turtle-zCq949as.js +4 -0
  250. package/dist/types-BqLAaq-i.js +209 -0
  251. package/dist/{uniq-H2E5nMLq.js → uniq-CCKqEs7T.js} +1 -1
  252. package/dist/{useAsyncData-CEjJxwFB.js → useAsyncData-BtHYXgXF.js} +2 -2
  253. package/dist/useDeepCompareMemoize-9dXEtK7u.js +124 -0
  254. package/dist/useIframeCapabilities-CzVvBDe8.js +13 -0
  255. package/dist/useLifecycle-Be1LUuEg.js +427 -0
  256. package/dist/{useTheme-CPybHVFN.js → useTheme-5GTtjXjy.js} +4 -4
  257. package/dist/vb-De5hElus.js +4 -0
  258. package/dist/vbscript-Cypcpv4F.js +4 -0
  259. package/dist/{vega-component-CuPTCRp5.js → vega-component-BQNW4qnB.js} +198 -197
  260. package/dist/{vega-loader.browser-CQ-lnUkI.js → vega-loader.browser-DnqN5nbz.js} +3 -3
  261. package/dist/velocity-Di7l-yhe.js +4 -0
  262. package/dist/verilog-Bzi-S3g2.js +4 -0
  263. package/dist/vhdl-B0ZZITaW.js +4 -0
  264. package/dist/webidl-0sviiRcN.js +4 -0
  265. package/dist/xquery-B4qMVWaB.js +4 -0
  266. package/dist/{xychartDiagram-PRI3JC2R-XO8FiQjU.js → xychartDiagram-PRI3JC2R-BbEInSqY.js} +13 -13
  267. package/dist/yacas-Jt25Fuv8.js +4 -0
  268. package/dist/z80-CrcbYzmp.js +4 -0
  269. package/package.json +2 -1
  270. package/src/__mocks__/notebook.ts +9 -9
  271. package/src/__mocks__/requests.ts +2 -1
  272. package/src/__tests__/branded.ts +20 -0
  273. package/src/__tests__/setup.ts +15 -0
  274. package/src/components/app-config/__tests__/get-dirty-values.test.ts +1 -1
  275. package/src/components/app-config/get-dirty-values.ts +100 -0
  276. package/src/components/app-config/user-config-form.tsx +6 -101
  277. package/src/components/data-table/TableActions.tsx +8 -2
  278. package/src/components/data-table/__tests__/columns.test.tsx +138 -0
  279. package/src/components/data-table/__tests__/data-table.test.tsx +63 -0
  280. package/src/components/data-table/__tests__/utils.test.ts +138 -1
  281. package/src/components/data-table/charts/__tests__/storage.test.ts +7 -7
  282. package/src/components/data-table/columns.tsx +44 -4
  283. package/src/components/data-table/context-menu.tsx +9 -5
  284. package/src/components/data-table/data-table.tsx +13 -31
  285. package/src/components/data-table/filters.ts +1 -0
  286. package/src/components/data-table/hooks/use-scroll-container-height.ts +97 -0
  287. package/src/components/data-table/range-focus/__tests__/atoms.test.ts +8 -2
  288. package/src/components/data-table/range-focus/__tests__/test-utils.ts +2 -0
  289. package/src/components/data-table/range-focus/__tests__/use-cell-range-selection.test.ts +119 -0
  290. package/src/components/data-table/range-focus/__tests__/utils.test.ts +82 -8
  291. package/src/components/data-table/range-focus/atoms.ts +2 -2
  292. package/src/components/data-table/range-focus/use-cell-range-selection.ts +19 -0
  293. package/src/components/data-table/range-focus/utils.ts +50 -12
  294. package/src/components/data-table/renderers.tsx +103 -46
  295. package/src/components/data-table/types.ts +21 -0
  296. package/src/components/data-table/utils.ts +87 -0
  297. package/src/components/datasources/datasources.tsx +45 -0
  298. package/src/components/editor/__tests__/data-attributes.test.tsx +8 -8
  299. package/src/components/editor/ai/__tests__/completion-utils.test.ts +15 -15
  300. package/src/components/editor/connections/storage/__tests__/__snapshots__/as-code.test.ts.snap +2 -2
  301. package/src/components/editor/connections/storage/as-code.ts +2 -2
  302. package/src/components/editor/file-tree/file-explorer.tsx +16 -2
  303. package/src/components/editor/file-tree/file-viewer.tsx +17 -3
  304. package/src/components/editor/navigation/__tests__/clipboard.test.ts +2 -2
  305. package/src/components/editor/navigation/__tests__/selection.test.ts +7 -6
  306. package/src/components/editor/navigation/__tests__/state.test.ts +8 -7
  307. package/src/components/editor/output/MarimoErrorOutput.tsx +7 -7
  308. package/src/components/editor/output/__tests__/traceback.test.tsx +4 -4
  309. package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +4 -4
  310. package/src/components/editor/package-alert.tsx +1 -1
  311. package/src/components/editor/renderers/vertical-layout/useFocusFirstEditor.ts +8 -1
  312. package/src/components/markdown/markdown-renderer.tsx +18 -2
  313. package/src/components/storage/storage-file-viewer.tsx +35 -1
  314. package/src/components/storage/storage-inspector.tsx +9 -4
  315. package/src/components/storage/storage-snippets.ts +3 -3
  316. package/src/components/tracing/tracing.tsx +3 -1
  317. package/src/components/ui/range-slider.tsx +108 -1
  318. package/src/core/ai/__tests__/staged-cells.test.ts +9 -8
  319. package/src/core/ai/context/providers/__tests__/cell-output.test.ts +31 -31
  320. package/src/core/ai/context/providers/__tests__/datasource.test.ts +3 -3
  321. package/src/core/ai/context/providers/__tests__/tables.test.ts +3 -2
  322. package/src/core/ai/context/providers/__tests__/variable.test.ts +84 -63
  323. package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +10 -9
  324. package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +6 -6
  325. package/src/core/ai/tools/edit-notebook-tool.ts +3 -3
  326. package/src/core/cells/__tests__/add-missing-import.test.ts +3 -3
  327. package/src/core/cells/__tests__/apply-transaction.test.ts +279 -0
  328. package/src/core/cells/__tests__/cells.test.ts +198 -135
  329. package/src/core/cells/__tests__/document-changes.test.ts +572 -0
  330. package/src/core/cells/__tests__/document-roundtrip.test.ts +376 -0
  331. package/src/core/cells/__tests__/focus.test.ts +5 -4
  332. package/src/core/cells/__tests__/logs.test.ts +13 -12
  333. package/src/core/cells/__tests__/pending-delete-service.test.tsx +3 -3
  334. package/src/core/cells/__tests__/runs.test.ts +29 -24
  335. package/src/core/cells/__tests__/scrollCellIntoView.test.ts +8 -7
  336. package/src/core/cells/__tests__/session.test.ts +23 -22
  337. package/src/core/cells/cells.ts +31 -5
  338. package/src/core/cells/document-changes.ts +644 -0
  339. package/src/core/cells/ids.ts +5 -5
  340. package/src/core/cells/logs.ts +2 -2
  341. package/src/core/cells/runs.ts +6 -8
  342. package/src/core/codemirror/__tests__/format.test.ts +34 -36
  343. package/src/core/codemirror/__tests__/setup.test.ts +2 -2
  344. package/src/core/codemirror/cells/__tests__/extensions.test.ts +114 -0
  345. package/src/core/codemirror/cells/__tests__/traceback-decorations.test.ts +33 -32
  346. package/src/core/codemirror/cells/extensions.ts +66 -23
  347. package/src/core/codemirror/completion/__tests__/keymap.test.ts +15 -35
  348. package/src/core/codemirror/completion/keymap.ts +14 -4
  349. package/src/core/codemirror/copilot/__tests__/getCodes.test.ts +12 -13
  350. package/src/core/codemirror/language/__tests__/utils.test.ts +3 -3
  351. package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +7 -8
  352. package/src/core/codemirror/language/languages/python.ts +4 -0
  353. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +4 -3
  354. package/src/core/codemirror/lsp/notebook-lsp.ts +28 -2
  355. package/src/core/codemirror/reactive-references/__tests__/analyzer.test.ts +7 -6
  356. package/src/core/codemirror/reactive-references/analyzer.ts +2 -2
  357. package/src/core/codemirror/rtc/loro/__tests__/sync.test.ts +52 -0
  358. package/src/core/codemirror/rtc/loro/sync.ts +1 -0
  359. package/src/core/datasets/__tests__/data-source.test.ts +93 -7
  360. package/src/core/datasets/data-source-connections.ts +44 -0
  361. package/src/core/datasets/request-registry.ts +13 -0
  362. package/src/core/datasets/state.ts +1 -1
  363. package/src/core/edit-app.tsx +0 -5
  364. package/src/core/errors/__tests__/errors.test.ts +2 -1
  365. package/src/core/export/__tests__/hooks.test.ts +37 -36
  366. package/src/core/islands/bridge.ts +2 -1
  367. package/src/core/islands/main.ts +5 -9
  368. package/src/core/kernel/__tests__/handlers.test.ts +5 -4
  369. package/src/core/kernel/handlers.ts +7 -4
  370. package/src/core/kernel/messages.ts +2 -0
  371. package/src/core/network/DeferredRequestRegistry.ts +2 -2
  372. package/src/core/network/__tests__/CachingRequestRegistry.test.ts +9 -10
  373. package/src/core/network/__tests__/DeferredRequestRegistry.test.ts +4 -6
  374. package/src/core/network/requests-lazy.ts +2 -1
  375. package/src/core/network/requests-network.ts +10 -2
  376. package/src/core/network/requests-static.ts +2 -1
  377. package/src/core/network/requests-toasting.tsx +2 -1
  378. package/src/core/network/types.ts +7 -2
  379. package/src/core/static/__tests__/virtual-file-tracker.test.ts +8 -8
  380. package/src/core/static/virtual-file-tracker.ts +1 -1
  381. package/src/core/storage/__tests__/state.test.ts +31 -21
  382. package/src/core/storage/state.ts +1 -1
  383. package/src/core/variables/__tests__/state.test.ts +6 -6
  384. package/src/core/variables/types.ts +2 -2
  385. package/src/core/wasm/__tests__/state.test.ts +8 -8
  386. package/src/core/wasm/bridge.ts +11 -1
  387. package/src/core/websocket/useMarimoKernelConnection.tsx +33 -26
  388. package/src/css/app/fonts.css +6 -6
  389. package/src/css/md-tooltip.css +4 -39
  390. package/src/css/md.css +10 -0
  391. package/src/fonts/Fira_Mono/FiraMono-Bold.woff2 +0 -0
  392. package/src/fonts/Fira_Mono/FiraMono-Medium.woff2 +0 -0
  393. package/src/fonts/Fira_Mono/FiraMono-Regular.woff2 +0 -0
  394. package/src/fonts/Lora/Lora-VariableFont_wght.woff2 +0 -0
  395. package/src/fonts/PT_Sans/PTSans-Bold.woff2 +0 -0
  396. package/src/fonts/PT_Sans/PTSans-Regular.woff2 +0 -0
  397. package/src/plugins/core/RenderHTML.tsx +17 -0
  398. package/src/plugins/core/__test__/RenderHTML.test.ts +45 -0
  399. package/src/plugins/core/sanitize-html.ts +25 -18
  400. package/src/plugins/impl/DataTablePlugin.tsx +50 -2
  401. package/src/plugins/impl/SliderPlugin.tsx +1 -3
  402. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +120 -0
  403. package/src/plugins/impl/anywidget/model.ts +1 -2
  404. package/src/plugins/impl/chat/ChatPlugin.tsx +6 -3
  405. package/src/plugins/impl/matplotlib/matplotlib-renderer.ts +5 -2
  406. package/src/stories/cell.stories.tsx +8 -8
  407. package/src/stories/layout/vertical/one-column.stories.tsx +9 -8
  408. package/src/stories/log-viewer.stories.tsx +8 -8
  409. package/src/stories/variables.stories.tsx +2 -2
  410. package/src/utils/__tests__/createReducer.test.ts +2 -1
  411. package/src/utils/__tests__/download.test.tsx +21 -20
  412. package/src/utils/copy.ts +18 -5
  413. package/src/utils/createReducer.ts +46 -26
  414. package/src/utils/download.ts +4 -3
  415. package/src/utils/html-to-image.ts +6 -0
  416. package/src/utils/json/base64.ts +3 -3
  417. package/src/utils/traceback.ts +5 -3
  418. package/dist/_basePickBy-pTDW2_2A.js +0 -47
  419. package/dist/apl-lHFVoxx7.js +0 -4
  420. package/dist/architecture-7HQA4BMR-BmtmhGMc.js +0 -6
  421. package/dist/asciiarmor-DqCdZUHI.js +0 -4
  422. package/dist/asn1-DEcwtw-q.js +0 -4
  423. package/dist/brainfuck-Bro9Oz5x.js +0 -4
  424. package/dist/classDiagram-2ON5EDUG-DphiMW3Y.js +0 -30
  425. package/dist/classDiagram-v2-WZHVMYZB-BH1x5h4a.js +0 -30
  426. package/dist/clojure-B2uhdQPa.js +0 -4
  427. package/dist/cmake-B9WXyQcc.js +0 -4
  428. package/dist/cobol-CPD3EJfO.js +0 -4
  429. package/dist/coffeescript-KD9TnEnS.js +0 -4
  430. package/dist/commonlisp-DNEULz_Q.js +0 -4
  431. package/dist/crystal-DVPNgAPQ.js +0 -4
  432. package/dist/css-fq3a1AH1.js +0 -4
  433. package/dist/cypher-Dtzq0BP7.js +0 -4
  434. package/dist/d-DcZudIhJ.js +0 -4
  435. package/dist/diff-D9BPDC3o.js +0 -4
  436. package/dist/dist-B4MxkKHf.js +0 -8
  437. package/dist/dist-BYghZv6b.js +0 -5
  438. package/dist/dist-Be-uQhz5.js +0 -6
  439. package/dist/dist-CB_xf0ju.js +0 -5
  440. package/dist/dist-CK0qFAbF.js +0 -8
  441. package/dist/dist-CYEk-qrr.js +0 -8
  442. package/dist/dist-CmKoWpMk.js +0 -5
  443. package/dist/dist-D1nf4IQl.js +0 -5
  444. package/dist/dist-Df3AcKpt.js +0 -6
  445. package/dist/dist-DgaFHt_I.js +0 -5
  446. package/dist/dist-Dk10C3ui.js +0 -5
  447. package/dist/dist-DtyPVMHR.js +0 -5
  448. package/dist/dist-ko7WnHAO.js +0 -5
  449. package/dist/dist-of7gLRFK.js +0 -8
  450. package/dist/dtd-FhG-tVom.js +0 -4
  451. package/dist/dylan-HWpZOBPw.js +0 -4
  452. package/dist/ecl-B_rcje1I.js +0 -4
  453. package/dist/eiffel-oqHyHs6f.js +0 -4
  454. package/dist/elm-B62RQEds.js +0 -4
  455. package/dist/erlang-CjRjjA-B.js +0 -4
  456. package/dist/esm-BLobyqMs.js +0 -4387
  457. package/dist/factor-CGH_TnIV.js +0 -4
  458. package/dist/forth-5N06oHNp.js +0 -4
  459. package/dist/fortran-wZ-sNg3h.js +0 -4
  460. package/dist/gas-3H4_FaS8.js +0 -4
  461. package/dist/gherkin-PEA2uy50.js +0 -4
  462. package/dist/groovy-DZzbvCP1.js +0 -4
  463. package/dist/haskell-CExLTzho.js +0 -4
  464. package/dist/haxe-f3pVb8qU.js +0 -5
  465. package/dist/idl-BbWlJ0gk.js +0 -4
  466. package/dist/infoDiagram-HS3SLOUP-BXGbfBss.js +0 -30
  467. package/dist/javascript-eMOhp6Aq.js +0 -4
  468. package/dist/julia-C6w3Rvqb.js +0 -4
  469. package/dist/livescript-ChQl9lD-.js +0 -4
  470. package/dist/lua-CiDvI96j.js +0 -4
  471. package/dist/mathematica-ClVO4k7N.js +0 -4
  472. package/dist/mbox-BEI7DeUg.js +0 -4
  473. package/dist/mermaid-4DMBBIKO-PVrJfEpX.js +0 -6
  474. package/dist/mirc-DwidJ3iH.js +0 -4
  475. package/dist/mllike-Dspdy0xJ.js +0 -6
  476. package/dist/modelica-CIUejP-L.js +0 -4
  477. package/dist/mscgen-BWXU4Omp.js +0 -6
  478. package/dist/mumps-PHFFoPk5.js +0 -4
  479. package/dist/nsis-B7xooKLf.js +0 -4
  480. package/dist/ntriples-DnOgtCzG.js +0 -4
  481. package/dist/octave-Cn5kH_QT.js +0 -4
  482. package/dist/oz-DR-sROpu.js +0 -4
  483. package/dist/pascal-CPKK1zcS.js +0 -4
  484. package/dist/perl-D7FuFdyd.js +0 -4
  485. package/dist/pig-CEXnOAnI.js +0 -4
  486. package/dist/powershell-BKvWab7q.js +0 -4
  487. package/dist/properties-7jnK_vYx.js +0 -4
  488. package/dist/protobuf-4rslMjEN.js +0 -4
  489. package/dist/pug-BVwdEv4r.js +0 -4
  490. package/dist/puppet-iSHg_1Z2.js +0 -4
  491. package/dist/python-tK3wUCn0.js +0 -4
  492. package/dist/q-DP_Dcoox.js +0 -4
  493. package/dist/r-C32wHLYu.js +0 -4
  494. package/dist/react-vega-CFUuchds.js +0 -9
  495. package/dist/rpm-BbDBUfs9.js +0 -5
  496. package/dist/ruby-COfWUiIr.js +0 -4
  497. package/dist/sas-y_Hue2-X.js +0 -4
  498. package/dist/scheme-7jTCqHw8.js +0 -4
  499. package/dist/shell-DAqJWXDk.js +0 -4
  500. package/dist/sieve-EaqnbCO3.js +0 -4
  501. package/dist/smalltalk-DL03YKLJ.js +0 -4
  502. package/dist/sparql-DTA-tQ_q.js +0 -4
  503. package/dist/stateDiagram-v2-4FDKWEC3-BIeUs-Ed.js +0 -29
  504. package/dist/stex-KfRnSHzF.js +0 -4
  505. package/dist/stylus-CfjeFry_.js +0 -4
  506. package/dist/swift-Dl0RRDbH.js +0 -4
  507. package/dist/tcl-wv9O7fLZ.js +0 -4
  508. package/dist/textile-DzMRCBcV.js +0 -4
  509. package/dist/toml-CyIWqgbe.js +0 -4
  510. package/dist/troff-_huin_CY.js +0 -4
  511. package/dist/ttcn-BEiJuYYc.js +0 -4
  512. package/dist/ttcn-cfg-DB6Ksh67.js +0 -4
  513. package/dist/turtle-DzhzGEum.js +0 -4
  514. package/dist/useDeepCompareMemoize-BWUwfh37.js +0 -755
  515. package/dist/useIframeCapabilities-OQaMKgZl.js +0 -46
  516. package/dist/vb-CngKZQHu.js +0 -4
  517. package/dist/vbscript-BV_8nbeM.js +0 -4
  518. package/dist/velocity-IqE7qYKE.js +0 -4
  519. package/dist/verilog-xtyaWTnc.js +0 -4
  520. package/dist/vhdl-BaqXCtf3.js +0 -4
  521. package/dist/webidl-BDB8PTTO.js +0 -4
  522. package/dist/xquery-BIC-qj9Z.js +0 -4
  523. package/dist/yacas-ifv5tftd.js +0 -4
  524. package/dist/z80-B8zOMVNt.js +0 -4
  525. package/src/core/cells/effects.ts +0 -42
  526. package/src/fonts/Fira_Mono/FiraMono-Bold.ttf +0 -0
  527. package/src/fonts/Fira_Mono/FiraMono-Medium.ttf +0 -0
  528. package/src/fonts/Fira_Mono/FiraMono-Regular.ttf +0 -0
  529. package/src/fonts/Lora/Lora-Italic-VariableFont_wght.ttf +0 -0
  530. package/src/fonts/Lora/Lora-VariableFont_wght.ttf +0 -0
  531. package/src/fonts/Lora/static/Lora-Bold.ttf +0 -0
  532. package/src/fonts/Lora/static/Lora-BoldItalic.ttf +0 -0
  533. package/src/fonts/Lora/static/Lora-Italic.ttf +0 -0
  534. package/src/fonts/Lora/static/Lora-Medium.ttf +0 -0
  535. package/src/fonts/Lora/static/Lora-MediumItalic.ttf +0 -0
  536. package/src/fonts/Lora/static/Lora-Regular.ttf +0 -0
  537. package/src/fonts/Lora/static/Lora-SemiBold.ttf +0 -0
  538. package/src/fonts/Lora/static/Lora-SemiBoldItalic.ttf +0 -0
  539. package/src/fonts/PT_Sans/PTSans-Bold.ttf +0 -0
  540. package/src/fonts/PT_Sans/PTSans-BoldItalic.ttf +0 -0
  541. package/src/fonts/PT_Sans/PTSans-Italic.ttf +0 -0
  542. package/src/fonts/PT_Sans/PTSans-Regular.ttf +0 -0
  543. /package/dist/{_arrayReduce-BfFy684W.js → _arrayReduce-6BJAuN54.js} +0 -0
  544. /package/dist/{_baseSlice-BrVixxuc.js → _baseSlice-bwIVgwNq.js} +0 -0
  545. /package/dist/{_hasUnicode-C32WqUu7.js → _hasUnicode-DOFcQHhs.js} +0 -0
  546. /package/dist/{apl-DRxKiEot.js → apl-99A7dLQe.js} +0 -0
  547. /package/dist/{array-D-nrDupM.js → array-B-MVxRIF.js} +0 -0
  548. /package/dist/{asciiarmor-C8HoXFIm.js → asciiarmor-DLEhpFDx.js} +0 -0
  549. /package/dist/{asn1-9Bo0DYT-.js → asn1-CMrcTsT4.js} +0 -0
  550. /package/dist/{asterisk-BsiuGzWq.js → asterisk-BUZwqih-.js} +0 -0
  551. /package/dist/{brainfuck-Db8njC-p.js → brainfuck-ChPt5yBe.js} +0 -0
  552. /package/dist/{chunk-DR5Q36YT-D4q96vNV.js → chunk-DR5Q36YT-CP69aZS_.js} +0 -0
  553. /package/dist/{click-outside-container-CKfwEZqH.js → click-outside-container-DB_bTXRG.js} +0 -0
  554. /package/dist/{clike-CFhUNtI5.js → clike-CE0fXfM_.js} +0 -0
  555. /package/dist/{clojure-CX7oovsp.js → clojure-QkBEMU-g.js} +0 -0
  556. /package/dist/{clsx-D2KVTYnW.js → clsx-yW_RAw0K.js} +0 -0
  557. /package/dist/{cmake-C29AR2kk.js → cmake-CU1jX7Mo.js} +0 -0
  558. /package/dist/{cobol-CNkuRW9i.js → cobol-DMOKzzky.js} +0 -0
  559. /package/dist/{coffeescript-BJAbfGam.js → coffeescript-DjnjLyfk.js} +0 -0
  560. /package/dist/{colors-6nB_pSln.js → colors-Cn2p_FA3.js} +0 -0
  561. /package/dist/{common-keywords-BAkLFdud.js → common-keywords-hbLeU7VU.js} +0 -0
  562. /package/dist/{commonlisp-BTNhj2l9.js → commonlisp-CYd9iOSe.js} +0 -0
  563. /package/dist/{crystal-CZc0nIm9.js → crystal-Dy55yoYG.js} +0 -0
  564. /package/dist/{css-L2-0OTXc.js → css-CNU8w3HJ.js} +0 -0
  565. /package/dist/{cypher-Dnc6MXl0.js → cypher-q47DGzK7.js} +0 -0
  566. /package/dist/{cytoscape.esm-BXzSsA6N.js → cytoscape.esm-WbbDoCfu.js} +0 -0
  567. /package/dist/{d-C6X9iIga.js → d-jEkaLvxX.js} +0 -0
  568. /package/dist/{defaultLocale-CfQ4kBaV.js → defaultLocale-Dr6Bz4JK.js} +0 -0
  569. /package/dist/{defaultLocale-Bklbu-Tp.js → defaultLocale-I3_GfJ4U.js} +0 -0
  570. /package/dist/{diff-ZzKinYqY.js → diff-vb2-unFN.js} +0 -0
  571. /package/dist/{dist-DOoqn-VL.js → dist-C4EV3aDt.js} +0 -0
  572. /package/dist/{dist-Bymy0kEH.js → dist-C89sHDXk.js} +0 -0
  573. /package/dist/{dtd-CytEpkAo.js → dtd-C9kR-bXa.js} +0 -0
  574. /package/dist/{duckdb-keywords-C1WxmSfG.js → duckdb-keywords-CZ_ZTscu.js} +0 -0
  575. /package/dist/{dylan-CZByFBEQ.js → dylan-BLckrK-V.js} +0 -0
  576. /package/dist/{ebnf-BF2FOt-m.js → ebnf-WEXPLEWb.js} +0 -0
  577. /package/dist/{ecl-Cp7L1F5B.js → ecl-CEsf6XVg.js} +0 -0
  578. /package/dist/{eiffel-C66yjnFL.js → eiffel-2KGZNzx6.js} +0 -0
  579. /package/dist/{elm-DtHo-73e.js → elm-D2s3K5wF.js} +0 -0
  580. /package/dist/{emotion-is-prop-valid.esm-DtW2o230.js → emotion-is-prop-valid.esm-CflmeIys.js} +0 -0
  581. /package/dist/{erlang-C_sj44mF.js → erlang-0PMFOndk.js} +0 -0
  582. /package/dist/{esm-BWftfC-A.js → esm-Bb_hbWan.js} +0 -0
  583. /package/dist/{fcl-BhLcvRo_.js → fcl-B_Gv5Jfx.js} +0 -0
  584. /package/dist/{forth-CIDHh56T.js → forth-DG89iUsu.js} +0 -0
  585. /package/dist/{fortran-BQrDVXRU.js → fortran-ytKsAVvu.js} +0 -0
  586. /package/dist/{gas-D4HQPB0Q.js → gas-Cg2Fm0N2.js} +0 -0
  587. /package/dist/{gherkin-UB2gJHdT.js → gherkin-B87FEnZ-.js} +0 -0
  588. /package/dist/{groovy-DVz6jkOx.js → groovy-Dcs08AWD.js} +0 -0
  589. /package/dist/{haskell-CpUdAPCz.js → haskell-cwkOuhx6.js} +0 -0
  590. /package/dist/{haxe-DCV5_cqD.js → haxe-DWEo4q10.js} +0 -0
  591. /package/dist/{http-C_TDb8VX.js → http-Dc2fv19V.js} +0 -0
  592. /package/dist/{idl-D7WCIgHw.js → idl-WWQwDcRV.js} +0 -0
  593. /package/dist/{init-Ci8VD8ZH.js → init-D-g0ONX1.js} +0 -0
  594. /package/dist/{invariant-D9QLJ4SZ.js → invariant-Ctm_8TNZ.js} +0 -0
  595. /package/dist/{isArrayLikeObject-BrYl-ETg.js → isArrayLikeObject-C-hFPChh.js} +0 -0
  596. /package/dist/{javascript-B2Rn0Lmd.js → javascript-BeR74dxD.js} +0 -0
  597. /package/dist/{jsx-runtime-CTBg5pdT.js → jsx-runtime-9hcJiI23.js} +0 -0
  598. /package/dist/{julia-ApprtEaw.js → julia-UlvCUYGL.js} +0 -0
  599. /package/dist/{katex-Bk_FvVSR.js → katex-B7pMJpE0.js} +0 -0
  600. /package/dist/{livescript-BMLIlM7C.js → livescript-GPmFcmYV.js} +0 -0
  601. /package/dist/{lua-DdDaW3tC.js → lua-DYoT_0zM.js} +0 -0
  602. /package/dist/{main-Tj_-QTyF.js → main-sxFlUO_N.js} +0 -0
  603. /package/dist/{math-HUZifhTs.js → math-BYK36kWZ.js} +0 -0
  604. /package/dist/{mathematica-PnNN7c2Z.js → mathematica-DSFIQlbG.js} +0 -0
  605. /package/dist/{mbox-B84OtHBK.js → mbox-ej8lFMdL.js} +0 -0
  606. /package/dist/{mirc-BVWXJxIq.js → mirc-CAdIdvHQ.js} +0 -0
  607. /package/dist/{mllike-BawXWupH.js → mllike-CjTB1lHF.js} +0 -0
  608. /package/dist/{modelica-C8-X4Hf_.js → modelica-BB68FYMa.js} +0 -0
  609. /package/dist/{mscgen-BOM6dDj8.js → mscgen-BkbzgGGI.js} +0 -0
  610. /package/dist/{mumps-DQOY8n05.js → mumps-Cu-28E9F.js} +0 -0
  611. /package/dist/{nginx-DkMgA__9.js → nginx-ComVAAGN.js} +0 -0
  612. /package/dist/{node-sql-parser-D53LM_7b.js → node-sql-parser-DNGGJ-Rw.js} +0 -0
  613. /package/dist/{ntriples-DU8VrXdW.js → ntriples-D9cQiZxZ.js} +0 -0
  614. /package/dist/{octave-BzTIBsQ8.js → octave-BvtAnPX0.js} +0 -0
  615. /package/dist/{oz-DKFcZsoi.js → oz-COaVHk2E.js} +0 -0
  616. /package/dist/{pascal-DHBZ15pT.js → pascal-BFpqVD2x.js} +0 -0
  617. /package/dist/{path-BVI7RNUv.js → path-Du6n3sOU.js} +0 -0
  618. /package/dist/{perl-75NMI3w0.js → perl-DaiORxHP.js} +0 -0
  619. /package/dist/{pig-B-HY1fo_.js → pig-DFzRhmsF.js} +0 -0
  620. /package/dist/{powershell-DEH22U53.js → powershell-BG2LQNKN.js} +0 -0
  621. /package/dist/{properties-B1MzBoJC.js → properties-CqJJR5QY.js} +0 -0
  622. /package/dist/{protobuf-Dr14KV0p.js → protobuf-WwDYV1yY.js} +0 -0
  623. /package/dist/{puppet-C4z38l7v.js → puppet-QNY3w_uN.js} +0 -0
  624. /package/dist/{purify.es-DGenX2XH.js → purify.es-Co_dANLh.js} +0 -0
  625. /package/dist/{python-D2L7Nknt.js → python-4QrQ3Ugi.js} +0 -0
  626. /package/dist/{q-PxipHfgS.js → q-DhwXuxE2.js} +0 -0
  627. /package/dist/{r-CEMMu_Tf.js → r-Df-nkR25.js} +0 -0
  628. /package/dist/{range-BToS7LsA.js → range-Bn3no95s.js} +0 -0
  629. /package/dist/{react-dom-CqtLRVZP.js → react-dom-BKwCWYPW.js} +0 -0
  630. /package/dist/{rpm-D3xyahkR.js → rpm-Cokue07s.js} +0 -0
  631. /package/dist/{ruby-DwEkwdiu.js → ruby-DrYcL3qF.js} +0 -0
  632. /package/dist/{sas-L1W0BRft.js → sas-CoiPirA5.js} +0 -0
  633. /package/dist/{scheme-CTybTrX0.js → scheme-CwFLjzHv.js} +0 -0
  634. /package/dist/{shell-BSx3LZnu.js → shell-BFV-R24I.js} +0 -0
  635. /package/dist/{sieve-BjUfbv-6.js → sieve-CxwXF5T9.js} +0 -0
  636. /package/dist/{simple-mode-IPZGFbI6.js → simple-mode-DTaJtKPt.js} +0 -0
  637. /package/dist/{smalltalk-BlzuYrMv.js → smalltalk-QivVOCtX.js} +0 -0
  638. /package/dist/{solr-Cj_9RM4d.js → solr-DTkyqJ-Z.js} +0 -0
  639. /package/dist/{sparql-BXKjQ0cK.js → sparql-nKsFk8j7.js} +0 -0
  640. /package/dist/{spreadsheet-CifI10GO.js → spreadsheet-CER0raqY.js} +0 -0
  641. /package/dist/{sql-B0bFyY1c.js → sql-ByOoEONQ.js} +0 -0
  642. /package/dist/{stex-BIsgBmK4.js → stex-7yEw16Ww.js} +0 -0
  643. /package/dist/{stylus-CqrLLVnG.js → stylus-BLKQAycn.js} +0 -0
  644. /package/dist/{swift-DIqvj3_G.js → swift-CJoKqiKj.js} +0 -0
  645. /package/dist/{tcl-B8bOIGVK.js → tcl-YTeYFNUc.js} +0 -0
  646. /package/dist/{textile-DZsjavD_.js → textile-C6rKQqMQ.js} +0 -0
  647. /package/dist/{tiddlywiki-BbGdvEjx.js → tiddlywiki-Cr9xyOY1.js} +0 -0
  648. /package/dist/{tiki-BYesmRDo.js → tiki-D5JONyfZ.js} +0 -0
  649. /package/dist/{timer-CPsmIOdm.js → timer-D7JVdX9U.js} +0 -0
  650. /package/dist/{toml-Uc7m08nl.js → toml-DxlPGbRy.js} +0 -0
  651. /package/dist/{treemap-DMn4tIJ7.js → treemap-qFGzn7xk.js} +0 -0
  652. /package/dist/{troff-GEl5wcXR.js → troff-DFCfH7Ku.js} +0 -0
  653. /package/dist/{ttcn-pr4FDOLT.js → ttcn-DAW-ERVP.js} +0 -0
  654. /package/dist/{ttcn-cfg-dZQ_fWTH.js → ttcn-cfg-CpJ8b7EN.js} +0 -0
  655. /package/dist/{turtle-TPRDOknA.js → turtle-BneV2f8L.js} +0 -0
  656. /package/dist/{vb-BJUAeTYr.js → vb-D973Vxxh.js} +0 -0
  657. /package/dist/{vbscript-CcJ6Z3ic.js → vbscript-Dckaq3YO.js} +0 -0
  658. /package/dist/{velocity-pq4ZMzU3.js → velocity-DKty-GUC.js} +0 -0
  659. /package/dist/{verilog-timMNjHt.js → verilog-aNaK_biA.js} +0 -0
  660. /package/dist/{vhdl-DYFbVKNm.js → vhdl-CQuehnQy.js} +0 -0
  661. /package/dist/{webidl-pue9oqnb.js → webidl-Bhg8vaMr.js} +0 -0
  662. /package/dist/{xquery-DeItGynK.js → xquery-D2q16GaM.js} +0 -0
  663. /package/dist/{yacas-By2Qrjba.js → yacas-DHGOHnNa.js} +0 -0
  664. /package/dist/{z80-C7iLsyPC.js → z80-BPhTmO22.js} +0 -0
@@ -101,6 +101,69 @@ describe("DataTable", () => {
101
101
  expect(rows[2]).toHaveAttribute("title", "Jim Halpert");
102
102
  });
103
103
 
104
+ it("does not virtualize small datasets without pagination", () => {
105
+ const testData = Array.from({ length: 50 }, (_, i) => ({
106
+ id: i,
107
+ name: `Item ${i}`,
108
+ }));
109
+
110
+ const columns: ColumnDef<TestData>[] = [
111
+ { accessorKey: "id", header: "ID" },
112
+ { accessorKey: "name", header: "Name" },
113
+ ];
114
+
115
+ render(
116
+ <TooltipProvider>
117
+ <DataTable
118
+ data={testData}
119
+ columns={columns}
120
+ selection={null}
121
+ totalRows={50}
122
+ totalColumns={2}
123
+ pagination={false}
124
+ />
125
+ </TooltipProvider>,
126
+ );
127
+
128
+ // All 50 data rows + 1 header row should be in the DOM (no virtualization)
129
+ const rows = screen.getAllByRole("row");
130
+ expect(rows).toHaveLength(51);
131
+ });
132
+
133
+ it("virtualizes large datasets — renders fewer rows than the full dataset", () => {
134
+ const testData = Array.from({ length: 200 }, (_, i) => ({
135
+ id: i,
136
+ name: `Item ${i}`,
137
+ }));
138
+
139
+ const columns: ColumnDef<TestData>[] = [
140
+ { accessorKey: "id", header: "ID" },
141
+ { accessorKey: "name", header: "Name" },
142
+ ];
143
+
144
+ render(
145
+ <TooltipProvider>
146
+ <DataTable
147
+ data={testData}
148
+ columns={columns}
149
+ selection={null}
150
+ totalRows={200}
151
+ totalColumns={2}
152
+ pagination={false}
153
+ />
154
+ </TooltipProvider>,
155
+ );
156
+
157
+ // In jsdom the virtualizer sees a 0-height container and renders 0 data
158
+ // rows (no layout engine). The key assertion is that significantly fewer
159
+ // than 200 rows are in the DOM, which catches regressions where
160
+ // virtualization is accidentally disabled and all rows are rendered.
161
+ const rows = screen.getAllByRole("row");
162
+ // Subtract 1 for the header row
163
+ const dataRows = rows.length - 1;
164
+ expect(dataRows).toBeLessThan(200);
165
+ });
166
+
104
167
  it("should display updated data after rerender with manual sorting and pagination", () => {
105
168
  // Simulates the bug from issue #8023:
106
169
  // When a user sorts a table, rows that moved from page 2 to page 1
@@ -1,7 +1,13 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
+ import type { Table } from "@tanstack/react-table";
3
4
  import { describe, expect, it } from "vitest";
4
- import { getPageIndexForRow } from "../utils";
5
+ import {
6
+ getClipboardContent,
7
+ getPageIndexForRow,
8
+ getRawValue,
9
+ stringifyUnknownValue,
10
+ } from "../utils";
5
11
 
6
12
  describe("getPageIndexForRow", () => {
7
13
  it("should return null when row is on current page", () => {
@@ -77,3 +83,134 @@ describe("getPageIndexForRow", () => {
77
83
  expect(getPageIndexForRow(999, 100, 10)).toBe(99);
78
84
  });
79
85
  });
86
+
87
+ describe("stringifyUnknownValue", () => {
88
+ it("should stringify primitives", () => {
89
+ expect(stringifyUnknownValue({ value: "hello" })).toBe("hello");
90
+ expect(stringifyUnknownValue({ value: 42 })).toBe("42");
91
+ expect(stringifyUnknownValue({ value: true })).toBe("true");
92
+ expect(stringifyUnknownValue({ value: null })).toBe("null");
93
+ expect(stringifyUnknownValue({ value: undefined })).toBe("undefined");
94
+ });
95
+
96
+ it("should stringify null as empty string when flag is set", () => {
97
+ expect(
98
+ stringifyUnknownValue({ value: null, nullAsEmptyString: true }),
99
+ ).toBe("");
100
+ });
101
+
102
+ it("should JSON-stringify plain objects", () => {
103
+ expect(stringifyUnknownValue({ value: { x: 1 } })).toBe('{"x":1}');
104
+ });
105
+ });
106
+
107
+ describe("getClipboardContent", () => {
108
+ it("should use rawValue for text when it differs from displayedValue", () => {
109
+ const displayed = {
110
+ _serialized_mime_bundle: {
111
+ mimetype: "text/html",
112
+ data: '<a href="https://example.com">42</a>',
113
+ },
114
+ };
115
+ const result = getClipboardContent(42, displayed);
116
+ expect(result.text).toBe("42");
117
+ expect(result.html).toBe('<a href="https://example.com">42</a>');
118
+ });
119
+
120
+ it("should strip html for text when rawValue equals displayedValue", () => {
121
+ const mimeBundle = {
122
+ _serialized_mime_bundle: {
123
+ mimetype: "text/html",
124
+ data: "<b>bold</b>",
125
+ },
126
+ };
127
+ const result = getClipboardContent(mimeBundle, mimeBundle);
128
+ expect(result.text).toBe("bold");
129
+ expect(result.html).toBe("<b>bold</b>");
130
+ });
131
+
132
+ it("should handle undefined rawValue", () => {
133
+ const displayed = {
134
+ _serialized_mime_bundle: {
135
+ mimetype: "text/html",
136
+ data: "<b>hello</b>",
137
+ },
138
+ };
139
+ const result = getClipboardContent(undefined, displayed);
140
+ expect(result.text).toBe("hello");
141
+ expect(result.html).toBe("<b>hello</b>");
142
+ });
143
+
144
+ it("should return no html for plain values", () => {
145
+ const result = getClipboardContent(undefined, "plain text");
146
+ expect(result.text).toBe("plain text");
147
+ expect(result.html).toBeUndefined();
148
+ });
149
+
150
+ it("should treat text/markdown as html since mo.md() data is rendered html", () => {
151
+ const displayed = {
152
+ _serialized_mime_bundle: {
153
+ mimetype: "text/markdown",
154
+ data: '<span class="markdown"><strong>Hello</strong></span>',
155
+ },
156
+ };
157
+ const result = getClipboardContent(undefined, displayed);
158
+ expect(result.text).toBe("Hello");
159
+ expect(result.html).toBe(
160
+ '<span class="markdown"><strong>Hello</strong></span>',
161
+ );
162
+ });
163
+
164
+ it("should return no html for non-html mime bundles", () => {
165
+ const displayed = {
166
+ _serialized_mime_bundle: {
167
+ mimetype: "text/plain",
168
+ data: "just text",
169
+ },
170
+ };
171
+ const result = getClipboardContent(undefined, displayed);
172
+ expect(result.text).toBe("just text");
173
+ expect(result.html).toBeUndefined();
174
+ });
175
+
176
+ it("should handle null rawValue as a real value", () => {
177
+ const displayed = {
178
+ _serialized_mime_bundle: {
179
+ mimetype: "text/html",
180
+ data: "<i>N/A</i>",
181
+ },
182
+ };
183
+ const result = getClipboardContent(null, displayed);
184
+ expect(result.text).toBe("null");
185
+ expect(result.html).toBe("<i>N/A</i>");
186
+ });
187
+ });
188
+
189
+ function createMockTableWithMeta<TData>(rawData?: TData[]): Table<TData> {
190
+ return {
191
+ options: {
192
+ meta: { rawData },
193
+ },
194
+ } as unknown as Table<TData>;
195
+ }
196
+
197
+ describe("getRawValue", () => {
198
+ it("should return raw value when rawData is available", () => {
199
+ const table = createMockTableWithMeta([
200
+ { a: 10, b: 20 },
201
+ { a: 30, b: 40 },
202
+ ]);
203
+ expect(getRawValue(table, 0, "a")).toBe(10);
204
+ expect(getRawValue(table, 1, "b")).toBe(40);
205
+ });
206
+
207
+ it("should return undefined when rawData is not set", () => {
208
+ const table = createMockTableWithMeta(undefined);
209
+ expect(getRawValue(table, 0, "a")).toBeUndefined();
210
+ });
211
+
212
+ it("should return undefined when row index is out of bounds", () => {
213
+ const table = createMockTableWithMeta([{ a: 1 }]);
214
+ expect(getRawValue(table, 5, "a")).toBeUndefined();
215
+ });
216
+ });
@@ -12,7 +12,7 @@ vi.mock("@/utils/storage/storage", () => ({
12
12
  },
13
13
  }));
14
14
 
15
- import type { CellId } from "@/core/cells/ids";
15
+ import { cellId } from "@/__tests__/branded";
16
16
  import { availableStorage } from "@/utils/storage/storage";
17
17
  import { ChartSchema } from "../schemas";
18
18
  import type { TabName } from "../storage";
@@ -37,7 +37,7 @@ describe("Chart Transforms Storage", () => {
37
37
 
38
38
  it("should store and retrieve tab data", () => {
39
39
  const store = getDefaultStore();
40
- const cellId = "cell-1" as CellId;
40
+ const cid = cellId("cell-1");
41
41
  const tabData = {
42
42
  tabName: "Tab 1" as TabName,
43
43
  chartType: ChartType.LINE,
@@ -51,17 +51,17 @@ describe("Chart Transforms Storage", () => {
51
51
 
52
52
  // Set the atom value
53
53
  const newMap = new Map();
54
- newMap.set(cellId, [tabData]);
54
+ newMap.set(cid, [tabData]);
55
55
  store.set(tabsStorageAtom, newMap);
56
56
 
57
57
  // Verify the value was set
58
58
  const retrievedValue = store.get(tabsStorageAtom);
59
- expect(retrievedValue.get(cellId)).toEqual([tabData]);
59
+ expect(retrievedValue.get(cid)).toEqual([tabData]);
60
60
  });
61
61
 
62
62
  it("should handle multiple tabs for the same cell", () => {
63
63
  const store = getDefaultStore();
64
- const cellId = "cell-1" as CellId;
64
+ const cid = cellId("cell-1");
65
65
  const tabData1 = {
66
66
  tabName: "Tab 1" as TabName,
67
67
  chartType: ChartType.LINE,
@@ -85,12 +85,12 @@ describe("Chart Transforms Storage", () => {
85
85
 
86
86
  // Set the atom value
87
87
  const newMap = new Map();
88
- newMap.set(cellId, [tabData1, tabData2]);
88
+ newMap.set(cid, [tabData1, tabData2]);
89
89
  store.set(tabsStorageAtom, newMap);
90
90
 
91
91
  // Verify the value was set
92
92
  const retrievedValue = store.get(tabsStorageAtom);
93
- expect(retrievedValue.get(cellId)).toEqual([tabData1, tabData2]);
93
+ expect(retrievedValue.get(cid)).toEqual([tabData1, tabData2]);
94
94
  });
95
95
  });
96
96
 
@@ -112,6 +112,7 @@ export function generateColumns<T>({
112
112
  headerTooltip,
113
113
  showDataTypes,
114
114
  calculateTopKRows,
115
+ fractionDigitsByColumn,
115
116
  }: {
116
117
  rowHeaders: FieldTypesWithExternalType;
117
118
  selection: DataTableSelection;
@@ -122,6 +123,7 @@ export function generateColumns<T>({
122
123
  headerTooltip?: Record<string, string>;
123
124
  showDataTypes?: boolean;
124
125
  calculateTopKRows?: CalculateTopKRows;
126
+ fractionDigitsByColumn?: Record<string, number>;
125
127
  }): ColumnDef<T>[] {
126
128
  // Row-headers are typically index columns
127
129
  const rowHeadersSet = new Set(rowHeaders.map(([columnName]) => columnName));
@@ -138,6 +140,7 @@ export function generateColumns<T>({
138
140
  rowHeader: isRowHeader,
139
141
  dtype: types?.[1],
140
142
  dataType: types?.[0],
143
+ minFractionDigits: fractionDigitsByColumn?.[key],
141
144
  };
142
145
  }
143
146
 
@@ -146,9 +149,23 @@ export function generateColumns<T>({
146
149
  filterType: getFilterTypeForFieldType(types[0]),
147
150
  dtype: types[1],
148
151
  dataType: types[0],
152
+ minFractionDigits: fractionDigitsByColumn?.[key],
149
153
  };
150
154
  };
151
155
 
156
+ const getJustify = (key: string): "left" | "center" | "right" | undefined => {
157
+ // Explicit user override takes precedence
158
+ if (textJustifyColumns?.[key]) {
159
+ return textJustifyColumns[key];
160
+ }
161
+ // Auto right-align numeric columns
162
+ const dataType = getMeta(key).dataType;
163
+ if (dataType === "number" || dataType === "integer") {
164
+ return "right";
165
+ }
166
+ return undefined;
167
+ };
168
+
152
169
  const columnKeys: string[] = [
153
170
  ...rowHeadersSet,
154
171
  ...fieldTypes.map(([columnName]) => columnName),
@@ -186,7 +203,7 @@ export function generateColumns<T>({
186
203
  </div>
187
204
  ) : null;
188
205
 
189
- const justify = textJustifyColumns?.[key];
206
+ const justify = getJustify(key);
190
207
 
191
208
  const headerWithType = (
192
209
  <div
@@ -254,18 +271,21 @@ export function generateColumns<T>({
254
271
  cell.toggleSelected?.();
255
272
  }
256
273
 
257
- const justify = textJustifyColumns?.[key];
274
+ const justify = getJustify(key);
258
275
  const wrapped = wrappedColumns?.includes(key);
259
276
  const isCellSelected = cell?.getIsSelected?.() || false;
260
277
  const canSelectCell =
261
278
  (selection === "single-cell" || selection === "multi-cell") &&
262
279
  !isCellSelected;
263
280
 
281
+ const dataType = column.columnDef.meta?.dataType;
282
+ const isNumeric = dataType === "number" || dataType === "integer";
264
283
  const cellStyles = getCellStyleClass(
265
284
  justify,
266
285
  wrapped,
267
286
  canSelectCell,
268
287
  isCellSelected,
288
+ isNumeric,
269
289
  );
270
290
 
271
291
  const renderedCell = renderCellValue({
@@ -430,6 +450,7 @@ function getCellStyleClass(
430
450
  wrapped: boolean | undefined,
431
451
  canSelectCell: boolean,
432
452
  isSelected: boolean,
453
+ isNumeric?: boolean,
433
454
  ): string {
434
455
  return cn(
435
456
  canSelectCell && "cursor-pointer",
@@ -438,6 +459,7 @@ function getCellStyleClass(
438
459
  "w-full",
439
460
  "text-left",
440
461
  "truncate",
462
+ isNumeric && "tabular-nums",
441
463
  justify === "center" && "text-center",
442
464
  justify === "right" && "text-right",
443
465
  wrapped && `${COLUMN_WRAPPING_STYLES} break-words`,
@@ -589,7 +611,18 @@ export function renderCellValue<TData, TValue>({
589
611
  if (typeof value === "number") {
590
612
  return (
591
613
  <div onClick={selectCell} className={cellStyles}>
592
- <LocaleNumber value={value} />
614
+ <LocaleNumber
615
+ value={value}
616
+ minFractionDigits={column.columnDef.meta?.minFractionDigits}
617
+ />
618
+ </div>
619
+ );
620
+ }
621
+
622
+ if (typeof value === "boolean") {
623
+ return (
624
+ <div onClick={selectCell} className={cellStyles}>
625
+ {value ? "True" : "False"}
593
626
  </div>
594
627
  );
595
628
  }
@@ -635,9 +668,16 @@ export function renderCellValue<TData, TValue>({
635
668
  );
636
669
  }
637
670
 
638
- export const LocaleNumber = ({ value }: { value: number }) => {
671
+ export const LocaleNumber = ({
672
+ value,
673
+ minFractionDigits,
674
+ }: {
675
+ value: number;
676
+ minFractionDigits?: number;
677
+ }) => {
639
678
  const { locale } = useLocale();
640
679
  const format = useNumberFormatter({
680
+ minimumFractionDigits: minFractionDigits,
641
681
  maximumFractionDigits: maxFractionalDigits(locale),
642
682
  });
643
683
  return format.format(value);
@@ -18,7 +18,7 @@ import {
18
18
  import { DATA_CELL_ID } from "./cell-utils";
19
19
  import { Filter } from "./filters";
20
20
  import { selectedCellsAtom } from "./range-focus/atoms";
21
- import { stringifyUnknownValue } from "./utils";
21
+ import { getClipboardContent, getRawValue } from "./utils";
22
22
 
23
23
  export const DataTableContextMenu = <TData,>({
24
24
  contextMenuRef,
@@ -82,11 +82,15 @@ export const CellContextMenu = <TData,>({
82
82
  return;
83
83
  }
84
84
 
85
+ const table = cell.getContext().table;
86
+ const displayedValue = cell.getValue();
87
+ const rawValue =
88
+ getRawValue(table, cell.row.index, cell.column.id) ?? displayedValue;
89
+
85
90
  const handleCopyCell = () => {
86
91
  try {
87
- const value = cell.getValue();
88
- const stringValue = stringifyUnknownValue({ value });
89
- copyToClipboard(stringValue);
92
+ const { text, html } = getClipboardContent(rawValue, displayedValue);
93
+ copyToClipboard(text, html);
90
94
  } catch (error) {
91
95
  Logger.error("Failed to copy context menu cell", error);
92
96
  }
@@ -98,7 +102,7 @@ export const CellContextMenu = <TData,>({
98
102
  const handleFilterCell = (operator: "in" | "not_in") => {
99
103
  column.setFilterValue(
100
104
  Filter.select({
101
- options: [cell.getValue()],
105
+ options: [rawValue],
102
106
  operator,
103
107
  }),
104
108
  );
@@ -38,12 +38,17 @@ import type { DownloadActionProps } from "./download-actions";
38
38
  import { FilterPills } from "./filter-pills";
39
39
  import { FocusRowFeature } from "./focus-row/feature";
40
40
  import { useColumnPinning } from "./hooks/use-column-pinning";
41
+ import { useScrollContainerHeight } from "./hooks/use-scroll-container-height";
41
42
  import { CellSelectionStats } from "./range-focus/cell-selection-stats";
42
43
  import { CellSelectionProvider } from "./range-focus/provider";
43
44
  import { DataTableBody, renderTableHeader } from "./renderers";
44
45
  import { SearchBar } from "./SearchBar";
45
46
  import { TableActions } from "./TableActions";
46
- import type { DataTableSelection, TooManyRows } from "./types";
47
+ import {
48
+ type DataTableSelection,
49
+ MIN_ROWS_TO_VIRTUALIZE,
50
+ type TooManyRows,
51
+ } from "./types";
47
52
  import { getStableRowId } from "./utils";
48
53
 
49
54
  interface DataTableProps<TData> extends Partial<DownloadActionProps> {
@@ -52,6 +57,7 @@ interface DataTableProps<TData> extends Partial<DownloadActionProps> {
52
57
  maxHeight?: number;
53
58
  columns: ColumnDef<TData>[];
54
59
  data: TData[];
60
+ rawData?: TData[]; // raw data for filtering/copying (present only if format_mapping is provided)
55
61
  // Sorting
56
62
  manualSorting?: boolean; // server-side sorting
57
63
  sorting?: SortingState; // controlled sorting
@@ -103,6 +109,7 @@ const DataTableInternal = <TData,>({
103
109
  maxHeight,
104
110
  columns,
105
111
  data,
112
+ rawData,
106
113
  selection,
107
114
  totalColumns,
108
115
  totalRows,
@@ -197,6 +204,7 @@ const DataTableInternal = <TData,>({
197
204
  ],
198
205
  data,
199
206
  columns,
207
+ meta: { rawData },
200
208
  getCoreRowModel: getCoreRowModel(),
201
209
  // pagination
202
210
  rowCount: totalRows === "too_many" ? undefined : totalRows,
@@ -265,36 +273,9 @@ const DataTableInternal = <TData,>({
265
273
  });
266
274
 
267
275
  const rowViewerPanelOpen = isPanelOpen?.("row-viewer") ?? false;
276
+ const virtualize = !pagination && data.length > MIN_ROWS_TO_VIRTUALIZE;
268
277
 
269
- const tableRef = React.useRef<HTMLTableElement | null>(null);
270
-
271
- // Why use a ref to set max-height on the wrapper?
272
- // - position: sticky only works when the sticky element's nearest scrollable
273
- // ancestor is its immediate container. If max-height/overflow are applied
274
- // on a grandparent, sticky table headers (th) will not stick.
275
- // - We keep the scroll wrapper colocated with the base Table component, but
276
- // derive the scroll boundary from maxHeight here to avoid coupling UI base
277
- // components to data-table specifics or expanding their API surface.
278
- // - Setting styles on the table's direct wrapper ensures the header sticks
279
- // reliably across browsers without changing upstream components.
280
- React.useEffect(() => {
281
- if (!tableRef.current) {
282
- return;
283
- }
284
- const wrapper = tableRef.current.parentElement as HTMLDivElement | null;
285
- if (!wrapper) {
286
- return;
287
- }
288
- if (maxHeight) {
289
- wrapper.style.maxHeight = `${maxHeight}px`;
290
- // Ensure wrapper scrolls
291
- if (!wrapper.style.overflow) {
292
- wrapper.style.overflow = "auto";
293
- }
294
- } else {
295
- wrapper.style.removeProperty("max-height");
296
- }
297
- }, [maxHeight]);
278
+ const tableRef = useScrollContainerHeight({ maxHeight, virtualize });
298
279
 
299
280
  return (
300
281
  <div className={cn(wrapperClassName, "flex flex-col space-y-1")}>
@@ -314,13 +295,14 @@ const DataTableInternal = <TData,>({
314
295
  {showLoadingBar && (
315
296
  <thead className="absolute top-0 left-0 h-[3px] w-1/2 bg-primary animate-slide" />
316
297
  )}
317
- {renderTableHeader(table, Boolean(maxHeight))}
298
+ {renderTableHeader(table, virtualize || Boolean(maxHeight))}
318
299
  <DataTableBody
319
300
  table={table}
320
301
  columns={columns}
321
302
  rowViewerPanelOpen={rowViewerPanelOpen}
322
303
  getRowIndex={getPaginatedRowIndex}
323
304
  viewedRowIdx={viewedRowIdx}
305
+ virtualize={virtualize}
324
306
  />
325
307
  </Table>
326
308
  </div>
@@ -16,6 +16,7 @@ declare module "@tanstack/react-table" {
16
16
  dtype?: string;
17
17
  dataType?: DataType;
18
18
  filterType?: FilterType;
19
+ minFractionDigits?: number;
19
20
  }
20
21
  }
21
22
 
@@ -0,0 +1,97 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { useEffect, useLayoutEffect, useRef } from "react";
4
+ import {
5
+ DEFAULT_VIRTUAL_ROWS,
6
+ TABLE_HEADER_HEIGHT_PX,
7
+ TABLE_ROW_HEIGHT_PX,
8
+ } from "../types";
9
+
10
+ /**
11
+ * Manages the scroll container's max-height for the data table.
12
+ *
13
+ * Why set max-height on the table's direct wrapper via a ref?
14
+ * - `position: sticky` only works when the sticky element's nearest scrollable
15
+ * ancestor is its immediate container. If max-height/overflow are applied on
16
+ * a grandparent, sticky `<th>` elements will not stick.
17
+ * - The <Table> UI component wraps <table> in a div with overflow-auto. We
18
+ * derive the scroll boundary from this wrapper (tableRef.parentElement) to
19
+ * keep sticky headers working without coupling base UI components to
20
+ * data-table specifics or expanding their API surface.
21
+ *
22
+ * 3 scenarios:
23
+ * - maxHeight applied directly. This always takes preference
24
+ * - Virtualize without maxHeight: observed via ResizeObserver on <thead>
25
+ * so the container reacts to header size changes (charts loading, toggles).
26
+ * - No maxHeight and no virtualization: render everything
27
+ * in practice virtualization kicks in after 100 rows with pagination disabled
28
+ */
29
+ export function useScrollContainerHeight({
30
+ maxHeight,
31
+ virtualize,
32
+ }: {
33
+ maxHeight?: number;
34
+ virtualize: boolean;
35
+ }) {
36
+ const tableRef = useRef<HTMLTableElement | null>(null);
37
+
38
+ // Handle explicit maxHeight and non-virtualize cases synchronously
39
+ // before paint to avoid flickering.
40
+ useLayoutEffect(() => {
41
+ if (!tableRef.current) {
42
+ return;
43
+ }
44
+ const wrapper = tableRef.current.parentElement as HTMLDivElement | null;
45
+ if (!wrapper) {
46
+ return;
47
+ }
48
+ if (maxHeight) {
49
+ wrapper.style.maxHeight = `${maxHeight}px`;
50
+ if (!wrapper.style.overflow) {
51
+ wrapper.style.overflow = "auto";
52
+ }
53
+ } else if (!virtualize) {
54
+ wrapper.style.removeProperty("max-height");
55
+ }
56
+ // When virtualizing without an explicit maxHeight, the ResizeObserver
57
+ // below handles setting maxHeight reactively based on actual header size.
58
+ }, [maxHeight, virtualize]);
59
+
60
+ // When virtualizing without an explicit maxHeight, observe the <thead> for
61
+ // size changes (column summaries, charts loading async, header toggle) and
62
+ // recompute the scroll container height accordingly.
63
+ useEffect(() => {
64
+ if (!virtualize || maxHeight) {
65
+ return;
66
+ }
67
+ const table = tableRef.current;
68
+ if (!table) {
69
+ return;
70
+ }
71
+ const wrapper = table.parentElement as HTMLDivElement | null;
72
+ const thead = table.querySelector("thead");
73
+ if (!wrapper || !thead) {
74
+ return;
75
+ }
76
+ const updateMaxHeight = () => {
77
+ const headerHeight =
78
+ thead.getBoundingClientRect().height || TABLE_HEADER_HEIGHT_PX;
79
+ // Skip virtual spacer rows — they have arbitrary heights for scroll offset.
80
+ const firstDataRow = table.querySelector(
81
+ "tbody tr:not([data-virtual-spacer])",
82
+ );
83
+ const rowHeight =
84
+ firstDataRow?.getBoundingClientRect().height || TABLE_ROW_HEIGHT_PX;
85
+ wrapper.style.maxHeight = `${DEFAULT_VIRTUAL_ROWS * rowHeight + headerHeight}px`;
86
+ };
87
+
88
+ // Set initial height
89
+ updateMaxHeight();
90
+
91
+ const observer = new ResizeObserver(updateMaxHeight);
92
+ observer.observe(thead);
93
+ return () => observer.disconnect();
94
+ }, [virtualize, maxHeight]);
95
+
96
+ return tableRef;
97
+ }
@@ -403,7 +403,10 @@ describe("cell selection atoms", () => {
403
403
  beforeEach(() => {
404
404
  // Reset mocks before each test
405
405
  vi.mocked(getCellValues).mockClear();
406
- vi.mocked(getCellValues).mockReturnValue("mocked cell values");
406
+ vi.mocked(getCellValues).mockReturnValue({
407
+ text: "mocked cell values",
408
+ html: undefined,
409
+ });
407
410
  });
408
411
 
409
412
  afterEach(() => {
@@ -424,7 +427,10 @@ describe("cell selection atoms", () => {
424
427
  });
425
428
 
426
429
  expect(getCellValues).toHaveBeenCalledWith(mockTable, selectedCells);
427
- expect(copyToClipboard).toHaveBeenCalledWith("mocked cell values");
430
+ expect(copyToClipboard).toHaveBeenCalledWith(
431
+ "mocked cell values",
432
+ undefined,
433
+ );
428
434
  expect(onCopyComplete).toHaveBeenCalledWith();
429
435
  expect(state.copiedCells).toEqual(selectedCells);
430
436
  });
@@ -56,12 +56,14 @@ export function createMockRow(
56
56
  export function createMockTable(
57
57
  rows: Row<unknown>[],
58
58
  columns: Column<unknown>[],
59
+ opts?: { rawData?: unknown[] },
59
60
  ): Table<unknown> {
60
61
  return {
61
62
  getRow: (id: string) => rows.find((row) => row.id === id),
62
63
  getRowModel: () => ({ rows }),
63
64
  getColumn: (columnId: string) => columns.find((col) => col.id === columnId),
64
65
  getAllColumns: () => columns,
66
+ options: { meta: { rawData: opts?.rawData } },
65
67
  } as unknown as Table<unknown>;
66
68
  }
67
69