@marimo-team/frontend 0.24.1-dev114 → 0.24.1-dev116
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.
- package/dist/assets/{CellStatus-DjaaE1KV.js → CellStatus-BnX3kFgK.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-BYgv4Vrx.js → ConnectedDataExplorerComponent-Slfh2UI3.js} +1 -1
- package/dist/assets/{ErrorBoundary-ClXmeuxA.js → ErrorBoundary-CDVGFYfr.js} +1 -1
- package/dist/assets/{JsonOutput-6STJL9Rn.js → JsonOutput-i6wa-ZZg.js} +10 -10
- package/dist/assets/{LazyAnyLanguageCodeMirror-BnkWE9wV.js → LazyAnyLanguageCodeMirror-LboTfNDv.js} +2 -2
- package/dist/assets/{MarimoErrorOutput-BTqTZeiu.js → MarimoErrorOutput-CIYHG601.js} +1 -1
- package/dist/assets/{RenderHTML-DUXIAUaj.js → RenderHTML-BIg2a2gf.js} +1 -1
- package/dist/assets/{RunButton-aYiWB8Ga.js → RunButton-z5x8Nygi.js} +1 -1
- package/dist/assets/{VisuallyHidden-dPzEOlg8.js → VisuallyHidden-K_kroCIL.js} +1 -1
- package/dist/assets/{add-cell-with-ai-l_Dax5pU.js → add-cell-with-ai-P7MBEjnv.js} +1 -1
- package/dist/assets/{add-connection-dialog-CpvZ5BqX.js → add-connection-dialog-B7yGNrvC.js} +1 -1
- package/dist/assets/{agent-panel-CbdAoVgG.js → agent-panel-DUUWyz59.js} +1 -1
- package/dist/assets/{ai-model-dropdown-jVyB16Bq.js → ai-model-dropdown-BN9nyr0_.js} +1 -1
- package/dist/assets/alert-dialog-CA-2mBs3.js +11 -0
- package/dist/assets/{any-language-editor-B6cFLupW.js → any-language-editor-DflLjPSQ.js} +1 -1
- package/dist/assets/{app-config-button-CHSwEEzP.js → app-config-button-vxdvoC0x.js} +1 -1
- package/dist/assets/badge-BSgtkC2e.js +1 -0
- package/dist/assets/{blob-CoYb7D0i.js → blob-DDxD75AS.js} +1 -1
- package/dist/assets/button-Dh8EwhsF.js +1 -0
- package/dist/assets/{cache-panel-mVo7M8xm.js → cache-panel-DqgtC98s.js} +1 -1
- package/dist/assets/{cell-editor-Bo1CBkuH.js → cell-editor-D6Cyy4UF.js} +1 -1
- package/dist/assets/{cell-link-CJvbR4gk.js → cell-link-B7DFi5Hf.js} +1 -1
- package/dist/assets/{cells-C3Vs2g0_.js → cells-CS_eEQ19.js} +4 -4
- package/dist/assets/{chat-display-CkS1h-qA.js → chat-display-CtnwRDHx.js} +1 -1
- package/dist/assets/{chat-panel-Bl8KhsjW.js → chat-panel-DScfSsWl.js} +1 -1
- package/dist/assets/{chat-ui-lhVS3XhN.js → chat-ui-9G115u_7.js} +1 -1
- package/dist/assets/{circle-BScTJE-Z.js → circle-ByJdIf5p.js} +1 -1
- package/dist/assets/{column-preview-CBydN0D3.js → column-preview-BVtft2uw.js} +1 -1
- package/dist/assets/{command-palette-D0yWoZzd.js → command-palette-uGrOQhzq.js} +1 -1
- package/dist/assets/{common-BANLqpaV.js → common-CQLiJ8JV.js} +1 -1
- package/dist/assets/{components-DC6fLfDw.js → components-B5BY9RR4.js} +1 -1
- package/dist/assets/config-CJhe6_P2.js +1 -0
- package/dist/assets/{copy-icon-zfaCsLjV.js → copy-icon-z8fuTE3w.js} +1 -1
- package/dist/assets/{datasource-DB4KqePX.js → datasource-Br61QFhd.js} +1 -1
- package/dist/assets/{dependency-graph-panel-D_rv_6mb.js → dependency-graph-panel-DoAAA7Y1.js} +1 -1
- package/dist/assets/{dist-ConG15vZ.js → dist-DzCQtGkt.js} +1 -1
- package/dist/assets/{documentation-panel-2myTueGx.js → documentation-panel-CYUIPHeO.js} +1 -1
- package/dist/assets/{download-VyhuV4Af.js → download-D2Ha98tp.js} +1 -1
- package/dist/assets/dropdown-menu-C40jM9o4.js +1 -0
- package/dist/assets/{edit-page-CIBvi-g9.js → edit-page-ClGPnVOK.js} +4 -4
- package/dist/assets/{error-banner-BsjSLKyr.js → error-banner-Dw5YY9wq.js} +1 -1
- package/dist/assets/{error-entries-DZjQ7yIb.js → error-entries-ooCnKQtX.js} +1 -1
- package/dist/assets/{error-panel-BpAXL0Jx.js → error-panel-CRtClD-k.js} +1 -1
- package/dist/assets/{es-DP79Qs0u.js → es-CrFhA96G.js} +1 -1
- package/dist/assets/{file-explorer-panel-BN6gd4XO.js → file-explorer-panel-DB17Zw1x.js} +1 -1
- package/dist/assets/{file-icons-DqdK7VJg.js → file-icons-D0QvDCq_.js} +1 -1
- package/dist/assets/{file-name-input-oiyzcfEJ.js → file-name-input-DsaNomb7.js} +1 -1
- package/dist/assets/{floating-outline-DPSwhBkV.js → floating-outline-FQva8xB9.js} +1 -1
- package/dist/assets/{fullscreen-BFfuaW3H.js → fullscreen-BH2jz-F4.js} +5 -5
- package/dist/assets/{gallery-page-7DdjmUx5.js → gallery-page-LX7vPBcZ.js} +1 -1
- package/dist/assets/{glide-data-editor-Di4wZ4hd.js → glide-data-editor-DgWXD84U.js} +1 -1
- package/dist/assets/{home-page-Bp96aSro.js → home-page-DtRwYsH-.js} +1 -1
- package/dist/assets/{index-KEC-OVKY.js → index-BphlL86Q.js} +5 -5
- package/dist/assets/index-D1E_LKIW.css +2 -0
- package/dist/assets/{input-BBJ8nAOd.js → input-C-RazPBA.js} +1 -1
- package/dist/assets/{layout-Cx8C7K25.js → layout-C4U2fp5O.js} +3 -3
- package/dist/assets/{logs-panel-D0bWZKWJ.js → logs-panel-BPfZpDxG.js} +1 -1
- package/dist/assets/{markdown-renderer-CZ3YygMD.js → markdown-renderer-CbdXI4uO.js} +1 -1
- package/dist/assets/menu-items-BSRA2YI9.js +1 -0
- package/dist/assets/{mermaid-Bx9Qyize.js → mermaid-BJLFqJtJ.js} +1 -1
- package/dist/assets/{name-cell-input-Bu4JMe_U.js → name-cell-input-CObHxs3L.js} +1 -1
- package/dist/assets/{outline-panel-C1xIywWA.js → outline-panel-Dyr_2yws.js} +1 -1
- package/dist/assets/{packages-panel-DTJ-O5EO.js → packages-panel-Cato7lRU.js} +1 -1
- package/dist/assets/{pair-with-agent-modal-DdhoVv9s.js → pair-with-agent-modal-bYFRKgrw.js} +1 -1
- package/dist/assets/{panel-accordion-state-Cx3vYbsP.js → panel-accordion-state-CB4RQUbp.js} +1 -1
- package/dist/assets/{panels-CywQefR1.js → panels-CaAkyFQ2.js} +1 -1
- package/dist/assets/{process-output-BisIKywr.js → process-output-BvjsWKqP.js} +1 -1
- package/dist/assets/{readonly-code-display-BkxE6y3G.js → readonly-code-display-D0VodUl8.js} +1 -1
- package/dist/assets/{readonly-python-code-BsJxWR9t.js → readonly-python-code-DlajH1tG.js} +1 -1
- package/dist/assets/{renderShortcut-BmNAHfqT.js → renderShortcut-DCEcfEd4.js} +1 -1
- package/dist/assets/{reveal-component-BNl5Zqif.js → reveal-component-NBGQ6pCq.js} +1 -1
- package/dist/assets/{run-page-RG1gHn8i.js → run-page-TDSGBzJ2.js} +1 -1
- package/dist/assets/{scratchpad-panel-DnSgF--Q.js → scratchpad-panel-smtKLHdh.js} +1 -1
- package/dist/assets/{scroll-to-bottom-button-BsJTlAOK.js → scroll-to-bottom-button-DufiYUD7.js} +1 -1
- package/dist/assets/{secrets-panel-BKccjNx4.js → secrets-panel-CWX3By7x.js} +1 -1
- package/dist/assets/select-nLt2y0Sw.js +1 -0
- package/dist/assets/{session-panel-BXwF6uCv.js → session-panel-BEpBnPuv.js} +1 -1
- package/dist/assets/{skeleton-DIGKSCaR.js → skeleton-BVafJh4G.js} +1 -1
- package/dist/assets/{snippets-panel-Bs7D-2J3.js → snippets-panel-D5Fdmjit.js} +1 -1
- package/dist/assets/{state-DqwSj41I.js → state-CbrP-RfI.js} +1 -1
- package/dist/assets/{state-C5o_oPeD.js → state-D2Q_Pzdk.js} +1 -1
- package/dist/assets/{swiper-component-CeAE4PvB.js → swiper-component-5Kdi1-Gn.js} +1 -1
- package/dist/assets/{switch-qLxqA0gx.js → switch-BzJYj8tz.js} +1 -1
- package/dist/assets/{tabs-CIEoDqa7.js → tabs-Cy1qXLzH.js} +1 -1
- package/dist/assets/{terminal-9kcc2057.js → terminal-CWTEGSbX.js} +1 -1
- package/dist/assets/{tooltip-BO5vfMvm.js → tooltip-BUtPzKB4.js} +1 -1
- package/dist/assets/{tracing-PQRp5Y6N.js → tracing-htk2wAUH.js} +1 -1
- package/dist/assets/{tracing-panel-BnrbDAGz.js → tracing-panel-D_FtT8xh.js} +2 -2
- package/dist/assets/{tree-actions-C-1KQPVN.js → tree-actions-CIKsGmOE.js} +1 -1
- package/dist/assets/{useAddCell-qRhXgYb3.js → useAddCell-B9V9LPof.js} +1 -1
- package/dist/assets/{useCellActionButton-C__VM-4x.js → useCellActionButton-Byz1dxEY.js} +1 -1
- package/dist/assets/{useDeleteCell-xTUoM-wW.js → useDeleteCell-xIU8YxOm.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-DbotHB0-.js → useDependencyPanelTab-CTX4KBOX.js} +1 -1
- package/dist/assets/{useNotebookActions-DIcNvfxA.js → useNotebookActions-CEWtEB4v.js} +1 -1
- package/dist/assets/{useRunCells-Bno18PcV.js → useRunCells-DpLEou4d.js} +1 -1
- package/dist/assets/{useSplitCell-DigdAFdD.js → useSplitCell-DIMMMQzM.js} +1 -1
- package/dist/assets/{vega-component-DnazhC4G.js → vega-component-D23FlAOS.js} +1 -1
- package/dist/assets/write-secret-modal-C2V1d4p-.js +2 -0
- package/dist/index.html +42 -42
- package/package.json +1 -1
- package/src/components/editor/Output.tsx +40 -0
- package/src/components/editor/__tests__/Output.test.tsx +85 -2
- package/src/components/ui/__tests__/badge.test.ts +63 -0
- package/src/components/ui/__tests__/button.test.ts +19 -0
- package/src/components/ui/__tests__/fullscreen.test.tsx +88 -0
- package/src/components/ui/__tests__/menu-items.test.ts +31 -0
- package/src/components/ui/badge.tsx +9 -7
- package/src/components/ui/button.tsx +1 -0
- package/src/components/ui/combobox.tsx +1 -1
- package/src/components/ui/date-input.tsx +1 -1
- package/src/components/ui/dialog.tsx +3 -1
- package/src/components/ui/fullscreen.tsx +43 -1
- package/src/components/ui/menu-items.tsx +9 -9
- package/src/components/ui/native-select.tsx +2 -2
- package/src/components/ui/navigation.tsx +1 -1
- package/src/components/ui/range-slider.tsx +5 -3
- package/src/components/ui/select.tsx +1 -1
- package/src/components/ui/sheet.tsx +1 -1
- package/src/components/ui/toast.tsx +8 -5
- package/src/components/ui/toaster.tsx +2 -2
- package/src/css/globals.css +28 -0
- package/src/hooks/useEventListener.ts +1 -1
- package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +25 -25
- package/dist/assets/alert-dialog-D_btUJmY.js +0 -11
- package/dist/assets/badge-D_-uqy2N.js +0 -1
- package/dist/assets/button-MlJ5qApt.js +0 -1
- package/dist/assets/config-BzPQfGBM.js +0 -1
- package/dist/assets/dropdown-menu-DnX3jo0y.js +0 -1
- package/dist/assets/index-BkIXRAbi.css +0 -2
- package/dist/assets/menu-items-BGpxTb6Y.js +0 -1
- package/dist/assets/select-4UL7AAMx.js +0 -1
- package/dist/assets/write-secret-modal-BJCzwShk.js +0 -2
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-
|
|
69
|
+
<script type="module" crossorigin src="./assets/index-BphlL86Q.js"></script>
|
|
70
70
|
<link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-B0Z9INg1.js">
|
|
71
71
|
<link rel="modulepreload" crossorigin href="./assets/react-CBDbhulC.js">
|
|
72
72
|
<link rel="modulepreload" crossorigin href="./assets/compiler-runtime-CYIjoINj.js">
|
|
@@ -91,18 +91,18 @@
|
|
|
91
91
|
<link rel="modulepreload" crossorigin href="./assets/config-BRRSKtP3.js">
|
|
92
92
|
<link rel="modulepreload" crossorigin href="./assets/clsx-DB0hHKMi.js">
|
|
93
93
|
<link rel="modulepreload" crossorigin href="./assets/cn-ldLVeaqm.js">
|
|
94
|
-
<link rel="modulepreload" crossorigin href="./assets/fullscreen-
|
|
95
|
-
<link rel="modulepreload" crossorigin href="./assets/dist-
|
|
96
|
-
<link rel="modulepreload" crossorigin href="./assets/menu-items-
|
|
97
|
-
<link rel="modulepreload" crossorigin href="./assets/button-
|
|
98
|
-
<link rel="modulepreload" crossorigin href="./assets/alert-dialog-
|
|
94
|
+
<link rel="modulepreload" crossorigin href="./assets/fullscreen-BH2jz-F4.js">
|
|
95
|
+
<link rel="modulepreload" crossorigin href="./assets/dist-DzCQtGkt.js">
|
|
96
|
+
<link rel="modulepreload" crossorigin href="./assets/menu-items-BSRA2YI9.js">
|
|
97
|
+
<link rel="modulepreload" crossorigin href="./assets/button-Dh8EwhsF.js">
|
|
98
|
+
<link rel="modulepreload" crossorigin href="./assets/alert-dialog-CA-2mBs3.js">
|
|
99
99
|
<link rel="modulepreload" crossorigin href="./assets/createLucideIcon-B7HeEoG2.js">
|
|
100
100
|
<link rel="modulepreload" crossorigin href="./assets/check-BoA6XBpj.js">
|
|
101
101
|
<link rel="modulepreload" crossorigin href="./assets/context-Do8M9TDF.js">
|
|
102
102
|
<link rel="modulepreload" crossorigin href="./assets/useNumberFormatter-DHJ9s6Vk.js">
|
|
103
|
-
<link rel="modulepreload" crossorigin href="./assets/select-
|
|
104
|
-
<link rel="modulepreload" crossorigin href="./assets/circle-
|
|
105
|
-
<link rel="modulepreload" crossorigin href="./assets/tooltip-
|
|
103
|
+
<link rel="modulepreload" crossorigin href="./assets/select-nLt2y0Sw.js">
|
|
104
|
+
<link rel="modulepreload" crossorigin href="./assets/circle-ByJdIf5p.js">
|
|
105
|
+
<link rel="modulepreload" crossorigin href="./assets/tooltip-BUtPzKB4.js">
|
|
106
106
|
<link rel="modulepreload" crossorigin href="./assets/dist-BtC9ym6k.js">
|
|
107
107
|
<link rel="modulepreload" crossorigin href="./assets/dist-CZNULd6Z.js">
|
|
108
108
|
<link rel="modulepreload" crossorigin href="./assets/arrays-BqUx5USx.js">
|
|
@@ -120,13 +120,13 @@
|
|
|
120
120
|
<link rel="modulepreload" crossorigin href="./assets/database-zap-CloO6gbw.js">
|
|
121
121
|
<link rel="modulepreload" crossorigin href="./assets/numbers-Bc-r3jsC.js">
|
|
122
122
|
<link rel="modulepreload" crossorigin href="./assets/useDebounce-Dulm61-t.js">
|
|
123
|
-
<link rel="modulepreload" crossorigin href="./assets/input-
|
|
123
|
+
<link rel="modulepreload" crossorigin href="./assets/input-C-RazPBA.js">
|
|
124
124
|
<link rel="modulepreload" crossorigin href="./assets/uuid-k9DpjH68.js">
|
|
125
125
|
<link rel="modulepreload" crossorigin href="./assets/use-toast-DpWHUGuF.js">
|
|
126
|
-
<link rel="modulepreload" crossorigin href="./assets/write-secret-modal-
|
|
126
|
+
<link rel="modulepreload" crossorigin href="./assets/write-secret-modal-C2V1d4p-.js">
|
|
127
127
|
<link rel="modulepreload" crossorigin href="./assets/plus-C4J9gIE1.js">
|
|
128
128
|
<link rel="modulepreload" crossorigin href="./assets/trash-2-D_HX-0qx.js">
|
|
129
|
-
<link rel="modulepreload" crossorigin href="./assets/badge-
|
|
129
|
+
<link rel="modulepreload" crossorigin href="./assets/badge-BSgtkC2e.js">
|
|
130
130
|
<link rel="modulepreload" crossorigin href="./assets/preload-helper-HclGiUj8.js">
|
|
131
131
|
<link rel="modulepreload" crossorigin href="./assets/dist-DkPPv0FB.js">
|
|
132
132
|
<link rel="modulepreload" crossorigin href="./assets/dist-Dw9YRsCU.js">
|
|
@@ -138,56 +138,56 @@
|
|
|
138
138
|
<link rel="modulepreload" crossorigin href="./assets/useTheme-OSyXt1jZ.js">
|
|
139
139
|
<link rel="modulepreload" crossorigin href="./assets/useAsyncData-Buhk-UgR.js">
|
|
140
140
|
<link rel="modulepreload" crossorigin href="./assets/purify.es-DrVcFY1Q.js">
|
|
141
|
-
<link rel="modulepreload" crossorigin href="./assets/cells-
|
|
141
|
+
<link rel="modulepreload" crossorigin href="./assets/cells-CS_eEQ19.js">
|
|
142
142
|
<link rel="modulepreload" crossorigin href="./assets/get-DjNf4SIX.js">
|
|
143
143
|
<link rel="modulepreload" crossorigin href="./assets/_hasPath-BmRQipI0.js">
|
|
144
144
|
<link rel="modulepreload" crossorigin href="./assets/hasIn-yw4sIeJR.js">
|
|
145
145
|
<link rel="modulepreload" crossorigin href="./assets/_baseSet-gX6o3Pih.js">
|
|
146
146
|
<link rel="modulepreload" crossorigin href="./assets/pick-Bs4cJfJU.js">
|
|
147
147
|
<link rel="modulepreload" crossorigin href="./assets/errors-DzO-nXy-.js">
|
|
148
|
-
<link rel="modulepreload" crossorigin href="./assets/switch-
|
|
148
|
+
<link rel="modulepreload" crossorigin href="./assets/switch-BzJYj8tz.js">
|
|
149
149
|
<link rel="modulepreload" crossorigin href="./assets/copy-BMXKNElG.js">
|
|
150
150
|
<link rel="modulepreload" crossorigin href="./assets/eye-off-CFuPxa9F.js">
|
|
151
151
|
<link rel="modulepreload" crossorigin href="./assets/copy-DlEomWzI.js">
|
|
152
152
|
<link rel="modulepreload" crossorigin href="./assets/extends-CvVTau-c.js">
|
|
153
153
|
<link rel="modulepreload" crossorigin href="./assets/esm-BHMOvJzM.js">
|
|
154
|
-
<link rel="modulepreload" crossorigin href="./assets/useAddCell-
|
|
155
|
-
<link rel="modulepreload" crossorigin href="./assets/readonly-python-code-
|
|
156
|
-
<link rel="modulepreload" crossorigin href="./assets/LazyAnyLanguageCodeMirror-
|
|
154
|
+
<link rel="modulepreload" crossorigin href="./assets/useAddCell-B9V9LPof.js">
|
|
155
|
+
<link rel="modulepreload" crossorigin href="./assets/readonly-python-code-DlajH1tG.js">
|
|
156
|
+
<link rel="modulepreload" crossorigin href="./assets/LazyAnyLanguageCodeMirror-LboTfNDv.js">
|
|
157
157
|
<link rel="modulepreload" crossorigin href="./assets/micromark-factory-space-D9Dr-k4J.js">
|
|
158
158
|
<link rel="modulepreload" crossorigin href="./assets/chunk-5FQGJX7Z-CRg4xQWg.js">
|
|
159
|
-
<link rel="modulepreload" crossorigin href="./assets/markdown-renderer-
|
|
160
|
-
<link rel="modulepreload" crossorigin href="./assets/copy-icon-
|
|
161
|
-
<link rel="modulepreload" crossorigin href="./assets/useRunCells-
|
|
162
|
-
<link rel="modulepreload" crossorigin href="./assets/RenderHTML-
|
|
163
|
-
<link rel="modulepreload" crossorigin href="./assets/blob-
|
|
159
|
+
<link rel="modulepreload" crossorigin href="./assets/markdown-renderer-CbdXI4uO.js">
|
|
160
|
+
<link rel="modulepreload" crossorigin href="./assets/copy-icon-z8fuTE3w.js">
|
|
161
|
+
<link rel="modulepreload" crossorigin href="./assets/useRunCells-DpLEou4d.js">
|
|
162
|
+
<link rel="modulepreload" crossorigin href="./assets/RenderHTML-BIg2a2gf.js">
|
|
163
|
+
<link rel="modulepreload" crossorigin href="./assets/blob-DDxD75AS.js">
|
|
164
164
|
<link rel="modulepreload" crossorigin href="./assets/share-CPtBiNgr.js">
|
|
165
165
|
<link rel="modulepreload" crossorigin href="./assets/events-CbeVJ6OD.js">
|
|
166
|
-
<link rel="modulepreload" crossorigin href="./assets/state-
|
|
167
|
-
<link rel="modulepreload" crossorigin href="./assets/ErrorBoundary-
|
|
168
|
-
<link rel="modulepreload" crossorigin href="./assets/config-
|
|
169
|
-
<link rel="modulepreload" crossorigin href="./assets/tabs-
|
|
166
|
+
<link rel="modulepreload" crossorigin href="./assets/state-CbrP-RfI.js">
|
|
167
|
+
<link rel="modulepreload" crossorigin href="./assets/ErrorBoundary-CDVGFYfr.js">
|
|
168
|
+
<link rel="modulepreload" crossorigin href="./assets/config-CJhe6_P2.js">
|
|
169
|
+
<link rel="modulepreload" crossorigin href="./assets/tabs-Cy1qXLzH.js">
|
|
170
170
|
<link rel="modulepreload" crossorigin href="./assets/chevron-right-CKA5zVsM.js">
|
|
171
|
-
<link rel="modulepreload" crossorigin href="./assets/dropdown-menu-
|
|
171
|
+
<link rel="modulepreload" crossorigin href="./assets/dropdown-menu-C40jM9o4.js">
|
|
172
172
|
<link rel="modulepreload" crossorigin href="./assets/html-to-image-D6GUC5q6.js">
|
|
173
|
-
<link rel="modulepreload" crossorigin href="./assets/download-
|
|
173
|
+
<link rel="modulepreload" crossorigin href="./assets/download-D2Ha98tp.js">
|
|
174
174
|
<link rel="modulepreload" crossorigin href="./assets/table-CUK1W5bI.js">
|
|
175
175
|
<link rel="modulepreload" crossorigin href="./assets/refresh-cw-Bf-rx_aV.js">
|
|
176
|
-
<link rel="modulepreload" crossorigin href="./assets/tree-actions-
|
|
176
|
+
<link rel="modulepreload" crossorigin href="./assets/tree-actions-CIKsGmOE.js">
|
|
177
177
|
<link rel="modulepreload" crossorigin href="./assets/ellipsis-Dfik_tuW.js">
|
|
178
178
|
<link rel="modulepreload" crossorigin href="./assets/external-link-Bp3BxyRA.js">
|
|
179
179
|
<link rel="modulepreload" crossorigin href="./assets/spinner-Ck-Hgfvj.js">
|
|
180
180
|
<link rel="modulepreload" crossorigin href="./assets/message-circle-BQB1AIAg.js">
|
|
181
181
|
<link rel="modulepreload" crossorigin href="./assets/hat-glasses-C8LSY3HT.js">
|
|
182
182
|
<link rel="modulepreload" crossorigin href="./assets/package-DPlscLzt.js">
|
|
183
|
-
<link rel="modulepreload" crossorigin href="./assets/datasource-
|
|
183
|
+
<link rel="modulepreload" crossorigin href="./assets/datasource-Br61QFhd.js">
|
|
184
184
|
<link rel="modulepreload" crossorigin href="./assets/kbd-Cwh96ZBE.js">
|
|
185
185
|
<link rel="modulepreload" crossorigin href="./assets/alert-dmKwNsrp.js">
|
|
186
186
|
<link rel="modulepreload" crossorigin href="./assets/useInstallPackage-DsD08SLK.js">
|
|
187
|
-
<link rel="modulepreload" crossorigin href="./assets/state-
|
|
188
|
-
<link rel="modulepreload" crossorigin href="./assets/cell-link-
|
|
189
|
-
<link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-
|
|
190
|
-
<link rel="modulepreload" crossorigin href="./assets/VisuallyHidden-
|
|
187
|
+
<link rel="modulepreload" crossorigin href="./assets/state-D2Q_Pzdk.js">
|
|
188
|
+
<link rel="modulepreload" crossorigin href="./assets/cell-link-B7DFi5Hf.js">
|
|
189
|
+
<link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-CIYHG601.js">
|
|
190
|
+
<link rel="modulepreload" crossorigin href="./assets/VisuallyHidden-K_kroCIL.js">
|
|
191
191
|
<link rel="modulepreload" crossorigin href="./assets/useDateFormatter-BiqAQ-zI.js">
|
|
192
192
|
<link rel="modulepreload" crossorigin href="./assets/en-US-yTIMUO13.js">
|
|
193
193
|
<link rel="modulepreload" crossorigin href="./assets/isValid-nQ3Iam8J.js">
|
|
@@ -200,12 +200,12 @@
|
|
|
200
200
|
<link rel="modulepreload" crossorigin href="./assets/react-icons.esm-hr79-MCS.js">
|
|
201
201
|
<link rel="modulepreload" crossorigin href="./assets/emotion-is-prop-valid.esm-nLO-SoUf.js">
|
|
202
202
|
<link rel="modulepreload" crossorigin href="./assets/useIframeCapabilities-C7Di8f2y.js">
|
|
203
|
-
<link rel="modulepreload" crossorigin href="./assets/error-banner-
|
|
203
|
+
<link rel="modulepreload" crossorigin href="./assets/error-banner-Dw5YY9wq.js">
|
|
204
204
|
<link rel="modulepreload" crossorigin href="./assets/utils-49LGK4zG.js">
|
|
205
205
|
<link rel="modulepreload" crossorigin href="./assets/formats-C6s96nu2.js">
|
|
206
206
|
<link rel="modulepreload" crossorigin href="./assets/table-DmqOOjfe.js">
|
|
207
207
|
<link rel="modulepreload" crossorigin href="./assets/react-resizable-panels.browser.esm-BSRAHC4P.js">
|
|
208
|
-
<link rel="modulepreload" crossorigin href="./assets/JsonOutput-
|
|
208
|
+
<link rel="modulepreload" crossorigin href="./assets/JsonOutput-i6wa-ZZg.js">
|
|
209
209
|
<link rel="modulepreload" crossorigin href="./assets/chart-no-axes-column-ChZdjJhj.js">
|
|
210
210
|
<link rel="modulepreload" crossorigin href="./assets/square-function-DkZweMAs.js">
|
|
211
211
|
<link rel="modulepreload" crossorigin href="./assets/spec-DKsAmLTi.js">
|
|
@@ -216,26 +216,26 @@
|
|
|
216
216
|
<link rel="modulepreload" crossorigin href="./assets/file-headphone-rFCxFRI8.js">
|
|
217
217
|
<link rel="modulepreload" crossorigin href="./assets/file-DF8n85RA.js">
|
|
218
218
|
<link rel="modulepreload" crossorigin href="./assets/image-ab13yGv4.js">
|
|
219
|
-
<link rel="modulepreload" crossorigin href="./assets/file-icons-
|
|
219
|
+
<link rel="modulepreload" crossorigin href="./assets/file-icons-D0QvDCq_.js">
|
|
220
220
|
<link rel="modulepreload" crossorigin href="./assets/globe-BQf75qV_.js">
|
|
221
221
|
<link rel="modulepreload" crossorigin href="./assets/markdown-export-0rLbaq8b.js">
|
|
222
222
|
<link rel="modulepreload" crossorigin href="./assets/data-grid-types-DgHVN_Zz.js">
|
|
223
223
|
<link rel="modulepreload" crossorigin href="./assets/glide-utils-UGsrRHYj.js">
|
|
224
|
-
<link rel="modulepreload" crossorigin href="./assets/column-preview-
|
|
224
|
+
<link rel="modulepreload" crossorigin href="./assets/column-preview-BVtft2uw.js">
|
|
225
225
|
<link rel="modulepreload" crossorigin href="./assets/square-B58Ib8Ir.js">
|
|
226
226
|
<link rel="modulepreload" crossorigin href="./assets/triangle-alert-MihykDYG.js">
|
|
227
227
|
<link rel="modulepreload" crossorigin href="./assets/prop-types-Djf4O40e.js">
|
|
228
|
-
<link rel="modulepreload" crossorigin href="./assets/es-
|
|
229
|
-
<link rel="modulepreload" crossorigin href="./assets/renderShortcut-
|
|
228
|
+
<link rel="modulepreload" crossorigin href="./assets/es-CrFhA96G.js">
|
|
229
|
+
<link rel="modulepreload" crossorigin href="./assets/renderShortcut-DCEcfEd4.js">
|
|
230
230
|
<link rel="modulepreload" crossorigin href="./assets/bundle.esm-DzY74mzC.js">
|
|
231
231
|
<link rel="modulepreload" crossorigin href="./assets/icons-CjLa9BiH.js">
|
|
232
232
|
<link rel="modulepreload" crossorigin href="./assets/useDeepCompareMemoize-CLytDdMl.js">
|
|
233
233
|
<link rel="modulepreload" crossorigin href="./assets/pathUtils-Cryrlpma.js">
|
|
234
|
-
<link rel="modulepreload" crossorigin href="./assets/floating-outline-
|
|
234
|
+
<link rel="modulepreload" crossorigin href="./assets/floating-outline-FQva8xB9.js">
|
|
235
235
|
<link rel="stylesheet" crossorigin href="./assets/cells-D-c15Ks-.css">
|
|
236
236
|
<link rel="stylesheet" crossorigin href="./assets/markdown-renderer-B7zTpxjS.css">
|
|
237
237
|
<link rel="stylesheet" crossorigin href="./assets/JsonOutput-BQtz7-np.css">
|
|
238
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
238
|
+
<link rel="stylesheet" crossorigin href="./assets/index-D1E_LKIW.css">
|
|
239
239
|
</head>
|
|
240
240
|
<body>
|
|
241
241
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -18,10 +18,12 @@ import {
|
|
|
18
18
|
ChevronsDownUpIcon,
|
|
19
19
|
ChevronsUpDownIcon,
|
|
20
20
|
ExpandIcon,
|
|
21
|
+
ShrinkIcon,
|
|
21
22
|
} from "lucide-react";
|
|
22
23
|
import { tooltipHandler } from "@/components/charts/tooltip";
|
|
23
24
|
import { useExpandedOutput } from "@/core/cells/outputs";
|
|
24
25
|
import { viewStateAtom } from "@/core/mode";
|
|
26
|
+
import { useEventListener } from "@/hooks/useEventListener";
|
|
25
27
|
import { useIframeCapabilities } from "@/hooks/useIframeCapabilities";
|
|
26
28
|
import { useOverflowDetection } from "@/hooks/useOverflowDetection";
|
|
27
29
|
import { renderHTML } from "@/plugins/core/RenderHTML";
|
|
@@ -31,11 +33,13 @@ import { getContainerWidth } from "@/plugins/impl/vega/utils";
|
|
|
31
33
|
import { useTheme } from "@/theme/useTheme";
|
|
32
34
|
import { Events } from "@/utils/events";
|
|
33
35
|
import { invariant } from "@/utils/invariant";
|
|
36
|
+
import { Logger } from "@/utils/Logger";
|
|
34
37
|
import { processMimeBundle } from "@/utils/mime-types";
|
|
35
38
|
import { Objects } from "@/utils/objects";
|
|
36
39
|
import { LazyVegaEmbed } from "../charts/lazy";
|
|
37
40
|
import { ChartLoadingState } from "../data-table/charts/components/chart-states";
|
|
38
41
|
import { Button } from "../ui/button";
|
|
42
|
+
import { useIsFullScreen } from "../ui/fullscreen";
|
|
39
43
|
import { Tabs, TabsContent, TabsList, TabsTrigger } from "../ui/tabs";
|
|
40
44
|
import { Tooltip } from "../ui/tooltip";
|
|
41
45
|
import { CsvViewer } from "./file-tree/renderers";
|
|
@@ -408,6 +412,12 @@ const Div = React.forwardRef<
|
|
|
408
412
|
>((props, ref) => <div ref={ref} {...props} />);
|
|
409
413
|
Div.displayName = "Div";
|
|
410
414
|
|
|
415
|
+
function exitFullscreen() {
|
|
416
|
+
document.exitFullscreen().catch((error) => {
|
|
417
|
+
Logger.warn("Failed to exit fullscreen", error);
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
|
|
411
421
|
/**
|
|
412
422
|
* Detects if there is overflow in the output area and adds a button to optionally expand
|
|
413
423
|
*/
|
|
@@ -425,6 +435,16 @@ const ExpandableOutput = React.memo(
|
|
|
425
435
|
const [isExpanded, setIsExpanded] = useExpandedOutput(cellId);
|
|
426
436
|
const isOverflowing = useOverflowDetection(containerRef);
|
|
427
437
|
const { hasFullscreen } = useIframeCapabilities();
|
|
438
|
+
const isFullscreen = useIsFullScreen(containerRef);
|
|
439
|
+
|
|
440
|
+
// Not every host exits fullscreen on Escape by itself. A null target keeps
|
|
441
|
+
// the listener off every output that is not fullscreen.
|
|
442
|
+
useEventListener(isFullscreen ? document : null, "keydown", (event) => {
|
|
443
|
+
if (event.key !== "Escape" || !document.fullscreenElement) {
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
exitFullscreen();
|
|
447
|
+
});
|
|
428
448
|
|
|
429
449
|
return (
|
|
430
450
|
<>
|
|
@@ -488,6 +508,26 @@ const ExpandableOutput = React.memo(
|
|
|
488
508
|
isExpanded || forceExpand ? { maxHeight: "none" } : undefined
|
|
489
509
|
}
|
|
490
510
|
>
|
|
511
|
+
{/* Fullscreen paints this element only, and the action buttons sit
|
|
512
|
+
outside it. A host does not always draw an exit overlay, so the
|
|
513
|
+
output carries its own exit control. */}
|
|
514
|
+
{isFullscreen && (
|
|
515
|
+
<Tooltip content="Exit fullscreen" side="left">
|
|
516
|
+
<Button
|
|
517
|
+
data-testid="exit-fullscreen-output-button"
|
|
518
|
+
aria-label="Exit fullscreen"
|
|
519
|
+
className="absolute right-2 top-2 z-2 p-1 bg-background/90 border border-border hover:bg-muted print:hidden"
|
|
520
|
+
onClick={exitFullscreen}
|
|
521
|
+
size="xs"
|
|
522
|
+
variant="text"
|
|
523
|
+
>
|
|
524
|
+
<ShrinkIcon
|
|
525
|
+
className="size-4 opacity-60 hover:opacity-80"
|
|
526
|
+
strokeWidth={1.25}
|
|
527
|
+
/>
|
|
528
|
+
</Button>
|
|
529
|
+
</Tooltip>
|
|
530
|
+
)}
|
|
491
531
|
{children}
|
|
492
532
|
</div>
|
|
493
533
|
</div>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
import { render, screen } from "@testing-library/react";
|
|
3
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { act, fireEvent, render, screen } from "@testing-library/react";
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
4
|
import { cellId } from "@/__tests__/branded";
|
|
5
5
|
import { TooltipProvider } from "@/components/ui/tooltip";
|
|
6
6
|
import { OutputArea, OutputRenderer } from "../Output";
|
|
@@ -158,3 +158,86 @@ describe("OutputRenderer image and SVG rendering", () => {
|
|
|
158
158
|
expect(imgElement).toHaveAttribute("src", base64PngDataUrl);
|
|
159
159
|
});
|
|
160
160
|
});
|
|
161
|
+
|
|
162
|
+
describe("OutputArea fullscreen exit control", () => {
|
|
163
|
+
let fullscreenElement: Element | null = null;
|
|
164
|
+
const exitFullscreen = vi.fn(() => Promise.resolve());
|
|
165
|
+
|
|
166
|
+
beforeEach(() => {
|
|
167
|
+
fullscreenElement = null;
|
|
168
|
+
exitFullscreen.mockClear();
|
|
169
|
+
Object.defineProperty(document, "fullscreenElement", {
|
|
170
|
+
configurable: true,
|
|
171
|
+
get: () => fullscreenElement,
|
|
172
|
+
});
|
|
173
|
+
Object.defineProperty(document, "exitFullscreen", {
|
|
174
|
+
configurable: true,
|
|
175
|
+
value: exitFullscreen,
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
// Drop the stubs so that the real document properties come back.
|
|
180
|
+
afterEach(() => {
|
|
181
|
+
Reflect.deleteProperty(document, "fullscreenElement");
|
|
182
|
+
Reflect.deleteProperty(document, "exitFullscreen");
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
const renderOutput = () =>
|
|
186
|
+
render(
|
|
187
|
+
<TooltipProvider>
|
|
188
|
+
<OutputArea
|
|
189
|
+
output={{
|
|
190
|
+
channel: "output",
|
|
191
|
+
data: "Hello World",
|
|
192
|
+
mimetype: "text/plain",
|
|
193
|
+
}}
|
|
194
|
+
cellId={cellId("test")}
|
|
195
|
+
stale={false}
|
|
196
|
+
loading={false}
|
|
197
|
+
allowExpand={true}
|
|
198
|
+
/>
|
|
199
|
+
</TooltipProvider>,
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
const enterFullscreen = (container: HTMLElement) => {
|
|
203
|
+
fullscreenElement = container.querySelector('[data-cell-role="output"]');
|
|
204
|
+
act(() => {
|
|
205
|
+
document.dispatchEvent(new Event("fullscreenchange"));
|
|
206
|
+
});
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
it("hides the exit button outside fullscreen", () => {
|
|
210
|
+
renderOutput();
|
|
211
|
+
expect(
|
|
212
|
+
screen.queryByTestId("exit-fullscreen-output-button"),
|
|
213
|
+
).not.toBeInTheDocument();
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it("shows the exit button when the output is the fullscreen element", () => {
|
|
217
|
+
const { container } = renderOutput();
|
|
218
|
+
enterFullscreen(container);
|
|
219
|
+
expect(
|
|
220
|
+
screen.getByTestId("exit-fullscreen-output-button"),
|
|
221
|
+
).toBeInTheDocument();
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
it("exits fullscreen on click", () => {
|
|
225
|
+
const { container } = renderOutput();
|
|
226
|
+
enterFullscreen(container);
|
|
227
|
+
fireEvent.click(screen.getByTestId("exit-fullscreen-output-button"));
|
|
228
|
+
expect(exitFullscreen).toHaveBeenCalledTimes(1);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it("exits fullscreen on Escape", () => {
|
|
232
|
+
const { container } = renderOutput();
|
|
233
|
+
enterFullscreen(container);
|
|
234
|
+
fireEvent.keyDown(document, { key: "Escape" });
|
|
235
|
+
expect(exitFullscreen).toHaveBeenCalledTimes(1);
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
it("ignores Escape outside fullscreen", () => {
|
|
239
|
+
renderOutput();
|
|
240
|
+
fireEvent.keyDown(document, { key: "Escape" });
|
|
241
|
+
expect(exitFullscreen).not.toHaveBeenCalled();
|
|
242
|
+
});
|
|
243
|
+
});
|
|
@@ -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:
|
|
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:
|
|
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,
|