@marimo-team/frontend 0.23.10-dev24 → 0.23.10-dev26

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 (153) hide show
  1. package/dist/assets/{CellStatus-Bz67hL1K.js → CellStatus-B3W7e9yU.js} +1 -1
  2. package/dist/assets/{JsonOutput-Hk49rzGl.js → JsonOutput-BYEhZqb8.js} +1 -1
  3. package/dist/assets/{LazyAnyLanguageCodeMirror-CaR5QYb0.js → LazyAnyLanguageCodeMirror-DGz0wXbE.js} +2 -2
  4. package/dist/assets/{MarimoErrorOutput-DxKFtfTA.js → MarimoErrorOutput-Bqzbv_QJ.js} +1 -1
  5. package/dist/assets/{RenderHTML-DMfo8SsK.js → RenderHTML-D-OajlP0.js} +1 -1
  6. package/dist/assets/{RunButton-CFOfNbXp.js → RunButton-3KFJH8Xa.js} +1 -1
  7. package/dist/assets/{add-cell-with-ai-BKuyHjk4.js → add-cell-with-ai-C0QjAKuR.js} +6 -6
  8. package/dist/assets/{add-connection-dialog-BGbZ16ED.js → add-connection-dialog-BGaI0GCh.js} +1 -1
  9. package/dist/assets/{agent-panel-BBLOq5h0.js → agent-panel-DHmaD72L.js} +1 -1
  10. package/dist/assets/{ai-model-dropdown-BAozMKsl.js → ai-model-dropdown-B0cy2CXL.js} +1 -1
  11. package/dist/assets/{any-language-editor-9HMoB95o.js → any-language-editor-C33GXEIy.js} +1 -1
  12. package/dist/assets/{app-config-button-Di13TXm3.js → app-config-button-BuA9enPn.js} +1 -1
  13. package/dist/assets/{cell-editor-CeynAchq.js → cell-editor-B3mTCRIX.js} +11 -11
  14. package/dist/assets/{cell-link-AJAjqJb5.js → cell-link-CgOvnjYt.js} +1 -1
  15. package/dist/assets/{cells-BSWdJzbh.css → cells-pu5xzE_v.css} +1 -1
  16. package/dist/assets/{cells-6zANRDgG.js → cells-vjZ69d-u.js} +52 -50
  17. package/dist/assets/{chat-display-BCEIxyP_.js → chat-display-DsjttAt7.js} +1 -1
  18. package/dist/assets/{chat-panel-Cl9zidIA.js → chat-panel-DIIO4S8I.js} +1 -1
  19. package/dist/assets/{chat-ui-DStkjRpP.js → chat-ui-C1q-OQqH.js} +1 -1
  20. package/dist/assets/{column-preview-B2kXnKdd.js → column-preview-Bqp95o1c.js} +1 -1
  21. package/dist/assets/{command-palette-DzbGv49p.js → command-palette-B9hOe2N3.js} +1 -1
  22. package/dist/assets/{common-CMjpHxaM.js → common-yg4W3pLU.js} +1 -1
  23. package/dist/assets/{components-CY48CF-h.js → components-1VuqOYTA.js} +1 -1
  24. package/dist/assets/{components-DIbnV6Ix.js → components-DRXxpmLU.js} +1 -1
  25. package/dist/assets/{datasource-Bdio-a96.js → datasource-CAHQYs6s.js} +1 -1
  26. package/dist/assets/{dependency-graph-panel-CbOQYps7.js → dependency-graph-panel-DmDCqI5K.js} +1 -1
  27. package/dist/assets/dist-B53W-UDR.js +1 -0
  28. package/dist/assets/dist-B5dEvw-K.js +1 -0
  29. package/dist/assets/dist-BFCmbzWi.js +1 -0
  30. package/dist/assets/dist-BMGRmPyy.js +1 -0
  31. package/dist/assets/dist-BO4avBoP.js +1 -0
  32. package/dist/assets/{dist-A7swzSTR.js → dist-BOI5clix.js} +1 -1
  33. package/dist/assets/{dist-CSozmdJ6.js → dist-BOlXpMz0.js} +1 -1
  34. package/dist/assets/dist-BOnQ-KQ2.js +1 -0
  35. package/dist/assets/{dist-BlOtCkpT.js → dist-BPey9y-W.js} +1 -1
  36. package/dist/assets/dist-BhDn70p4.js +1 -0
  37. package/dist/assets/{dist-D70Tz1Kr.js → dist-Bmk2jyet.js} +1 -1
  38. package/dist/assets/{dist-HlsDto3K.js → dist-Bo13cFwO.js} +1 -1
  39. package/dist/assets/{dist-DP9Si-4r.js → dist-Br-5j5-U.js} +3 -3
  40. package/dist/assets/dist-BvhrUXHm.js +1 -0
  41. package/dist/assets/{dist-CaCigNvN.js → dist-C06Enida.js} +1 -1
  42. package/dist/assets/dist-C1lrNNZE.js +1 -0
  43. package/dist/assets/{dist-CtcHy8Nq.js → dist-CAeBZ0Nq.js} +1 -1
  44. package/dist/assets/dist-CDlnuUgz.js +1 -0
  45. package/dist/assets/{dist-BQeNY9Zl.js → dist-CH3UDWFp.js} +1 -1
  46. package/dist/assets/{dist-DCqxOggh.js → dist-CMvFIVSA.js} +4 -4
  47. package/dist/assets/{dist-D4Od5Ds4.js → dist-CNFsJEXH.js} +1 -1
  48. package/dist/assets/dist-CS6moqWs.js +13 -0
  49. package/dist/assets/{dist-C78V1LRz.js → dist-CWGKeV6c.js} +1 -1
  50. package/dist/assets/{dist-CsvFAFh9.js → dist-C_EhQKG7.js} +1 -1
  51. package/dist/assets/dist-Chqiykta.js +1 -0
  52. package/dist/assets/{dist-BrR4M-k3.js → dist-D0HyMpgV.js} +12 -11
  53. package/dist/assets/dist-D5uvbU8W.js +1 -0
  54. package/dist/assets/dist-DTNIEaQR.js +3 -0
  55. package/dist/assets/dist-DUDTWxQG.js +1 -0
  56. package/dist/assets/dist-DVkC-Qmw.js +2 -0
  57. package/dist/assets/dist-DlCkNQAM.js +7 -0
  58. package/dist/assets/{dist-Ckx5b63P.js → dist-Dq_xwXBy.js} +1 -1
  59. package/dist/assets/{dist-DUHHizRG.js → dist-DtK0zh8h.js} +1 -1
  60. package/dist/assets/dist-Dx-Xdhvi.js +1 -0
  61. package/dist/assets/dist-E0W2JY8E.js +1 -0
  62. package/dist/assets/dist-Fgnz2tLV.js +1 -0
  63. package/dist/assets/{dist-CXYKut-0.js → dist-HsbfCjxI.js} +1 -1
  64. package/dist/assets/dist-PCikvPoP.js +1 -0
  65. package/dist/assets/{dist-B7WRiLJK.js → dist-Sbt478Wh.js} +1 -1
  66. package/dist/assets/{dist-BE3jO1WU.js → dist-TaD_6vFA.js} +1 -1
  67. package/dist/assets/{dist-C9ZB41s2.js → dist-YEXtMjTi.js} +2 -2
  68. package/dist/assets/{dist-BZr6MMV-.js → dist-cJl5Fok5.js} +1 -1
  69. package/dist/assets/dist-dgY1MeCG.js +1 -0
  70. package/dist/assets/{dist-AZ6vC6cU.js → dist-jP9Cj5te.js} +1 -1
  71. package/dist/assets/dist-v8f0uSor.js +1 -0
  72. package/dist/assets/{documentation-panel-BfWnQCo2.js → documentation-panel-Dc8yaWm0.js} +1 -1
  73. package/dist/assets/{download-C_cnbmM9.js → download-DyF92TRH.js} +1 -1
  74. package/dist/assets/{edit-page-DUqpuxsJ.js → edit-page-BF2rqAo0.js} +6 -6
  75. package/dist/assets/{error-panel-CbdaHXST.js → error-panel-CSFvZ3tD.js} +1 -1
  76. package/dist/assets/{esm-Cv-OC7z7.js → esm-B2f-WXoG.js} +1 -1
  77. package/dist/assets/esm-ChQLuryJ.js +1 -0
  78. package/dist/assets/{file-explorer-panel-CN4GhTVb.js → file-explorer-panel-DbV2PFVU.js} +3 -3
  79. package/dist/assets/{file-icons-DObkD0p2.js → file-icons-DYeUbwkv.js} +1 -1
  80. package/dist/assets/{file-name-input-ClqWegY5.js → file-name-input-CwMBI68p.js} +1 -1
  81. package/dist/assets/{floating-outline-DvtQqFjz.js → floating-outline-p8p6wKPj.js} +1 -1
  82. package/dist/assets/{focus-Btnin91L.js → focus-D3l6p56g.js} +1 -1
  83. package/dist/assets/{form-CBuNDBgZ.js → form-B_6lxOn3.js} +1 -1
  84. package/dist/assets/{home-page-CCoM4rsU.js → home-page-4qWr0HZg.js} +1 -1
  85. package/dist/assets/{hooks-BtuLiFDw.js → hooks-BVRBF3gQ.js} +1 -1
  86. package/dist/assets/{html-to-image-DvVDsEqf.js → html-to-image-2JVKRW1b.js} +1 -1
  87. package/dist/assets/{index-DqAsO6o_.js → index-BIqgYS3N.js} +3 -3
  88. package/dist/assets/{kiosk-mode-CTa--By7.js → kiosk-mode-D6Pog-b5.js} +1 -1
  89. package/dist/assets/{layout-4ZVNp_vO.js → layout-BT7gl970.js} +5 -5
  90. package/dist/assets/{logs-panel-c4kQoHV_.js → logs-panel-DrabdU6E.js} +1 -1
  91. package/dist/assets/{markdown-renderer-j3gyUhRd.js → markdown-renderer-DTD6g-4R.js} +1 -1
  92. package/dist/assets/{name-cell-input-JO6nrr1K.js → name-cell-input-Cwis179U.js} +1 -1
  93. package/dist/assets/{outline-panel-CvVvxFux.js → outline-panel-WDCRVaST.js} +1 -1
  94. package/dist/assets/{packages-panel-qfKtDrNm.js → packages-panel-fXFr8mMk.js} +1 -1
  95. package/dist/assets/{panels-CCCnEBBY.js → panels-KoIpjmfi.js} +1 -1
  96. package/dist/assets/{process-output-CLLxjn3z.js → process-output-Cusm3PD9.js} +1 -1
  97. package/dist/assets/{radio-group-BvfI-gyW.js → radio-group-BI8_7tB1.js} +1 -1
  98. package/dist/assets/{readonly-python-code-oS1ym1oK.js → readonly-python-code-105OJr2D.js} +1 -1
  99. package/dist/assets/reveal-component-d0AJhiPz.js +1069 -0
  100. package/dist/assets/{run-page-CYyEj38-.js → run-page-BwB4a_rF.js} +1 -1
  101. package/dist/assets/{scratchpad-panel-DOjHQ4C-.js → scratchpad-panel-BCgwBjOU.js} +1 -1
  102. package/dist/assets/{session-panel-C8k5069O.js → session-panel-CjbHqSx7.js} +1 -1
  103. package/dist/assets/{snippets-panel-BOrKs1xZ.js → snippets-panel-DoIpbSF-.js} +1 -1
  104. package/dist/assets/{state-BY9qohgO.js → state-CkI-5wv1.js} +1 -1
  105. package/dist/assets/{state-CMmuAxhT.js → state-EEacB8H4.js} +1 -1
  106. package/dist/assets/{textarea-CnP3WeAt.js → textarea-ibvi1Qnd.js} +1 -1
  107. package/dist/assets/{tracing-Bd-ySKo3.js → tracing-P2MsYVRw.js} +1 -1
  108. package/dist/assets/{tracing-panel-CPtHTsqj.js → tracing-panel-Cxh_KJIu.js} +2 -2
  109. package/dist/assets/{tree-actions-Ci1FwTlL.js → tree-actions-ovIJqNLj.js} +1 -1
  110. package/dist/assets/{useCellActionButton-DwC9zWoY.js → useCellActionButton-CpShaxQ-.js} +1 -1
  111. package/dist/assets/{useDeleteCell-3h3Gz-NC.js → useDeleteCell-ChnARMDw.js} +1 -1
  112. package/dist/assets/{useDependencyPanelTab-CEvDlLGZ.js → useDependencyPanelTab-CC87Jf6a.js} +1 -1
  113. package/dist/assets/{useNotebookActions-CYlzhmGc.js → useNotebookActions-CcvTFFvC.js} +1 -1
  114. package/dist/assets/{useRunCells-Bdoq5z0L.js → useRunCells-DELfNFG_.js} +1 -1
  115. package/dist/assets/{useSplitCell-DWbDk6-X.js → useSplitCell-B7LvuXIq.js} +1 -1
  116. package/dist/index.html +35 -35
  117. package/package.json +1 -1
  118. package/src/components/editor/cell/code/language-toggle.tsx +7 -1
  119. package/src/components/editor/documentation.css +19 -0
  120. package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +20 -0
  121. package/src/components/editor/renderers/slides-layout/types.ts +1 -0
  122. package/src/components/slides/__tests__/reveal-component.test.ts +425 -0
  123. package/src/components/slides/reveal-component.tsx +283 -61
  124. package/src/components/slides/slide-cell-view.tsx +26 -2
  125. package/src/components/slides/slide-form.tsx +26 -4
  126. package/src/core/codemirror/language/languages/python.ts +2 -0
  127. package/src/core/codemirror/lsp/__tests__/markdown-renderer.test.ts +41 -0
  128. package/src/core/codemirror/lsp/markdown-renderer.ts +59 -0
  129. package/dist/assets/dist-B0N0-Vx5.js +0 -1
  130. package/dist/assets/dist-BU26XwgJ.js +0 -1
  131. package/dist/assets/dist-BZX17NA8.js +0 -1
  132. package/dist/assets/dist-BcAHw69V.js +0 -1
  133. package/dist/assets/dist-C63_XIZr.js +0 -1
  134. package/dist/assets/dist-CDHGLvB9.js +0 -1
  135. package/dist/assets/dist-CHcznzB-.js +0 -2
  136. package/dist/assets/dist-COs9gIu5.js +0 -13
  137. package/dist/assets/dist-CPF3W2Y-.js +0 -1
  138. package/dist/assets/dist-CUapWJe4.js +0 -1
  139. package/dist/assets/dist-CWeWT34c.js +0 -1
  140. package/dist/assets/dist-CXBpwk_w.js +0 -7
  141. package/dist/assets/dist-CtfyEjVj.js +0 -1
  142. package/dist/assets/dist-DH60fwgs.js +0 -1
  143. package/dist/assets/dist-DK9FT3QL.js +0 -1
  144. package/dist/assets/dist-DZPpMvcR.js +0 -1
  145. package/dist/assets/dist-DkA__6UI.js +0 -3
  146. package/dist/assets/dist-DkcQg5xD.js +0 -1
  147. package/dist/assets/dist-DkzFxGAX.js +0 -1
  148. package/dist/assets/dist-DmBXXm0k.js +0 -1
  149. package/dist/assets/dist-LFeDu06u.js +0 -1
  150. package/dist/assets/dist-bRDVNr1s.js +0 -1
  151. package/dist/assets/dist-v1cdVFWt.js +0 -1
  152. package/dist/assets/esm-Cb2bnV6o.js +0 -1
  153. package/dist/assets/reveal-component-Dr_6s_9X.js +0 -1069
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-DqAsO6o_.js"></script>
69
+ <script type="module" crossorigin src="./assets/index-BIqgYS3N.js"></script>
70
70
  <link rel="modulepreload" crossorigin href="./assets/preload-helper-DdZsAcJe.js">
71
71
  <link rel="modulepreload" crossorigin href="./assets/chunk-LvLJmgfZ.js">
72
72
  <link rel="modulepreload" crossorigin href="./assets/react-Bj1aDYRI.js">
@@ -115,15 +115,15 @@
115
115
  <link rel="modulepreload" crossorigin href="./assets/capabilities-A_KhFcGV.js">
116
116
  <link rel="modulepreload" crossorigin href="./assets/createReducer-CI9qeK_X.js">
117
117
  <link rel="modulepreload" crossorigin href="./assets/paths-SFhaqGlE.js">
118
- <link rel="modulepreload" crossorigin href="./assets/dist-BrR4M-k3.js">
119
- <link rel="modulepreload" crossorigin href="./assets/dist-HlsDto3K.js">
120
- <link rel="modulepreload" crossorigin href="./assets/dist-CHcznzB-.js">
121
- <link rel="modulepreload" crossorigin href="./assets/dist-BU26XwgJ.js">
122
- <link rel="modulepreload" crossorigin href="./assets/dist-COs9gIu5.js">
123
- <link rel="modulepreload" crossorigin href="./assets/dist-BZr6MMV-.js">
124
- <link rel="modulepreload" crossorigin href="./assets/dist-DCqxOggh.js">
125
- <link rel="modulepreload" crossorigin href="./assets/dist-DkA__6UI.js">
126
- <link rel="modulepreload" crossorigin href="./assets/dist-C9ZB41s2.js">
118
+ <link rel="modulepreload" crossorigin href="./assets/dist-D0HyMpgV.js">
119
+ <link rel="modulepreload" crossorigin href="./assets/dist-Bo13cFwO.js">
120
+ <link rel="modulepreload" crossorigin href="./assets/dist-DVkC-Qmw.js">
121
+ <link rel="modulepreload" crossorigin href="./assets/dist-BFCmbzWi.js">
122
+ <link rel="modulepreload" crossorigin href="./assets/dist-CS6moqWs.js">
123
+ <link rel="modulepreload" crossorigin href="./assets/dist-cJl5Fok5.js">
124
+ <link rel="modulepreload" crossorigin href="./assets/dist-CMvFIVSA.js">
125
+ <link rel="modulepreload" crossorigin href="./assets/dist-DTNIEaQR.js">
126
+ <link rel="modulepreload" crossorigin href="./assets/dist-YEXtMjTi.js">
127
127
  <link rel="modulepreload" crossorigin href="./assets/stex-lcoTi-7o.js">
128
128
  <link rel="modulepreload" crossorigin href="./assets/toDate-B5A0DFEz.js">
129
129
  <link rel="modulepreload" crossorigin href="./assets/purify.es-DvRMX74T.js">
@@ -133,7 +133,7 @@
133
133
  <link rel="modulepreload" crossorigin href="./assets/debounce-DhnxH9Rh.js">
134
134
  <link rel="modulepreload" crossorigin href="./assets/database-zap-kIkTfzTX.js">
135
135
  <link rel="modulepreload" crossorigin href="./assets/main-B0OX4z33.js">
136
- <link rel="modulepreload" crossorigin href="./assets/cells-6zANRDgG.js">
136
+ <link rel="modulepreload" crossorigin href="./assets/cells-vjZ69d-u.js">
137
137
  <link rel="modulepreload" crossorigin href="./assets/ErrorBoundary-DyYDV0HI.js">
138
138
  <link rel="modulepreload" crossorigin href="./assets/kbd-BJB2rf7K.js">
139
139
  <link rel="modulepreload" crossorigin href="./assets/useInstallPackage-CKRPRNft.js">
@@ -147,35 +147,35 @@
147
147
  <link rel="modulepreload" crossorigin href="./assets/usePress-jH2RfcUG.js">
148
148
  <link rel="modulepreload" crossorigin href="./assets/input-Dvl7sgNQ.js">
149
149
  <link rel="modulepreload" crossorigin href="./assets/ImperativeModal-CYpBrCHJ.js">
150
- <link rel="modulepreload" crossorigin href="./assets/cell-link-AJAjqJb5.js">
150
+ <link rel="modulepreload" crossorigin href="./assets/cell-link-CgOvnjYt.js">
151
151
  <link rel="modulepreload" crossorigin href="./assets/multi-map-C4OANz8X.js">
152
152
  <link rel="modulepreload" crossorigin href="./assets/alert-DrHguQlr.js">
153
153
  <link rel="modulepreload" crossorigin href="./assets/chevron-right-CG5QYXYk.js">
154
154
  <link rel="modulepreload" crossorigin href="./assets/dropdown-menu-CZ4XbE-c.js">
155
155
  <link rel="modulepreload" crossorigin href="./assets/links-B8WzCnbo.js">
156
- <link rel="modulepreload" crossorigin href="./assets/useRunCells-Bdoq5z0L.js">
156
+ <link rel="modulepreload" crossorigin href="./assets/useRunCells-DELfNFG_.js">
157
157
  <link rel="modulepreload" crossorigin href="./assets/copy-Ch48HVPK.js">
158
158
  <link rel="modulepreload" crossorigin href="./assets/copy-BwrPA9zQ.js">
159
159
  <link rel="modulepreload" crossorigin href="./assets/copy-icon-c48rtYOO.js">
160
- <link rel="modulepreload" crossorigin href="./assets/RenderHTML-DMfo8SsK.js">
161
- <link rel="modulepreload" crossorigin href="./assets/datasource-Bdio-a96.js">
162
- <link rel="modulepreload" crossorigin href="./assets/state-BY9qohgO.js">
160
+ <link rel="modulepreload" crossorigin href="./assets/RenderHTML-D-OajlP0.js">
161
+ <link rel="modulepreload" crossorigin href="./assets/datasource-CAHQYs6s.js">
162
+ <link rel="modulepreload" crossorigin href="./assets/state-CkI-5wv1.js">
163
163
  <link rel="modulepreload" crossorigin href="./assets/package-B8oXOUM-.js">
164
164
  <link rel="modulepreload" crossorigin href="./assets/sparkles-CC9Bko6a.js">
165
- <link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-DxKFtfTA.js">
165
+ <link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-Bqzbv_QJ.js">
166
166
  <link rel="modulepreload" crossorigin href="./assets/spinner-UuZAUjoP.js">
167
- <link rel="modulepreload" crossorigin href="./assets/html-to-image-DvVDsEqf.js">
168
- <link rel="modulepreload" crossorigin href="./assets/focus-Btnin91L.js">
167
+ <link rel="modulepreload" crossorigin href="./assets/html-to-image-2JVKRW1b.js">
168
+ <link rel="modulepreload" crossorigin href="./assets/focus-D3l6p56g.js">
169
169
  <link rel="modulepreload" crossorigin href="./assets/useAsyncData-Dg8E_bPh.js">
170
- <link rel="modulepreload" crossorigin href="./assets/LazyAnyLanguageCodeMirror-CaR5QYb0.js">
170
+ <link rel="modulepreload" crossorigin href="./assets/LazyAnyLanguageCodeMirror-DGz0wXbE.js">
171
171
  <link rel="modulepreload" crossorigin href="./assets/micromark-factory-space-bqhKsQDn.js">
172
172
  <link rel="modulepreload" crossorigin href="./assets/chunk-5FQGJX7Z-CfK7VoEZ.js">
173
- <link rel="modulepreload" crossorigin href="./assets/markdown-renderer-j3gyUhRd.js">
173
+ <link rel="modulepreload" crossorigin href="./assets/markdown-renderer-DTD6g-4R.js">
174
174
  <link rel="modulepreload" crossorigin href="./assets/command-rtnOVF57.js">
175
175
  <link rel="modulepreload" crossorigin href="./assets/field-DTk6GDWB.js">
176
176
  <link rel="modulepreload" crossorigin href="./assets/popover-CNCYAwbC.js">
177
177
  <link rel="modulepreload" crossorigin href="./assets/errors-iwK4b4VF.js">
178
- <link rel="modulepreload" crossorigin href="./assets/download-C_cnbmM9.js">
178
+ <link rel="modulepreload" crossorigin href="./assets/download-DyF92TRH.js">
179
179
  <link rel="modulepreload" crossorigin href="./assets/table-Bgc-inJs.js">
180
180
  <link rel="modulepreload" crossorigin href="./assets/useIframeCapabilities-DPVTppnD.js">
181
181
  <link rel="modulepreload" crossorigin href="./assets/error-banner-BEmVNYlO.js">
@@ -197,25 +197,25 @@
197
197
  <link rel="modulepreload" crossorigin href="./assets/plus-CxkHs8QM.js">
198
198
  <link rel="modulepreload" crossorigin href="./assets/trash-2-BJLYnZpG.js">
199
199
  <link rel="modulepreload" crossorigin href="./assets/react-resizable-panels.browser.esm-BdtIs0E-.js">
200
- <link rel="modulepreload" crossorigin href="./assets/JsonOutput-Hk49rzGl.js">
200
+ <link rel="modulepreload" crossorigin href="./assets/JsonOutput-BYEhZqb8.js">
201
201
  <link rel="modulepreload" crossorigin href="./assets/chart-no-axes-column-nqk474t8.js">
202
202
  <link rel="modulepreload" crossorigin href="./assets/square-function-blYaQso8.js">
203
203
  <link rel="modulepreload" crossorigin href="./assets/spec-D1ptWKg6.js">
204
204
  <link rel="modulepreload" crossorigin href="./assets/ellipsis-vertical-CkwWkOQL.js">
205
205
  <link rel="modulepreload" crossorigin href="./assets/refresh-cw-a_9k9BK7.js">
206
- <link rel="modulepreload" crossorigin href="./assets/tree-actions-Ci1FwTlL.js">
207
- <link rel="modulepreload" crossorigin href="./assets/components-CY48CF-h.js">
208
- <link rel="modulepreload" crossorigin href="./assets/column-preview-B2kXnKdd.js">
206
+ <link rel="modulepreload" crossorigin href="./assets/tree-actions-ovIJqNLj.js">
207
+ <link rel="modulepreload" crossorigin href="./assets/components-1VuqOYTA.js">
208
+ <link rel="modulepreload" crossorigin href="./assets/column-preview-Bqp95o1c.js">
209
209
  <link rel="modulepreload" crossorigin href="./assets/icons-8tfAri2V.js">
210
- <link rel="modulepreload" crossorigin href="./assets/radio-group-BvfI-gyW.js">
211
- <link rel="modulepreload" crossorigin href="./assets/floating-outline-DvtQqFjz.js">
210
+ <link rel="modulepreload" crossorigin href="./assets/radio-group-BI8_7tB1.js">
211
+ <link rel="modulepreload" crossorigin href="./assets/floating-outline-p8p6wKPj.js">
212
212
  <link rel="modulepreload" crossorigin href="./assets/objectWithoutPropertiesLoose-DoKw85w0.js">
213
- <link rel="modulepreload" crossorigin href="./assets/esm-Cb2bnV6o.js">
214
- <link rel="modulepreload" crossorigin href="./assets/readonly-python-code-oS1ym1oK.js">
213
+ <link rel="modulepreload" crossorigin href="./assets/esm-ChQLuryJ.js">
214
+ <link rel="modulepreload" crossorigin href="./assets/readonly-python-code-105OJr2D.js">
215
215
  <link rel="modulepreload" crossorigin href="./assets/file-headphone-B3fuktN0.js">
216
216
  <link rel="modulepreload" crossorigin href="./assets/file-HTLbeC2b.js">
217
217
  <link rel="modulepreload" crossorigin href="./assets/image-BIibSXT6.js">
218
- <link rel="modulepreload" crossorigin href="./assets/file-icons-DObkD0p2.js">
218
+ <link rel="modulepreload" crossorigin href="./assets/file-icons-DYeUbwkv.js">
219
219
  <link rel="modulepreload" crossorigin href="./assets/switch-DNHeV6xs.js">
220
220
  <link rel="modulepreload" crossorigin href="./assets/events-CBm-hwqS.js">
221
221
  <link rel="modulepreload" crossorigin href="./assets/globals-BlTO0oUB.js">
@@ -224,11 +224,11 @@
224
224
  <link rel="modulepreload" crossorigin href="./assets/memoize-Tp7rARFe.js">
225
225
  <link rel="modulepreload" crossorigin href="./assets/get-C-qh_et5.js">
226
226
  <link rel="modulepreload" crossorigin href="./assets/_baseSet-CxV9N1bc.js">
227
- <link rel="modulepreload" crossorigin href="./assets/state-CMmuAxhT.js">
227
+ <link rel="modulepreload" crossorigin href="./assets/state-EEacB8H4.js">
228
228
  <link rel="modulepreload" crossorigin href="./assets/label-C2_YQRio.js">
229
- <link rel="modulepreload" crossorigin href="./assets/textarea-CnP3WeAt.js">
229
+ <link rel="modulepreload" crossorigin href="./assets/textarea-ibvi1Qnd.js">
230
230
  <link rel="modulepreload" crossorigin href="./assets/refresh-ccw-DLc784Sj.js">
231
- <link rel="modulepreload" crossorigin href="./assets/form-CBuNDBgZ.js">
231
+ <link rel="modulepreload" crossorigin href="./assets/form-B_6lxOn3.js">
232
232
  <link rel="modulepreload" crossorigin href="./assets/renderShortcut-DbyG33_r.js">
233
233
  <link rel="modulepreload" crossorigin href="./assets/useBoolean-D4l-DzBM.js">
234
234
  <link rel="modulepreload" crossorigin href="./assets/useDeepCompareMemoize-CWcgQCbT.js">
@@ -246,7 +246,7 @@
246
246
  <link rel="modulepreload" crossorigin href="./assets/square-rACnnz-q.js">
247
247
  <link rel="modulepreload" crossorigin href="./assets/triangle-alert-CJ0ZIqcz.js">
248
248
  <link rel="modulepreload" crossorigin href="./assets/bundle.esm-BXIlAZ6T.js">
249
- <link rel="stylesheet" crossorigin href="./assets/cells-BSWdJzbh.css">
249
+ <link rel="stylesheet" crossorigin href="./assets/cells-pu5xzE_v.css">
250
250
  <link rel="stylesheet" crossorigin href="./assets/markdown-renderer-DdDKmWlR.css">
251
251
  <link rel="stylesheet" crossorigin href="./assets/JsonOutput-B7vuddcd.css">
252
252
  <link rel="stylesheet" crossorigin href="./assets/index-Ct3LgsQ8.css">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marimo-team/frontend",
3
- "version": "0.23.10-dev24",
3
+ "version": "0.23.10-dev26",
4
4
  "main": "dist/main.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -17,6 +17,11 @@ interface LanguageTogglesProps {
17
17
  code: string;
18
18
  currentLanguageAdapter: LanguageAdapter["type"] | undefined;
19
19
  onAfterToggle: () => void;
20
+ /**
21
+ * Classes for the wrapper element. Defaults to the absolutely-positioned,
22
+ * hover-revealed placement used inside the notebook cell editor.
23
+ */
24
+ className?: string;
20
25
  }
21
26
 
22
27
  export const LanguageToggles: React.FC<LanguageTogglesProps> = ({
@@ -24,6 +29,7 @@ export const LanguageToggles: React.FC<LanguageTogglesProps> = ({
24
29
  code,
25
30
  currentLanguageAdapter,
26
31
  onAfterToggle,
32
+ className = "absolute right-3 top-2 z-20 flex hover-action gap-1",
27
33
  }) => {
28
34
  const canUseMarkdown = useMemo(
29
35
  () => LanguageAdapters.markdown.isSupported(code) || code.trim() === "",
@@ -35,7 +41,7 @@ export const LanguageToggles: React.FC<LanguageTogglesProps> = ({
35
41
  );
36
42
 
37
43
  return (
38
- <div className="absolute right-3 top-2 z-20 flex hover-action gap-1">
44
+ <div className={className}>
39
45
  <LanguageToggle
40
46
  editorView={editorView}
41
47
  currentLanguageAdapter={currentLanguageAdapter}
@@ -153,3 +153,22 @@
153
153
  }
154
154
  }
155
155
  }
156
+
157
+ /* Syntax highlighting for LSP hover code blocks (lezer classHighlighter tok-* classes) */
158
+ .docs-documentation,
159
+ .cm-tooltip .documentation {
160
+ .tok-keyword { color: light-dark(#708, #c678dd); font-weight: 500; }
161
+ .tok-string,
162
+ .tok-string2 { color: light-dark(#a11, #98c379); }
163
+ .tok-number { color: light-dark(#164, #d19a66); }
164
+ .tok-bool,
165
+ .tok-atom { color: light-dark(#219, #d19a66); }
166
+ .tok-comment { color: var(--cm-comment); }
167
+ .tok-className { color: light-dark(#00f, #61afef); }
168
+ .tok-typeName,
169
+ .tok-namespace { color: light-dark(#085, #56b6c2); }
170
+ .tok-operator { color: light-dark(#a2f, #56b6c2); }
171
+ .tok-propertyName { color: light-dark(#05a, #e5c07b); }
172
+ .tok-variableName { color: light-dark(#000, #abb2bf); }
173
+ .tok-punctuation { color: light-dark(#000, #abb2bf); }
174
+ }
@@ -248,6 +248,26 @@ const BACKWARDS_COMPAT_SNAPSHOTS: BackwardsCompatCase[] = [
248
248
  ],
249
249
  },
250
250
  },
251
+ {
252
+ // `showCode` was added to SlideConfig. The validator must know about it (so
253
+ // it isn't silently stripped), the deserializer must carry it through, and
254
+ // serialize → deserialize must round-trip both values.
255
+ label: "showCode round-trips through validate + (de)serialize",
256
+ input: {
257
+ cells: [
258
+ { type: "slide", showCode: true },
259
+ { type: "fragment", showCode: false },
260
+ ],
261
+ },
262
+ expected: {
263
+ deck: {},
264
+ cellIds: ["a", "b"],
265
+ cellEntries: [
266
+ ["a", { type: "slide", showCode: true }],
267
+ ["b", { type: "fragment", showCode: false }],
268
+ ],
269
+ },
270
+ },
251
271
  ];
252
272
 
253
273
  describe("SlidesLayoutPlugin backwards compatibility", () => {
@@ -9,6 +9,7 @@ export type SlideType = z.infer<typeof SlideTypeSchema>;
9
9
  const SlideConfigSchema = z.looseObject({
10
10
  type: SlideTypeSchema.optional(),
11
11
  speakerNotes: z.string().optional(),
12
+ showCode: z.boolean().optional(),
12
13
  });
13
14
  export type SlideConfig = z.infer<typeof SlideConfigSchema>;
14
15
 
@@ -0,0 +1,425 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { act, renderHook } from "@testing-library/react";
4
+ import { describe, expect, it } from "vitest";
5
+ import { cellId } from "@/__tests__/branded";
6
+ import type { CellId } from "@/core/cells/ids";
7
+ import type { RuntimeCell } from "@/core/cells/types";
8
+ import type { SlideConfig } from "../../editor/renderers/slides-layout/types";
9
+ import {
10
+ deckSlideType,
11
+ parkedRendersSource,
12
+ shouldShowCode,
13
+ useParkedPreview,
14
+ } from "../reveal-component";
15
+
16
+ const A = cellId("a");
17
+ const B = cellId("b");
18
+
19
+ const cells = (
20
+ ...entries: Array<[CellId, SlideConfig]>
21
+ ): ReadonlyMap<CellId, SlideConfig> => new Map(entries);
22
+
23
+ // The hook only reads `cell.id`, so a minimal stub is enough. Cast is confined
24
+ // to this test helper (see `@/__tests__/branded` for the same rationale).
25
+ const cell = (id: CellId): RuntimeCell => ({ id }) as RuntimeCell;
26
+
27
+ describe("shouldShowCode", () => {
28
+ it("is off when the code toggle is unavailable, regardless of config/override", () => {
29
+ expect(
30
+ shouldShowCode({
31
+ cells: cells([A, { showCode: true }]),
32
+ cellId: A,
33
+ showCodeOverrides: new Set([A]),
34
+ codeToggleEnabled: false,
35
+ }),
36
+ ).toBe(false);
37
+ });
38
+
39
+ it("is off when there is no active cell", () => {
40
+ expect(
41
+ shouldShowCode({
42
+ cells: cells([A, { showCode: true }]),
43
+ cellId: undefined,
44
+ showCodeOverrides: new Set(),
45
+ codeToggleEnabled: true,
46
+ }),
47
+ ).toBe(false);
48
+ });
49
+
50
+ it("follows the persisted config when there is no override", () => {
51
+ expect(
52
+ shouldShowCode({
53
+ cells: cells([A, { showCode: true }]),
54
+ cellId: A,
55
+ showCodeOverrides: new Set(),
56
+ codeToggleEnabled: true,
57
+ }),
58
+ ).toBe(true);
59
+ // Missing config entry defaults to off.
60
+ expect(
61
+ shouldShowCode({
62
+ cells: cells(),
63
+ cellId: A,
64
+ showCodeOverrides: new Set(),
65
+ codeToggleEnabled: true,
66
+ }),
67
+ ).toBe(false);
68
+ });
69
+
70
+ it("shows code when either the config or the override is set (logical OR)", () => {
71
+ // Peek: config unset, override present -> shown.
72
+ expect(
73
+ shouldShowCode({
74
+ cells: cells(),
75
+ cellId: A,
76
+ showCodeOverrides: new Set([A]),
77
+ codeToggleEnabled: true,
78
+ }),
79
+ ).toBe(true);
80
+ // Configured + override present -> still shown; the override never hides.
81
+ expect(
82
+ shouldShowCode({
83
+ cells: cells([A, { showCode: true }]),
84
+ cellId: A,
85
+ showCodeOverrides: new Set([A]),
86
+ codeToggleEnabled: true,
87
+ }),
88
+ ).toBe(true);
89
+ });
90
+ });
91
+
92
+ describe("deckSlideType", () => {
93
+ const NONE_IDS: ReadonlySet<CellId> = new Set();
94
+
95
+ it("uses the configured type for a normal cell", () => {
96
+ expect(
97
+ deckSlideType({
98
+ cell: cell(A),
99
+ noOutputIds: NONE_IDS,
100
+ heldEditCellId: null,
101
+ slideConfigs: cells([A, { type: "fragment" }]),
102
+ }),
103
+ ).toBe("fragment");
104
+ });
105
+
106
+ it("defaults to a top-level slide when no type is configured", () => {
107
+ expect(
108
+ deckSlideType({
109
+ cell: cell(A),
110
+ noOutputIds: NONE_IDS,
111
+ heldEditCellId: null,
112
+ slideConfigs: cells(),
113
+ }),
114
+ ).toBe("slide");
115
+ });
116
+
117
+ it("drops output-less cells from the deck", () => {
118
+ expect(
119
+ deckSlideType({
120
+ cell: cell(A),
121
+ noOutputIds: new Set([A]),
122
+ heldEditCellId: null,
123
+ // Even an explicit type is overridden by the skip.
124
+ slideConfigs: cells([A, { type: "sub-slide" }]),
125
+ }),
126
+ ).toBe("skip");
127
+ });
128
+
129
+ it("drops the held-edit cell so it isn't mounted twice", () => {
130
+ expect(
131
+ deckSlideType({
132
+ cell: cell(A),
133
+ noOutputIds: NONE_IDS,
134
+ heldEditCellId: A,
135
+ slideConfigs: cells([A, { type: "slide" }]),
136
+ }),
137
+ ).toBe("skip");
138
+ });
139
+ });
140
+
141
+ describe("parkedRendersSource", () => {
142
+ it("follows `showCode` for a cell that has output", () => {
143
+ expect(
144
+ parkedRendersSource({
145
+ isNoOutputPreview: false,
146
+ isEditable: false,
147
+ showCode: true,
148
+ }),
149
+ ).toBe(true);
150
+ expect(
151
+ parkedRendersSource({
152
+ isNoOutputPreview: false,
153
+ isEditable: true,
154
+ showCode: false,
155
+ }),
156
+ ).toBe(false);
157
+ });
158
+
159
+ it("falls back to source for an editable no-output cell even when showCode is off", () => {
160
+ expect(
161
+ parkedRendersSource({
162
+ isNoOutputPreview: true,
163
+ isEditable: true,
164
+ showCode: false,
165
+ }),
166
+ ).toBe(true);
167
+ });
168
+
169
+ it("renders output for a read-only no-output cell with showCode off", () => {
170
+ expect(
171
+ parkedRendersSource({
172
+ isNoOutputPreview: true,
173
+ isEditable: false,
174
+ showCode: false,
175
+ }),
176
+ ).toBe(false);
177
+ });
178
+ });
179
+
180
+ describe("useParkedPreview", () => {
181
+ const NO_CONFIG = cells();
182
+ const NONE = new Set<CellId>();
183
+
184
+ it("is inert for a rendered cell with output", () => {
185
+ const { result } = renderHook(() =>
186
+ useParkedPreview({
187
+ activeCell: cell(A),
188
+ slideConfigs: NO_CONFIG,
189
+ noOutputIds: NONE,
190
+ }),
191
+ );
192
+ expect(result.current).toEqual({
193
+ parkedPreviewCell: null,
194
+ isHeldEdit: false,
195
+ isNoOutputPreview: false,
196
+ heldEditCellId: null,
197
+ heldShowsCode: true,
198
+ toggleHeldShowsCode: expect.any(Function),
199
+ });
200
+ });
201
+
202
+ it("is inert when there is no active cell", () => {
203
+ const { result } = renderHook(() =>
204
+ useParkedPreview({
205
+ activeCell: undefined,
206
+ slideConfigs: NO_CONFIG,
207
+ noOutputIds: NONE,
208
+ }),
209
+ );
210
+ expect(result.current).toEqual({
211
+ parkedPreviewCell: null,
212
+ isHeldEdit: false,
213
+ isNoOutputPreview: false,
214
+ heldEditCellId: null,
215
+ heldShowsCode: true,
216
+ toggleHeldShowsCode: expect.any(Function),
217
+ });
218
+ });
219
+
220
+ it("parks a skipped cell without flagging it as a no-output preview", () => {
221
+ const { result } = renderHook(() =>
222
+ useParkedPreview({
223
+ activeCell: cell(A),
224
+ slideConfigs: cells([A, { type: "skip" }]),
225
+ noOutputIds: NONE,
226
+ }),
227
+ );
228
+ expect(result.current).toEqual({
229
+ parkedPreviewCell: cell(A),
230
+ isHeldEdit: false,
231
+ isNoOutputPreview: false,
232
+ heldEditCellId: null,
233
+ heldShowsCode: true,
234
+ toggleHeldShowsCode: expect.any(Function),
235
+ });
236
+ });
237
+
238
+ it("parks an output-less cell as a no-output preview", () => {
239
+ const { result } = renderHook(() =>
240
+ useParkedPreview({
241
+ activeCell: cell(A),
242
+ slideConfigs: NO_CONFIG,
243
+ noOutputIds: new Set([A]),
244
+ }),
245
+ );
246
+ expect(result.current).toEqual({
247
+ parkedPreviewCell: cell(A),
248
+ isHeldEdit: false,
249
+ isNoOutputPreview: true,
250
+ heldEditCellId: null,
251
+ heldShowsCode: true,
252
+ toggleHeldShowsCode: expect.any(Function),
253
+ });
254
+ });
255
+
256
+ it("holds the cell in the overlay once it gains output", () => {
257
+ const { result, rerender } = renderHook(
258
+ (props: Parameters<typeof useParkedPreview>[0]) =>
259
+ useParkedPreview(props),
260
+ {
261
+ initialProps: {
262
+ activeCell: cell(A),
263
+ slideConfigs: NO_CONFIG,
264
+ noOutputIds: new Set([A]),
265
+ },
266
+ },
267
+ );
268
+ expect(result.current.isNoOutputPreview).toBe(true);
269
+ expect(result.current.isHeldEdit).toBe(false);
270
+
271
+ // Same cell, now with output: keep it parked so the editor isn't remounted.
272
+ rerender({
273
+ activeCell: cell(A),
274
+ slideConfigs: NO_CONFIG,
275
+ noOutputIds: NONE,
276
+ });
277
+ expect(result.current).toEqual({
278
+ parkedPreviewCell: cell(A),
279
+ isHeldEdit: true,
280
+ isNoOutputPreview: false,
281
+ heldEditCellId: A,
282
+ heldShowsCode: true,
283
+ toggleHeldShowsCode: expect.any(Function),
284
+ });
285
+ });
286
+
287
+ it("releases the hold when a different cell becomes active", () => {
288
+ const { result, rerender } = renderHook(
289
+ (props: Parameters<typeof useParkedPreview>[0]) =>
290
+ useParkedPreview(props),
291
+ {
292
+ initialProps: {
293
+ activeCell: cell(A),
294
+ slideConfigs: NO_CONFIG,
295
+ noOutputIds: new Set([A]),
296
+ },
297
+ },
298
+ );
299
+ // Arm the hold, then let A gain output (held).
300
+ rerender({
301
+ activeCell: cell(A),
302
+ slideConfigs: NO_CONFIG,
303
+ noOutputIds: NONE,
304
+ });
305
+ expect(result.current.isHeldEdit).toBe(true);
306
+
307
+ // Navigate to a rendered B: the hold on A is released.
308
+ rerender({
309
+ activeCell: cell(B),
310
+ slideConfigs: NO_CONFIG,
311
+ noOutputIds: NONE,
312
+ });
313
+ expect(result.current).toEqual({
314
+ parkedPreviewCell: null,
315
+ isHeldEdit: false,
316
+ isNoOutputPreview: false,
317
+ heldEditCellId: null,
318
+ heldShowsCode: true,
319
+ toggleHeldShowsCode: expect.any(Function),
320
+ });
321
+ });
322
+
323
+ it("releases a skipped cell into the deck as soon as it is un-skipped", () => {
324
+ const { result, rerender } = renderHook(
325
+ (props: Parameters<typeof useParkedPreview>[0]) =>
326
+ useParkedPreview(props),
327
+ {
328
+ initialProps: {
329
+ activeCell: cell(A),
330
+ slideConfigs: cells([A, { type: "skip" }]),
331
+ noOutputIds: NONE,
332
+ },
333
+ },
334
+ );
335
+ expect(result.current.parkedPreviewCell).toEqual(cell(A));
336
+
337
+ // Un-skip the still-active cell: it has output, so it must rejoin the deck
338
+ // immediately rather than staying held in the overlay until navigation.
339
+ rerender({
340
+ activeCell: cell(A),
341
+ slideConfigs: NO_CONFIG,
342
+ noOutputIds: NONE,
343
+ });
344
+ expect(result.current).toEqual({
345
+ parkedPreviewCell: null,
346
+ isHeldEdit: false,
347
+ isNoOutputPreview: false,
348
+ heldEditCellId: null,
349
+ heldShowsCode: true,
350
+ toggleHeldShowsCode: expect.any(Function),
351
+ });
352
+ });
353
+
354
+ it("shows the held editor by default and toggles it off without navigating", () => {
355
+ const { result, rerender } = renderHook(
356
+ (props: Parameters<typeof useParkedPreview>[0]) =>
357
+ useParkedPreview(props),
358
+ {
359
+ initialProps: {
360
+ activeCell: cell(A),
361
+ slideConfigs: NO_CONFIG,
362
+ noOutputIds: new Set([A]),
363
+ },
364
+ },
365
+ );
366
+ // A gains output: held, with its editor shown by default.
367
+ rerender({
368
+ activeCell: cell(A),
369
+ slideConfigs: NO_CONFIG,
370
+ noOutputIds: NONE,
371
+ });
372
+ expect(result.current.isHeldEdit).toBe(true);
373
+ expect(result.current.heldShowsCode).toBe(true);
374
+
375
+ // The `C` toggle hides the editor in place, no navigation required.
376
+ act(() => {
377
+ result.current.toggleHeldShowsCode();
378
+ });
379
+ expect(result.current.heldShowsCode).toBe(false);
380
+
381
+ // Toggling again brings it back.
382
+ act(() => {
383
+ result.current.toggleHeldShowsCode();
384
+ });
385
+ expect(result.current.heldShowsCode).toBe(true);
386
+ });
387
+
388
+ it("resets held code visibility when a new cell takes the held slot", () => {
389
+ const { result, rerender } = renderHook(
390
+ (props: Parameters<typeof useParkedPreview>[0]) =>
391
+ useParkedPreview(props),
392
+ {
393
+ initialProps: {
394
+ activeCell: cell(A),
395
+ slideConfigs: NO_CONFIG,
396
+ noOutputIds: new Set([A]),
397
+ },
398
+ },
399
+ );
400
+ rerender({
401
+ activeCell: cell(A),
402
+ slideConfigs: NO_CONFIG,
403
+ noOutputIds: NONE,
404
+ });
405
+ act(() => {
406
+ result.current.toggleHeldShowsCode();
407
+ });
408
+ expect(result.current.heldShowsCode).toBe(false);
409
+
410
+ // Move to a fresh output-less cell B, then let it gain output (held).
411
+ rerender({
412
+ activeCell: cell(B),
413
+ slideConfigs: NO_CONFIG,
414
+ noOutputIds: new Set([B]),
415
+ });
416
+ rerender({
417
+ activeCell: cell(B),
418
+ slideConfigs: NO_CONFIG,
419
+ noOutputIds: NONE,
420
+ });
421
+ expect(result.current.heldEditCellId).toBe(B);
422
+ // The new cell starts with its editor visible again.
423
+ expect(result.current.heldShowsCode).toBe(true);
424
+ });
425
+ });