@marimo-team/islands 0.21.2-dev9 → 0.21.2-dev90

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 (666) 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-CSvBdMtG.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-CN_DUtLR.js +7710 -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-DodLQWPg.js → dist--MUqhsBh.js} +1 -1
  76. package/dist/{dist-CAKwXCWI.js → dist-8-jPFKws.js} +2 -2
  77. package/dist/{dist-i-ud9aCA.js → dist-B6ZvKwIz.js} +1 -1
  78. package/dist/{dist-BGZ7TWS9.js → dist-B771Ewvn.js} +3 -3
  79. package/dist/dist-BK8Ch8me.js +5 -0
  80. package/dist/dist-BPlAe3w3.js +6 -0
  81. package/dist/dist-BQnLGf1A.js +8 -0
  82. package/dist/dist-BZRBnAnM.js +5 -0
  83. package/dist/{dist-D4gcY469.js → dist-Bc-mOFlk.js} +2 -2
  84. package/dist/{dist-BUrWeMEP.js → dist-Bg1YGq2b.js} +1 -1
  85. package/dist/{dist-C0Rnbr-_.js → dist-BiNtCiQ9.js} +4 -4
  86. package/dist/{dist-B9EjSb9T.js → dist-BjYGwQ65.js} +1 -1
  87. package/dist/dist-BmTKj-5m.js +5 -0
  88. package/dist/{dist-D_-CGmlh.js → dist-BsyHyGqX.js} +2 -2
  89. package/dist/dist-C1UyhB0b.js +5 -0
  90. package/dist/dist-C1uqqTuH.js +5 -0
  91. package/dist/dist-CCeSY9xv.js +5 -0
  92. package/dist/{dist-DEj2X26M.js → dist-CEmSeYaL.js} +2 -2
  93. package/dist/{dist-CDHl2i1x.js → dist-CJEfzjG5.js} +4 -4
  94. package/dist/dist-CMWhb0s1.js +5 -0
  95. package/dist/{dist-BSfYc7vq.js → dist-CXsGjNbR.js} +2 -2
  96. package/dist/{dist-CseYuPtL.js → dist-CpNdP46s.js} +2 -2
  97. package/dist/{dist-CPlGUbk-.js → dist-CsToCMcA.js} +2 -2
  98. package/dist/dist-CwEBZkrQ.js +550 -0
  99. package/dist/{dist-DERtJN02.js → dist-CwP9oyR8.js} +2 -2
  100. package/dist/{dist-C4K7pumm.js → dist-D2nC1On3.js} +2 -2
  101. package/dist/{dist-BFxYppVR.js → dist-DEmPLkH9.js} +4 -4
  102. package/dist/{dist-lNe4i1Nm.js → dist-DKr1M-ru.js} +1 -1
  103. package/dist/{dist-D5NMgbbv.js → dist-DNSJBJI7.js} +2 -2
  104. package/dist/{dist-HoZO6brh.js → dist-DSSPn3fP.js} +2 -2
  105. package/dist/dist-DYoFz28E.js +8 -0
  106. package/dist/dist-DeSnQwvL.js +6 -0
  107. package/dist/{dist-COpDrwi-.js → dist-Dl9_0tkc.js} +1 -1
  108. package/dist/{dist-Bq5eYK43.js → dist-DlacJSaE.js} +2 -2
  109. package/dist/{dist-RNGn_-uD.js → dist-DoO66t8e.js} +1 -1
  110. package/dist/{dist-Bq9zYwJs.js → dist-DqT0O-4m.js} +5 -5
  111. package/dist/{dist-CSEWGuDq.js → dist-DqweMfpO.js} +1 -1
  112. package/dist/{dist-gc9KgJuA.js → dist-DvjVNme1.js} +1 -1
  113. package/dist/{dist-DOoqn-VL.js → dist-N1lm7LVK.js} +71 -37
  114. package/dist/{dist-Cl5iM8xL.js → dist-QxBlbqgj.js} +3 -3
  115. package/dist/{dist-Ux6dL_VB.js → dist-TuFHGVp2.js} +1 -1
  116. package/dist/dist-e8VqCQ_P.js +5 -0
  117. package/dist/{dist-DUretbKK.js → dist-fRW2mZtS.js} +2 -2
  118. package/dist/dist-kGaha3sX.js +8 -0
  119. package/dist/{dist-BpMlUdNO.js → dist-mpvRA2Bc.js} +3 -3
  120. package/dist/dist-wQD8nhf9.js +8 -0
  121. package/dist/{dockerfile-BxhYdLHL.js → dockerfile-DG6A2DdH.js} +1 -1
  122. package/dist/dtd-Dyiazv4N.js +4 -0
  123. package/dist/dylan-D8Fcw7NA.js +4 -0
  124. package/dist/ecl-CjKp8Vii.js +4 -0
  125. package/dist/eiffel-K9ViOX5r.js +4 -0
  126. package/dist/elm-B5NVtRco.js +4 -0
  127. package/dist/{erDiagram-Q2GNP2WA-DPMseVVp.js → erDiagram-Q2GNP2WA-CGK0SUdu.js} +15 -15
  128. package/dist/erlang-BnLzgk7R.js +4 -0
  129. package/dist/{error-banner-Dmi5ujan.js → error-banner-D-KBGvBj.js} +3 -3
  130. package/dist/esm-B_4hpmV_.js +1587 -0
  131. package/dist/esm-Bcbo0Yvz.js +2805 -0
  132. package/dist/{factor-Png_OsVt.js → factor-Bq2mGIHt.js} +1 -1
  133. package/dist/factor-C7f9Jz5R.js +4 -0
  134. package/dist/{flowDiagram-NV44I4VS-BpAIFwW7.js → flowDiagram-NV44I4VS-PjhviPI_.js} +17 -17
  135. package/dist/forth-rGM8jLao.js +4 -0
  136. package/dist/fortran-B3acSe0i.js +4 -0
  137. package/dist/{ganttDiagram-JELNMOA3-DXYghZ9C.js → ganttDiagram-JELNMOA3-CUVtQqgT.js} +10 -10
  138. package/dist/gas-Bb1Vmv_N.js +4 -0
  139. package/dist/gherkin-C9Lyidgd.js +4 -0
  140. package/dist/{gitGraph-G5XIXVHT-ChHUSAop.js → gitGraph-G5XIXVHT-B6b-Z3mr.js} +3 -3
  141. package/dist/{gitGraphDiagram-V2S2FVAM-CBL-7g3_.js → gitGraphDiagram-V2S2FVAM-CNdrlK1I.js} +17 -17
  142. package/dist/{glide-data-editor-pZyd9UJ_.js → glide-data-editor-DQEuWuu_.js} +94 -93
  143. package/dist/{graphlib-D18eZCT4.js → graphlib-CIQjMxKw.js} +6 -6
  144. package/dist/groovy-DQk6XcGH.js +4 -0
  145. package/dist/{hasIn-B9AbGLj3.js → hasIn-eLCPDloT.js} +5 -5
  146. package/dist/haskell-mV0Vw9gv.js +4 -0
  147. package/dist/haxe-DqxN89zH.js +5 -0
  148. package/dist/idl-ya8W561J.js +4 -0
  149. package/dist/{info-VBDWY6EO-CwyXEo8E.js → info-VBDWY6EO-DfFl0Z8H.js} +3 -3
  150. package/dist/infoDiagram-HS3SLOUP-DGimKb9k.js +30 -0
  151. package/dist/{types-CGc7peZV.js → input-B8CM-AuM.js} +208 -405
  152. package/dist/{isEmpty-C-xMag79.js → isEmpty-CI9akcsL.js} +2 -2
  153. package/dist/{isString-D-vNYDBA.js → isString-xiQUcgm4.js} +1 -1
  154. package/dist/{isSymbol-Dyt2NSnN.js → isSymbol-DFp8040B.js} +1 -1
  155. package/dist/javascript-CgqgptVu.js +4 -0
  156. package/dist/{journeyDiagram-XKPGCS4Q-D5BIjS4N.js → journeyDiagram-XKPGCS4Q-CyoESVVb.js} +7 -7
  157. package/dist/julia-CFQ-HusI.js +4 -0
  158. package/dist/{kanban-definition-3W4ZIXB7-DhDkqxFB.js → kanban-definition-3W4ZIXB7-Doc2YV80.js} +12 -12
  159. package/dist/{katex-pyO_klYC.js → katex-qPqrBHZ8.js} +1 -1
  160. package/dist/{label-BbpGrh4j.js → label-e5-84vsp.js} +10 -10
  161. package/dist/{line-C1k1rG3Z.js → line-BWRi3U3S.js} +3 -3
  162. package/dist/{linear-DIp6l9sg.js → linear-DZ8_CGCd.js} +4 -4
  163. package/dist/livescript-D__3TmDo.js +4 -0
  164. package/dist/{loader-CABJs6GU.js → loader-C51Irhxm.js} +3 -3
  165. package/dist/lua-Bytcgj_W.js +4 -0
  166. package/dist/main.js +35443 -70505
  167. package/dist/mathematica-DJhvVKvl.js +4 -0
  168. package/dist/mbox-IGHPCjfR.js +4 -0
  169. package/dist/{memoize-Cs8aS5RW.js → memoize-zYM53m8l.js} +1 -1
  170. package/dist/{merge-NuyC7LN7.js → merge-CqBPpP0q.js} +1 -1
  171. package/dist/mermaid-4DMBBIKO-DQdI9xDR.js +6 -0
  172. package/dist/{mermaid-CrKqsE2j.js → mermaid-CzWpf81s.js} +50 -50
  173. package/dist/{mermaid-parser.core-OkWZ8nr-.js → mermaid-parser.core-CrrqF1ZZ.js} +8 -8
  174. package/dist/{mhchem-DckvwtV8.js → mhchem-BwoRNwg_.js} +1 -1
  175. package/dist/micromark-factory-space-DQCQsiYz.js +1341 -0
  176. package/dist/{min-ECVRnCdn.js → min-IJGSWMpU.js} +8 -8
  177. package/dist/{mindmap-definition-VGOIOE7T-BxQi78Vl.js → mindmap-definition-VGOIOE7T-L2ybicpO.js} +14 -14
  178. package/dist/mirc-tcwvVugm.js +4 -0
  179. package/dist/mllike-Dx91i62r.js +6 -0
  180. package/dist/modelica-_SRt-yU5.js +4 -0
  181. package/dist/mscgen-GZrGS9gt.js +6 -0
  182. package/dist/mumps-Cv3ygyod.js +4 -0
  183. package/dist/{now-BC2mX0ZT.js → now-CnuN5fN5.js} +1 -1
  184. package/dist/nsis-BU7GeGbI.js +4 -0
  185. package/dist/{nsis-BrAITej_.js → nsis-i9_sgigf.js} +1 -1
  186. package/dist/ntriples-CL-FCYXb.js +4 -0
  187. package/dist/{number-overlay-editor-CQrncFlP.js → number-overlay-editor-D2Y0RpcH.js} +1 -1
  188. package/dist/octave-Dc6_3DIu.js +4 -0
  189. package/dist/{once-BqS42WgZ.js → once-DjP4Kbhy.js} +1 -1
  190. package/dist/{ordinal-Dcvf4J1m.js → ordinal-B4zYMadD.js} +1 -1
  191. package/dist/oz-DpUAJCXf.js +4 -0
  192. package/dist/{packet-DYOGHKS2-C62XQjZh.js → packet-DYOGHKS2-DIf3Dotq.js} +3 -3
  193. package/dist/pascal-B17mncXs.js +4 -0
  194. package/dist/perl-BTpK97q9.js +4 -0
  195. package/dist/{pie-VRWISCQL-nfAKQJw3.js → pie-VRWISCQL-Dj_gvPcD.js} +3 -3
  196. package/dist/{pieDiagram-ADFJNKIX-DfSJXUHa.js → pieDiagram-ADFJNKIX-x5w7q6Yp.js} +22 -22
  197. package/dist/pig-CFb638Ap.js +4 -0
  198. package/dist/powershell-Cxo-_2A5.js +4 -0
  199. package/dist/{precisionRound-BAc-kQ3q.js → precisionRound-C-DW449D.js} +1 -1
  200. package/dist/process-output-BfgNdve9.js +28024 -0
  201. package/dist/properties-BPgT1xTB.js +4 -0
  202. package/dist/protobuf-BgHBaIIK.js +4 -0
  203. package/dist/pug-25-oS0SG.js +4 -0
  204. package/dist/{pug-CH-17az-.js → pug-BhE2JRSg.js} +1 -1
  205. package/dist/puppet-DarIr20S.js +4 -0
  206. package/dist/python-BqmOsBsi.js +4 -0
  207. package/dist/q-D3QJCTup.js +4 -0
  208. package/dist/{quadrantDiagram-AYHSOK5B-CAcVWXc-.js → quadrantDiagram-AYHSOK5B-D5j_5qG_.js} +5 -5
  209. package/dist/r-Cz_yBX4z.js +4 -0
  210. package/dist/{radar-ZZBFDIW7-lopS8_4j.js → radar-ZZBFDIW7-DXDVq3gi.js} +3 -3
  211. package/dist/{range-BKaWvVUE.js → range-DffmqG6L.js} +4 -3
  212. package/dist/{react-vega-C6kwcd86.js → react-vega-BBUxfZoV.js} +19 -19
  213. package/dist/react-vega-Cs3lfDw8.js +9 -0
  214. package/dist/{reduce-CqQo8ppc.js → reduce-CGwzfrDo.js} +5 -5
  215. package/dist/{requirementDiagram-UZGBJVZJ-BU7dwzFM.js → requirementDiagram-UZGBJVZJ-3SoJH6yP.js} +14 -14
  216. package/dist/rpm-DGOtYwAI.js +5 -0
  217. package/dist/ruby-DBZu4rPc.js +4 -0
  218. package/dist/{sankeyDiagram-TZEHDZUN-BVJnR4_b.js → sankeyDiagram-TZEHDZUN-fGkFNe5q.js} +5 -5
  219. package/dist/sas-Dd1D9qTq.js +4 -0
  220. package/dist/scheme-BmDjvTHX.js +4 -0
  221. package/dist/{sequenceDiagram-WL72ISMW-CQcFQTwX.js → sequenceDiagram-WL72ISMW-BE2uTn_d.js} +8 -8
  222. package/dist/shell-BL8zFSaj.js +4 -0
  223. package/dist/sieve-BAx2WqUP.js +4 -0
  224. package/dist/{slides-component-GkilRW21.js → slides-component-Cjo6LzW9.js} +3 -3
  225. package/dist/smalltalk-CYRzF7VV.js +4 -0
  226. package/dist/sparql-YWaDRO4A.js +4 -0
  227. package/dist/{spec-Bfvf9Hre.js → spec-UGFYIDJb.js} +12 -422
  228. package/dist/{src-CHUphWwL.js → src-BY0BGg6V.js} +1 -1
  229. package/dist/{stateDiagram-FKZM4ZOC-Dx9AIGDe.js → stateDiagram-FKZM4ZOC-Dmk9IAOx.js} +19 -19
  230. package/dist/stateDiagram-v2-4FDKWEC3-BGF0BvU6.js +29 -0
  231. package/dist/{step-BbmiiQdf.js → step-DGAGWg3y.js} +1 -1
  232. package/dist/stex-BvZqVamL.js +4 -0
  233. package/dist/style.css +1 -1
  234. package/dist/stylus-lYsyLFc1.js +4 -0
  235. package/dist/swift-ClQz9z1n.js +4 -0
  236. package/dist/tcl-B3jhsfqY.js +4 -0
  237. package/dist/textile-Cb1Dw7Aq.js +4 -0
  238. package/dist/{time-DFFVNc1Q.js → time-C_pvjzP0.js} +4 -4
  239. package/dist/{timeline-definition-IT6M3QCI-D8B3p7ID.js → timeline-definition-IT6M3QCI-CvB4yGrN.js} +4 -4
  240. package/dist/toDate-COI3hP-5.js +637 -0
  241. package/dist/toInteger-BUeg_O0F.js +15 -0
  242. package/dist/{toNumber-CbZ70FdN.js → toNumber-xFPoy1OI.js} +2 -2
  243. package/dist/{toString-DbIAWQpF.js → toString-CtXX84W6.js} +2 -2
  244. package/dist/toml-nHZhetdO.js +4 -0
  245. package/dist/{tooltip-CKG75XQa.js → tooltip-DnI4CwIS.js} +4 -4
  246. package/dist/{treemap-GDKQZRPO-CkR-5ai2.js → treemap-GDKQZRPO-CIG6WH-x.js} +3 -3
  247. package/dist/troff-DuJAGWKH.js +4 -0
  248. package/dist/ttcn-BxrcwP21.js +4 -0
  249. package/dist/ttcn-cfg-BAg_9dcc.js +4 -0
  250. package/dist/turtle-zCq949as.js +4 -0
  251. package/dist/types-BqLAaq-i.js +209 -0
  252. package/dist/{uniq-H2E5nMLq.js → uniq-CCKqEs7T.js} +1 -1
  253. package/dist/{useAsyncData-CEjJxwFB.js → useAsyncData-BtHYXgXF.js} +2 -2
  254. package/dist/useDeepCompareMemoize-9dXEtK7u.js +124 -0
  255. package/dist/useIframeCapabilities-CzVvBDe8.js +13 -0
  256. package/dist/useLifecycle-Be1LUuEg.js +427 -0
  257. package/dist/{useTheme-CPybHVFN.js → useTheme-5GTtjXjy.js} +4 -4
  258. package/dist/vb-De5hElus.js +4 -0
  259. package/dist/vbscript-Cypcpv4F.js +4 -0
  260. package/dist/{vega-component-CuPTCRp5.js → vega-component-BQNW4qnB.js} +198 -197
  261. package/dist/{vega-loader.browser-CQ-lnUkI.js → vega-loader.browser-DnqN5nbz.js} +3 -3
  262. package/dist/velocity-Di7l-yhe.js +4 -0
  263. package/dist/verilog-Bzi-S3g2.js +4 -0
  264. package/dist/vhdl-B0ZZITaW.js +4 -0
  265. package/dist/webidl-0sviiRcN.js +4 -0
  266. package/dist/xquery-B4qMVWaB.js +4 -0
  267. package/dist/{xychartDiagram-PRI3JC2R-XO8FiQjU.js → xychartDiagram-PRI3JC2R-BbEInSqY.js} +13 -13
  268. package/dist/yacas-Jt25Fuv8.js +4 -0
  269. package/dist/z80-CrcbYzmp.js +4 -0
  270. package/package.json +4 -3
  271. package/src/__mocks__/notebook.ts +9 -9
  272. package/src/__mocks__/requests.ts +2 -1
  273. package/src/__tests__/branded.ts +20 -0
  274. package/src/__tests__/setup.ts +15 -0
  275. package/src/components/app-config/__tests__/get-dirty-values.test.ts +1 -1
  276. package/src/components/app-config/get-dirty-values.ts +100 -0
  277. package/src/components/app-config/user-config-form.tsx +6 -101
  278. package/src/components/chat/chat-utils.ts +7 -8
  279. package/src/components/data-table/TableActions.tsx +8 -2
  280. package/src/components/data-table/__tests__/columns.test.tsx +138 -0
  281. package/src/components/data-table/__tests__/data-table.test.tsx +63 -0
  282. package/src/components/data-table/__tests__/utils.test.ts +138 -1
  283. package/src/components/data-table/charts/__tests__/storage.test.ts +7 -7
  284. package/src/components/data-table/columns.tsx +44 -4
  285. package/src/components/data-table/context-menu.tsx +9 -5
  286. package/src/components/data-table/data-table.tsx +13 -31
  287. package/src/components/data-table/filters.ts +1 -0
  288. package/src/components/data-table/hooks/use-scroll-container-height.ts +97 -0
  289. package/src/components/data-table/range-focus/__tests__/atoms.test.ts +8 -2
  290. package/src/components/data-table/range-focus/__tests__/test-utils.ts +2 -0
  291. package/src/components/data-table/range-focus/__tests__/use-cell-range-selection.test.ts +119 -0
  292. package/src/components/data-table/range-focus/__tests__/utils.test.ts +82 -8
  293. package/src/components/data-table/range-focus/atoms.ts +2 -2
  294. package/src/components/data-table/range-focus/use-cell-range-selection.ts +19 -0
  295. package/src/components/data-table/range-focus/utils.ts +50 -12
  296. package/src/components/data-table/renderers.tsx +103 -46
  297. package/src/components/data-table/types.ts +21 -0
  298. package/src/components/data-table/utils.ts +87 -0
  299. package/src/components/datasources/datasources.tsx +45 -0
  300. package/src/components/editor/__tests__/data-attributes.test.tsx +8 -8
  301. package/src/components/editor/ai/__tests__/completion-utils.test.ts +15 -15
  302. package/src/components/editor/connections/storage/__tests__/__snapshots__/as-code.test.ts.snap +2 -2
  303. package/src/components/editor/connections/storage/as-code.ts +2 -2
  304. package/src/components/editor/file-tree/file-explorer.tsx +16 -2
  305. package/src/components/editor/file-tree/file-viewer.tsx +17 -3
  306. package/src/components/editor/navigation/__tests__/clipboard.test.ts +2 -2
  307. package/src/components/editor/navigation/__tests__/selection.test.ts +7 -6
  308. package/src/components/editor/navigation/__tests__/state.test.ts +8 -7
  309. package/src/components/editor/output/MarimoErrorOutput.tsx +7 -7
  310. package/src/components/editor/output/__tests__/traceback.test.tsx +4 -4
  311. package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +4 -4
  312. package/src/components/editor/package-alert.tsx +1 -1
  313. package/src/components/editor/renderers/vertical-layout/useFocusFirstEditor.ts +8 -1
  314. package/src/components/markdown/markdown-renderer.tsx +18 -2
  315. package/src/components/storage/storage-file-viewer.tsx +35 -1
  316. package/src/components/storage/storage-inspector.tsx +9 -4
  317. package/src/components/storage/storage-snippets.ts +3 -3
  318. package/src/components/tracing/tracing.tsx +3 -1
  319. package/src/components/ui/range-slider.tsx +108 -1
  320. package/src/core/ai/__tests__/staged-cells.test.ts +9 -8
  321. package/src/core/ai/context/providers/__tests__/cell-output.test.ts +31 -31
  322. package/src/core/ai/context/providers/__tests__/datasource.test.ts +3 -3
  323. package/src/core/ai/context/providers/__tests__/tables.test.ts +3 -2
  324. package/src/core/ai/context/providers/__tests__/variable.test.ts +84 -63
  325. package/src/core/ai/staged-cells.ts +6 -0
  326. package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +10 -9
  327. package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +6 -6
  328. package/src/core/ai/tools/edit-notebook-tool.ts +3 -3
  329. package/src/core/cells/__tests__/add-missing-import.test.ts +3 -3
  330. package/src/core/cells/__tests__/apply-transaction.test.ts +279 -0
  331. package/src/core/cells/__tests__/cells.test.ts +198 -135
  332. package/src/core/cells/__tests__/document-changes.test.ts +572 -0
  333. package/src/core/cells/__tests__/document-roundtrip.test.ts +376 -0
  334. package/src/core/cells/__tests__/focus.test.ts +5 -4
  335. package/src/core/cells/__tests__/logs.test.ts +13 -12
  336. package/src/core/cells/__tests__/pending-delete-service.test.tsx +3 -3
  337. package/src/core/cells/__tests__/runs.test.ts +29 -24
  338. package/src/core/cells/__tests__/scrollCellIntoView.test.ts +8 -7
  339. package/src/core/cells/__tests__/session.test.ts +23 -22
  340. package/src/core/cells/cells.ts +35 -8
  341. package/src/core/cells/document-changes.ts +644 -0
  342. package/src/core/cells/ids.ts +5 -5
  343. package/src/core/cells/logs.ts +2 -2
  344. package/src/core/cells/runs.ts +6 -8
  345. package/src/core/codemirror/__tests__/format.test.ts +34 -36
  346. package/src/core/codemirror/__tests__/setup.test.ts +2 -2
  347. package/src/core/codemirror/cells/__tests__/extensions.test.ts +114 -0
  348. package/src/core/codemirror/cells/__tests__/traceback-decorations.test.ts +33 -32
  349. package/src/core/codemirror/cells/extensions.ts +66 -23
  350. package/src/core/codemirror/completion/__tests__/keymap.test.ts +15 -35
  351. package/src/core/codemirror/completion/keymap.ts +14 -4
  352. package/src/core/codemirror/copilot/__tests__/getCodes.test.ts +12 -13
  353. package/src/core/codemirror/language/__tests__/utils.test.ts +3 -3
  354. package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +7 -8
  355. package/src/core/codemirror/language/languages/python.ts +4 -0
  356. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +4 -3
  357. package/src/core/codemirror/lsp/notebook-lsp.ts +28 -2
  358. package/src/core/codemirror/reactive-references/__tests__/analyzer.test.ts +7 -6
  359. package/src/core/codemirror/reactive-references/analyzer.ts +2 -2
  360. package/src/core/codemirror/rtc/loro/__tests__/sync.test.ts +52 -0
  361. package/src/core/codemirror/rtc/loro/sync.ts +1 -0
  362. package/src/core/datasets/__tests__/data-source.test.ts +93 -7
  363. package/src/core/datasets/data-source-connections.ts +44 -0
  364. package/src/core/datasets/request-registry.ts +13 -0
  365. package/src/core/datasets/state.ts +1 -1
  366. package/src/core/edit-app.tsx +0 -5
  367. package/src/core/errors/__tests__/errors.test.ts +2 -1
  368. package/src/core/export/__tests__/hooks.test.ts +37 -36
  369. package/src/core/islands/bridge.ts +2 -1
  370. package/src/core/islands/main.ts +5 -9
  371. package/src/core/kernel/__tests__/handlers.test.ts +5 -4
  372. package/src/core/kernel/handlers.ts +7 -4
  373. package/src/core/kernel/messages.ts +2 -0
  374. package/src/core/network/DeferredRequestRegistry.ts +2 -2
  375. package/src/core/network/__tests__/CachingRequestRegistry.test.ts +9 -10
  376. package/src/core/network/__tests__/DeferredRequestRegistry.test.ts +4 -6
  377. package/src/core/network/requests-lazy.ts +2 -1
  378. package/src/core/network/requests-network.ts +10 -2
  379. package/src/core/network/requests-static.ts +2 -1
  380. package/src/core/network/requests-toasting.tsx +2 -1
  381. package/src/core/network/types.ts +7 -2
  382. package/src/core/static/__tests__/virtual-file-tracker.test.ts +8 -8
  383. package/src/core/static/virtual-file-tracker.ts +1 -1
  384. package/src/core/storage/__tests__/state.test.ts +31 -21
  385. package/src/core/storage/state.ts +1 -1
  386. package/src/core/variables/__tests__/state.test.ts +6 -6
  387. package/src/core/variables/types.ts +2 -2
  388. package/src/core/wasm/__tests__/state.test.ts +8 -8
  389. package/src/core/wasm/bridge.ts +11 -1
  390. package/src/core/websocket/useMarimoKernelConnection.tsx +33 -26
  391. package/src/css/app/fonts.css +6 -6
  392. package/src/css/md-tooltip.css +4 -39
  393. package/src/css/md.css +10 -0
  394. package/src/fonts/Fira_Mono/FiraMono-Bold.woff2 +0 -0
  395. package/src/fonts/Fira_Mono/FiraMono-Medium.woff2 +0 -0
  396. package/src/fonts/Fira_Mono/FiraMono-Regular.woff2 +0 -0
  397. package/src/fonts/Lora/Lora-VariableFont_wght.woff2 +0 -0
  398. package/src/fonts/PT_Sans/PTSans-Bold.woff2 +0 -0
  399. package/src/fonts/PT_Sans/PTSans-Regular.woff2 +0 -0
  400. package/src/plugins/core/RenderHTML.tsx +17 -0
  401. package/src/plugins/core/__test__/RenderHTML.test.ts +45 -0
  402. package/src/plugins/core/sanitize-html.ts +25 -18
  403. package/src/plugins/impl/DataTablePlugin.tsx +50 -2
  404. package/src/plugins/impl/SliderPlugin.tsx +1 -3
  405. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +120 -0
  406. package/src/plugins/impl/anywidget/model.ts +1 -2
  407. package/src/plugins/impl/chat/ChatPlugin.tsx +6 -3
  408. package/src/plugins/impl/matplotlib/matplotlib-renderer.ts +5 -2
  409. package/src/stories/cell.stories.tsx +8 -8
  410. package/src/stories/layout/vertical/one-column.stories.tsx +9 -8
  411. package/src/stories/log-viewer.stories.tsx +8 -8
  412. package/src/stories/variables.stories.tsx +2 -2
  413. package/src/utils/__tests__/createReducer.test.ts +2 -1
  414. package/src/utils/__tests__/download.test.tsx +21 -20
  415. package/src/utils/copy.ts +18 -5
  416. package/src/utils/createReducer.ts +46 -26
  417. package/src/utils/download.ts +4 -3
  418. package/src/utils/html-to-image.ts +6 -0
  419. package/src/utils/json/base64.ts +3 -3
  420. package/src/utils/traceback.ts +5 -3
  421. package/dist/_basePickBy-pTDW2_2A.js +0 -47
  422. package/dist/apl-lHFVoxx7.js +0 -4
  423. package/dist/architecture-7HQA4BMR-BmtmhGMc.js +0 -6
  424. package/dist/asciiarmor-DqCdZUHI.js +0 -4
  425. package/dist/asn1-DEcwtw-q.js +0 -4
  426. package/dist/brainfuck-Bro9Oz5x.js +0 -4
  427. package/dist/classDiagram-2ON5EDUG-DphiMW3Y.js +0 -30
  428. package/dist/classDiagram-v2-WZHVMYZB-BH1x5h4a.js +0 -30
  429. package/dist/clojure-B2uhdQPa.js +0 -4
  430. package/dist/cmake-B9WXyQcc.js +0 -4
  431. package/dist/cobol-CPD3EJfO.js +0 -4
  432. package/dist/coffeescript-KD9TnEnS.js +0 -4
  433. package/dist/commonlisp-DNEULz_Q.js +0 -4
  434. package/dist/crystal-DVPNgAPQ.js +0 -4
  435. package/dist/css-fq3a1AH1.js +0 -4
  436. package/dist/cypher-Dtzq0BP7.js +0 -4
  437. package/dist/d-DcZudIhJ.js +0 -4
  438. package/dist/diff-D9BPDC3o.js +0 -4
  439. package/dist/dist-B4MxkKHf.js +0 -8
  440. package/dist/dist-BYghZv6b.js +0 -5
  441. package/dist/dist-Be-uQhz5.js +0 -6
  442. package/dist/dist-CB_xf0ju.js +0 -5
  443. package/dist/dist-CK0qFAbF.js +0 -8
  444. package/dist/dist-CYEk-qrr.js +0 -8
  445. package/dist/dist-CmKoWpMk.js +0 -5
  446. package/dist/dist-D1nf4IQl.js +0 -5
  447. package/dist/dist-Df3AcKpt.js +0 -6
  448. package/dist/dist-DgaFHt_I.js +0 -5
  449. package/dist/dist-Dk10C3ui.js +0 -5
  450. package/dist/dist-DtyPVMHR.js +0 -5
  451. package/dist/dist-ko7WnHAO.js +0 -5
  452. package/dist/dist-of7gLRFK.js +0 -8
  453. package/dist/dtd-FhG-tVom.js +0 -4
  454. package/dist/dylan-HWpZOBPw.js +0 -4
  455. package/dist/ecl-B_rcje1I.js +0 -4
  456. package/dist/eiffel-oqHyHs6f.js +0 -4
  457. package/dist/elm-B62RQEds.js +0 -4
  458. package/dist/erlang-CjRjjA-B.js +0 -4
  459. package/dist/esm-BLobyqMs.js +0 -4387
  460. package/dist/factor-CGH_TnIV.js +0 -4
  461. package/dist/forth-5N06oHNp.js +0 -4
  462. package/dist/fortran-wZ-sNg3h.js +0 -4
  463. package/dist/gas-3H4_FaS8.js +0 -4
  464. package/dist/gherkin-PEA2uy50.js +0 -4
  465. package/dist/groovy-DZzbvCP1.js +0 -4
  466. package/dist/haskell-CExLTzho.js +0 -4
  467. package/dist/haxe-f3pVb8qU.js +0 -5
  468. package/dist/idl-BbWlJ0gk.js +0 -4
  469. package/dist/infoDiagram-HS3SLOUP-BXGbfBss.js +0 -30
  470. package/dist/javascript-eMOhp6Aq.js +0 -4
  471. package/dist/julia-C6w3Rvqb.js +0 -4
  472. package/dist/livescript-ChQl9lD-.js +0 -4
  473. package/dist/lua-CiDvI96j.js +0 -4
  474. package/dist/mathematica-ClVO4k7N.js +0 -4
  475. package/dist/mbox-BEI7DeUg.js +0 -4
  476. package/dist/mermaid-4DMBBIKO-PVrJfEpX.js +0 -6
  477. package/dist/mirc-DwidJ3iH.js +0 -4
  478. package/dist/mllike-Dspdy0xJ.js +0 -6
  479. package/dist/modelica-CIUejP-L.js +0 -4
  480. package/dist/mscgen-BWXU4Omp.js +0 -6
  481. package/dist/mumps-PHFFoPk5.js +0 -4
  482. package/dist/nsis-B7xooKLf.js +0 -4
  483. package/dist/ntriples-DnOgtCzG.js +0 -4
  484. package/dist/octave-Cn5kH_QT.js +0 -4
  485. package/dist/oz-DR-sROpu.js +0 -4
  486. package/dist/pascal-CPKK1zcS.js +0 -4
  487. package/dist/perl-D7FuFdyd.js +0 -4
  488. package/dist/pig-CEXnOAnI.js +0 -4
  489. package/dist/powershell-BKvWab7q.js +0 -4
  490. package/dist/properties-7jnK_vYx.js +0 -4
  491. package/dist/protobuf-4rslMjEN.js +0 -4
  492. package/dist/pug-BVwdEv4r.js +0 -4
  493. package/dist/puppet-iSHg_1Z2.js +0 -4
  494. package/dist/python-tK3wUCn0.js +0 -4
  495. package/dist/q-DP_Dcoox.js +0 -4
  496. package/dist/r-C32wHLYu.js +0 -4
  497. package/dist/react-vega-CFUuchds.js +0 -9
  498. package/dist/rpm-BbDBUfs9.js +0 -5
  499. package/dist/ruby-COfWUiIr.js +0 -4
  500. package/dist/sas-y_Hue2-X.js +0 -4
  501. package/dist/scheme-7jTCqHw8.js +0 -4
  502. package/dist/shell-DAqJWXDk.js +0 -4
  503. package/dist/sieve-EaqnbCO3.js +0 -4
  504. package/dist/smalltalk-DL03YKLJ.js +0 -4
  505. package/dist/sparql-DTA-tQ_q.js +0 -4
  506. package/dist/stateDiagram-v2-4FDKWEC3-BIeUs-Ed.js +0 -29
  507. package/dist/stex-KfRnSHzF.js +0 -4
  508. package/dist/stylus-CfjeFry_.js +0 -4
  509. package/dist/swift-Dl0RRDbH.js +0 -4
  510. package/dist/tcl-wv9O7fLZ.js +0 -4
  511. package/dist/textile-DzMRCBcV.js +0 -4
  512. package/dist/toml-CyIWqgbe.js +0 -4
  513. package/dist/troff-_huin_CY.js +0 -4
  514. package/dist/ttcn-BEiJuYYc.js +0 -4
  515. package/dist/ttcn-cfg-DB6Ksh67.js +0 -4
  516. package/dist/turtle-DzhzGEum.js +0 -4
  517. package/dist/useDeepCompareMemoize-BWUwfh37.js +0 -755
  518. package/dist/useIframeCapabilities-OQaMKgZl.js +0 -46
  519. package/dist/vb-CngKZQHu.js +0 -4
  520. package/dist/vbscript-BV_8nbeM.js +0 -4
  521. package/dist/velocity-IqE7qYKE.js +0 -4
  522. package/dist/verilog-xtyaWTnc.js +0 -4
  523. package/dist/vhdl-BaqXCtf3.js +0 -4
  524. package/dist/webidl-BDB8PTTO.js +0 -4
  525. package/dist/xquery-BIC-qj9Z.js +0 -4
  526. package/dist/yacas-ifv5tftd.js +0 -4
  527. package/dist/z80-B8zOMVNt.js +0 -4
  528. package/src/core/cells/effects.ts +0 -42
  529. package/src/fonts/Fira_Mono/FiraMono-Bold.ttf +0 -0
  530. package/src/fonts/Fira_Mono/FiraMono-Medium.ttf +0 -0
  531. package/src/fonts/Fira_Mono/FiraMono-Regular.ttf +0 -0
  532. package/src/fonts/Lora/Lora-Italic-VariableFont_wght.ttf +0 -0
  533. package/src/fonts/Lora/Lora-VariableFont_wght.ttf +0 -0
  534. package/src/fonts/Lora/static/Lora-Bold.ttf +0 -0
  535. package/src/fonts/Lora/static/Lora-BoldItalic.ttf +0 -0
  536. package/src/fonts/Lora/static/Lora-Italic.ttf +0 -0
  537. package/src/fonts/Lora/static/Lora-Medium.ttf +0 -0
  538. package/src/fonts/Lora/static/Lora-MediumItalic.ttf +0 -0
  539. package/src/fonts/Lora/static/Lora-Regular.ttf +0 -0
  540. package/src/fonts/Lora/static/Lora-SemiBold.ttf +0 -0
  541. package/src/fonts/Lora/static/Lora-SemiBoldItalic.ttf +0 -0
  542. package/src/fonts/PT_Sans/PTSans-Bold.ttf +0 -0
  543. package/src/fonts/PT_Sans/PTSans-BoldItalic.ttf +0 -0
  544. package/src/fonts/PT_Sans/PTSans-Italic.ttf +0 -0
  545. package/src/fonts/PT_Sans/PTSans-Regular.ttf +0 -0
  546. /package/dist/{_arrayReduce-BfFy684W.js → _arrayReduce-6BJAuN54.js} +0 -0
  547. /package/dist/{_baseSlice-BrVixxuc.js → _baseSlice-bwIVgwNq.js} +0 -0
  548. /package/dist/{_hasUnicode-C32WqUu7.js → _hasUnicode-DOFcQHhs.js} +0 -0
  549. /package/dist/{apl-DRxKiEot.js → apl-99A7dLQe.js} +0 -0
  550. /package/dist/{array-D-nrDupM.js → array-B-MVxRIF.js} +0 -0
  551. /package/dist/{asciiarmor-C8HoXFIm.js → asciiarmor-DLEhpFDx.js} +0 -0
  552. /package/dist/{asn1-9Bo0DYT-.js → asn1-CMrcTsT4.js} +0 -0
  553. /package/dist/{asterisk-BsiuGzWq.js → asterisk-BUZwqih-.js} +0 -0
  554. /package/dist/{brainfuck-Db8njC-p.js → brainfuck-ChPt5yBe.js} +0 -0
  555. /package/dist/{chunk-DR5Q36YT-D4q96vNV.js → chunk-DR5Q36YT-CP69aZS_.js} +0 -0
  556. /package/dist/{click-outside-container-CKfwEZqH.js → click-outside-container-DB_bTXRG.js} +0 -0
  557. /package/dist/{clike-CFhUNtI5.js → clike-CE0fXfM_.js} +0 -0
  558. /package/dist/{clojure-CX7oovsp.js → clojure-QkBEMU-g.js} +0 -0
  559. /package/dist/{clsx-D2KVTYnW.js → clsx-yW_RAw0K.js} +0 -0
  560. /package/dist/{cmake-C29AR2kk.js → cmake-CU1jX7Mo.js} +0 -0
  561. /package/dist/{cobol-CNkuRW9i.js → cobol-DMOKzzky.js} +0 -0
  562. /package/dist/{coffeescript-BJAbfGam.js → coffeescript-DjnjLyfk.js} +0 -0
  563. /package/dist/{colors-6nB_pSln.js → colors-Cn2p_FA3.js} +0 -0
  564. /package/dist/{common-keywords-BAkLFdud.js → common-keywords-hbLeU7VU.js} +0 -0
  565. /package/dist/{commonlisp-BTNhj2l9.js → commonlisp-CYd9iOSe.js} +0 -0
  566. /package/dist/{crystal-CZc0nIm9.js → crystal-Dy55yoYG.js} +0 -0
  567. /package/dist/{css-L2-0OTXc.js → css-CNU8w3HJ.js} +0 -0
  568. /package/dist/{cypher-Dnc6MXl0.js → cypher-q47DGzK7.js} +0 -0
  569. /package/dist/{cytoscape.esm-BXzSsA6N.js → cytoscape.esm-WbbDoCfu.js} +0 -0
  570. /package/dist/{d-C6X9iIga.js → d-jEkaLvxX.js} +0 -0
  571. /package/dist/{defaultLocale-CfQ4kBaV.js → defaultLocale-Dr6Bz4JK.js} +0 -0
  572. /package/dist/{defaultLocale-Bklbu-Tp.js → defaultLocale-I3_GfJ4U.js} +0 -0
  573. /package/dist/{diff-ZzKinYqY.js → diff-vb2-unFN.js} +0 -0
  574. /package/dist/{dist-Bymy0kEH.js → dist-C89sHDXk.js} +0 -0
  575. /package/dist/{dtd-CytEpkAo.js → dtd-C9kR-bXa.js} +0 -0
  576. /package/dist/{duckdb-keywords-C1WxmSfG.js → duckdb-keywords-CZ_ZTscu.js} +0 -0
  577. /package/dist/{dylan-CZByFBEQ.js → dylan-BLckrK-V.js} +0 -0
  578. /package/dist/{ebnf-BF2FOt-m.js → ebnf-WEXPLEWb.js} +0 -0
  579. /package/dist/{ecl-Cp7L1F5B.js → ecl-CEsf6XVg.js} +0 -0
  580. /package/dist/{eiffel-C66yjnFL.js → eiffel-2KGZNzx6.js} +0 -0
  581. /package/dist/{elm-DtHo-73e.js → elm-D2s3K5wF.js} +0 -0
  582. /package/dist/{emotion-is-prop-valid.esm-DtW2o230.js → emotion-is-prop-valid.esm-CflmeIys.js} +0 -0
  583. /package/dist/{erlang-C_sj44mF.js → erlang-0PMFOndk.js} +0 -0
  584. /package/dist/{esm-BWftfC-A.js → esm-Bb_hbWan.js} +0 -0
  585. /package/dist/{fcl-BhLcvRo_.js → fcl-B_Gv5Jfx.js} +0 -0
  586. /package/dist/{forth-CIDHh56T.js → forth-DG89iUsu.js} +0 -0
  587. /package/dist/{fortran-BQrDVXRU.js → fortran-ytKsAVvu.js} +0 -0
  588. /package/dist/{gas-D4HQPB0Q.js → gas-Cg2Fm0N2.js} +0 -0
  589. /package/dist/{gherkin-UB2gJHdT.js → gherkin-B87FEnZ-.js} +0 -0
  590. /package/dist/{groovy-DVz6jkOx.js → groovy-Dcs08AWD.js} +0 -0
  591. /package/dist/{haskell-CpUdAPCz.js → haskell-cwkOuhx6.js} +0 -0
  592. /package/dist/{haxe-DCV5_cqD.js → haxe-DWEo4q10.js} +0 -0
  593. /package/dist/{http-C_TDb8VX.js → http-Dc2fv19V.js} +0 -0
  594. /package/dist/{idl-D7WCIgHw.js → idl-WWQwDcRV.js} +0 -0
  595. /package/dist/{init-Ci8VD8ZH.js → init-D-g0ONX1.js} +0 -0
  596. /package/dist/{invariant-D9QLJ4SZ.js → invariant-Ctm_8TNZ.js} +0 -0
  597. /package/dist/{isArrayLikeObject-BrYl-ETg.js → isArrayLikeObject-C-hFPChh.js} +0 -0
  598. /package/dist/{javascript-B2Rn0Lmd.js → javascript-BeR74dxD.js} +0 -0
  599. /package/dist/{jsx-runtime-CTBg5pdT.js → jsx-runtime-9hcJiI23.js} +0 -0
  600. /package/dist/{julia-ApprtEaw.js → julia-UlvCUYGL.js} +0 -0
  601. /package/dist/{katex-Bk_FvVSR.js → katex-B7pMJpE0.js} +0 -0
  602. /package/dist/{livescript-BMLIlM7C.js → livescript-GPmFcmYV.js} +0 -0
  603. /package/dist/{lua-DdDaW3tC.js → lua-DYoT_0zM.js} +0 -0
  604. /package/dist/{main-Tj_-QTyF.js → main-sxFlUO_N.js} +0 -0
  605. /package/dist/{math-HUZifhTs.js → math-BYK36kWZ.js} +0 -0
  606. /package/dist/{mathematica-PnNN7c2Z.js → mathematica-DSFIQlbG.js} +0 -0
  607. /package/dist/{mbox-B84OtHBK.js → mbox-ej8lFMdL.js} +0 -0
  608. /package/dist/{mirc-BVWXJxIq.js → mirc-CAdIdvHQ.js} +0 -0
  609. /package/dist/{mllike-BawXWupH.js → mllike-CjTB1lHF.js} +0 -0
  610. /package/dist/{modelica-C8-X4Hf_.js → modelica-BB68FYMa.js} +0 -0
  611. /package/dist/{mscgen-BOM6dDj8.js → mscgen-BkbzgGGI.js} +0 -0
  612. /package/dist/{mumps-DQOY8n05.js → mumps-Cu-28E9F.js} +0 -0
  613. /package/dist/{nginx-DkMgA__9.js → nginx-ComVAAGN.js} +0 -0
  614. /package/dist/{node-sql-parser-D53LM_7b.js → node-sql-parser-DNGGJ-Rw.js} +0 -0
  615. /package/dist/{ntriples-DU8VrXdW.js → ntriples-D9cQiZxZ.js} +0 -0
  616. /package/dist/{octave-BzTIBsQ8.js → octave-BvtAnPX0.js} +0 -0
  617. /package/dist/{oz-DKFcZsoi.js → oz-COaVHk2E.js} +0 -0
  618. /package/dist/{pascal-DHBZ15pT.js → pascal-BFpqVD2x.js} +0 -0
  619. /package/dist/{path-BVI7RNUv.js → path-Du6n3sOU.js} +0 -0
  620. /package/dist/{perl-75NMI3w0.js → perl-DaiORxHP.js} +0 -0
  621. /package/dist/{pig-B-HY1fo_.js → pig-DFzRhmsF.js} +0 -0
  622. /package/dist/{powershell-DEH22U53.js → powershell-BG2LQNKN.js} +0 -0
  623. /package/dist/{properties-B1MzBoJC.js → properties-CqJJR5QY.js} +0 -0
  624. /package/dist/{protobuf-Dr14KV0p.js → protobuf-WwDYV1yY.js} +0 -0
  625. /package/dist/{puppet-C4z38l7v.js → puppet-QNY3w_uN.js} +0 -0
  626. /package/dist/{purify.es-DGenX2XH.js → purify.es-Co_dANLh.js} +0 -0
  627. /package/dist/{python-D2L7Nknt.js → python-4QrQ3Ugi.js} +0 -0
  628. /package/dist/{q-PxipHfgS.js → q-DhwXuxE2.js} +0 -0
  629. /package/dist/{r-CEMMu_Tf.js → r-Df-nkR25.js} +0 -0
  630. /package/dist/{range-BToS7LsA.js → range-Bn3no95s.js} +0 -0
  631. /package/dist/{react-dom-CqtLRVZP.js → react-dom-BKwCWYPW.js} +0 -0
  632. /package/dist/{rpm-D3xyahkR.js → rpm-Cokue07s.js} +0 -0
  633. /package/dist/{ruby-DwEkwdiu.js → ruby-DrYcL3qF.js} +0 -0
  634. /package/dist/{sas-L1W0BRft.js → sas-CoiPirA5.js} +0 -0
  635. /package/dist/{scheme-CTybTrX0.js → scheme-CwFLjzHv.js} +0 -0
  636. /package/dist/{shell-BSx3LZnu.js → shell-BFV-R24I.js} +0 -0
  637. /package/dist/{sieve-BjUfbv-6.js → sieve-CxwXF5T9.js} +0 -0
  638. /package/dist/{simple-mode-IPZGFbI6.js → simple-mode-DTaJtKPt.js} +0 -0
  639. /package/dist/{smalltalk-BlzuYrMv.js → smalltalk-QivVOCtX.js} +0 -0
  640. /package/dist/{solr-Cj_9RM4d.js → solr-DTkyqJ-Z.js} +0 -0
  641. /package/dist/{sparql-BXKjQ0cK.js → sparql-nKsFk8j7.js} +0 -0
  642. /package/dist/{spreadsheet-CifI10GO.js → spreadsheet-CER0raqY.js} +0 -0
  643. /package/dist/{sql-B0bFyY1c.js → sql-ByOoEONQ.js} +0 -0
  644. /package/dist/{stex-BIsgBmK4.js → stex-7yEw16Ww.js} +0 -0
  645. /package/dist/{stylus-CqrLLVnG.js → stylus-BLKQAycn.js} +0 -0
  646. /package/dist/{swift-DIqvj3_G.js → swift-CJoKqiKj.js} +0 -0
  647. /package/dist/{tcl-B8bOIGVK.js → tcl-YTeYFNUc.js} +0 -0
  648. /package/dist/{textile-DZsjavD_.js → textile-C6rKQqMQ.js} +0 -0
  649. /package/dist/{tiddlywiki-BbGdvEjx.js → tiddlywiki-Cr9xyOY1.js} +0 -0
  650. /package/dist/{tiki-BYesmRDo.js → tiki-D5JONyfZ.js} +0 -0
  651. /package/dist/{timer-CPsmIOdm.js → timer-D7JVdX9U.js} +0 -0
  652. /package/dist/{toml-Uc7m08nl.js → toml-DxlPGbRy.js} +0 -0
  653. /package/dist/{treemap-DMn4tIJ7.js → treemap-qFGzn7xk.js} +0 -0
  654. /package/dist/{troff-GEl5wcXR.js → troff-DFCfH7Ku.js} +0 -0
  655. /package/dist/{ttcn-pr4FDOLT.js → ttcn-DAW-ERVP.js} +0 -0
  656. /package/dist/{ttcn-cfg-dZQ_fWTH.js → ttcn-cfg-CpJ8b7EN.js} +0 -0
  657. /package/dist/{turtle-TPRDOknA.js → turtle-BneV2f8L.js} +0 -0
  658. /package/dist/{vb-BJUAeTYr.js → vb-D973Vxxh.js} +0 -0
  659. /package/dist/{vbscript-CcJ6Z3ic.js → vbscript-Dckaq3YO.js} +0 -0
  660. /package/dist/{velocity-pq4ZMzU3.js → velocity-DKty-GUC.js} +0 -0
  661. /package/dist/{verilog-timMNjHt.js → verilog-aNaK_biA.js} +0 -0
  662. /package/dist/{vhdl-DYFbVKNm.js → vhdl-CQuehnQy.js} +0 -0
  663. /package/dist/{webidl-pue9oqnb.js → webidl-Bhg8vaMr.js} +0 -0
  664. /package/dist/{xquery-DeItGynK.js → xquery-D2q16GaM.js} +0 -0
  665. /package/dist/{yacas-By2Qrjba.js → yacas-DHGOHnNa.js} +0 -0
  666. /package/dist/{z80-C7iLsyPC.js → z80-BPhTmO22.js} +0 -0
@@ -222,6 +222,75 @@ describe("generateColumns", () => {
222
222
  expect(columns[1].meta?.dataType).toBe("number");
223
223
  });
224
224
 
225
+ it("should auto right-align numeric columns", () => {
226
+ const columns = generateColumns({
227
+ rowHeaders: [],
228
+ selection: null,
229
+ fieldTypes,
230
+ });
231
+
232
+ // "age" is a number column — should auto right-align
233
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
234
+ const cell = (columns[1].cell as any)({
235
+ column: {
236
+ columnDef: columns[1],
237
+ },
238
+ renderValue: () => 25,
239
+ getValue: () => 25,
240
+ });
241
+ expect(cell?.props.className).toContain("text-right");
242
+
243
+ // "name" is a string column — should remain left-aligned
244
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
245
+ const nameCell = (columns[0].cell as any)({
246
+ column: {
247
+ columnDef: columns[0],
248
+ },
249
+ renderValue: () => "John",
250
+ getValue: () => "John",
251
+ });
252
+ expect(nameCell?.props.className).not.toContain("text-right");
253
+ });
254
+
255
+ it("should respect explicit textJustifyColumns over auto alignment", () => {
256
+ const columns = generateColumns({
257
+ rowHeaders: [],
258
+ selection: null,
259
+ fieldTypes,
260
+ textJustifyColumns: { age: "left" },
261
+ });
262
+
263
+ // "age" is numeric but explicitly set to left
264
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
265
+ const cell = (columns[1].cell as any)({
266
+ column: {
267
+ columnDef: columns[1],
268
+ },
269
+ renderValue: () => 25,
270
+ getValue: () => 25,
271
+ });
272
+ expect(cell?.props.className).not.toContain("text-right");
273
+ });
274
+
275
+ it("should set minFractionDigits from fractionDigitsByColumn", () => {
276
+ const numericFieldTypes: FieldTypesWithExternalType = [
277
+ ["price", ["number", "float64"]],
278
+ ["count", ["integer", "int64"]],
279
+ ];
280
+
281
+ const columns = generateColumns({
282
+ rowHeaders: [],
283
+ selection: null,
284
+ fieldTypes: numericFieldTypes,
285
+ fractionDigitsByColumn: { price: 2 },
286
+ });
287
+
288
+ // price has 2 fraction digits
289
+ expect(columns[0].meta?.minFractionDigits).toBe(2);
290
+ // count not in fractionDigitsByColumn
291
+ expect(columns[1].meta?.minFractionDigits).toBeUndefined();
292
+ });
293
+
225
294
  it("should handle text justification and wrapping", () => {
226
295
  const columns = generateColumns({
227
296
  rowHeaders: [],
@@ -572,6 +641,75 @@ describe("LocaleNumber", () => {
572
641
  );
573
642
  expect(container.textContent).toMatchInlineSnapshot(`"10,000,000,000"`);
574
643
  });
644
+
645
+ it("should pad decimals with minFractionDigits", () => {
646
+ const { container } = render(
647
+ <I18nProvider locale="en-US">
648
+ <LocaleNumber value={42} minFractionDigits={2} />
649
+ </I18nProvider>,
650
+ );
651
+ expect(container.textContent).toMatchInlineSnapshot(`"42.00"`);
652
+ });
653
+
654
+ it("should pad to minFractionDigits for numbers with fewer decimals", () => {
655
+ const { container } = render(
656
+ <I18nProvider locale="en-US">
657
+ <LocaleNumber value={1234.5} minFractionDigits={3} />
658
+ </I18nProvider>,
659
+ );
660
+ expect(container.textContent).toMatchInlineSnapshot(`"1,234.500"`);
661
+ });
662
+
663
+ it("should not truncate decimals beyond minFractionDigits", () => {
664
+ const { container } = render(
665
+ <I18nProvider locale="en-US">
666
+ <LocaleNumber value={1.234_56} minFractionDigits={2} />
667
+ </I18nProvider>,
668
+ );
669
+ expect(container.textContent).toMatchInlineSnapshot(`"1.23456"`);
670
+ });
671
+ });
672
+
673
+ describe("renderCellValue with boolean values", () => {
674
+ const createMockColumn = () =>
675
+ ({
676
+ id: "active",
677
+ columnDef: {
678
+ meta: {
679
+ dataType: "boolean" as const,
680
+ dtype: "bool",
681
+ },
682
+ },
683
+ getColumnFormatting: () => undefined,
684
+ getColumnWrapping: () => undefined,
685
+ applyColumnFormatting: (value: unknown) => value,
686
+ }) as unknown as Column<unknown>;
687
+
688
+ it("should render true as True", () => {
689
+ const mockColumn = createMockColumn();
690
+ const result = renderCellValue({
691
+ column: mockColumn,
692
+ renderValue: () => true,
693
+ getValue: () => true,
694
+ selectCell: undefined,
695
+ cellStyles: "",
696
+ });
697
+ const { container } = render(result);
698
+ expect(container.textContent).toBe("True");
699
+ });
700
+
701
+ it("should render false as False", () => {
702
+ const mockColumn = createMockColumn();
703
+ const result = renderCellValue({
704
+ column: mockColumn,
705
+ renderValue: () => false,
706
+ getValue: () => false,
707
+ selectCell: undefined,
708
+ cellStyles: "",
709
+ });
710
+ const { container } = render(result);
711
+ expect(container.textContent).toBe("False");
712
+ });
575
713
  });
576
714
 
577
715
  describe("renderCellValue with datetime values", () => {
@@ -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>