@marimo-team/islands 0.21.2-dev63 → 0.21.2-dev69

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 (425) hide show
  1. package/dist/{ConnectedDataExplorerComponent-DkSulho5.js → ConnectedDataExplorerComponent-CLLlotD4.js} +1 -1
  2. package/dist/{any-language-editor-B_YcSEs7.js → any-language-editor-BBegsg-m.js} +10 -10
  3. package/dist/apl-e1B5LPEL.js +4 -0
  4. package/dist/{arc-DfkSnvZm.js → arc-CHF8PiiF.js} +2 -2
  5. package/dist/{architecture-7HQA4BMR-BVuGBj38.js → architecture-7HQA4BMR-KeUc82D1.js} +1 -1
  6. package/dist/{architectureDiagram-VXUJARFQ-CTttozWW.js → architectureDiagram-VXUJARFQ-CIl7H_7A.js} +16 -16
  7. package/dist/asciiarmor-B-gwgesP.js +4 -0
  8. package/dist/asn1-DF2ckRB4.js +4 -0
  9. package/dist/{blockDiagram-VD42YOAC-DPCYZecD.js → blockDiagram-VD42YOAC-Bxg4bo7H.js} +11 -11
  10. package/dist/brainfuck-4G-7_gq_.js +4 -0
  11. package/dist/{c4Diagram-YG6GDRKO-BAE3Buci.js → c4Diagram-YG6GDRKO-k4TEDUb8.js} +5 -5
  12. package/dist/{channel-DApRnm6b.js → channel-CCR8wXOx.js} +1 -1
  13. package/dist/{chat-ui-DIuq4Mn6.js → chat-ui-D4ay_SFE.js} +2 -3
  14. package/dist/{chunk-4BX2VUAB-BtdcCA7H.js → chunk-4BX2VUAB-BwfrWBqN.js} +1 -1
  15. package/dist/{chunk-55IACEB6-hJraQgx2.js → chunk-55IACEB6-D8THf2mi.js} +1 -1
  16. package/dist/{chunk-5FQGJX7Z-DwBOYBMa.js → chunk-5FQGJX7Z-Cz2QbNIw.js} +1502 -2844
  17. package/dist/{chunk-ABZYJK2D-DFnIGLNd.js → chunk-ABZYJK2D-NPoevJcI.js} +2 -2
  18. package/dist/{chunk-ATLVNIR6-4HgRPLgX.js → chunk-ATLVNIR6-DAhC1FCG.js} +2 -2
  19. package/dist/{chunk-B4BG7PRW-Bp8FDZTb.js → chunk-B4BG7PRW-BDmytgmO.js} +7 -7
  20. package/dist/{chunk-CVBHYZKI-B_c5YBcW.js → chunk-CVBHYZKI-B6xhgaBd.js} +1 -1
  21. package/dist/{chunk-DI55MBZ5-CtD9lSpd.js → chunk-DI55MBZ5-C6iNEV8U.js} +6 -6
  22. package/dist/{chunk-EXTU4WIE-QrN2mPtn.js → chunk-EXTU4WIE-BtA6WdD4.js} +2 -2
  23. package/dist/{chunk-FMBD7UC4-B34QcQBj.js → chunk-FMBD7UC4-CHdus51S.js} +1 -1
  24. package/dist/{chunk-HN2XXSSU-E3n-Ys7Z.js → chunk-HN2XXSSU-2Vfbq-kU.js} +1 -1
  25. package/dist/{chunk-JA3XYJ7Z-B9-EWihm.js → chunk-JA3XYJ7Z-BeXqAsc9.js} +3 -3
  26. package/dist/{chunk-JZLCHNYA-CIx__-bR.js → chunk-JZLCHNYA-ibE7xTEx.js} +6 -6
  27. package/dist/{chunk-MI3HLSF2-CUYEasXO.js → chunk-MI3HLSF2-Do0-KRc0.js} +1 -1
  28. package/dist/{chunk-N4CR4FBY-Cl9KH_W1.js → chunk-N4CR4FBY-CHAcubAf.js} +7 -7
  29. package/dist/{chunk-QN33PNHL-DV6ID85v.js → chunk-QN33PNHL-CDWJY_kT.js} +2 -2
  30. package/dist/{chunk-QXUST7PY-CaiIvoL5.js → chunk-QXUST7PY-CV37xRZd.js} +10 -10
  31. package/dist/{chunk-QZHKN3VN-CBBP4d0M.js → chunk-QZHKN3VN-B_Mdb8GC.js} +1 -1
  32. package/dist/{chunk-S3R3BYOJ-CQOhwRBS.js → chunk-S3R3BYOJ-CGlk8NH-.js} +4 -4
  33. package/dist/{chunk-TZMSLE5B-BkqhN89K.js → chunk-TZMSLE5B-DfY6C3FB.js} +3 -3
  34. package/dist/classDiagram-2ON5EDUG-DbWOiPgs.js +30 -0
  35. package/dist/classDiagram-v2-WZHVMYZB-COnXBrRA.js +30 -0
  36. package/dist/{clike-jRoJKo3I.js → clike-7lgyEYRk.js} +1 -1
  37. package/dist/clojure-CUybM11R.js +4 -0
  38. package/dist/cmake-BPjGcuDL.js +4 -0
  39. package/dist/cobol-BETk_nb6.js +4 -0
  40. package/dist/{code-block-37QAKDTI-Dae3xvB0.js → code-block-37QAKDTI-DW3JC11U.js} +1 -1
  41. package/dist/coffeescript-CManZxXL.js +4 -0
  42. package/dist/commonlisp-DWkn7GW8.js +4 -0
  43. package/dist/{cose-bilkent-S5V4N54A-DvPVjKwP.js → cose-bilkent-S5V4N54A-DXHZkJKX.js} +2 -2
  44. package/dist/crystal-CCbg5EUH.js +4 -0
  45. package/dist/css-By8eo-XS.js +4 -0
  46. package/dist/cypher-DwfHg3nP.js +4 -0
  47. package/dist/d-Brs1wNbw.js +4 -0
  48. package/dist/{dagre-6UL2VRFP-ABg-WzQ3.js → dagre-6UL2VRFP-B8UW0fXE.js} +10 -10
  49. package/dist/{data-grid-overlay-editor-eVOR1Bqn.js → data-grid-overlay-editor-CpL5Zajy.js} +2 -2
  50. package/dist/{diagram-PSM6KHXK-D6zP_W1d.js → diagram-PSM6KHXK-DGD-j1bM.js} +18 -18
  51. package/dist/{diagram-QEK2KX5R-CuHhFHzr.js → diagram-QEK2KX5R-DgsT6ZW4.js} +14 -14
  52. package/dist/{diagram-S2PKOQOG-B2AqkaRk.js → diagram-S2PKOQOG-CDh5Ij8z.js} +14 -14
  53. package/dist/diff-DJIRmJ1g.js +4 -0
  54. package/dist/dist-BHGf2Zey.js +5 -0
  55. package/dist/dist-BImOGJZM.js +5 -0
  56. package/dist/dist-BbJfmCHJ.js +5 -0
  57. package/dist/{dist-Cxn9man7.js → dist-C0v-nFs_.js} +1 -1
  58. package/dist/{dist-CZ4qwYvJ.js → dist-C9TDg2aq.js} +1 -1
  59. package/dist/{dist-BwZY8Lt9.js → dist-CKVkWFcB.js} +1 -1
  60. package/dist/dist-CN4RKgNR.js +5 -0
  61. package/dist/{dist-CXayp1fR.js → dist-CVOkf_3P.js} +1 -1
  62. package/dist/dist-CwEBZkrQ.js +550 -0
  63. package/dist/dist-D6YTv0Kj.js +5 -0
  64. package/dist/{dist-DUTgSV0a.js → dist-D9vawryf.js} +1 -1
  65. package/dist/{dist-DcoiQ51H.js → dist-DasJgTvL.js} +1 -1
  66. package/dist/{dist-Don9K0di.js → dist-Ui51qXMz.js} +1 -1
  67. package/dist/dist-d2msfN-B.js +5 -0
  68. package/dist/{dist-DD2s3ocF.js → dist-uR-o9IVx.js} +1 -1
  69. package/dist/{dockerfile-Bhphd7by.js → dockerfile-DG6A2DdH.js} +1 -1
  70. package/dist/dtd-Dyiazv4N.js +4 -0
  71. package/dist/dylan-D8Fcw7NA.js +4 -0
  72. package/dist/ecl-CjKp8Vii.js +4 -0
  73. package/dist/eiffel-K9ViOX5r.js +4 -0
  74. package/dist/elm-B5NVtRco.js +4 -0
  75. package/dist/{erDiagram-Q2GNP2WA-DEGS1PP7.js → erDiagram-Q2GNP2WA-CGK0SUdu.js} +14 -14
  76. package/dist/erlang-BnLzgk7R.js +4 -0
  77. package/dist/{esm-dotk-2cB.js → esm-CCD9xN05.js} +96 -96
  78. package/dist/{factor-DNC3EI9I.js → factor-Bq2mGIHt.js} +1 -1
  79. package/dist/factor-C7f9Jz5R.js +4 -0
  80. package/dist/{flowDiagram-NV44I4VS-_NtC_MIa.js → flowDiagram-NV44I4VS-PjhviPI_.js} +16 -16
  81. package/dist/forth-rGM8jLao.js +4 -0
  82. package/dist/fortran-B3acSe0i.js +4 -0
  83. package/dist/{ganttDiagram-JELNMOA3-0iqJp9II.js → ganttDiagram-JELNMOA3-CUVtQqgT.js} +7 -7
  84. package/dist/gas-Bb1Vmv_N.js +4 -0
  85. package/dist/gherkin-C9Lyidgd.js +4 -0
  86. package/dist/{gitGraph-G5XIXVHT-D5dIC-Yj.js → gitGraph-G5XIXVHT-B6b-Z3mr.js} +1 -1
  87. package/dist/{gitGraphDiagram-V2S2FVAM-DmWsIkI5.js → gitGraphDiagram-V2S2FVAM-CNdrlK1I.js} +14 -14
  88. package/dist/{glide-data-editor-BkO3-23t.js → glide-data-editor-DQEuWuu_.js} +4 -4
  89. package/dist/groovy-DQk6XcGH.js +4 -0
  90. package/dist/haskell-mV0Vw9gv.js +4 -0
  91. package/dist/haxe-DqxN89zH.js +5 -0
  92. package/dist/idl-ya8W561J.js +4 -0
  93. package/dist/{info-VBDWY6EO-DTO3vFfS.js → info-VBDWY6EO-DfFl0Z8H.js} +1 -1
  94. package/dist/{infoDiagram-HS3SLOUP-UrOFax1c.js → infoDiagram-HS3SLOUP-DGimKb9k.js} +12 -12
  95. package/dist/javascript-CgqgptVu.js +4 -0
  96. package/dist/{journeyDiagram-XKPGCS4Q-m64vZmxT.js → journeyDiagram-XKPGCS4Q-CyoESVVb.js} +6 -6
  97. package/dist/julia-CFQ-HusI.js +4 -0
  98. package/dist/{kanban-definition-3W4ZIXB7-ZLe0Kp41.js → kanban-definition-3W4ZIXB7-Doc2YV80.js} +11 -11
  99. package/dist/{katex-DAGMFHph.js → katex-qPqrBHZ8.js} +1 -1
  100. package/dist/{line-C5s_12ee.js → line-BWRi3U3S.js} +3 -3
  101. package/dist/{linear-Cii2AMNm.js → linear-DZ8_CGCd.js} +2 -2
  102. package/dist/livescript-D__3TmDo.js +4 -0
  103. package/dist/lua-Bytcgj_W.js +4 -0
  104. package/dist/main.js +3457 -3422
  105. package/dist/mathematica-DJhvVKvl.js +4 -0
  106. package/dist/mbox-IGHPCjfR.js +4 -0
  107. package/dist/{mermaid-4DMBBIKO-0oQV6SKJ.js → mermaid-4DMBBIKO-DQdI9xDR.js} +1 -1
  108. package/dist/{mermaid-CP8gAOdP.js → mermaid-CzWpf81s.js} +41 -41
  109. package/dist/{mermaid-parser.core-Ldbqm2U2.js → mermaid-parser.core-CrrqF1ZZ.js} +7 -7
  110. package/dist/{mhchem-BGHMIfq6.js → mhchem-BwoRNwg_.js} +1 -1
  111. package/dist/micromark-factory-space-DQCQsiYz.js +1341 -0
  112. package/dist/{mindmap-definition-VGOIOE7T-BkJfqjP5.js → mindmap-definition-VGOIOE7T-L2ybicpO.js} +13 -13
  113. package/dist/mirc-tcwvVugm.js +4 -0
  114. package/dist/mllike-Dx91i62r.js +6 -0
  115. package/dist/modelica-_SRt-yU5.js +4 -0
  116. package/dist/mscgen-GZrGS9gt.js +6 -0
  117. package/dist/mumps-Cv3ygyod.js +4 -0
  118. package/dist/nsis-BU7GeGbI.js +4 -0
  119. package/dist/{nsis-CROWDZ9a.js → nsis-i9_sgigf.js} +1 -1
  120. package/dist/ntriples-CL-FCYXb.js +4 -0
  121. package/dist/{number-overlay-editor-B5y1rc-k.js → number-overlay-editor-D2Y0RpcH.js} +1 -1
  122. package/dist/octave-Dc6_3DIu.js +4 -0
  123. package/dist/{ordinal-Bz8O-XbW.js → ordinal-B4zYMadD.js} +1 -1
  124. package/dist/oz-DpUAJCXf.js +4 -0
  125. package/dist/{packet-DYOGHKS2-BWNLyWLh.js → packet-DYOGHKS2-DIf3Dotq.js} +1 -1
  126. package/dist/pascal-B17mncXs.js +4 -0
  127. package/dist/perl-BTpK97q9.js +4 -0
  128. package/dist/{pie-VRWISCQL-BNm0ZeOM.js → pie-VRWISCQL-Dj_gvPcD.js} +1 -1
  129. package/dist/{pieDiagram-ADFJNKIX-CLJoguev.js → pieDiagram-ADFJNKIX-x5w7q6Yp.js} +19 -19
  130. package/dist/pig-CFb638Ap.js +4 -0
  131. package/dist/powershell-Cxo-_2A5.js +4 -0
  132. package/dist/{process-output-BzDV74px.js → process-output-Cv8vQ4At.js} +4238 -4809
  133. package/dist/properties-BPgT1xTB.js +4 -0
  134. package/dist/protobuf-BgHBaIIK.js +4 -0
  135. package/dist/pug-25-oS0SG.js +4 -0
  136. package/dist/{pug-CSWat1rd.js → pug-BhE2JRSg.js} +1 -1
  137. package/dist/puppet-DarIr20S.js +4 -0
  138. package/dist/python-BqmOsBsi.js +4 -0
  139. package/dist/q-D3QJCTup.js +4 -0
  140. package/dist/{quadrantDiagram-AYHSOK5B-Bym-JxLx.js → quadrantDiagram-AYHSOK5B-D5j_5qG_.js} +3 -3
  141. package/dist/r-Cz_yBX4z.js +4 -0
  142. package/dist/{radar-ZZBFDIW7-CEhz-hUS.js → radar-ZZBFDIW7-DXDVq3gi.js} +1 -1
  143. package/dist/{react-vega-DZOOS-W4.js → react-vega-BBUxfZoV.js} +13 -13
  144. package/dist/{react-vega-CY82WAG3.js → react-vega-Cs3lfDw8.js} +1 -1
  145. package/dist/{requirementDiagram-UZGBJVZJ-CD_V4itb.js → requirementDiagram-UZGBJVZJ-3SoJH6yP.js} +13 -13
  146. package/dist/rpm-DGOtYwAI.js +5 -0
  147. package/dist/ruby-DBZu4rPc.js +4 -0
  148. package/dist/{sankeyDiagram-TZEHDZUN-CW3Bo_62.js → sankeyDiagram-TZEHDZUN-fGkFNe5q.js} +4 -4
  149. package/dist/sas-Dd1D9qTq.js +4 -0
  150. package/dist/scheme-BmDjvTHX.js +4 -0
  151. package/dist/{sequenceDiagram-WL72ISMW-BfAHIhk3.js → sequenceDiagram-WL72ISMW-BE2uTn_d.js} +7 -7
  152. package/dist/shell-BL8zFSaj.js +4 -0
  153. package/dist/sieve-BAx2WqUP.js +4 -0
  154. package/dist/smalltalk-CYRzF7VV.js +4 -0
  155. package/dist/sparql-YWaDRO4A.js +4 -0
  156. package/dist/{src-Bf2iLOlr.js → src-BY0BGg6V.js} +1 -1
  157. package/dist/{stateDiagram-FKZM4ZOC-CCfvnS3_.js → stateDiagram-FKZM4ZOC-Dmk9IAOx.js} +16 -16
  158. package/dist/stateDiagram-v2-4FDKWEC3-BGF0BvU6.js +29 -0
  159. package/dist/{step-CWipAYTY.js → step-DGAGWg3y.js} +1 -1
  160. package/dist/stylus-lYsyLFc1.js +4 -0
  161. package/dist/swift-ClQz9z1n.js +4 -0
  162. package/dist/tcl-B3jhsfqY.js +4 -0
  163. package/dist/textile-Cb1Dw7Aq.js +4 -0
  164. package/dist/{time-B31vFOEZ.js → time-C_pvjzP0.js} +2 -2
  165. package/dist/{timeline-definition-IT6M3QCI-BwyDPLz1.js → timeline-definition-IT6M3QCI-CvB4yGrN.js} +3 -3
  166. package/dist/toml-nHZhetdO.js +4 -0
  167. package/dist/{treemap-GDKQZRPO-BdsKcX7e.js → treemap-GDKQZRPO-CIG6WH-x.js} +1 -1
  168. package/dist/troff-DuJAGWKH.js +4 -0
  169. package/dist/ttcn-BxrcwP21.js +4 -0
  170. package/dist/ttcn-cfg-BAg_9dcc.js +4 -0
  171. package/dist/turtle-zCq949as.js +4 -0
  172. package/dist/vb-De5hElus.js +4 -0
  173. package/dist/vbscript-Cypcpv4F.js +4 -0
  174. package/dist/{vega-component-DX1QtRQE.js → vega-component-BQNW4qnB.js} +1 -1
  175. package/dist/velocity-Di7l-yhe.js +4 -0
  176. package/dist/verilog-Bzi-S3g2.js +4 -0
  177. package/dist/vhdl-B0ZZITaW.js +4 -0
  178. package/dist/webidl-0sviiRcN.js +4 -0
  179. package/dist/xquery-B4qMVWaB.js +4 -0
  180. package/dist/{xychartDiagram-PRI3JC2R-D-Of-r2y.js → xychartDiagram-PRI3JC2R-BbEInSqY.js} +10 -10
  181. package/dist/yacas-Jt25Fuv8.js +4 -0
  182. package/dist/z80-CrcbYzmp.js +4 -0
  183. package/package.json +1 -1
  184. package/src/__mocks__/requests.ts +1 -0
  185. package/src/components/data-table/__tests__/columns.test.tsx +138 -0
  186. package/src/components/data-table/columns.tsx +44 -4
  187. package/src/components/data-table/filters.ts +1 -0
  188. package/src/components/datasources/datasources.tsx +45 -0
  189. package/src/components/markdown/markdown-renderer.tsx +18 -2
  190. package/src/core/datasets/__tests__/data-source.test.ts +88 -1
  191. package/src/core/datasets/data-source-connections.ts +44 -0
  192. package/src/core/datasets/request-registry.ts +13 -0
  193. package/src/core/islands/bridge.ts +1 -0
  194. package/src/core/islands/main.ts +1 -0
  195. package/src/core/kernel/messages.ts +2 -0
  196. package/src/core/network/requests-lazy.ts +1 -0
  197. package/src/core/network/requests-network.ts +8 -0
  198. package/src/core/network/requests-static.ts +1 -0
  199. package/src/core/network/requests-toasting.tsx +1 -0
  200. package/src/core/network/types.ts +2 -0
  201. package/src/core/wasm/bridge.ts +10 -0
  202. package/src/core/websocket/useMarimoKernelConnection.tsx +4 -0
  203. package/src/plugins/impl/DataTablePlugin.tsx +27 -0
  204. package/dist/apl-Bw2VYJky.js +0 -4
  205. package/dist/asciiarmor-eqY4ZaG6.js +0 -4
  206. package/dist/asn1-Ch439-Sl.js +0 -4
  207. package/dist/brainfuck-CYhvoM5D.js +0 -4
  208. package/dist/classDiagram-2ON5EDUG-BKvGPmV7.js +0 -30
  209. package/dist/classDiagram-v2-WZHVMYZB-CUmRCVhz.js +0 -30
  210. package/dist/clojure-Dlp86hGI.js +0 -4
  211. package/dist/cmake-CW_qEITI.js +0 -4
  212. package/dist/cobol-XHu3WWjZ.js +0 -4
  213. package/dist/coffeescript-Bb6YS_bL.js +0 -4
  214. package/dist/commonlisp-BjSiOQCp.js +0 -4
  215. package/dist/crystal-BqTYUvZ7.js +0 -4
  216. package/dist/css-DADryIYo.js +0 -4
  217. package/dist/cypher-CNn306Oc.js +0 -4
  218. package/dist/d-D-tppFsq.js +0 -4
  219. package/dist/diff-BWHM7ple.js +0 -4
  220. package/dist/dist-BV8p87LG.js +0 -5
  221. package/dist/dist-CHmkCdpG.js +0 -5
  222. package/dist/dist-C__dRIDe.js +0 -5
  223. package/dist/dist-DjYymnvA.js +0 -5
  224. package/dist/dist-E9OVwuXi.js +0 -5
  225. package/dist/dist-s8cGIbEf.js +0 -5
  226. package/dist/dtd-_uCqoALQ.js +0 -4
  227. package/dist/dylan-C9RDQBgd.js +0 -4
  228. package/dist/ecl-D-cNcvrL.js +0 -4
  229. package/dist/eiffel-pwlnpFTa.js +0 -4
  230. package/dist/elm-Bw5cHXv0.js +0 -4
  231. package/dist/erlang-_hA30h6l.js +0 -4
  232. package/dist/factor-DmR0sS2X.js +0 -4
  233. package/dist/forth-Cp4B_BYs.js +0 -4
  234. package/dist/fortran-2KtXs5Vb.js +0 -4
  235. package/dist/gas-106_zOMN.js +0 -4
  236. package/dist/gherkin-CHK85w0F.js +0 -4
  237. package/dist/groovy-Bl2mjKn9.js +0 -4
  238. package/dist/haskell-BzHGL977.js +0 -4
  239. package/dist/haxe-BWQFLp-3.js +0 -5
  240. package/dist/idl-C28UwC1n.js +0 -4
  241. package/dist/javascript-DgLCEZTn.js +0 -4
  242. package/dist/julia-BPiwS_8t.js +0 -4
  243. package/dist/livescript-D--_lQnE.js +0 -4
  244. package/dist/lua-CsDs748O.js +0 -4
  245. package/dist/mathematica-BYQ9GF6F.js +0 -4
  246. package/dist/mbox-C7kaFMhK.js +0 -4
  247. package/dist/mirc-C2209Et3.js +0 -4
  248. package/dist/mllike-BLT4EygN.js +0 -6
  249. package/dist/modelica-DdJRZ_hL.js +0 -4
  250. package/dist/mscgen-CG9noCbk.js +0 -6
  251. package/dist/mumps-V-rMtaoS.js +0 -4
  252. package/dist/nsis-BaCxxbYc.js +0 -4
  253. package/dist/ntriples-2dOF8Rwr.js +0 -4
  254. package/dist/octave-DgJBCpUf.js +0 -4
  255. package/dist/oz-B4DqLn0e.js +0 -4
  256. package/dist/pascal-CzxJky4Q.js +0 -4
  257. package/dist/perl-BXxwSvR1.js +0 -4
  258. package/dist/pig-C6uUbdgq.js +0 -4
  259. package/dist/powershell-ByH1IK0s.js +0 -4
  260. package/dist/properties-D9ixNGHK.js +0 -4
  261. package/dist/protobuf-CL5MO5Bo.js +0 -4
  262. package/dist/pug-j1GtIGnO.js +0 -4
  263. package/dist/puppet-DAaSZQRF.js +0 -4
  264. package/dist/python-DWLse_Hh.js +0 -4
  265. package/dist/q-JRlUfaV4.js +0 -4
  266. package/dist/r-J8uFHie7.js +0 -4
  267. package/dist/rpm-C85hbO48.js +0 -5
  268. package/dist/ruby-D9HeYYQS.js +0 -4
  269. package/dist/sas-D4mSim4H.js +0 -4
  270. package/dist/scheme-DNmM-DGy.js +0 -4
  271. package/dist/shell-BS8ZwLUy.js +0 -4
  272. package/dist/sieve-B8TCe-_m.js +0 -4
  273. package/dist/smalltalk-CkAXTqlf.js +0 -4
  274. package/dist/sparql-Bt75sj2n.js +0 -4
  275. package/dist/stateDiagram-v2-4FDKWEC3-Dd_xAZiD.js +0 -29
  276. package/dist/stylus-BM4XGc6j.js +0 -4
  277. package/dist/swift-BRG-gyk5.js +0 -4
  278. package/dist/tcl-Bp61skpb.js +0 -4
  279. package/dist/textile-vndc5V2p.js +0 -4
  280. package/dist/toml-CMpRzNl5.js +0 -4
  281. package/dist/troff-BNSfnnQn.js +0 -4
  282. package/dist/ttcn-CILP7Q2P.js +0 -4
  283. package/dist/ttcn-cfg-Cs5Ekdhk.js +0 -4
  284. package/dist/turtle-1zFjsw2L.js +0 -4
  285. package/dist/vb-CCqDJO0q.js +0 -4
  286. package/dist/vbscript-CtqCxNqL.js +0 -4
  287. package/dist/velocity-BRacwoCp.js +0 -4
  288. package/dist/verilog-CdotQ5hS.js +0 -4
  289. package/dist/vhdl-CRMFlLc_.js +0 -4
  290. package/dist/webidl-Bo-4Hfyi.js +0 -4
  291. package/dist/xquery-CgMQN-7i.js +0 -4
  292. package/dist/yacas-6ORYe5fj.js +0 -4
  293. package/dist/z80-tFLqkB9-.js +0 -4
  294. /package/dist/{ImageComparisonComponent-gxt3EfyS.js → ImageComparisonComponent-BC00mJmw.js} +0 -0
  295. /package/dist/{Plot-Do8S2SQJ.js → Plot-B1ahrLui.js} +0 -0
  296. /package/dist/{apl-hy2nkDJ0.js → apl-99A7dLQe.js} +0 -0
  297. /package/dist/{array-tvvEqPy7.js → array-B-MVxRIF.js} +0 -0
  298. /package/dist/{asciiarmor-Bp85a1XA.js → asciiarmor-DLEhpFDx.js} +0 -0
  299. /package/dist/{asn1-CCINh2Tb.js → asn1-CMrcTsT4.js} +0 -0
  300. /package/dist/{asterisk-DaVJJDnV.js → asterisk-BUZwqih-.js} +0 -0
  301. /package/dist/{brainfuck-CWERNqpi.js → brainfuck-ChPt5yBe.js} +0 -0
  302. /package/dist/{chunk-4F5CHEZ2-trdcsslU.js → chunk-4F5CHEZ2-BigWQaTs.js} +0 -0
  303. /package/dist/{chunk-B2363JML-BFAcnt5i.js → chunk-B2363JML-DOYwB798.js} +0 -0
  304. /package/dist/{chunk-DR5Q36YT-BflwErH1.js → chunk-DR5Q36YT-CP69aZS_.js} +0 -0
  305. /package/dist/{chunk-FRFDVMJY-Bdi7sRSt.js → chunk-FRFDVMJY-Bo7Hv3UF.js} +0 -0
  306. /package/dist/{chunk-PL6DKKU2-BBQnb9JJ.js → chunk-PL6DKKU2-D3wYz-iW.js} +0 -0
  307. /package/dist/{chunk-SJTYNZTY-upm-bCUI.js → chunk-SJTYNZTY-Bauwp2-p.js} +0 -0
  308. /package/dist/{chunk-TQ3KTPDO-BYnhW5aQ.js → chunk-TQ3KTPDO-TjHW8xfv.js} +0 -0
  309. /package/dist/{chunk-UMXZTB3W-CmrAYToU.js → chunk-UMXZTB3W-DdRiIIOF.js} +0 -0
  310. /package/dist/{click-outside-container-D6Q_AEkf.js → click-outside-container-DB_bTXRG.js} +0 -0
  311. /package/dist/{clike-BclwMGdw.js → clike-CE0fXfM_.js} +0 -0
  312. /package/dist/{clojure-ygiDe_M6.js → clojure-QkBEMU-g.js} +0 -0
  313. /package/dist/{cmake-CqV32d9p.js → cmake-CU1jX7Mo.js} +0 -0
  314. /package/dist/{cobol-BC90RNzo.js → cobol-DMOKzzky.js} +0 -0
  315. /package/dist/{coffeescript-XlUo917R.js → coffeescript-DjnjLyfk.js} +0 -0
  316. /package/dist/{colors-CQAOa8cK.js → colors-Cn2p_FA3.js} +0 -0
  317. /package/dist/{common-keywords-FBrXPTcz.js → common-keywords-hbLeU7VU.js} +0 -0
  318. /package/dist/{commonlisp-BlMWxO2z.js → commonlisp-CYd9iOSe.js} +0 -0
  319. /package/dist/{crystal-BJriHwL7.js → crystal-Dy55yoYG.js} +0 -0
  320. /package/dist/{css-De5CPzak.js → css-CNU8w3HJ.js} +0 -0
  321. /package/dist/{cypher-CF3pgZHB.js → cypher-q47DGzK7.js} +0 -0
  322. /package/dist/{cytoscape.esm-GAzDZorR.js → cytoscape.esm-WbbDoCfu.js} +0 -0
  323. /package/dist/{d-DnmSJuVB.js → d-jEkaLvxX.js} +0 -0
  324. /package/dist/{diff-5fTcVlce.js → diff-vb2-unFN.js} +0 -0
  325. /package/dist/{dist-CWmTJeFK.js → dist-1-E4bC9V.js} +0 -0
  326. /package/dist/{dist-BcxBN3cs.js → dist-APyhcmvq.js} +0 -0
  327. /package/dist/{dist-9a7ktdXy.js → dist-B5thW2rT.js} +0 -0
  328. /package/dist/{dist-DaQ8gl6t.js → dist-BJvk9DSp.js} +0 -0
  329. /package/dist/{dist-WV8DSzVp.js → dist-BLrc9iNb.js} +0 -0
  330. /package/dist/{dist-BGdYVvOu.js → dist-C89sHDXk.js} +0 -0
  331. /package/dist/{dist-D_qEwdMV.js → dist-CGH6Jw-c.js} +0 -0
  332. /package/dist/{dist-C4UxHJAP.js → dist-CQ3XmGIH.js} +0 -0
  333. /package/dist/{dist-Ddms9oaj.js → dist-CYuoqvce.js} +0 -0
  334. /package/dist/{dist-B1fHT_HN.js → dist-CxczluAk.js} +0 -0
  335. /package/dist/{dist-BU99V51x.js → dist-DFBjYgbq.js} +0 -0
  336. /package/dist/{dist-CiisiGJh.js → dist-DbyoYfBn.js} +0 -0
  337. /package/dist/{dist-DkQrPBbq.js → dist-Dk13KZ54.js} +0 -0
  338. /package/dist/{dist-BJ43gqCe.js → dist-Dl9_0tkc.js} +0 -0
  339. /package/dist/{dist-BS0c9rME.js → dist-aW74oyUt.js} +0 -0
  340. /package/dist/{dist-XpVxGq0K.js → dist-iM9VwH8Z.js} +0 -0
  341. /package/dist/{dist-CMY2xBYw.js → dist-zGOEySUQ.js} +0 -0
  342. /package/dist/{dtd-CExSJ830.js → dtd-C9kR-bXa.js} +0 -0
  343. /package/dist/{duckdb-keywords-CvJhR_Yd.js → duckdb-keywords-CZ_ZTscu.js} +0 -0
  344. /package/dist/{dylan-D45mme_B.js → dylan-BLckrK-V.js} +0 -0
  345. /package/dist/{ebnf-2D4Ctp3y.js → ebnf-WEXPLEWb.js} +0 -0
  346. /package/dist/{ecl-Dt8H2ySk.js → ecl-CEsf6XVg.js} +0 -0
  347. /package/dist/{eiffel-BVH48wKK.js → eiffel-2KGZNzx6.js} +0 -0
  348. /package/dist/{elm-lLkDwz-w.js → elm-D2s3K5wF.js} +0 -0
  349. /package/dist/{erlang-Ct2FydHU.js → erlang-0PMFOndk.js} +0 -0
  350. /package/dist/{esm-CuMA4YP0.js → esm-Bb_hbWan.js} +0 -0
  351. /package/dist/{fcl-Ccj8Z5Xd.js → fcl-B_Gv5Jfx.js} +0 -0
  352. /package/dist/{forth-CXoVo3MY.js → forth-DG89iUsu.js} +0 -0
  353. /package/dist/{fortran-CgtioF-z.js → fortran-ytKsAVvu.js} +0 -0
  354. /package/dist/{gas-DA6wSQkj.js → gas-Cg2Fm0N2.js} +0 -0
  355. /package/dist/{gherkin-Cn3rybYZ.js → gherkin-B87FEnZ-.js} +0 -0
  356. /package/dist/{groovy-CGOZjiuH.js → groovy-Dcs08AWD.js} +0 -0
  357. /package/dist/{haskell-BWI76WET.js → haskell-cwkOuhx6.js} +0 -0
  358. /package/dist/{haxe-CovtkFbk.js → haxe-DWEo4q10.js} +0 -0
  359. /package/dist/{http-_DVAYWoR.js → http-Dc2fv19V.js} +0 -0
  360. /package/dist/{idl-SJSctwSZ.js → idl-WWQwDcRV.js} +0 -0
  361. /package/dist/{init-uv0kkh4g.js → init-D-g0ONX1.js} +0 -0
  362. /package/dist/{javascript-BzIdRGKh.js → javascript-BeR74dxD.js} +0 -0
  363. /package/dist/{julia-B3EQ2bxh.js → julia-UlvCUYGL.js} +0 -0
  364. /package/dist/{katex-CywHdYBC.js → katex-B7pMJpE0.js} +0 -0
  365. /package/dist/{livescript-BtVSE9jj.js → livescript-GPmFcmYV.js} +0 -0
  366. /package/dist/{lua-B1Esbvm1.js → lua-DYoT_0zM.js} +0 -0
  367. /package/dist/{math-DFcdCCU8.js → math-BYK36kWZ.js} +0 -0
  368. /package/dist/{mathematica-BLPJnY-e.js → mathematica-DSFIQlbG.js} +0 -0
  369. /package/dist/{mbox-C86ZBpjz.js → mbox-ej8lFMdL.js} +0 -0
  370. /package/dist/{mirc-Cqv8ECOt.js → mirc-CAdIdvHQ.js} +0 -0
  371. /package/dist/{mllike-BCn8p2Mf.js → mllike-CjTB1lHF.js} +0 -0
  372. /package/dist/{modelica-eD-847KF.js → modelica-BB68FYMa.js} +0 -0
  373. /package/dist/{mscgen-BtzXm_zS.js → mscgen-BkbzgGGI.js} +0 -0
  374. /package/dist/{mumps-BUx23-bh.js → mumps-Cu-28E9F.js} +0 -0
  375. /package/dist/{nginx-DasThI7R.js → nginx-ComVAAGN.js} +0 -0
  376. /package/dist/{node-sql-parser-CHcmQ9Ms.js → node-sql-parser-DNGGJ-Rw.js} +0 -0
  377. /package/dist/{ntriples-naSVo-bH.js → ntriples-D9cQiZxZ.js} +0 -0
  378. /package/dist/{octave-B-zftwnK.js → octave-BvtAnPX0.js} +0 -0
  379. /package/dist/{oz-OUZbVKrv.js → oz-COaVHk2E.js} +0 -0
  380. /package/dist/{pascal-C-c-17Ts.js → pascal-BFpqVD2x.js} +0 -0
  381. /package/dist/{path-BGaWgPKg.js → path-Du6n3sOU.js} +0 -0
  382. /package/dist/{perl-BBIS1zw3.js → perl-DaiORxHP.js} +0 -0
  383. /package/dist/{pig-B10mtuLC.js → pig-DFzRhmsF.js} +0 -0
  384. /package/dist/{powershell-SyaENm-A.js → powershell-BG2LQNKN.js} +0 -0
  385. /package/dist/{properties-BiiMVvre.js → properties-CqJJR5QY.js} +0 -0
  386. /package/dist/{protobuf-Cj2_antD.js → protobuf-WwDYV1yY.js} +0 -0
  387. /package/dist/{puppet-ZeJ9I40T.js → puppet-QNY3w_uN.js} +0 -0
  388. /package/dist/{python-mR64qk6D.js → python-4QrQ3Ugi.js} +0 -0
  389. /package/dist/{q-C_IMU433.js → q-DhwXuxE2.js} +0 -0
  390. /package/dist/{r-BKx4ZcIe.js → r-Df-nkR25.js} +0 -0
  391. /package/dist/{rpm-Dc3zEGCn.js → rpm-Cokue07s.js} +0 -0
  392. /package/dist/{ruby-eSClttk1.js → ruby-DrYcL3qF.js} +0 -0
  393. /package/dist/{sas-7VEmwDJB.js → sas-CoiPirA5.js} +0 -0
  394. /package/dist/{scheme-CpP6oEOD.js → scheme-CwFLjzHv.js} +0 -0
  395. /package/dist/{shell-CfNoZJks.js → shell-BFV-R24I.js} +0 -0
  396. /package/dist/{sieve-dzMMB941.js → sieve-CxwXF5T9.js} +0 -0
  397. /package/dist/{simple-mode-CnNH5BDk.js → simple-mode-DTaJtKPt.js} +0 -0
  398. /package/dist/{slides-component-oCf7w4PF.js → slides-component-Cjo6LzW9.js} +0 -0
  399. /package/dist/{smalltalk-BVDNd2a5.js → smalltalk-QivVOCtX.js} +0 -0
  400. /package/dist/{solr-RZ9uTl59.js → solr-DTkyqJ-Z.js} +0 -0
  401. /package/dist/{sparql-Br2qWoOi.js → sparql-nKsFk8j7.js} +0 -0
  402. /package/dist/{spreadsheet-BNNUNXA2.js → spreadsheet-CER0raqY.js} +0 -0
  403. /package/dist/{sql-B4x8IkwU.js → sql-ByOoEONQ.js} +0 -0
  404. /package/dist/{stylus-Ca_-WKcu.js → stylus-BLKQAycn.js} +0 -0
  405. /package/dist/{swift-CiBr8lL9.js → swift-CJoKqiKj.js} +0 -0
  406. /package/dist/{tcl-DpMdOyXx.js → tcl-YTeYFNUc.js} +0 -0
  407. /package/dist/{textile-Dc0EKY-e.js → textile-C6rKQqMQ.js} +0 -0
  408. /package/dist/{tiddlywiki-DI0mF2WJ.js → tiddlywiki-Cr9xyOY1.js} +0 -0
  409. /package/dist/{tiki-2HU6XLLn.js → tiki-D5JONyfZ.js} +0 -0
  410. /package/dist/{timer-YZl28NYN.js → timer-D7JVdX9U.js} +0 -0
  411. /package/dist/{toml-Cz56KCq3.js → toml-DxlPGbRy.js} +0 -0
  412. /package/dist/{treemap-D-ka1hvx.js → treemap-qFGzn7xk.js} +0 -0
  413. /package/dist/{troff-QPYfPg8n.js → troff-DFCfH7Ku.js} +0 -0
  414. /package/dist/{ttcn-Bd8ZFglh.js → ttcn-DAW-ERVP.js} +0 -0
  415. /package/dist/{ttcn-cfg-BRegYnOz.js → ttcn-cfg-CpJ8b7EN.js} +0 -0
  416. /package/dist/{turtle-BtxTFbJ2.js → turtle-BneV2f8L.js} +0 -0
  417. /package/dist/{vb-BPcnlamW.js → vb-D973Vxxh.js} +0 -0
  418. /package/dist/{vbscript-RpXS5Rn-.js → vbscript-Dckaq3YO.js} +0 -0
  419. /package/dist/{velocity-toRwXi-i.js → velocity-DKty-GUC.js} +0 -0
  420. /package/dist/{verilog-B1fdOBGb.js → verilog-aNaK_biA.js} +0 -0
  421. /package/dist/{vhdl-D-vWFb2W.js → vhdl-CQuehnQy.js} +0 -0
  422. /package/dist/{webidl-QJDW0ZyQ.js → webidl-Bhg8vaMr.js} +0 -0
  423. /package/dist/{xquery-DMMT83Vl.js → xquery-D2q16GaM.js} +0 -0
  424. /package/dist/{yacas-CvzqlDJ_.js → yacas-DHGOHnNa.js} +0 -0
  425. /package/dist/{z80-DqdgHy0p.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", () => {
@@ -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);
@@ -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
 
@@ -28,6 +28,7 @@ import {
28
28
  INTERNAL_SQL_ENGINES,
29
29
  } from "@/core/datasets/engines";
30
30
  import {
31
+ PreviewSQLSchemaList,
31
32
  PreviewSQLTable,
32
33
  PreviewSQLTableList,
33
34
  } from "@/core/datasets/request-registry";
@@ -80,6 +81,7 @@ const INDENT = {
80
81
  database: "pl-4",
81
82
  schemaEmpty: "pl-8",
82
83
  schema: "pl-7",
84
+ schemaLoading: "pl-8",
83
85
  tableLoading: "pl-11",
84
86
  tableSchemaless: "pl-8",
85
87
  tableWithSchema: "pl-12",
@@ -369,6 +371,49 @@ const SchemaList: React.FC<{
369
371
  hasSearch,
370
372
  searchValue,
371
373
  }) => {
374
+ const { addSchemaList } = useDataSourceActions();
375
+ const [schemasRequested, setSchemasRequested] = React.useState(false);
376
+
377
+ // Custom loading state, we need to wait for the data to propagate once requested
378
+ // useAsyncData's loading state may return false before data has propagated
379
+ const [schemasLoading, setSchemasLoading] = React.useState(false);
380
+
381
+ const { isPending, error } = useAsyncData(async () => {
382
+ if (schemas.length === 0 && engineName && !schemasRequested) {
383
+ setSchemasRequested(true);
384
+ setSchemasLoading(true);
385
+ try {
386
+ const previewSchemaList = await PreviewSQLSchemaList.request({
387
+ engine: engineName,
388
+ database: databaseName,
389
+ });
390
+
391
+ addSchemaList({
392
+ schemas: previewSchemaList.schemas ?? [],
393
+ sqlSchemaContext: {
394
+ engine: engineName,
395
+ database: databaseName,
396
+ },
397
+ });
398
+ } finally {
399
+ setSchemasLoading(false);
400
+ }
401
+ }
402
+ }, [schemas.length, engineName, databaseName, schemasRequested]);
403
+
404
+ if (isPending || schemasLoading) {
405
+ return (
406
+ <LoadingState
407
+ message="Loading schemas..."
408
+ className={INDENT.schemaLoading}
409
+ />
410
+ );
411
+ }
412
+
413
+ if (error) {
414
+ return <ErrorState error={error} className={INDENT.schemaLoading} />;
415
+ }
416
+
372
417
  if (schemas.length === 0) {
373
418
  return (
374
419
  <EmptyState
@@ -1,7 +1,6 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import { EditorView } from "@codemirror/view";
4
- import { math } from "@streamdown/math";
5
4
  import { useAtomValue } from "jotai";
6
5
  import { BetweenHorizontalStartIcon } from "lucide-react";
7
6
  import { memo, Suspense, useState } from "react";
@@ -13,6 +12,7 @@ import { useLastFocusedCellId } from "@/core/cells/focus";
13
12
  import { MarkdownLanguageAdapter } from "@/core/codemirror/language/languages/markdown";
14
13
  import { SQLLanguageAdapter } from "@/core/codemirror/language/languages/sql/sql";
15
14
  import { autoInstantiateAtom } from "@/core/config/config";
15
+ import { useAsyncData } from "@/hooks/useAsyncData";
16
16
  import { LazyAnyLanguageCodeMirror } from "@/plugins/impl/code/LazyAnyLanguageCodeMirror";
17
17
  import { useTheme } from "@/theme/useTheme";
18
18
  import { copyToClipboard } from "@/utils/copy";
@@ -166,11 +166,27 @@ const COMPONENTS: Components = {
166
166
  },
167
167
  };
168
168
 
169
+ // Lazy-load the math plugin to keep katex (~264 KB) out of the critical path.
170
+ // The first render works without math; once loaded, it re-renders with math support.
171
+ let mathPluginCache: StreamdownProps["plugins"] | undefined;
172
+ const useMathPlugin = () => {
173
+ const { data: plugins } = useAsyncData(async () => {
174
+ if (mathPluginCache) {
175
+ return mathPluginCache;
176
+ }
177
+ const mod = await import("@streamdown/math");
178
+ mathPluginCache = { math: mod.math };
179
+ return mathPluginCache;
180
+ }, []);
181
+ return plugins;
182
+ };
183
+
169
184
  export const MarkdownRenderer = memo(({ content }: { content: string }) => {
185
+ const plugins = useMathPlugin();
170
186
  return (
171
187
  <Streamdown
172
188
  components={COMPONENTS}
173
- plugins={{ math }}
189
+ plugins={plugins}
174
190
  className="mo-markdown-renderer"
175
191
  >
176
192
  {content}
@@ -1,7 +1,7 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
  import { beforeEach, describe, expect, it } from "vitest";
3
3
  import { variableName } from "@/__tests__/branded";
4
- import type { DataTable } from "@/core/kernel/messages";
4
+ import type { DatabaseSchema, DataTable } from "@/core/kernel/messages";
5
5
  import type { VariableName } from "@/core/variables/types";
6
6
  import {
7
7
  type DataSourceConnection,
@@ -209,6 +209,93 @@ describe("filtering data sources", () => {
209
209
  });
210
210
  });
211
211
 
212
+ describe("add schema list", () => {
213
+ const connections: DataSourceConnection[] = [
214
+ {
215
+ name: "conn1" as ConnectionName,
216
+ source: "sqlite",
217
+ display_name: "SQLite DB",
218
+ dialect: "sqlite",
219
+ databases: [
220
+ {
221
+ name: "db1",
222
+ schemas: [],
223
+ dialect: "sqlite",
224
+ },
225
+ ],
226
+ },
227
+ ];
228
+
229
+ // Helper function to add schema list
230
+ const addSchemaList = (
231
+ schemas: DatabaseSchema[],
232
+ engine: string,
233
+ database: string,
234
+ ) => {
235
+ return reducer(baseState, {
236
+ type: "addSchemaList",
237
+ payload: {
238
+ schemas,
239
+ sqlSchemaContext: { engine, database },
240
+ },
241
+ });
242
+ };
243
+
244
+ let baseState: DataSourceState;
245
+
246
+ beforeEach(() => {
247
+ baseState = addConnection(connections, baseState);
248
+ expect(baseState.connectionsMap.size).toBe(defaultConnSize + 1);
249
+ });
250
+
251
+ it("adds schema list to a specific database", () => {
252
+ const schemaList: DatabaseSchema[] = [
253
+ { name: "public", tables: [] },
254
+ { name: "analytics", tables: [] },
255
+ ];
256
+ const newState = addSchemaList(schemaList, "conn1", "db1");
257
+
258
+ const conn1 = newState.connectionsMap.get("conn1" as ConnectionName);
259
+ const db1 = conn1?.databases.find((db) => db.name === "db1");
260
+ expect(db1?.schemas).toEqual(schemaList);
261
+ });
262
+
263
+ it("updates schema list for a database", () => {
264
+ const schemaList: DatabaseSchema[] = [
265
+ { name: "public", tables: [] },
266
+ { name: "analytics", tables: [] },
267
+ ];
268
+ const newState = addSchemaList(schemaList, "conn1", "db1");
269
+
270
+ const conn1 = newState.connectionsMap.get("conn1" as ConnectionName);
271
+ const db1 = conn1?.databases.find((db) => db.name === "db1");
272
+ expect(db1?.schemas).toEqual(schemaList);
273
+
274
+ // update with new schema list
275
+ const newSchemaList: DatabaseSchema[] = [
276
+ { name: "public", tables: [] },
277
+ { name: "sales", tables: [] },
278
+ ];
279
+ const updatedState = addSchemaList(newSchemaList, "conn1", "db1");
280
+
281
+ const newConn = updatedState.connectionsMap.get("conn1" as ConnectionName);
282
+ const newDb1 = newConn?.databases.find((db) => db.name === "db1");
283
+ expect(newDb1?.schemas).toEqual(newSchemaList);
284
+ });
285
+
286
+ it("does not add schema list if database does not exist", () => {
287
+ const schemaList: DatabaseSchema[] = [
288
+ { name: "public", tables: [] },
289
+ { name: "analytics", tables: [] },
290
+ ];
291
+ const newState = addSchemaList(schemaList, "conn1", "non_existent_db");
292
+
293
+ const conn1 = newState.connectionsMap.get("conn1" as ConnectionName);
294
+ const db1 = conn1?.databases.find((db) => db.name === "db1");
295
+ expect(db1?.schemas.length).toBe(0);
296
+ });
297
+ });
298
+
212
299
  describe("add table list", () => {
213
300
  const connections: DataSourceConnection[] = [
214
301
  {
@@ -5,6 +5,7 @@ import { isSchemaless } from "@/components/datasources/utils";
5
5
  import { createReducerAndAtoms } from "@/utils/createReducer";
6
6
  import { Logger } from "@/utils/Logger";
7
7
  import type {
8
+ DatabaseSchema,
8
9
  DataSourceConnection as DataSourceConnectionType,
9
10
  DataTable,
10
11
  } from "../kernel/messages";
@@ -43,6 +44,11 @@ export interface DataSourceState {
43
44
  connectionsMap: ConnectionsMap;
44
45
  }
45
46
 
47
+ export interface SQLSchemaContext {
48
+ engine: string;
49
+ database: string;
50
+ }
51
+
46
52
  export interface SQLTableContext {
47
53
  engine: string;
48
54
  database: string;
@@ -134,6 +140,44 @@ const {
134
140
  };
135
141
  },
136
142
 
143
+ // Add schema list to a specific database in a connection
144
+ addSchemaList: (
145
+ state: DataSourceState,
146
+ opts: {
147
+ schemas: DatabaseSchema[];
148
+ sqlSchemaContext: SQLSchemaContext;
149
+ },
150
+ ): DataSourceState => {
151
+ const { schemas, sqlSchemaContext } = opts;
152
+ const { connectionsMap, latestEngineSelected } = state;
153
+ const connectionName = sqlSchemaContext.engine as ConnectionName;
154
+ const conn = connectionsMap.get(connectionName);
155
+
156
+ if (!conn) {
157
+ return state;
158
+ }
159
+
160
+ const newMap = new Map(connectionsMap);
161
+ const newConn: DataSourceConnection = {
162
+ ...conn,
163
+ databases: conn.databases.map((db) => {
164
+ if (db.name !== sqlSchemaContext.database) {
165
+ return db;
166
+ }
167
+ return {
168
+ ...db,
169
+ schemas: schemas,
170
+ };
171
+ }),
172
+ };
173
+ newMap.set(connectionName, newConn);
174
+
175
+ return {
176
+ latestEngineSelected: latestEngineSelected,
177
+ connectionsMap: newMap,
178
+ };
179
+ },
180
+
137
181
  // Add table list to a specific schema in a connection
138
182
  addTableList: (
139
183
  state: DataSourceState,
@@ -1,5 +1,6 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
  import type {
3
+ SQLSchemaListPreview,
3
4
  SQLTableListPreview,
4
5
  SQLTablePreview,
5
6
  ValidateSQLResult,
@@ -8,6 +9,7 @@ import { CachingRequestRegistry } from "../network/CachingRequestRegistry";
8
9
  import { DeferredRequestRegistry } from "../network/DeferredRequestRegistry";
9
10
  import { getRequestClient } from "../network/requests";
10
11
  import type {
12
+ ListSQLSchemasRequest,
11
13
  ListSQLTablesRequest,
12
14
  PreviewSQLTableRequest,
13
15
  ValidateSQLRequest,
@@ -28,6 +30,17 @@ export const PreviewSQLTable = new DeferredRequestRegistry<
28
30
  });
29
31
  });
30
32
 
33
+ export const PreviewSQLSchemaList = new DeferredRequestRegistry<
34
+ Omit<ListSQLSchemasRequest, "requestId">,
35
+ SQLSchemaListPreview
36
+ >("sql-schema-list-preview", async (requestId, req) => {
37
+ const client = getRequestClient();
38
+ await client.previewSQLSchemaList({
39
+ requestId: requestId,
40
+ ...req,
41
+ });
42
+ });
43
+
31
44
  export const PreviewSQLTableList = new DeferredRequestRegistry<
32
45
  Omit<ListSQLTablesRequest, "requestId">,
33
46
  SQLTableListPreview
@@ -169,6 +169,7 @@ export class IslandsPyodideBridge implements RunRequests, EditRequests {
169
169
  previewDatasetColumn = throwNotImplemented;
170
170
  previewSQLTable = throwNotImplemented;
171
171
  previewSQLTableList = throwNotImplemented;
172
+ previewSQLSchemaList = throwNotImplemented;
172
173
  previewDataSourceConnection = throwNotImplemented;
173
174
  validateSQL = throwNotImplemented;
174
175
  openFile = throwNotImplemented;
@@ -121,6 +121,7 @@ export async function initialize() {
121
121
  case "data-column-preview":
122
122
  case "sql-table-preview":
123
123
  case "sql-table-list-preview":
124
+ case "sql-schema-list-preview":
124
125
  case "datasets":
125
126
  case "data-source-connections":
126
127
  case "validate-sql-result":
@@ -41,6 +41,8 @@ export type DataColumnPreview = NotificationMessageData<"data-column-preview">;
41
41
  export type SQLTablePreview = NotificationMessageData<"sql-table-preview">;
42
42
  export type SQLTableListPreview =
43
43
  NotificationMessageData<"sql-table-list-preview">;
44
+ export type SQLSchemaListPreview =
45
+ NotificationMessageData<"sql-schema-list-preview">;
44
46
  export type ValidateSQLResult = NotificationMessageData<"validate-sql-result">;
45
47
  export type SecretKeysResult = NotificationMessageData<"secret-keys-result">;
46
48
  export type StartupLogs = NotificationMessageData<"startup-logs">;
@@ -112,6 +112,7 @@ const ACTIONS: Record<keyof AllRequests, Action> = {
112
112
  previewDatasetColumn: "waitForConnectionOpen",
113
113
  previewSQLTable: "waitForConnectionOpen",
114
114
  previewSQLTableList: "waitForConnectionOpen",
115
+ previewSQLSchemaList: "waitForConnectionOpen",
115
116
  previewDataSourceConnection: "waitForConnectionOpen",
116
117
  validateSQL: "waitForConnectionOpen",
117
118
  listStorageEntries: "waitForConnectionOpen",
@@ -244,6 +244,14 @@ export function createNetworkRequests(): EditRequests & RunRequests {
244
244
  })
245
245
  .then(handleResponseReturnNull);
246
246
  },
247
+ previewSQLSchemaList: (request) => {
248
+ return getClient()
249
+ .POST("/api/datasources/preview_sql_schema_list", {
250
+ body: request,
251
+ params: getParams(),
252
+ })
253
+ .then(handleResponseReturnNull);
254
+ },
247
255
  previewDataSourceConnection: (request) => {
248
256
  return getClient()
249
257
  .POST("/api/datasources/preview_datasource_connection", {
@@ -57,6 +57,7 @@ export function createStaticRequests(): EditRequests & RunRequests {
57
57
  previewDatasetColumn: throwNotInEditMode,
58
58
  previewSQLTable: throwNotInEditMode,
59
59
  previewSQLTableList: throwNotInEditMode,
60
+ previewSQLSchemaList: throwNotInEditMode,
60
61
  previewDataSourceConnection: throwNotInEditMode,
61
62
  validateSQL: throwNotInEditMode,
62
63
  openFile: throwNotInEditMode,
@@ -42,6 +42,7 @@ export function createErrorToastingRequests(
42
42
  previewDatasetColumn: "Failed to fetch data sources",
43
43
  previewSQLTable: "Failed to fetch SQL table",
44
44
  previewSQLTableList: "Failed to fetch SQL table list",
45
+ previewSQLSchemaList: "Failed to fetch SQL schema list",
45
46
  previewDataSourceConnection: "Failed to preview data source connection",
46
47
  validateSQL: "Failed to validate SQL",
47
48
  openFile: "Failed to open file",
@@ -59,6 +59,7 @@ export type PreviewDatasetColumnRequest =
59
59
  schemas["PreviewDatasetColumnRequest"];
60
60
  export type PreviewSQLTableRequest = schemas["PreviewSQLTableRequest"];
61
61
  export type ListSQLTablesRequest = schemas["ListSQLTablesRequest"];
62
+ export type ListSQLSchemasRequest = schemas["ListSQLSchemasRequest"];
62
63
  export type ListDataSourceConnectionRequest =
63
64
  schemas["ListDataSourceConnectionRequest"];
64
65
  export type ValidateSQLRequest = schemas["ValidateSQLRequest"];
@@ -151,6 +152,7 @@ export interface EditRequests {
151
152
  previewDatasetColumn: (request: PreviewDatasetColumnRequest) => Promise<null>;
152
153
  previewSQLTable: (request: PreviewSQLTableRequest) => Promise<null>;
153
154
  previewSQLTableList: (request: ListSQLTablesRequest) => Promise<null>;
155
+ previewSQLSchemaList: (request: ListSQLSchemasRequest) => Promise<null>;
154
156
  previewDataSourceConnection: (
155
157
  request: ListDataSourceConnectionRequest,
156
158
  ) => Promise<null>;