@marimo-team/frontend 0.24.1-dev99 → 0.24.2-dev129

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 (304) hide show
  1. package/dist/assets/{CellStatus-wvvZkEPY.js → CellStatus-LoTwk7fR.js} +1 -1
  2. package/dist/assets/{ConnectedDataExplorerComponent-Dkqk66Mv.js → ConnectedDataExplorerComponent-DW6cJ-Lr.js} +1 -1
  3. package/dist/assets/{ErrorBoundary-npvnLp9x.js → ErrorBoundary-CDVGFYfr.js} +1 -1
  4. package/dist/assets/JsonOutput-CzIGPEZQ.js +50 -0
  5. package/dist/assets/{LazyAnyLanguageCodeMirror-zSwE3dvU.js → LazyAnyLanguageCodeMirror-LboTfNDv.js} +2 -2
  6. package/dist/assets/{MarimoErrorOutput-CeUo5oka.js → MarimoErrorOutput-DqpoYOvw.js} +1 -1
  7. package/dist/assets/RenderHTML-DwhMAd9l.js +1 -0
  8. package/dist/assets/{RunButton-BaV8A-z4.js → RunButton-BlpbweyH.js} +1 -1
  9. package/dist/assets/{VisuallyHidden-SChAyKIQ.js → VisuallyHidden-CBMDmozt.js} +1 -1
  10. package/dist/assets/{add-cell-with-ai-DoLkfzYn.js → add-cell-with-ai-R-3DS79K.js} +1 -1
  11. package/dist/assets/{add-connection-dialog-C1IF1nR0.js → add-connection-dialog-BGfpw5lC.js} +1 -1
  12. package/dist/assets/{agent-panel-CG154QrU.js → agent-panel-Cgt_K0tD.js} +1 -1
  13. package/dist/assets/ai-model-dropdown-DCmiuk7x.js +3 -0
  14. package/dist/assets/alert-dialog-CA-2mBs3.js +11 -0
  15. package/dist/assets/any-language-editor-DflLjPSQ.js +1 -0
  16. package/dist/assets/{app-config-button-ktBH1pEB.js → app-config-button-DUJC6b6x.js} +1 -1
  17. package/dist/assets/badge-BSgtkC2e.js +1 -0
  18. package/dist/assets/{blob-DVtvZmWH.js → blob-B2d_dHwI.js} +1 -1
  19. package/dist/assets/button-Dh8EwhsF.js +1 -0
  20. package/dist/assets/{cache-panel-C7jsiqCa.js → cache-panel-DqgtC98s.js} +1 -1
  21. package/dist/assets/{capabilities-LWzb3E3M.js → capabilities-D8kPgMKr.js} +1 -1
  22. package/dist/assets/{cell-editor-DoDqaCZp.js → cell-editor-Dw09J9yD.js} +6 -6
  23. package/dist/assets/{cell-link-Dqqt6Rgs.js → cell-link-6burT2XF.js} +1 -1
  24. package/dist/assets/{cells-D4RwofRx.js → cells-Cp-G34Rz.js} +56 -56
  25. package/dist/assets/{chat-display-COmzHgx5.js → chat-display-Bu405iyc.js} +1 -1
  26. package/dist/assets/{chat-panel-B2tyEfGW.js → chat-panel-BlUwNY5j.js} +1 -1
  27. package/dist/assets/{chat-ui-B5bsr-7V.js → chat-ui-DGiVDzNh.js} +1 -1
  28. package/dist/assets/{circle--ysFeW9z.js → circle-ByJdIf5p.js} +1 -1
  29. package/dist/assets/{column-preview-CW5DPFvy.js → column-preview-riSXbYe_.js} +1 -1
  30. package/dist/assets/{command-palette-B9dyvMvJ.js → command-palette-CCVzJcyf.js} +1 -1
  31. package/dist/assets/{common-CC3tuCpi.js → common-CHR7w7aQ.js} +1 -1
  32. package/dist/assets/{components-D02ZZZMP.js → components-C7mWrmXr.js} +1 -1
  33. package/dist/assets/{components-CBlGIIAX.js → components-DUYCXngU.js} +1 -1
  34. package/dist/assets/config-B-r81uZ6.js +1 -0
  35. package/dist/assets/{config-D4frVGQ4.js → config-BlNM0caL.js} +1 -1
  36. package/dist/assets/{copy-Cg05mM3C.js → copy-DlEomWzI.js} +1 -1
  37. package/dist/assets/{copy-icon-CRxVZTJ9.js → copy-icon-z8fuTE3w.js} +1 -1
  38. package/dist/assets/{createReducer-Bq-nQJiK.js → createReducer-B_XmHROl.js} +1 -1
  39. package/dist/assets/{datasource-Do8f2hFf.js → datasource-DrODSIs0.js} +1 -1
  40. package/dist/assets/{dates-DK5JikJo.js → dates-B58T85Jq.js} +1 -1
  41. package/dist/assets/dependency-graph-panel-AY5BEVH2.js +5 -0
  42. package/dist/assets/{dist-7qdHLg-L.js → dist-B0RXffUm.js} +1 -1
  43. package/dist/assets/dist-B0qYy1Ye.js +1 -0
  44. package/dist/assets/{dist-B97dKQGP.js → dist-B8pdsUrS.js} +1 -1
  45. package/dist/assets/{dist-BcfF-rkl.js → dist-BF7Lrekv.js} +1 -1
  46. package/dist/assets/dist-BL8RjfvI.js +1 -0
  47. package/dist/assets/dist-BVZxge7j.js +1 -0
  48. package/dist/assets/{dist-fxnYzq-R.js → dist-BaRNSaca.js} +1 -1
  49. package/dist/assets/dist-Bk2yQtw4.js +1 -0
  50. package/dist/assets/dist-BsfiiKoy.js +1 -0
  51. package/dist/assets/dist-BskmVd3B.js +1 -0
  52. package/dist/assets/{dist-DL1Thauf.js → dist-Bsu3h9O7.js} +1 -1
  53. package/dist/assets/{dist-PIe1xcZo.js → dist-BtC9ym6k.js} +7 -7
  54. package/dist/assets/{dist-DeuWxYVk.js → dist-Bv0S1RlZ.js} +1 -1
  55. package/dist/assets/{dist-CidBzUqR.js → dist-C--ZICxQ.js} +1 -1
  56. package/dist/assets/dist-C-2fD3XY.js +1 -0
  57. package/dist/assets/{dist-DzAWvPVK.js → dist-CKUpxYGQ.js} +1 -1
  58. package/dist/assets/dist-CMFMfBm1.js +1 -0
  59. package/dist/assets/dist-CZNULd6Z.js +2 -0
  60. package/dist/assets/dist-CjFduPiC.js +1 -0
  61. package/dist/assets/{dist-DoAjHgMj.js → dist-CmImLjus.js} +1 -1
  62. package/dist/assets/{dist-BKx0MLbb.js → dist-Cq8NOszX.js} +1 -1
  63. package/dist/assets/{dist-DCc0VfiO.js → dist-Cx4BE7jC.js} +3 -3
  64. package/dist/assets/dist-D45ScydS.js +1 -0
  65. package/dist/assets/dist-D6dg87r7.js +1 -0
  66. package/dist/assets/dist-DEjfQLz0.js +1 -0
  67. package/dist/assets/{dist-BcYW-EJk.js → dist-DJOWOALB.js} +1 -1
  68. package/dist/assets/{dist-CxxZaSme.js → dist-DPoYlxSC.js} +1 -1
  69. package/dist/assets/dist-DR-Y-nl3.js +1 -0
  70. package/dist/assets/dist-Dahlp9JQ.js +1 -0
  71. package/dist/assets/{dist-DIkuvChK.js → dist-Db-HC93w.js} +1 -1
  72. package/dist/assets/{dist-DTM7BAUu.js → dist-DdOlZ6mj.js} +1 -1
  73. package/dist/assets/{dist-Dz_04liz.js → dist-DiYjQAhI.js} +1 -1
  74. package/dist/assets/{dist-BO5c5n_b.js → dist-DkPPv0FB.js} +1 -1
  75. package/dist/assets/{dist-DkCO0b-0.js → dist-DmGtPaVM.js} +1 -1
  76. package/dist/assets/{dist-CXmhxecl.js → dist-DnxYYyU7.js} +1 -1
  77. package/dist/assets/{dist-CO1Hfv5H.js → dist-Dw9YRsCU.js} +1 -1
  78. package/dist/assets/dist-Dwx3KdUP.js +1 -0
  79. package/dist/assets/{dist-BgL43w5r.js → dist-DzCQtGkt.js} +1 -1
  80. package/dist/assets/dist-JweaDt6P.js +1 -0
  81. package/dist/assets/{dist-Dbu5sPgR.js → dist-gELFCfHH.js} +1 -1
  82. package/dist/assets/dist-kGDJ0AWF.js +1 -0
  83. package/dist/assets/{dist-Cqm1W-Zm.js → dist-kaLvV_d4.js} +1 -1
  84. package/dist/assets/{dist-CEeRVpMD.js → dist-qvk3g06H.js} +1 -1
  85. package/dist/assets/dist-wCw2twuB.js +1 -0
  86. package/dist/assets/dist-wF42tUcr.js +1 -0
  87. package/dist/assets/dist-wY2yia-1.js +3 -0
  88. package/dist/assets/{documentation-panel-DvHjxlli.js → documentation-panel-CaJF7e-j.js} +1 -1
  89. package/dist/assets/{download-BP8MrprC.js → download-DMxOzI7b.js} +1 -1
  90. package/dist/assets/dropdown-menu-C40jM9o4.js +1 -0
  91. package/dist/assets/{edit-page-71cK-Nhe.js → edit-page-Vqd9NedM.js} +6 -6
  92. package/dist/assets/{error-banner-BYN8YUMe.js → error-banner-Dw5YY9wq.js} +1 -1
  93. package/dist/assets/{error-entries-DOZ1u97X.js → error-entries-Cv2m1yhc.js} +1 -1
  94. package/dist/assets/{error-panel-CINcf76Z.js → error-panel-Bhlvt6_H.js} +1 -1
  95. package/dist/assets/{es-BuMFDpR4.js → es-CrFhA96G.js} +1 -1
  96. package/dist/assets/{esm-Dw0vvSg2.js → esm-BHMOvJzM.js} +1 -1
  97. package/dist/assets/{esm-BGpfQNhD.js → esm-DmqQGMel.js} +1 -1
  98. package/dist/assets/file-explorer-panel-6HvNfCrJ.js +1 -0
  99. package/dist/assets/{file-icons-DgKj9mrV.js → file-icons-DdGYuADJ.js} +1 -1
  100. package/dist/assets/file-name-input-K4MKESI_.js +3 -0
  101. package/dist/assets/{floating-outline-CRXIsrPm.js → floating-outline-DaUHnl_e.js} +1 -1
  102. package/dist/assets/{formats-DSzGCKeO.js → formats-C6s96nu2.js} +1 -1
  103. package/dist/assets/{formatting-BJlT1s_3.js → formatting-BWZH2nBg.js} +1 -1
  104. package/dist/assets/{fullscreen-0EEPR7uc.js → fullscreen-BH2jz-F4.js} +5 -5
  105. package/dist/assets/{gallery-page-TqnFYECu.js → gallery-page-C3pBpHlY.js} +1 -1
  106. package/dist/assets/{glide-data-editor-DcY3nXI8.js → glide-data-editor-sICUMEhk.js} +1 -1
  107. package/dist/assets/{glide-utils-CR1sWLZU.js → glide-utils-UGsrRHYj.js} +1 -1
  108. package/dist/assets/home-page-BLd6rnbk.js +4 -0
  109. package/dist/assets/{html-to-image-DMn_7CCA.js → html-to-image-D6GUC5q6.js} +1 -1
  110. package/dist/assets/index-BGT7have.css +2 -0
  111. package/dist/assets/index-ipFYAeCF.js +29 -0
  112. package/dist/assets/{input-Daz6sk8l.js → input-DEbY281O.js} +2 -2
  113. package/dist/assets/{kiosk-mode-CzGt3mc2.js → kiosk-mode-mxgb5lWf.js} +1 -1
  114. package/dist/assets/{layout-KJMQADEj.js → layout-DWnrxIo2.js} +5 -5
  115. package/dist/assets/links-DLvOXyO_.js +1 -0
  116. package/dist/assets/{logs-panel-DFibPeCT.js → logs-panel-BGS2v3ba.js} +1 -1
  117. package/dist/assets/lua-1tNpM92n.js +1 -0
  118. package/dist/assets/{lua-CRIS5afH.js → lua-DXBxhmso.js} +1 -1
  119. package/dist/assets/{markdown-renderer-CdZX2MvM.js → markdown-renderer-BZKlbm2Q.js} +1 -1
  120. package/dist/assets/menu-items-BSRA2YI9.js +1 -0
  121. package/dist/assets/{mermaid-CeseGGnS.js → mermaid-l6lQkCib.js} +1 -1
  122. package/dist/assets/{name-cell-input-B-d5Jwh4.js → name-cell-input-BMCdK-el.js} +1 -1
  123. package/dist/assets/{numbers-DKurV_vq.js → numbers-Bc-r3jsC.js} +1 -1
  124. package/dist/assets/{outline-panel-D2Wk10hY.js → outline-panel-Dr5u73V6.js} +1 -1
  125. package/dist/assets/{packages-panel-CQsbxIlG.js → packages-panel-BdpRg9tX.js} +1 -1
  126. package/dist/assets/{pair-with-agent-modal-CNxmIMFM.js → pair-with-agent-modal-CbUFKJHP.js} +1 -1
  127. package/dist/assets/{panel-accordion-state-D6-FMXE2.js → panel-accordion-state-DjUTN7i5.js} +1 -1
  128. package/dist/assets/{panels-BgcK_4M7.js → panels-CWn0Yh1D.js} +1 -1
  129. package/dist/assets/process-output-Ck7-P_xp.js +1 -0
  130. package/dist/assets/{readonly-code-display-BvqLeUsJ.js → readonly-code-display--S2daDa6.js} +1 -1
  131. package/dist/assets/{readonly-python-code-GSN4D4sb.js → readonly-python-code-DpIyjHqY.js} +1 -1
  132. package/dist/assets/{renderShortcut-DK_OucLT.js → renderShortcut-X-CJUSM8.js} +1 -1
  133. package/dist/assets/{reveal-component-u9ED2diI.js → reveal-component-nZIAapoD.js} +1 -1
  134. package/dist/assets/{run-page-U5iuhyz8.js → run-page-9pl8qhQR.js} +1 -1
  135. package/dist/assets/{runs-BQTlv6Ja.js → runs-euHSzlw_.js} +1 -1
  136. package/dist/assets/{scratchpad-panel--YOR0kUB.js → scratchpad-panel-BleGt2KM.js} +1 -1
  137. package/dist/assets/{scroll-to-bottom-button-xua0e9rA.js → scroll-to-bottom-button-DufiYUD7.js} +1 -1
  138. package/dist/assets/{secrets-panel-CZPbFAZH.js → secrets-panel-D3BpDIgg.js} +1 -1
  139. package/dist/assets/select-nLt2y0Sw.js +1 -0
  140. package/dist/assets/{session-CEdta5_Q.js → session-Sz5nSFku.js} +1 -1
  141. package/dist/assets/session-panel-DRGPlL5J.js +1 -0
  142. package/dist/assets/{share-C2MPy_VX.js → share-CPtBiNgr.js} +1 -1
  143. package/dist/assets/{skeleton-CsceCAjw.js → skeleton-BKeh8hf3.js} +1 -1
  144. package/dist/assets/{snippets-panel-BxwHsPmW.js → snippets-panel-D5yy7kj0.js} +1 -1
  145. package/dist/assets/{spec-CUFquO6R.js → spec-DKsAmLTi.js} +1 -1
  146. package/dist/assets/{state-BqrF--O0.js → state-B6AklCzD.js} +1 -1
  147. package/dist/assets/{state-C2c3_VuY.js → state-B8XRqyFg.js} +1 -1
  148. package/dist/assets/{state-CHplO0zn.js → state-Di9TbuV9.js} +1 -1
  149. package/dist/assets/{strings-CpYReX2Q.js → strings-CReV1AYG.js} +1 -1
  150. package/dist/assets/{swiper-component-Bot7ehYH.js → swiper-component-5Kdi1-Gn.js} +1 -1
  151. package/dist/assets/{switch-CtH5Ct94.js → switch-DjXr9Y9D.js} +1 -1
  152. package/dist/assets/{tabs-c6mpccpH.js → tabs-Cy1qXLzH.js} +1 -1
  153. package/dist/assets/{terminal-C73iz1fU.js → terminal-CQAFGBfN.js} +1 -1
  154. package/dist/assets/{tooltip-Cwltdez8.js → tooltip-BG35uS_N.js} +1 -1
  155. package/dist/assets/{tooltip-D7dq6bnc.js → tooltip-BUtPzKB4.js} +1 -1
  156. package/dist/assets/{tracing-Dhq121dR.js → tracing-DNk3gmWv.js} +1 -1
  157. package/dist/assets/{tracing-panel-IKt1933_.js → tracing-panel-Yqazr6w_.js} +2 -2
  158. package/dist/assets/{tree-actions-DIfWonCA.js → tree-actions-CG5g7aUQ.js} +1 -1
  159. package/dist/assets/{useAddCell-BYrVaYfZ.js → useAddCell-DdB_uBif.js} +1 -1
  160. package/dist/assets/{useBoolean-ZU5StAbr.js → useBoolean-BXC4CItZ.js} +1 -1
  161. package/dist/assets/{useCellActionButton-DbXDs0MA.js → useCellActionButton-B31neI3m.js} +1 -1
  162. package/dist/assets/{useDebounce-Dulm61-t.js → useDebounce-DgpSQhrP.js} +1 -1
  163. package/dist/assets/{useDeleteCell-Wgcl3CRG.js → useDeleteCell-Bz49_cFj.js} +1 -1
  164. package/dist/assets/{useDependencyPanelTab-C5AU8GKL.js → useDependencyPanelTab-C_ps0r--.js} +1 -1
  165. package/dist/assets/{useEventListener-D27Dii_l.js → useEventListener-92uWqz-P.js} +1 -1
  166. package/dist/assets/{useIframeCapabilities-DEpTCh1Q.js → useIframeCapabilities-C7Di8f2y.js} +1 -1
  167. package/dist/assets/{useInstallPackage-u7d0wo79.js → useInstallPackage-DsD08SLK.js} +1 -1
  168. package/dist/assets/{useInterval-B1_J4wdT.js → useInterval-B4v7_zd0.js} +1 -1
  169. package/dist/assets/{useNotebookActions-FuMERtHq.js → useNotebookActions-CQtbk9CB.js} +2 -2
  170. package/dist/assets/{useRunCells-DTdMRbkE.js → useRunCells-CX7oW5zy.js} +1 -1
  171. package/dist/assets/{useSplitCell-2z0zEB8X.js → useSplitCell-Dy2_DmJR.js} +1 -1
  172. package/dist/assets/{useTheme-CF-zG9YH.js → useTheme-C-ri8BtY.js} +1 -1
  173. package/dist/assets/utils-D5Ywm7-q.js +1 -0
  174. package/dist/assets/{vega-component-BSXJcTJb.js → vega-component-C7TCzyaU.js} +1 -1
  175. package/dist/assets/write-secret-modal-D6zoZgLY.js +2 -0
  176. package/dist/index.html +73 -73
  177. package/package.json +26 -26
  178. package/src/components/ai/ai-provider-icon.tsx +2 -2
  179. package/src/components/ai/ai-utils.ts +1 -1
  180. package/src/components/app-config/ai-config.tsx +33 -37
  181. package/src/components/app-config/user-config-form.tsx +1 -1
  182. package/src/components/data-table/__tests__/column-explorer.test.tsx +64 -4
  183. package/src/components/data-table/__tests__/column-visibility-dropdown.test.tsx +137 -4
  184. package/src/components/data-table/__tests__/url-detector.test.tsx +1 -1
  185. package/src/components/data-table/__tests__/useColumnVisibility.test.ts +153 -1
  186. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +54 -25
  187. package/src/components/data-table/column-visibility-dropdown.tsx +62 -14
  188. package/src/components/data-table/date-popover.tsx +2 -1
  189. package/src/components/data-table/hooks/use-column-visibility.ts +76 -0
  190. package/src/components/data-table/renderers.tsx +4 -8
  191. package/src/components/data-table/show-only-column-button.tsx +58 -0
  192. package/src/components/dependency-graph/__tests__/elements.test.ts +151 -0
  193. package/src/components/dependency-graph/custom-edge.tsx +68 -0
  194. package/src/components/dependency-graph/custom-node.tsx +54 -26
  195. package/src/components/dependency-graph/dependency-graph-tree.tsx +110 -21
  196. package/src/components/dependency-graph/elements.ts +225 -31
  197. package/src/components/dependency-graph/panels.tsx +23 -2
  198. package/src/components/dependency-graph/utils/__tests__/layout.test.ts +78 -0
  199. package/src/components/dependency-graph/utils/layout.ts +108 -18
  200. package/src/components/editor/Output.tsx +40 -0
  201. package/src/components/editor/__tests__/Output.test.tsx +85 -2
  202. package/src/components/editor/connections/secret-combobox.tsx +3 -1
  203. package/src/components/editor/file-tree/__tests__/file-explorer-navigation.test.tsx +832 -0
  204. package/src/components/editor/file-tree/__tests__/file-viewer.test.tsx +27 -0
  205. package/src/components/editor/file-tree/__tests__/requesting-tree.test.ts +130 -0
  206. package/src/components/editor/file-tree/file-browser-row.tsx +82 -0
  207. package/src/components/editor/file-tree/file-explorer.tsx +377 -159
  208. package/src/components/editor/file-tree/file-operations.tsx +1 -1
  209. package/src/components/editor/file-tree/file-search-results.tsx +142 -0
  210. package/src/components/editor/file-tree/file-tree-row.tsx +40 -0
  211. package/src/components/editor/file-tree/file-viewer.tsx +2 -1
  212. package/src/components/editor/file-tree/renderers.tsx +4 -2
  213. package/src/components/editor/file-tree/requesting-tree.tsx +162 -32
  214. package/src/components/editor/file-tree/use-file-search.ts +142 -0
  215. package/src/components/editor/file-tree/use-hover-expand.ts +34 -0
  216. package/src/components/editor/navigation/__tests__/navigation.test.ts +30 -0
  217. package/src/components/editor/navigation/navigation.ts +20 -0
  218. package/src/components/forms/form.tsx +6 -4
  219. package/src/components/home/components.tsx +1 -0
  220. package/src/components/static-html/share-modal.tsx +3 -2
  221. package/src/components/ui/__tests__/badge.test.ts +63 -0
  222. package/src/components/ui/__tests__/button.test.ts +19 -0
  223. package/src/components/ui/__tests__/fullscreen.test.tsx +88 -0
  224. package/src/components/ui/__tests__/menu-items.test.ts +31 -0
  225. package/src/components/ui/badge.tsx +9 -7
  226. package/src/components/ui/button.tsx +1 -0
  227. package/src/components/ui/combobox.tsx +1 -1
  228. package/src/components/ui/date-input.tsx +1 -1
  229. package/src/components/ui/dialog.tsx +3 -1
  230. package/src/components/ui/fullscreen.tsx +43 -1
  231. package/src/components/ui/input.tsx +5 -1
  232. package/src/components/ui/links.tsx +2 -1
  233. package/src/components/ui/menu-items.tsx +9 -9
  234. package/src/components/ui/native-select.tsx +2 -2
  235. package/src/components/ui/navigation.tsx +1 -1
  236. package/src/components/ui/range-slider.tsx +5 -3
  237. package/src/components/ui/select.tsx +1 -1
  238. package/src/components/ui/sheet.tsx +1 -1
  239. package/src/components/ui/toast.tsx +8 -5
  240. package/src/components/ui/toaster.tsx +2 -2
  241. package/src/core/ai/ids/__tests__/ids.test.ts +0 -8
  242. package/src/core/ai/ids/ids.ts +1 -1
  243. package/src/core/cells/__tests__/add-missing-import.test.ts +20 -0
  244. package/src/core/codemirror/language/__tests__/utils.test.ts +1 -1
  245. package/src/core/config/config-schema.ts +1 -0
  246. package/src/core/hotkeys/hotkeys.ts +5 -0
  247. package/src/core/network/__tests__/requests-toasting.test.tsx +14 -0
  248. package/src/core/network/requests-toasting.tsx +1 -1
  249. package/src/css/globals.css +28 -0
  250. package/src/hooks/useEventListener.ts +1 -1
  251. package/src/plugins/core/RenderHTML.tsx +6 -4
  252. package/src/plugins/impl/MatrixPlugin.tsx +1 -1
  253. package/src/plugins/impl/code/any-language-editor.tsx +7 -4
  254. package/src/plugins/impl/data-frames/__tests__/schema.test.ts +34 -1
  255. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +25 -25
  256. package/src/plugins/impl/data-frames/schema.ts +5 -11
  257. package/src/plugins/impl/panel/__tests__/utils.test.ts +4 -4
  258. package/src/plugins/impl/vega/__tests__/vega.test.ts +1 -1
  259. package/src/stories/cell.stories.tsx +15 -11
  260. package/src/utils/__tests__/events.test.ts +1 -1
  261. package/dist/assets/JsonOutput-CRLQQVKf.js +0 -50
  262. package/dist/assets/RenderHTML-YkwVPe9V.js +0 -1
  263. package/dist/assets/ai-model-dropdown-CrSrb8Zz.js +0 -3
  264. package/dist/assets/alert-dialog-BVi_GyOB.js +0 -11
  265. package/dist/assets/any-language-editor-BL8H-DwB.js +0 -1
  266. package/dist/assets/badge-D_-uqy2N.js +0 -1
  267. package/dist/assets/button-Btj6GXNy.js +0 -1
  268. package/dist/assets/config-ycxJQP2b.js +0 -1
  269. package/dist/assets/dependency-graph-panel-Dg-tUB9T.js +0 -5
  270. package/dist/assets/dist-2oRmY-BC.js +0 -1
  271. package/dist/assets/dist-8lhGoJ54.js +0 -3
  272. package/dist/assets/dist-B4QaGCvF.js +0 -1
  273. package/dist/assets/dist-B_ABJVTW.js +0 -1
  274. package/dist/assets/dist-Bke0Ybxy.js +0 -1
  275. package/dist/assets/dist-Bw8CAY5i.js +0 -1
  276. package/dist/assets/dist-BwmO3SSk.js +0 -1
  277. package/dist/assets/dist-C3KxgR0m.js +0 -1
  278. package/dist/assets/dist-CLE562nZ.js +0 -1
  279. package/dist/assets/dist-CLi0j3bw.js +0 -1
  280. package/dist/assets/dist-CMIyXejt.js +0 -1
  281. package/dist/assets/dist-CbQrIaPV.js +0 -2
  282. package/dist/assets/dist-CpgfIIzU.js +0 -1
  283. package/dist/assets/dist-D7aYPqs9.js +0 -1
  284. package/dist/assets/dist-DKCF5R0T.js +0 -1
  285. package/dist/assets/dist-DbFa9cik.js +0 -1
  286. package/dist/assets/dist-DdPuhs_-.js +0 -1
  287. package/dist/assets/dist-DkfdZExz.js +0 -1
  288. package/dist/assets/dist-hOh6JBwi.js +0 -1
  289. package/dist/assets/dist-mY1j_5eA.js +0 -1
  290. package/dist/assets/dist-tg3aVnpD.js +0 -1
  291. package/dist/assets/dropdown-menu-CqNabM1f.js +0 -1
  292. package/dist/assets/file-explorer-panel-cflxW8a7.js +0 -1
  293. package/dist/assets/file-name-input-CQF4Ovwx.js +0 -3
  294. package/dist/assets/home-page-DPRHPAQM.js +0 -4
  295. package/dist/assets/index-BkIXRAbi.css +0 -2
  296. package/dist/assets/index-p49fbIlR.js +0 -29
  297. package/dist/assets/links-DPh7yoP-.js +0 -1
  298. package/dist/assets/lua-_4wuYo1j.js +0 -1
  299. package/dist/assets/menu-items-BSVrMleU.js +0 -1
  300. package/dist/assets/process-output-DvTtgoMs.js +0 -1
  301. package/dist/assets/select-czJLm6jf.js +0 -1
  302. package/dist/assets/session-panel-C_N3WGWQ.js +0 -1
  303. package/dist/assets/utils-CWSZQEjr.js +0 -1
  304. package/dist/assets/write-secret-modal-lNU_7c2x.js +0 -2
@@ -12,6 +12,7 @@ import { MockRequestClient } from "@/__mocks__/requests";
12
12
  import { aiCompletionCellAtom } from "@/core/ai/state";
13
13
  import type { CellActions } from "@/core/cells/cells";
14
14
  import { notebookAtom } from "@/core/cells/cells";
15
+ import { LanguageAdapters } from "@/core/codemirror/language/LanguageAdapters";
15
16
  import { signatureHintField } from "@/core/codemirror/completion/signature-hint";
16
17
  import {
17
18
  configOverridesAtom,
@@ -20,6 +21,8 @@ import {
20
21
  } from "@/core/config/config";
21
22
  import { requestClientAtom } from "@/core/network/requests";
22
23
  import { store } from "@/core/state/jotai";
24
+ import { variablesAtom } from "@/core/variables/state";
25
+ import type { Variables } from "@/core/variables/types";
23
26
  import type { CellActionsDropdownHandle } from "../../cell/cell-actions";
24
27
  import {
25
28
  useCellEditorNavigationProps,
@@ -421,6 +424,33 @@ describe("useCellNavigationProps", () => {
421
424
  });
422
425
  });
423
426
 
427
+ it("should add an import before and a SQL cell after when 'q' is pressed", () => {
428
+ store.set(variablesAtom, {} as Variables);
429
+
430
+ const { result } = renderWithProvider(() =>
431
+ useCellNavigationProps(mockCellId, options),
432
+ );
433
+
434
+ act(() => {
435
+ result.current.onKeyDown?.(Mocks.keyboardEvent({ key: "q" }));
436
+ });
437
+
438
+ expect(mockCellActions.createNewCell).toHaveBeenNthCalledWith(
439
+ 1,
440
+ expect.objectContaining({
441
+ cellId: mockCellId,
442
+ before: true,
443
+ code: "import marimo as mo",
444
+ }),
445
+ );
446
+ expect(mockCellActions.createNewCell).toHaveBeenNthCalledWith(2, {
447
+ cellId: mockCellId,
448
+ before: false,
449
+ autoFocus: true,
450
+ code: LanguageAdapters.sql.defaultCode,
451
+ });
452
+ });
453
+
424
454
  it("should move to top cell when Cmd+ArrowUp is pressed (or Ctrl)", () => {
425
455
  const { result } = renderWithProvider(() =>
426
456
  useCellNavigationProps(mockCellId, options),
@@ -12,6 +12,7 @@ import { useMemo } from "react";
12
12
  import { mergeProps, useFocusWithin, useKeyboard } from "react-aria";
13
13
  import { DATA_FOR_CELL_ID } from "@/components/data-table/cell-utils";
14
14
  import { aiCompletionCellAtom } from "@/core/ai/state";
15
+ import { maybeAddMarimoImport } from "@/core/cells/add-missing-import";
15
16
  import { cellIdsAtom, notebookAtom, useCellActions } from "@/core/cells/cells";
16
17
  import { useCellFocusActions } from "@/core/cells/focus";
17
18
  import type { CellId } from "@/core/cells/ids";
@@ -26,6 +27,7 @@ import {
26
27
  closeSignatureHint,
27
28
  signatureHintField,
28
29
  } from "@/core/codemirror/completion/signature-hint";
30
+ import { LanguageAdapters } from "@/core/codemirror/language/LanguageAdapters";
29
31
  import {
30
32
  hotkeysAtom,
31
33
  isAiFeatureEnabled,
@@ -551,6 +553,24 @@ export function useCellNavigationProps(
551
553
  actions.createNewCell({ cellId, before: false, autoFocus: true });
552
554
  return true;
553
555
  },
556
+ "command.createSqlCellAfter": (cellId) => {
557
+ if (Events.hasModifier(evt)) {
558
+ return false;
559
+ }
560
+ maybeAddMarimoImport({
561
+ autoInstantiate: true,
562
+ createNewCell: actions.createNewCell,
563
+ fromCellId: cellId,
564
+ before: true,
565
+ });
566
+ actions.createNewCell({
567
+ cellId,
568
+ before: false,
569
+ autoFocus: true,
570
+ code: LanguageAdapters.sql.defaultCode,
571
+ });
572
+ return true;
573
+ },
554
574
  "cell.delete": () => {
555
575
  // Only handle if destructive_delete is enabled
556
576
  if (!userConfig.keymap.destructive_delete) {
@@ -60,15 +60,17 @@ interface Props<T extends FieldValues> {
60
60
  form: UseFormReturn<T>;
61
61
  schema: z.ZodType;
62
62
  path?: Path<T>;
63
- renderers: FormRenderer<T>[] | undefined;
63
+ renderers: readonly FormRenderer<T>[] | undefined;
64
64
  children?: React.ReactNode;
65
65
  }
66
66
 
67
+ const EMPTY_RENDERERS: readonly never[] = [];
68
+
67
69
  export const ZodForm = <T extends FieldValues>({
68
70
  schema,
69
71
  form,
70
72
  path = "" as Path<T>,
71
- renderers = [],
73
+ renderers = EMPTY_RENDERERS,
72
74
  children,
73
75
  }: Props<T>) => {
74
76
  return (
@@ -83,7 +85,7 @@ export interface RenderZodSchemaOptions<T extends FieldValues, S> {
83
85
  schema: z.ZodType<S>;
84
86
  form: UseFormReturn<T>;
85
87
  path: Path<T>;
86
- renderers: FormRenderer<T>[];
88
+ renderers: readonly FormRenderer<T>[];
87
89
  }
88
90
 
89
91
  export function renderZodSchema<T extends FieldValues, S>({
@@ -516,7 +518,7 @@ const FormArray = ({
516
518
  schema: z.ZodType;
517
519
  form: UseFormReturn<any>;
518
520
  path: Path<any>;
519
- renderers: FormRenderer[];
521
+ renderers: readonly FormRenderer[];
520
522
  minLength?: number;
521
523
  }) => {
522
524
  const { label, description } = FieldOptions.parse(schema.description || "");
@@ -169,6 +169,7 @@ export const ResourceLinks: React.FC = () => {
169
169
  key={resource.title}
170
170
  href={resource.url}
171
171
  target="_blank"
172
+ aria-label={`${resource.title}: ${resource.description}`}
172
173
  className="flex items-start gap-3 py-3 px-3 rounded-lg border hover:bg-accent/20 transition-colors shadow-xs"
173
174
  >
174
175
  <resource.icon className="w-5 h-5 mt-1.5 text-primary" />
@@ -21,13 +21,14 @@ import { Input } from "../ui/input";
21
21
  import { Tooltip } from "../ui/tooltip";
22
22
 
23
23
  const BASE_URL = "https://static.marimo.app";
24
-
25
24
  export const ShareStaticNotebookModal: React.FC<{
26
25
  onClose: () => void;
27
26
  }> = ({ onClose }) => {
28
27
  const [slug, setSlug] = useState("");
29
28
  const { exportAsHTML } = useRequestClient();
30
- // 4 character random string
29
+
30
+ // Keep one random suffix for the lifetime of the modal.
31
+ // oxlint-disable-next-line react/purity
31
32
  const randomHash = useMemo(() => Math.random().toString(36).slice(2, 6), []);
32
33
 
33
34
  // Globally unique path
@@ -0,0 +1,63 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { describe, expect, it } from "vitest";
4
+ import { badgeVariants } from "../badge";
5
+
6
+ describe("badgeVariants", () => {
7
+ it.each([
8
+ {
9
+ variant: "default" as const,
10
+ expected: [
11
+ "forced-colors:bg-[Highlight]",
12
+ "forced-colors:border-[Highlight]",
13
+ "forced-colors:text-[HighlightText]",
14
+ "forced-colors:hover:bg-[Highlight]",
15
+ "forced-colors:hover:text-[HighlightText]",
16
+ ],
17
+ },
18
+ {
19
+ variant: "defaultOutline" as const,
20
+ expected: [
21
+ "forced-colors:bg-[Canvas]",
22
+ "forced-colors:border-[Highlight]",
23
+ "forced-colors:text-[CanvasText]",
24
+ ],
25
+ },
26
+ {
27
+ variant: "secondary" as const,
28
+ expected: [
29
+ "forced-colors:bg-[ButtonFace]",
30
+ "forced-colors:border-[ButtonText]",
31
+ "forced-colors:text-[ButtonText]",
32
+ "forced-colors:hover:bg-[Highlight]",
33
+ "forced-colors:hover:text-[HighlightText]",
34
+ ],
35
+ },
36
+ ])("uses system colors for $variant", ({ variant, expected }) => {
37
+ const classes = badgeVariants({ variant });
38
+
39
+ expect(classes).toEqual(expect.stringContaining(expected.join(" ")));
40
+ expect(classes).toContain("forced-color-adjust-none");
41
+ });
42
+
43
+ it.each(["destructive", "success", "outline"] as const)(
44
+ "keeps the %s variant visible without semantic colors",
45
+ (variant) => {
46
+ const classes = badgeVariants({ variant });
47
+
48
+ expect(classes).toEqual(
49
+ expect.stringContaining(
50
+ [
51
+ "forced-colors:bg-[Canvas]",
52
+ "forced-colors:border-[ButtonText]",
53
+ "forced-colors:text-[CanvasText]",
54
+ ].join(" "),
55
+ ),
56
+ );
57
+ if (variant !== "outline") {
58
+ expect(classes).toContain("forced-colors:hover:bg-[Highlight]");
59
+ expect(classes).toContain("forced-colors:hover:text-[HighlightText]");
60
+ }
61
+ },
62
+ );
63
+ });
@@ -39,4 +39,23 @@ describe("buttonVariants", () => {
39
39
  expect(classes).not.toMatch(/--(?:red|grass|yellow)-/);
40
40
  expect(classes).not.toContain("dark:");
41
41
  });
42
+
43
+ it("uses system colors in forced-color mode", () => {
44
+ const classes = buttonVariants({ variant: "default" });
45
+
46
+ expect(classes).toEqual(
47
+ expect.stringContaining(
48
+ [
49
+ "forced-color-adjust-none",
50
+ "forced-colors:border-[ButtonText]",
51
+ "forced-colors:bg-[ButtonFace]",
52
+ "forced-colors:text-[ButtonText]",
53
+ "forced-colors:hover:bg-[Highlight]",
54
+ "forced-colors:hover:text-[HighlightText]",
55
+ "forced-colors:disabled:border-[GrayText]",
56
+ "forced-colors:disabled:text-[GrayText]",
57
+ ].join(" "),
58
+ ),
59
+ );
60
+ });
42
61
  });
@@ -0,0 +1,88 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+ import { act, render } from "@testing-library/react";
3
+ import { useRef } from "react";
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
+ import { useIsFullScreen } from "../fullscreen";
6
+
7
+ const FullScreenFlag = ({ label }: { label: string }) => {
8
+ const ref = useRef<HTMLDivElement>(null);
9
+ const isFullScreen = useIsFullScreen(ref);
10
+
11
+ return (
12
+ <div ref={ref} data-testid={label}>
13
+ {String(isFullScreen)}
14
+ </div>
15
+ );
16
+ };
17
+
18
+ describe("useIsFullScreen", () => {
19
+ let fullscreenElement: Element | null = null;
20
+
21
+ beforeEach(() => {
22
+ fullscreenElement = null;
23
+ Object.defineProperty(document, "fullscreenElement", {
24
+ configurable: true,
25
+ get: () => fullscreenElement,
26
+ });
27
+ });
28
+
29
+ afterEach(() => {
30
+ Reflect.deleteProperty(document, "fullscreenElement");
31
+ });
32
+
33
+ const countFullScreenListeners = (calls: unknown[][]) =>
34
+ calls.filter((call) => call[0] === "fullscreenchange").length;
35
+
36
+ it("adds one document listener for many subscribers", () => {
37
+ const addEventListener = vi.spyOn(document, "addEventListener");
38
+
39
+ render(
40
+ <>
41
+ <FullScreenFlag label="first" />
42
+ <FullScreenFlag label="second" />
43
+ <FullScreenFlag label="third" />
44
+ </>,
45
+ );
46
+
47
+ expect(countFullScreenListeners(addEventListener.mock.calls)).toBe(1);
48
+ addEventListener.mockRestore();
49
+ });
50
+
51
+ it("removes the listener when the last subscriber unmounts", () => {
52
+ const removeEventListener = vi.spyOn(document, "removeEventListener");
53
+
54
+ const { unmount } = render(
55
+ <>
56
+ <FullScreenFlag label="first" />
57
+ <FullScreenFlag label="second" />
58
+ </>,
59
+ );
60
+
61
+ expect(countFullScreenListeners(removeEventListener.mock.calls)).toBe(0);
62
+
63
+ unmount();
64
+
65
+ expect(countFullScreenListeners(removeEventListener.mock.calls)).toBe(1);
66
+ removeEventListener.mockRestore();
67
+ });
68
+
69
+ it("reports true for the full screen element only", () => {
70
+ const { getByTestId } = render(
71
+ <>
72
+ <FullScreenFlag label="first" />
73
+ <FullScreenFlag label="second" />
74
+ </>,
75
+ );
76
+
77
+ expect(getByTestId("first")).toHaveTextContent("false");
78
+ expect(getByTestId("second")).toHaveTextContent("false");
79
+
80
+ fullscreenElement = getByTestId("second");
81
+ act(() => {
82
+ document.dispatchEvent(new Event("fullscreenchange"));
83
+ });
84
+
85
+ expect(getByTestId("first")).toHaveTextContent("false");
86
+ expect(getByTestId("second")).toHaveTextContent("true");
87
+ });
88
+ });
@@ -0,0 +1,31 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { describe, expect, it } from "vitest";
4
+ import {
5
+ menuControlVariants,
6
+ menuItemVariants,
7
+ menuSubTriggerVariants,
8
+ } from "../menu-items";
9
+
10
+ describe("menu item variants", () => {
11
+ it.each([
12
+ menuSubTriggerVariants(),
13
+ menuControlVariants(),
14
+ menuItemVariants(),
15
+ ])("styles Radix highlighted state", (classes) => {
16
+ expect(classes).toContain("data-[highlighted]:bg-accent");
17
+ expect(classes).toContain(
18
+ "forced-colors:data-[highlighted]:bg-[Highlight]",
19
+ );
20
+ expect(classes).toContain(
21
+ "forced-colors:data-[highlighted]:text-[HighlightText]",
22
+ );
23
+ });
24
+
25
+ it("keeps the command item selected state", () => {
26
+ const classes = menuItemVariants();
27
+
28
+ expect(classes).toContain("aria-selected:bg-accent");
29
+ expect(classes).toContain("forced-colors:aria-selected:bg-[Highlight]");
30
+ });
31
+ });
@@ -6,20 +6,22 @@ import * as React from "react";
6
6
  import { cn } from "@/utils/cn";
7
7
 
8
8
  const badgeVariants = cva(
9
- "inline-flex items-center border rounded-full px-2 py-0.5 text-xs font-semibold transition-colors focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2",
9
+ "inline-flex items-center border rounded-full px-2 py-0.5 text-xs font-semibold transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 forced-color-adjust-none",
10
10
  {
11
11
  variants: {
12
12
  variant: {
13
13
  default:
14
- "bg-primary hover:bg-primary/60 border-transparent text-primary-foreground",
15
- defaultOutline: "bg-(--blue-2) border-(--blue-8) text-(--blue-11)",
14
+ "bg-primary hover:bg-primary/60 border-transparent text-primary-foreground forced-colors:bg-[Highlight] forced-colors:border-[Highlight] forced-colors:text-[HighlightText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText]",
15
+ defaultOutline:
16
+ "bg-(--blue-2) border-(--blue-8) text-(--blue-11) forced-colors:bg-[Canvas] forced-colors:border-[Highlight] forced-colors:text-[CanvasText]",
16
17
  secondary:
17
- "bg-secondary hover:bg-secondary/80 border-transparent text-secondary-foreground",
18
+ "bg-secondary hover:bg-secondary/80 border-transparent text-secondary-foreground forced-colors:bg-[ButtonFace] forced-colors:border-[ButtonText] forced-colors:text-[ButtonText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText]",
18
19
  destructive:
19
- "bg-(--red-2) border-(--red-6) text-(--red-9) hover:bg-(--red-3)",
20
+ "bg-(--red-2) border-(--red-6) text-(--red-9) hover:bg-(--red-3) forced-colors:bg-[Canvas] forced-colors:border-[ButtonText] forced-colors:text-[CanvasText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText]",
20
21
  success:
21
- "bg-(--grass-2) border-(--grass-5) text-(--grass-9) hover:bg-(--grass-3)",
22
- outline: "text-foreground",
22
+ "bg-(--grass-2) border-(--grass-5) text-(--grass-9) hover:bg-(--grass-3) forced-colors:bg-[Canvas] forced-colors:border-[ButtonText] forced-colors:text-[CanvasText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText]",
23
+ outline:
24
+ "text-foreground forced-colors:bg-[Canvas] forced-colors:border-[ButtonText] forced-colors:text-[CanvasText]",
23
25
  },
24
26
  },
25
27
  defaultVariants: {
@@ -14,6 +14,7 @@ const buttonVariants = cva(
14
14
  cn(
15
15
  "disabled:opacity-50 disabled:pointer-events-none",
16
16
  "inline-flex items-center justify-center rounded-md text-sm font-medium focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 ring-offset-background",
17
+ "forced-color-adjust-none forced-colors:border-[ButtonText] forced-colors:bg-[ButtonFace] forced-colors:text-[ButtonText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText] forced-colors:disabled:border-[GrayText] forced-colors:disabled:text-[GrayText]",
17
18
  ),
18
19
  {
19
20
  variants: {
@@ -201,7 +201,7 @@ export const Combobox = <TValue,>({
201
201
  id={id}
202
202
  type="button"
203
203
  className={cn(
204
- "flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid",
204
+ "flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring focus-visible:border-primary focus-visible:shadow-md-solid",
205
205
  disabled && "cursor-not-allowed opacity-50",
206
206
  className,
207
207
  )}
@@ -29,7 +29,7 @@ const DateSegment = ({ className, ...props }: AriaDateSegmentProps) => {
29
29
  /* Disabled */
30
30
  "data-disabled:cursor-not-allowed data-disabled:opacity-50",
31
31
  /* Focused */
32
- "data-focused:bg-accent data-focused:text-accent-foreground focus:bg-accent focus:text-accent-foreground",
32
+ "data-focused:bg-accent data-focused:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground",
33
33
  /* Invalid */
34
34
  "data-invalid:data-focused:bg-destructive data-invalid:data-focused:data-placeholder:text-destructive-foreground data-invalid:data-focused:text-destructive-foreground data-invalid:data-placeholder:text-destructive data-invalid:text-destructive",
35
35
  className,
@@ -42,6 +42,7 @@ const DialogOverlay = React.forwardRef<
42
42
  ref={ref}
43
43
  className={cn(
44
44
  "fixed inset-0 z-50 bg-background/80 backdrop-blur-xs transition-all duration-100 data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=open]:fade-in",
45
+ "forced-color-adjust-none forced-colors:bg-[CanvasText] forced-colors:opacity-50",
45
46
  className,
46
47
  )}
47
48
  {...props}
@@ -63,13 +64,14 @@ const DialogContent = React.forwardRef<
63
64
  ref={ref}
64
65
  className={cn(
65
66
  "fixed z-50 grid w-full gap-4 rounded-b-lg border bg-background p-6 shadow-sm animate-in data-[state=open]:fade-in-90 data-[state=open]:slide-in-from-bottom-10 sm:max-w-2xl sm:mx-4 sm:rounded-lg sm:zoom-in-90 sm:data-[state=open]:slide-in-from-bottom-0",
67
+ "forced-color-adjust-none forced-colors:border-[CanvasText] forced-colors:bg-[Canvas] forced-colors:text-[CanvasText]",
66
68
  className,
67
69
  )}
68
70
  {...restoreFocus}
69
71
  {...props}
70
72
  >
71
73
  {children}
72
- <DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
74
+ <DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
73
75
  <X className="h-4 w-4" />
74
76
  <span className="sr-only">Close</span>
75
77
  </DialogPrimitive.Close>
@@ -4,7 +4,7 @@ import type { Popover } from "radix-ui";
4
4
 
5
5
  type PopoverContentProps = Popover.PopoverContentProps;
6
6
 
7
- import React, { useState } from "react";
7
+ import React, { type RefObject, useState, useSyncExternalStore } from "react";
8
8
  import { isInVscodeExtension } from "@/core/vscode/is-in-vscode";
9
9
  import { useEventListener } from "@/hooks/useEventListener";
10
10
 
@@ -27,6 +27,48 @@ export function useFullScreenElement() {
27
27
  return fullScreenElement;
28
28
  }
29
29
 
30
+ const fullScreenSubscribers = new Set<() => void>();
31
+
32
+ function notifyFullScreenSubscribers() {
33
+ for (const subscriber of fullScreenSubscribers) {
34
+ subscriber();
35
+ }
36
+ }
37
+
38
+ /**
39
+ * One document listener serves every subscriber, so the cost of a full screen
40
+ * transition does not grow with the number of mounted components.
41
+ */
42
+ function subscribeToFullScreen(onStoreChange: () => void) {
43
+ if (fullScreenSubscribers.size === 0) {
44
+ document.addEventListener("fullscreenchange", notifyFullScreenSubscribers);
45
+ }
46
+ fullScreenSubscribers.add(onStoreChange);
47
+
48
+ return () => {
49
+ fullScreenSubscribers.delete(onStoreChange);
50
+ if (fullScreenSubscribers.size === 0) {
51
+ document.removeEventListener(
52
+ "fullscreenchange",
53
+ notifyFullScreenSubscribers,
54
+ );
55
+ }
56
+ };
57
+ }
58
+
59
+ /**
60
+ * Whether the given element is the full screen element.
61
+ *
62
+ * The hook returns a boolean, so a component re-renders only when its own
63
+ * element enters or leaves full screen.
64
+ */
65
+ export function useIsFullScreen(ref: RefObject<Element | null>): boolean {
66
+ return useSyncExternalStore(subscribeToFullScreen, () => {
67
+ const fullScreenElement = document.fullscreenElement;
68
+ return fullScreenElement !== null && fullScreenElement === ref.current;
69
+ });
70
+ }
71
+
30
72
  /**
31
73
  * HOC wrapping a Portal component to use the
32
74
  * full screen element as the container if we are in full screen mode
@@ -17,6 +17,10 @@ export type InputProps = React.InputHTMLAttributes<HTMLInputElement> & {
17
17
  endAdornment?: React.ReactNode;
18
18
  };
19
19
 
20
+ const DEFAULT_SEARCH_ICON = (
21
+ <SearchIcon className="mr-2 h-4 w-4 shrink-0 opacity-50" />
22
+ );
23
+
20
24
  const Input = React.forwardRef<HTMLInputElement, InputProps>(
21
25
  ({ className, type, endAdornment, ...props }, ref) => {
22
26
  const icon = props.icon;
@@ -120,7 +124,7 @@ export const SearchInput = React.forwardRef<
120
124
  {
121
125
  className,
122
126
  rootClassName,
123
- icon = <SearchIcon className="mr-2 h-4 w-4 shrink-0 opacity-50" />,
127
+ icon = DEFAULT_SEARCH_ICON,
124
128
  clearable = true,
125
129
  ...props
126
130
  },
@@ -16,7 +16,8 @@ export const ExternalLink = ({
16
16
  | `https://links.marimo.app/${string}`
17
17
  | `https://wandb.ai/${string}`
18
18
  | `https://portal.azure.com/${string}`
19
- | `https://opencode.ai/${string}`;
19
+ | `https://opencode.ai/${string}`
20
+ | `https://pydantic.dev/${string}`;
20
21
  children: React.ReactNode;
21
22
  }) => {
22
23
  return (
@@ -5,7 +5,7 @@ import React from "react";
5
5
  import { cn } from "@/utils/cn";
6
6
 
7
7
  export const menuContentCommon = cva(
8
- "z-50 min-w-32 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md",
8
+ "z-50 min-w-32 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md forced-color-adjust-none forced-colors:border-[CanvasText] forced-colors:bg-[Canvas] forced-colors:text-[CanvasText]",
9
9
  {
10
10
  variants: {
11
11
  subcontent: {
@@ -16,7 +16,7 @@ export const menuContentCommon = cva(
16
16
  );
17
17
 
18
18
  export const menuSubTriggerVariants = cva(
19
- "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
19
+ "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground forced-color-adjust-none forced-colors:data-[highlighted]:bg-[Highlight] forced-colors:data-[highlighted]:text-[HighlightText] forced-colors:data-[state=open]:bg-[Highlight] forced-colors:data-[state=open]:text-[HighlightText]",
20
20
  {
21
21
  variants: {
22
22
  inset: {
@@ -27,11 +27,11 @@ export const menuSubTriggerVariants = cva(
27
27
  );
28
28
 
29
29
  export const MENU_ITEM_DISABLED =
30
- "data-disabled:pointer-events-none data-disabled:opacity-50";
30
+ "data-disabled:pointer-events-none data-disabled:opacity-50 forced-colors:data-disabled:text-[GrayText]";
31
31
 
32
32
  export const menuControlVariants = cva(
33
33
  cn(
34
- "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground",
34
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden transition-colors data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground forced-color-adjust-none forced-colors:data-[highlighted]:bg-[Highlight] forced-colors:data-[highlighted]:text-[HighlightText]",
35
35
  MENU_ITEM_DISABLED,
36
36
  ),
37
37
  { variants: {} },
@@ -54,7 +54,7 @@ export const menuLabelVariants = cva("px-2 py-1.5 text-sm font-semibold", {
54
54
 
55
55
  export const menuItemVariants = cva(
56
56
  cn(
57
- "menu-item relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden",
57
+ "menu-item relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden forced-color-adjust-none forced-colors:data-[highlighted]:bg-[Highlight] forced-colors:data-[highlighted]:text-[HighlightText] forced-colors:aria-selected:bg-[Highlight] forced-colors:aria-selected:text-[HighlightText]",
58
58
  MENU_ITEM_DISABLED,
59
59
  ),
60
60
  {
@@ -64,13 +64,13 @@ export const menuItemVariants = cva(
64
64
  },
65
65
  variant: {
66
66
  default:
67
- "focus:bg-accent focus:text-accent-foreground aria-selected:bg-accent aria-selected:text-accent-foreground",
67
+ "data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground aria-selected:bg-accent aria-selected:text-accent-foreground",
68
68
  danger:
69
- "focus:bg-(--red-5) focus:text-(--red-12) aria-selected:bg-(--red-5) aria-selected:text-(--red-12)",
69
+ "data-[highlighted]:bg-(--red-5) data-[highlighted]:text-(--red-12) aria-selected:bg-(--red-5) aria-selected:text-(--red-12)",
70
70
  muted:
71
- "focus:bg-muted/70 focus:text-muted-foreground aria-selected:bg-muted/70 aria-selected:text-muted-foreground",
71
+ "data-[highlighted]:bg-muted/70 data-[highlighted]:text-muted-foreground aria-selected:bg-muted/70 aria-selected:text-muted-foreground",
72
72
  success:
73
- "focus:bg-(--grass-3) focus:text-(--grass-11) aria-selected:bg-(--grass-3) aria-selected:text-(--grass-11)",
73
+ "data-[highlighted]:bg-(--grass-3) data-[highlighted]:text-(--grass-11) aria-selected:bg-(--grass-3) aria-selected:text-(--grass-11)",
74
74
  disabled: "text-muted-foreground",
75
75
  },
76
76
  },
@@ -6,12 +6,12 @@ import { cn } from "@/utils/cn";
6
6
  import { Events } from "@/utils/events";
7
7
 
8
8
  export const selectStyles = cva(
9
- "flex h-6 w-fit mb-1 items-center justify-between rounded-sm bg-background px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground focus:outline-hidden focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer",
9
+ "flex h-6 w-fit mb-1 items-center justify-between rounded-sm bg-background px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer forced-color-adjust-none forced-colors:bg-[ButtonFace] forced-colors:text-[ButtonText] forced-colors:disabled:text-[GrayText]",
10
10
  {
11
11
  variants: {
12
12
  variant: {
13
13
  default:
14
- "shadow-xs-solid border border-input hover:shadow-sm-solid focus:border-primary focus:shadow-md-solid disabled:hover:shadow-xs-solid",
14
+ "shadow-xs-solid border border-input hover:shadow-sm-solid focus-visible:border-primary focus-visible:shadow-md-solid disabled:hover:shadow-xs-solid forced-colors:border-[ButtonText] forced-colors:disabled:border-[GrayText]",
15
15
  ghost: "opacity-70 hover:opacity-100 focus:opacity-100",
16
16
  },
17
17
  },
@@ -56,7 +56,7 @@ NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName;
56
56
  const NavigationMenuItem = NavigationMenuPrimitive.Item;
57
57
 
58
58
  const navigationMenuTriggerStyle = cva(
59
- "group inline-flex rounded-md bg-background px-4 py-2 text-lg font-medium text-(--slate-12) transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-hidden disabled:pointer-events-none disabled:opacity-50 data-active:bg-accent/50 data-[state=open]:bg-accent/50",
59
+ "group inline-flex rounded-md bg-background px-4 py-2 text-lg font-medium text-(--slate-12) transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50 data-active:bg-accent/50 data-[state=open]:bg-accent/50",
60
60
  {
61
61
  variants: {
62
62
  orientation: {