@marimo-team/islands 0.23.9-dev0 → 0.23.9-dev10

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 (255) hide show
  1. package/dist/{ConnectedDataExplorerComponent-2lBNiUv6.js → ConnectedDataExplorerComponent-OzrfMM5L.js} +20 -20
  2. package/dist/ErrorBoundary-rULOrC_p.js +175 -0
  3. package/dist/{ImageComparisonComponent-CNHIsPDj.js → ImageComparisonComponent-CHrI72em.js} +1 -1
  4. package/dist/{Plot-4wn-lMVn.js → Plot-CAYS29h9.js} +1 -1
  5. package/dist/{_baseUniq-CxZRxRRo.js → _baseUniq-B_2Hw7zG.js} +3 -3
  6. package/dist/{any-language-editor-VWs_7v27.js → any-language-editor-DfdpyDv_.js} +23 -23
  7. package/dist/architecture-7HQA4BMR-Kyc44TmC.js +6 -0
  8. package/dist/{architectureDiagram-VXUJARFQ-CXVJxFhH.js → architectureDiagram-VXUJARFQ-CT2SuxNw.js} +15 -15
  9. package/dist/{arrays-CldYf7p7.js → arrays-sEtDRoG4.js} +1 -1
  10. package/dist/{blockDiagram-VD42YOAC-DGDaxR8I.js → blockDiagram-VD42YOAC-Dy7hlFla.js} +7 -7
  11. package/dist/{button-Dj4BTre0.js → button-C5K9fIPF.js} +2 -2
  12. package/dist/{c4Diagram-YG6GDRKO-C2hc6ne8.js → c4Diagram-YG6GDRKO-BXlAmZ8Z.js} +4 -4
  13. package/dist/{capabilities-C9rrYCzf.js → capabilities-BceAxrAW.js} +2 -2
  14. package/dist/{channel-BBoIVUrJ.js → channel-D_PHgcig.js} +1 -1
  15. package/dist/{chat-ui-D3XBept8.js → chat-ui-BDI3FMI8.js} +29 -29
  16. package/dist/{check-BcUIXnUT.js → check-DTbrK0zt.js} +1 -1
  17. package/dist/{chunk-4F5CHEZ2-BZq7Kom7.js → chunk-4F5CHEZ2-D9nGEHV8.js} +1 -1
  18. package/dist/{chunk-5FQGJX7Z-BOg95xG5.js → chunk-5FQGJX7Z-BNjes6Yx.js} +5 -5
  19. package/dist/{chunk-ABZYJK2D-D0cLy8Bb.js → chunk-ABZYJK2D-Dz0-H2B5.js} +1 -1
  20. package/dist/{chunk-ATLVNIR6-BXsEjlHF.js → chunk-ATLVNIR6-o0Z5MZLd.js} +1 -1
  21. package/dist/{chunk-B2363JML-D9-XOau1.js → chunk-B2363JML-KEJpLGGP.js} +1 -1
  22. package/dist/{chunk-B4BG7PRW-Q1usn6T3.js → chunk-B4BG7PRW-BL98U9B4.js} +4 -4
  23. package/dist/{chunk-DI55MBZ5-D1qLYNrb.js → chunk-DI55MBZ5-Dwkn0LWm.js} +4 -4
  24. package/dist/{chunk-EXTU4WIE-BKNXdLmD.js → chunk-EXTU4WIE-9sNjmQrB.js} +1 -1
  25. package/dist/{chunk-FRFDVMJY-BSBUAX7r.js → chunk-FRFDVMJY-DzQqMWrl.js} +1 -1
  26. package/dist/{chunk-JA3XYJ7Z-D6c6cOBG.js → chunk-JA3XYJ7Z-C32Y7Epf.js} +2 -2
  27. package/dist/{chunk-JZLCHNYA-BvsPHJmL.js → chunk-JZLCHNYA-C6ftyVMN.js} +4 -4
  28. package/dist/{chunk-N4CR4FBY-8ycT-O9a.js → chunk-N4CR4FBY-DUhGZhZs.js} +5 -5
  29. package/dist/{chunk-PL6DKKU2-B0MTXvyc.js → chunk-PL6DKKU2-D7km-08O.js} +1 -1
  30. package/dist/{chunk-QN33PNHL-Bb-eUBW3.js → chunk-QN33PNHL-0K6SDYn3.js} +1 -1
  31. package/dist/{chunk-QXUST7PY-DV8yRwBd.js → chunk-QXUST7PY-DMhsRpYK.js} +5 -5
  32. package/dist/{chunk-S3R3BYOJ-mQeCz5CE.js → chunk-S3R3BYOJ-oAe3dEbO.js} +3 -3
  33. package/dist/{chunk-SJTYNZTY-CEG4F0pB.js → chunk-SJTYNZTY-BkJrPRFC.js} +1 -1
  34. package/dist/{chunk-TCCFYFTB-d3HOqL2I.js → chunk-TCCFYFTB-D58KeXnC.js} +6 -6
  35. package/dist/{chunk-TQ3KTPDO-DiCtqVSi.js → chunk-TQ3KTPDO-D_yA_wAb.js} +1 -1
  36. package/dist/{chunk-TZMSLE5B-BqW10dHe.js → chunk-TZMSLE5B-yBKS_DQU.js} +1 -1
  37. package/dist/{chunk-UMXZTB3W-97iS1iEl.js → chunk-UMXZTB3W-D7uwvNjd.js} +1 -1
  38. package/dist/{classDiagram-2ON5EDUG--Yh__LHb.js → classDiagram-2ON5EDUG-QjoAcuFE.js} +10 -10
  39. package/dist/{classDiagram-v2-WZHVMYZB-BC7X7Xtc.js → classDiagram-v2-WZHVMYZB-bUCv4gu2.js} +10 -10
  40. package/dist/{clone-BuIIsfA8.js → clone-Q4Fqwn6q.js} +1 -1
  41. package/dist/{code-block-37QAKDTI-BsGy1AOJ.js → code-block-37QAKDTI-m92Yc8pv.js} +2 -2
  42. package/dist/{code-visibility-Bgo22d7P.js → code-visibility-7NV5S02K.js} +8369 -8569
  43. package/dist/{constants-D0gkYoE2.js → constants-T20xxyNf.js} +2 -2
  44. package/dist/{copy-DLf4aN7I.js → copy-BuQpJEzp.js} +2 -2
  45. package/dist/{dagre-6UL2VRFP-DRBWoQUw.js → dagre-6UL2VRFP-J0JKgwOt.js} +11 -11
  46. package/dist/{dagre-VYEPqXIV.js → dagre-By_QsQgc.js} +11 -11
  47. package/dist/{data-grid-overlay-editor-efe5ZagF.js → data-grid-overlay-editor-mfEJ5475.js} +2 -2
  48. package/dist/{diagram-PSM6KHXK-H66ATWP2.js → diagram-PSM6KHXK-DYgJuNk9.js} +18 -18
  49. package/dist/{diagram-QEK2KX5R-DItl5Wns.js → diagram-QEK2KX5R-CKdBR2sb.js} +14 -14
  50. package/dist/{diagram-S2PKOQOG-CtuW_ZuL.js → diagram-S2PKOQOG-Dpi7mo5W.js} +14 -14
  51. package/dist/dist-0Fif7jnk.js +5 -0
  52. package/dist/{dist-Dh3wkoyH.js → dist-4j4c7bjm.js} +2 -2
  53. package/dist/{dist-CDFZi-QD.js → dist-B3P2fFpz.js} +1 -1
  54. package/dist/{dist-BNyrZfqT.js → dist-B3pZ0Ab6.js} +2 -2
  55. package/dist/dist-B5h_9sHB.js +6 -0
  56. package/dist/dist-B9M6R5ye.js +5 -0
  57. package/dist/dist-BCt3tnck.js +8 -0
  58. package/dist/{dist-BrBucRXs.js → dist-BTfv03uy.js} +2 -2
  59. package/dist/dist-BUIJwMwn.js +8 -0
  60. package/dist/{dist-CYEylvZA.js → dist-BbbIBDiQ.js} +1 -1
  61. package/dist/{dist-KnujRhFL.js → dist-BcuoonNH.js} +4 -4
  62. package/dist/{dist-DJ6zJQZ4.js → dist-Bde4a2kU.js} +2 -2
  63. package/dist/{dist-t_qL7eB8.js → dist-Bfwsv11D.js} +2 -2
  64. package/dist/{dist-CNtV21T_.js → dist-BhM8gdSO.js} +4 -4
  65. package/dist/{dist-nuW5EDYT.js → dist-BotSqB48.js} +2 -2
  66. package/dist/dist-BpquMd3k.js +5 -0
  67. package/dist/dist-BzJsqYfz.js +5 -0
  68. package/dist/{dist-D029TiHd.js → dist-Bz_sYWbr.js} +2 -2
  69. package/dist/{dist-D3ZI9nhS.js → dist-C1BYNeCR.js} +4 -4
  70. package/dist/{dist-Bc5pmZIw.js → dist-C5VC_yzu.js} +1 -1
  71. package/dist/dist-CA5ELXAf.js +6 -0
  72. package/dist/dist-CLBRs6Uv.js +5 -0
  73. package/dist/{dist-Dhk6FMb0.js → dist-CLJWPTX2.js} +3 -3
  74. package/dist/{dist-C34oIrQ9.js → dist-CLUtPrdy.js} +1 -1
  75. package/dist/dist-CStVCMbq.js +5 -0
  76. package/dist/{dist-B8RaFTRF.js → dist-CUCNs1ja.js} +2 -2
  77. package/dist/dist-CZRIEY3Y.js +8 -0
  78. package/dist/{dist-UcOPnRMa.js → dist-CcXxepx6.js} +3 -3
  79. package/dist/dist-CuUHbFD0.js +5 -0
  80. package/dist/{dist-B8BjrFUE.js → dist-Cy1WxgBD.js} +5 -5
  81. package/dist/{dist-WdPUFc56.js → dist-D4CewLk6.js} +1 -1
  82. package/dist/{dist-DMZNjfX4.js → dist-DRfcqpxJ.js} +2 -2
  83. package/dist/dist-DV7Iabxb.js +8 -0
  84. package/dist/{dist-usPCDYx8.js → dist-D_bzzWBm.js} +1 -1
  85. package/dist/{dist-BvCfQQQE.js → dist-DgnE8F-r.js} +1 -1
  86. package/dist/{dist-JEhxD_cn.js → dist-DhHh0jLg.js} +1 -1
  87. package/dist/{dist-DGAfI2rB.js → dist-DqAWR3CS.js} +2 -2
  88. package/dist/{dist--sWVZwjW.js → dist-Du8WkPuU.js} +1 -1
  89. package/dist/dist-DuEeHMvL.js +5 -0
  90. package/dist/{dist-BTyJtnNg.js → dist-DxvORzUR.js} +1 -1
  91. package/dist/{dist-B507mf_I.js → dist-RqXTaiir.js} +2 -2
  92. package/dist/{dist-Yrfc6L0I.js → dist-fQ0ViXGs.js} +3 -3
  93. package/dist/{dist-B4LJpMEg.js → dist-h2c8sZvT.js} +1 -1
  94. package/dist/{dist-C2ej4eOH.js → dist-luvabDEB.js} +2 -2
  95. package/dist/{dist-B52GXZbd.js → dist-p2qyWijU.js} +2 -2
  96. package/dist/{erDiagram-Q2GNP2WA--19X2kU5.js → erDiagram-Q2GNP2WA-BU-m41EQ.js} +10 -10
  97. package/dist/{error-banner-CVkfBUT3.js → error-banner-5bz0L9hS.js} +3 -3
  98. package/dist/{esm-CWp0KQeK.js → esm-BfhQmZjp.js} +4 -4
  99. package/dist/{esm-DjNnlmpf.js → esm-Duie8iU-.js} +23 -23
  100. package/dist/{extends-vAi97cpa.js → extends-BgdxCfYu.js} +6 -6
  101. package/dist/{flatten-CzBvFdvC.js → flatten-Bbw7g6-K.js} +1 -1
  102. package/dist/{flowDiagram-NV44I4VS-DQmWlo7f.js → flowDiagram-NV44I4VS-CRoXKjGq.js} +10 -10
  103. package/dist/{formats-Dsy9kkZu.js → formats-DQ5qjo_Q.js} +4 -4
  104. package/dist/{ganttDiagram-JELNMOA3-BOGXJ8Lk.js → ganttDiagram-JELNMOA3-7mq5f9cO.js} +7 -7
  105. package/dist/{gitGraph-G5XIXVHT-DGlbae5m.js → gitGraph-G5XIXVHT-DiniR35k.js} +3 -3
  106. package/dist/{gitGraphDiagram-V2S2FVAM-DjzxfF0P.js → gitGraphDiagram-V2S2FVAM-Dfuokq6w.js} +13 -13
  107. package/dist/{glide-data-editor-DucgdjRo.js → glide-data-editor-DqRY9naW.js} +557 -557
  108. package/dist/{graphlib-CVPKjKCS.js → graphlib-Ns7y5crs.js} +5 -5
  109. package/dist/{hasIn-COs6vImh.js → hasIn-Deg7jl_j.js} +3 -3
  110. package/dist/{html-to-image-CpggM7u1.js → html-to-image-CiSinpSR.js} +109 -109
  111. package/dist/{info-VBDWY6EO-D2lvLLw5.js → info-VBDWY6EO-DVZvGhkQ.js} +3 -3
  112. package/dist/{infoDiagram-HS3SLOUP-ChNufFsP.js → infoDiagram-HS3SLOUP-CEnzWruK.js} +13 -13
  113. package/dist/{input-D4kjoQUB.js → input-CZD2z6X2.js} +70 -67
  114. package/dist/{isEmpty-Dd8mx_WL.js → isEmpty-CJJMn-QP.js} +1 -1
  115. package/dist/{isSymbol-BvIfMnn6.js → isSymbol-CoUCgMCM.js} +1 -1
  116. package/dist/{journeyDiagram-XKPGCS4Q-BO_O4Ij1.js → journeyDiagram-XKPGCS4Q-8XYSU1GI.js} +3 -3
  117. package/dist/{kanban-definition-3W4ZIXB7-CPpiiiWk.js → kanban-definition-3W4ZIXB7--9pT9z1R.js} +7 -7
  118. package/dist/{label-BLqV33b1.js → label-LWtdw5i8.js} +3 -3
  119. package/dist/{linear-2NnK4cxi.js → linear-B5-AFRiR.js} +2 -2
  120. package/dist/{loader-Dr8Qem8p.js → loader-BWLPpjKK.js} +2 -2
  121. package/dist/main.js +1681 -1555
  122. package/dist/{memoize-C9ltv0Cw.js → memoize-BOtf2yFf.js} +1 -1
  123. package/dist/{merge-CHn7Yx0N.js → merge-Be1CqGnU.js} +1 -1
  124. package/dist/mermaid-4DMBBIKO-DIdL224_.js +6 -0
  125. package/dist/{mermaid-DO-Daq7u.js → mermaid-IU93XzmY.js} +44 -44
  126. package/dist/{mermaid-parser.core-DreccfmS.js → mermaid-parser.core-C3XRsazI.js} +8 -8
  127. package/dist/{min-BNz2lZfk.js → min-Dtgc8txR.js} +4 -4
  128. package/dist/{mindmap-definition-VGOIOE7T-CC1_Vl0f.js → mindmap-definition-VGOIOE7T-B-4mnfFG.js} +9 -9
  129. package/dist/{now-Sgq5m3D-.js → now-Ch98bJO_.js} +2 -2
  130. package/dist/{number-overlay-editor-CpKi64Fy.js → number-overlay-editor-D-a0qCT8.js} +1 -1
  131. package/dist/{once-rJImu7SE.js → once-DPuqGUeo.js} +1 -1
  132. package/dist/{packet-DYOGHKS2-CmWtF3uO.js → packet-DYOGHKS2-34raHOiB.js} +3 -3
  133. package/dist/{pick-CRAXxDYn.js → pick-D1Qo8s2C.js} +4 -4
  134. package/dist/{pie-VRWISCQL-B6u8vus8.js → pie-VRWISCQL-BaLlzZa3.js} +3 -3
  135. package/dist/{pieDiagram-ADFJNKIX-Di34MOFQ.js → pieDiagram-ADFJNKIX-Cr3cNpZY.js} +15 -15
  136. package/dist/{precisionRound-CnHPY_5v.js → precisionRound-Tqb4mg-H.js} +1 -1
  137. package/dist/{process-output-X8TR20AK.js → process-output-5qJjMRKh.js} +4 -4
  138. package/dist/{quadrantDiagram-AYHSOK5B-B9kVk1ny.js → quadrantDiagram-AYHSOK5B-BuNL8Q93.js} +4 -4
  139. package/dist/{radar-ZZBFDIW7-XAmXSa8s.js → radar-ZZBFDIW7-Ci7bfoZa.js} +3 -3
  140. package/dist/{react-vega-Dh6-UKKe.js → react-vega-B0sAlDTL.js} +9 -9
  141. package/dist/react-vega-B6ncY2Tp.js +9 -0
  142. package/dist/{requirementDiagram-UZGBJVZJ-BxGfGYEx.js → requirementDiagram-UZGBJVZJ-BG2lLUN1.js} +9 -9
  143. package/dist/{reveal-component-DI8GG1kM.js → reveal-component-CBOpXCsm.js} +24 -24
  144. package/dist/{sankeyDiagram-TZEHDZUN-D09PBJ-n.js → sankeyDiagram-TZEHDZUN-DMal8sps.js} +3 -3
  145. package/dist/{sequenceDiagram-WL72ISMW-t_Dpemj0.js → sequenceDiagram-WL72ISMW-DT6Tk-Eo.js} +4 -4
  146. package/dist/{spec-hVaaZsY5.js → spec-a6DaqW__.js} +4 -4
  147. package/dist/{stateDiagram-FKZM4ZOC-B18gTP_j.js → stateDiagram-FKZM4ZOC-CB_lodq3.js} +12 -12
  148. package/dist/{stateDiagram-v2-4FDKWEC3-B6e_t14A.js → stateDiagram-v2-4FDKWEC3-E0RGjKsm.js} +10 -10
  149. package/dist/stex-KfRnSHzF.js +4 -0
  150. package/dist/{strings-BiIhGaI8.js → strings-Bu3vlb6W.js} +7 -7
  151. package/dist/style.css +1 -1
  152. package/dist/{swiper-component-DlD2GU2g.js → swiper-component-B2t5sN1q.js} +3 -3
  153. package/dist/{time-C1SGcFMH.js → time-CsmIF9YZ.js} +3 -3
  154. package/dist/{timeline-definition-IT6M3QCI-DJnh1ks5.js → timeline-definition-IT6M3QCI-NfSKRvH0.js} +2 -2
  155. package/dist/{toDate-CIpC_34u.js → toDate-ZVVIBmdk.js} +5 -5
  156. package/dist/{tooltip-DRaMBu06.js → tooltip-C5FYOpQc.js} +4 -4
  157. package/dist/{treemap-GDKQZRPO-Du95DV6u.js → treemap-GDKQZRPO-Cl6OQh8D.js} +3 -3
  158. package/dist/{types-Dzuoc3LN.js → types-CVvp1fKr.js} +2 -9
  159. package/dist/{useAsyncData-C56Khv_R.js → useAsyncData-C008zUPi.js} +2 -2
  160. package/dist/{useDateFormatter-B_9k85Ex.js → useDateFormatter-BA4FCquG.js} +2 -2
  161. package/dist/{useDeepCompareMemoize-Dt98v2ua.js → useDeepCompareMemoize-BrA3_n61.js} +1 -1
  162. package/dist/{useIframeCapabilities-BkYHTrss.js → useIframeCapabilities-C4JTXTIh.js} +1 -1
  163. package/dist/{useLifecycle-BF6-z62y.js → useLifecycle-BNaoJ5a4.js} +4 -4
  164. package/dist/{useTheme-DykuNHR2.js → useTheme-7O0YWlE5.js} +3 -3
  165. package/dist/{vega-component-cSdqoAxe.js → vega-component-DJNmOdUj.js} +18 -18
  166. package/dist/{vega-loader.browser-3_z8GoFC.js → vega-loader.browser-CZ-J8Py3.js} +3 -3
  167. package/dist/{xychartDiagram-PRI3JC2R-Dk2d_bX0.js → xychartDiagram-PRI3JC2R-BvwftqMA.js} +9 -9
  168. package/dist/{zod-BWkcDORu.js → zod-CoBiJ5v4.js} +3 -3
  169. package/package.json +1 -1
  170. package/src/components/data-table/TableBottomBar.tsx +27 -6
  171. package/src/components/data-table/TableTopBar.tsx +7 -1
  172. package/src/components/data-table/__tests__/TableBottomBar.test.tsx +73 -0
  173. package/src/components/data-table/__tests__/column-explorer.test.tsx +128 -0
  174. package/src/components/data-table/__tests__/column-header.test.tsx +110 -277
  175. package/src/components/data-table/__tests__/data-table.test.tsx +52 -1
  176. package/src/components/data-table/__tests__/date-filter-inputs.test.tsx +33 -0
  177. package/src/components/data-table/__tests__/filter-pill-editor.test.tsx +75 -38
  178. package/src/components/data-table/__tests__/filter-pills.test.tsx +287 -0
  179. package/src/components/data-table/__tests__/filter-test-utils.ts +47 -0
  180. package/src/components/data-table/__tests__/filters.test.ts +5 -5
  181. package/src/components/data-table/__tests__/header-items.test.tsx +47 -1
  182. package/src/components/data-table/__tests__/useColumnVisibility.test.ts +42 -0
  183. package/src/components/data-table/add-filter-button.tsx +85 -0
  184. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +98 -26
  185. package/src/components/data-table/column-header.tsx +94 -691
  186. package/src/components/data-table/columns.tsx +3 -4
  187. package/src/components/data-table/context-menu.tsx +26 -12
  188. package/src/components/data-table/data-table.tsx +125 -56
  189. package/src/components/data-table/date-filter-inputs.tsx +13 -10
  190. package/src/components/data-table/export-actions.tsx +17 -6
  191. package/src/components/data-table/filter-by-values-picker.tsx +13 -19
  192. package/src/components/data-table/filter-editor-context.tsx +34 -0
  193. package/src/components/data-table/filter-pill-editor.tsx +152 -175
  194. package/src/components/data-table/filter-pills.tsx +190 -153
  195. package/src/components/data-table/filters/builders.ts +102 -0
  196. package/src/components/data-table/filters/defaults.ts +31 -0
  197. package/src/components/data-table/filters/format.ts +131 -0
  198. package/src/components/data-table/filters/guards.ts +51 -0
  199. package/src/components/data-table/filters/index.ts +7 -0
  200. package/src/components/data-table/filters/operators.ts +76 -0
  201. package/src/components/data-table/filters/serialize.ts +186 -0
  202. package/src/components/data-table/filters/types.ts +33 -0
  203. package/src/components/data-table/header-items.tsx +25 -85
  204. package/src/components/data-table/hooks/use-column-visibility.ts +56 -0
  205. package/src/components/data-table/pagination.tsx +16 -3
  206. package/src/components/data-table/table-explorer-panel/table-explorer-panel.tsx +16 -6
  207. package/src/components/data-table/value-chips.tsx +52 -0
  208. package/src/components/dependency-graph/minimap-content.tsx +2 -2
  209. package/src/components/editor/errors/mangled-local-chip.tsx +50 -0
  210. package/src/components/editor/output/MarimoErrorOutput.tsx +7 -2
  211. package/src/components/editor/output/MarimoTracebackOutput.tsx +31 -2
  212. package/src/components/ui/number-field.tsx +13 -1
  213. package/src/plugins/impl/DataTablePlugin.tsx +94 -33
  214. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +1 -0
  215. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +8 -6
  216. package/src/stories/dataframe.stories.tsx +1 -0
  217. package/src/utils/__tests__/local-variables.test.ts +132 -0
  218. package/src/utils/dates.ts +39 -0
  219. package/src/utils/local-variables.ts +67 -0
  220. package/dist/ErrorBoundary-D3wrPNma.js +0 -167
  221. package/dist/architecture-7HQA4BMR-CS9jOrqM.js +0 -6
  222. package/dist/dist-21ButRCu.js +0 -8
  223. package/dist/dist-B--tLnAP.js +0 -5
  224. package/dist/dist-BoHGySTM.js +0 -5
  225. package/dist/dist-ByAz19Qc.js +0 -5
  226. package/dist/dist-C1Ap5CYU.js +0 -5
  227. package/dist/dist-C93EysN4.js +0 -5
  228. package/dist/dist-CY-lVor6.js +0 -8
  229. package/dist/dist-CYDuv4bR.js +0 -8
  230. package/dist/dist-Cfo5EE2t.js +0 -6
  231. package/dist/dist-CjivSDvN.js +0 -5
  232. package/dist/dist-Cqwx-MH7.js +0 -5
  233. package/dist/dist-DbpcoFAV.js +0 -6
  234. package/dist/dist-FUNenbiQ.js +0 -5
  235. package/dist/dist-zhSud5X3.js +0 -8
  236. package/dist/mermaid-4DMBBIKO-B7VQMwJx.js +0 -6
  237. package/dist/react-vega-Cavbrg4l.js +0 -9
  238. package/dist/stex-ChDHQs3R.js +0 -4
  239. package/src/components/data-table/__tests__/column-header.test.ts +0 -65
  240. package/src/components/data-table/filters.ts +0 -386
  241. /package/dist/{_baseFor-BGiY-cm1.js → _baseFor-4jw-lnCC.js} +0 -0
  242. /package/dist/{clsx-CyyyQ8Ue.js → clsx-CIWA5tNO.js} +0 -0
  243. /package/dist/{defaultLocale-DoeErsX2.js → defaultLocale-BoHTsDG6.js} +0 -0
  244. /package/dist/{defaultLocale-BpsHxBd7.js → defaultLocale-u-3osm0P.js} +0 -0
  245. /package/dist/{dist-CCADb07R.js → dist-DNdhYsgW.js} +0 -0
  246. /package/dist/{emotion-is-prop-valid.esm-DtW2o230.js → emotion-is-prop-valid.esm-DzSb5hsH.js} +0 -0
  247. /package/dist/{invariant-UcGKQEhF.js → invariant-wRzNXIsJ.js} +0 -0
  248. /package/dist/{jsx-runtime-COBk7ree.js → jsx-runtime-DebpN0FN.js} +0 -0
  249. /package/dist/{main-CThhXnXU.js → main-Tj_-QTyF.js} +0 -0
  250. /package/dist/{micromark-factory-space-CwHmg6iz.js → micromark-factory-space-DF2w36zS.js} +0 -0
  251. /package/dist/{ordinal-B43ZeR68.js → ordinal-ArJavP1Q.js} +0 -0
  252. /package/dist/{purify.es-DT70lfR0.js → purify.es-H92eMd9-.js} +0 -0
  253. /package/dist/{range-BOiA8qqU.js → range-C-rmrM1O.js} +0 -0
  254. /package/dist/{react-dom-BWRJ_g_k.js → react-dom-BTJzcVJ9.js} +0 -0
  255. /package/dist/{stex-DrxP7bb3.js → stex-BIsgBmK4.js} +0 -0
@@ -0,0 +1,52 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import type React from "react";
4
+
5
+ export const Chip = ({ children }: { children: React.ReactNode }) => (
6
+ <span className="inline-flex items-center rounded-sm bg-muted/50 px-1 font-mono text-xs font-normal leading-tight text-foreground">
7
+ {children}
8
+ </span>
9
+ );
10
+
11
+ export const MoreChip = ({ count }: { count: number }) => (
12
+ <span className="inline-flex items-center px-1 text-xs italic text-muted-foreground">
13
+ +{count}
14
+ </span>
15
+ );
16
+
17
+ interface ChipWithCommaProps {
18
+ value: string;
19
+ showComma: boolean;
20
+ }
21
+
22
+ export const ChipWithComma = ({ value, showComma }: ChipWithCommaProps) => (
23
+ <span className="inline-flex items-center">
24
+ <Chip>{value}</Chip>
25
+ {showComma && <span className="text-muted-foreground">,</span>}
26
+ </span>
27
+ );
28
+
29
+ interface CompactChipRowProps {
30
+ items: string[];
31
+ max?: number;
32
+ }
33
+
34
+ export const CompactChipRow = ({ items, max = 3 }: CompactChipRowProps) => {
35
+ if (items.length === 0) {
36
+ return null;
37
+ }
38
+ const visible = items.slice(0, max);
39
+ const hidden = Math.max(0, items.length - max);
40
+ return (
41
+ <span className="inline-flex items-center gap-1">
42
+ {visible.map((item, i) => (
43
+ <ChipWithComma
44
+ key={i}
45
+ value={item}
46
+ showComma={i < visible.length - 1}
47
+ />
48
+ ))}
49
+ {hidden > 0 && <MoreChip count={hidden} />}
50
+ </span>
51
+ );
52
+ };
@@ -68,7 +68,7 @@ const MinimapCell: React.FC<MinimapCellProps> = (props) => {
68
68
  className={cn(
69
69
  "group bg-transparent text-left w-full flex relative justify-between items-center",
70
70
  "border-none rounded cursor-pointer",
71
- "h-[21px] pl-[59px] font-inherit",
71
+ "h-[21px] pl-[65px] font-inherit",
72
72
  isSelected
73
73
  ? "text-primary-foreground"
74
74
  : "text-(--gray-8) hover:text-(--gray-9)",
@@ -106,7 +106,7 @@ const MinimapCell: React.FC<MinimapCellProps> = (props) => {
106
106
  </div>
107
107
  <svg
108
108
  className={cn(
109
- "absolute overflow-visible top-[10.5px] left-[calc(var(--spacing-extra-small,8px)+25px)] pointer-events-none",
109
+ "absolute overflow-visible top-[10.5px] left-[calc(var(--spacing-extra-small,8px)+31px)] pointer-events-none",
110
110
  isSelected ? "z-[1]" : "z-0",
111
111
  getTextColor({ cell, selectedCell }),
112
112
  )}
@@ -0,0 +1,50 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+ import type { JSX } from "react";
3
+ import { Tooltip } from "@/components/ui/tooltip";
4
+ import type { MangledSegment, UnmangledLocal } from "@/utils/local-variables";
5
+ import { CellLinkError } from "../links/cell-link";
6
+
7
+ interface Props {
8
+ local: UnmangledLocal;
9
+ }
10
+
11
+ /**
12
+ * Renders a compiler-mangled cell-local variable as the user's original name
13
+ * (e.g. `_a`) with a tooltip linking to the defining cell.
14
+ */
15
+ export const MangledLocalChip = ({ local }: Props): JSX.Element => {
16
+ const tooltipContent = (
17
+ <div className="max-w-xs">
18
+ Local variable <span className="font-code">{local.name}</span> in cell{" "}
19
+ <CellLinkError cellId={local.cellId} />.
20
+ </div>
21
+ );
22
+
23
+ return (
24
+ <Tooltip content={tooltipContent}>
25
+ <span className="font-code cursor-help">{local.name}</span>
26
+ </Tooltip>
27
+ );
28
+ };
29
+
30
+ interface MangledSegmentsProps {
31
+ segments: MangledSegment[];
32
+ }
33
+
34
+ /**
35
+ * Render an array of `splitMangledLocals` segments as alternating text and
36
+ * `<MangledLocalChip>` nodes.
37
+ */
38
+ export const MangledSegments = ({
39
+ segments,
40
+ }: MangledSegmentsProps): JSX.Element => (
41
+ <>
42
+ {segments.map((segment, idx) =>
43
+ typeof segment === "string" ? (
44
+ <span key={idx}>{segment}</span>
45
+ ) : (
46
+ <MangledLocalChip key={idx} local={segment} />
47
+ ),
48
+ )}
49
+ </>
50
+ );
@@ -17,15 +17,17 @@ import { Button } from "@/components/ui/button";
17
17
  import { Kbd } from "@/components/ui/kbd";
18
18
  import { ExternalLink } from "@/components/ui/links";
19
19
  import type { CellId } from "@/core/cells/ids";
20
+ import { renderHTML } from "@/plugins/core/RenderHTML";
21
+ import { splitMangledLocals } from "@/utils/local-variables";
20
22
  import type { MarimoError } from "../../../core/kernel/messages";
21
23
  import { cn } from "../../../utils/cn";
22
24
  import { Alert, AlertTitle } from "../../ui/alert";
23
25
  import { openPackageManager } from "../chrome/panels/packages-utils";
24
26
  import { useChromeActions } from "../chrome/state";
25
27
  import { AutoFixButton } from "../errors/auto-fix";
28
+ import { MangledSegments } from "../errors/mangled-local-chip";
26
29
  import { CellLinkError } from "../links/cell-link";
27
30
  import { processTextForUrls } from "./console/text-rendering";
28
- import { renderHTML } from "@/plugins/core/RenderHTML";
29
31
 
30
32
  const Tip = (props: {
31
33
  title?: string;
@@ -454,10 +456,13 @@ export const MarimoErrorOutput = ({
454
456
  error.exception_type === "NameError" &&
455
457
  error.msg.startsWith("name '_")
456
458
  ) {
459
+ const segments = splitMangledLocals(error.msg);
457
460
  return (
458
461
  <li className="my-2" key={`exception-${idx}`}>
459
462
  <div>
460
- <p className="text-muted-foreground">{error.msg}</p>
463
+ <p className="text-muted-foreground">
464
+ <MangledSegments segments={segments} />
465
+ </p>
461
466
  <p className="text-muted-foreground mt-2">
462
467
  Variables prefixed with an underscore are local to a cell{" "}
463
468
  (
@@ -36,6 +36,10 @@ import { isWasm } from "@/core/wasm/utils";
36
36
  import { renderHTML } from "@/plugins/core/RenderHTML";
37
37
  import { sanitizeHtml } from "@/plugins/core/sanitize-html";
38
38
  import { copyToClipboard } from "@/utils/copy";
39
+ import {
40
+ containsMangledLocal,
41
+ splitMangledLocals,
42
+ } from "@/utils/local-variables";
39
43
  import {
40
44
  elementContainsMarimoCellFile,
41
45
  extractAllTracebackInfo,
@@ -43,6 +47,7 @@ import {
43
47
  } from "@/utils/traceback";
44
48
  import { cn } from "../../../utils/cn";
45
49
  import { AIFixButton } from "../errors/auto-fix";
50
+ import { MangledSegments } from "../errors/mangled-local-chip";
46
51
  import { CellLinkTraceback } from "../links/cell-link";
47
52
  import type { OnRefactorWithAI } from "../Output";
48
53
 
@@ -64,7 +69,11 @@ export const MarimoTracebackOutput = ({
64
69
  }: Props): JSX.Element => {
65
70
  const htmlTraceback = renderHTML({
66
71
  html: traceback,
67
- additionalReplacements: [replaceTracebackFilenames, replaceTracebackPrefix],
72
+ additionalReplacements: [
73
+ replaceTracebackFilenames,
74
+ replaceTracebackPrefix,
75
+ replaceMangledLocal,
76
+ ],
68
77
  });
69
78
  const [expanded, setExpanded] = useState(true);
70
79
 
@@ -94,6 +103,9 @@ export const MarimoTracebackOutput = ({
94
103
  };
95
104
 
96
105
  const [error, errorMessage] = lastTracebackLine.split(":", 2);
106
+ const errorMessageSegments = errorMessage
107
+ ? splitMangledLocals(errorMessage)
108
+ : [];
97
109
 
98
110
  return (
99
111
  <div className="flex flex-col gap-2 min-w-full w-fit">
@@ -111,7 +123,7 @@ export const MarimoTracebackOutput = ({
111
123
  />
112
124
  <div className="text-sm inline font-mono">
113
125
  <span className="text-destructive">{error || "Error"}:</span>{" "}
114
- {errorMessage}
126
+ <MangledSegments segments={errorMessageSegments} />
115
127
  </div>
116
128
  </div>
117
129
  <AccordionContent className="text-muted-foreground px-4 pt-2 text-xs overflow-auto">
@@ -249,6 +261,23 @@ export const replaceTracebackFilenames = (domNode: DOMNode) => {
249
261
  }
250
262
  };
251
263
 
264
+ /**
265
+ * Replace any cell-local mangled name (`_cell_<id>_<name>`) inside a text
266
+ * node with a {@link MangledLocalChip}. The mangled name appears in both
267
+ * the final `NameError:` line and inside compiled-cell source lines because
268
+ * the compiler rewrites underscore-prefixed references at AST-visit time.
269
+ */
270
+ export const replaceMangledLocal = (domNode: DOMNode) => {
271
+ if (!(domNode instanceof Text) || !domNode.nodeValue) {
272
+ return;
273
+ }
274
+ if (!containsMangledLocal(domNode.nodeValue)) {
275
+ return;
276
+ }
277
+ const segments = splitMangledLocals(domNode.nodeValue);
278
+ return <MangledSegments segments={segments} />;
279
+ };
280
+
252
281
  export const replaceTracebackPrefix = (domNode: DOMNode) => {
253
282
  if (
254
283
  domNode instanceof Text &&
@@ -15,10 +15,17 @@ import { maxFractionalDigits } from "@/utils/numbers";
15
15
  export interface NumberFieldProps extends AriaNumberFieldProps {
16
16
  placeholder?: string;
17
17
  variant?: "default" | "xs";
18
+ /**
19
+ * Fires on every keystroke with the raw text currently in the input.
20
+ * React-aria's `onChange` only fires on commit (blur/Enter/stepper); use this
21
+ * when callers need to peek at the in-progress value, e.g. to enable an Apply
22
+ * button while the user is still typing.
23
+ */
24
+ onInputText?: (text: string) => void;
18
25
  }
19
26
 
20
27
  export const NumberField = React.forwardRef<HTMLInputElement, NumberFieldProps>(
21
- ({ placeholder, variant = "default", ...props }, ref) => {
28
+ ({ placeholder, variant = "default", onInputText, ...props }, ref) => {
22
29
  const { locale } = useLocale();
23
30
  return (
24
31
  <AriaNumberField
@@ -48,6 +55,11 @@ export const NumberField = React.forwardRef<HTMLInputElement, NumberFieldProps>(
48
55
  e.stopPropagation();
49
56
  }
50
57
  }}
58
+ onInput={
59
+ onInputText
60
+ ? (e) => onInputText(e.currentTarget.value)
61
+ : undefined
62
+ }
51
63
  className={cn(
52
64
  "flex-1",
53
65
  "w-full",
@@ -8,8 +8,9 @@ import type {
8
8
  PaginationState,
9
9
  RowSelectionState,
10
10
  SortingState,
11
+ Table as TanstackTable,
11
12
  } from "@tanstack/react-table";
12
- import { Provider } from "jotai";
13
+ import { Provider, useAtomValue } from "jotai";
13
14
  import { Table2Icon } from "lucide-react";
14
15
  import type { JSX } from "react";
15
16
  import React, {
@@ -28,6 +29,7 @@ import { TablePanel } from "@/components/data-table/charts/charts";
28
29
  import { hasChart } from "@/components/data-table/charts/storage";
29
30
  import { ColumnChartSpecModel } from "@/components/data-table/column-summary/chart-spec-model";
30
31
  import { ColumnChartContext } from "@/components/data-table/column-summary/column-summary";
32
+ import { downloadSizeLimitAtom } from "@/components/data-table/download-policy/atoms";
31
33
  import { filtersToFilterGroup } from "@/components/data-table/filters";
32
34
  import { usePanelOwnership } from "@/components/data-table/hooks/use-panel-ownership";
33
35
  import { LoadingTable } from "@/components/data-table/loading-table";
@@ -190,11 +192,11 @@ interface Data<T> {
190
192
  fieldTypes?: FieldTypesWithExternalType | null;
191
193
  freezeColumnsLeft?: string[];
192
194
  freezeColumnsRight?: string[];
195
+ hiddenColumns?: string[];
193
196
  textJustifyColumns?: Record<string, "left" | "center" | "right">;
194
197
  wrappedColumns?: string[];
195
198
  headerTooltip?: Record<string, string>;
196
199
  totalColumns: number;
197
- sizeBytes?: number | null;
198
200
  maxColumns: number | "all";
199
201
  hasStableRowId: boolean;
200
202
  lazy: boolean;
@@ -221,12 +223,14 @@ type DataTableFunctions = {
221
223
  cell_styles?: CellStyleState | null;
222
224
  cell_hover_texts?: Record<string, Record<string, string | null>> | null;
223
225
  raw_data?: TableData<T> | null;
224
- size_bytes?: number | null;
225
226
  }>;
226
227
  get_data_url?: GetDataUrl;
227
228
  get_row_ids?: GetRowIds;
228
229
  calculate_top_k_rows?: CalculateTopKRows;
229
230
  preview_column?: PreviewColumn;
231
+ get_size_bytes: (opts: Record<string, never>) => Promise<{
232
+ size_bytes?: number | null;
233
+ }>;
230
234
  };
231
235
 
232
236
  type S = (number | string | { rowId: string; columnName?: string })[];
@@ -265,6 +269,7 @@ export const DataTablePlugin = createPlugin<S>("marimo-table")
265
269
  rowHeaders: columnToFieldTypesSchema,
266
270
  freezeColumnsLeft: z.array(z.string()).optional(),
267
271
  freezeColumnsRight: z.array(z.string()).optional(),
272
+ hiddenColumns: z.array(z.string()).optional(),
268
273
  textJustifyColumns: z
269
274
  .record(z.string(), z.enum(["left", "center", "right"]))
270
275
  .optional(),
@@ -272,7 +277,6 @@ export const DataTablePlugin = createPlugin<S>("marimo-table")
272
277
  headerTooltip: z.record(z.string(), z.string()).optional(),
273
278
  fieldTypes: columnToFieldTypesSchema.nullish(),
274
279
  totalColumns: z.number(),
275
- sizeBytes: z.number().nullish(),
276
280
  maxColumns: z.union([z.number(), z.literal("all")]).default("all"),
277
281
  hasStableRowId: z.boolean().default(false),
278
282
  maxHeight: z.number().optional(),
@@ -330,7 +334,6 @@ export const DataTablePlugin = createPlugin<S>("marimo-table")
330
334
  .nullable(),
331
335
  cell_hover_texts: cellHoverTextSchema.nullable(),
332
336
  raw_data: z.union([z.string(), z.array(z.looseObject({}))]).nullish(),
333
- size_bytes: z.number().nullish(),
334
337
  }),
335
338
  ),
336
339
  get_row_ids: rpc.input(z.object({}).passthrough()).output(
@@ -362,6 +365,9 @@ export const DataTablePlugin = createPlugin<S>("marimo-table")
362
365
  stats: columnStats.nullable(),
363
366
  }),
364
367
  ),
368
+ get_size_bytes: rpc
369
+ .input(z.object({}))
370
+ .output(z.object({ size_bytes: z.number().nullish() })),
365
371
  })
366
372
  .renderer((props) => {
367
373
  return (
@@ -536,7 +542,6 @@ export const LoadingDataTableComponent = memo(
536
542
  rows: T[];
537
543
  rawRows?: T[];
538
544
  totalRows: number | TooManyRows;
539
- sizeBytes?: number | null;
540
545
  cellStyles: CellStyleState | undefined | null;
541
546
  cellHoverTexts?: Record<string, Record<string, string | null>> | null;
542
547
  }>(async () => {
@@ -553,7 +558,6 @@ export const LoadingDataTableComponent = memo(
553
558
  let tableData = props.data;
554
559
  let rawTableData: TableData<T> | undefined | null = props.rawData;
555
560
  let totalRows = props.totalRows;
556
- let sizeBytes = props.sizeBytes ?? null;
557
561
  let cellStyles = props.cellStyles;
558
562
  let cellHoverTexts = props.cellHoverTexts;
559
563
 
@@ -597,7 +601,6 @@ export const LoadingDataTableComponent = memo(
597
601
  tableData = searchResults.data;
598
602
  rawTableData = searchResults.raw_data;
599
603
  totalRows = searchResults.total_rows;
600
- sizeBytes = searchResults.size_bytes ?? null;
601
604
  cellStyles = searchResults.cell_styles || {};
602
605
  cellHoverTexts = searchResults.cell_hover_texts || {};
603
606
  }
@@ -610,7 +613,6 @@ export const LoadingDataTableComponent = memo(
610
613
  rows: tableData,
611
614
  rawRows: rawData,
612
615
  totalRows: totalRows,
613
- sizeBytes,
614
616
  cellStyles,
615
617
  cellHoverTexts,
616
618
  };
@@ -622,7 +624,6 @@ export const LoadingDataTableComponent = memo(
622
624
  useDeepCompareMemoize(props.fieldTypes),
623
625
  props.data,
624
626
  props.totalRows,
625
- props.sizeBytes,
626
627
  props.lazy,
627
628
  props.cellHoverTexts,
628
629
  props.cellStyles,
@@ -630,6 +631,34 @@ export const LoadingDataTableComponent = memo(
630
631
  paginationState.pageIndex,
631
632
  ]);
632
633
 
634
+ const policy = useAtomValue(downloadSizeLimitAtom);
635
+ const { data: sizeBytesData, isPending: sizeBytesPending } = useAsyncData<
636
+ number | null
637
+ >(async () => {
638
+ if (
639
+ !policy ||
640
+ !props.showDownload ||
641
+ props.lazy ||
642
+ props.totalRows === 0
643
+ ) {
644
+ return null;
645
+ }
646
+ const result = await props.get_size_bytes({});
647
+ return result.size_bytes ?? null;
648
+ }, [
649
+ policy,
650
+ props.showDownload,
651
+ props.get_size_bytes,
652
+ props.lazy,
653
+ props.totalRows,
654
+ searchQuery,
655
+ useDeepCompareMemoize(filters),
656
+ useDeepCompareMemoize(sorting),
657
+ ]);
658
+ const sizeBytes = sizeBytesData ?? null;
659
+ const sizeBytesIsLoading =
660
+ !!policy && props.showDownload && sizeBytesPending;
661
+
633
662
  const getRow = useCallback(
634
663
  async (rowId: number) => {
635
664
  const sortArgs =
@@ -737,7 +766,8 @@ export const LoadingDataTableComponent = memo(
737
766
  setFilters={setFilters}
738
767
  reloading={isFetching && !isPending}
739
768
  totalRows={data?.totalRows ?? props.totalRows}
740
- sizeBytes={data?.sizeBytes ?? props.sizeBytes ?? null}
769
+ sizeBytes={sizeBytes}
770
+ sizeBytesIsLoading={sizeBytesIsLoading}
741
771
  paginationState={paginationState}
742
772
  setPaginationState={setPaginationState}
743
773
  cellStyles={data?.cellStyles ?? props.cellStyles}
@@ -785,6 +815,7 @@ const DataTableComponent = ({
785
815
  rawData,
786
816
  totalRows,
787
817
  sizeBytes,
818
+ sizeBytesIsLoading,
788
819
  maxColumns,
789
820
  pagination,
790
821
  selection,
@@ -814,6 +845,7 @@ const DataTableComponent = ({
814
845
  reloading,
815
846
  freezeColumnsLeft,
816
847
  freezeColumnsRight,
848
+ hiddenColumns,
817
849
  textJustifyColumns,
818
850
  wrappedColumns,
819
851
  headerTooltip,
@@ -835,6 +867,8 @@ const DataTableComponent = ({
835
867
  rawData?: unknown[];
836
868
  columnSummaries?: ColumnSummaries;
837
869
  getRow: (rowIdx: number) => Promise<GetRowResult>;
870
+ sizeBytes?: number | null;
871
+ sizeBytesIsLoading?: boolean;
838
872
  }): JSX.Element => {
839
873
  const id = useId();
840
874
  const [viewedRowIdx, setViewedRowIdx] = useState(0);
@@ -1007,6 +1041,52 @@ const DataTableComponent = ({
1007
1041
  const isInVscode = isInVscodeExtension();
1008
1042
  const isIslandsMode = isIslands();
1009
1043
 
1044
+ const renderTableExplorerPanel = useMemo(() => {
1045
+ if (!isAnyPanelOpen || !(showRowExplorer || canShowColumnExplorer)) {
1046
+ return undefined;
1047
+ }
1048
+ return (table: TanstackTable<unknown>) => (
1049
+ <ContextAwarePanelItem>
1050
+ <TableExplorerPanel
1051
+ rowIdx={viewedRowIdx}
1052
+ setRowIdx={setViewedRow}
1053
+ totalRows={totalRows}
1054
+ fieldTypes={memoizedUnclampedFieldTypes}
1055
+ getRow={getRow}
1056
+ isSelectable={isSelectable}
1057
+ isRowSelected={Boolean(rowSelection[viewedRowIdx])}
1058
+ handleRowSelectionChange={handleRowSelectionChange}
1059
+ previewColumn={preview_column}
1060
+ totalColumns={totalColumns}
1061
+ tableId={id}
1062
+ table={table}
1063
+ showRowExplorer={showRowExplorer && !isInVscode}
1064
+ showColumnExplorer={canShowColumnExplorer && !isInVscode}
1065
+ activeTab={panelType}
1066
+ onTabChange={setPanelType}
1067
+ />
1068
+ </ContextAwarePanelItem>
1069
+ );
1070
+ }, [
1071
+ isAnyPanelOpen,
1072
+ showRowExplorer,
1073
+ canShowColumnExplorer,
1074
+ viewedRowIdx,
1075
+ setViewedRow,
1076
+ totalRows,
1077
+ memoizedUnclampedFieldTypes,
1078
+ getRow,
1079
+ isSelectable,
1080
+ rowSelection,
1081
+ handleRowSelectionChange,
1082
+ preview_column,
1083
+ totalColumns,
1084
+ id,
1085
+ isInVscode,
1086
+ panelType,
1087
+ setPanelType,
1088
+ ]);
1089
+
1010
1090
  return (
1011
1091
  <>
1012
1092
  {/* When the totalRows is "too_many" and the pageSize is the same as the
@@ -1032,28 +1112,6 @@ const DataTableComponent = ({
1032
1112
  </Banner>
1033
1113
  )}
1034
1114
 
1035
- {isAnyPanelOpen && (showRowExplorer || canShowColumnExplorer) && (
1036
- <ContextAwarePanelItem>
1037
- <TableExplorerPanel
1038
- rowIdx={viewedRowIdx}
1039
- setRowIdx={setViewedRow}
1040
- totalRows={totalRows}
1041
- fieldTypes={memoizedUnclampedFieldTypes}
1042
- getRow={getRow}
1043
- isSelectable={isSelectable}
1044
- isRowSelected={Boolean(rowSelection[viewedRowIdx])}
1045
- handleRowSelectionChange={handleRowSelectionChange}
1046
- previewColumn={preview_column}
1047
- totalColumns={totalColumns}
1048
- tableId={id}
1049
- showRowExplorer={showRowExplorer && !isInVscode}
1050
- showColumnExplorer={canShowColumnExplorer && !isInVscode}
1051
- activeTab={panelType}
1052
- onTabChange={setPanelType}
1053
- />
1054
- </ContextAwarePanelItem>
1055
- )}
1056
-
1057
1115
  <ColumnChartContext value={chartSpecModel}>
1058
1116
  <Labeled label={label} align="top" fullWidth={true}>
1059
1117
  <DataTable
@@ -1065,6 +1123,7 @@ const DataTableComponent = ({
1065
1123
  sorting={sorting}
1066
1124
  totalRows={totalRows}
1067
1125
  sizeBytes={sizeBytes}
1126
+ sizeBytesIsLoading={sizeBytesIsLoading}
1068
1127
  totalColumns={totalColumns}
1069
1128
  manualSorting={true}
1070
1129
  setSorting={setSorting}
@@ -1090,6 +1149,7 @@ const DataTableComponent = ({
1090
1149
  onRowSelectionChange={handleRowSelectionChange}
1091
1150
  freezeColumnsLeft={freezeColumnsLeft}
1092
1151
  freezeColumnsRight={freezeColumnsRight}
1152
+ hiddenColumns={hiddenColumns}
1093
1153
  onCellSelectionChange={handleCellSelectionChange}
1094
1154
  getRowIds={get_row_ids}
1095
1155
  toggleDisplayHeader={toggleDisplayHeader}
@@ -1108,6 +1168,7 @@ const DataTableComponent = ({
1108
1168
  isAnyPanelOpen={isAnyPanelOpen}
1109
1169
  viewedRowIdx={viewedRowIdx}
1110
1170
  onViewedRowChange={(rowIdx) => setViewedRowIdx(rowIdx)}
1171
+ renderTableExplorerPanel={renderTableExplorerPanel}
1111
1172
  />
1112
1173
  </Labeled>
1113
1174
  </ColumnChartContext>
@@ -107,6 +107,7 @@ describe("LoadingDataTableComponent", () => {
107
107
  }),
108
108
  get_data_url: vi.fn() as GetDataUrl,
109
109
  get_row_ids: vi.fn() as GetRowIds,
110
+ get_size_bytes: vi.fn().mockResolvedValue({ size_bytes: null }),
110
111
  };
111
112
 
112
113
  const Wrapper = ({ children }: { children: React.ReactNode }) => (
@@ -64,7 +64,6 @@ type PluginFunctions = {
64
64
  column_types_per_step: FieldTypesWithExternalType[];
65
65
  python_code?: string | null;
66
66
  sql_code?: string | null;
67
- size_bytes?: number | null;
68
67
  }>;
69
68
  get_column_values: (req: { column: string }) => Promise<{
70
69
  values: unknown[];
@@ -82,9 +81,11 @@ type PluginFunctions = {
82
81
  }) => Promise<{
83
82
  data: TableData<T>;
84
83
  total_rows: number;
85
- size_bytes?: number | null;
86
84
  }>;
87
85
  download_as: DownloadAsArgs;
86
+ get_size_bytes: (opts: Record<string, never>) => Promise<{
87
+ size_bytes?: number | null;
88
+ }>;
88
89
  };
89
90
 
90
91
  // Value is selection, but it is not currently exposed to the user
@@ -120,7 +121,6 @@ export const DataFramePlugin = createPlugin<S>("marimo-dataframe")
120
121
  column_types_per_step: z.array(columnToFieldTypesSchema),
121
122
  python_code: z.string().nullish(),
122
123
  sql_code: z.string().nullish(),
123
- size_bytes: z.number().nullish(),
124
124
  }),
125
125
  ),
126
126
  get_column_values: rpc.input(z.object({ column: z.string() })).output(
@@ -150,10 +150,12 @@ export const DataFramePlugin = createPlugin<S>("marimo-dataframe")
150
150
  z.object({
151
151
  data: z.union([z.string(), z.array(z.object({}).passthrough())]),
152
152
  total_rows: z.number(),
153
- size_bytes: z.number().nullish(),
154
153
  }),
155
154
  ),
156
155
  download_as: DownloadAsSchema,
156
+ get_size_bytes: rpc
157
+ .input(z.object({}))
158
+ .output(z.object({ size_bytes: z.number().nullish() })),
157
159
  })
158
160
  .renderer((props) => (
159
161
  <TableProviders>
@@ -192,6 +194,7 @@ export const DataFrameComponent = memo(
192
194
  get_column_values,
193
195
  search,
194
196
  download_as,
197
+ get_size_bytes,
195
198
  host,
196
199
  }: DataTableProps): JSX.Element => {
197
200
  const { data, error, isPending } = useAsyncData(
@@ -207,7 +210,6 @@ export const DataFrameComponent = memo(
207
210
  column_types_per_step,
208
211
  python_code,
209
212
  sql_code,
210
- size_bytes,
211
213
  } = data || {};
212
214
 
213
215
  const totalColumns = field_types?.length;
@@ -327,7 +329,6 @@ export const DataFrameComponent = memo(
327
329
  data={url || ""}
328
330
  hasStableRowId={false}
329
331
  totalRows={total_rows ?? 0}
330
- sizeBytes={size_bytes ?? null}
331
332
  totalColumns={totalColumns ?? 0}
332
333
  maxColumns="all"
333
334
  pageSize={pageSize}
@@ -336,6 +337,7 @@ export const DataFrameComponent = memo(
336
337
  rowHeaders={row_headers || Arrays.EMPTY}
337
338
  showDownload={showDownload}
338
339
  download_as={download_as}
340
+ get_size_bytes={get_size_bytes}
339
341
  enableSearch={false}
340
342
  showFilters={false}
341
343
  search={search}
@@ -42,6 +42,7 @@ export const DataFrame: StoryObj = {
42
42
  host={document.body}
43
43
  showDownload={false}
44
44
  download_as={async () => ({ url: "", filename: "" })}
45
+ get_size_bytes={async () => ({ size_bytes: null })}
45
46
  lazy={false}
46
47
  />
47
48
  );