@marimo-team/islands 0.25.3-dev12 → 0.25.3-dev122

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 (391) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CNMliVzw.js → ConnectedDataExplorerComponent-CFzqIsUg.js} +14 -14
  2. package/dist/{ErrorBoundary-CUd8VnYI.js → ErrorBoundary-Mby9UXAS.js} +8 -8
  3. package/dist/{abnfDiagram-VCTEODGH-D-Ez91gV.js → abnfDiagram-VCTEODGH-Di400kYu.js} +2 -2
  4. package/dist/any-language-editor-k2B8YI3Y.js +75 -0
  5. package/dist/{architectureDiagram-5GKGNRK7-CTpcNtO8.js → architectureDiagram-5GKGNRK7-BdTJcsNJ.js} +1 -1
  6. package/dist/{arrays-CN1djC4k.js → arrays-R6JsImiT.js} +8 -0
  7. package/dist/assets/__vite-browser-external-SaDYcg7x.js +1 -0
  8. package/dist/assets/{worker-HPY9fbhz.js → worker-CfME3uyi.js} +3 -2
  9. package/dist/{button-CvjkwdSk.js → button-BxB3RDjN.js} +1 -1
  10. package/dist/{capabilities-CQ5IjhzL.js → capabilities-BgR0osfN.js} +2 -2
  11. package/dist/{chat-ui-DaHynk8g.js → chat-ui-DA8zEZ1I.js} +1141 -1141
  12. package/dist/{check-EDwSwP89.js → check-P35dc2dH.js} +1 -1
  13. package/dist/{chunk-IMKFNOWR-DGxi-zeo.js → chunk-IMKFNOWR-mtD7aJBw.js} +1 -1
  14. package/dist/{chunk-SHT3W25Y-CV9J3rAB.js → chunk-SHT3W25Y-DybB1ShH.js} +1 -1
  15. package/dist/{chunk-SVP7TREG-BL-9Fqgg.js → chunk-SVP7TREG-DNhhdCex.js} +1 -1
  16. package/dist/{chunk-TICWLB2K-Cu_XMjDM.js → chunk-TICWLB2K-NhAQhlDf.js} +1 -1
  17. package/dist/{chunk-YOKDWASO-DPZk8vhS.js → chunk-YOKDWASO-DKplTrBY.js} +20 -20
  18. package/dist/{classDiagram-ZZMXUADV-BXXV13Hq.js → classDiagram-ZZMXUADV-GTL0l5xS.js} +2 -2
  19. package/dist/{classDiagram-v2-VYDZK3BY-B7FXJ1Cp.js → classDiagram-v2-VYDZK3BY-BWrM2ruI.js} +2 -2
  20. package/dist/{code-visibility-P0Ornave.js → code-visibility-3U6ZTDXf.js} +6 -6
  21. package/dist/{common-BtO98PuE.js → common-CKeY7M4s.js} +5559 -5453
  22. package/dist/{copy-icon-Ft7t9bqz.js → copy-icon-CPoxUG7G.js} +3 -3
  23. package/dist/{cynefinDiagram-5FMLGOSQ-CH96rwba.js → cynefinDiagram-5FMLGOSQ-CX22wa7c.js} +1 -1
  24. package/dist/{dagre-GXQ25YYZ-BD3PmpFY.js → dagre-GXQ25YYZ-Df6Pp-cl.js} +1 -1
  25. package/dist/{data-grid-overlay-editor-B801aMeG.js → data-grid-overlay-editor-YfAOLpti.js} +5 -5
  26. package/dist/{data-grid-types-BH_r7g7l.js → data-grid-types-0PJ-9N5n.js} +1 -1
  27. package/dist/{diagram-S7CK7UJ4-BsSJJldB.js → diagram-S7CK7UJ4-CctU9kVx.js} +1 -1
  28. package/dist/{diagram-UQ7AKVKN-muQtNZc4.js → diagram-UQ7AKVKN-FVHjCF9j.js} +1 -1
  29. package/dist/{diagram-VX7I27RA-CdhuZAqR.js → diagram-VX7I27RA-BSDbwFFv.js} +1 -1
  30. package/dist/{diagram-Z3DM3KII-BD8mXjOj.js → diagram-Z3DM3KII-BX8kW7Nc.js} +1 -1
  31. package/dist/{dialog-CEBFZNyc.js → dialog-C1PcpCqX.js} +3 -3
  32. package/dist/{dist-DpBpA_n1.js → dist-Lm-D-Vr6.js} +3 -3
  33. package/dist/{dropdown-menu-CP_qCYHC.js → dropdown-menu-B_7xD2X4.js} +177 -169
  34. package/dist/{ebnfDiagram-PWID7BFC-BIN1sweE.js → ebnfDiagram-PWID7BFC-DtapdLet.js} +2 -2
  35. package/dist/{erDiagram-RLTQ6QDP-Ctp5cfoN.js → erDiagram-RLTQ6QDP-BAru9jHt.js} +1 -1
  36. package/dist/{error-banner-D-WCIiMt.js → error-banner-Sl2FlSJ4.js} +2 -2
  37. package/dist/{error-entries-Bv6bZPF3.js → error-entries-g9iQiVIT.js} +844 -811
  38. package/dist/{feedback-button-Bpu-arCP.js → feedback-button-Y-QYprZR.js} +29 -29
  39. package/dist/{flowDiagram-HODETNUW-3EfLrlFb.js → flowDiagram-HODETNUW-CjaeFeea.js} +2 -2
  40. package/dist/{formats-27CW_UP4.js → formats-V8ifA0Bk.js} +3 -3
  41. package/dist/{ganttDiagram-EL5Y4UJY-BQT16JSc.js → ganttDiagram-EL5Y4UJY-Dh_4cBJZ.js} +2 -2
  42. package/dist/{glide-data-editor-XZB3u4tH.js → glide-data-editor--N1kxdkm.js} +370 -368
  43. package/dist/{glide-utils-DJyqh0EM.js → glide-utils-Bt8_pBa2.js} +16 -16
  44. package/dist/{globals-BIQc0DK0.js → globals-CNvCn9Ut.js} +3 -3
  45. package/dist/{highlighted-body-KPVGNVTW-zwjq21tf.js → highlighted-body-KPVGNVTW-3Ziwfz-V.js} +2 -2
  46. package/dist/{html-to-image-Bf8QMGi4.js → html-to-image-Bg5ZoSO-.js} +29 -29
  47. package/dist/{infoDiagram-27XIBGKW-DipQoHxl.js → infoDiagram-27XIBGKW-B1hmUggC.js} +1 -1
  48. package/dist/{ishikawaDiagram-5VMMS53U-DgFMjSGz.js → ishikawaDiagram-5VMMS53U-DUeT3t-d.js} +1 -1
  49. package/dist/{kanban-definition-UXKFOSKX-w1ACVjgl.js → kanban-definition-UXKFOSKX-DEUnNNgc.js} +1 -1
  50. package/dist/{label-BDKF3Afc.js → label-BRnUC0NX.js} +2 -2
  51. package/dist/{linear-Cnaq3Tfb.js → linear-DWERh7eI.js} +121 -73
  52. package/dist/{loader-BQOfjTIJ.js → loader-Bm8cy3e8.js} +12 -12
  53. package/dist/main.js +3272 -3030
  54. package/dist/{mermaid-CHo49Yv-.js → mermaid-B0fXpsNP.js} +38 -38
  55. package/dist/mermaid-HWGCJPDP-Du3-HPQA.js +2 -0
  56. package/dist/{mindmap-definition-YA3MSWOX-CrT0KSfX.js → mindmap-definition-YA3MSWOX-CPexlhDQ.js} +1 -1
  57. package/dist/{number-overlay-editor-CEO_7tD7.js → number-overlay-editor-COjoFXgy.js} +3 -3
  58. package/dist/{objects-CzUgoMIF.js → objects-DCmMvZtn.js} +1 -3
  59. package/dist/{once-BtE-wKRL.js → once-eG8Vmvjd.js} +1 -1
  60. package/dist/{pegDiagram-XKGWAZYB-BqvywNJA.js → pegDiagram-XKGWAZYB-CMpp1OOQ.js} +2 -2
  61. package/dist/{pieDiagram-E7YTZNPT-BfxJ_XCc.js → pieDiagram-E7YTZNPT-DlMWg5t1.js} +1 -1
  62. package/dist/precisionRound-DhAzeRcm.js +49 -0
  63. package/dist/{process-output-BZg56CCb.js → process-output-BtVPCGeI.js} +4 -4
  64. package/dist/{quadrantDiagram-AXDQQJYC-Ccw0xMjN.js → quadrantDiagram-AXDQQJYC-Blrm7V7_.js} +1 -1
  65. package/dist/{railroadDiagram-O6MQD6OU-8vFLVTPu.js → railroadDiagram-O6MQD6OU-DBJfseeO.js} +2 -2
  66. package/dist/{react-vega-BED0DjiB.js → react-vega-C4T9Rb_w.js} +12284 -12270
  67. package/dist/{requirementDiagram-BXWQKSXE-a_MxGvxe.js → requirementDiagram-BXWQKSXE-BC7V639r.js} +1 -1
  68. package/dist/{reveal-component-LPCUNcgp.js → reveal-component-BKaSM0Qr.js} +23 -23
  69. package/dist/{select-BButFi-d.js → select-B0LRDH0g.js} +4 -4
  70. package/dist/{sequenceDiagram-WJ2MYXX4-CXFMnxGh.js → sequenceDiagram-WJ2MYXX4-CgesU6F-.js} +1 -1
  71. package/dist/{spec-BwarBpUJ.js → spec-DTiOPKyk.js} +41 -11
  72. package/dist/{stateDiagram-D77RDMKH-DQeA_CwI.js → stateDiagram-D77RDMKH-lH_BUhs3.js} +2 -2
  73. package/dist/{stateDiagram-v2-MP3YSRHH-BxxQucm1.js → stateDiagram-v2-MP3YSRHH-8LL6FrBe.js} +2 -2
  74. package/dist/style.css +1 -1
  75. package/dist/{swimlanes-42K2YHIH-Do6L-cYg.js → swimlanes-42K2YHIH-Cuf9B9kE.js} +1 -1
  76. package/dist/{swimlanesDiagram-VR7AAH4N-DUzPvSVU.js → swimlanesDiagram-VR7AAH4N-BoMMtOPh.js} +2 -2
  77. package/dist/{swiper-component-DKntyn8p.js → swiper-component-DfhRvAFi.js} +2 -2
  78. package/dist/{time-BieKwdYS.js → time-BaMbJs4z.js} +18 -18
  79. package/dist/{timeline-definition-24CTP7MA-D3c46WM5.js → timeline-definition-24CTP7MA-yzzw4TF4.js} +1 -1
  80. package/dist/{toDate-UtiwmnH2.js → toDate-DKH0_kMo.js} +15 -18
  81. package/dist/{toast-B9UMEi8u.js → toast-CFWpihJU.js} +4 -4
  82. package/dist/{tooltip-BO1REbqs.js → tooltip-CKO1pHJo.js} +2 -2
  83. package/dist/{use-restore-focus-BEM7sFWl.js → use-restore-focus-DBCITLeF.js} +1 -1
  84. package/dist/{useAsyncData-Deh5kszT.js → useAsyncData-D0mLJstx.js} +15 -14
  85. package/dist/{useDateFormatter-D8XruNGG.js → useDateFormatter-c_yJtkAe.js} +2 -2
  86. package/dist/{useDeepCompareMemoize-DXwzRINI.js → useDeepCompareMemoize-BpPWi3G3.js} +1 -1
  87. package/dist/{useIframeCapabilities-DBETvvPl.js → useIframeCapabilities-BkdeVdXC.js} +1 -1
  88. package/dist/{useLifecycle-j7D9uD1o.js → useLifecycle-Dum8WSXq.js} +3 -3
  89. package/dist/{useTheme-CRnjkku0.js → useTheme-CfeaVw5D.js} +6 -6
  90. package/dist/{vega-component-BeF9dfyO.js → vega-component-DgytCKrL.js} +147 -147
  91. package/dist/{vega-embed-container-BNHE18G9.js → vega-embed-container--LYZqguO.js} +2 -2
  92. package/dist/{vega-loader.browser-DNST6uVf.js → vega-loader.browser-B9Pz0EGP.js} +298 -507
  93. package/dist/{vennDiagram-4TSXK5OY-BSZD8JcZ.js → vennDiagram-4TSXK5OY-eJOrTqqC.js} +1 -1
  94. package/dist/{wardleyDiagram-VM6X3IG4-48cUWkfA.js → wardleyDiagram-VM6X3IG4-TILPvee6.js} +1 -1
  95. package/dist/{xychartDiagram-S5SC5T6Z-CswYgYeu.js → xychartDiagram-S5SC5T6Z-DUPvRwwJ.js} +2 -2
  96. package/package.json +12 -12
  97. package/src/__tests__/host-imports.test.ts +1 -0
  98. package/src/__tests__/mount.test.ts +0 -20
  99. package/src/components/app-config/ai-config.tsx +7 -2
  100. package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
  101. package/src/components/chat/acp/__tests__/state.test.ts +2 -2
  102. package/src/components/chat/acp/blocks.tsx +2 -2
  103. package/src/components/chat/chat-components.tsx +2 -0
  104. package/src/components/chat/chat-panel.tsx +9 -8
  105. package/src/components/chat/chat-utils.ts +4 -8
  106. package/src/components/data-table/__tests__/chart-spec-model.test.ts +195 -195
  107. package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
  108. package/src/components/data-table/__tests__/columns.test.tsx +105 -0
  109. package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
  110. package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
  111. package/src/components/data-table/__tests__/export-actions.test.tsx +105 -0
  112. package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
  113. package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
  114. package/src/components/data-table/cell-selection/feature.ts +2 -2
  115. package/src/components/data-table/cell-selection/types.ts +2 -2
  116. package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
  117. package/src/components/data-table/charts/__tests__/spec-snapshot.test.ts +20 -20
  118. package/src/components/data-table/charts/__tests__/spec.test.ts +78 -52
  119. package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
  120. package/src/components/data-table/charts/chart-spec/spec.ts +68 -43
  121. package/src/components/data-table/charts/charts.tsx +40 -30
  122. package/src/components/data-table/charts/storage.ts +16 -5
  123. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
  124. package/src/components/data-table/column-summary/chart-spec-model.tsx +23 -16
  125. package/src/components/data-table/column-summary/column-summary.tsx +2 -4
  126. package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
  127. package/src/components/data-table/columns.tsx +45 -46
  128. package/src/components/data-table/context-menu.tsx +36 -20
  129. package/src/components/data-table/data-table.tsx +7 -1
  130. package/src/components/data-table/date-popover.tsx +6 -4
  131. package/src/components/data-table/export-actions.tsx +76 -48
  132. package/src/components/data-table/row-viewer-panel/row-viewer.tsx +2 -2
  133. package/src/components/data-table/search-highlight.tsx +79 -0
  134. package/src/components/data-table/types.ts +1 -0
  135. package/src/components/data-table/url-detector.tsx +49 -9
  136. package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
  137. package/src/components/datasources/__tests__/column-preview.test.tsx +63 -2
  138. package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
  139. package/src/components/datasources/column-preview.tsx +8 -2
  140. package/src/components/datasources/datasources.tsx +47 -35
  141. package/src/components/debugger/debugger-code.tsx +5 -0
  142. package/src/components/dependency-graph/dependency-graph-tree.tsx +8 -8
  143. package/src/components/dependency-graph/elements.ts +24 -21
  144. package/src/components/dependency-graph/panels.tsx +2 -1
  145. package/src/components/dependency-graph/utils/__tests__/layout.test.ts +18 -11
  146. package/src/components/editor/SortableCell.tsx +1 -3
  147. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
  148. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +24 -0
  149. package/src/components/editor/actions/pair-with-agent-modal.tsx +18 -15
  150. package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
  151. package/src/components/editor/ai/ai-completion-editor.tsx +1 -0
  152. package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
  153. package/src/components/editor/cell/CreateCellButton.tsx +8 -10
  154. package/src/components/editor/cell/DeleteButton.tsx +1 -0
  155. package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
  156. package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
  157. package/src/components/editor/cell/code/cell-editor.tsx +1 -1
  158. package/src/components/editor/cell/code/language-toggle.tsx +8 -7
  159. package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
  160. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +30 -1
  161. package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
  162. package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
  163. package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +12 -18
  164. package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +58 -1
  165. package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
  166. package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +12 -2
  167. package/src/components/editor/chrome/wrapper/storage.ts +1 -1
  168. package/src/components/editor/connections/components.tsx +1 -1
  169. package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
  170. package/src/components/editor/controls/command-palette.tsx +22 -10
  171. package/src/components/editor/dynamic-favicon.tsx +21 -40
  172. package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +12 -23
  173. package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
  174. package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
  175. package/src/components/editor/file-tree/file-explorer.tsx +10 -5
  176. package/src/components/editor/file-tree/file-viewer.tsx +4 -2
  177. package/src/components/editor/file-tree/use-file-search.ts +35 -21
  178. package/src/components/editor/notebook-banner.tsx +1 -0
  179. package/src/components/editor/output/MarimoTracebackOutput.tsx +2 -2
  180. package/src/components/editor/output/ansi-reduce.ts +33 -20
  181. package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
  182. package/src/components/editor/package-alert.tsx +6 -4
  183. package/src/components/editor/renderers/grid-layout/grid-layout.tsx +12 -6
  184. package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
  185. package/src/components/home/components.tsx +17 -31
  186. package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
  187. package/src/components/icons/large-spinner.tsx +3 -14
  188. package/src/components/icons/spinner.tsx +1 -1
  189. package/src/components/mcp/mcp-status-indicator.tsx +1 -1
  190. package/src/components/pages/__tests__/home-page.test.tsx +116 -0
  191. package/src/components/pages/home-page.tsx +164 -91
  192. package/src/components/scratchpad/scratchpad.tsx +2 -2
  193. package/src/components/slides/reveal-component.tsx +4 -2
  194. package/src/components/slides/slide-cell-view.tsx +1 -1
  195. package/src/components/slides/slide-form.tsx +1 -0
  196. package/src/components/tracing/tracing.tsx +2 -2
  197. package/src/components/ui/alert-dialog.tsx +1 -1
  198. package/src/core/ai/context/providers/datasource.ts +6 -2
  199. package/src/core/ai/tools/base.ts +16 -7
  200. package/src/core/ai/tools/edit-notebook-tool.ts +47 -45
  201. package/src/core/ai/tools/registry.ts +13 -8
  202. package/src/core/ai/tools/sample-tool.ts +6 -7
  203. package/src/core/attachments/state.ts +5 -8
  204. package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -0
  205. package/src/core/cells/__tests__/cell.test.ts +39 -0
  206. package/src/core/cells/__tests__/cells.test.ts +3 -1
  207. package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
  208. package/src/core/cells/__tests__/notebook-outline.test.ts +113 -0
  209. package/src/core/cells/__tests__/session.test.ts +117 -36
  210. package/src/core/cells/cell.ts +14 -3
  211. package/src/core/cells/cells.ts +3 -1
  212. package/src/core/cells/pending-delete-service.ts +2 -6
  213. package/src/core/cells/session.ts +1 -1
  214. package/src/core/cells/types.ts +10 -1
  215. package/src/core/codemirror/__tests__/setup.test.ts +29 -29
  216. package/src/core/codemirror/cells/__tests__/extensions.test.ts +15 -0
  217. package/src/core/codemirror/cells/extensions.ts +7 -3
  218. package/src/core/codemirror/keymaps/vim.ts +2 -6
  219. package/src/core/codemirror/language/__tests__/sql.test.ts +22 -20
  220. package/src/core/codemirror/language/extension.ts +8 -8
  221. package/src/core/codemirror/language/languages/markdown.ts +8 -6
  222. package/src/core/codemirror/language/languages/python.ts +16 -10
  223. package/src/core/codemirror/language/languages/sql/sql.ts +9 -7
  224. package/src/core/codemirror/language/panel/panel.tsx +1 -0
  225. package/src/core/codemirror/language/types.ts +7 -7
  226. package/src/core/codemirror/rtc/extension.ts +24 -12
  227. package/src/core/codemirror/rtc/loro/awareness.ts +34 -19
  228. package/src/core/codemirror/rtc/loro/sync.ts +1 -0
  229. package/src/core/codemirror/utils.ts +1 -0
  230. package/src/core/datasets/__tests__/data-source-discovery.test.ts +4 -4
  231. package/src/core/datasets/data-source-discovery.ts +4 -6
  232. package/src/core/document/__tests__/codemirror.test.ts +483 -0
  233. package/src/core/document/__tests__/draft.test.ts +322 -0
  234. package/src/core/document/__tests__/fixtures.ts +92 -0
  235. package/src/core/document/__tests__/hooks.test.tsx +386 -0
  236. package/src/core/document/__tests__/lifecycle-scenarios.test.ts +61 -0
  237. package/src/core/document/__tests__/model.test.ts +158 -0
  238. package/src/core/document/__tests__/protocol-fixtures.ts +38 -0
  239. package/src/core/document/__tests__/recovery-scenarios.test.ts +230 -0
  240. package/src/core/document/__tests__/scenario-fixture.ts +42 -0
  241. package/src/core/document/__tests__/scenarios.test.ts +205 -0
  242. package/src/core/document/__tests__/state.test.ts +438 -0
  243. package/src/core/document/__tests__/submission.test.ts +203 -0
  244. package/src/core/document/__tests__/test-host.test.ts +92 -0
  245. package/src/core/document/__tests__/test-host.ts +247 -0
  246. package/src/core/document/__tests__/test-notebook.ts +139 -0
  247. package/src/core/document/__tests__/user.ts +61 -0
  248. package/src/core/document/codemirror.ts +311 -0
  249. package/src/core/document/draft.ts +472 -0
  250. package/src/core/document/hooks.tsx +118 -0
  251. package/src/core/document/index.ts +22 -0
  252. package/src/core/document/model.ts +52 -0
  253. package/src/core/document/select.ts +41 -0
  254. package/src/core/document/state.ts +374 -0
  255. package/src/core/document/sync.ts +363 -0
  256. package/src/core/host/AGENTS.md +12 -2
  257. package/src/core/host/__tests__/attachments.test.ts +56 -0
  258. package/src/core/host/__tests__/document.test.ts +126 -0
  259. package/src/core/host/__tests__/fixtures.ts +41 -0
  260. package/src/core/host/__tests__/notebook-client.test.ts +511 -132
  261. package/src/core/host/__tests__/static.test.ts +167 -0
  262. package/src/core/host/__tests__/wasm.test.ts +152 -0
  263. package/src/core/host/backend.ts +10 -0
  264. package/src/core/host/connection.ts +1 -40
  265. package/src/core/host/notebook-client.ts +204 -133
  266. package/src/core/host/resources/attachments.ts +22 -0
  267. package/src/core/host/resources/document.ts +101 -0
  268. package/src/core/host/static.ts +70 -0
  269. package/src/core/host/wasm.ts +92 -0
  270. package/src/core/hotkeys/actions.ts +2 -4
  271. package/src/core/islands/__tests__/bootstrap.test.ts +0 -26
  272. package/src/core/islands/bootstrap.ts +0 -1
  273. package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
  274. package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
  275. package/src/core/network/connection.ts +4 -2
  276. package/src/core/network/useConnectionNotice.ts +8 -2
  277. package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
  278. package/src/core/runtime/__tests__/runtime.test.ts +15 -58
  279. package/src/core/runtime/runtime.ts +25 -42
  280. package/src/core/runtime/types.ts +0 -2
  281. package/src/core/state/__tests__/jotai.test.tsx +108 -0
  282. package/src/core/state/jotai.ts +1 -1
  283. package/src/core/static/__tests__/files.test.ts +38 -10
  284. package/src/core/static/files.ts +2 -0
  285. package/src/core/wasm/bridge.ts +38 -10
  286. package/src/core/wasm/store.ts +3 -3
  287. package/src/core/wasm/worker/bootstrap.ts +2 -1
  288. package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
  289. package/src/core/wasm/worker/types.ts +11 -0
  290. package/src/core/wasm/worker/worker.ts +48 -0
  291. package/src/core/websocket/__tests__/connection-state.test.ts +0 -12
  292. package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +153 -70
  293. package/src/core/websocket/__tests__/useNotebookSession.hook.test.tsx +151 -428
  294. package/src/core/websocket/connection-state.ts +0 -10
  295. package/src/core/websocket/state.ts +7 -0
  296. package/src/core/websocket/transports/__tests__/notebook.test.ts +502 -0
  297. package/src/core/websocket/transports/notebook.ts +213 -0
  298. package/src/core/websocket/useNotebookClient.ts +38 -29
  299. package/src/core/websocket/useNotebookSession.tsx +1 -14
  300. package/src/css/globals.css +5 -0
  301. package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
  302. package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
  303. package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
  304. package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
  305. package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
  306. package/src/hooks/__tests__/useScript.test.tsx +77 -0
  307. package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
  308. package/src/hooks/useAsyncData.ts +3 -3
  309. package/src/hooks/useDataSourceDiscovery.ts +6 -4
  310. package/src/hooks/useDebounce.ts +6 -10
  311. package/src/hooks/useDeepCompareMemoize.ts +1 -1
  312. package/src/hooks/useDelayElapsed.ts +14 -10
  313. package/src/hooks/useElapsedTime.ts +3 -3
  314. package/src/hooks/useEventListener.ts +1 -2
  315. package/src/hooks/useInputHistory.ts +4 -7
  316. package/src/hooks/useInternalStateWithSync.ts +6 -6
  317. package/src/hooks/useResizeObserver.ts +4 -7
  318. package/src/hooks/useScript.ts +67 -70
  319. package/src/hooks/useStateForKey.ts +93 -0
  320. package/src/mount.tsx +0 -4
  321. package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
  322. package/src/plugins/core/registerReactComponent.tsx +1 -1
  323. package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
  324. package/src/plugins/impl/DataEditorPlugin.tsx +1 -1
  325. package/src/plugins/impl/DataTablePlugin.tsx +29 -33
  326. package/src/plugins/impl/DropdownPlugin.tsx +2 -6
  327. package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
  328. package/src/plugins/impl/FormPlugin.tsx +1 -1
  329. package/src/plugins/impl/RangeSliderPlugin.tsx +0 -1
  330. package/src/plugins/impl/RefreshPlugin.tsx +1 -0
  331. package/src/plugins/impl/SliderPlugin.tsx +6 -8
  332. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +117 -1
  333. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
  334. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
  335. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +2 -0
  336. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
  337. package/src/plugins/impl/anywidget/runtime.ts +21 -9
  338. package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
  339. package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
  340. package/src/plugins/impl/chat/chat-ui.tsx +12 -10
  341. package/src/plugins/impl/code/any-language-editor.tsx +2 -2
  342. package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
  343. package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
  344. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
  345. package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
  346. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -2
  347. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
  348. package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
  349. package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
  350. package/src/plugins/impl/panel/utils.ts +17 -0
  351. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
  352. package/src/plugins/impl/plotly/selection.ts +25 -19
  353. package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
  354. package/src/plugins/impl/vega/make-selectable.ts +4 -7
  355. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  356. package/src/stories/__tests__/editor-story.test.tsx +33 -0
  357. package/src/stories/button.stories.tsx +1 -0
  358. package/src/stories/editor.stories.tsx +24 -17
  359. package/src/stories/form-wrapper.stories.tsx +2 -2
  360. package/src/stories/select.stories.tsx +2 -2
  361. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  362. package/src/utils/__tests__/arrays.test.ts +35 -0
  363. package/src/utils/__tests__/batch-requests.test.ts +3 -3
  364. package/src/utils/__tests__/numbers.test.ts +48 -1
  365. package/src/utils/__tests__/objects.test.ts +21 -0
  366. package/src/utils/arrays.ts +10 -0
  367. package/src/utils/blob.ts +1 -1
  368. package/src/utils/numbers.ts +28 -17
  369. package/src/utils/objects.ts +3 -7
  370. package/src/utils/once.ts +19 -19
  371. package/src/utils/tracer.ts +9 -5
  372. package/src/utils/zod-utils.ts +1 -3
  373. package/dist/any-language-editor-DZ_YTVus.js +0 -76
  374. package/dist/assets/__vite-browser-external-BXYkiFsk.js +0 -1
  375. package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +0 -2
  376. package/dist/precisionRound-DMIVQrt2.js +0 -97
  377. package/src/core/host/__tests__/events.test.ts +0 -46
  378. package/src/core/host/__tests__/protocol.test.ts +0 -214
  379. package/src/core/host/events.ts +0 -60
  380. package/src/core/host/protocol.ts +0 -1943
  381. package/src/core/state/__tests__/jotai.test.ts +0 -25
  382. package/src/core/websocket/__tests__/createConnectionTransport.test.ts +0 -49
  383. package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
  384. package/src/core/websocket/transports/__tests__/sse.test.ts +0 -335
  385. package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
  386. package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
  387. package/src/core/websocket/transports/basic.ts +0 -102
  388. package/src/core/websocket/transports/create.ts +0 -31
  389. package/src/core/websocket/transports/sse.ts +0 -308
  390. package/src/core/websocket/transports/transport.ts +0 -50
  391. package/src/core/websocket/transports/ws.ts +0 -98
@@ -30,7 +30,7 @@ export interface CellSelectionCell {
30
30
  }
31
31
 
32
32
  // These are additional properties add to the table instance in createTable
33
- export interface CellSelectionInstance<TData extends RowData> {
33
+ export interface CellSelectionInstance {
34
34
  setCellSelection?: (updater: Updater<CellSelectionState>) => void;
35
35
 
36
36
  resetCellSelection?(defaultValue?: CellSelectionState): void;
@@ -44,7 +44,7 @@ declare module "@tanstack/react-table" {
44
44
  TData extends RowData,
45
45
  > extends CellSelectionOptions {}
46
46
 
47
- interface Table<TData extends RowData> extends CellSelectionInstance<TData> {}
47
+ interface Table<TData extends RowData> extends CellSelectionInstance {}
48
48
 
49
49
  interface Cell<TData extends RowData, TValue> extends CellSelectionCell {}
50
50
  }
@@ -10,13 +10,27 @@ import { cellId } from "@/__tests__/branded";
10
10
  import { LazyVegaEmbed } from "@/components/charts/lazy";
11
11
  import { vegaLoader } from "@/plugins/impl/vega/loader";
12
12
  import { ChartPanel, TablePanel, type TablePanelProps } from "../charts";
13
- import { getChartTabName, tabsStorageAtom } from "../storage";
13
+ import { createTabId, getChartTabName, tabsStorageAtom } from "../storage";
14
14
  import { ChartType, NONE_VALUE } from "../types";
15
+ import { TOO_MANY_ROWS } from "../../types";
15
16
 
16
17
  vi.mock("@/components/charts/lazy", () => ({
17
18
  LazyVegaEmbed: vi.fn(() => null),
18
19
  }));
19
20
 
21
+ vi.mock("../components/chart-items", async (importOriginal) => ({
22
+ ...(await importOriginal<typeof import("../components/chart-items")>()),
23
+ ChartTypeSelect: ({
24
+ onValueChange,
25
+ }: {
26
+ onValueChange: (value: string) => void;
27
+ }) => (
28
+ <button type="button" onClick={() => onValueChange("line")}>
29
+ Change chart type
30
+ </button>
31
+ ),
32
+ }));
33
+
20
34
  beforeAll(() => {
21
35
  SetupMocks.resizeObserver();
22
36
  });
@@ -38,6 +52,7 @@ describe("ChartPanel", () => {
38
52
  id,
39
53
  [
40
54
  {
55
+ id: createTabId(),
41
56
  tabName,
42
57
  chartType: ChartType.BAR,
43
58
  config: {
@@ -283,4 +298,62 @@ describe("ChartPanel", () => {
283
298
  });
284
299
  },
285
300
  );
301
+ it("keeps panel state when a chart type change renames the tab", async () => {
302
+ const store = createStore();
303
+ const id = cellId("rename-keeps-state");
304
+ const tabName = getChartTabName(0, ChartType.BAR);
305
+ store.set(
306
+ tabsStorageAtom,
307
+ new Map([
308
+ [
309
+ id,
310
+ [
311
+ {
312
+ id: createTabId(),
313
+ tabName,
314
+ chartType: ChartType.BAR,
315
+ config: {
316
+ general: {
317
+ xColumn: { field: "value", type: "number" },
318
+ yColumn: {
319
+ field: "value",
320
+ type: "integer",
321
+ aggregate: NONE_VALUE,
322
+ },
323
+ },
324
+ },
325
+ },
326
+ ],
327
+ ],
328
+ ]),
329
+ );
330
+ const sample = [{ value: 1 }];
331
+ const props: TablePanelProps = {
332
+ cellId: id,
333
+ data: sample,
334
+ dataTable: <div />,
335
+ totalRows: TOO_MANY_ROWS,
336
+ columns: 1,
337
+ displayHeader: true,
338
+ fieldTypes: [["value", ["number", "float64"]]],
339
+ };
340
+ const { getByRole, findByRole, queryByRole } = render(
341
+ <Provider store={store}>
342
+ <Tooltip.Provider>
343
+ <TablePanel {...props} />
344
+ </Tooltip.Provider>
345
+ </Provider>,
346
+ );
347
+ fireEvent.click(getByRole("tab", { name: tabName }));
348
+ fireEvent.click(await findByRole("button", { name: "Proceed" }));
349
+ await waitFor(() => {
350
+ expect(queryByRole("button", { name: "Proceed" })).toBeNull();
351
+ });
352
+
353
+ fireEvent.click(getByRole("button", { name: "Change chart type" }));
354
+
355
+ const renamed = getChartTabName(0, ChartType.LINE);
356
+ await findByRole("tab", { name: renamed });
357
+ expect(queryByRole("button", { name: "Proceed" })).toBeNull();
358
+ });
286
359
  });
@@ -39,13 +39,13 @@ describe("create vega spec", () => {
39
39
  });
40
40
 
41
41
  it("should create and augment a spec", () => {
42
- const spec = createSpecWithoutData(
43
- ChartType.BAR,
44
- createBasicFormValues(),
45
- "light",
46
- 400,
47
- 300,
48
- );
42
+ const spec = createSpecWithoutData({
43
+ chartType: ChartType.BAR,
44
+ formValues: createBasicFormValues(),
45
+ theme: "light",
46
+ width: 400,
47
+ height: 300,
48
+ });
49
49
  expect(spec).toMatchSnapshot();
50
50
  expect(typeof spec !== "string").toBe(true); // Not error message
51
51
  expect((spec as TopLevelSpec).data).toEqual({ values: [] });
@@ -59,25 +59,25 @@ describe("create vega spec", () => {
59
59
  const formValues = createBasicFormValues();
60
60
  formValues.general!.xColumn!.field = undefined;
61
61
 
62
- const spec = createSpecWithoutData(
63
- ChartType.BAR,
62
+ const spec = createSpecWithoutData({
63
+ chartType: ChartType.BAR,
64
64
  formValues,
65
- "light",
66
- 400,
67
- 300,
68
- );
65
+ theme: "light",
66
+ width: 400,
67
+ height: 300,
68
+ });
69
69
  expect(spec).toEqual(X_AXIS_REQUIRED);
70
70
 
71
71
  // Undefined yColumn
72
72
  const formValues2 = createBasicFormValues();
73
73
  formValues2.general!.yColumn!.field = undefined;
74
- const spec2 = createSpecWithoutData(
75
- ChartType.BAR,
76
- formValues2,
77
- "light",
78
- 400,
79
- 300,
80
- );
74
+ const spec2 = createSpecWithoutData({
75
+ chartType: ChartType.BAR,
76
+ formValues: formValues2,
77
+ theme: "light",
78
+ width: 400,
79
+ height: 300,
80
+ });
81
81
  expect(spec2).toEqual(Y_AXIS_REQUIRED);
82
82
  });
83
83
  });
@@ -29,10 +29,12 @@ describe("getAxisEncoding", () => {
29
29
  aggregate: "sum",
30
30
  timeUnit: undefined,
31
31
  },
32
- { binned: true, step: 10 },
33
- COUNT_FIELD,
34
- true,
35
- ChartType.BAR,
32
+ {
33
+ binValues: { binned: true, step: 10 },
34
+ label: COUNT_FIELD,
35
+ stack: true,
36
+ chartType: ChartType.BAR,
37
+ },
36
38
  );
37
39
 
38
40
  expect(result).toEqual({
@@ -52,10 +54,12 @@ describe("getAxisEncoding", () => {
52
54
  aggregate: "mean",
53
55
  timeUnit: undefined,
54
56
  },
55
- undefined,
56
- "Average Price",
57
- false,
58
- ChartType.BAR,
57
+ {
58
+ binValues: undefined,
59
+ label: "Average Price",
60
+ stack: false,
61
+ chartType: ChartType.BAR,
62
+ },
59
63
  );
60
64
 
61
65
  expect(result).toEqual({
@@ -79,10 +83,12 @@ describe("getAxisEncoding", () => {
79
83
  aggregate: NONE_VALUE,
80
84
  timeUnit,
81
85
  },
82
- undefined,
83
- "Date",
84
- undefined,
85
- ChartType.LINE,
86
+ {
87
+ binValues: undefined,
88
+ label: "Date",
89
+ stack: undefined,
90
+ chartType: ChartType.LINE,
91
+ },
86
92
  );
87
93
 
88
94
  expect(result).toEqual({
@@ -105,10 +111,12 @@ describe("getAxisEncoding", () => {
105
111
  aggregate: NONE_VALUE,
106
112
  timeUnit: undefined,
107
113
  },
108
- undefined,
109
- "Category",
110
- true,
111
- ChartType.BAR,
114
+ {
115
+ binValues: undefined,
116
+ label: "Category",
117
+ stack: true,
118
+ chartType: ChartType.BAR,
119
+ },
112
120
  );
113
121
 
114
122
  expect(result).toEqual({
@@ -129,10 +137,12 @@ describe("getAxisEncoding", () => {
129
137
  aggregate: "sum",
130
138
  timeUnit: undefined,
131
139
  },
132
- undefined,
133
- "Value",
134
- false,
135
- ChartType.BAR,
140
+ {
141
+ binValues: undefined,
142
+ label: "Value",
143
+ stack: false,
144
+ chartType: ChartType.BAR,
145
+ },
136
146
  );
137
147
 
138
148
  expect((result as { bin?: unknown }).bin).toBeUndefined();
@@ -146,10 +156,12 @@ describe("getAxisEncoding", () => {
146
156
  aggregate: "sum",
147
157
  timeUnit: undefined,
148
158
  },
149
- undefined,
150
- undefined,
151
- false,
152
- ChartType.BAR,
159
+ {
160
+ binValues: undefined,
161
+ label: undefined,
162
+ stack: false,
163
+ chartType: ChartType.BAR,
164
+ },
153
165
  );
154
166
 
155
167
  expect((result as { title?: string }).title).toBeUndefined();
@@ -164,10 +176,12 @@ describe("getAxisEncoding", () => {
164
176
  aggregate: agg,
165
177
  timeUnit: undefined,
166
178
  },
167
- undefined,
168
- "Value",
169
- false,
170
- ChartType.BAR,
179
+ {
180
+ binValues: undefined,
181
+ label: "Value",
182
+ stack: false,
183
+ chartType: ChartType.BAR,
184
+ },
171
185
  );
172
186
 
173
187
  const expectedAggregate = (result as { aggregate?: string }).aggregate;
@@ -189,10 +203,12 @@ describe("getAxisEncoding", () => {
189
203
  aggregate: agg,
190
204
  timeUnit: undefined,
191
205
  },
192
- undefined,
193
- "Date",
194
- false,
195
- ChartType.BAR,
206
+ {
207
+ binValues: undefined,
208
+ label: "Date",
209
+ stack: false,
210
+ chartType: ChartType.BAR,
211
+ },
196
212
  );
197
213
 
198
214
  const expectedAggregate = (result as { aggregate?: string }).aggregate;
@@ -209,10 +225,12 @@ describe("getAxisEncoding", () => {
209
225
  sort: sort as "ascending" | "descending",
210
226
  aggregate: NONE_VALUE,
211
227
  },
212
- undefined,
213
- "Value",
214
- false,
215
- ChartType.BAR,
228
+ {
229
+ binValues: undefined,
230
+ label: "Value",
231
+ stack: false,
232
+ chartType: ChartType.BAR,
233
+ },
216
234
  );
217
235
 
218
236
  const expectedSort = (result as { sort?: string }).sort;
@@ -1009,10 +1027,12 @@ describe("Special character escaping in specs", () => {
1009
1027
  aggregate: "sum",
1010
1028
  timeUnit: undefined,
1011
1029
  },
1012
- undefined,
1013
- "Value",
1014
- false,
1015
- ChartType.BAR,
1030
+ {
1031
+ binValues: undefined,
1032
+ label: "Value",
1033
+ stack: false,
1034
+ chartType: ChartType.BAR,
1035
+ },
1016
1036
  );
1017
1037
 
1018
1038
  invariant("field" in result, "field should be defined");
@@ -1027,10 +1047,12 @@ describe("Special character escaping in specs", () => {
1027
1047
  aggregate: "mean",
1028
1048
  timeUnit: undefined,
1029
1049
  },
1030
- undefined,
1031
- "Data",
1032
- false,
1033
- ChartType.BAR,
1050
+ {
1051
+ binValues: undefined,
1052
+ label: "Data",
1053
+ stack: false,
1054
+ chartType: ChartType.BAR,
1055
+ },
1034
1056
  );
1035
1057
 
1036
1058
  invariant("field" in result, "field should be defined");
@@ -1045,10 +1067,12 @@ describe("Special character escaping in specs", () => {
1045
1067
  aggregate: NONE_VALUE,
1046
1068
  timeUnit: "yearmonth",
1047
1069
  },
1048
- undefined,
1049
- "Timestamp",
1050
- false,
1051
- ChartType.LINE,
1070
+ {
1071
+ binValues: undefined,
1072
+ label: "Timestamp",
1073
+ stack: false,
1074
+ chartType: ChartType.LINE,
1075
+ },
1052
1076
  );
1053
1077
 
1054
1078
  invariant("field" in result, "field should be defined");
@@ -1063,10 +1087,12 @@ describe("Special character escaping in specs", () => {
1063
1087
  aggregate: "sum",
1064
1088
  timeUnit: undefined,
1065
1089
  },
1066
- undefined,
1067
- "Result",
1068
- false,
1069
- ChartType.BAR,
1090
+ {
1091
+ binValues: undefined,
1092
+ label: "Result",
1093
+ stack: false,
1094
+ chartType: ChartType.BAR,
1095
+ },
1070
1096
  );
1071
1097
 
1072
1098
  invariant("field" in result, "field should be defined");
@@ -16,7 +16,7 @@ import { cellId } from "@/__tests__/branded";
16
16
  import { availableStorage } from "@/utils/storage/storage";
17
17
  import { ChartSchema } from "../schemas";
18
18
  import type { TabName } from "../storage";
19
- import { KEY, tabsStorageAtom } from "../storage";
19
+ import { createTabId, KEY, tabsStorageAtom } from "../storage";
20
20
  import { ChartType } from "../types";
21
21
 
22
22
  describe("Chart Transforms Storage", () => {
@@ -39,6 +39,7 @@ describe("Chart Transforms Storage", () => {
39
39
  const store = getDefaultStore();
40
40
  const cid = cellId("cell-1");
41
41
  const tabData = {
42
+ id: createTabId(),
42
43
  tabName: "Tab 1" as TabName,
43
44
  chartType: ChartType.LINE,
44
45
  config: ChartSchema.parse({
@@ -63,6 +64,7 @@ describe("Chart Transforms Storage", () => {
63
64
  const store = getDefaultStore();
64
65
  const cid = cellId("cell-1");
65
66
  const tabData1 = {
67
+ id: createTabId(),
66
68
  tabName: "Tab 1" as TabName,
67
69
  chartType: ChartType.LINE,
68
70
  config: ChartSchema.parse({
@@ -73,6 +75,7 @@ describe("Chart Transforms Storage", () => {
73
75
  }),
74
76
  };
75
77
  const tabData2 = {
78
+ id: createTabId(),
76
79
  tabName: "Tab 2" as TabName,
77
80
  chartType: ChartType.BAR,
78
81
  config: ChartSchema.parse({
@@ -51,13 +51,19 @@ export type ErrorMessage = TypedString<"ErrorMessage">;
51
51
  export const X_AXIS_REQUIRED = "X-axis column is required" as ErrorMessage;
52
52
  export const Y_AXIS_REQUIRED = "Y-axis column is required" as ErrorMessage;
53
53
 
54
- export function createSpecWithoutData(
55
- chartType: ChartType,
56
- formValues: ChartSchemaType,
57
- theme: ResolvedTheme,
58
- width: number | "container",
59
- height: number,
60
- ): TopLevelSpec | ErrorMessage {
54
+ export function createSpecWithoutData({
55
+ chartType,
56
+ formValues,
57
+ theme,
58
+ width,
59
+ height,
60
+ }: {
61
+ chartType: ChartType;
62
+ formValues: ChartSchemaType;
63
+ theme: ResolvedTheme;
64
+ width: number | "container";
65
+ height: number;
66
+ }): TopLevelSpec | ErrorMessage {
61
67
  const {
62
68
  xColumn,
63
69
  yColumn,
@@ -85,27 +91,25 @@ export function createSpecWithoutData(
85
91
  const yEncodingKey = "y";
86
92
 
87
93
  // Create encodings
88
- const xEncoding = getAxisEncoding(
89
- xColumn,
90
- formValues.xAxis?.bin,
91
- getFieldLabel(formValues.xAxis?.label),
92
- colorByColumn?.field && horizontal ? stacking : undefined,
94
+ const xEncoding = getAxisEncoding(xColumn, {
95
+ binValues: formValues.xAxis?.bin,
96
+ label: getFieldLabel(formValues.xAxis?.label),
97
+ stack: colorByColumn?.field && horizontal ? stacking : undefined,
93
98
  chartType,
94
- );
99
+ });
95
100
 
96
101
  let defaultYAggregation: ValidAggregationFn = DEFAULT_AGGREGATION;
97
102
  if (yColumn?.selectedDataType === "string") {
98
103
  defaultYAggregation = "count";
99
104
  }
100
105
 
101
- const yEncoding = getAxisEncoding(
102
- yColumn,
103
- formValues.yAxis?.bin,
104
- getFieldLabel(formValues.yAxis?.label),
105
- colorByColumn?.field && !horizontal ? stacking : undefined,
106
+ const yEncoding = getAxisEncoding(yColumn, {
107
+ binValues: formValues.yAxis?.bin,
108
+ label: getFieldLabel(formValues.yAxis?.label),
109
+ stack: colorByColumn?.field && !horizontal ? stacking : undefined,
106
110
  chartType,
107
- defaultYAggregation,
108
- );
111
+ defaultAggregate: defaultYAggregation,
112
+ });
109
113
 
110
114
  const rowFacet = facet?.row.field
111
115
  ? getFacetEncoding(facet.row, chartType)
@@ -115,14 +119,14 @@ export function createSpecWithoutData(
115
119
  : undefined;
116
120
 
117
121
  const colorByEncoding = getColorEncoding(chartType, formValues);
118
- const baseSpec = getBaseSpec(
122
+ const baseSpec = getBaseSpec({
119
123
  chartType,
120
124
  formValues,
121
125
  theme,
122
126
  width,
123
127
  height,
124
128
  title,
125
- );
129
+ });
126
130
  const baseEncoding: Encoding<Field> = {
127
131
  [xEncodingKey]: horizontal ? yEncoding : xEncoding,
128
132
  [yEncodingKey]: horizontal ? xEncoding : yEncoding,
@@ -160,11 +164,19 @@ export function augmentSpecWithData(
160
164
 
161
165
  export function getAxisEncoding(
162
166
  column: NonNullable<z.infer<typeof AxisSchema>>,
163
- binValues: z.infer<typeof BinSchema> | undefined,
164
- label: string | undefined,
165
- stack: boolean | undefined,
166
- chartType: ChartType,
167
- defaultAggregate?: ValidAggregationFn,
167
+ {
168
+ binValues,
169
+ label,
170
+ stack,
171
+ chartType,
172
+ defaultAggregate,
173
+ }: {
174
+ binValues: z.infer<typeof BinSchema> | undefined;
175
+ label: string | undefined;
176
+ stack: boolean | undefined;
177
+ chartType: ChartType;
178
+ defaultAggregate?: ValidAggregationFn;
179
+ },
168
180
  ): PositionDef<string> {
169
181
  const selectedDataType = column.selectedDataType || "string";
170
182
 
@@ -236,13 +248,12 @@ function getPieChartSpec(
236
248
  return "Size by column is required" as ErrorMessage;
237
249
  }
238
250
 
239
- const thetaEncoding: PolarDef<string> = getAxisEncoding(
240
- yColumn,
241
- formValues.xAxis?.bin,
242
- getFieldLabel(formValues.xAxis?.label),
243
- undefined,
244
- ChartType.PIE,
245
- );
251
+ const thetaEncoding: PolarDef<string> = getAxisEncoding(yColumn, {
252
+ binValues: formValues.xAxis?.bin,
253
+ label: getFieldLabel(formValues.xAxis?.label),
254
+ stack: undefined,
255
+ chartType: ChartType.PIE,
256
+ });
246
257
 
247
258
  const colorEncoding: ColorDef<string> = {
248
259
  field: escapeFieldName(colorByColumn.field),
@@ -252,7 +263,14 @@ function getPieChartSpec(
252
263
  };
253
264
 
254
265
  return {
255
- ...getBaseSpec(ChartType.PIE, formValues, theme, width, height, title),
266
+ ...getBaseSpec({
267
+ chartType: ChartType.PIE,
268
+ formValues,
269
+ theme,
270
+ width,
271
+ height,
272
+ title,
273
+ }),
256
274
  mark: {
257
275
  type: convertChartTypeToMark(ChartType.PIE),
258
276
  innerRadius: formValues.style?.innerRadius,
@@ -270,14 +288,21 @@ function getPieChartSpec(
270
288
  };
271
289
  }
272
290
 
273
- function getBaseSpec(
274
- chartType: ChartType,
275
- formValues: ChartSchemaType,
276
- theme: ResolvedTheme,
277
- width: number | "container",
278
- height: number,
279
- title?: string,
280
- ): BaseSpec {
291
+ function getBaseSpec({
292
+ chartType,
293
+ formValues,
294
+ theme,
295
+ width,
296
+ height,
297
+ title,
298
+ }: {
299
+ chartType: ChartType;
300
+ formValues: ChartSchemaType;
301
+ theme: ResolvedTheme;
302
+ width: number | "container";
303
+ height: number;
304
+ title?: string;
305
+ }): BaseSpec {
281
306
  let gridLines = formValues.style?.gridLines ?? false;
282
307
  // Scatter charts have grid lines by default
283
308
  if (chartType === ChartType.SCATTER) {