@marimo-team/frontend 0.24.1-dev115 → 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-DJBTB8Tm.js → CellStatus-BnX3kFgK.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-C22y7sbC.js → ConnectedDataExplorerComponent-Slfh2UI3.js} +1 -1
- package/dist/assets/{JsonOutput-COWoYBdx.js → JsonOutput-i6wa-ZZg.js} +10 -10
- package/dist/assets/{LazyAnyLanguageCodeMirror-nhd5JrSb.js → LazyAnyLanguageCodeMirror-LboTfNDv.js} +2 -2
- package/dist/assets/{MarimoErrorOutput-Cpp7YwEl.js → MarimoErrorOutput-CIYHG601.js} +1 -1
- package/dist/assets/{RenderHTML-DlIzJTPL.js → RenderHTML-BIg2a2gf.js} +1 -1
- package/dist/assets/{RunButton-CT16Dkr4.js → RunButton-z5x8Nygi.js} +1 -1
- package/dist/assets/{VisuallyHidden-wlQyxf8y.js → VisuallyHidden-K_kroCIL.js} +1 -1
- package/dist/assets/{add-cell-with-ai-DSjyPknP.js → add-cell-with-ai-P7MBEjnv.js} +1 -1
- package/dist/assets/{add-connection-dialog-DO478_EL.js → add-connection-dialog-B7yGNrvC.js} +1 -1
- package/dist/assets/{agent-panel-DIvPSTyY.js → agent-panel-DUUWyz59.js} +1 -1
- package/dist/assets/{ai-model-dropdown-BxqpRM7R.js → ai-model-dropdown-BN9nyr0_.js} +1 -1
- package/dist/assets/alert-dialog-CA-2mBs3.js +11 -0
- package/dist/assets/{any-language-editor-kw0XJFxM.js → any-language-editor-DflLjPSQ.js} +1 -1
- package/dist/assets/{app-config-button-CAZWYP6R.js → app-config-button-vxdvoC0x.js} +1 -1
- package/dist/assets/{blob-B82D3b64.js → blob-DDxD75AS.js} +1 -1
- package/dist/assets/{cache-panel-iphovHma.js → cache-panel-DqgtC98s.js} +1 -1
- package/dist/assets/{cell-editor-CL59E8W0.js → cell-editor-D6Cyy4UF.js} +1 -1
- package/dist/assets/{cell-link-DOeJzvRH.js → cell-link-B7DFi5Hf.js} +1 -1
- package/dist/assets/{cells-BgH2MZS9.js → cells-CS_eEQ19.js} +3 -3
- package/dist/assets/{chat-display-kzxea9r-.js → chat-display-CtnwRDHx.js} +1 -1
- package/dist/assets/{chat-panel-BVsbI9bp.js → chat-panel-DScfSsWl.js} +1 -1
- package/dist/assets/{chat-ui-BIaqeCtJ.js → chat-ui-9G115u_7.js} +1 -1
- package/dist/assets/{circle-BiW8b6Xq.js → circle-ByJdIf5p.js} +1 -1
- package/dist/assets/{column-preview-BWoK0ZFU.js → column-preview-BVtft2uw.js} +1 -1
- package/dist/assets/{command-palette-CcLmXXVs.js → command-palette-uGrOQhzq.js} +1 -1
- package/dist/assets/{common-DeDcgYdz.js → common-CQLiJ8JV.js} +1 -1
- package/dist/assets/{components-CtHLnRet.js → components-B5BY9RR4.js} +1 -1
- package/dist/assets/config-CJhe6_P2.js +1 -0
- package/dist/assets/{copy-icon-D522mvZL.js → copy-icon-z8fuTE3w.js} +1 -1
- package/dist/assets/{datasource-HG_yVRxq.js → datasource-Br61QFhd.js} +1 -1
- package/dist/assets/{dependency-graph-panel-CVsva03Q.js → dependency-graph-panel-DoAAA7Y1.js} +1 -1
- package/dist/assets/{dist-ConG15vZ.js → dist-DzCQtGkt.js} +1 -1
- package/dist/assets/{documentation-panel-BSiOFIpg.js → documentation-panel-CYUIPHeO.js} +1 -1
- package/dist/assets/{download-C4umhthc.js → download-D2Ha98tp.js} +1 -1
- package/dist/assets/dropdown-menu-C40jM9o4.js +1 -0
- package/dist/assets/{edit-page-DCOdX3sJ.js → edit-page-ClGPnVOK.js} +4 -4
- package/dist/assets/{error-banner-C5aiAh3q.js → error-banner-Dw5YY9wq.js} +1 -1
- package/dist/assets/{error-entries-Yh2iX13J.js → error-entries-ooCnKQtX.js} +1 -1
- package/dist/assets/{error-panel-CGUFTbfd.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-Db-8C8fm.js → file-explorer-panel-DB17Zw1x.js} +1 -1
- package/dist/assets/{file-icons-C0Mf_Axb.js → file-icons-D0QvDCq_.js} +1 -1
- package/dist/assets/{file-name-input-DmwIfRLx.js → file-name-input-DsaNomb7.js} +1 -1
- package/dist/assets/{floating-outline-8Uo6Qp8W.js → floating-outline-FQva8xB9.js} +1 -1
- package/dist/assets/{fullscreen-BFfuaW3H.js → fullscreen-BH2jz-F4.js} +5 -5
- package/dist/assets/{gallery-page-BpxbCG1a.js → gallery-page-LX7vPBcZ.js} +1 -1
- package/dist/assets/{glide-data-editor-k7azNhFM.js → glide-data-editor-DgWXD84U.js} +1 -1
- package/dist/assets/{home-page-CEzr9Hhn.js → home-page-DtRwYsH-.js} +1 -1
- package/dist/assets/{index-kkDJK6-j.js → index-BphlL86Q.js} +5 -5
- package/dist/assets/index-D1E_LKIW.css +2 -0
- package/dist/assets/{input-D4qvzBWu.js → input-C-RazPBA.js} +1 -1
- package/dist/assets/{layout-D5ovQPUb.js → layout-C4U2fp5O.js} +3 -3
- package/dist/assets/{logs-panel-Cqxpxz5Z.js → logs-panel-BPfZpDxG.js} +1 -1
- package/dist/assets/{markdown-renderer-zZh3O1Hm.js → markdown-renderer-CbdXI4uO.js} +1 -1
- package/dist/assets/{menu-items-CsV3aDPH.js → menu-items-BSRA2YI9.js} +1 -1
- package/dist/assets/{mermaid-BovZosCC.js → mermaid-BJLFqJtJ.js} +1 -1
- package/dist/assets/{name-cell-input-DXP1MqrH.js → name-cell-input-CObHxs3L.js} +1 -1
- package/dist/assets/{outline-panel-CMMPf-P7.js → outline-panel-Dyr_2yws.js} +1 -1
- package/dist/assets/{packages-panel-BHZOSh3s.js → packages-panel-Cato7lRU.js} +1 -1
- package/dist/assets/{pair-with-agent-modal-DgckrViE.js → pair-with-agent-modal-bYFRKgrw.js} +1 -1
- package/dist/assets/{panel-accordion-state-9kdNootf.js → panel-accordion-state-CB4RQUbp.js} +1 -1
- package/dist/assets/{panels-Ca-tbb7P.js → panels-CaAkyFQ2.js} +1 -1
- package/dist/assets/{process-output-Bi9pDe1a.js → process-output-BvjsWKqP.js} +1 -1
- package/dist/assets/{readonly-code-display-ilZfA3ua.js → readonly-code-display-D0VodUl8.js} +1 -1
- package/dist/assets/{readonly-python-code-Bqk6NhSW.js → readonly-python-code-DlajH1tG.js} +1 -1
- package/dist/assets/{renderShortcut-BnBOGXqJ.js → renderShortcut-DCEcfEd4.js} +1 -1
- package/dist/assets/{reveal-component-DpoL_y06.js → reveal-component-NBGQ6pCq.js} +1 -1
- package/dist/assets/{run-page-rnCMzZmN.js → run-page-TDSGBzJ2.js} +1 -1
- package/dist/assets/{scratchpad-panel-BBd8n8wh.js → scratchpad-panel-smtKLHdh.js} +1 -1
- package/dist/assets/{secrets-panel-C5D_CNW2.js → secrets-panel-CWX3By7x.js} +1 -1
- package/dist/assets/select-nLt2y0Sw.js +1 -0
- package/dist/assets/{session-panel-C3kmYD9D.js → session-panel-BEpBnPuv.js} +1 -1
- package/dist/assets/{skeleton-xsRIwsVr.js → skeleton-BVafJh4G.js} +1 -1
- package/dist/assets/{snippets-panel-C1fCmhNQ.js → snippets-panel-D5Fdmjit.js} +1 -1
- package/dist/assets/{state-CsL-gymg.js → state-CbrP-RfI.js} +1 -1
- package/dist/assets/{state-DJSqAVnx.js → state-D2Q_Pzdk.js} +1 -1
- package/dist/assets/{switch-CYJ2u4G9.js → switch-BzJYj8tz.js} +1 -1
- package/dist/assets/{tabs-DxfkQ6UI.js → tabs-Cy1qXLzH.js} +1 -1
- package/dist/assets/{terminal-CfkxQQwT.js → terminal-CWTEGSbX.js} +1 -1
- package/dist/assets/{tooltip-BO5vfMvm.js → tooltip-BUtPzKB4.js} +1 -1
- package/dist/assets/{tracing-BHb672Fd.js → tracing-htk2wAUH.js} +1 -1
- package/dist/assets/{tracing-panel-3JaAnsDw.js → tracing-panel-D_FtT8xh.js} +2 -2
- package/dist/assets/{tree-actions-CzmLf39g.js → tree-actions-CIKsGmOE.js} +1 -1
- package/dist/assets/{useAddCell-DuzEVBJj.js → useAddCell-B9V9LPof.js} +1 -1
- package/dist/assets/{useCellActionButton-B3Ve1KW5.js → useCellActionButton-Byz1dxEY.js} +1 -1
- package/dist/assets/{useDeleteCell-CEtU0g91.js → useDeleteCell-xIU8YxOm.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-BpSWTQLC.js → useDependencyPanelTab-CTX4KBOX.js} +1 -1
- package/dist/assets/{useNotebookActions-C3LAhEgG.js → useNotebookActions-CEWtEB4v.js} +1 -1
- package/dist/assets/{useRunCells-omrTl5XU.js → useRunCells-DpLEou4d.js} +1 -1
- package/dist/assets/{useSplitCell-CgXD2Gcw.js → useSplitCell-DIMMMQzM.js} +1 -1
- package/dist/assets/{vega-component-CwdVpUdb.js → vega-component-D23FlAOS.js} +1 -1
- package/dist/assets/write-secret-modal-C2V1d4p-.js +2 -0
- package/dist/index.html +39 -39
- 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__/fullscreen.test.tsx +88 -0
- package/src/components/ui/fullscreen.tsx +43 -1
- package/src/hooks/useEventListener.ts +1 -1
- package/dist/assets/alert-dialog-BnNhUpVP.js +0 -11
- package/dist/assets/config-DnyziF11.js +0 -1
- package/dist/assets/dropdown-menu-B-ZAV5lw.js +0 -1
- package/dist/assets/index-DuY6Lm00.css +0 -2
- package/dist/assets/select-BJKJFWHk.js +0 -1
- package/dist/assets/write-secret-modal-GHpJRc36.js +0 -2
|
@@ -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,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
|
+
});
|
|
@@ -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,7 +17,7 @@ export function isRefObject<T>(target: unknown): target is RefObject<T | null> {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export function useEventListener<K extends keyof DocumentEventMap>(
|
|
20
|
-
targetValue: Document,
|
|
20
|
+
targetValue: Document | null,
|
|
21
21
|
type: K,
|
|
22
22
|
listener: (ev: DocumentEventMap[K]) => unknown,
|
|
23
23
|
options?: boolean | AddEventListenerOptions,
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-B0Z9INg1.js";import{t}from"./react-CBDbhulC.js";import{t as n}from"./compiler-runtime-CYIjoINj.js";import{i as r,o as i,r as a}from"./useEventListener-92uWqz-P.js";import{t as o}from"./cn-ldLVeaqm.js";import{t as s}from"./jsx-runtime-B74pBk57.js";import{C as c,S as l,_ as u,c as d,d as ee,f as te,m as ne,o as re,r as ie,s as ae,u as oe,v as f,w as p,x as m,y as se}from"./fullscreen-BFfuaW3H.js";import{n as h}from"./button-Dh8EwhsF.js";var g=e(t(),1),_=s(),v=`Dialog`,[y,b]=c(v),[ce,x]=y(v),le=e=>{let{__scopeDialog:t,children:n,open:r,defaultOpen:i,onOpenChange:a,modal:o=!0}=e,s=g.useRef(null),c=g.useRef(null),[l,d]=se({prop:r,defaultProp:i??!1,onChange:a,caller:v});return(0,_.jsx)(ce,{scope:t,triggerRef:s,contentRef:c,contentId:u(),titleId:u(),descriptionId:u(),open:l,onOpenChange:d,onOpenToggle:g.useCallback(()=>d(e=>!e),[d]),modal:o,children:n})};le.displayName=v;var ue=`DialogTrigger`,S=g.forwardRef((e,t)=>{let{__scopeDialog:n,...r}=e,a=x(ue,n),o=i(t,a.triggerRef);return(0,_.jsx)(p.button,{type:`button`,"aria-haspopup":`dialog`,"aria-expanded":a.open,"aria-controls":a.contentId,"data-state":L(a.open),...r,ref:o,onClick:m(e.onClick,a.onOpenToggle)})});S.displayName=ue;var C=`DialogPortal`,[de,w]=y(C,{forceMount:void 0}),T=e=>{let{__scopeDialog:t,forceMount:n,children:r,container:i}=e,a=x(C,t);return(0,_.jsx)(de,{scope:t,forceMount:n,children:g.Children.map(r,e=>(0,_.jsx)(f,{present:n||a.open,children:(0,_.jsx)(ee,{asChild:!0,container:i,children:e})}))})};T.displayName=C;var E=`DialogOverlay`,D=g.forwardRef((e,t)=>{let n=w(E,e.__scopeDialog),{forceMount:r=n.forceMount,...i}=e,a=x(E,e.__scopeDialog);return a.modal?(0,_.jsx)(f,{present:r||a.open,children:(0,_.jsx)(pe,{...i,ref:t})}):null});D.displayName=E;var fe=a(`DialogOverlay.RemoveScroll`),pe=g.forwardRef((e,t)=>{let{__scopeDialog:n,...r}=e,i=x(E,n);return(0,_.jsx)(d,{as:fe,allowPinchZoom:!0,shards:[i.contentRef],children:(0,_.jsx)(p.div,{"data-state":L(i.open),...r,ref:t,style:{pointerEvents:`auto`,...r.style}})})}),O=`DialogContent`,k=g.forwardRef((e,t)=>{let n=w(O,e.__scopeDialog),{forceMount:r=n.forceMount,...i}=e,a=x(O,e.__scopeDialog);return(0,_.jsx)(f,{present:r||a.open,children:a.modal?(0,_.jsx)(me,{...i,ref:t}):(0,_.jsx)(he,{...i,ref:t})})});k.displayName=O;var me=g.forwardRef((e,t)=>{let n=x(O,e.__scopeDialog),r=g.useRef(null),a=i(t,n.contentRef,r);return g.useEffect(()=>{let e=r.current;if(e)return ae(e)},[]),(0,_.jsx)(A,{...e,ref:a,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:m(e.onCloseAutoFocus,e=>{e.preventDefault(),n.triggerRef.current?.focus()}),onPointerDownOutside:m(e.onPointerDownOutside,e=>{let t=e.detail.originalEvent,n=t.button===0&&t.ctrlKey===!0;(t.button===2||n)&&e.preventDefault()}),onFocusOutside:m(e.onFocusOutside,e=>e.preventDefault())})}),he=g.forwardRef((e,t)=>{let n=x(O,e.__scopeDialog),r=g.useRef(!1),i=g.useRef(!1);return(0,_.jsx)(A,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:t=>{e.onCloseAutoFocus?.(t),t.defaultPrevented||(r.current||n.triggerRef.current?.focus(),t.preventDefault()),r.current=!1,i.current=!1},onInteractOutside:t=>{e.onInteractOutside?.(t),t.defaultPrevented||(r.current=!0,t.detail.originalEvent.type===`pointerdown`&&(i.current=!0));let a=t.target;n.triggerRef.current?.contains(a)&&t.preventDefault(),t.detail.originalEvent.type===`focusin`&&i.current&&t.preventDefault()}})}),A=g.forwardRef((e,t)=>{let{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:a,onCloseAutoFocus:o,...s}=e,c=x(O,n),l=g.useRef(null),u=i(t,l);return oe(),(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(te,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:a,onUnmountAutoFocus:o,children:(0,_.jsx)(ne,{role:`dialog`,id:c.contentId,"aria-describedby":c.descriptionId,"aria-labelledby":c.titleId,"data-state":L(c.open),...s,ref:u,onDismiss:()=>c.onOpenChange(!1)})}),(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(_e,{titleId:c.titleId}),(0,_.jsx)(ye,{contentRef:l,descriptionId:c.descriptionId})]})]})}),j=`DialogTitle`,M=g.forwardRef((e,t)=>{let{__scopeDialog:n,...r}=e,i=x(j,n);return(0,_.jsx)(p.h2,{id:i.titleId,...r,ref:t})});M.displayName=j;var N=`DialogDescription`,P=g.forwardRef((e,t)=>{let{__scopeDialog:n,...r}=e,i=x(N,n);return(0,_.jsx)(p.p,{id:i.descriptionId,...r,ref:t})});P.displayName=N;var F=`DialogClose`,I=g.forwardRef((e,t)=>{let{__scopeDialog:n,...r}=e,i=x(F,n);return(0,_.jsx)(p.button,{type:`button`,...r,ref:t,onClick:m(e.onClick,()=>i.onOpenChange(!1))})});I.displayName=F;function L(e){return e?`open`:`closed`}var R=`DialogTitleWarning`,[ge,z]=l(R,{contentName:O,titleName:j,docsSlug:`dialog`}),_e=({titleId:e})=>{let t=z(R),n=`\`${t.contentName}\` requires a \`${t.titleName}\` for the component to be accessible for screen reader users.
|
|
2
|
-
|
|
3
|
-
If you want to hide the \`${t.titleName}\`, you can wrap it with our VisuallyHidden component.
|
|
4
|
-
|
|
5
|
-
For more information, see https://radix-ui.com/primitives/docs/components/${t.docsSlug}`;return g.useEffect(()=>{e&&(document.getElementById(e)||console.error(n))},[n,e]),null},ve=`DialogDescriptionWarning`,ye=({contentRef:e,descriptionId:t})=>{let n=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${z(ve).contentName}}.`;return g.useEffect(()=>{let r=e.current?.getAttribute(`aria-describedby`);t&&r&&(document.getElementById(t)||console.warn(n))},[n,e,t]),null},B=le,V=S,H=T,U=D,W=k,G=M,K=P,q=I,J=`AlertDialog`,[be,xe]=c(J,[b]),Y=b(),X=e=>{let{__scopeAlertDialog:t,...n}=e,r=Y(t);return(0,_.jsx)(B,{...r,...n,modal:!0})};X.displayName=J;var Se=`AlertDialogTrigger`,Ce=g.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=Y(n);return(0,_.jsx)(V,{...i,...r,ref:t})});Ce.displayName=Se;var we=`AlertDialogPortal`,Te=e=>{let{__scopeAlertDialog:t,...n}=e,r=Y(t);return(0,_.jsx)(H,{...r,...n})};Te.displayName=we;var Ee=`AlertDialogOverlay`,De=g.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=Y(n);return(0,_.jsx)(U,{...i,...r,ref:t})});De.displayName=Ee;var Z=`AlertDialogContent`,[Oe,ke]=be(Z),Ae=r(`AlertDialogContent`),je=g.forwardRef((e,t)=>{let{__scopeAlertDialog:n,children:r,...a}=e,o=Y(n),s=g.useRef(null),c=i(t,s),l=g.useRef(null);return(0,_.jsx)(ge,{contentName:Z,titleName:Me,docsSlug:`alert-dialog`,children:(0,_.jsx)(Oe,{scope:n,cancelRef:l,children:(0,_.jsxs)(W,{role:`alertdialog`,...o,...a,ref:c,onOpenAutoFocus:m(a.onOpenAutoFocus,e=>{e.preventDefault(),l.current?.focus({preventScroll:!0})}),onPointerDownOutside:e=>e.preventDefault(),onInteractOutside:e=>e.preventDefault(),children:[(0,_.jsx)(Ae,{children:r}),(0,_.jsx)(Be,{contentRef:s})]})})})});je.displayName=Z;var Me=`AlertDialogTitle`,Ne=g.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=Y(n);return(0,_.jsx)(G,{...i,...r,ref:t})});Ne.displayName=Me;var Pe=`AlertDialogDescription`,Fe=g.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=Y(n);return(0,_.jsx)(K,{...i,...r,ref:t})});Fe.displayName=Pe;var Ie=`AlertDialogAction`,Le=g.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=Y(n);return(0,_.jsx)(q,{...i,...r,ref:t})});Le.displayName=Ie;var Re=`AlertDialogCancel`,ze=g.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,{cancelRef:a}=ke(Re,n),o=Y(n),s=i(t,a);return(0,_.jsx)(q,{...o,...r,ref:s})});ze.displayName=Re;var Be=({contentRef:e})=>{let t=`\`${Z}\` requires a description for the component to be accessible for screen reader users.
|
|
6
|
-
|
|
7
|
-
You can add a description to the \`${Z}\` by passing a \`${Pe}\` component as a child, which also benefits sighted users by adding visible context to the dialog.
|
|
8
|
-
|
|
9
|
-
Alternatively, you can use your own component as a description by assigning it an \`id\` and passing the same value to the \`aria-describedby\` prop in \`${Z}\`. If the description is confusing or duplicative for sighted users, you can use the \`@radix-ui/react-visually-hidden\` primitive as a wrapper around your description component.
|
|
10
|
-
|
|
11
|
-
For more information, see https://radix-ui.com/primitives/docs/components/alert-dialog`;return g.useEffect(()=>{document.getElementById(e.current?.getAttribute(`aria-describedby`))||console.warn(t)},[t,e]),null},Ve=X,He=Ce,Ue=Te,We=De,Ge=je,Q=Le,Ke=ze,qe=Ne,Je=Fe,$=n();function Ye(){let e=(0,$.c)(3),[t,n]=(0,g.useState)(null),r;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(r=()=>{n(document.activeElement)},e[0]=r):r=e[0];let i=r,a;return e[1]===t?a=e[2]:(a={onOpenAutoFocus:i,onCloseAutoFocus:e=>{document.activeElement===document.body&&(t instanceof HTMLElement&&t.focus(),e.preventDefault())}},e[1]=t,e[2]=a),a}var Xe=Ve,Ze=He,Qe=ie(({children:e,...t})=>(0,_.jsx)(Ue,{...t,children:(0,_.jsx)(re,{children:(0,_.jsx)(`div`,{className:`fixed inset-0 z-50 flex items-end justify-center sm:items-start sm:top-[15%]`,children:e})})}));Qe.displayName=Ue.displayName;var $e=g.forwardRef((e,t)=>{let n=(0,$.c)(9),r,i;if(n[0]!==e){let{className:t,children:a,...o}=e;r=t,i=o,n[0]=e,n[1]=r,n[2]=i}else r=n[1],i=n[2];let a;n[3]===r?a=n[4]:(a=o(`fixed inset-0 z-50 bg-background/80 backdrop-blur-xs transition-opacity animate-in fade-in`,r),n[3]=r,n[4]=a);let s;return n[5]!==i||n[6]!==t||n[7]!==a?(s=(0,_.jsx)(We,{className:a,...i,ref:t}),n[5]=i,n[6]=t,n[7]=a,n[8]=s):s=n[8],s});$e.displayName=We.displayName;var et=g.forwardRef((e,t)=>{let n=(0,$.c)(11),r,i;n[0]===e?(r=n[1],i=n[2]):({className:r,...i}=e,n[0]=e,n[1]=r,n[2]=i);let a=Ye(),s;n[3]===Symbol.for(`react.memo_cache_sentinel`)?(s=(0,_.jsx)($e,{}),n[3]=s):s=n[3];let c;n[4]===r?c=n[5]:(c=o(`fixed z-50 grid w-full max-w-2xl scale-100 gap-4 border bg-background p-6 opacity-100 shadow-sm animate-in fade-in-90 slide-in-from-bottom-10 sm:rounded-lg sm:zoom-in-90 sm:slide-in-from-bottom-0 md:w-full`,r),n[4]=r,n[5]=c);let l;return n[6]!==i||n[7]!==t||n[8]!==a||n[9]!==c?(l=(0,_.jsxs)(Qe,{children:[s,(0,_.jsx)(Ge,{ref:t,className:c,...a,...i})]}),n[6]=i,n[7]=t,n[8]=a,n[9]=c,n[10]=l):l=n[10],l});et.displayName=Ge.displayName;var tt=e=>{let t=(0,$.c)(8),n,r;t[0]===e?(n=t[1],r=t[2]):({className:n,...r}=e,t[0]=e,t[1]=n,t[2]=r);let i;t[3]===n?i=t[4]:(i=o(`flex flex-col space-y-2 text-center sm:text-left`,n),t[3]=n,t[4]=i);let a;return t[5]!==r||t[6]!==i?(a=(0,_.jsx)(`div`,{className:i,...r}),t[5]=r,t[6]=i,t[7]=a):a=t[7],a};tt.displayName=`AlertDialogHeader`;var nt=e=>{let t=(0,$.c)(8),n,r;t[0]===e?(n=t[1],r=t[2]):({className:n,...r}=e,t[0]=e,t[1]=n,t[2]=r);let i;t[3]===n?i=t[4]:(i=o(`flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2`,n),t[3]=n,t[4]=i);let a;return t[5]!==r||t[6]!==i?(a=(0,_.jsx)(`div`,{className:i,...r}),t[5]=r,t[6]=i,t[7]=a):a=t[7],a};nt.displayName=`AlertDialogFooter`;var rt=g.forwardRef((e,t)=>{let n=(0,$.c)(9),r,i;n[0]===e?(r=n[1],i=n[2]):({className:r,...i}=e,n[0]=e,n[1]=r,n[2]=i);let a;n[3]===r?a=n[4]:(a=o(`text-lg font-semibold`,r),n[3]=r,n[4]=a);let s;return n[5]!==i||n[6]!==t||n[7]!==a?(s=(0,_.jsx)(qe,{ref:t,className:a,...i}),n[5]=i,n[6]=t,n[7]=a,n[8]=s):s=n[8],s});rt.displayName=qe.displayName;var it=g.forwardRef((e,t)=>{let n=(0,$.c)(9),r,i;n[0]===e?(r=n[1],i=n[2]):({className:r,...i}=e,n[0]=e,n[1]=r,n[2]=i);let a;n[3]===r?a=n[4]:(a=o(`text-muted-foreground`,r),n[3]=r,n[4]=a);let s;return n[5]!==i||n[6]!==t||n[7]!==a?(s=(0,_.jsx)(Je,{ref:t,className:a,...i}),n[5]=i,n[6]=t,n[7]=a,n[8]=s):s=n[8],s});it.displayName=Je.displayName;var at=g.forwardRef((e,t)=>{let n=(0,$.c)(9),r,i;n[0]===e?(r=n[1],i=n[2]):({className:r,...i}=e,n[0]=e,n[1]=r,n[2]=i);let a;n[3]===r?a=n[4]:(a=o(h(),r),n[3]=r,n[4]=a);let s;return n[5]!==i||n[6]!==t||n[7]!==a?(s=(0,_.jsx)(Q,{ref:t,className:a,...i}),n[5]=i,n[6]=t,n[7]=a,n[8]=s):s=n[8],s});at.displayName=Q.displayName;var ot=g.forwardRef((e,t)=>{let n=(0,$.c)(9),r,i;n[0]===e?(r=n[1],i=n[2]):({className:r,...i}=e,n[0]=e,n[1]=r,n[2]=i);let a;n[3]===r?a=n[4]:(a=o(h({variant:`destructive`}),r),n[3]=r,n[4]=a);let s;return n[5]!==i||n[6]!==t||n[7]!==a?(s=(0,_.jsx)(Q,{ref:t,className:a,...i}),n[5]=i,n[6]=t,n[7]=a,n[8]=s):s=n[8],s});ot.displayName=`AlertDialogDestructiveAction`;var st=g.forwardRef((e,t)=>{let n=(0,$.c)(9),r,i;n[0]===e?(r=n[1],i=n[2]):({className:r,...i}=e,n[0]=e,n[1]=r,n[2]=i);let a;n[3]===r?a=n[4]:(a=o(h({variant:`secondary`}),`mt-2 sm:mt-0`,r),n[3]=r,n[4]=a);let s;return n[5]!==i||n[6]!==t||n[7]!==a?(s=(0,_.jsx)(Ke,{ref:t,className:a,...i}),n[5]=i,n[6]=t,n[7]=a,n[8]=s):s=n[8],s});st.displayName=Ke.displayName;export{B as _,it as a,tt as c,Ye as d,q as f,H as g,U as h,et as i,rt as l,K as m,at as n,ot as o,W as p,st as r,nt as s,Xe as t,Ze as u,G as v,V as y};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-B0Z9INg1.js";import{u as t}from"./useEvent-xfs0Sn4r.js";import{t as n}from"./react-CBDbhulC.js";import{t as r}from"./compiler-runtime-CYIjoINj.js";import{D as i,b as a}from"./utils-B-_Wem_I.js";import{o}from"./useEventListener-92uWqz-P.js";import{t as s}from"./cn-ldLVeaqm.js";import{t as c}from"./jsx-runtime-B74pBk57.js";import{C as l,_ as u,b as d,v as f,w as p,x as m,y as h}from"./fullscreen-BFfuaW3H.js";import{d as g,u as _}from"./menu-items-CsV3aDPH.js";import{r as v}from"./requests-C6_IaFh7.js";import{a as y}from"./useNumberFormatter-DHJ9s6Vk.js";var b=e(n(),1),x=c(),S=`Collapsible`,[ee,C]=l(S),[te,w]=ee(S),T=b.forwardRef((e,t)=>{let{__scopeCollapsible:n,open:r,defaultOpen:i,disabled:a,onOpenChange:o,...s}=e,[c,l]=h({prop:r,defaultProp:i??!1,onChange:o,caller:S});return(0,x.jsx)(te,{scope:n,disabled:a,contentId:u(),open:c,onOpenToggle:b.useCallback(()=>l(e=>!e),[l]),children:(0,x.jsx)(p.div,{"data-state":A(c),"data-disabled":a?``:void 0,...s,ref:t})})});T.displayName=S;var E=`CollapsibleTrigger`,D=b.forwardRef((e,t)=>{let{__scopeCollapsible:n,...r}=e,i=w(E,n);return(0,x.jsx)(p.button,{type:`button`,"aria-controls":i.contentId,"aria-expanded":i.open||!1,"data-state":A(i.open),"data-disabled":i.disabled?``:void 0,disabled:i.disabled,...r,ref:t,onClick:m(e.onClick,i.onOpenToggle)})});D.displayName=E;var O=`CollapsibleContent`,k=b.forwardRef((e,t)=>{let{forceMount:n,...r}=e,i=w(O,e.__scopeCollapsible);return(0,x.jsx)(f,{present:n||i.open,children:({present:e})=>(0,x.jsx)(ne,{...r,ref:t,present:e})})});k.displayName=O;var ne=b.forwardRef((e,t)=>{let{__scopeCollapsible:n,present:r,children:i,...a}=e,s=w(O,n),[c,l]=b.useState(r),u=b.useRef(null),f=o(t,u),m=b.useRef(0),h=m.current,g=b.useRef(0),_=g.current,v=s.open||c,y=b.useRef(v),S=b.useRef(void 0);return b.useEffect(()=>{let e=requestAnimationFrame(()=>y.current=!1);return()=>cancelAnimationFrame(e)},[]),d(()=>{let e=u.current;if(e){S.current=S.current||{transitionDuration:e.style.transitionDuration,animationName:e.style.animationName},e.style.transitionDuration=`0s`,e.style.animationName=`none`;let t=e.getBoundingClientRect();m.current=t.height,g.current=t.width,y.current||(e.style.transitionDuration=S.current.transitionDuration,e.style.animationName=S.current.animationName),l(r)}},[s.open,r]),(0,x.jsx)(p.div,{"data-state":A(s.open),"data-disabled":s.disabled?``:void 0,id:s.contentId,hidden:!v,...a,ref:f,style:{"--radix-collapsible-content-height":h?`${h}px`:void 0,"--radix-collapsible-content-width":_?`${_}px`:void 0,...e.style},children:v&&i})});function A(e){return e?`open`:`closed`}var re=T,ie=D,ae=k,j=`Accordion`,oe=[`Home`,`End`,`ArrowDown`,`ArrowUp`,`ArrowLeft`,`ArrowRight`],[M,se,ce]=g(j),[N,le]=l(j,[ce,C]),P=C(),F=b.forwardRef((e,t)=>{let{type:n,...r}=e,i=r,a=r;return(0,x.jsx)(M.Provider,{scope:e.__scopeAccordion,children:n===`multiple`?(0,x.jsx)(pe,{...a,ref:t}):(0,x.jsx)(fe,{...i,ref:t})})});F.displayName=j;var[I,ue]=N(j),[L,de]=N(j,{collapsible:!1}),fe=b.forwardRef((e,t)=>{let{value:n,defaultValue:r,onValueChange:i=()=>{},collapsible:a=!1,...o}=e,[s,c]=h({prop:n,defaultProp:r??``,onChange:i,caller:j});return(0,x.jsx)(I,{scope:e.__scopeAccordion,value:b.useMemo(()=>s?[s]:[],[s]),onItemOpen:c,onItemClose:b.useCallback(()=>a&&c(``),[a,c]),children:(0,x.jsx)(L,{scope:e.__scopeAccordion,collapsible:a,children:(0,x.jsx)(z,{...o,ref:t})})})}),pe=b.forwardRef((e,t)=>{let{value:n,defaultValue:r,onValueChange:i=()=>{},...a}=e,[o,s]=h({prop:n,defaultProp:r??[],onChange:i,caller:j}),c=b.useCallback(e=>s((t=[])=>[...t,e]),[s]),l=b.useCallback(e=>s((t=[])=>t.filter(t=>t!==e)),[s]);return(0,x.jsx)(I,{scope:e.__scopeAccordion,value:o,onItemOpen:c,onItemClose:l,children:(0,x.jsx)(L,{scope:e.__scopeAccordion,collapsible:!0,children:(0,x.jsx)(z,{...a,ref:t})})})}),[me,R]=N(j),z=b.forwardRef((e,t)=>{let{__scopeAccordion:n,disabled:r,dir:i,orientation:a=`vertical`,...s}=e,c=b.useRef(null),l=o(c,t),u=se(n),d=_(i)===`ltr`,f=m(e.onKeyDown,e=>{if(!oe.includes(e.key))return;let t=e.target,n=u().filter(e=>!e.ref.current?.disabled),r=n.findIndex(e=>e.ref.current===t),i=n.length;if(r===-1)return;e.preventDefault();let o=r,s=i-1,c=()=>{o=r+1,o>s&&(o=0)},l=()=>{o=r-1,o<0&&(o=s)};switch(e.key){case`Home`:o=0;break;case`End`:o=s;break;case`ArrowRight`:a===`horizontal`&&(d?c():l());break;case`ArrowDown`:a===`vertical`&&c();break;case`ArrowLeft`:a===`horizontal`&&(d?l():c());break;case`ArrowUp`:a===`vertical`&&l()}n[o%i].ref.current?.focus()});return(0,x.jsx)(me,{scope:n,disabled:r,direction:i,orientation:a,children:(0,x.jsx)(M.Slot,{scope:n,children:(0,x.jsx)(p.div,{...s,"data-orientation":a,ref:l,onKeyDown:r?void 0:f})})})}),B=`AccordionItem`,[he,V]=N(B),ge=b.forwardRef((e,t)=>{let{__scopeAccordion:n,value:r,...i}=e,a=R(B,n),o=ue(B,n),s=P(n),c=u(),l=r&&o.value.includes(r)||!1,d=a.disabled||e.disabled;return(0,x.jsx)(he,{scope:n,open:l,disabled:d,triggerId:c,children:(0,x.jsx)(re,{"data-orientation":a.orientation,"data-state":J(l),...s,...i,ref:t,disabled:d,open:l,onOpenChange:e=>{e?o.onItemOpen(r):o.onItemClose(r)}})})});ge.displayName=B;var H=`AccordionHeader`,U=b.forwardRef((e,t)=>{let{__scopeAccordion:n,...r}=e,i=R(j,n),a=V(H,n);return(0,x.jsx)(p.h3,{"data-orientation":i.orientation,"data-state":J(a.open),"data-disabled":a.disabled?``:void 0,...r,ref:t})});U.displayName=H;var W=`AccordionTrigger`,G=b.forwardRef((e,t)=>{let{__scopeAccordion:n,...r}=e,i=R(j,n),a=V(W,n),o=de(W,n),s=P(n);return(0,x.jsx)(M.ItemSlot,{scope:n,children:(0,x.jsx)(ie,{"aria-disabled":a.open&&!o.collapsible||void 0,"data-orientation":i.orientation,id:a.triggerId,...s,...r,ref:t})})});G.displayName=W;var K=`AccordionContent`,q=b.forwardRef((e,t)=>{let{__scopeAccordion:n,...r}=e,i=R(j,n),a=V(K,n),o=P(n);return(0,x.jsx)(ae,{role:`region`,"aria-labelledby":a.triggerId,"data-orientation":i.orientation,...o,...r,ref:t,style:{"--radix-accordion-content-height":`var(--radix-collapsible-content-height)`,"--radix-accordion-content-width":`var(--radix-collapsible-content-width)`,...e.style}})});q.displayName=K;function J(e){return e?`open`:`closed`}var Y=F,X=ge,_e=U,Z=G,Q=q,$=r(),ve=Y,ye=b.forwardRef((e,t)=>{let n=(0,$.c)(9),r,i;n[0]===e?(r=n[1],i=n[2]):({className:r,...i}=e,n[0]=e,n[1]=r,n[2]=i);let a;n[3]===r?a=n[4]:(a=s(`border-b`,r),n[3]=r,n[4]=a);let o;return n[5]!==i||n[6]!==t||n[7]!==a?(o=(0,x.jsx)(X,{ref:t,className:a,...i}),n[5]=i,n[6]=t,n[7]=a,n[8]=o):o=n[8],o});ye.displayName=`AccordionItem`;var be=b.forwardRef((e,t)=>{let n=(0,$.c)(12),r,i,a;n[0]===e?(r=n[1],i=n[2],a=n[3]):({className:i,children:r,...a}=e,n[0]=e,n[1]=r,n[2]=i,n[3]=a);let o;n[4]===i?o=n[5]:(o=s(`flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180 text-start`,i),n[4]=i,n[5]=o);let c;n[6]===Symbol.for(`react.memo_cache_sentinel`)?(c=(0,x.jsx)(y,{className:`h-4 w-4 transition-transform duration-200`}),n[6]=c):c=n[6];let l;return n[7]!==r||n[8]!==a||n[9]!==t||n[10]!==o?(l=(0,x.jsx)(_e,{className:`flex`,children:(0,x.jsxs)(Z,{ref:t,className:o,...a,children:[r,c]})}),n[7]=r,n[8]=a,n[9]=t,n[10]=o,n[11]=l):l=n[11],l});be.displayName=Z.displayName;var xe=b.forwardRef((e,t)=>{let n=(0,$.c)(17),r,i,a,o;n[0]===e?(r=n[1],i=n[2],a=n[3],o=n[4]):({className:i,children:r,wrapperClassName:o,...a}=e,n[0]=e,n[1]=r,n[2]=i,n[3]=a,n[4]=o);let c;n[5]===i?c=n[6]:(c=s(`overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down`,i),n[5]=i,n[6]=c);let l;n[7]===o?l=n[8]:(l=s(`pb-4 pt-0`,o),n[7]=o,n[8]=l);let u;n[9]!==r||n[10]!==l?(u=(0,x.jsx)(`div`,{className:l,children:r}),n[9]=r,n[10]=l,n[11]=u):u=n[11];let d;return n[12]!==a||n[13]!==t||n[14]!==c||n[15]!==u?(d=(0,x.jsx)(Q,{ref:t,className:c,...a,children:u}),n[12]=a,n[13]=t,n[14]=c,n[15]=u,n[16]=d):d=n[16],d});xe.displayName=Q.displayName;var Se=class{map=new Map;get(e){return this.map.get(e)??[]}set(e,t){this.map.set(e,t)}add(e,t){this.map.has(e)?this.map.get(e).push(t):this.map.set(e,[t])}has(e){return this.map.has(e)}delete(e){return this.map.delete(e)}clear(){this.map.clear()}keys(){return this.map.keys()}values(){return this.map.values()}entries(){return this.map.entries()}forEach(e){this.map.forEach(e)}flatValues(){let e=[];for(let t of this.map.values())e.push(...t);return e}get size(){return this.map.size}},Ce=e=>{switch(e){case`chat`:return`chat_model`;case`autocomplete`:return`autocomplete_model`;case`edit`:return`edit_model`}},we=()=>{let e=(0,$.c)(10),n=t(i),{saveUserConfig:r}=v(),o;e[0]!==r||e[1]!==n?(o=async e=>{let t={ai:e};await r({config:t}).then(()=>{n(e=>a(e,t))})},e[0]=r,e[1]=n,e[2]=o):o=e[2];let s=o,c;e[3]===s?c=e[4]:(c=async(e,t)=>{let n=Ce(t);n&&await s({models:{[n]:e}})},e[3]=s,e[4]=c);let l=c,u;e[5]===s?u=e[6]:(u=async e=>{await s({mode:e})},e[5]=s,e[6]=u);let d=u,f;return e[7]!==d||e[8]!==l?(f={saveModelChange:l,saveModeChange:d},e[7]=d,e[8]=l,e[9]=f):f=e[9],f};export{ye as a,X as c,xe as i,Y as l,Se as n,be as o,ve as r,Q as s,we as t,Z as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-B0Z9INg1.js";import{t}from"./react-CBDbhulC.js";import{t as n}from"./compiler-runtime-CYIjoINj.js";import{a as r,o as i,r as a}from"./useEventListener-92uWqz-P.js";import{t as o}from"./cn-ldLVeaqm.js";import{t as s}from"./jsx-runtime-B74pBk57.js";import{C as c,T as l,_ as u,c as d,d as f,f as p,g as m,i as h,m as ee,o as te,r as ne,s as g,t as re,u as ie,v as _,w as v,x as y,y as ae}from"./fullscreen-BFfuaW3H.js";import{a as b,i as oe,n as x,r as se,t as S}from"./dist-ConG15vZ.js";import{a as C,c as w,d as T,i as ce,l as E,n as le,o as D,r as O,s as ue,u as de}from"./menu-items-CsV3aDPH.js";import{i as k,n as fe,r as pe,t as me}from"./circle-BiW8b6Xq.js";import{t as he}from"./check-BoA6XBpj.js";import{t as ge}from"./chevron-right-CKA5zVsM.js";var A=e(t(),1),j=s(),_e=[`Enter`,` `],ve=[`ArrowDown`,`PageUp`,`Home`],ye=[`ArrowUp`,`PageDown`,`End`],be=[...ve,...ye],xe={ltr:[..._e,`ArrowRight`],rtl:[..._e,`ArrowLeft`]},Se={ltr:[`ArrowLeft`],rtl:[`ArrowRight`]},M=`Menu`,[N,Ce,we]=T(M),[P,Te]=c(M,[we,b,k]),F=b(),Ee=k(),[De,I]=P(M),[Oe,L]=P(M),ke=e=>{let{__scopeMenu:t,open:n=!1,children:r,dir:i,onOpenChange:a,modal:o=!0}=e,s=F(t),[c,l]=A.useState(null),u=A.useRef(!1),d=m(a),f=de(i);return A.useEffect(()=>{let e=()=>{u.current=!0,document.addEventListener(`pointerdown`,t,{capture:!0,once:!0}),document.addEventListener(`pointermove`,t,{capture:!0,once:!0})},t=()=>u.current=!1;return document.addEventListener(`keydown`,e,{capture:!0}),()=>{document.removeEventListener(`keydown`,e,{capture:!0}),document.removeEventListener(`pointerdown`,t,{capture:!0}),document.removeEventListener(`pointermove`,t,{capture:!0})}},[]),(0,j.jsx)(oe,{...s,children:(0,j.jsx)(De,{scope:t,open:n,onOpenChange:d,content:c,onContentChange:l,children:(0,j.jsx)(Oe,{scope:t,onClose:A.useCallback(()=>d(!1),[d]),isUsingKeyboardRef:u,dir:f,modal:o,children:r})})})};ke.displayName=M;var Ae=`MenuAnchor`,R=A.forwardRef((e,t)=>{let{__scopeMenu:n,...r}=e,i=F(n);return(0,j.jsx)(S,{...i,...r,ref:t})});R.displayName=Ae;var z=`MenuPortal`,[je,Me]=P(z,{forceMount:void 0}),Ne=e=>{let{__scopeMenu:t,forceMount:n,children:r,container:i}=e,a=I(z,t);return(0,j.jsx)(je,{scope:t,forceMount:n,children:(0,j.jsx)(_,{present:n||a.open,children:(0,j.jsx)(f,{asChild:!0,container:i,children:r})})})};Ne.displayName=z;var B=`MenuContent`,[Pe,V]=P(B),Fe=A.forwardRef((e,t)=>{let n=Me(B,e.__scopeMenu),{forceMount:r=n.forceMount,...i}=e,a=I(B,e.__scopeMenu),o=L(B,e.__scopeMenu);return(0,j.jsx)(N.Provider,{scope:e.__scopeMenu,children:(0,j.jsx)(_,{present:r||a.open,children:(0,j.jsx)(N.Slot,{scope:e.__scopeMenu,children:o.modal?(0,j.jsx)(Ie,{...i,ref:t}):(0,j.jsx)(Le,{...i,ref:t})})})})}),Ie=A.forwardRef((e,t)=>{let n=I(B,e.__scopeMenu),r=A.useRef(null),a=i(t,r);return A.useEffect(()=>{let e=r.current;if(e)return g(e)},[]),(0,j.jsx)(H,{...e,ref:a,trapFocus:n.open,disableOutsidePointerEvents:n.open,disableOutsideScroll:!0,onFocusOutside:y(e.onFocusOutside,e=>e.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>n.onOpenChange(!1)})}),Le=A.forwardRef((e,t)=>{let n=I(B,e.__scopeMenu);return(0,j.jsx)(H,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>n.onOpenChange(!1)})}),Re=a(`MenuContent.ScrollLock`),H=A.forwardRef((e,t)=>{let{__scopeMenu:n,loop:r=!1,trapFocus:a,onOpenAutoFocus:o,onCloseAutoFocus:s,disableOutsidePointerEvents:c,onEntryFocus:l,onEscapeKeyDown:u,onPointerDownOutside:f,onFocusOutside:m,onInteractOutside:h,onDismiss:te,disableOutsideScroll:ne,...g}=e,re=I(B,n),_=L(B,n),v=F(n),ae=Ee(n),b=Ce(n),[oe,x]=A.useState(null),S=A.useRef(null),C=i(t,S,re.onContentChange),w=A.useRef(0),T=A.useRef(``),ce=A.useRef(0),E=A.useRef(null),le=A.useRef(`right`),D=A.useRef(0),O=ne?d:A.Fragment,ue=ne?{as:Re,allowPinchZoom:!0}:void 0,de=e=>{let t=T.current+e,n=b().filter(e=>!e.disabled),r=document.activeElement,i=n.find(e=>e.ref.current===r)?.textValue,a=ht(n.map(e=>e.textValue),t,i),o=n.find(e=>e.textValue===a)?.ref.current;(function e(t){T.current=t,window.clearTimeout(w.current),t!==``&&(w.current=window.setTimeout(()=>e(``),1e3))})(t),o&&setTimeout(()=>o.focus())};A.useEffect(()=>()=>window.clearTimeout(w.current),[]),ie();let k=A.useCallback(e=>le.current===E.current?.side&&_t(e,E.current?.area),[]);return(0,j.jsx)(Pe,{scope:n,searchRef:T,onItemEnter:A.useCallback(e=>{k(e)&&e.preventDefault()},[k]),onItemLeave:A.useCallback(e=>{k(e)||(S.current?.focus(),x(null))},[k]),onTriggerLeave:A.useCallback(e=>{k(e)&&e.preventDefault()},[k]),pointerGraceTimerRef:ce,onPointerGraceIntentChange:A.useCallback(e=>{E.current=e},[]),children:(0,j.jsx)(O,{...ue,children:(0,j.jsx)(p,{asChild:!0,trapped:a,onMountAutoFocus:y(o,e=>{e.preventDefault(),S.current?.focus({preventScroll:!0})}),onUnmountAutoFocus:s,children:(0,j.jsx)(ee,{asChild:!0,disableOutsidePointerEvents:c,onEscapeKeyDown:u,onPointerDownOutside:f,onFocusOutside:m,onInteractOutside:h,onDismiss:te,children:(0,j.jsx)(pe,{asChild:!0,...ae,dir:_.dir,orientation:`vertical`,loop:r,currentTabStopId:oe,onCurrentTabStopIdChange:x,onEntryFocus:y(l,e=>{_.isUsingKeyboardRef.current||e.preventDefault()}),preventScrollOnEntryFocus:!0,children:(0,j.jsx)(se,{role:`menu`,"aria-orientation":`vertical`,"data-state":dt(re.open),"data-radix-menu-content":``,dir:_.dir,...v,...g,ref:C,style:{outline:`none`,...g.style},onKeyDown:y(g.onKeyDown,e=>{let t=e.target.closest(`[data-radix-menu-content]`)===e.currentTarget,n=e.ctrlKey||e.altKey||e.metaKey,r=e.key.length===1;t&&(e.key===`Tab`&&e.preventDefault(),!n&&r&&de(e.key));let i=S.current;if(e.target!==i||!be.includes(e.key))return;e.preventDefault();let a=b().filter(e=>!e.disabled).map(e=>e.ref.current);ye.includes(e.key)&&a.reverse(),pt(a)}),onBlur:y(e.onBlur,e=>{e.currentTarget.contains(e.target)||(window.clearTimeout(w.current),T.current=``)}),onPointerMove:y(e.onPointerMove,X(e=>{let t=e.target,n=D.current!==e.clientX;if(e.currentTarget.contains(t)&&n){let t=e.clientX>D.current?`right`:`left`;le.current=t,D.current=e.clientX}}))})})})})})})});Fe.displayName=B;var ze=`MenuGroup`,U=A.forwardRef((e,t)=>{let{__scopeMenu:n,...r}=e;return(0,j.jsx)(v.div,{role:`group`,...r,ref:t})});U.displayName=ze;var Be=`MenuLabel`,Ve=A.forwardRef((e,t)=>{let{__scopeMenu:n,...r}=e;return(0,j.jsx)(v.div,{...r,ref:t})});Ve.displayName=Be;var W=`MenuItem`,He=`menu.itemSelect`,G=A.forwardRef((e,t)=>{let{disabled:n=!1,onSelect:r,...a}=e,o=A.useRef(null),s=L(W,e.__scopeMenu),c=V(W,e.__scopeMenu),u=i(t,o),d=A.useRef(!1),f=()=>{let e=o.current;if(!n&&e){let t=new CustomEvent(He,{bubbles:!0,cancelable:!0});e.addEventListener(He,e=>r?.(e),{once:!0}),l(e,t),t.defaultPrevented?d.current=!1:s.onClose()}};return(0,j.jsx)(Ue,{...a,ref:u,disabled:n,onClick:y(e.onClick,f),onPointerDown:t=>{e.onPointerDown?.(t),d.current=!0},onPointerUp:y(e.onPointerUp,e=>{d.current||e.currentTarget?.click()}),onKeyDown:y(e.onKeyDown,e=>{let t=c.searchRef.current!==``;n||t&&e.key===` `||_e.includes(e.key)&&(e.currentTarget.click(),e.preventDefault())})})});G.displayName=W;var Ue=A.forwardRef((e,t)=>{let{__scopeMenu:n,disabled:r=!1,textValue:a,...o}=e,s=V(W,n),c=Ee(n),l=A.useRef(null),u=i(t,l),[d,f]=A.useState(!1),[p,m]=A.useState(``);return A.useEffect(()=>{let e=l.current;e&&m((e.textContent??``).trim())},[o.children]),(0,j.jsx)(N.ItemSlot,{scope:n,disabled:r,textValue:a??p,children:(0,j.jsx)(fe,{asChild:!0,...c,focusable:!r,children:(0,j.jsx)(v.div,{role:`menuitem`,"data-highlighted":d?``:void 0,"aria-disabled":r||void 0,"data-disabled":r?``:void 0,...o,ref:u,onPointerMove:y(e.onPointerMove,X(e=>{r?s.onItemLeave(e):(s.onItemEnter(e),e.defaultPrevented||e.currentTarget.focus({preventScroll:!0}))})),onPointerLeave:y(e.onPointerLeave,X(e=>s.onItemLeave(e))),onFocus:y(e.onFocus,()=>f(!0)),onBlur:y(e.onBlur,()=>f(!1))})})})}),We=`MenuCheckboxItem`,Ge=A.forwardRef((e,t)=>{let{checked:n=!1,onCheckedChange:r,...i}=e;return(0,j.jsx)(Qe,{scope:e.__scopeMenu,checked:n,children:(0,j.jsx)(G,{role:`menuitemcheckbox`,"aria-checked":Y(n)?`mixed`:n,...i,ref:t,"data-state":ft(n),onSelect:y(i.onSelect,()=>r?.(Y(n)?!0:!n),{checkForDefaultPrevented:!1})})})});Ge.displayName=We;var Ke=`MenuRadioGroup`,[qe,Je]=P(Ke,{value:void 0,onValueChange:()=>{}}),Ye=A.forwardRef((e,t)=>{let{value:n,onValueChange:r,...i}=e,a=m(r);return(0,j.jsx)(qe,{scope:e.__scopeMenu,value:n,onValueChange:a,children:(0,j.jsx)(U,{...i,ref:t})})});Ye.displayName=Ke;var Xe=`MenuRadioItem`,Ze=A.forwardRef((e,t)=>{let{value:n,...r}=e,i=Je(Xe,e.__scopeMenu),a=n===i.value;return(0,j.jsx)(Qe,{scope:e.__scopeMenu,checked:a,children:(0,j.jsx)(G,{role:`menuitemradio`,"aria-checked":a,...r,ref:t,"data-state":ft(a),onSelect:y(r.onSelect,()=>i.onValueChange?.(n),{checkForDefaultPrevented:!1})})})});Ze.displayName=Xe;var K=`MenuItemIndicator`,[Qe,$e]=P(K,{checked:!1}),et=A.forwardRef((e,t)=>{let{__scopeMenu:n,forceMount:r,...i}=e,a=$e(K,n);return(0,j.jsx)(_,{present:r||Y(a.checked)||a.checked===!0,children:(0,j.jsx)(v.span,{...i,ref:t,"data-state":ft(a.checked)})})});et.displayName=K;var tt=`MenuSeparator`,nt=A.forwardRef((e,t)=>{let{__scopeMenu:n,...r}=e;return(0,j.jsx)(v.div,{role:`separator`,"aria-orientation":`horizontal`,...r,ref:t})});nt.displayName=tt;var rt=`MenuArrow`,it=A.forwardRef((e,t)=>{let{__scopeMenu:n,...r}=e,i=F(n);return(0,j.jsx)(x,{...i,...r,ref:t})});it.displayName=rt;var q=`MenuSub`,[at,ot]=P(q),st=e=>{let{__scopeMenu:t,children:n,open:r=!1,onOpenChange:i}=e,a=I(q,t),o=F(t),[s,c]=A.useState(null),[l,d]=A.useState(null),f=m(i);return A.useEffect(()=>(a.open===!1&&f(!1),()=>f(!1)),[a.open,f]),(0,j.jsx)(oe,{...o,children:(0,j.jsx)(De,{scope:t,open:r,onOpenChange:f,content:l,onContentChange:d,children:(0,j.jsx)(at,{scope:t,contentId:u(),triggerId:u(),trigger:s,onTriggerChange:c,children:n})})})};st.displayName=q;var J=`MenuSubTrigger`,ct=A.forwardRef((e,t)=>{let n=I(J,e.__scopeMenu),i=L(J,e.__scopeMenu),a=ot(J,e.__scopeMenu),o=V(J,e.__scopeMenu),s=A.useRef(null),{pointerGraceTimerRef:c,onPointerGraceIntentChange:l}=o,u={__scopeMenu:e.__scopeMenu},d=A.useCallback(()=>{s.current&&window.clearTimeout(s.current),s.current=null},[]);return A.useEffect(()=>d,[d]),A.useEffect(()=>{let e=c.current;return()=>{window.clearTimeout(e),l(null)}},[c,l]),(0,j.jsx)(R,{asChild:!0,...u,children:(0,j.jsx)(Ue,{id:a.triggerId,"aria-haspopup":`menu`,"aria-expanded":n.open,"aria-controls":a.contentId,"data-state":dt(n.open),...e,ref:r(t,a.onTriggerChange),onClick:t=>{e.onClick?.(t),!(e.disabled||t.defaultPrevented)&&(t.currentTarget.focus(),n.open||n.onOpenChange(!0))},onPointerMove:y(e.onPointerMove,X(t=>{o.onItemEnter(t),!t.defaultPrevented&&!e.disabled&&!n.open&&!s.current&&(o.onPointerGraceIntentChange(null),s.current=window.setTimeout(()=>{n.onOpenChange(!0),d()},100))})),onPointerLeave:y(e.onPointerLeave,X(e=>{d();let t=n.content?.getBoundingClientRect();if(t){let r=n.content?.dataset.side,i=r===`right`,a=i?-5:5,s=t[i?`left`:`right`],l=t[i?`right`:`left`];o.onPointerGraceIntentChange({area:[{x:e.clientX+a,y:e.clientY},{x:s,y:t.top},{x:l,y:t.top},{x:l,y:t.bottom},{x:s,y:t.bottom}],side:r}),window.clearTimeout(c.current),c.current=window.setTimeout(()=>o.onPointerGraceIntentChange(null),300)}else{if(o.onTriggerLeave(e),e.defaultPrevented)return;o.onPointerGraceIntentChange(null)}})),onKeyDown:y(e.onKeyDown,t=>{let r=o.searchRef.current!==``;e.disabled||r&&t.key===` `||xe[i.dir].includes(t.key)&&(n.onOpenChange(!0),n.content?.focus(),t.preventDefault())})})})});ct.displayName=J;var lt=`MenuSubContent`,ut=A.forwardRef((e,t)=>{let n=Me(B,e.__scopeMenu),{forceMount:r=n.forceMount,...a}=e,o=I(B,e.__scopeMenu),s=L(B,e.__scopeMenu),c=ot(lt,e.__scopeMenu),l=A.useRef(null),u=i(t,l);return(0,j.jsx)(N.Provider,{scope:e.__scopeMenu,children:(0,j.jsx)(_,{present:r||o.open,children:(0,j.jsx)(N.Slot,{scope:e.__scopeMenu,children:(0,j.jsx)(H,{id:c.contentId,"aria-labelledby":c.triggerId,...a,ref:u,align:`start`,side:s.dir===`rtl`?`left`:`right`,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,trapFocus:!1,onOpenAutoFocus:e=>{s.isUsingKeyboardRef.current&&l.current?.focus(),e.preventDefault()},onCloseAutoFocus:e=>e.preventDefault(),onFocusOutside:y(e.onFocusOutside,e=>{e.target!==c.trigger&&o.onOpenChange(!1)}),onEscapeKeyDown:y(e.onEscapeKeyDown,e=>{s.onClose(),e.preventDefault()}),onKeyDown:y(e.onKeyDown,e=>{let t=e.currentTarget.contains(e.target),n=Se[s.dir].includes(e.key);t&&n&&(o.onOpenChange(!1),c.trigger?.focus(),e.preventDefault())})})})})})});ut.displayName=lt;function dt(e){return e?`open`:`closed`}function Y(e){return e===`indeterminate`}function ft(e){return Y(e)?`indeterminate`:e?`checked`:`unchecked`}function pt(e){let t=document.activeElement;for(let n of e)if(n===t||(n.focus(),document.activeElement!==t))return}function mt(e,t){return e.map((n,r)=>e[(t+r)%e.length])}function ht(e,t,n){let r=t.length>1&&Array.from(t).every(e=>e===t[0])?t[0]:t,i=n?e.indexOf(n):-1,a=mt(e,Math.max(i,0));r.length===1&&(a=a.filter(e=>e!==n));let o=a.find(e=>e.toLowerCase().startsWith(r.toLowerCase()));return o===n?void 0:o}function gt(e,t){let{x:n,y:r}=e,i=!1;for(let e=0,a=t.length-1;e<t.length;a=e++){let o=t[e],s=t[a],c=o.x,l=o.y,u=s.x,d=s.y;l>r!=d>r&&n<(u-c)*(r-l)/(d-l)+c&&(i=!i)}return i}function _t(e,t){return t?gt({x:e.clientX,y:e.clientY},t):!1}function X(e){return t=>t.pointerType===`mouse`?e(t):void 0}var vt=ke,yt=R,bt=Ne,xt=Fe,St=U,Ct=Ve,wt=G,Tt=Ge,Et=Ye,Dt=Ze,Ot=et,kt=nt,At=it,jt=st,Mt=ct,Nt=ut,Z=`DropdownMenu`,[Pt,Ft]=c(Z,[Te]),Q=Te(),[It,Lt]=Pt(Z),Rt=e=>{let{__scopeDropdownMenu:t,children:n,dir:r,open:i,defaultOpen:a,onOpenChange:o,modal:s=!0}=e,c=Q(t),l=A.useRef(null),[d,f]=ae({prop:i,defaultProp:a??!1,onChange:o,caller:Z});return(0,j.jsx)(It,{scope:t,triggerId:u(),triggerRef:l,contentId:u(),open:d,onOpenChange:f,onOpenToggle:A.useCallback(()=>f(e=>!e),[f]),modal:s,children:(0,j.jsx)(vt,{...c,open:d,onOpenChange:f,dir:r,modal:s,children:n})})};Rt.displayName=Z;var zt=`DropdownMenuTrigger`,Bt=A.forwardRef((e,t)=>{let{__scopeDropdownMenu:n,disabled:i=!1,...a}=e,o=Lt(zt,n),s=Q(n);return(0,j.jsx)(yt,{asChild:!0,...s,children:(0,j.jsx)(v.button,{type:`button`,id:o.triggerId,"aria-haspopup":`menu`,"aria-expanded":o.open,"aria-controls":o.open?o.contentId:void 0,"data-state":o.open?`open`:`closed`,"data-disabled":i?``:void 0,disabled:i,...a,ref:r(t,o.triggerRef),onPointerDown:y(e.onPointerDown,e=>{!i&&e.button===0&&e.ctrlKey===!1&&(o.onOpenToggle(),o.open||e.preventDefault())}),onKeyDown:y(e.onKeyDown,e=>{i||([`Enter`,` `].includes(e.key)&&o.onOpenToggle(),e.key===`ArrowDown`&&o.onOpenChange(!0),[`Enter`,` `,`ArrowDown`].includes(e.key)&&e.preventDefault())})})})});Bt.displayName=zt;var Vt=`DropdownMenuPortal`,Ht=e=>{let{__scopeDropdownMenu:t,...n}=e,r=Q(t);return(0,j.jsx)(bt,{...r,...n})};Ht.displayName=Vt;var Ut=`DropdownMenuContent`,Wt=A.forwardRef((e,t)=>{let{__scopeDropdownMenu:n,...r}=e,i=Lt(Ut,n),a=Q(n),o=A.useRef(!1);return(0,j.jsx)(xt,{id:i.contentId,"aria-labelledby":i.triggerId,...a,...r,ref:t,onCloseAutoFocus:y(e.onCloseAutoFocus,e=>{o.current||i.triggerRef.current?.focus(),o.current=!1,e.preventDefault()}),onInteractOutside:y(e.onInteractOutside,e=>{let t=e.detail.originalEvent,n=t.button===0&&t.ctrlKey===!0,r=t.button===2||n;(!i.modal||r)&&(o.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":`var(--radix-popper-transform-origin)`,"--radix-dropdown-menu-content-available-width":`var(--radix-popper-available-width)`,"--radix-dropdown-menu-content-available-height":`var(--radix-popper-available-height)`,"--radix-dropdown-menu-trigger-width":`var(--radix-popper-anchor-width)`,"--radix-dropdown-menu-trigger-height":`var(--radix-popper-anchor-height)`}})});Wt.displayName=Ut;var Gt=`DropdownMenuGroup`,Kt=A.forwardRef((e,t)=>{let{__scopeDropdownMenu:n,...r}=e,i=Q(n);return(0,j.jsx)(St,{...i,...r,ref:t})});Kt.displayName=Gt;var qt=`DropdownMenuLabel`,Jt=A.forwardRef((e,t)=>{let{__scopeDropdownMenu:n,...r}=e,i=Q(n);return(0,j.jsx)(Ct,{...i,...r,ref:t})});Jt.displayName=qt;var Yt=`DropdownMenuItem`,Xt=A.forwardRef((e,t)=>{let{__scopeDropdownMenu:n,...r}=e,i=Q(n);return(0,j.jsx)(wt,{...i,...r,ref:t})});Xt.displayName=Yt;var Zt=`DropdownMenuCheckboxItem`,Qt=A.forwardRef((e,t)=>{let{__scopeDropdownMenu:n,...r}=e,i=Q(n);return(0,j.jsx)(Tt,{...i,...r,ref:t})});Qt.displayName=Zt;var $t=`DropdownMenuRadioGroup`,en=A.forwardRef((e,t)=>{let{__scopeDropdownMenu:n,...r}=e,i=Q(n);return(0,j.jsx)(Et,{...i,...r,ref:t})});en.displayName=$t;var tn=`DropdownMenuRadioItem`,nn=A.forwardRef((e,t)=>{let{__scopeDropdownMenu:n,...r}=e,i=Q(n);return(0,j.jsx)(Dt,{...i,...r,ref:t})});nn.displayName=tn;var rn=`DropdownMenuItemIndicator`,an=A.forwardRef((e,t)=>{let{__scopeDropdownMenu:n,...r}=e,i=Q(n);return(0,j.jsx)(Ot,{...i,...r,ref:t})});an.displayName=rn;var on=`DropdownMenuSeparator`,sn=A.forwardRef((e,t)=>{let{__scopeDropdownMenu:n,...r}=e,i=Q(n);return(0,j.jsx)(kt,{...i,...r,ref:t})});sn.displayName=on;var cn=`DropdownMenuArrow`,ln=A.forwardRef((e,t)=>{let{__scopeDropdownMenu:n,...r}=e,i=Q(n);return(0,j.jsx)(At,{...i,...r,ref:t})});ln.displayName=cn;var un=e=>{let{__scopeDropdownMenu:t,children:n,open:r,onOpenChange:i,defaultOpen:a}=e,o=Q(t),[s,c]=ae({prop:r,defaultProp:a??!1,onChange:i,caller:`DropdownMenuSub`});return(0,j.jsx)(jt,{...o,open:s,onOpenChange:c,children:n})},dn=`DropdownMenuSubTrigger`,fn=A.forwardRef((e,t)=>{let{__scopeDropdownMenu:n,...r}=e,i=Q(n);return(0,j.jsx)(Mt,{...i,...r,ref:t})});fn.displayName=dn;var pn=`DropdownMenuSubContent`,mn=A.forwardRef((e,t)=>{let{__scopeDropdownMenu:n,...r}=e,i=Q(n);return(0,j.jsx)(Nt,{...i,...r,ref:t,style:{...e.style,"--radix-dropdown-menu-content-transform-origin":`var(--radix-popper-transform-origin)`,"--radix-dropdown-menu-content-available-width":`var(--radix-popper-available-width)`,"--radix-dropdown-menu-content-available-height":`var(--radix-popper-available-height)`,"--radix-dropdown-menu-trigger-width":`var(--radix-popper-anchor-width)`,"--radix-dropdown-menu-trigger-height":`var(--radix-popper-anchor-height)`}})});mn.displayName=pn;var hn=Rt,gn=Bt,_n=Ht,vn=Wt,yn=Kt,bn=Jt,xn=Xt,Sn=Qt,Cn=nn,wn=an,Tn=sn,En=un,Dn=fn,On=mn,$=n(),kn=hn,An=gn,jn=yn,Mn=ne(_n),Nn=h(vn),Pn=h(On),Fn=En,In=A.forwardRef((e,t)=>{let n=(0,$.c)(17),r,i,a,o,s;n[0]===e?(r=n[1],i=n[2],a=n[3],o=n[4],s=n[5]):({className:i,inset:a,showChevron:s,children:r,...o}=e,n[0]=e,n[1]=r,n[2]=i,n[3]=a,n[4]=o,n[5]=s);let c=s===void 0||s,l;n[6]!==i||n[7]!==a?(l=E({className:i,inset:a}),n[6]=i,n[7]=a,n[8]=l):l=n[8];let u;n[9]===c?u=n[10]:(u=c&&(0,j.jsx)(ge,{className:`ml-auto h-4 w-4`}),n[9]=c,n[10]=u);let d;return n[11]!==r||n[12]!==o||n[13]!==t||n[14]!==l||n[15]!==u?(d=(0,j.jsxs)(Dn,{ref:t,className:l,...o,children:[r,u]}),n[11]=r,n[12]=o,n[13]=t,n[14]=l,n[15]=u,n[16]=d):d=n[16],d});In.displayName=Dn.displayName;var Ln=A.forwardRef((e,t)=>{let n=(0,$.c)(9),r,i;n[0]===e?(r=n[1],i=n[2]):({className:r,...i}=e,n[0]=e,n[1]=r,n[2]=i);let a;n[3]===r?a=n[4]:(a=o(O({subcontent:!0}),`animate-in data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1`,r),n[3]=r,n[4]=a);let s;return n[5]!==i||n[6]!==t||n[7]!==a?(s=(0,j.jsx)(Pn,{ref:t,className:a,...i}),n[5]=i,n[6]=t,n[7]=a,n[8]=s):s=n[8],s});Ln.displayName=On.displayName;var Rn=A.forwardRef((e,t)=>{let n=(0,$.c)(17),r,i,a,s;n[0]===e?(r=n[1],i=n[2],a=n[3],s=n[4]):({className:r,scrollable:a,sideOffset:s,...i}=e,n[0]=e,n[1]=r,n[2]=i,n[3]=a,n[4]=s);let c=a===void 0||a,l=s===void 0?4:s,u;n[5]!==r||n[6]!==c?(u=o(O(),`animate-in data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 print:hidden`,c&&`overflow-auto`,r),n[5]=r,n[6]=c,n[7]=u):u=n[7];let d=c?`calc(var(--radix-dropdown-menu-content-available-height) - ${re}px)`:void 0,f;n[8]!==i.style||n[9]!==d?(f={...i.style,maxHeight:d},n[8]=i.style,n[9]=d,n[10]=f):f=n[10];let p;return n[11]!==i||n[12]!==t||n[13]!==l||n[14]!==u||n[15]!==f?(p=(0,j.jsx)(Mn,{children:(0,j.jsx)(te,{children:(0,j.jsx)(Nn,{ref:t,sideOffset:l,className:u,style:f,...i})})}),n[11]=i,n[12]=t,n[13]=l,n[14]=u,n[15]=f,n[16]=p):p=n[16],p});Rn.displayName=vn.displayName;var zn=A.forwardRef((e,t)=>{let n=(0,$.c)(13),r,i,a,o;n[0]===e?(r=n[1],i=n[2],a=n[3],o=n[4]):({className:r,inset:i,variant:o,...a}=e,n[0]=e,n[1]=r,n[2]=i,n[3]=a,n[4]=o);let s;n[5]!==r||n[6]!==i||n[7]!==o?(s=D({className:r,inset:i,variant:o}),n[5]=r,n[6]=i,n[7]=o,n[8]=s):s=n[8];let c;return n[9]!==a||n[10]!==t||n[11]!==s?(c=(0,j.jsx)(xn,{ref:t,className:s,...a}),n[9]=a,n[10]=t,n[11]=s,n[12]=c):c=n[12],c});zn.displayName=xn.displayName;var Bn=A.forwardRef((e,t)=>{let n=(0,$.c)(15),r,i,a,o;n[0]===e?(r=n[1],i=n[2],a=n[3],o=n[4]):({className:a,children:i,checked:r,...o}=e,n[0]=e,n[1]=r,n[2]=i,n[3]=a,n[4]=o);let s;n[5]===a?s=n[6]:(s=C({className:a}),n[5]=a,n[6]=s);let c;n[7]===Symbol.for(`react.memo_cache_sentinel`)?(c=ce(),n[7]=c):c=n[7];let l;n[8]===Symbol.for(`react.memo_cache_sentinel`)?(l=(0,j.jsx)(`span`,{className:c,children:(0,j.jsx)(wn,{children:(0,j.jsx)(he,{className:`h-4 w-4`})})}),n[8]=l):l=n[8];let u;return n[9]!==r||n[10]!==i||n[11]!==o||n[12]!==t||n[13]!==s?(u=(0,j.jsxs)(Sn,{ref:t,className:s,checked:r,...o,children:[l,i]}),n[9]=r,n[10]=i,n[11]=o,n[12]=t,n[13]=s,n[14]=u):u=n[14],u});Bn.displayName=Sn.displayName;var Vn=A.forwardRef((e,t)=>{let n=(0,$.c)(13),r,i,a;n[0]===e?(r=n[1],i=n[2],a=n[3]):({className:i,children:r,...a}=e,n[0]=e,n[1]=r,n[2]=i,n[3]=a);let o;n[4]===i?o=n[5]:(o=C({className:i}),n[4]=i,n[5]=o);let s;n[6]===Symbol.for(`react.memo_cache_sentinel`)?(s=ce(),n[6]=s):s=n[6];let c;n[7]===Symbol.for(`react.memo_cache_sentinel`)?(c=(0,j.jsx)(`span`,{className:s,children:(0,j.jsx)(wn,{children:(0,j.jsx)(me,{className:`h-2 w-2 fill-current`})})}),n[7]=c):c=n[7];let l;return n[8]!==r||n[9]!==a||n[10]!==t||n[11]!==o?(l=(0,j.jsxs)(Cn,{ref:t,className:o,...a,children:[c,r]}),n[8]=r,n[9]=a,n[10]=t,n[11]=o,n[12]=l):l=n[12],l});Vn.displayName=Cn.displayName;var Hn=A.forwardRef((e,t)=>{let n=(0,$.c)(11),r,i,a;n[0]===e?(r=n[1],i=n[2],a=n[3]):({className:r,inset:i,...a}=e,n[0]=e,n[1]=r,n[2]=i,n[3]=a);let o;n[4]!==r||n[5]!==i?(o=ue({className:r,inset:i}),n[4]=r,n[5]=i,n[6]=o):o=n[6];let s;return n[7]!==a||n[8]!==t||n[9]!==o?(s=(0,j.jsx)(bn,{ref:t,className:o,...a}),n[7]=a,n[8]=t,n[9]=o,n[10]=s):s=n[10],s});Hn.displayName=bn.displayName;var Un=A.forwardRef((e,t)=>{let n=(0,$.c)(9),r,i;n[0]===e?(r=n[1],i=n[2]):({className:r,...i}=e,n[0]=e,n[1]=r,n[2]=i);let a;n[3]===r?a=n[4]:(a=w({className:r}),n[3]=r,n[4]=a);let o;return n[5]!==i||n[6]!==t||n[7]!==a?(o=(0,j.jsx)(Tn,{ref:t,className:a,...i}),n[5]=i,n[6]=t,n[7]=a,n[8]=o):o=n[8],o});Un.displayName=Tn.displayName;var Wn=le;export{Te as A,Et as C,jt as D,kt as E,Nt as O,bt as S,vt as T,xt as _,zn as a,Ot as b,Un as c,Ln as d,In as f,Tt as g,At as h,jn as i,Mt as k,Wn as l,yt as m,Bn as n,Hn as o,An as p,Rn as r,Mn as s,kn as t,Fn as u,St as v,Dt as w,Ct as x,wt as y};
|