@marimo-team/frontend 0.19.7-dev23 → 0.19.7-dev25

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 (134) hide show
  1. package/dist/assets/{CellStatus-DFhwmbo5.js → CellStatus-oBL2iale.js} +1 -1
  2. package/dist/assets/{ConnectedDataExplorerComponent-Cosas-Z0.js → ConnectedDataExplorerComponent-ec_bSRbX.js} +1 -1
  3. package/dist/assets/{ErrorBoundary-BU1OKJ3L.js → ErrorBoundary-ChCiwl15.js} +1 -1
  4. package/dist/assets/{ImperativeModal-DstvzsTs.js → ImperativeModal-CUbWEBci.js} +1 -1
  5. package/dist/assets/{JsonOutput-Dmfgex9T.js → JsonOutput-BKP4rBIw.js} +3 -3
  6. package/dist/assets/{LazyAnyLanguageCodeMirror-ygeIsKeo.js → LazyAnyLanguageCodeMirror-yzHjsVJt.js} +2 -2
  7. package/dist/assets/{MarimoErrorOutput-eoDwRuKU.js → MarimoErrorOutput-cw9gEb4T.js} +1 -1
  8. package/dist/assets/{RenderHTML-DuJkj1GV.js → RenderHTML-Bgz4e362.js} +1 -1
  9. package/dist/assets/{add-cell-with-ai-COxBrLrH.js → add-cell-with-ai-DNbX7Ctg.js} +1 -1
  10. package/dist/assets/{add-database-form-BtP14Anj.js → add-database-form-CP39qGit.js} +1 -1
  11. package/dist/assets/{agent-panel-Baphp2Rh.js → agent-panel-Bak-DtIc.js} +1 -1
  12. package/dist/assets/{ai-model-dropdown-GvB-5iLY.js → ai-model-dropdown-Dpr0DUJN.js} +1 -1
  13. package/dist/assets/{alert-dialog-Bv1sALHm.js → alert-dialog-DwQffb13.js} +1 -1
  14. package/dist/assets/{any-language-editor-WGtuXPVf.js → any-language-editor-BMlwpEZ4.js} +1 -1
  15. package/dist/assets/{app-config-button-BK2508Jf.js → app-config-button-CAaYaq0L.js} +1 -1
  16. package/dist/assets/{button-B3uq-Cpf.js → button-YC1gW_kJ.js} +1 -1
  17. package/dist/assets/{cache-panel-DFXoPp-r.js → cache-panel-BHX9f5Bx.js} +1 -1
  18. package/dist/assets/{capabilities-CUpom6r4.js → capabilities-MM7JYRxj.js} +1 -1
  19. package/dist/assets/{capitalize-CXGTjPyK.js → capitalize-CkclHYWI.js} +1 -1
  20. package/dist/assets/{cell-editor-Cqw8VDah.js → cell-editor-B6jD1bv8.js} +10 -10
  21. package/dist/assets/{cell-link-BITMERKQ.js → cell-link-CyIWDVXR.js} +1 -1
  22. package/dist/assets/{cells-Cvo5AIrZ.js → cells-DRiwSVs0.js} +1 -1
  23. package/dist/assets/{chat-components-BV83l1rZ.js → chat-components-DDIZD9FU.js} +1 -1
  24. package/dist/assets/{chat-display-C4qhRyWq.js → chat-display-D-Wa-1Hv.js} +1 -1
  25. package/dist/assets/{chat-panel-BxxPae_R.js → chat-panel-RtFQiyUV.js} +1 -1
  26. package/dist/assets/{column-preview-BvwEAGt6.js → column-preview-C72fVZoP.js} +1 -1
  27. package/dist/assets/{command-BjWSp3sa.js → command-Bq3e85NA.js} +1 -1
  28. package/dist/assets/{command-palette-aT5upvTH.js → command-palette-D4NcN7PV.js} +1 -1
  29. package/dist/assets/{common-BLddv5HY.js → common-CeF2TOUZ.js} +1 -1
  30. package/dist/assets/{config-BgpK7vqH.js → config-CIrPQIbt.js} +1 -1
  31. package/dist/assets/{copy-r7i0SKI4.js → copy-Bv2DBpIS.js} +1 -1
  32. package/dist/assets/{copy-icon-wZr2McVB.js → copy-icon-BhONVREY.js} +1 -1
  33. package/dist/assets/{createReducer-Cki97cx5.js → createReducer-Dnna-AUO.js} +1 -1
  34. package/dist/assets/{datasource-D2hNaG_n.js → datasource-AZ3l2P48.js} +1 -1
  35. package/dist/assets/{dates-CxJmszXT.js → dates-Dhn1r-h6.js} +1 -1
  36. package/dist/assets/{dependency-graph-panel-CBiKFUBG.js → dependency-graph-panel-i3yTswTN.js} +1 -1
  37. package/dist/assets/{dialog-C5Pa_iIq.js → dialog-CxGKN4C_.js} +1 -1
  38. package/dist/assets/{dist-R0oOvu5B.js → dist-CdxIjAOP.js} +1 -1
  39. package/dist/assets/{documentation-panel-ChkvmAB1.js → documentation-panel-J2fwLjEP.js} +1 -1
  40. package/dist/assets/download-Y3BpaOoI.js +6 -0
  41. package/dist/assets/{edit-page-BfA_Lg2x.js → edit-page-Bpl6BN5G.js} +6 -6
  42. package/dist/assets/{error-banner-BWJsOpnc.js → error-banner-DUzsIXtq.js} +1 -1
  43. package/dist/assets/{error-panel-Bnhv5zxn.js → error-panel-Cpfr8TZw.js} +1 -1
  44. package/dist/assets/{field-BN2j4cag.js → field-BEg1eC0P.js} +1 -1
  45. package/dist/assets/{file-explorer-panel-CkOMaMbq.js → file-explorer-panel-DsMwvQX7.js} +1 -1
  46. package/dist/assets/{floating-outline-CxfziveS.js → floating-outline-yvPiOGQ2.js} +1 -1
  47. package/dist/assets/{focus-BeWVOW9Q.js → focus-B7xu7kpl.js} +1 -1
  48. package/dist/assets/{form-DazVYGCT.js → form-BpwI8bBX.js} +1 -1
  49. package/dist/assets/{formats-BBDL2N4i.js → formats-W1SWxSE3.js} +1 -1
  50. package/dist/assets/{glide-data-editor-DEwgx2xp.js → glide-data-editor-DVw6MlCk.js} +1 -1
  51. package/dist/assets/{globals-uEPg-4pq.js → globals-BW23ny3Q.js} +1 -1
  52. package/dist/assets/{home-page-Dtcd7Trh.js → home-page-C-JIKt-2.js} +1 -1
  53. package/dist/assets/hooks-2c2seyHG.js +1 -0
  54. package/dist/assets/hotkeys-BHHWjLlp.js +1 -0
  55. package/dist/assets/{html-to-image-CJgqxZci.js → html-to-image-Cy_LYuWW.js} +1 -1
  56. package/dist/assets/{index-DCjsZDGq.js → index-C4si8YAb.js} +21 -26
  57. package/dist/assets/index-DHsXOI_M.css +2 -0
  58. package/dist/assets/{input-BeGfEf2S.js → input-pAun1m1X.js} +1 -1
  59. package/dist/assets/{kiosk-mode-Djm3JPwk.js → kiosk-mode-D9jdUD5P.js} +1 -1
  60. package/dist/assets/{label-C_OuzPjQ.js → label-Be1daUcS.js} +1 -1
  61. package/dist/assets/{layout-BkGjQBnQ.js → layout-BjIcxFO0.js} +4 -4
  62. package/dist/assets/links-C-GGaW8R.js +1 -0
  63. package/dist/assets/{logs-panel-BsnCP3we.js → logs-panel-XVSOzGFv.js} +1 -1
  64. package/dist/assets/{maps-vcWR7nnr.js → maps-t9yNKYA8.js} +1 -1
  65. package/dist/assets/{markdown-renderer-CoQm4UxN.js → markdown-renderer-BM4a9QeZ.js} +1 -1
  66. package/dist/assets/{mermaid-R2vBM-JH.js → mermaid-BG5ill_a.js} +1 -1
  67. package/dist/assets/{mode-DjraKyN2.js → mode-BD6zDBBd.js} +1 -1
  68. package/dist/assets/{multi-map-Cwq--tzY.js → multi-map-C8GlnP-4.js} +1 -1
  69. package/dist/assets/{name-cell-input-CHmzPoeN.js → name-cell-input-CGevX71g.js} +1 -1
  70. package/dist/assets/{numbers-CSY3JIgn.js → numbers-iQunIAXf.js} +1 -1
  71. package/dist/assets/{outline-panel-DMECjI9i.js → outline-panel-BgZXYbEO.js} +1 -1
  72. package/dist/assets/{packages-panel-CbXV6Rc8.js → packages-panel-8NDUaEZw.js} +1 -1
  73. package/dist/assets/{panels-B55q0DEo.js → panels-05G4QYfq.js} +1 -1
  74. package/dist/assets/{process-output-CwcoTocd.js → process-output-nNOt7QtH.js} +1 -1
  75. package/dist/assets/{readonly-python-code-BlVsu50E.js → readonly-python-code-CfLdThzF.js} +1 -1
  76. package/dist/assets/{renderShortcut-Dyrbz79Y.js → renderShortcut-DHc-p-_c.js} +1 -1
  77. package/dist/assets/{run-page-6DKviU71.js → run-page-DvWw2rQu.js} +1 -1
  78. package/dist/assets/{runs-CAvk6jVz.js → runs-bjsj1D88.js} +1 -1
  79. package/dist/assets/{scratchpad-panel-CM5InA2G.js → scratchpad-panel-Bzreyj8q.js} +1 -1
  80. package/dist/assets/{secrets-panel-XDvrD2PC.js → secrets-panel-Br6CcsOE.js} +1 -1
  81. package/dist/assets/{select-UFziUNxL.js → select-V5IdpNiR.js} +1 -1
  82. package/dist/assets/{session-panel-CRStSDDj.js → session-panel-CxCUFR_x.js} +1 -1
  83. package/dist/assets/{share-CKfNi8fD.js → share-CbPtIlnM.js} +1 -1
  84. package/dist/assets/{slides-component-0GonPC6Y.js → slides-component-DP2pxhDh.js} +1 -1
  85. package/dist/assets/{snippets-panel-Db-biIgP.js → snippets-panel-BeqbqiKB.js} +1 -1
  86. package/dist/assets/{spec-DJ3YTCel.js → spec-BSxN05D8.js} +1 -1
  87. package/dist/assets/{state-D-CqcbQE.js → state-D7LZMIOW.js} +1 -1
  88. package/dist/assets/{state-CS48Wh7M.js → state-DnUQ1uxR.js} +1 -1
  89. package/dist/assets/{switch-Di5kBaS8.js → switch-Cx8dJhf6.js} +1 -1
  90. package/dist/assets/{terminal-nu6YfkVm.js → terminal-DNwT6UrR.js} +1 -1
  91. package/dist/assets/{textarea-hNyWE2r_.js → textarea-DellDgP4.js} +1 -1
  92. package/dist/assets/{tooltip-CE4l3v3B.js → tooltip-BGrCWNss.js} +1 -1
  93. package/dist/assets/{tracing-CDNRUjb9.js → tracing-7U4WTsN0.js} +1 -1
  94. package/dist/assets/{tracing-panel-CHVKa-9o.js → tracing-panel-BPW1q7K3.js} +2 -2
  95. package/dist/assets/{type-D8l_U05h.js → type-DUK-1jKc.js} +1 -1
  96. package/dist/assets/{types-DWpF5HiT.js → types-D5X7ikSD.js} +1 -1
  97. package/dist/assets/{useAddCell-CklpKCq2.js → useAddCell-bMoxoWAg.js} +1 -1
  98. package/dist/assets/{useBoolean-BE72e3yb.js → useBoolean-B1Xeh6vA.js} +1 -1
  99. package/dist/assets/{useCellActionButton-CQQ8dBy_.js → useCellActionButton-0MDUWMcl.js} +1 -1
  100. package/dist/assets/{useDeleteCell-BRWEDSc9.js → useDeleteCell-BUAQb9OH.js} +1 -1
  101. package/dist/assets/{useDependencyPanelTab-_ibASMD1.js → useDependencyPanelTab-odtlfdG2.js} +1 -1
  102. package/dist/assets/{useIframeCapabilities-BVYqWHmA.js → useIframeCapabilities-DuIDx9mD.js} +1 -1
  103. package/dist/assets/{useInstallPackage-Dxl_p6oW.js → useInstallPackage-Bdnnp5fe.js} +1 -1
  104. package/dist/assets/{useLifecycle-DvpL8DUJ.js → useLifecycle-ChNbzbYY.js} +1 -1
  105. package/dist/assets/useNotebookActions-CNWP5yqL.js +1 -0
  106. package/dist/assets/{useRunCells-jbEa8WGV.js → useRunCells-DyBzMbHe.js} +1 -1
  107. package/dist/assets/{useSplitCell-CdjW9REr.js → useSplitCell-CyFavQ2l.js} +1 -1
  108. package/dist/assets/{useTheme-CuyH5VNX.js → useTheme-DUdVAZI8.js} +1 -1
  109. package/dist/assets/{utilities.esm-eBoXu7lR.js → utilities.esm-j_F9mYkM.js} +1 -1
  110. package/dist/assets/{utils-CSDCHxwI.js → utils-DXvhzCGS.js} +1 -1
  111. package/dist/assets/{vega-component-B3_9VVhH.js → vega-component-Dd3MCYZO.js} +1 -1
  112. package/dist/assets/{write-secret-modal-DfRIeQB5.js → write-secret-modal-CpmU5gbF.js} +1 -1
  113. package/dist/index.html +67 -67
  114. package/package.json +1 -1
  115. package/src/components/editor/actions/useNotebookActions.tsx +5 -3
  116. package/src/components/editor/header/filename-form.tsx +15 -2
  117. package/src/components/editor/navigation/__tests__/navigation.test.ts +2 -0
  118. package/src/components/ui/progress.tsx +22 -5
  119. package/src/core/export/__tests__/hooks.test.ts +42 -19
  120. package/src/core/export/hooks.ts +33 -32
  121. package/src/core/saving/save-component.tsx +1 -0
  122. package/src/utils/__tests__/download.test.tsx +6 -4
  123. package/src/utils/__tests__/objects.test.ts +263 -0
  124. package/src/utils/__tests__/progress.test.ts +156 -0
  125. package/src/utils/download.ts +7 -2
  126. package/src/utils/objects.ts +3 -0
  127. package/src/utils/progress.ts +61 -0
  128. package/src/utils/toast-progress.tsx +41 -0
  129. package/dist/assets/download-kUMZIq8-.js +0 -1
  130. package/dist/assets/hooks-DxXRX-38.js +0 -1
  131. package/dist/assets/hotkeys-DghjL7BQ.js +0 -1
  132. package/dist/assets/index-CodxHczV.css +0 -2
  133. package/dist/assets/links-CUKo4afc.js +0 -1
  134. package/dist/assets/useNotebookActions-REoVp8xc.js +0 -1
package/dist/index.html CHANGED
@@ -66,7 +66,7 @@
66
66
  <marimo-server-token data-token="{{ server_token }}" hidden></marimo-server-token>
67
67
  <!-- /TODO -->
68
68
  <title>{{ title }}</title>
69
- <script type="module" crossorigin src="./assets/index-DCjsZDGq.js"></script>
69
+ <script type="module" crossorigin src="./assets/index-C4si8YAb.js"></script>
70
70
  <link rel="modulepreload" crossorigin href="./assets/preload-helper-DItdS47A.js">
71
71
  <link rel="modulepreload" crossorigin href="./assets/clsx-D8GwTfvk.js">
72
72
  <link rel="modulepreload" crossorigin href="./assets/cn-BKtXLv3a.js">
@@ -75,16 +75,16 @@
75
75
  <link rel="modulepreload" crossorigin href="./assets/compiler-runtime-DeeZ7FnK.js">
76
76
  <link rel="modulepreload" crossorigin href="./assets/jsx-runtime-ZmTK25f3.js">
77
77
  <link rel="modulepreload" crossorigin href="./assets/badge-Ce8wRjuQ.js">
78
- <link rel="modulepreload" crossorigin href="./assets/hotkeys-DghjL7BQ.js">
78
+ <link rel="modulepreload" crossorigin href="./assets/hotkeys-BHHWjLlp.js">
79
79
  <link rel="modulepreload" crossorigin href="./assets/useEventListener-DIUKKfEy.js">
80
- <link rel="modulepreload" crossorigin href="./assets/button-B3uq-Cpf.js">
80
+ <link rel="modulepreload" crossorigin href="./assets/button-YC1gW_kJ.js">
81
81
  <link rel="modulepreload" crossorigin href="./assets/react-dom-C9fstfnp.js">
82
82
  <link rel="modulepreload" crossorigin href="./assets/Combination-CMPwuAmi.js">
83
83
  <link rel="modulepreload" crossorigin href="./assets/menu-items-CJhvWPOk.js">
84
84
  <link rel="modulepreload" crossorigin href="./assets/dist-uzvC4uAK.js">
85
85
  <link rel="modulepreload" crossorigin href="./assets/createLucideIcon-CnW3RofX.js">
86
86
  <link rel="modulepreload" crossorigin href="./assets/check-DdfN0k2d.js">
87
- <link rel="modulepreload" crossorigin href="./assets/select-UFziUNxL.js">
87
+ <link rel="modulepreload" crossorigin href="./assets/select-V5IdpNiR.js">
88
88
  <link rel="modulepreload" crossorigin href="./assets/tooltip-CEc2ajau.js">
89
89
  <link rel="modulepreload" crossorigin href="./assets/use-toast-rmUWldD_.js">
90
90
  <link rel="modulepreload" crossorigin href="./assets/_Uint8Array-BGESiCQL.js">
@@ -94,22 +94,22 @@
94
94
  <link rel="modulepreload" crossorigin href="./assets/_baseFor-Duhs3RiJ.js">
95
95
  <link rel="modulepreload" crossorigin href="./assets/merge-BBX6ug-N.js">
96
96
  <link rel="modulepreload" crossorigin href="./assets/zod-Cg4WLWh2.js">
97
- <link rel="modulepreload" crossorigin href="./assets/utils-CSDCHxwI.js">
97
+ <link rel="modulepreload" crossorigin href="./assets/utils-DXvhzCGS.js">
98
98
  <link rel="modulepreload" crossorigin href="./assets/constants-B6Cb__3x.js">
99
99
  <link rel="modulepreload" crossorigin href="./assets/Deferred-CrO5-0RA.js">
100
- <link rel="modulepreload" crossorigin href="./assets/config-BgpK7vqH.js">
100
+ <link rel="modulepreload" crossorigin href="./assets/config-CIrPQIbt.js">
101
101
  <link rel="modulepreload" crossorigin href="./assets/uuid-DercMavo.js">
102
102
  <link rel="modulepreload" crossorigin href="./assets/DeferredRequestRegistry-CO2AyNfd.js">
103
103
  <link rel="modulepreload" crossorigin href="./assets/requests-BsVD4CdD.js">
104
104
  <link rel="modulepreload" crossorigin href="./assets/isSymbol-BGkTcW3U.js">
105
105
  <link rel="modulepreload" crossorigin href="./assets/toString-DlRqgfqz.js">
106
106
  <link rel="modulepreload" crossorigin href="./assets/_hasUnicode-CWqKLxBC.js">
107
- <link rel="modulepreload" crossorigin href="./assets/useLifecycle-DvpL8DUJ.js">
107
+ <link rel="modulepreload" crossorigin href="./assets/useLifecycle-ChNbzbYY.js">
108
108
  <link rel="modulepreload" crossorigin href="./assets/useNonce-_Aax6sXd.js">
109
- <link rel="modulepreload" crossorigin href="./assets/useTheme-CuyH5VNX.js">
109
+ <link rel="modulepreload" crossorigin href="./assets/useTheme-DUdVAZI8.js">
110
110
  <link rel="modulepreload" crossorigin href="./assets/once-Bul8mtFs.js">
111
- <link rel="modulepreload" crossorigin href="./assets/capabilities-CUpom6r4.js">
112
- <link rel="modulepreload" crossorigin href="./assets/createReducer-Cki97cx5.js">
111
+ <link rel="modulepreload" crossorigin href="./assets/capabilities-MM7JYRxj.js">
112
+ <link rel="modulepreload" crossorigin href="./assets/createReducer-Dnna-AUO.js">
113
113
  <link rel="modulepreload" crossorigin href="./assets/dist-DBwNzi3C.js">
114
114
  <link rel="modulepreload" crossorigin href="./assets/dist-ChS0Dc_R.js">
115
115
  <link rel="modulepreload" crossorigin href="./assets/dist-CtsanegT.js">
@@ -123,119 +123,119 @@
123
123
  <link rel="modulepreload" crossorigin href="./assets/toDate-CgbKQM5E.js">
124
124
  <link rel="modulepreload" crossorigin href="./assets/cjs-CH5Rj0g8.js">
125
125
  <link rel="modulepreload" crossorigin href="./assets/_arrayReduce-TT0iOGKY.js">
126
- <link rel="modulepreload" crossorigin href="./assets/type-D8l_U05h.js">
126
+ <link rel="modulepreload" crossorigin href="./assets/type-DUK-1jKc.js">
127
127
  <link rel="modulepreload" crossorigin href="./assets/_baseProperty-NKyJO2oh.js">
128
128
  <link rel="modulepreload" crossorigin href="./assets/now-6sUe0ZdD.js">
129
129
  <link rel="modulepreload" crossorigin href="./assets/debounce-B3mjKxHe.js">
130
130
  <link rel="modulepreload" crossorigin href="./assets/toInteger-CDcO32Gx.js">
131
131
  <link rel="modulepreload" crossorigin href="./assets/database-zap-B9y7063w.js">
132
132
  <link rel="modulepreload" crossorigin href="./assets/main-U5Goe76G.js">
133
- <link rel="modulepreload" crossorigin href="./assets/cells-Cvo5AIrZ.js">
133
+ <link rel="modulepreload" crossorigin href="./assets/cells-DRiwSVs0.js">
134
134
  <link rel="modulepreload" crossorigin href="./assets/spinner-DaIKav-i.js">
135
135
  <link rel="modulepreload" crossorigin href="./assets/chevron-right-DwagBitu.js">
136
136
  <link rel="modulepreload" crossorigin href="./assets/dropdown-menu-df9T83C0.js">
137
137
  <link rel="modulepreload" crossorigin href="./assets/kbd-C3JY7O_u.js">
138
- <link rel="modulepreload" crossorigin href="./assets/renderShortcut-Dyrbz79Y.js">
139
- <link rel="modulepreload" crossorigin href="./assets/multi-map-Cwq--tzY.js">
138
+ <link rel="modulepreload" crossorigin href="./assets/renderShortcut-DHc-p-_c.js">
139
+ <link rel="modulepreload" crossorigin href="./assets/multi-map-C8GlnP-4.js">
140
140
  <link rel="modulepreload" crossorigin href="./assets/alert-BrGyZf9c.js">
141
- <link rel="modulepreload" crossorigin href="./assets/alert-dialog-Bv1sALHm.js">
142
- <link rel="modulepreload" crossorigin href="./assets/dialog-C5Pa_iIq.js">
143
- <link rel="modulepreload" crossorigin href="./assets/dist-R0oOvu5B.js">
144
- <link rel="modulepreload" crossorigin href="./assets/label-C_OuzPjQ.js">
141
+ <link rel="modulepreload" crossorigin href="./assets/alert-dialog-DwQffb13.js">
142
+ <link rel="modulepreload" crossorigin href="./assets/dialog-CxGKN4C_.js">
143
+ <link rel="modulepreload" crossorigin href="./assets/dist-CdxIjAOP.js">
144
+ <link rel="modulepreload" crossorigin href="./assets/label-Be1daUcS.js">
145
145
  <link rel="modulepreload" crossorigin href="./assets/useDebounce-D5NcotGm.js">
146
- <link rel="modulepreload" crossorigin href="./assets/textarea-hNyWE2r_.js">
147
- <link rel="modulepreload" crossorigin href="./assets/numbers-CSY3JIgn.js">
146
+ <link rel="modulepreload" crossorigin href="./assets/textarea-DellDgP4.js">
147
+ <link rel="modulepreload" crossorigin href="./assets/numbers-iQunIAXf.js">
148
148
  <link rel="modulepreload" crossorigin href="./assets/SSRProvider-CEHRCdjA.js">
149
149
  <link rel="modulepreload" crossorigin href="./assets/context-JwD-oSsl.js">
150
150
  <link rel="modulepreload" crossorigin href="./assets/useNumberFormatter-c6GXymzg.js">
151
151
  <link rel="modulepreload" crossorigin href="./assets/usePress-Bup4EGrp.js">
152
- <link rel="modulepreload" crossorigin href="./assets/input-BeGfEf2S.js">
152
+ <link rel="modulepreload" crossorigin href="./assets/input-pAun1m1X.js">
153
153
  <link rel="modulepreload" crossorigin href="./assets/links-DHZUhGz-.js">
154
154
  <link rel="modulepreload" crossorigin href="./assets/popover-D16ZremR.js">
155
- <link rel="modulepreload" crossorigin href="./assets/switch-Di5kBaS8.js">
155
+ <link rel="modulepreload" crossorigin href="./assets/switch-Cx8dJhf6.js">
156
156
  <link rel="modulepreload" crossorigin href="./assets/table-BSASHvkq.js">
157
- <link rel="modulepreload" crossorigin href="./assets/mode-DjraKyN2.js">
157
+ <link rel="modulepreload" crossorigin href="./assets/mode-BD6zDBBd.js">
158
158
  <link rel="modulepreload" crossorigin href="./assets/useAsyncData-C4XRy1BE.js">
159
159
  <link rel="modulepreload" crossorigin href="./assets/errors-2SszdW9t.js">
160
- <link rel="modulepreload" crossorigin href="./assets/error-banner-BWJsOpnc.js">
161
- <link rel="modulepreload" crossorigin href="./assets/copy-r7i0SKI4.js">
160
+ <link rel="modulepreload" crossorigin href="./assets/error-banner-DUzsIXtq.js">
161
+ <link rel="modulepreload" crossorigin href="./assets/copy-Bv2DBpIS.js">
162
162
  <link rel="modulepreload" crossorigin href="./assets/memoize-BCOZVFBt.js">
163
163
  <link rel="modulepreload" crossorigin href="./assets/get-6uJrSKbw.js">
164
- <link rel="modulepreload" crossorigin href="./assets/capitalize-CXGTjPyK.js">
164
+ <link rel="modulepreload" crossorigin href="./assets/capitalize-CkclHYWI.js">
165
165
  <link rel="modulepreload" crossorigin href="./assets/copy-CQ15EONK.js">
166
166
  <link rel="modulepreload" crossorigin href="./assets/plus-BD5o34_i.js">
167
167
  <link rel="modulepreload" crossorigin href="./assets/refresh-cw-CQd-1kjx.js">
168
168
  <link rel="modulepreload" crossorigin href="./assets/trash-2-CyqGun26.js">
169
169
  <link rel="modulepreload" crossorigin href="./assets/triangle-alert-B65rDESJ.js">
170
- <link rel="modulepreload" crossorigin href="./assets/ai-model-dropdown-GvB-5iLY.js">
170
+ <link rel="modulepreload" crossorigin href="./assets/ai-model-dropdown-Dpr0DUJN.js">
171
171
  <link rel="modulepreload" crossorigin href="./assets/defaultLocale-D_rSvXvJ.js">
172
172
  <link rel="modulepreload" crossorigin href="./assets/precisionRound-BMPhtTJQ.js">
173
173
  <link rel="modulepreload" crossorigin href="./assets/defaultLocale-C92Rrpmf.js">
174
174
  <link rel="modulepreload" crossorigin href="./assets/vega-loader.browser-CRZ52CKf.js">
175
- <link rel="modulepreload" crossorigin href="./assets/tooltip-CE4l3v3B.js">
176
- <link rel="modulepreload" crossorigin href="./assets/ErrorBoundary-BU1OKJ3L.js">
177
- <link rel="modulepreload" crossorigin href="./assets/useInstallPackage-Dxl_p6oW.js">
178
- <link rel="modulepreload" crossorigin href="./assets/ImperativeModal-DstvzsTs.js">
179
- <link rel="modulepreload" crossorigin href="./assets/cell-link-BITMERKQ.js">
180
- <link rel="modulepreload" crossorigin href="./assets/datasource-D2hNaG_n.js">
181
- <link rel="modulepreload" crossorigin href="./assets/state-CS48Wh7M.js">
182
- <link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-eoDwRuKU.js">
183
- <link rel="modulepreload" crossorigin href="./assets/copy-icon-wZr2McVB.js">
184
- <link rel="modulepreload" crossorigin href="./assets/html-to-image-CJgqxZci.js">
185
- <link rel="modulepreload" crossorigin href="./assets/focus-BeWVOW9Q.js">
186
- <link rel="modulepreload" crossorigin href="./assets/LazyAnyLanguageCodeMirror-ygeIsKeo.js">
175
+ <link rel="modulepreload" crossorigin href="./assets/tooltip-BGrCWNss.js">
176
+ <link rel="modulepreload" crossorigin href="./assets/ErrorBoundary-ChCiwl15.js">
177
+ <link rel="modulepreload" crossorigin href="./assets/useInstallPackage-Bdnnp5fe.js">
178
+ <link rel="modulepreload" crossorigin href="./assets/ImperativeModal-CUbWEBci.js">
179
+ <link rel="modulepreload" crossorigin href="./assets/cell-link-CyIWDVXR.js">
180
+ <link rel="modulepreload" crossorigin href="./assets/datasource-AZ3l2P48.js">
181
+ <link rel="modulepreload" crossorigin href="./assets/state-DnUQ1uxR.js">
182
+ <link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-cw9gEb4T.js">
183
+ <link rel="modulepreload" crossorigin href="./assets/copy-icon-BhONVREY.js">
184
+ <link rel="modulepreload" crossorigin href="./assets/html-to-image-Cy_LYuWW.js">
185
+ <link rel="modulepreload" crossorigin href="./assets/focus-B7xu7kpl.js">
186
+ <link rel="modulepreload" crossorigin href="./assets/LazyAnyLanguageCodeMirror-yzHjsVJt.js">
187
187
  <link rel="modulepreload" crossorigin href="./assets/chunk-5FQGJX7Z-CVUXBqX6.js">
188
188
  <link rel="modulepreload" crossorigin href="./assets/katex-Dc8yG8NU.js">
189
- <link rel="modulepreload" crossorigin href="./assets/markdown-renderer-CoQm4UxN.js">
190
- <link rel="modulepreload" crossorigin href="./assets/command-BjWSp3sa.js">
191
- <link rel="modulepreload" crossorigin href="./assets/useRunCells-jbEa8WGV.js">
189
+ <link rel="modulepreload" crossorigin href="./assets/markdown-renderer-BM4a9QeZ.js">
190
+ <link rel="modulepreload" crossorigin href="./assets/command-Bq3e85NA.js">
191
+ <link rel="modulepreload" crossorigin href="./assets/download-Y3BpaOoI.js">
192
+ <link rel="modulepreload" crossorigin href="./assets/useRunCells-DyBzMbHe.js">
192
193
  <link rel="modulepreload" crossorigin href="./assets/purify.es-DNVQZNFu.js">
193
- <link rel="modulepreload" crossorigin href="./assets/RenderHTML-DuJkj1GV.js">
194
- <link rel="modulepreload" crossorigin href="./assets/useIframeCapabilities-BVYqWHmA.js">
195
- <link rel="modulepreload" crossorigin href="./assets/formats-BBDL2N4i.js">
194
+ <link rel="modulepreload" crossorigin href="./assets/RenderHTML-Bgz4e362.js">
195
+ <link rel="modulepreload" crossorigin href="./assets/useIframeCapabilities-DuIDx9mD.js">
196
+ <link rel="modulepreload" crossorigin href="./assets/formats-W1SWxSE3.js">
196
197
  <link rel="modulepreload" crossorigin href="./assets/en-US-pRRbZZHE.js">
197
198
  <link rel="modulepreload" crossorigin href="./assets/isValid-DcYggVWP.js">
198
- <link rel="modulepreload" crossorigin href="./assets/dates-CxJmszXT.js">
199
- <link rel="modulepreload" crossorigin href="./assets/download-kUMZIq8-.js">
200
- <link rel="modulepreload" crossorigin href="./assets/maps-vcWR7nnr.js">
199
+ <link rel="modulepreload" crossorigin href="./assets/dates-Dhn1r-h6.js">
200
+ <link rel="modulepreload" crossorigin href="./assets/maps-t9yNKYA8.js">
201
201
  <link rel="modulepreload" crossorigin href="./assets/extends-B2LJnKU3.js">
202
202
  <link rel="modulepreload" crossorigin href="./assets/emotion-is-prop-valid.esm-DD4AwVTU.js">
203
203
  <link rel="modulepreload" crossorigin href="./assets/useDateFormatter-CS4kbWl2.js">
204
204
  <link rel="modulepreload" crossorigin href="./assets/range-D2UKkEg-.js">
205
205
  <link rel="modulepreload" crossorigin href="./assets/table-DZR6ewbN.js">
206
- <link rel="modulepreload" crossorigin href="./assets/JsonOutput-Dmfgex9T.js">
206
+ <link rel="modulepreload" crossorigin href="./assets/JsonOutput-BKP4rBIw.js">
207
207
  <link rel="modulepreload" crossorigin href="./assets/file-Cs1JbsV6.js">
208
208
  <link rel="modulepreload" crossorigin href="./assets/play-BPIh-ZEU.js">
209
- <link rel="modulepreload" crossorigin href="./assets/chat-components-BV83l1rZ.js">
209
+ <link rel="modulepreload" crossorigin href="./assets/chat-components-DDIZD9FU.js">
210
210
  <link rel="modulepreload" crossorigin href="./assets/isEmpty-CgX_-6Mt.js">
211
- <link rel="modulepreload" crossorigin href="./assets/chat-display-C4qhRyWq.js">
212
- <link rel="modulepreload" crossorigin href="./assets/useDeleteCell-BRWEDSc9.js">
211
+ <link rel="modulepreload" crossorigin href="./assets/chat-display-D-Wa-1Hv.js">
212
+ <link rel="modulepreload" crossorigin href="./assets/useDeleteCell-BUAQb9OH.js">
213
213
  <link rel="modulepreload" crossorigin href="./assets/icons-BhEXrzsb.js">
214
- <link rel="modulepreload" crossorigin href="./assets/process-output-CwcoTocd.js">
214
+ <link rel="modulepreload" crossorigin href="./assets/process-output-nNOt7QtH.js">
215
215
  <link rel="modulepreload" crossorigin href="./assets/blob-CuXvdYPX.js">
216
216
  <link rel="modulepreload" crossorigin href="./assets/objectWithoutPropertiesLoose-DaPAPabU.js">
217
217
  <link rel="modulepreload" crossorigin href="./assets/esm-DpMp6qko.js">
218
- <link rel="modulepreload" crossorigin href="./assets/add-cell-with-ai-COxBrLrH.js">
218
+ <link rel="modulepreload" crossorigin href="./assets/add-cell-with-ai-DNbX7Ctg.js">
219
219
  <link rel="modulepreload" crossorigin href="./assets/chart-no-axes-column-W42b2ZIs.js">
220
220
  <link rel="modulepreload" crossorigin href="./assets/square-function-CqXXKtIq.js">
221
- <link rel="modulepreload" crossorigin href="./assets/spec-DJ3YTCel.js">
222
- <link rel="modulepreload" crossorigin href="./assets/column-preview-BvwEAGt6.js">
221
+ <link rel="modulepreload" crossorigin href="./assets/spec-BSxN05D8.js">
222
+ <link rel="modulepreload" crossorigin href="./assets/column-preview-C72fVZoP.js">
223
223
  <link rel="modulepreload" crossorigin href="./assets/toggle-jWKnIArU.js">
224
- <link rel="modulepreload" crossorigin href="./assets/globals-uEPg-4pq.js">
225
- <link rel="modulepreload" crossorigin href="./assets/share-CKfNi8fD.js">
224
+ <link rel="modulepreload" crossorigin href="./assets/globals-BW23ny3Q.js">
225
+ <link rel="modulepreload" crossorigin href="./assets/share-CbPtIlnM.js">
226
226
  <link rel="modulepreload" crossorigin href="./assets/_baseSet-5Rdwpmr3.js">
227
227
  <link rel="modulepreload" crossorigin href="./assets/react-resizable-panels.browser.esm-Ctj_10o2.js">
228
- <link rel="modulepreload" crossorigin href="./assets/utilities.esm-eBoXu7lR.js">
229
- <link rel="modulepreload" crossorigin href="./assets/floating-outline-CxfziveS.js">
230
- <link rel="modulepreload" crossorigin href="./assets/useAddCell-CklpKCq2.js">
228
+ <link rel="modulepreload" crossorigin href="./assets/utilities.esm-j_F9mYkM.js">
229
+ <link rel="modulepreload" crossorigin href="./assets/floating-outline-yvPiOGQ2.js">
230
+ <link rel="modulepreload" crossorigin href="./assets/useAddCell-bMoxoWAg.js">
231
231
  <link rel="modulepreload" crossorigin href="./assets/eye-off-BhExYOph.js">
232
- <link rel="modulepreload" crossorigin href="./assets/readonly-python-code-BlVsu50E.js">
232
+ <link rel="modulepreload" crossorigin href="./assets/readonly-python-code-CfLdThzF.js">
233
233
  <link rel="modulepreload" crossorigin href="./assets/file-video-camera-DW3v07j2.js">
234
- <link rel="modulepreload" crossorigin href="./assets/types-DWpF5HiT.js">
234
+ <link rel="modulepreload" crossorigin href="./assets/types-D5X7ikSD.js">
235
235
  <link rel="modulepreload" crossorigin href="./assets/refresh-ccw-DLEiQDS3.js">
236
- <link rel="modulepreload" crossorigin href="./assets/form-DazVYGCT.js">
237
- <link rel="modulepreload" crossorigin href="./assets/field-BN2j4cag.js">
238
- <link rel="modulepreload" crossorigin href="./assets/useBoolean-BE72e3yb.js">
236
+ <link rel="modulepreload" crossorigin href="./assets/form-BpwI8bBX.js">
237
+ <link rel="modulepreload" crossorigin href="./assets/field-BEg1eC0P.js">
238
+ <link rel="modulepreload" crossorigin href="./assets/useBoolean-B1Xeh6vA.js">
239
239
  <link rel="modulepreload" crossorigin href="./assets/useDeepCompareMemoize-ZPd9PxYl.js">
240
240
  <link rel="modulepreload" crossorigin href="./assets/types-CS34eOZi.js">
241
241
  <link rel="modulepreload" crossorigin href="./assets/prop-types-BiQYf0aU.js">
@@ -253,7 +253,7 @@
253
253
  <link rel="stylesheet" crossorigin href="./assets/cells-jmgGt1lS.css">
254
254
  <link rel="stylesheet" crossorigin href="./assets/markdown-renderer-DdDKmWlR.css">
255
255
  <link rel="stylesheet" crossorigin href="./assets/JsonOutput-B7vuddcd.css">
256
- <link rel="stylesheet" crossorigin href="./assets/index-CodxHczV.css">
256
+ <link rel="stylesheet" crossorigin href="./assets/index-DHsXOI_M.css">
257
257
  </head>
258
258
  <body>
259
259
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marimo-team/frontend",
3
- "version": "0.19.7-dev23",
3
+ "version": "0.19.7-dev25",
4
4
  "main": "dist/main.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -77,6 +77,7 @@ import {
77
77
  } from "@/utils/download";
78
78
  import { Filenames } from "@/utils/filenames";
79
79
  import { Objects } from "@/utils/objects";
80
+ import type { ProgressState } from "@/utils/progress";
80
81
  import { newNotebookURL } from "@/utils/urls";
81
82
  import { useRunAllCells } from "../cell/useRunCells";
82
83
  import { useChromeActions, useChromeState } from "../chrome/state";
@@ -238,11 +239,12 @@ export function useNotebookActions() {
238
239
  return;
239
240
  }
240
241
 
241
- const downloadPDF = async () => {
242
- await updateCellOutputsWithScreenshots(
242
+ const downloadPDF = async (progress: ProgressState) => {
243
+ await updateCellOutputsWithScreenshots({
244
+ progress,
243
245
  takeScreenshots,
244
246
  updateCellOutputs,
245
- );
247
+ });
246
248
  await downloadAsPDF({
247
249
  filename: filename,
248
250
  webpdf: false,
@@ -3,6 +3,7 @@
3
3
  import type { JSX } from "react";
4
4
  import { FilenameInput } from "@/components/editor/header/filename-input";
5
5
  import { useUpdateFilename } from "@/core/saving/filename";
6
+ import { useSaveNotebook } from "@/core/saving/save-component";
6
7
  import { Paths } from "@/utils/paths";
7
8
 
8
9
  export const FilenameForm = ({
@@ -10,14 +11,26 @@ export const FilenameForm = ({
10
11
  }: {
11
12
  filename: string | null;
12
13
  }): JSX.Element => {
13
- const setFilename = useUpdateFilename();
14
+ const updateFilename = useUpdateFilename();
15
+ const { saveNotebook } = useSaveNotebook();
16
+
17
+ const handleNameChange = (newFilename: string) => {
18
+ const wasUnnamed = filename === null;
19
+ updateFilename(newFilename).then((name) => {
20
+ // When creating a new file (was unnamed), also save the content
21
+ if (name !== null && wasUnnamed) {
22
+ saveNotebook(name, true);
23
+ }
24
+ });
25
+ };
26
+
14
27
  return (
15
28
  <FilenameInput
16
29
  placeholderText={
17
30
  filename ? Paths.basename(filename) : "untitled marimo notebook"
18
31
  }
19
32
  initialValue={filename}
20
- onNameChange={setFilename}
33
+ onNameChange={handleNameChange}
21
34
  flexibleWidth={true}
22
35
  resetOnBlur={true}
23
36
  data-testid="filename-input"
@@ -109,6 +109,7 @@ const renderWithProvider = <T>(hook: () => T) => {
109
109
  // Shared mock setup
110
110
  const mockSaveOrNameNotebook = vi.fn();
111
111
  const mockSaveIfNotebookIsPersistent = vi.fn();
112
+ const mockSaveNotebook = vi.fn();
112
113
  const mockRunCell = vi.fn();
113
114
  const mockCopyCell = vi.fn();
114
115
  const mockPasteCell = vi.fn();
@@ -156,6 +157,7 @@ describe("useCellNavigationProps", () => {
156
157
  mockUseSaveNotebook.mockReturnValue({
157
158
  saveOrNameNotebook: mockSaveOrNameNotebook,
158
159
  saveIfNotebookIsPersistent: mockSaveIfNotebookIsPersistent,
160
+ saveNotebook: mockSaveNotebook,
159
161
  });
160
162
  mockUseCellActions.mockReturnValue(
161
163
  mockCellActions as unknown as CellActions,
@@ -5,10 +5,18 @@ import * as React from "react";
5
5
 
6
6
  import { cn } from "@/utils/cn";
7
7
 
8
+ interface ProgressProps
9
+ extends React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root> {
10
+ /**
11
+ * When true, shows an indeterminate animated progress bar.
12
+ */
13
+ indeterminate?: boolean;
14
+ }
15
+
8
16
  const Progress = React.forwardRef<
9
- React.ElementRef<typeof ProgressPrimitive.Root>,
10
- React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>
11
- >(({ className, value, ...props }, ref) => (
17
+ React.ComponentRef<typeof ProgressPrimitive.Root>,
18
+ ProgressProps
19
+ >(({ className, value, indeterminate, ...props }, ref) => (
12
20
  <ProgressPrimitive.Root
13
21
  ref={ref}
14
22
  className={cn(
@@ -18,8 +26,17 @@ const Progress = React.forwardRef<
18
26
  {...props}
19
27
  >
20
28
  <ProgressPrimitive.Indicator
21
- className="h-full w-full flex-1 bg-primary transition-all pulse"
22
- style={{ transform: `translateX(-${100 - (value || 0)}%)` }}
29
+ className={cn(
30
+ "h-full flex-1 bg-primary",
31
+ indeterminate
32
+ ? "w-1/3 animate-progress-indeterminate"
33
+ : "w-full transition-transform duration-300 ease-out",
34
+ )}
35
+ style={
36
+ indeterminate
37
+ ? undefined
38
+ : { transform: `translateX(-${100 - (value || 0)}%)` }
39
+ }
23
40
  />
24
41
  </ProgressPrimitive.Root>
25
42
  ));
@@ -8,6 +8,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest";
8
8
  import type { CellId } from "@/core/cells/ids";
9
9
  import { CellOutputId } from "@/core/cells/ids";
10
10
  import type { CellRuntimeState } from "@/core/cells/types";
11
+ import { ProgressState } from "@/utils/progress";
11
12
  import {
12
13
  updateCellOutputsWithScreenshots,
13
14
  useEnrichCellOutputs,
@@ -38,6 +39,8 @@ vi.mock("@/core/cells/cells", async () => {
38
39
  };
39
40
  });
40
41
 
42
+ const progress = ProgressState.indeterminate();
43
+
41
44
  import { toPng } from "html-to-image";
42
45
  import { toast } from "@/components/ui/use-toast";
43
46
  import { cellsRuntimeAtom } from "@/core/cells/cells";
@@ -100,7 +103,7 @@ describe("useEnrichCellOutputs", () => {
100
103
  const { result } = renderHook(() => useEnrichCellOutputs(), { wrapper });
101
104
 
102
105
  const enrichCellOutputs = result.current;
103
- const output = await enrichCellOutputs();
106
+ const output = await enrichCellOutputs(progress);
104
107
 
105
108
  expect(output).toEqual({});
106
109
  expect(document.getElementById).not.toHaveBeenCalled();
@@ -132,7 +135,7 @@ describe("useEnrichCellOutputs", () => {
132
135
  const { result } = renderHook(() => useEnrichCellOutputs(), { wrapper });
133
136
 
134
137
  const enrichCellOutputs = result.current;
135
- const output = await enrichCellOutputs();
138
+ const output = await enrichCellOutputs(progress);
136
139
 
137
140
  expect(document.getElementById).toHaveBeenCalledWith(
138
141
  CellOutputId.create(cellId),
@@ -177,7 +180,7 @@ describe("useEnrichCellOutputs", () => {
177
180
 
178
181
  // First call - should capture
179
182
  let enrichCellOutputs = result.current;
180
- let output = await enrichCellOutputs();
183
+ let output = await enrichCellOutputs(progress);
181
184
  expect(output).toEqual({ [cellId]: ["image/png", mockDataUrl] });
182
185
  expect(toPng).toHaveBeenCalledTimes(1);
183
186
 
@@ -186,7 +189,7 @@ describe("useEnrichCellOutputs", () => {
186
189
 
187
190
  // Second call with same output - should not capture again
188
191
  enrichCellOutputs = result.current;
189
- output = await enrichCellOutputs();
192
+ output = await enrichCellOutputs(progress);
190
193
  expect(output).toEqual({}); // Empty because output hasn't changed
191
194
  expect(toPng).toHaveBeenCalledTimes(1); // Still only 1 call
192
195
  });
@@ -215,7 +218,7 @@ describe("useEnrichCellOutputs", () => {
215
218
  const { result } = renderHook(() => useEnrichCellOutputs(), { wrapper });
216
219
 
217
220
  const enrichCellOutputs = result.current;
218
- const output = await enrichCellOutputs();
221
+ const output = await enrichCellOutputs(progress);
219
222
 
220
223
  expect(output).toEqual({}); // Failed screenshot should be filtered out
221
224
  expect(Logger.error).toHaveBeenCalledWith(
@@ -245,7 +248,7 @@ describe("useEnrichCellOutputs", () => {
245
248
  const { result } = renderHook(() => useEnrichCellOutputs(), { wrapper });
246
249
 
247
250
  const enrichCellOutputs = result.current;
248
- const output = await enrichCellOutputs();
251
+ const output = await enrichCellOutputs(progress);
249
252
 
250
253
  expect(output).toEqual({});
251
254
  expect(Logger.error).toHaveBeenCalledWith(
@@ -294,7 +297,7 @@ describe("useEnrichCellOutputs", () => {
294
297
  const { result } = renderHook(() => useEnrichCellOutputs(), { wrapper });
295
298
 
296
299
  const enrichCellOutputs = result.current;
297
- const output = await enrichCellOutputs();
300
+ const output = await enrichCellOutputs(progress);
298
301
 
299
302
  expect(output).toEqual({
300
303
  [cell1]: ["image/png", mockDataUrl1],
@@ -340,7 +343,7 @@ describe("useEnrichCellOutputs", () => {
340
343
  const { result } = renderHook(() => useEnrichCellOutputs(), { wrapper });
341
344
 
342
345
  const enrichCellOutputs = result.current;
343
- const output = await enrichCellOutputs();
346
+ const output = await enrichCellOutputs(progress);
344
347
 
345
348
  // Only the successful screenshot should be in the result
346
349
  expect(output).toEqual({
@@ -382,13 +385,13 @@ describe("useEnrichCellOutputs", () => {
382
385
 
383
386
  // First screenshot
384
387
  let enrichCellOutputs = result.current;
385
- let output = await enrichCellOutputs();
388
+ let output = await enrichCellOutputs(progress);
386
389
  expect(output).toEqual({ [cellId]: ["image/png", mockDataUrl1] });
387
390
 
388
391
  // Second call - same output, should not be captured
389
392
  rerender();
390
393
  enrichCellOutputs = result.current;
391
- output = await enrichCellOutputs();
394
+ output = await enrichCellOutputs(progress);
392
395
  expect(output).toEqual({});
393
396
 
394
397
  // Third call - output changed, should be captured
@@ -407,7 +410,7 @@ describe("useEnrichCellOutputs", () => {
407
410
 
408
411
  rerender();
409
412
  enrichCellOutputs = result.current;
410
- output = await enrichCellOutputs();
413
+ output = await enrichCellOutputs(progress);
411
414
  expect(output).toEqual({ [cellId]: ["image/png", mockDataUrl2] });
412
415
  expect(toPng).toHaveBeenCalledTimes(2);
413
416
  });
@@ -447,7 +450,7 @@ describe("useEnrichCellOutputs", () => {
447
450
  const { result } = renderHook(() => useEnrichCellOutputs(), { wrapper });
448
451
 
449
452
  const enrichCellOutputs = result.current;
450
- const output = await enrichCellOutputs();
453
+ const output = await enrichCellOutputs(progress);
451
454
 
452
455
  // None of these should trigger screenshots
453
456
  expect(output).toEqual({});
@@ -472,7 +475,7 @@ describe("useEnrichCellOutputs", () => {
472
475
  const { result } = renderHook(() => useEnrichCellOutputs(), { wrapper });
473
476
 
474
477
  const enrichCellOutputs = result.current;
475
- const output = await enrichCellOutputs();
478
+ const output = await enrichCellOutputs(progress);
476
479
 
477
480
  expect(output).toEqual({});
478
481
  expect(document.getElementById).not.toHaveBeenCalled();
@@ -504,7 +507,7 @@ describe("useEnrichCellOutputs", () => {
504
507
  const { result } = renderHook(() => useEnrichCellOutputs(), { wrapper });
505
508
 
506
509
  const enrichCellOutputs = result.current;
507
- const output = await enrichCellOutputs();
510
+ const output = await enrichCellOutputs(progress);
508
511
 
509
512
  // Verify the exact return type structure
510
513
  expect(output).toHaveProperty(cellId);
@@ -535,7 +538,11 @@ describe("updateCellOutputsWithScreenshots", () => {
535
538
  const takeScreenshots = vi.fn().mockResolvedValue(mockScreenshots);
536
539
  const updateCellOutputs = vi.fn().mockResolvedValue(null);
537
540
 
538
- await updateCellOutputsWithScreenshots(takeScreenshots, updateCellOutputs);
541
+ await updateCellOutputsWithScreenshots({
542
+ progress,
543
+ takeScreenshots,
544
+ updateCellOutputs,
545
+ });
539
546
 
540
547
  expect(takeScreenshots).toHaveBeenCalledTimes(1);
541
548
  expect(updateCellOutputs).toHaveBeenCalledTimes(1);
@@ -548,7 +555,11 @@ describe("updateCellOutputsWithScreenshots", () => {
548
555
  const takeScreenshots = vi.fn().mockResolvedValue({});
549
556
  const updateCellOutputs = vi.fn().mockResolvedValue(null);
550
557
 
551
- await updateCellOutputsWithScreenshots(takeScreenshots, updateCellOutputs);
558
+ await updateCellOutputsWithScreenshots({
559
+ progress,
560
+ takeScreenshots,
561
+ updateCellOutputs,
562
+ });
552
563
 
553
564
  expect(takeScreenshots).toHaveBeenCalledTimes(1);
554
565
  expect(updateCellOutputs).not.toHaveBeenCalled();
@@ -571,7 +582,11 @@ describe("updateCellOutputsWithScreenshots", () => {
571
582
  const takeScreenshots = vi.fn().mockResolvedValue(mockScreenshots);
572
583
  const updateCellOutputs = vi.fn().mockResolvedValue(null);
573
584
 
574
- await updateCellOutputsWithScreenshots(takeScreenshots, updateCellOutputs);
585
+ await updateCellOutputsWithScreenshots({
586
+ progress,
587
+ takeScreenshots,
588
+ updateCellOutputs,
589
+ });
575
590
 
576
591
  expect(updateCellOutputs).toHaveBeenCalledWith({
577
592
  cellIdsToOutput: mockScreenshots,
@@ -584,7 +599,11 @@ describe("updateCellOutputsWithScreenshots", () => {
584
599
  const updateCellOutputs = vi.fn().mockResolvedValue(null);
585
600
 
586
601
  // Should not throw - errors are caught and shown via toast
587
- await updateCellOutputsWithScreenshots(takeScreenshots, updateCellOutputs);
602
+ await updateCellOutputsWithScreenshots({
603
+ progress,
604
+ takeScreenshots,
605
+ updateCellOutputs,
606
+ });
588
607
 
589
608
  expect(updateCellOutputs).not.toHaveBeenCalled();
590
609
  expect(Logger.error).toHaveBeenCalledWith(
@@ -613,7 +632,11 @@ describe("updateCellOutputsWithScreenshots", () => {
613
632
  const updateCellOutputs = vi.fn().mockRejectedValue(error);
614
633
 
615
634
  // Should not throw - errors are caught and shown via toast
616
- await updateCellOutputsWithScreenshots(takeScreenshots, updateCellOutputs);
635
+ await updateCellOutputsWithScreenshots({
636
+ progress,
637
+ takeScreenshots,
638
+ updateCellOutputs,
639
+ });
617
640
 
618
641
  expect(Logger.error).toHaveBeenCalledWith(
619
642
  "Error updating cell outputs with screenshots:",