@marimo-team/islands 0.22.1-dev4 → 0.22.1-dev40

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 (483) hide show
  1. package/dist/{ConnectedDataExplorerComponent-Dl1grr8z.js → ConnectedDataExplorerComponent-DuD8BVl6.js} +54 -54
  2. package/dist/{Plot-WhbJAbBh.js → Plot-BxlSHo0G.js} +47 -38
  3. package/dist/_basePickBy-Sow3pJjS.js +41 -0
  4. package/dist/{_baseUniq-B4eL5sTC.js → _baseUniq-C87CckHL.js} +15 -54
  5. package/dist/{any-language-editor-CT_9yBde.js → any-language-editor-BHH_pQ6M.js} +21 -21
  6. package/dist/architecture-7HQA4BMR-BHdkAMvZ.js +6 -0
  7. package/dist/{architectureDiagram-VXUJARFQ-vxgYGIMP.js → architectureDiagram-VXUJARFQ-B3YQo9At.js} +15 -15
  8. package/dist/{arrays-Du-jRBAy.js → arrays-beUWo8RF.js} +1 -1
  9. package/dist/assets/__vite-browser-external-WSlCcXn_.js +1 -0
  10. package/dist/assets/{worker-D10K3OOz.js → worker-DUYMdbtA.js} +2 -2
  11. package/dist/{blockDiagram-VD42YOAC-C7x6YTH7.js → blockDiagram-VD42YOAC-CpQ3TKEN.js} +7 -7
  12. package/dist/{button-qsiIHncQ.js → button-DNlNlZY_.js} +82 -84
  13. package/dist/{c4Diagram-YG6GDRKO-Cx4oseGg.js → c4Diagram-YG6GDRKO-CZSU4uqU.js} +4 -4
  14. package/dist/{capabilities-26mwv03y.js → capabilities-Coe9eM9T.js} +2 -2
  15. package/dist/{channel-C_50jIAn.js → channel-X3JKk8gE.js} +1 -1
  16. package/dist/{chat-ui-CtqUthFR.js → chat-ui-Cel1kBfc.js} +147 -146
  17. package/dist/{check-D_YwHEgY.js → check-CWUkiHmb.js} +1 -1
  18. package/dist/{chunk-4F5CHEZ2-Dvo_CFnR.js → chunk-4F5CHEZ2-D5mClyDv.js} +1 -1
  19. package/dist/{chunk-ABZYJK2D-D5YIs71w.js → chunk-ABZYJK2D-CZYCCtLy.js} +1 -1
  20. package/dist/{chunk-ATLVNIR6-CyOjzOcf.js → chunk-ATLVNIR6-DaOzLLgN.js} +1 -1
  21. package/dist/{chunk-B2363JML-BzZqINRO.js → chunk-B2363JML-Br0eA2T3.js} +1 -1
  22. package/dist/{chunk-B4BG7PRW-ZJeV3KdD.js → chunk-B4BG7PRW-4BjV11Br.js} +4 -4
  23. package/dist/{chunk-DI55MBZ5-Dx_wwX6l.js → chunk-DI55MBZ5-DITY3EyP.js} +4 -4
  24. package/dist/{chunk-EXTU4WIE-CgefpSXQ.js → chunk-EXTU4WIE-jUPSAk3i.js} +1 -1
  25. package/dist/{chunk-FRFDVMJY-Derq8UzY.js → chunk-FRFDVMJY-DnEvEFRR.js} +1 -1
  26. package/dist/{chunk-JA3XYJ7Z-CcIOIFpc.js → chunk-JA3XYJ7Z-BcPEfxk_.js} +2 -2
  27. package/dist/{chunk-JZLCHNYA-CgO0GG1p.js → chunk-JZLCHNYA-2bnLL3xL.js} +4 -4
  28. package/dist/{chunk-N4CR4FBY-2qzGzAxT.js → chunk-N4CR4FBY-CpZSuGSU.js} +5 -5
  29. package/dist/{chunk-PL6DKKU2-KoG71Zin.js → chunk-PL6DKKU2-DnId6G-x.js} +1 -1
  30. package/dist/{chunk-QN33PNHL-Dp1qBo28.js → chunk-QN33PNHL-B9p5ojHB.js} +1 -1
  31. package/dist/{chunk-QXUST7PY-BxmmeIwf.js → chunk-QXUST7PY-Ch6F5Obl.js} +5 -5
  32. package/dist/{chunk-S3R3BYOJ-D3Rys9ZW.js → chunk-S3R3BYOJ-B0UOFJwq.js} +3 -3
  33. package/dist/{chunk-SJTYNZTY-Co-DhKAG.js → chunk-SJTYNZTY-BsBZnJUj.js} +1 -1
  34. package/dist/{chunk-TCCFYFTB-BAhzIqBO.js → chunk-TCCFYFTB-Clbl-fTg.js} +8 -7
  35. package/dist/{chunk-TQ3KTPDO-DxYI735Z.js → chunk-TQ3KTPDO-CFkSQ30e.js} +1 -1
  36. package/dist/{chunk-TZMSLE5B-Dxumt0wv.js → chunk-TZMSLE5B-D45397J2.js} +1 -1
  37. package/dist/{chunk-UMXZTB3W-CuahpKin.js → chunk-UMXZTB3W-D-A834Bq.js} +1 -1
  38. package/dist/{classDiagram-v2-WZHVMYZB-CYoFMQKE.js → classDiagram-2ON5EDUG-C8-zE3Zv.js} +10 -10
  39. package/dist/{classDiagram-2ON5EDUG-DkOvXRlx.js → classDiagram-v2-WZHVMYZB-DrmbGANl.js} +10 -10
  40. package/dist/{clone-DDndUqI0.js → clone-DZFQCtFJ.js} +1 -1
  41. package/dist/{constants-D1Am36hX.js → constants-CvyfaCvs.js} +3 -3
  42. package/dist/{copy-CBo9JcJW.js → copy-B7781WJ3.js} +2 -2
  43. package/dist/{dagre-6UL2VRFP-BXBaU8PB.js → dagre-6UL2VRFP-OMItEBnY.js} +12 -12
  44. package/dist/{dagre-D3dlYz-r.js → dagre-QVd-lCXU.js} +13 -23
  45. package/dist/{data-grid-overlay-editor-nZux6_d2.js → data-grid-overlay-editor-lKF301ME.js} +1 -1
  46. package/dist/{diagram-PSM6KHXK-CJxjk4LG.js → diagram-PSM6KHXK-CkKbohWI.js} +16 -16
  47. package/dist/{diagram-QEK2KX5R-IMILPh_p.js → diagram-QEK2KX5R-DjUMpVcx.js} +14 -14
  48. package/dist/{diagram-S2PKOQOG-6O0g6Boj.js → diagram-S2PKOQOG-b-c0d-wZ.js} +14 -14
  49. package/dist/{dist-BkXs8bw0.js → dist--6TSlp8H.js} +1 -1
  50. package/dist/dist-7K5doRvB.js +6 -0
  51. package/dist/{dist-CQidOwep.js → dist-B43sbpd0.js} +3 -3
  52. package/dist/dist-B6I_A2-E.js +8 -0
  53. package/dist/dist-BEQsmaZY.js +5 -0
  54. package/dist/dist-BasY2RHp.js +8 -0
  55. package/dist/{dist-BemtTYzN.js → dist-Bfp1XXWt.js} +5 -5
  56. package/dist/{dist-v-1kgqZ3.js → dist-BjDuO5JW.js} +1 -1
  57. package/dist/dist-Bosc00dY.js +5 -0
  58. package/dist/{dist-DLNKBPsk.js → dist-BrxqmS9Q.js} +4 -4
  59. package/dist/{dist-DBYL08Lu.js → dist-BvhGByxL.js} +4 -4
  60. package/dist/{dist-CVqlhD3M.js → dist-C4bq5Ioy.js} +2 -2
  61. package/dist/{dist-DwmxBUOe.js → dist-CFKdzOIu.js} +2 -2
  62. package/dist/{dist-5nTQE2yt.js → dist-CIB8w0Fl.js} +2 -2
  63. package/dist/{dist-C-EcLtO9.js → dist-CNF0QBLR.js} +1 -1
  64. package/dist/dist-CQMZOn-_.js +8 -0
  65. package/dist/dist-CViQhWZ8.js +5 -0
  66. package/dist/{dist-Dg65j0em.js → dist-CcMfr7jD.js} +1 -1
  67. package/dist/{dist-C0XYIHKJ.js → dist-Ci0CXEFt.js} +1 -1
  68. package/dist/dist-Cz6rLfwY.js +5 -0
  69. package/dist/dist-D8eq8st3.js +6 -0
  70. package/dist/{dist-qoCY8giM.js → dist-DAfcmt-d.js} +2 -2
  71. package/dist/{dist-B6Op2ogv.js → dist-DD_cYHOl.js} +2 -2
  72. package/dist/{dist-BUSLKXcu.js → dist-DFK94vuS.js} +2 -2
  73. package/dist/{dist-DBXPlQ0D.js → dist-DGNtjMZu.js} +1 -1
  74. package/dist/{dist-C9qF7MRB.js → dist-DJ9F1eHs.js} +2 -2
  75. package/dist/{dist-Ci_jEudG.js → dist-DJKubHDd.js} +1 -1
  76. package/dist/{dist-CnFp2Kcl.js → dist-DLafRu9s.js} +2 -2
  77. package/dist/dist-DM1UDXdl.js +5 -0
  78. package/dist/dist-DNrtWPgS.js +5 -0
  79. package/dist/dist-D_UjpfOY.js +1381 -0
  80. package/dist/{dist-DmFS6KZW.js → dist-DbnBiLNH.js} +3 -3
  81. package/dist/{dist-BiZZAo22.js → dist-DlSUOIm9.js} +1 -1
  82. package/dist/{dist-DStU8He1.js → dist-Doy0mQDg.js} +2 -2
  83. package/dist/{dist-CxAX99oC.js → dist-DpkJHKB8.js} +2 -2
  84. package/dist/{dist-DjaZNkZ7.js → dist-LhQNUe5A.js} +3 -3
  85. package/dist/dist-V7q2qnpA.js +5 -0
  86. package/dist/{dist-BJ3fhRYu.js → dist-VqF3W_ue.js} +2 -2
  87. package/dist/dist-a5_hPgu2.js +8 -0
  88. package/dist/{dist-B9KLrfoh.js → dist-ej6AQKaS.js} +1 -1
  89. package/dist/{dist-Brb6VNc4.js → dist-m9tsXsFf.js} +2 -2
  90. package/dist/{dist-CBwMSFDu.js → dist-tGk0aZ--.js} +2 -2
  91. package/dist/dist-uVyZcV1-.js +5 -0
  92. package/dist/{erDiagram-Q2GNP2WA-sho7Cl9f.js → erDiagram-Q2GNP2WA-CDhLaOZ1.js} +10 -10
  93. package/dist/{error-banner-Bx9kIgrs.js → error-banner-Cjf0RU9I.js} +79 -79
  94. package/dist/{esm-CMg2ABu6.js → esm-4wmsH2lp.js} +6 -6
  95. package/dist/{esm-cqK9POGH.js → esm-CD1iby2n.js} +23 -23
  96. package/dist/{flowDiagram-NV44I4VS-C4nY4Fbz.js → flowDiagram-NV44I4VS-BDi4O4CL.js} +10 -10
  97. package/dist/{ganttDiagram-JELNMOA3-CtxNcCM2.js → ganttDiagram-JELNMOA3-BpZE6kVp.js} +3 -3
  98. package/dist/{gitGraph-G5XIXVHT-SL6TDof6.js → gitGraph-G5XIXVHT-B_c6xFJv.js} +3 -3
  99. package/dist/{gitGraphDiagram-V2S2FVAM-D9885mxd.js → gitGraphDiagram-V2S2FVAM-iQnXzbPM.js} +13 -13
  100. package/dist/{glide-data-editor-CkVEV-Gk.js → glide-data-editor-BqnvTmDo.js} +1739 -1708
  101. package/dist/{graphlib-CxWdvYQt.js → graphlib-BV1_gi0C.js} +4 -3
  102. package/dist/hasIn-DnfJcYpY.js +108 -0
  103. package/dist/{info-VBDWY6EO-6MXPTSmi.js → info-VBDWY6EO-BTyzxmhr.js} +3 -3
  104. package/dist/{infoDiagram-HS3SLOUP-Bw2FlRwF.js → infoDiagram-HS3SLOUP-OYrX6uO3.js} +13 -13
  105. package/dist/{input-BSde8uV4.js → input-CFY9gApZ.js} +5055 -5055
  106. package/dist/{isEmpty-BQtUinxJ.js → isEmpty-B7FX9wKt.js} +1 -1
  107. package/dist/{isSymbol-DFp8040B.js → isSymbol-DCbjQG_U.js} +1 -1
  108. package/dist/{journeyDiagram-XKPGCS4Q-BXlCEth8.js → journeyDiagram-XKPGCS4Q-ClPC94aN.js} +3 -3
  109. package/dist/{kanban-definition-3W4ZIXB7-CorxzSYm.js → kanban-definition-3W4ZIXB7-DHEAKdZt.js} +7 -7
  110. package/dist/{label-DTNqw9tv.js → label-DbZGAoCH.js} +538 -569
  111. package/dist/{loader-3c9hT4kT.js → loader-Bd1kgLn7.js} +19 -16
  112. package/dist/main.js +3203 -3105
  113. package/dist/{memoize-CuHciEBb.js → memoize-CSTI9eOX.js} +1 -1
  114. package/dist/{merge-CA_buyY3.js → merge-CVhG7q_o.js} +1 -1
  115. package/dist/{mermaid-CEKslOkI.js → mermaid-B2HDLx2g.js} +54 -54
  116. package/dist/{mermaid-parser.core-cq4YDee-.js → mermaid-parser.core-ntCgyx0x.js} +8 -8
  117. package/dist/min-Ds3gG0Ff.js +96 -0
  118. package/dist/{mindmap-definition-VGOIOE7T-DRsT8UaN.js → mindmap-definition-VGOIOE7T-CxEUZZvY.js} +9 -9
  119. package/dist/{now-CXAdKY5k.js → now-nrrrOr01.js} +1 -1
  120. package/dist/{once-CZno0h-b.js → once-C_TIu-kR.js} +1 -1
  121. package/dist/{packet-DYOGHKS2-Dw08gMaZ.js → packet-DYOGHKS2-BhvnpoGi.js} +3 -3
  122. package/dist/{pie-VRWISCQL-C5SPSvT8.js → pie-VRWISCQL-dILuA3iG.js} +3 -3
  123. package/dist/{pieDiagram-ADFJNKIX-DhJ1Cx2O.js → pieDiagram-ADFJNKIX-U3LrUqAS.js} +14 -14
  124. package/dist/{process-output-KyzWazB-.js → process-output-DC1TOnIl.js} +3184 -3207
  125. package/dist/{quadrantDiagram-AYHSOK5B-DXUFIWlz.js → quadrantDiagram-AYHSOK5B-BVWuq-3R.js} +2 -2
  126. package/dist/{radar-ZZBFDIW7-BvY0bgSg.js → radar-ZZBFDIW7-DwFrOJDj.js} +3 -3
  127. package/dist/range-fJeId9Ri.js +30 -0
  128. package/dist/{requirementDiagram-UZGBJVZJ-DO_gtQIb.js → requirementDiagram-UZGBJVZJ-D0zpQnKC.js} +9 -9
  129. package/dist/{sankeyDiagram-TZEHDZUN-OZzXEkuG.js → sankeyDiagram-TZEHDZUN-CExy1joT.js} +2 -2
  130. package/dist/{sequenceDiagram-WL72ISMW-K7nZRifV.js → sequenceDiagram-WL72ISMW-D1BJxLjH.js} +4 -4
  131. package/dist/{slides-component-CIcSvFh7.js → slides-component-CX2JC-Ws.js} +2 -2
  132. package/dist/{spec-DYaR1rJh.js → spec-CD7QaCV-.js} +3 -3
  133. package/dist/{stateDiagram-FKZM4ZOC-DzXJZAq7.js → stateDiagram-FKZM4ZOC-B1S8jGMn.js} +12 -12
  134. package/dist/{stateDiagram-v2-4FDKWEC3-BZBPUmyF.js → stateDiagram-v2-4FDKWEC3-BH5ozUbc.js} +10 -10
  135. package/dist/stex-CQDv3aS8.js +4 -0
  136. package/dist/style.css +1 -1
  137. package/dist/{timeline-definition-IT6M3QCI-DNoLAh-i.js → timeline-definition-IT6M3QCI-BDT9JAmn.js} +2 -2
  138. package/dist/{toDate-D6VXexnV.js → toDate-CUqpEbBS.js} +5 -5
  139. package/dist/{toNumber-xFPoy1OI.js → toNumber-55tjPCWr.js} +2 -2
  140. package/dist/tooltip-BXEpXV3R.js +404 -0
  141. package/dist/{treemap-GDKQZRPO-C5OoxpmV.js → treemap-GDKQZRPO-bx2ngsgN.js} +3 -3
  142. package/dist/{types-CQ-RbYxp.js → types-D_ntCXg0.js} +3 -3
  143. package/dist/{useAsyncData-Cd4Urlww.js → useAsyncData-rN1nzPaS.js} +2 -2
  144. package/dist/{useDeepCompareMemoize-X7clcrcQ.js → useDeepCompareMemoize-Ch-7Rk2x.js} +4 -4
  145. package/dist/{useIframeCapabilities-BVQrlRBd.js → useIframeCapabilities-CqhrVue6.js} +1 -1
  146. package/dist/useLifecycle-4fA1pHoh.js +177 -0
  147. package/dist/{useTheme-Dm1WaAGy.js → useTheme-MWfxn4oz.js} +4 -5
  148. package/dist/{vega-component-A6unyUJS.js → vega-component-CPhNLfZZ.js} +25 -25
  149. package/dist/{xychartDiagram-PRI3JC2R-ehVeySMW.js → xychartDiagram-PRI3JC2R-CuAZiqHS.js} +5 -5
  150. package/dist/{Combination-B--d1_LV.js → zod-C6UGQ3fz.js} +8085 -8151
  151. package/package.json +8 -41
  152. package/src/__mocks__/common.ts +4 -4
  153. package/src/__tests__/main.test.tsx +12 -14
  154. package/src/components/ai/ai-provider-icon.tsx +3 -2
  155. package/src/components/app-config/user-config-form.tsx +0 -27
  156. package/src/components/chat/acp/agent-docs.tsx +3 -3
  157. package/src/components/chat/acp/agent-panel.tsx +71 -24
  158. package/src/components/chat/acp/agent-selector.tsx +2 -11
  159. package/src/components/chat/acp/state.ts +15 -3
  160. package/src/components/chat/chat-history-popover.tsx +1 -1
  161. package/src/components/chat/chat-panel.tsx +2 -1
  162. package/src/components/data-table/TableBottomBar.tsx +12 -1
  163. package/src/components/data-table/TableTopBar.tsx +31 -35
  164. package/src/components/data-table/__tests__/columns.test.tsx +7 -7
  165. package/src/components/data-table/cell-hover-template/types.ts +1 -1
  166. package/src/components/data-table/cell-hover-text/types.ts +1 -1
  167. package/src/components/data-table/cell-selection/__tests__/feature.test.ts +1 -1
  168. package/src/components/data-table/cell-selection/types.ts +4 -3
  169. package/src/components/data-table/cell-styling/types.ts +1 -1
  170. package/src/components/data-table/charts/chart-spec/altair-generator.ts +2 -2
  171. package/src/components/data-table/charts/charts.tsx +42 -13
  172. package/src/components/data-table/charts/components/chart-items.tsx +1 -1
  173. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
  174. package/src/components/data-table/column-formatting/types.ts +5 -4
  175. package/src/components/data-table/column-header.tsx +4 -2
  176. package/src/components/data-table/column-summary/legacy-chart-spec.ts +1 -1
  177. package/src/components/data-table/column-wrapping/types.ts +4 -3
  178. package/src/components/data-table/columns.tsx +4 -1
  179. package/src/components/data-table/copy-column/types.ts +4 -3
  180. package/src/components/data-table/data-table.tsx +16 -11
  181. package/src/components/data-table/focus-row/types.ts +4 -3
  182. package/src/components/data-table/loading-table.tsx +5 -2
  183. package/src/components/data-table/pagination.tsx +1 -1
  184. package/src/components/data-table/range-focus/__tests__/atoms.test.ts +13 -13
  185. package/src/components/data-table/range-focus/__tests__/use-cell-range-selection.test.ts +9 -11
  186. package/src/components/data-table/range-focus/atoms.ts +2 -2
  187. package/src/components/data-table/range-focus/cell-selection-stats.tsx +3 -1
  188. package/src/components/data-table/row-viewer-panel/row-viewer.tsx +1 -1
  189. package/src/components/data-table/table-explorer-panel/table-explorer-panel.tsx +2 -2
  190. package/src/components/dependency-graph/dependency-graph-tree.tsx +1 -1
  191. package/src/components/editor/__tests__/data-attributes.test.tsx +93 -94
  192. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +1 -1
  193. package/src/components/editor/actions/name-cell-input.tsx +4 -2
  194. package/src/components/editor/actions/pair-with-agent-modal.tsx +142 -0
  195. package/src/components/editor/actions/useCellActionButton.tsx +4 -2
  196. package/src/components/editor/actions/useNotebookActions.tsx +10 -0
  197. package/src/components/editor/ai/add-cell-with-ai.tsx +2 -1
  198. package/src/components/editor/ai/ai-completion-editor.tsx +1 -1
  199. package/src/components/editor/app-container.tsx +1 -1
  200. package/src/components/editor/cell/CellStatus.tsx +4 -5
  201. package/src/components/editor/cell/cell-context-menu.tsx +4 -2
  202. package/src/components/editor/cell/code/cell-editor.tsx +3 -2
  203. package/src/components/editor/cell/toolbar.tsx +2 -1
  204. package/src/components/editor/chrome/components/contribute-snippet-button.tsx +4 -1
  205. package/src/components/editor/chrome/components/feedback-button.tsx +4 -1
  206. package/src/components/editor/chrome/panels/context-aware-panel/context-aware-panel.tsx +1 -1
  207. package/src/components/editor/chrome/panels/empty-state.tsx +1 -0
  208. package/src/components/editor/chrome/panels/file-explorer-panel.tsx +0 -10
  209. package/src/components/editor/chrome/panels/snippets-panel.tsx +1 -1
  210. package/src/components/editor/chrome/panels/write-secret-modal.tsx +1 -1
  211. package/src/components/editor/chrome/wrapper/app-chrome.tsx +4 -1
  212. package/src/components/editor/chrome/wrapper/footer-items/lsp-status.tsx +2 -1
  213. package/src/components/editor/chrome/wrapper/storage.ts +2 -2
  214. package/src/components/editor/connections/database/as-code.ts +1 -1
  215. package/src/components/editor/connections/form-renderers.tsx +1 -1
  216. package/src/components/editor/connections/storage/as-code.ts +1 -1
  217. package/src/components/editor/controls/keyboard-shortcuts.tsx +1 -1
  218. package/src/components/editor/header/filename-input.tsx +4 -1
  219. package/src/components/editor/links/cell-link-list.tsx +1 -1
  220. package/src/components/editor/navigation/__tests__/navigation.test.ts +1 -1
  221. package/src/components/editor/navigation/clipboard.ts +1 -1
  222. package/src/components/editor/navigation/multi-cell-action-toolbar.tsx +2 -2
  223. package/src/components/editor/navigation/navigation.ts +3 -3
  224. package/src/components/editor/notebook-cell.tsx +1 -1
  225. package/src/components/editor/output/JsonOutput.tsx +6 -6
  226. package/src/components/editor/output/ansi-reduce.ts +2 -2
  227. package/src/components/editor/output/console/ConsoleOutput.tsx +2 -2
  228. package/src/components/editor/renderers/cells-renderer.tsx +1 -1
  229. package/src/components/editor/renderers/grid-layout/grid-layout.tsx +1 -1
  230. package/src/components/editor/renderers/plugins.ts +1 -1
  231. package/src/components/editor/renderers/slides-layout/types.ts +2 -2
  232. package/src/components/editor/renderers/vertical-layout/__tests__/useFocusFirstEditor.test.ts +2 -2
  233. package/src/components/editor/renderers/vertical-layout/__tests__/vertical-layout.test.ts +1 -1
  234. package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +12 -13
  235. package/src/components/find-replace/find-replace.tsx +3 -1
  236. package/src/components/forms/form.tsx +1 -1
  237. package/src/components/forms/options.ts +1 -1
  238. package/src/components/pages/gallery-page.tsx +1 -1
  239. package/src/components/static-html/static-banner.tsx +2 -2
  240. package/src/components/storage/__tests__/storage-snippets.test.ts +4 -6
  241. package/src/components/terminal/terminal.tsx +4 -4
  242. package/src/components/tracing/tracing.test.tsx +30 -30
  243. package/src/components/ui/accordion.tsx +1 -1
  244. package/src/components/ui/alert-dialog.tsx +1 -1
  245. package/src/components/ui/badge.tsx +2 -1
  246. package/src/components/ui/button.tsx +5 -4
  247. package/src/components/ui/calendar.tsx +3 -2
  248. package/src/components/ui/checkbox.tsx +1 -1
  249. package/src/components/ui/combobox.tsx +2 -1
  250. package/src/components/ui/command.tsx +5 -2
  251. package/src/components/ui/context-menu.tsx +1 -1
  252. package/src/components/ui/date-input.tsx +7 -6
  253. package/src/components/ui/date-picker.tsx +6 -4
  254. package/src/components/ui/dialog.tsx +1 -1
  255. package/src/components/ui/draggable-popover.tsx +1 -1
  256. package/src/components/ui/dropdown-menu.tsx +2 -1
  257. package/src/components/ui/field.tsx +1 -2
  258. package/src/components/ui/form.tsx +4 -5
  259. package/src/components/ui/fullscreen.tsx +4 -1
  260. package/src/components/ui/label.tsx +1 -1
  261. package/src/components/ui/navigation.tsx +1 -1
  262. package/src/components/ui/popover.tsx +1 -1
  263. package/src/components/ui/progress.tsx +4 -3
  264. package/src/components/ui/query-param-preserving-link.tsx +4 -2
  265. package/src/components/ui/radio-group.tsx +1 -1
  266. package/src/components/ui/range-slider.tsx +1 -1
  267. package/src/components/ui/scroll-area.tsx +1 -1
  268. package/src/components/ui/select.tsx +1 -1
  269. package/src/components/ui/sheet.tsx +3 -2
  270. package/src/components/ui/slider.tsx +1 -1
  271. package/src/components/ui/switch.tsx +1 -1
  272. package/src/components/ui/tabs.tsx +1 -1
  273. package/src/components/ui/textarea.tsx +1 -2
  274. package/src/components/ui/toast.tsx +1 -1
  275. package/src/components/ui/toggle.tsx +1 -1
  276. package/src/components/ui/tooltip.tsx +1 -1
  277. package/src/components/variables/variables-table.tsx +1 -1
  278. package/src/core/ai/context/providers/__tests__/datasource.test.ts +1 -1
  279. package/src/core/ai/context/providers/__tests__/error.test.ts +1 -1
  280. package/src/core/ai/context/providers/__tests__/variable.test.ts +1 -1
  281. package/src/core/ai/context/providers/cell-output.ts +1 -2
  282. package/src/core/ai/context/registry.ts +2 -2
  283. package/src/core/ai/tools/edit-notebook-tool.ts +4 -3
  284. package/src/core/ai/tools/registry.ts +1 -1
  285. package/src/core/ai/tools/run-cells-tool.ts +4 -3
  286. package/src/core/cells/__tests__/add-missing-import.test.ts +23 -22
  287. package/src/core/cells/__tests__/cell.test.ts +14 -13
  288. package/src/core/cells/__tests__/cells.test.ts +2 -2
  289. package/src/core/cells/__tests__/scrollCellIntoView.test.ts +1 -1
  290. package/src/core/cells/__tests__/session.test.ts +1 -1
  291. package/src/core/cells/__tests__/utils.test.ts +1 -1
  292. package/src/core/cells/cells.ts +2 -2
  293. package/src/core/cells/ids.ts +1 -1
  294. package/src/core/cells/logs.ts +1 -1
  295. package/src/core/codemirror/ai/request.ts +1 -1
  296. package/src/core/codemirror/cells/__tests__/extensions.test.ts +15 -17
  297. package/src/core/codemirror/cells/traceback-decorations.ts +1 -1
  298. package/src/core/codemirror/copilot/__tests__/language-server.test.ts +1 -1
  299. package/src/core/codemirror/copilot/__tests__/transport.test.ts +129 -3
  300. package/src/core/codemirror/copilot/client.ts +9 -2
  301. package/src/core/codemirror/copilot/getCodes.ts +1 -1
  302. package/src/core/codemirror/copilot/language-server.ts +12 -1
  303. package/src/core/codemirror/copilot/transport.ts +34 -8
  304. package/src/core/codemirror/copilot/types.ts +1 -1
  305. package/src/core/codemirror/facet.ts +1 -1
  306. package/src/core/codemirror/language/__tests__/sql.test.ts +4 -4
  307. package/src/core/codemirror/language/languages/markdown.ts +1 -3
  308. package/src/core/codemirror/language/languages/python.ts +4 -0
  309. package/src/core/codemirror/language/languages/sql/completion-builder.ts +1 -1
  310. package/src/core/codemirror/language/languages/sql/completion-sources.tsx +4 -6
  311. package/src/core/codemirror/language/languages/sql/sql.ts +1 -3
  312. package/src/core/codemirror/language/metadata.ts +1 -1
  313. package/src/core/codemirror/language/panel/sql.tsx +4 -1
  314. package/src/core/codemirror/language/types.ts +1 -1
  315. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +1 -1
  316. package/src/core/codemirror/lsp/notebook-lsp.ts +1 -1
  317. package/src/core/codemirror/misc/__tests__/dnd.test.ts +1 -1
  318. package/src/core/codemirror/reactive-references/__tests__/analyzer.test.ts +28 -42
  319. package/src/core/codemirror/rtc/loro/awareness.ts +1 -1
  320. package/src/core/config/__tests__/config-schema.test.ts +2 -6
  321. package/src/core/config/config-schema.ts +0 -1
  322. package/src/core/config/feature-flag.tsx +1 -3
  323. package/src/core/datasets/data-source-connections.ts +4 -2
  324. package/src/core/datasets/state.ts +1 -1
  325. package/src/core/dom/__tests__/htmlUtils.test.ts +8 -14
  326. package/src/core/dom/__tests__/outline.test.ts +2 -3
  327. package/src/core/dom/outline.ts +1 -1
  328. package/src/core/edit-app.tsx +4 -1
  329. package/src/core/export/__tests__/hooks.test.ts +1 -1
  330. package/src/core/hotkeys/__tests__/hotkeys.test.ts +1 -1
  331. package/src/core/hotkeys/shortcuts.ts +1 -1
  332. package/src/core/islands/__tests__/bridge.test.ts +2 -2
  333. package/src/core/islands/__tests__/parse.test.ts +8 -7
  334. package/src/core/islands/bridge.ts +2 -2
  335. package/src/core/islands/components/output-wrapper.tsx +1 -1
  336. package/src/core/islands/parse.ts +1 -1
  337. package/src/core/lsp/__tests__/transport.test.ts +1 -1
  338. package/src/core/network/CachingRequestRegistry.ts +1 -1
  339. package/src/core/network/DeferredRequestRegistry.ts +1 -1
  340. package/src/core/network/__tests__/requests-network.test.ts +1 -1
  341. package/src/core/network/api.ts +2 -2
  342. package/src/core/network/requests-lazy.ts +1 -1
  343. package/src/core/network/requests-toasting.tsx +1 -1
  344. package/src/core/runtime/runtime.ts +1 -0
  345. package/src/core/saving/__tests__/filename.test.ts +7 -6
  346. package/src/core/static/__tests__/download-html.test.ts +16 -15
  347. package/src/core/static/__tests__/files.test.ts +30 -28
  348. package/src/core/static/files.ts +1 -1
  349. package/src/core/vscode/vscode-bindings.ts +1 -1
  350. package/src/core/wasm/bridge.ts +3 -3
  351. package/src/core/wasm/worker/tracer.ts +1 -1
  352. package/src/core/websocket/useWebSocket.tsx +5 -3
  353. package/src/css/app/Cell.css +25 -1
  354. package/src/css/globals.css +18 -16
  355. package/src/css/table.css +17 -0
  356. package/src/custom.d.ts +1 -1
  357. package/src/hooks/__tests__/useDuplicateShortcuts.test.ts +3 -3
  358. package/src/hooks/debug.ts +3 -3
  359. package/src/hooks/useDebounce.ts +1 -1
  360. package/src/hooks/useEventListener.ts +1 -1
  361. package/src/hooks/useHotkey.ts +1 -1
  362. package/src/hooks/useLifecycle.ts +2 -2
  363. package/src/hooks/useNonce.ts +1 -1
  364. package/src/hooks/useResizeObserver.ts +2 -2
  365. package/src/main.tsx +1 -1
  366. package/src/plugins/core/BadPlugin.tsx +7 -6
  367. package/src/plugins/core/RenderHTML.tsx +3 -3
  368. package/src/plugins/core/__test__/registerReactComponent.test.ts +1 -1
  369. package/src/plugins/core/registerReactComponent.tsx +4 -4
  370. package/src/plugins/core/rpc.ts +1 -1
  371. package/src/plugins/impl/CheckboxPlugin.tsx +4 -1
  372. package/src/plugins/impl/DataEditorPlugin.tsx +8 -3
  373. package/src/plugins/impl/DataTablePlugin.tsx +6 -2
  374. package/src/plugins/impl/FileBrowserPlugin.tsx +1 -1
  375. package/src/plugins/impl/FormPlugin.tsx +2 -3
  376. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +4 -1
  377. package/src/plugins/impl/__tests__/MatrixPlugin.test.tsx +1 -1
  378. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +43 -15
  379. package/src/plugins/impl/anywidget/AnyWidgetPlugin.tsx +3 -12
  380. package/src/plugins/impl/anywidget/__tests__/model.test.ts +2 -2
  381. package/src/plugins/impl/anywidget/model.ts +1 -1
  382. package/src/plugins/impl/anywidget/types.ts +2 -2
  383. package/src/plugins/impl/anywidget/widget-binding.ts +1 -1
  384. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  385. package/src/plugins/impl/chat/chat-ui.tsx +5 -2
  386. package/src/plugins/impl/data-editor/glide-data-editor.tsx +2 -2
  387. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +2 -2
  388. package/src/plugins/impl/data-explorer/components/query-form.tsx +1 -1
  389. package/src/plugins/impl/data-explorer/functions/function.ts +1 -1
  390. package/src/plugins/impl/data-explorer/queries/types.ts +1 -1
  391. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -1
  392. package/src/plugins/impl/data-frames/forms/__tests__/form.test.tsx +7 -9
  393. package/src/plugins/impl/data-frames/forms/renderers.tsx +1 -1
  394. package/src/plugins/impl/data-frames/utils/operators.ts +1 -1
  395. package/src/plugins/impl/matplotlib/MatplotlibPlugin.tsx +1 -1
  396. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +1 -1
  397. package/src/plugins/impl/panel/PanelPlugin.tsx +2 -2
  398. package/src/plugins/impl/plotly/Plot.tsx +3 -3
  399. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +65 -103
  400. package/src/plugins/impl/plotly/__tests__/PlotlyPlugin.test.tsx +114 -0
  401. package/src/plugins/impl/plotly/__tests__/selection.test.ts +199 -0
  402. package/src/plugins/impl/plotly/selection.ts +333 -0
  403. package/src/plugins/impl/vega/__tests__/make-selectable.test.ts +13 -14
  404. package/src/plugins/impl/vega/__tests__/utils.test.ts +68 -0
  405. package/src/plugins/impl/vega/batched.ts +1 -1
  406. package/src/plugins/impl/vega/make-selectable.ts +3 -3
  407. package/src/plugins/impl/vega/types.ts +1 -1
  408. package/src/plugins/impl/vega/utils.ts +14 -5
  409. package/src/plugins/impl/vega/vega.css +2 -1
  410. package/src/plugins/layout/DownloadPlugin.tsx +1 -1
  411. package/src/plugins/layout/ImageComparisonPlugin.tsx +1 -3
  412. package/src/plugins/layout/LazyPlugin.tsx +1 -1
  413. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  414. package/src/plugins/layout/mermaid/mermaid.tsx +1 -1
  415. package/src/plugins/plugins.ts +1 -1
  416. package/src/plugins/stateless-plugin.ts +4 -2
  417. package/src/stories/data-explorer.stories.tsx +1 -1
  418. package/src/stories/dataframe.stories.tsx +1 -1
  419. package/src/stories/editor.stories.tsx +1 -1
  420. package/src/stories/select.stories.tsx +1 -1
  421. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  422. package/src/utils/Logger.ts +1 -1
  423. package/src/utils/__tests__/arrays.test.ts +1 -1
  424. package/src/utils/__tests__/blob.test.ts +1 -1
  425. package/src/utils/__tests__/cell-urls.test.ts +24 -21
  426. package/src/utils/__tests__/dates.test.ts +1 -1
  427. package/src/utils/__tests__/errors.test.ts +1 -1
  428. package/src/utils/__tests__/filenames.test.ts +15 -14
  429. package/src/utils/__tests__/json-parser.test.ts +14 -21
  430. package/src/utils/__tests__/multi-map.test.ts +3 -3
  431. package/src/utils/__tests__/objects.test.ts +3 -3
  432. package/src/utils/__tests__/path.test.ts +34 -31
  433. package/src/utils/__tests__/urls.test.ts +19 -18
  434. package/src/utils/__tests__/versions.test.ts +5 -5
  435. package/src/utils/__tests__/waitForWs.test.ts +1 -1
  436. package/src/utils/arrays.ts +2 -2
  437. package/src/utils/assertNever.ts +1 -1
  438. package/src/utils/batch-requests.ts +2 -2
  439. package/src/utils/createReducer.ts +2 -2
  440. package/src/utils/id-tree.tsx +2 -2
  441. package/src/utils/idle.ts +1 -1
  442. package/src/utils/invariant.ts +1 -2
  443. package/src/utils/json/base64.ts +2 -5
  444. package/src/utils/maps.ts +1 -1
  445. package/src/utils/math.ts +0 -1
  446. package/src/utils/mime-types.ts +1 -1
  447. package/src/utils/multi-map.ts +1 -1
  448. package/src/utils/objects.ts +1 -1
  449. package/src/utils/once.ts +2 -2
  450. package/src/utils/staticImplements.ts +1 -1
  451. package/src/utils/storage/jotai.ts +1 -1
  452. package/src/utils/tracer.ts +3 -2
  453. package/dist/_basePickBy-QjOmBDRE.js +0 -110
  454. package/dist/_baseSet-xgn1IbGV.js +0 -27
  455. package/dist/architecture-7HQA4BMR-BRyVh_Za.js +0 -6
  456. package/dist/assets/__vite-browser-external-Us1ds95c.js +0 -1
  457. package/dist/dist-B0R_ZM4-.js +0 -6
  458. package/dist/dist-B4a9_9pj.js +0 -5
  459. package/dist/dist-BCSUKEwO.js +0 -5
  460. package/dist/dist-BONIDQq6.js +0 -5
  461. package/dist/dist-BYeRx2hb.js +0 -5
  462. package/dist/dist-D2Rk1j4R.js +0 -1381
  463. package/dist/dist-DZjX5TYv.js +0 -5
  464. package/dist/dist-Dkw9x6kc.js +0 -5
  465. package/dist/dist-Ds6UaXGR.js +0 -6
  466. package/dist/dist-KuEJ1Q53.js +0 -8
  467. package/dist/dist-S72WNyTZ.js +0 -5
  468. package/dist/dist-bTG-yssT.js +0 -5
  469. package/dist/dist-diF0sguc.js +0 -8
  470. package/dist/dist-mJ84BIgu.js +0 -8
  471. package/dist/dist-wSIhFWQz.js +0 -8
  472. package/dist/get-CqrzlV1v.js +0 -68
  473. package/dist/range-CYz5jI--.js +0 -17
  474. package/dist/stex-CZyTRGVB.js +0 -4
  475. package/dist/tooltip-DGHTbHl5.js +0 -404
  476. package/dist/useLifecycle-Dids8BPm.js +0 -173
  477. /package/dist/{dist-KZI_BHqV.js → dist-CxZvoNao.js} +0 -0
  478. /package/dist/{invariant-D4hPsZFI.js → invariant-e8eBgdux.js} +0 -0
  479. /package/dist/{isArrayLikeObject-C-hFPChh.js → isArrayLikeObject-LXbTYiBa.js} +0 -0
  480. /package/dist/{main-CvkAPtaq.js → main-XimWhSi_.js} +0 -0
  481. /package/dist/{purify.es-ukiMXY-F.js → purify.es-hTCfRGdl.js} +0 -0
  482. /package/dist/{react-dom-BKwCWYPW.js → react-dom-BSUuJjCR.js} +0 -0
  483. /package/dist/{stex-Ze8D4R_5.js → stex-D887Ylhf.js} +0 -0
@@ -69,43 +69,39 @@ export const TableTopBar: React.FC<TableTopBarProps> = ({
69
69
  }
70
70
 
71
71
  return (
72
- <div className="flex items-center h-10 px-2 border-b gap-3">
73
- {/* always-visible search */}
72
+ <div className="flex items-center h-10 px-2 border-b gap-2">
74
73
  {onSearchQueryChange && enableSearch && (
75
- <div className="flex items-center">
76
- <div className="flex items-center gap-1 rounded-full border px-2 w-56">
77
- <SearchIcon className="w-4 h-4 text-muted-foreground shrink-0" />
78
- <input
79
- ref={inputRef}
80
- type="text"
81
- className="h-6 border-none bg-transparent focus:outline-hidden text-sm w-full min-w-0"
82
- value={internalValue}
83
- onKeyDown={(e) => {
84
- if (e.key === "Escape") {
85
- setInternalValue("");
86
- inputRef.current?.blur();
87
- }
88
- }}
89
- onChange={(e) => setInternalValue(e.target.value)}
90
- placeholder="Search..."
91
- />
92
- {reloading && <Spinner size="small" />}
93
- {internalValue && (
94
- <Button
95
- variant="text"
96
- size="xs"
97
- className="h-5 w-5 p-0 shrink-0"
98
- onClick={() => setInternalValue("")}
99
- >
100
- <XIcon className="w-3 h-3 text-muted-foreground" />
101
- </Button>
102
- )}
103
- </div>
74
+ <div className="flex flex-1 items-center gap-1 px-2 rounded-sm focus-within:ring-1 focus-within:ring-border transition-shadow">
75
+ <SearchIcon className="w-4 h-4 text-muted-foreground shrink-0" />
76
+ <input
77
+ ref={inputRef}
78
+ type="text"
79
+ className="h-6 border-none bg-transparent focus:outline-hidden text-sm w-full min-w-0"
80
+ value={internalValue}
81
+ onKeyDown={(e) => {
82
+ if (e.key === "Escape") {
83
+ setInternalValue("");
84
+ inputRef.current?.blur();
85
+ }
86
+ }}
87
+ onChange={(e) => setInternalValue(e.target.value)}
88
+ placeholder="Search..."
89
+ />
90
+ {reloading && <Spinner size="small" />}
91
+ {internalValue && (
92
+ <Button
93
+ variant="text"
94
+ size="xs"
95
+ className="h-5 w-5 p-0 shrink-0"
96
+ onClick={() => setInternalValue("")}
97
+ >
98
+ <XIcon className="w-3 h-3 text-muted-foreground" />
99
+ </Button>
100
+ )}
104
101
  </div>
105
102
  )}
106
103
 
107
- {/* actions grouped together */}
108
- <div className="flex items-center gap-1 shrink-0">
104
+ <div className="flex items-center shrink-0">
109
105
  {showChartBuilder && (
110
106
  <Button
111
107
  variant="text"
@@ -117,7 +113,7 @@ export const TableTopBar: React.FC<TableTopBarProps> = ({
117
113
  onClick={toggleDisplayHeader}
118
114
  >
119
115
  <ChartSplineIcon className="w-3.5 h-3.5" />
120
- Chart Builder
116
+ Visualize
121
117
  </Button>
122
118
  )}
123
119
  {showTableExplorer && togglePanel && (
@@ -131,7 +127,7 @@ export const TableTopBar: React.FC<TableTopBarProps> = ({
131
127
  onClick={() => togglePanel(PANEL_TYPES.ROW_VIEWER)}
132
128
  >
133
129
  <PanelRightIcon className="w-3.5 h-3.5" />
134
- Table Explorer
130
+ Explorer
135
131
  </Button>
136
132
  )}
137
133
  {downloadAs && <ExportMenu downloadAs={downloadAs} />}
@@ -230,7 +230,7 @@ describe("generateColumns", () => {
230
230
  });
231
231
 
232
232
  // "age" is a number column — should auto right-align
233
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
233
+ // oxlint-disable-next-line typescript/no-explicit-any
234
234
  const cell = (columns[1].cell as any)({
235
235
  column: {
236
236
  columnDef: columns[1],
@@ -241,7 +241,7 @@ describe("generateColumns", () => {
241
241
  expect(cell?.props.className).toContain("text-right");
242
242
 
243
243
  // "name" is a string column — should remain left-aligned
244
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
244
+ // oxlint-disable-next-line typescript/no-explicit-any
245
245
  const nameCell = (columns[0].cell as any)({
246
246
  column: {
247
247
  columnDef: columns[0],
@@ -261,7 +261,7 @@ describe("generateColumns", () => {
261
261
  });
262
262
 
263
263
  // "age" is numeric but explicitly set to left
264
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
264
+ // oxlint-disable-next-line typescript/no-explicit-any
265
265
  const cell = (columns[1].cell as any)({
266
266
  column: {
267
267
  columnDef: columns[1],
@@ -301,7 +301,7 @@ describe("generateColumns", () => {
301
301
  });
302
302
 
303
303
  // Assuming getCellStyleClass is a function that returns a class name
304
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
304
+ // oxlint-disable-next-line typescript/no-explicit-any
305
305
  const cell = (columns[0].cell as any)({
306
306
  column: {
307
307
  columnDef: columns[0],
@@ -333,7 +333,7 @@ describe("generateColumns", () => {
333
333
  // Right-justified: parent wrapper should have items-end, sort/filter icons should flip to the left
334
334
  const { container: rightContainer } = render(
335
335
  <TooltipProvider>
336
- {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
336
+ {/* oxlint-disable-next-line typescript/no-explicit-any */}
337
337
  {(columns[0].header as any)({ column: mockColumn(columns[0]) })}
338
338
  </TooltipProvider>,
339
339
  );
@@ -347,7 +347,7 @@ describe("generateColumns", () => {
347
347
  // Center-justified: parent wrapper should have items-center, no flex-row-reverse
348
348
  const { container: centerContainer } = render(
349
349
  <TooltipProvider>
350
- {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
350
+ {/* oxlint-disable-next-line typescript/no-explicit-any */}
351
351
  {(columns[1].header as any)({ column: mockColumn(columns[1]) })}
352
352
  </TooltipProvider>,
353
353
  );
@@ -572,7 +572,7 @@ describe("LocaleNumber", () => {
572
572
  <LocaleNumber value={1_234_567.89} />
573
573
  </I18nProvider>,
574
574
  );
575
- // eslint-disable-next-line no-irregular-whitespace
575
+ // oxlint-disable-next-line no-irregular-whitespace
576
576
  expect(container.textContent).toMatchInlineSnapshot(`"1 234 567,89"`);
577
577
  });
578
578
 
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-empty-interface */
2
+ /* oxlint-disable typescript/no-empty-object-type */
3
3
 
4
4
  export interface CellHoverTemplateTableState {
5
5
  cellHoverTemplate: string | null;
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-empty-interface */
2
+ /* oxlint-disable typescript/no-empty-object-type */
3
3
 
4
4
  import type { RowData } from "@tanstack/react-table";
5
5
 
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import type { Cell, Column, Row, Table } from "@tanstack/react-table";
5
5
  import { describe, expect, it, vi } from "vitest";
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-empty-interface */
2
+ /* oxlint-disable typescript/no-empty-object-type */
3
3
  import type { OnChangeFn, RowData, Updater } from "@tanstack/react-table";
4
4
 
5
5
  export interface CellSelectionItem {
@@ -40,8 +40,9 @@ export interface CellSelectionInstance<TData extends RowData> {
40
40
  declare module "@tanstack/react-table" {
41
41
  interface TableState extends CellSelectionTableState {}
42
42
 
43
- interface TableOptionsResolved<TData extends RowData>
44
- extends CellSelectionOptions {}
43
+ interface TableOptionsResolved<
44
+ TData extends RowData,
45
+ > extends CellSelectionOptions {}
45
46
 
46
47
  interface Table<TData extends RowData> extends CellSelectionInstance<TData> {}
47
48
 
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-empty-interface */
2
+ /* oxlint-disable typescript/no-empty-object-type */
3
3
  import type { RowData } from "@tanstack/react-table";
4
4
 
5
5
  export type CellStyleState = Record<
@@ -78,7 +78,7 @@ export function generateAltairChart(
78
78
 
79
79
  if (encodings?.tooltip) {
80
80
  const tooltip = encodings.tooltip;
81
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
81
+ // oxlint-disable-next-line typescript/no-explicit-any
82
82
  const makeTooltip = (t: Record<string, any>) => {
83
83
  const kwargs = makeKwargs(t);
84
84
  return new FunctionCall("alt.Tooltip", kwargs);
@@ -149,7 +149,7 @@ ${variableName}
149
149
  `.trim();
150
150
  }
151
151
 
152
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
152
+ // oxlint-disable-next-line typescript/no-explicit-any
153
153
  function makeKwargs<T extends Record<string, any>>(obj: T) {
154
154
  const result: Record<string, PythonCode> = {};
155
155
 
@@ -13,7 +13,7 @@ import {
13
13
  XIcon,
14
14
  } from "lucide-react";
15
15
  import type { JSX } from "react";
16
- import React, { useMemo, useState } from "react";
16
+ import React, { useMemo, useRef, useState } from "react";
17
17
  import { type UseFormReturn, useForm } from "react-hook-form";
18
18
  import useResizeObserver from "use-resize-observer";
19
19
  import { PythonIcon } from "@/components/editor/cell/code/icons";
@@ -61,6 +61,7 @@ export interface TablePanelProps {
61
61
  totalRows: number | TooManyRows;
62
62
  columns: number;
63
63
  displayHeader: boolean;
64
+ onCloseChartBuilder?: () => void;
64
65
  getDataUrl?: GetDataUrl;
65
66
  fieldTypes?: FieldTypesWithExternalType | null;
66
67
  }
@@ -74,12 +75,33 @@ export const TablePanel: React.FC<TablePanelProps> = ({
74
75
  getDataUrl,
75
76
  fieldTypes,
76
77
  displayHeader,
78
+ onCloseChartBuilder,
77
79
  }) => {
78
80
  const [tabsMap, saveTabsMap] = useAtom(tabsStorageAtom);
79
81
  const tabs = cellId ? (tabsMap.get(cellId) ?? []) : [];
80
82
 
81
- const [tabNum, setTabNum] = useState(0);
82
83
  const [selectedTab, setSelectedTab] = useState(DEFAULT_TAB_NAME);
84
+ const [tabCounter, setTabCounter] = useState(tabs.length);
85
+ const prevDisplayHeader = useRef(displayHeader);
86
+
87
+ // Auto-create a default chart tab when chart builder opens with no tabs
88
+ if (
89
+ displayHeader &&
90
+ !prevDisplayHeader.current &&
91
+ tabs.length === 0 &&
92
+ cellId
93
+ ) {
94
+ prevDisplayHeader.current = displayHeader;
95
+ const tabName = getChartTabName(0, NEW_CHART_TYPE);
96
+ const newTabs = new Map(tabsMap);
97
+ newTabs.set(cellId, [
98
+ { tabName, chartType: NEW_CHART_TYPE, config: getChartDefaults() },
99
+ ]);
100
+ saveTabsMap(newTabs);
101
+ setTabCounter(1);
102
+ setSelectedTab(tabName);
103
+ }
104
+ prevDisplayHeader.current = displayHeader;
83
105
 
84
106
  if (!displayHeader || (tabs.length === 0 && !displayHeader)) {
85
107
  return dataTable;
@@ -89,7 +111,7 @@ export const TablePanel: React.FC<TablePanelProps> = ({
89
111
  if (!cellId) {
90
112
  return;
91
113
  }
92
- const tabName = getChartTabName(tabNum, NEW_CHART_TYPE);
114
+ const tabName = getChartTabName(tabCounter, NEW_CHART_TYPE);
93
115
 
94
116
  const newTabs = new Map(tabsMap);
95
117
  newTabs.set(cellId, [
@@ -102,7 +124,7 @@ export const TablePanel: React.FC<TablePanelProps> = ({
102
124
  ]);
103
125
 
104
126
  saveTabsMap(newTabs);
105
- setTabNum(tabNum + 1);
127
+ setTabCounter(tabCounter + 1);
106
128
  setSelectedTab(tabName);
107
129
  };
108
130
 
@@ -110,14 +132,21 @@ export const TablePanel: React.FC<TablePanelProps> = ({
110
132
  if (!cellId) {
111
133
  return;
112
134
  }
135
+ const deletedIndex = tabs.findIndex((tab) => tab.tabName === tabName);
136
+ const remaining = tabs.filter((tab) => tab.tabName !== tabName);
113
137
  const newTabs = new Map(tabsMap);
114
- newTabs.set(
115
- cellId,
116
- tabs.filter((tab) => tab.tabName !== tabName),
117
- );
138
+ newTabs.set(cellId, remaining);
118
139
  saveTabsMap(newTabs);
119
- setSelectedTab(DEFAULT_TAB_NAME);
120
- setTabNum(tabNum - 1);
140
+
141
+ if (remaining.length === 0) {
142
+ onCloseChartBuilder?.();
143
+ } else if (tabName === selectedTab) {
144
+ if (deletedIndex < remaining.length) {
145
+ setSelectedTab(remaining[deletedIndex].tabName);
146
+ } else {
147
+ setSelectedTab(remaining[remaining.length - 1].tabName);
148
+ }
149
+ }
121
150
  };
122
151
 
123
152
  const saveTabChart = ({
@@ -178,7 +207,7 @@ export const TablePanel: React.FC<TablePanelProps> = ({
178
207
 
179
208
  return (
180
209
  <Tabs value={selectedTab} className="-mt-1">
181
- <TabsList>
210
+ <TabsList part="table-tabs">
182
211
  <TabsTrigger
183
212
  className="text-xs"
184
213
  value={DEFAULT_TAB_NAME}
@@ -228,7 +257,7 @@ export const TablePanel: React.FC<TablePanelProps> = ({
228
257
  saveTabChartType(tab.tabName, chartType);
229
258
  };
230
259
  return (
231
- <TabsContent key={idx} value={tab.tabName} className="h-[400px] mt-1">
260
+ <TabsContent key={idx} value={tab.tabName} className="h-[400px] mt-0">
232
261
  <ChartPanel
233
262
  tableData={data}
234
263
  chartConfig={tab.config}
@@ -446,7 +475,7 @@ export const ChartPanel: React.FC<{
446
475
  );
447
476
 
448
477
  return (
449
- <div className="flex flex-row gap-2 h-full rounded-md border pr-2">
478
+ <div className="flex flex-row gap-2 h-full rounded-md border-t pr-2">
450
479
  <div
451
480
  className={`relative flex flex-col gap-2 overflow-auto px-2 py-3 scrollbar-thin transition-width duration-200 ${formCollapsed ? "w-8" : "w-[300px]"}`}
452
481
  >
@@ -1,7 +1,7 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import * as SelectPrimitive from "@radix-ui/react-select";
4
3
  import { ChevronDown } from "lucide-react";
4
+ import { Select as SelectPrimitive } from "radix-ui";
5
5
  import React from "react";
6
6
  import { useFormContext, useWatch } from "react-hook-form";
7
7
  import type { z } from "zod";
@@ -72,7 +72,7 @@ export const ColumnExplorerPanel = ({
72
72
  });
73
73
 
74
74
  return (
75
- <div className="mt-5 mb-3">
75
+ <div className="mb-3">
76
76
  <span className="text-xs font-semibold ml-2 flex">
77
77
  {prettifyRowColumnCount(totalRows, totalColumns, locale)}
78
78
  <CopyClipboardIcon
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-empty-interface */
2
+ /* oxlint-disable typescript/no-empty-object-type */
3
3
 
4
4
  import type { OnChangeFn, RowData } from "@tanstack/react-table";
5
5
  import type { DataType } from "@/core/kernel/messages";
@@ -38,7 +38,7 @@ export interface ColumnFormattingInstance {
38
38
  setColumnFormatting: (value?: FormatOption) => void;
39
39
  getColumnFormatting?: () => FormatOption | undefined;
40
40
  getCanFormat?: () => boolean;
41
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
+ // oxlint-disable-next-line typescript/no-explicit-any
42
42
  applyColumnFormatting: (value: any) => any;
43
43
  }
44
44
 
@@ -48,8 +48,9 @@ declare module "@tanstack/react-table" {
48
48
  //merge column formatting's state with the existing table state
49
49
  interface TableState extends ColumnFormattingTableState {}
50
50
  //merge column formatting's options with the existing table options
51
- interface TableOptionsResolved<TData extends RowData>
52
- extends ColumnFormattingOptions {}
51
+ interface TableOptionsResolved<
52
+ TData extends RowData,
53
+ > extends ColumnFormattingOptions {}
53
54
  //merge column formatting's instance APIs with the existing table instance APIs
54
55
  interface Column<TData extends RowData> extends ColumnFormattingInstance {}
55
56
  }
@@ -63,8 +63,10 @@ import { stringifyUnknownValue } from "./utils";
63
63
 
64
64
  const TOP_K_ROWS = 30;
65
65
 
66
- interface DataTableColumnHeaderProps<TData, TValue>
67
- extends React.HTMLAttributes<HTMLDivElement> {
66
+ interface DataTableColumnHeaderProps<
67
+ TData,
68
+ TValue,
69
+ > extends React.HTMLAttributes<HTMLDivElement> {
68
70
  column: Column<TData, TValue>;
69
71
  header: React.ReactNode;
70
72
  justify?: "left" | "center" | "right";
@@ -282,7 +282,7 @@ export function getDataSpecAndSourceName<T>(data: string | T[]): {
282
282
  const base64 = extractBase64FromDataURL(data);
283
283
  const decoded = window.atob(base64);
284
284
 
285
- // eslint-disable-next-line unicorn/prefer-ternary
285
+ // oxlint-disable-next-line unicorn/prefer-ternary
286
286
  if (decoded.startsWith(ARROW_MAGIC_NUMBER)) {
287
287
  dataSpec = {
288
288
  values: base64ToUint8Array(base64),
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-empty-interface */
2
+ /* oxlint-disable typescript/no-empty-object-type */
3
3
  import type { OnChangeFn, RowData } from "@tanstack/react-table";
4
4
 
5
5
  export type ColumnWrappingState = Record<string, "nowrap" | "wrap" | undefined>;
@@ -22,8 +22,9 @@ export interface ColumnWrappingInstance {
22
22
  declare module "@tanstack/react-table" {
23
23
  interface TableState extends ColumnWrappingTableState {}
24
24
 
25
- interface TableOptionsResolved<TData extends RowData>
26
- extends ColumnWrappingOptions {}
25
+ interface TableOptionsResolved<
26
+ TData extends RowData,
27
+ > extends ColumnWrappingOptions {}
27
28
 
28
29
  interface Column<TData extends RowData> extends ColumnWrappingInstance {}
29
30
  }
@@ -1,7 +1,10 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
  "use no memo";
3
3
 
4
- import { PopoverClose } from "@radix-ui/react-popover";
4
+ import { Popover as PopoverPrimitive } from "radix-ui";
5
+
6
+ const PopoverClose = PopoverPrimitive.Close;
7
+
5
8
  import type { Column, ColumnDef } from "@tanstack/react-table";
6
9
  import { formatDate, isValid } from "date-fns";
7
10
  import { useLocale, useNumberFormatter } from "react-aria";
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-empty-interface */
2
+ /* oxlint-disable typescript/no-empty-object-type */
3
3
  import type { RowData } from "@tanstack/react-table";
4
4
 
5
5
  export interface CopyColumnOptions {
@@ -12,8 +12,9 @@ export interface CopyColumnInstance {
12
12
 
13
13
  // Use declaration merging to add our new feature APIs
14
14
  declare module "@tanstack/react-table" {
15
- interface TableOptionsResolved<TData extends RowData>
16
- extends CopyColumnOptions {}
15
+ interface TableOptionsResolved<
16
+ TData extends RowData,
17
+ > extends CopyColumnOptions {}
17
18
 
18
19
  interface Column<TData extends RowData> extends CopyColumnInstance {}
19
20
  }
@@ -283,7 +283,10 @@ const DataTableInternal = <TData,>({
283
283
  <div className={cn(wrapperClassName, "flex flex-col space-y-1")}>
284
284
  <FilterPills filters={filters} table={table} />
285
285
  <CellSelectionProvider>
286
- <div className={cn(className || "rounded-md border overflow-hidden")}>
286
+ <div
287
+ part="table-wrapper"
288
+ className={cn(className || "rounded-md border overflow-hidden")}
289
+ >
287
290
  <TableTopBar
288
291
  enableSearch={enableSearch}
289
292
  searchQuery={searchQuery}
@@ -311,17 +314,19 @@ const DataTableInternal = <TData,>({
311
314
  virtualize={virtualize}
312
315
  />
313
316
  </Table>
317
+ <TableBottomBar
318
+ part="table-footer"
319
+ className="pt-1.5 pb-0.5 border-t border-border"
320
+ totalColumns={totalColumns}
321
+ pagination={pagination}
322
+ selection={selection}
323
+ onRowSelectionChange={onRowSelectionChange}
324
+ table={table}
325
+ getRowIds={getRowIds}
326
+ showPageSizeSelector={showPageSizeSelector}
327
+ tableLoading={reloading}
328
+ />
314
329
  </div>
315
- <TableBottomBar
316
- totalColumns={totalColumns}
317
- pagination={pagination}
318
- selection={selection}
319
- onRowSelectionChange={onRowSelectionChange}
320
- table={table}
321
- getRowIds={getRowIds}
322
- showPageSizeSelector={showPageSizeSelector}
323
- tableLoading={reloading}
324
- />
325
330
  </CellSelectionProvider>
326
331
  </div>
327
332
  );
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-empty-interface */
2
+ /* oxlint-disable typescript/no-empty-object-type */
3
3
 
4
4
  import type { OnChangeFn, RowData } from "@tanstack/react-table";
5
5
 
@@ -25,8 +25,9 @@ export interface FocusRowInstance {
25
25
  declare module "@tanstack/react-table" {
26
26
  interface TableState extends FocusRowTableState {}
27
27
 
28
- interface TableOptionsResolved<TData extends RowData>
29
- extends FocusRowOptions {}
28
+ interface TableOptionsResolved<
29
+ TData extends RowData,
30
+ > extends FocusRowOptions {}
30
31
 
31
32
  interface Row<TData extends RowData> extends FocusRowInstance {}
32
33
  }
@@ -24,7 +24,10 @@ export const LoadingTable = ({
24
24
 
25
25
  return (
26
26
  <div className={cn(wrapperClassName, "flex flex-col space-y-2")}>
27
- <div className={cn(className || "rounded-md border")}>
27
+ <div
28
+ part="table-wrapper"
29
+ className={cn(className || "rounded-md border")}
30
+ >
28
31
  <Table>
29
32
  <TableHeader>
30
33
  {Array.from({ length: 1 }).map((_, i) => (
@@ -40,7 +43,7 @@ export const LoadingTable = ({
40
43
  <TableBody>
41
44
  {Array.from({ length: pageSize }).map((_, i) => (
42
45
  <TableRow key={i}>
43
- {Array.from({ length: NUM_COLUMNS }).map((_, j) => (
46
+ {Array.from({ length: NUM_COLUMNS }).map((__, j) => (
44
47
  <TableCell key={j}>
45
48
  <div className="h-4 bg-(--slate-5) animate-pulse rounded-md w-[90%]" />
46
49
  </TableCell>
@@ -71,7 +71,7 @@ export const DataTablePagination = <TData,>({
71
71
 
72
72
  // Ensure unique page sizes
73
73
  const pageSizeSet = new Set([5, 10, 25, 50, 100, pageSize]);
74
- const pageSizes = [...pageSizeSet].sort((a, b) => a - b);
74
+ const pageSizes = [...pageSizeSet].toSorted((a, b) => a - b);
75
75
 
76
76
  const renderPageSizeSelector = () => {
77
77
  return (
@@ -10,7 +10,7 @@ vi.mock("@/utils/copy", () => ({
10
10
  }));
11
11
 
12
12
  vi.mock("../utils", async (importOriginal) => {
13
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ // oxlint-disable-next-line typescript/no-explicit-any
14
14
  const original = (await importOriginal()) as any;
15
15
  return {
16
16
  ...original,
@@ -28,7 +28,7 @@ import {
28
28
  } from "../atoms";
29
29
  import { getCellsBetween, getCellValues } from "../utils";
30
30
 
31
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
+ // oxlint-disable-next-line typescript/no-explicit-any
32
32
  type T = any;
33
33
 
34
34
  // Create mock table and cells
@@ -56,18 +56,18 @@ function createMockCell(
56
56
  }
57
57
 
58
58
  function createMockTable(): Table<T> {
59
- const mockToggleSelected = vi.fn().mockImplementation(function (this: {
60
- isSelected: boolean;
61
- }) {
62
- this.isSelected = !this.isSelected;
63
- return { isSelected: this.isSelected };
64
- });
59
+ const mockToggleSelected = vi
60
+ .fn()
61
+ .mockImplementation(function (this: { isSelected: boolean }) {
62
+ this.isSelected = !this.isSelected;
63
+ return { isSelected: this.isSelected };
64
+ });
65
65
 
66
- const mockGetIsSelected = vi.fn().mockImplementation(function (this: {
67
- isSelected: boolean;
68
- }) {
69
- return this.isSelected;
70
- });
66
+ const mockGetIsSelected = vi
67
+ .fn()
68
+ .mockImplementation(function (this: { isSelected: boolean }) {
69
+ return this.isSelected;
70
+ });
71
71
 
72
72
  const rows = [
73
73
  {
@@ -23,17 +23,15 @@ describe("isInteractiveTarget", () => {
23
23
  expect(isInteractiveTarget(createMouseEvent(span, cell))).toBe(false);
24
24
  });
25
25
 
26
- it.each([
27
- "input",
28
- "button",
29
- "select",
30
- "textarea",
31
- ])("returns true when clicking a <%s>", (tag) => {
32
- const cell = document.createElement("td");
33
- const el = document.createElement(tag);
34
- cell.append(el);
35
- expect(isInteractiveTarget(createMouseEvent(el, cell))).toBe(true);
36
- });
26
+ it.each(["input", "button", "select", "textarea"])(
27
+ "returns true when clicking a <%s>",
28
+ (tag) => {
29
+ const cell = document.createElement("td");
30
+ const el = document.createElement(tag);
31
+ cell.append(el);
32
+ expect(isInteractiveTarget(createMouseEvent(el, cell))).toBe(true);
33
+ },
34
+ );
37
35
 
38
36
  it("returns true when clicking an <a> link", () => {
39
37
  const cell = document.createElement("td");
@@ -32,9 +32,9 @@ function initialState(): CellSelectionState {
32
32
  };
33
33
  }
34
34
 
35
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
+ // oxlint-disable-next-line typescript/no-explicit-any
36
36
  type AnyTable = Table<any>;
37
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
+ // oxlint-disable-next-line typescript/no-explicit-any
38
38
  type AnyCell = Cell<any, unknown>;
39
39
 
40
40
  const {