groove-dev 0.27.71 → 0.27.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/node_modules/@groove-dev/cli/package.json +1 -1
  2. package/node_modules/@groove-dev/daemon/package.json +1 -1
  3. package/node_modules/@groove-dev/daemon/src/api.js +38 -27
  4. package/node_modules/@groove-dev/daemon/src/providers/claude-code.js +2 -0
  5. package/node_modules/@groove-dev/daemon/src/providers/codex.js +1 -0
  6. package/node_modules/@groove-dev/daemon/src/providers/index.js +3 -3
  7. package/node_modules/@groove-dev/gui/dist/assets/index-BFc7Ov6v.css +1 -0
  8. package/node_modules/@groove-dev/gui/dist/assets/{index-BK6tvmxx.js → index-Deza1S0i.js} +160 -160
  9. package/node_modules/@groove-dev/gui/dist/index.html +2 -2
  10. package/node_modules/@groove-dev/gui/package.json +1 -1
  11. package/node_modules/@groove-dev/gui/src/components/editor/editor-tabs.jsx +5 -5
  12. package/node_modules/@groove-dev/gui/src/components/editor/file-tree.jsx +11 -0
  13. package/node_modules/@groove-dev/gui/src/components/settings/ProviderSetupWizard.jsx +7 -2
  14. package/node_modules/@groove-dev/gui/src/stores/groove.js +46 -54
  15. package/node_modules/@groove-dev/gui/src/views/editor.jsx +4 -3
  16. package/package.json +1 -1
  17. package/packages/cli/package.json +1 -1
  18. package/packages/daemon/package.json +1 -1
  19. package/packages/daemon/src/api.js +38 -27
  20. package/packages/daemon/src/providers/claude-code.js +2 -0
  21. package/packages/daemon/src/providers/codex.js +1 -0
  22. package/packages/daemon/src/providers/index.js +3 -3
  23. package/packages/gui/dist/assets/index-BFc7Ov6v.css +1 -0
  24. package/packages/gui/dist/assets/{index-BK6tvmxx.js → index-Deza1S0i.js} +160 -160
  25. package/packages/gui/dist/index.html +2 -2
  26. package/packages/gui/package.json +1 -1
  27. package/packages/gui/src/components/editor/editor-tabs.jsx +5 -5
  28. package/packages/gui/src/components/editor/file-tree.jsx +11 -0
  29. package/packages/gui/src/components/settings/ProviderSetupWizard.jsx +7 -2
  30. package/packages/gui/src/stores/groove.js +46 -54
  31. package/packages/gui/src/views/editor.jsx +4 -3
  32. package/node_modules/@groove-dev/gui/dist/assets/index-74E3YTkT.css +0 -1
  33. package/packages/gui/dist/assets/index-74E3YTkT.css +0 -1
  34. package/packages/gui/node_modules/.vite/deps/@codemirror_autocomplete.js +0 -68
  35. package/packages/gui/node_modules/.vite/deps/@codemirror_autocomplete.js.map +0 -7
  36. package/packages/gui/node_modules/.vite/deps/@codemirror_commands.js +0 -1420
  37. package/packages/gui/node_modules/.vite/deps/@codemirror_commands.js.map +0 -7
  38. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-css.js +0 -17
  39. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-css.js.map +0 -7
  40. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-html.js +0 -22
  41. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-html.js.map +0 -7
  42. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-javascript.js +0 -34
  43. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-javascript.js.map +0 -7
  44. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-json.js +0 -101
  45. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-json.js.map +0 -7
  46. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-markdown.js +0 -2534
  47. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-markdown.js.map +0 -7
  48. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-python.js +0 -789
  49. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-python.js.map +0 -7
  50. package/packages/gui/node_modules/.vite/deps/@codemirror_language.js +0 -115
  51. package/packages/gui/node_modules/.vite/deps/@codemirror_language.js.map +0 -7
  52. package/packages/gui/node_modules/.vite/deps/@codemirror_search.js +0 -1136
  53. package/packages/gui/node_modules/.vite/deps/@codemirror_search.js.map +0 -7
  54. package/packages/gui/node_modules/.vite/deps/@codemirror_state.js +0 -63
  55. package/packages/gui/node_modules/.vite/deps/@codemirror_state.js.map +0 -7
  56. package/packages/gui/node_modules/.vite/deps/@codemirror_theme-one-dark.js +0 -179
  57. package/packages/gui/node_modules/.vite/deps/@codemirror_theme-one-dark.js.map +0 -7
  58. package/packages/gui/node_modules/.vite/deps/@codemirror_view.js +0 -104
  59. package/packages/gui/node_modules/.vite/deps/@codemirror_view.js.map +0 -7
  60. package/packages/gui/node_modules/.vite/deps/@radix-ui_react-context-menu.js +0 -1202
  61. package/packages/gui/node_modules/.vite/deps/@radix-ui_react-context-menu.js.map +0 -7
  62. package/packages/gui/node_modules/.vite/deps/@radix-ui_react-dialog.js +0 -365
  63. package/packages/gui/node_modules/.vite/deps/@radix-ui_react-dialog.js.map +0 -7
  64. package/packages/gui/node_modules/.vite/deps/@radix-ui_react-scroll-area.js +0 -757
  65. package/packages/gui/node_modules/.vite/deps/@radix-ui_react-scroll-area.js.map +0 -7
  66. package/packages/gui/node_modules/.vite/deps/@radix-ui_react-tabs.js +0 -219
  67. package/packages/gui/node_modules/.vite/deps/@radix-ui_react-tabs.js.map +0 -7
  68. package/packages/gui/node_modules/.vite/deps/@radix-ui_react-tooltip.js +0 -562
  69. package/packages/gui/node_modules/.vite/deps/@radix-ui_react-tooltip.js.map +0 -7
  70. package/packages/gui/node_modules/.vite/deps/@xterm_addon-fit.js +0 -46
  71. package/packages/gui/node_modules/.vite/deps/@xterm_addon-fit.js.map +0 -7
  72. package/packages/gui/node_modules/.vite/deps/@xterm_addon-web-links.js +0 -121
  73. package/packages/gui/node_modules/.vite/deps/@xterm_addon-web-links.js.map +0 -7
  74. package/packages/gui/node_modules/.vite/deps/@xterm_xterm.js +0 -9237
  75. package/packages/gui/node_modules/.vite/deps/@xterm_xterm.js.map +0 -7
  76. package/packages/gui/node_modules/.vite/deps/@xyflow_react.js +0 -9934
  77. package/packages/gui/node_modules/.vite/deps/@xyflow_react.js.map +0 -7
  78. package/packages/gui/node_modules/.vite/deps/_metadata.json +0 -259
  79. package/packages/gui/node_modules/.vite/deps/chunk-3EE34IFC.js +0 -5169
  80. package/packages/gui/node_modules/.vite/deps/chunk-3EE34IFC.js.map +0 -7
  81. package/packages/gui/node_modules/.vite/deps/chunk-3IB5EUP7.js +0 -2000
  82. package/packages/gui/node_modules/.vite/deps/chunk-3IB5EUP7.js.map +0 -7
  83. package/packages/gui/node_modules/.vite/deps/chunk-44CLUOQE.js +0 -1776
  84. package/packages/gui/node_modules/.vite/deps/chunk-44CLUOQE.js.map +0 -7
  85. package/packages/gui/node_modules/.vite/deps/chunk-4JHIKDUF.js +0 -435
  86. package/packages/gui/node_modules/.vite/deps/chunk-4JHIKDUF.js.map +0 -7
  87. package/packages/gui/node_modules/.vite/deps/chunk-ACEP5X2F.js +0 -292
  88. package/packages/gui/node_modules/.vite/deps/chunk-ACEP5X2F.js.map +0 -7
  89. package/packages/gui/node_modules/.vite/deps/chunk-CDLO3JFW.js +0 -1004
  90. package/packages/gui/node_modules/.vite/deps/chunk-CDLO3JFW.js.map +0 -7
  91. package/packages/gui/node_modules/.vite/deps/chunk-FOR2E6IR.js +0 -105
  92. package/packages/gui/node_modules/.vite/deps/chunk-FOR2E6IR.js.map +0 -7
  93. package/packages/gui/node_modules/.vite/deps/chunk-HPXOV7QR.js +0 -23
  94. package/packages/gui/node_modules/.vite/deps/chunk-HPXOV7QR.js.map +0 -7
  95. package/packages/gui/node_modules/.vite/deps/chunk-HVFOBSCQ.js +0 -1062
  96. package/packages/gui/node_modules/.vite/deps/chunk-HVFOBSCQ.js.map +0 -7
  97. package/packages/gui/node_modules/.vite/deps/chunk-PGL3TTJA.js +0 -1115
  98. package/packages/gui/node_modules/.vite/deps/chunk-PGL3TTJA.js.map +0 -7
  99. package/packages/gui/node_modules/.vite/deps/chunk-PGMATLPZ.js +0 -2294
  100. package/packages/gui/node_modules/.vite/deps/chunk-PGMATLPZ.js.map +0 -7
  101. package/packages/gui/node_modules/.vite/deps/chunk-PR4QN5HX.js +0 -42
  102. package/packages/gui/node_modules/.vite/deps/chunk-PR4QN5HX.js.map +0 -7
  103. package/packages/gui/node_modules/.vite/deps/chunk-QX3PPTYO.js +0 -315
  104. package/packages/gui/node_modules/.vite/deps/chunk-QX3PPTYO.js.map +0 -7
  105. package/packages/gui/node_modules/.vite/deps/chunk-RE2FU7ZU.js +0 -10985
  106. package/packages/gui/node_modules/.vite/deps/chunk-RE2FU7ZU.js.map +0 -7
  107. package/packages/gui/node_modules/.vite/deps/chunk-SPKVQGZX.js +0 -701
  108. package/packages/gui/node_modules/.vite/deps/chunk-SPKVQGZX.js.map +0 -7
  109. package/packages/gui/node_modules/.vite/deps/chunk-YAD7VOVN.js +0 -280
  110. package/packages/gui/node_modules/.vite/deps/chunk-YAD7VOVN.js.map +0 -7
  111. package/packages/gui/node_modules/.vite/deps/chunk-YEUURE4V.js +0 -264
  112. package/packages/gui/node_modules/.vite/deps/chunk-YEUURE4V.js.map +0 -7
  113. package/packages/gui/node_modules/.vite/deps/chunk-YYJMNVCJ.js +0 -3459
  114. package/packages/gui/node_modules/.vite/deps/chunk-YYJMNVCJ.js.map +0 -7
  115. package/packages/gui/node_modules/.vite/deps/chunk-Z5NIFSCT.js +0 -1106
  116. package/packages/gui/node_modules/.vite/deps/chunk-Z5NIFSCT.js.map +0 -7
  117. package/packages/gui/node_modules/.vite/deps/clsx.js +0 -22
  118. package/packages/gui/node_modules/.vite/deps/clsx.js.map +0 -7
  119. package/packages/gui/node_modules/.vite/deps/framer-motion.js +0 -12732
  120. package/packages/gui/node_modules/.vite/deps/framer-motion.js.map +0 -7
  121. package/packages/gui/node_modules/.vite/deps/lucide-react.js +0 -29653
  122. package/packages/gui/node_modules/.vite/deps/lucide-react.js.map +0 -7
  123. package/packages/gui/node_modules/.vite/deps/package.json +0 -3
  124. package/packages/gui/node_modules/.vite/deps/react-dom.js +0 -6
  125. package/packages/gui/node_modules/.vite/deps/react-dom.js.map +0 -7
  126. package/packages/gui/node_modules/.vite/deps/react-dom_client.js +0 -20217
  127. package/packages/gui/node_modules/.vite/deps/react-dom_client.js.map +0 -7
  128. package/packages/gui/node_modules/.vite/deps/react.js +0 -5
  129. package/packages/gui/node_modules/.vite/deps/react.js.map +0 -7
  130. package/packages/gui/node_modules/.vite/deps/react_jsx-dev-runtime.js +0 -278
  131. package/packages/gui/node_modules/.vite/deps/react_jsx-dev-runtime.js.map +0 -7
  132. package/packages/gui/node_modules/.vite/deps/react_jsx-runtime.js +0 -6
  133. package/packages/gui/node_modules/.vite/deps/react_jsx-runtime.js.map +0 -7
  134. package/packages/gui/node_modules/.vite/deps/tailwind-merge.js +0 -3263
  135. package/packages/gui/node_modules/.vite/deps/tailwind-merge.js.map +0 -7
  136. package/packages/gui/node_modules/.vite/deps/zustand.js +0 -56
  137. package/packages/gui/node_modules/.vite/deps/zustand.js.map +0 -7
@@ -1,1202 +0,0 @@
1
- "use client";
2
- import {
3
- Item,
4
- Root,
5
- createCollection,
6
- createRovingFocusGroupScope
7
- } from "./chunk-QX3PPTYO.js";
8
- import {
9
- useDirection
10
- } from "./chunk-HPXOV7QR.js";
11
- import {
12
- Combination_default,
13
- FocusScope,
14
- hideOthers,
15
- useFocusGuards
16
- } from "./chunk-Z5NIFSCT.js";
17
- import {
18
- Anchor,
19
- Arrow,
20
- Content,
21
- Root2,
22
- createPopperScope
23
- } from "./chunk-PGMATLPZ.js";
24
- import {
25
- DismissableLayer,
26
- Portal
27
- } from "./chunk-YEUURE4V.js";
28
- import {
29
- useControllableState,
30
- useId
31
- } from "./chunk-FOR2E6IR.js";
32
- import {
33
- Presence,
34
- Primitive,
35
- composeEventHandlers,
36
- composeRefs,
37
- createContextScope,
38
- createSlot,
39
- dispatchDiscreteCustomEvent,
40
- useCallbackRef,
41
- useComposedRefs
42
- } from "./chunk-4JHIKDUF.js";
43
- import "./chunk-YAD7VOVN.js";
44
- import {
45
- require_jsx_runtime
46
- } from "./chunk-ACEP5X2F.js";
47
- import {
48
- require_react
49
- } from "./chunk-CDLO3JFW.js";
50
- import {
51
- __toESM
52
- } from "./chunk-PR4QN5HX.js";
53
-
54
- // ../../node_modules/@radix-ui/react-context-menu/dist/index.mjs
55
- var React2 = __toESM(require_react(), 1);
56
-
57
- // ../../node_modules/@radix-ui/react-menu/dist/index.mjs
58
- var React = __toESM(require_react(), 1);
59
- var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
60
- var SELECTION_KEYS = ["Enter", " "];
61
- var FIRST_KEYS = ["ArrowDown", "PageUp", "Home"];
62
- var LAST_KEYS = ["ArrowUp", "PageDown", "End"];
63
- var FIRST_LAST_KEYS = [...FIRST_KEYS, ...LAST_KEYS];
64
- var SUB_OPEN_KEYS = {
65
- ltr: [...SELECTION_KEYS, "ArrowRight"],
66
- rtl: [...SELECTION_KEYS, "ArrowLeft"]
67
- };
68
- var SUB_CLOSE_KEYS = {
69
- ltr: ["ArrowLeft"],
70
- rtl: ["ArrowRight"]
71
- };
72
- var MENU_NAME = "Menu";
73
- var [Collection, useCollection, createCollectionScope] = createCollection(MENU_NAME);
74
- var [createMenuContext, createMenuScope] = createContextScope(MENU_NAME, [
75
- createCollectionScope,
76
- createPopperScope,
77
- createRovingFocusGroupScope
78
- ]);
79
- var usePopperScope = createPopperScope();
80
- var useRovingFocusGroupScope = createRovingFocusGroupScope();
81
- var [MenuProvider, useMenuContext] = createMenuContext(MENU_NAME);
82
- var [MenuRootProvider, useMenuRootContext] = createMenuContext(MENU_NAME);
83
- var Menu = (props) => {
84
- const { __scopeMenu, open = false, children, dir, onOpenChange, modal = true } = props;
85
- const popperScope = usePopperScope(__scopeMenu);
86
- const [content, setContent] = React.useState(null);
87
- const isUsingKeyboardRef = React.useRef(false);
88
- const handleOpenChange = useCallbackRef(onOpenChange);
89
- const direction = useDirection(dir);
90
- React.useEffect(() => {
91
- const handleKeyDown = () => {
92
- isUsingKeyboardRef.current = true;
93
- document.addEventListener("pointerdown", handlePointer, { capture: true, once: true });
94
- document.addEventListener("pointermove", handlePointer, { capture: true, once: true });
95
- };
96
- const handlePointer = () => isUsingKeyboardRef.current = false;
97
- document.addEventListener("keydown", handleKeyDown, { capture: true });
98
- return () => {
99
- document.removeEventListener("keydown", handleKeyDown, { capture: true });
100
- document.removeEventListener("pointerdown", handlePointer, { capture: true });
101
- document.removeEventListener("pointermove", handlePointer, { capture: true });
102
- };
103
- }, []);
104
- return (0, import_jsx_runtime.jsx)(Root2, { ...popperScope, children: (0, import_jsx_runtime.jsx)(
105
- MenuProvider,
106
- {
107
- scope: __scopeMenu,
108
- open,
109
- onOpenChange: handleOpenChange,
110
- content,
111
- onContentChange: setContent,
112
- children: (0, import_jsx_runtime.jsx)(
113
- MenuRootProvider,
114
- {
115
- scope: __scopeMenu,
116
- onClose: React.useCallback(() => handleOpenChange(false), [handleOpenChange]),
117
- isUsingKeyboardRef,
118
- dir: direction,
119
- modal,
120
- children
121
- }
122
- )
123
- }
124
- ) });
125
- };
126
- Menu.displayName = MENU_NAME;
127
- var ANCHOR_NAME = "MenuAnchor";
128
- var MenuAnchor = React.forwardRef(
129
- (props, forwardedRef) => {
130
- const { __scopeMenu, ...anchorProps } = props;
131
- const popperScope = usePopperScope(__scopeMenu);
132
- return (0, import_jsx_runtime.jsx)(Anchor, { ...popperScope, ...anchorProps, ref: forwardedRef });
133
- }
134
- );
135
- MenuAnchor.displayName = ANCHOR_NAME;
136
- var PORTAL_NAME = "MenuPortal";
137
- var [PortalProvider, usePortalContext] = createMenuContext(PORTAL_NAME, {
138
- forceMount: void 0
139
- });
140
- var MenuPortal = (props) => {
141
- const { __scopeMenu, forceMount, children, container } = props;
142
- const context = useMenuContext(PORTAL_NAME, __scopeMenu);
143
- return (0, import_jsx_runtime.jsx)(PortalProvider, { scope: __scopeMenu, forceMount, children: (0, import_jsx_runtime.jsx)(Presence, { present: forceMount || context.open, children: (0, import_jsx_runtime.jsx)(Portal, { asChild: true, container, children }) }) });
144
- };
145
- MenuPortal.displayName = PORTAL_NAME;
146
- var CONTENT_NAME = "MenuContent";
147
- var [MenuContentProvider, useMenuContentContext] = createMenuContext(CONTENT_NAME);
148
- var MenuContent = React.forwardRef(
149
- (props, forwardedRef) => {
150
- const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);
151
- const { forceMount = portalContext.forceMount, ...contentProps } = props;
152
- const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
153
- const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);
154
- return (0, import_jsx_runtime.jsx)(Collection.Provider, { scope: props.__scopeMenu, children: (0, import_jsx_runtime.jsx)(Presence, { present: forceMount || context.open, children: (0, import_jsx_runtime.jsx)(Collection.Slot, { scope: props.__scopeMenu, children: rootContext.modal ? (0, import_jsx_runtime.jsx)(MenuRootContentModal, { ...contentProps, ref: forwardedRef }) : (0, import_jsx_runtime.jsx)(MenuRootContentNonModal, { ...contentProps, ref: forwardedRef }) }) }) });
155
- }
156
- );
157
- var MenuRootContentModal = React.forwardRef(
158
- (props, forwardedRef) => {
159
- const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
160
- const ref = React.useRef(null);
161
- const composedRefs = useComposedRefs(forwardedRef, ref);
162
- React.useEffect(() => {
163
- const content = ref.current;
164
- if (content) return hideOthers(content);
165
- }, []);
166
- return (0, import_jsx_runtime.jsx)(
167
- MenuContentImpl,
168
- {
169
- ...props,
170
- ref: composedRefs,
171
- trapFocus: context.open,
172
- disableOutsidePointerEvents: context.open,
173
- disableOutsideScroll: true,
174
- onFocusOutside: composeEventHandlers(
175
- props.onFocusOutside,
176
- (event) => event.preventDefault(),
177
- { checkForDefaultPrevented: false }
178
- ),
179
- onDismiss: () => context.onOpenChange(false)
180
- }
181
- );
182
- }
183
- );
184
- var MenuRootContentNonModal = React.forwardRef((props, forwardedRef) => {
185
- const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
186
- return (0, import_jsx_runtime.jsx)(
187
- MenuContentImpl,
188
- {
189
- ...props,
190
- ref: forwardedRef,
191
- trapFocus: false,
192
- disableOutsidePointerEvents: false,
193
- disableOutsideScroll: false,
194
- onDismiss: () => context.onOpenChange(false)
195
- }
196
- );
197
- });
198
- var Slot = createSlot("MenuContent.ScrollLock");
199
- var MenuContentImpl = React.forwardRef(
200
- (props, forwardedRef) => {
201
- const {
202
- __scopeMenu,
203
- loop = false,
204
- trapFocus,
205
- onOpenAutoFocus,
206
- onCloseAutoFocus,
207
- disableOutsidePointerEvents,
208
- onEntryFocus,
209
- onEscapeKeyDown,
210
- onPointerDownOutside,
211
- onFocusOutside,
212
- onInteractOutside,
213
- onDismiss,
214
- disableOutsideScroll,
215
- ...contentProps
216
- } = props;
217
- const context = useMenuContext(CONTENT_NAME, __scopeMenu);
218
- const rootContext = useMenuRootContext(CONTENT_NAME, __scopeMenu);
219
- const popperScope = usePopperScope(__scopeMenu);
220
- const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);
221
- const getItems = useCollection(__scopeMenu);
222
- const [currentItemId, setCurrentItemId] = React.useState(null);
223
- const contentRef = React.useRef(null);
224
- const composedRefs = useComposedRefs(forwardedRef, contentRef, context.onContentChange);
225
- const timerRef = React.useRef(0);
226
- const searchRef = React.useRef("");
227
- const pointerGraceTimerRef = React.useRef(0);
228
- const pointerGraceIntentRef = React.useRef(null);
229
- const pointerDirRef = React.useRef("right");
230
- const lastPointerXRef = React.useRef(0);
231
- const ScrollLockWrapper = disableOutsideScroll ? Combination_default : React.Fragment;
232
- const scrollLockWrapperProps = disableOutsideScroll ? { as: Slot, allowPinchZoom: true } : void 0;
233
- const handleTypeaheadSearch = (key) => {
234
- var _a, _b;
235
- const search = searchRef.current + key;
236
- const items = getItems().filter((item) => !item.disabled);
237
- const currentItem = document.activeElement;
238
- const currentMatch = (_a = items.find((item) => item.ref.current === currentItem)) == null ? void 0 : _a.textValue;
239
- const values = items.map((item) => item.textValue);
240
- const nextMatch = getNextMatch(values, search, currentMatch);
241
- const newItem = (_b = items.find((item) => item.textValue === nextMatch)) == null ? void 0 : _b.ref.current;
242
- (function updateSearch(value) {
243
- searchRef.current = value;
244
- window.clearTimeout(timerRef.current);
245
- if (value !== "") timerRef.current = window.setTimeout(() => updateSearch(""), 1e3);
246
- })(search);
247
- if (newItem) {
248
- setTimeout(() => newItem.focus());
249
- }
250
- };
251
- React.useEffect(() => {
252
- return () => window.clearTimeout(timerRef.current);
253
- }, []);
254
- useFocusGuards();
255
- const isPointerMovingToSubmenu = React.useCallback((event) => {
256
- var _a, _b;
257
- const isMovingTowards = pointerDirRef.current === ((_a = pointerGraceIntentRef.current) == null ? void 0 : _a.side);
258
- return isMovingTowards && isPointerInGraceArea(event, (_b = pointerGraceIntentRef.current) == null ? void 0 : _b.area);
259
- }, []);
260
- return (0, import_jsx_runtime.jsx)(
261
- MenuContentProvider,
262
- {
263
- scope: __scopeMenu,
264
- searchRef,
265
- onItemEnter: React.useCallback(
266
- (event) => {
267
- if (isPointerMovingToSubmenu(event)) event.preventDefault();
268
- },
269
- [isPointerMovingToSubmenu]
270
- ),
271
- onItemLeave: React.useCallback(
272
- (event) => {
273
- var _a;
274
- if (isPointerMovingToSubmenu(event)) return;
275
- (_a = contentRef.current) == null ? void 0 : _a.focus();
276
- setCurrentItemId(null);
277
- },
278
- [isPointerMovingToSubmenu]
279
- ),
280
- onTriggerLeave: React.useCallback(
281
- (event) => {
282
- if (isPointerMovingToSubmenu(event)) event.preventDefault();
283
- },
284
- [isPointerMovingToSubmenu]
285
- ),
286
- pointerGraceTimerRef,
287
- onPointerGraceIntentChange: React.useCallback((intent) => {
288
- pointerGraceIntentRef.current = intent;
289
- }, []),
290
- children: (0, import_jsx_runtime.jsx)(ScrollLockWrapper, { ...scrollLockWrapperProps, children: (0, import_jsx_runtime.jsx)(
291
- FocusScope,
292
- {
293
- asChild: true,
294
- trapped: trapFocus,
295
- onMountAutoFocus: composeEventHandlers(onOpenAutoFocus, (event) => {
296
- var _a;
297
- event.preventDefault();
298
- (_a = contentRef.current) == null ? void 0 : _a.focus({ preventScroll: true });
299
- }),
300
- onUnmountAutoFocus: onCloseAutoFocus,
301
- children: (0, import_jsx_runtime.jsx)(
302
- DismissableLayer,
303
- {
304
- asChild: true,
305
- disableOutsidePointerEvents,
306
- onEscapeKeyDown,
307
- onPointerDownOutside,
308
- onFocusOutside,
309
- onInteractOutside,
310
- onDismiss,
311
- children: (0, import_jsx_runtime.jsx)(
312
- Root,
313
- {
314
- asChild: true,
315
- ...rovingFocusGroupScope,
316
- dir: rootContext.dir,
317
- orientation: "vertical",
318
- loop,
319
- currentTabStopId: currentItemId,
320
- onCurrentTabStopIdChange: setCurrentItemId,
321
- onEntryFocus: composeEventHandlers(onEntryFocus, (event) => {
322
- if (!rootContext.isUsingKeyboardRef.current) event.preventDefault();
323
- }),
324
- preventScrollOnEntryFocus: true,
325
- children: (0, import_jsx_runtime.jsx)(
326
- Content,
327
- {
328
- role: "menu",
329
- "aria-orientation": "vertical",
330
- "data-state": getOpenState(context.open),
331
- "data-radix-menu-content": "",
332
- dir: rootContext.dir,
333
- ...popperScope,
334
- ...contentProps,
335
- ref: composedRefs,
336
- style: { outline: "none", ...contentProps.style },
337
- onKeyDown: composeEventHandlers(contentProps.onKeyDown, (event) => {
338
- const target = event.target;
339
- const isKeyDownInside = target.closest("[data-radix-menu-content]") === event.currentTarget;
340
- const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;
341
- const isCharacterKey = event.key.length === 1;
342
- if (isKeyDownInside) {
343
- if (event.key === "Tab") event.preventDefault();
344
- if (!isModifierKey && isCharacterKey) handleTypeaheadSearch(event.key);
345
- }
346
- const content = contentRef.current;
347
- if (event.target !== content) return;
348
- if (!FIRST_LAST_KEYS.includes(event.key)) return;
349
- event.preventDefault();
350
- const items = getItems().filter((item) => !item.disabled);
351
- const candidateNodes = items.map((item) => item.ref.current);
352
- if (LAST_KEYS.includes(event.key)) candidateNodes.reverse();
353
- focusFirst(candidateNodes);
354
- }),
355
- onBlur: composeEventHandlers(props.onBlur, (event) => {
356
- if (!event.currentTarget.contains(event.target)) {
357
- window.clearTimeout(timerRef.current);
358
- searchRef.current = "";
359
- }
360
- }),
361
- onPointerMove: composeEventHandlers(
362
- props.onPointerMove,
363
- whenMouse((event) => {
364
- const target = event.target;
365
- const pointerXHasChanged = lastPointerXRef.current !== event.clientX;
366
- if (event.currentTarget.contains(target) && pointerXHasChanged) {
367
- const newDir = event.clientX > lastPointerXRef.current ? "right" : "left";
368
- pointerDirRef.current = newDir;
369
- lastPointerXRef.current = event.clientX;
370
- }
371
- })
372
- )
373
- }
374
- )
375
- }
376
- )
377
- }
378
- )
379
- }
380
- ) })
381
- }
382
- );
383
- }
384
- );
385
- MenuContent.displayName = CONTENT_NAME;
386
- var GROUP_NAME = "MenuGroup";
387
- var MenuGroup = React.forwardRef(
388
- (props, forwardedRef) => {
389
- const { __scopeMenu, ...groupProps } = props;
390
- return (0, import_jsx_runtime.jsx)(Primitive.div, { role: "group", ...groupProps, ref: forwardedRef });
391
- }
392
- );
393
- MenuGroup.displayName = GROUP_NAME;
394
- var LABEL_NAME = "MenuLabel";
395
- var MenuLabel = React.forwardRef(
396
- (props, forwardedRef) => {
397
- const { __scopeMenu, ...labelProps } = props;
398
- return (0, import_jsx_runtime.jsx)(Primitive.div, { ...labelProps, ref: forwardedRef });
399
- }
400
- );
401
- MenuLabel.displayName = LABEL_NAME;
402
- var ITEM_NAME = "MenuItem";
403
- var ITEM_SELECT = "menu.itemSelect";
404
- var MenuItem = React.forwardRef(
405
- (props, forwardedRef) => {
406
- const { disabled = false, onSelect, ...itemProps } = props;
407
- const ref = React.useRef(null);
408
- const rootContext = useMenuRootContext(ITEM_NAME, props.__scopeMenu);
409
- const contentContext = useMenuContentContext(ITEM_NAME, props.__scopeMenu);
410
- const composedRefs = useComposedRefs(forwardedRef, ref);
411
- const isPointerDownRef = React.useRef(false);
412
- const handleSelect = () => {
413
- const menuItem = ref.current;
414
- if (!disabled && menuItem) {
415
- const itemSelectEvent = new CustomEvent(ITEM_SELECT, { bubbles: true, cancelable: true });
416
- menuItem.addEventListener(ITEM_SELECT, (event) => onSelect == null ? void 0 : onSelect(event), { once: true });
417
- dispatchDiscreteCustomEvent(menuItem, itemSelectEvent);
418
- if (itemSelectEvent.defaultPrevented) {
419
- isPointerDownRef.current = false;
420
- } else {
421
- rootContext.onClose();
422
- }
423
- }
424
- };
425
- return (0, import_jsx_runtime.jsx)(
426
- MenuItemImpl,
427
- {
428
- ...itemProps,
429
- ref: composedRefs,
430
- disabled,
431
- onClick: composeEventHandlers(props.onClick, handleSelect),
432
- onPointerDown: (event) => {
433
- var _a;
434
- (_a = props.onPointerDown) == null ? void 0 : _a.call(props, event);
435
- isPointerDownRef.current = true;
436
- },
437
- onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {
438
- var _a;
439
- if (!isPointerDownRef.current) (_a = event.currentTarget) == null ? void 0 : _a.click();
440
- }),
441
- onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
442
- const isTypingAhead = contentContext.searchRef.current !== "";
443
- if (disabled || isTypingAhead && event.key === " ") return;
444
- if (SELECTION_KEYS.includes(event.key)) {
445
- event.currentTarget.click();
446
- event.preventDefault();
447
- }
448
- })
449
- }
450
- );
451
- }
452
- );
453
- MenuItem.displayName = ITEM_NAME;
454
- var MenuItemImpl = React.forwardRef(
455
- (props, forwardedRef) => {
456
- const { __scopeMenu, disabled = false, textValue, ...itemProps } = props;
457
- const contentContext = useMenuContentContext(ITEM_NAME, __scopeMenu);
458
- const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);
459
- const ref = React.useRef(null);
460
- const composedRefs = useComposedRefs(forwardedRef, ref);
461
- const [isFocused, setIsFocused] = React.useState(false);
462
- const [textContent, setTextContent] = React.useState("");
463
- React.useEffect(() => {
464
- const menuItem = ref.current;
465
- if (menuItem) {
466
- setTextContent((menuItem.textContent ?? "").trim());
467
- }
468
- }, [itemProps.children]);
469
- return (0, import_jsx_runtime.jsx)(
470
- Collection.ItemSlot,
471
- {
472
- scope: __scopeMenu,
473
- disabled,
474
- textValue: textValue ?? textContent,
475
- children: (0, import_jsx_runtime.jsx)(Item, { asChild: true, ...rovingFocusGroupScope, focusable: !disabled, children: (0, import_jsx_runtime.jsx)(
476
- Primitive.div,
477
- {
478
- role: "menuitem",
479
- "data-highlighted": isFocused ? "" : void 0,
480
- "aria-disabled": disabled || void 0,
481
- "data-disabled": disabled ? "" : void 0,
482
- ...itemProps,
483
- ref: composedRefs,
484
- onPointerMove: composeEventHandlers(
485
- props.onPointerMove,
486
- whenMouse((event) => {
487
- if (disabled) {
488
- contentContext.onItemLeave(event);
489
- } else {
490
- contentContext.onItemEnter(event);
491
- if (!event.defaultPrevented) {
492
- const item = event.currentTarget;
493
- item.focus({ preventScroll: true });
494
- }
495
- }
496
- })
497
- ),
498
- onPointerLeave: composeEventHandlers(
499
- props.onPointerLeave,
500
- whenMouse((event) => contentContext.onItemLeave(event))
501
- ),
502
- onFocus: composeEventHandlers(props.onFocus, () => setIsFocused(true)),
503
- onBlur: composeEventHandlers(props.onBlur, () => setIsFocused(false))
504
- }
505
- ) })
506
- }
507
- );
508
- }
509
- );
510
- var CHECKBOX_ITEM_NAME = "MenuCheckboxItem";
511
- var MenuCheckboxItem = React.forwardRef(
512
- (props, forwardedRef) => {
513
- const { checked = false, onCheckedChange, ...checkboxItemProps } = props;
514
- return (0, import_jsx_runtime.jsx)(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: (0, import_jsx_runtime.jsx)(
515
- MenuItem,
516
- {
517
- role: "menuitemcheckbox",
518
- "aria-checked": isIndeterminate(checked) ? "mixed" : checked,
519
- ...checkboxItemProps,
520
- ref: forwardedRef,
521
- "data-state": getCheckedState(checked),
522
- onSelect: composeEventHandlers(
523
- checkboxItemProps.onSelect,
524
- () => onCheckedChange == null ? void 0 : onCheckedChange(isIndeterminate(checked) ? true : !checked),
525
- { checkForDefaultPrevented: false }
526
- )
527
- }
528
- ) });
529
- }
530
- );
531
- MenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;
532
- var RADIO_GROUP_NAME = "MenuRadioGroup";
533
- var [RadioGroupProvider, useRadioGroupContext] = createMenuContext(
534
- RADIO_GROUP_NAME,
535
- { value: void 0, onValueChange: () => {
536
- } }
537
- );
538
- var MenuRadioGroup = React.forwardRef(
539
- (props, forwardedRef) => {
540
- const { value, onValueChange, ...groupProps } = props;
541
- const handleValueChange = useCallbackRef(onValueChange);
542
- return (0, import_jsx_runtime.jsx)(RadioGroupProvider, { scope: props.__scopeMenu, value, onValueChange: handleValueChange, children: (0, import_jsx_runtime.jsx)(MenuGroup, { ...groupProps, ref: forwardedRef }) });
543
- }
544
- );
545
- MenuRadioGroup.displayName = RADIO_GROUP_NAME;
546
- var RADIO_ITEM_NAME = "MenuRadioItem";
547
- var MenuRadioItem = React.forwardRef(
548
- (props, forwardedRef) => {
549
- const { value, ...radioItemProps } = props;
550
- const context = useRadioGroupContext(RADIO_ITEM_NAME, props.__scopeMenu);
551
- const checked = value === context.value;
552
- return (0, import_jsx_runtime.jsx)(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: (0, import_jsx_runtime.jsx)(
553
- MenuItem,
554
- {
555
- role: "menuitemradio",
556
- "aria-checked": checked,
557
- ...radioItemProps,
558
- ref: forwardedRef,
559
- "data-state": getCheckedState(checked),
560
- onSelect: composeEventHandlers(
561
- radioItemProps.onSelect,
562
- () => {
563
- var _a;
564
- return (_a = context.onValueChange) == null ? void 0 : _a.call(context, value);
565
- },
566
- { checkForDefaultPrevented: false }
567
- )
568
- }
569
- ) });
570
- }
571
- );
572
- MenuRadioItem.displayName = RADIO_ITEM_NAME;
573
- var ITEM_INDICATOR_NAME = "MenuItemIndicator";
574
- var [ItemIndicatorProvider, useItemIndicatorContext] = createMenuContext(
575
- ITEM_INDICATOR_NAME,
576
- { checked: false }
577
- );
578
- var MenuItemIndicator = React.forwardRef(
579
- (props, forwardedRef) => {
580
- const { __scopeMenu, forceMount, ...itemIndicatorProps } = props;
581
- const indicatorContext = useItemIndicatorContext(ITEM_INDICATOR_NAME, __scopeMenu);
582
- return (0, import_jsx_runtime.jsx)(
583
- Presence,
584
- {
585
- present: forceMount || isIndeterminate(indicatorContext.checked) || indicatorContext.checked === true,
586
- children: (0, import_jsx_runtime.jsx)(
587
- Primitive.span,
588
- {
589
- ...itemIndicatorProps,
590
- ref: forwardedRef,
591
- "data-state": getCheckedState(indicatorContext.checked)
592
- }
593
- )
594
- }
595
- );
596
- }
597
- );
598
- MenuItemIndicator.displayName = ITEM_INDICATOR_NAME;
599
- var SEPARATOR_NAME = "MenuSeparator";
600
- var MenuSeparator = React.forwardRef(
601
- (props, forwardedRef) => {
602
- const { __scopeMenu, ...separatorProps } = props;
603
- return (0, import_jsx_runtime.jsx)(
604
- Primitive.div,
605
- {
606
- role: "separator",
607
- "aria-orientation": "horizontal",
608
- ...separatorProps,
609
- ref: forwardedRef
610
- }
611
- );
612
- }
613
- );
614
- MenuSeparator.displayName = SEPARATOR_NAME;
615
- var ARROW_NAME = "MenuArrow";
616
- var MenuArrow = React.forwardRef(
617
- (props, forwardedRef) => {
618
- const { __scopeMenu, ...arrowProps } = props;
619
- const popperScope = usePopperScope(__scopeMenu);
620
- return (0, import_jsx_runtime.jsx)(Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });
621
- }
622
- );
623
- MenuArrow.displayName = ARROW_NAME;
624
- var SUB_NAME = "MenuSub";
625
- var [MenuSubProvider, useMenuSubContext] = createMenuContext(SUB_NAME);
626
- var MenuSub = (props) => {
627
- const { __scopeMenu, children, open = false, onOpenChange } = props;
628
- const parentMenuContext = useMenuContext(SUB_NAME, __scopeMenu);
629
- const popperScope = usePopperScope(__scopeMenu);
630
- const [trigger, setTrigger] = React.useState(null);
631
- const [content, setContent] = React.useState(null);
632
- const handleOpenChange = useCallbackRef(onOpenChange);
633
- React.useEffect(() => {
634
- if (parentMenuContext.open === false) handleOpenChange(false);
635
- return () => handleOpenChange(false);
636
- }, [parentMenuContext.open, handleOpenChange]);
637
- return (0, import_jsx_runtime.jsx)(Root2, { ...popperScope, children: (0, import_jsx_runtime.jsx)(
638
- MenuProvider,
639
- {
640
- scope: __scopeMenu,
641
- open,
642
- onOpenChange: handleOpenChange,
643
- content,
644
- onContentChange: setContent,
645
- children: (0, import_jsx_runtime.jsx)(
646
- MenuSubProvider,
647
- {
648
- scope: __scopeMenu,
649
- contentId: useId(),
650
- triggerId: useId(),
651
- trigger,
652
- onTriggerChange: setTrigger,
653
- children
654
- }
655
- )
656
- }
657
- ) });
658
- };
659
- MenuSub.displayName = SUB_NAME;
660
- var SUB_TRIGGER_NAME = "MenuSubTrigger";
661
- var MenuSubTrigger = React.forwardRef(
662
- (props, forwardedRef) => {
663
- const context = useMenuContext(SUB_TRIGGER_NAME, props.__scopeMenu);
664
- const rootContext = useMenuRootContext(SUB_TRIGGER_NAME, props.__scopeMenu);
665
- const subContext = useMenuSubContext(SUB_TRIGGER_NAME, props.__scopeMenu);
666
- const contentContext = useMenuContentContext(SUB_TRIGGER_NAME, props.__scopeMenu);
667
- const openTimerRef = React.useRef(null);
668
- const { pointerGraceTimerRef, onPointerGraceIntentChange } = contentContext;
669
- const scope = { __scopeMenu: props.__scopeMenu };
670
- const clearOpenTimer = React.useCallback(() => {
671
- if (openTimerRef.current) window.clearTimeout(openTimerRef.current);
672
- openTimerRef.current = null;
673
- }, []);
674
- React.useEffect(() => clearOpenTimer, [clearOpenTimer]);
675
- React.useEffect(() => {
676
- const pointerGraceTimer = pointerGraceTimerRef.current;
677
- return () => {
678
- window.clearTimeout(pointerGraceTimer);
679
- onPointerGraceIntentChange(null);
680
- };
681
- }, [pointerGraceTimerRef, onPointerGraceIntentChange]);
682
- return (0, import_jsx_runtime.jsx)(MenuAnchor, { asChild: true, ...scope, children: (0, import_jsx_runtime.jsx)(
683
- MenuItemImpl,
684
- {
685
- id: subContext.triggerId,
686
- "aria-haspopup": "menu",
687
- "aria-expanded": context.open,
688
- "aria-controls": subContext.contentId,
689
- "data-state": getOpenState(context.open),
690
- ...props,
691
- ref: composeRefs(forwardedRef, subContext.onTriggerChange),
692
- onClick: (event) => {
693
- var _a;
694
- (_a = props.onClick) == null ? void 0 : _a.call(props, event);
695
- if (props.disabled || event.defaultPrevented) return;
696
- event.currentTarget.focus();
697
- if (!context.open) context.onOpenChange(true);
698
- },
699
- onPointerMove: composeEventHandlers(
700
- props.onPointerMove,
701
- whenMouse((event) => {
702
- contentContext.onItemEnter(event);
703
- if (event.defaultPrevented) return;
704
- if (!props.disabled && !context.open && !openTimerRef.current) {
705
- contentContext.onPointerGraceIntentChange(null);
706
- openTimerRef.current = window.setTimeout(() => {
707
- context.onOpenChange(true);
708
- clearOpenTimer();
709
- }, 100);
710
- }
711
- })
712
- ),
713
- onPointerLeave: composeEventHandlers(
714
- props.onPointerLeave,
715
- whenMouse((event) => {
716
- var _a, _b;
717
- clearOpenTimer();
718
- const contentRect = (_a = context.content) == null ? void 0 : _a.getBoundingClientRect();
719
- if (contentRect) {
720
- const side = (_b = context.content) == null ? void 0 : _b.dataset.side;
721
- const rightSide = side === "right";
722
- const bleed = rightSide ? -5 : 5;
723
- const contentNearEdge = contentRect[rightSide ? "left" : "right"];
724
- const contentFarEdge = contentRect[rightSide ? "right" : "left"];
725
- contentContext.onPointerGraceIntentChange({
726
- area: [
727
- // Apply a bleed on clientX to ensure that our exit point is
728
- // consistently within polygon bounds
729
- { x: event.clientX + bleed, y: event.clientY },
730
- { x: contentNearEdge, y: contentRect.top },
731
- { x: contentFarEdge, y: contentRect.top },
732
- { x: contentFarEdge, y: contentRect.bottom },
733
- { x: contentNearEdge, y: contentRect.bottom }
734
- ],
735
- side
736
- });
737
- window.clearTimeout(pointerGraceTimerRef.current);
738
- pointerGraceTimerRef.current = window.setTimeout(
739
- () => contentContext.onPointerGraceIntentChange(null),
740
- 300
741
- );
742
- } else {
743
- contentContext.onTriggerLeave(event);
744
- if (event.defaultPrevented) return;
745
- contentContext.onPointerGraceIntentChange(null);
746
- }
747
- })
748
- ),
749
- onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
750
- var _a;
751
- const isTypingAhead = contentContext.searchRef.current !== "";
752
- if (props.disabled || isTypingAhead && event.key === " ") return;
753
- if (SUB_OPEN_KEYS[rootContext.dir].includes(event.key)) {
754
- context.onOpenChange(true);
755
- (_a = context.content) == null ? void 0 : _a.focus();
756
- event.preventDefault();
757
- }
758
- })
759
- }
760
- ) });
761
- }
762
- );
763
- MenuSubTrigger.displayName = SUB_TRIGGER_NAME;
764
- var SUB_CONTENT_NAME = "MenuSubContent";
765
- var MenuSubContent = React.forwardRef(
766
- (props, forwardedRef) => {
767
- const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);
768
- const { forceMount = portalContext.forceMount, ...subContentProps } = props;
769
- const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
770
- const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);
771
- const subContext = useMenuSubContext(SUB_CONTENT_NAME, props.__scopeMenu);
772
- const ref = React.useRef(null);
773
- const composedRefs = useComposedRefs(forwardedRef, ref);
774
- return (0, import_jsx_runtime.jsx)(Collection.Provider, { scope: props.__scopeMenu, children: (0, import_jsx_runtime.jsx)(Presence, { present: forceMount || context.open, children: (0, import_jsx_runtime.jsx)(Collection.Slot, { scope: props.__scopeMenu, children: (0, import_jsx_runtime.jsx)(
775
- MenuContentImpl,
776
- {
777
- id: subContext.contentId,
778
- "aria-labelledby": subContext.triggerId,
779
- ...subContentProps,
780
- ref: composedRefs,
781
- align: "start",
782
- side: rootContext.dir === "rtl" ? "left" : "right",
783
- disableOutsidePointerEvents: false,
784
- disableOutsideScroll: false,
785
- trapFocus: false,
786
- onOpenAutoFocus: (event) => {
787
- var _a;
788
- if (rootContext.isUsingKeyboardRef.current) (_a = ref.current) == null ? void 0 : _a.focus();
789
- event.preventDefault();
790
- },
791
- onCloseAutoFocus: (event) => event.preventDefault(),
792
- onFocusOutside: composeEventHandlers(props.onFocusOutside, (event) => {
793
- if (event.target !== subContext.trigger) context.onOpenChange(false);
794
- }),
795
- onEscapeKeyDown: composeEventHandlers(props.onEscapeKeyDown, (event) => {
796
- rootContext.onClose();
797
- event.preventDefault();
798
- }),
799
- onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
800
- var _a;
801
- const isKeyDownInside = event.currentTarget.contains(event.target);
802
- const isCloseKey = SUB_CLOSE_KEYS[rootContext.dir].includes(event.key);
803
- if (isKeyDownInside && isCloseKey) {
804
- context.onOpenChange(false);
805
- (_a = subContext.trigger) == null ? void 0 : _a.focus();
806
- event.preventDefault();
807
- }
808
- })
809
- }
810
- ) }) }) });
811
- }
812
- );
813
- MenuSubContent.displayName = SUB_CONTENT_NAME;
814
- function getOpenState(open) {
815
- return open ? "open" : "closed";
816
- }
817
- function isIndeterminate(checked) {
818
- return checked === "indeterminate";
819
- }
820
- function getCheckedState(checked) {
821
- return isIndeterminate(checked) ? "indeterminate" : checked ? "checked" : "unchecked";
822
- }
823
- function focusFirst(candidates) {
824
- const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;
825
- for (const candidate of candidates) {
826
- if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;
827
- candidate.focus();
828
- if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;
829
- }
830
- }
831
- function wrapArray(array, startIndex) {
832
- return array.map((_, index) => array[(startIndex + index) % array.length]);
833
- }
834
- function getNextMatch(values, search, currentMatch) {
835
- const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0]);
836
- const normalizedSearch = isRepeated ? search[0] : search;
837
- const currentMatchIndex = currentMatch ? values.indexOf(currentMatch) : -1;
838
- let wrappedValues = wrapArray(values, Math.max(currentMatchIndex, 0));
839
- const excludeCurrentMatch = normalizedSearch.length === 1;
840
- if (excludeCurrentMatch) wrappedValues = wrappedValues.filter((v) => v !== currentMatch);
841
- const nextMatch = wrappedValues.find(
842
- (value) => value.toLowerCase().startsWith(normalizedSearch.toLowerCase())
843
- );
844
- return nextMatch !== currentMatch ? nextMatch : void 0;
845
- }
846
- function isPointInPolygon(point, polygon) {
847
- const { x, y } = point;
848
- let inside = false;
849
- for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
850
- const ii = polygon[i];
851
- const jj = polygon[j];
852
- const xi = ii.x;
853
- const yi = ii.y;
854
- const xj = jj.x;
855
- const yj = jj.y;
856
- const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
857
- if (intersect) inside = !inside;
858
- }
859
- return inside;
860
- }
861
- function isPointerInGraceArea(event, area) {
862
- if (!area) return false;
863
- const cursorPos = { x: event.clientX, y: event.clientY };
864
- return isPointInPolygon(cursorPos, area);
865
- }
866
- function whenMouse(handler) {
867
- return (event) => event.pointerType === "mouse" ? handler(event) : void 0;
868
- }
869
- var Root3 = Menu;
870
- var Anchor2 = MenuAnchor;
871
- var Portal2 = MenuPortal;
872
- var Content2 = MenuContent;
873
- var Group = MenuGroup;
874
- var Label = MenuLabel;
875
- var Item2 = MenuItem;
876
- var CheckboxItem = MenuCheckboxItem;
877
- var RadioGroup = MenuRadioGroup;
878
- var RadioItem = MenuRadioItem;
879
- var ItemIndicator = MenuItemIndicator;
880
- var Separator = MenuSeparator;
881
- var Arrow2 = MenuArrow;
882
- var Sub = MenuSub;
883
- var SubTrigger = MenuSubTrigger;
884
- var SubContent = MenuSubContent;
885
-
886
- // ../../node_modules/@radix-ui/react-context-menu/dist/index.mjs
887
- var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
888
- var CONTEXT_MENU_NAME = "ContextMenu";
889
- var [createContextMenuContext, createContextMenuScope] = createContextScope(CONTEXT_MENU_NAME, [
890
- createMenuScope
891
- ]);
892
- var useMenuScope = createMenuScope();
893
- var [ContextMenuProvider, useContextMenuContext] = createContextMenuContext(CONTEXT_MENU_NAME);
894
- var ContextMenu = (props) => {
895
- const { __scopeContextMenu, children, onOpenChange, dir, modal = true } = props;
896
- const [open, setOpen] = React2.useState(false);
897
- const menuScope = useMenuScope(__scopeContextMenu);
898
- const handleOpenChangeProp = useCallbackRef(onOpenChange);
899
- const handleOpenChange = React2.useCallback(
900
- (open2) => {
901
- setOpen(open2);
902
- handleOpenChangeProp(open2);
903
- },
904
- [handleOpenChangeProp]
905
- );
906
- return (0, import_jsx_runtime2.jsx)(
907
- ContextMenuProvider,
908
- {
909
- scope: __scopeContextMenu,
910
- open,
911
- onOpenChange: handleOpenChange,
912
- modal,
913
- children: (0, import_jsx_runtime2.jsx)(
914
- Root3,
915
- {
916
- ...menuScope,
917
- dir,
918
- open,
919
- onOpenChange: handleOpenChange,
920
- modal,
921
- children
922
- }
923
- )
924
- }
925
- );
926
- };
927
- ContextMenu.displayName = CONTEXT_MENU_NAME;
928
- var TRIGGER_NAME = "ContextMenuTrigger";
929
- var ContextMenuTrigger = React2.forwardRef(
930
- (props, forwardedRef) => {
931
- const { __scopeContextMenu, disabled = false, ...triggerProps } = props;
932
- const context = useContextMenuContext(TRIGGER_NAME, __scopeContextMenu);
933
- const menuScope = useMenuScope(__scopeContextMenu);
934
- const pointRef = React2.useRef({ x: 0, y: 0 });
935
- const virtualRef = React2.useRef({
936
- getBoundingClientRect: () => DOMRect.fromRect({ width: 0, height: 0, ...pointRef.current })
937
- });
938
- const longPressTimerRef = React2.useRef(0);
939
- const clearLongPress = React2.useCallback(
940
- () => window.clearTimeout(longPressTimerRef.current),
941
- []
942
- );
943
- const handleOpen = (event) => {
944
- pointRef.current = { x: event.clientX, y: event.clientY };
945
- context.onOpenChange(true);
946
- };
947
- React2.useEffect(() => clearLongPress, [clearLongPress]);
948
- React2.useEffect(() => void (disabled && clearLongPress()), [disabled, clearLongPress]);
949
- return (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
950
- (0, import_jsx_runtime2.jsx)(Anchor2, { ...menuScope, virtualRef }),
951
- (0, import_jsx_runtime2.jsx)(
952
- Primitive.span,
953
- {
954
- "data-state": context.open ? "open" : "closed",
955
- "data-disabled": disabled ? "" : void 0,
956
- ...triggerProps,
957
- ref: forwardedRef,
958
- style: { WebkitTouchCallout: "none", ...props.style },
959
- onContextMenu: disabled ? props.onContextMenu : composeEventHandlers(props.onContextMenu, (event) => {
960
- clearLongPress();
961
- handleOpen(event);
962
- event.preventDefault();
963
- }),
964
- onPointerDown: disabled ? props.onPointerDown : composeEventHandlers(
965
- props.onPointerDown,
966
- whenTouchOrPen((event) => {
967
- clearLongPress();
968
- longPressTimerRef.current = window.setTimeout(() => handleOpen(event), 700);
969
- })
970
- ),
971
- onPointerMove: disabled ? props.onPointerMove : composeEventHandlers(props.onPointerMove, whenTouchOrPen(clearLongPress)),
972
- onPointerCancel: disabled ? props.onPointerCancel : composeEventHandlers(props.onPointerCancel, whenTouchOrPen(clearLongPress)),
973
- onPointerUp: disabled ? props.onPointerUp : composeEventHandlers(props.onPointerUp, whenTouchOrPen(clearLongPress))
974
- }
975
- )
976
- ] });
977
- }
978
- );
979
- ContextMenuTrigger.displayName = TRIGGER_NAME;
980
- var PORTAL_NAME2 = "ContextMenuPortal";
981
- var ContextMenuPortal = (props) => {
982
- const { __scopeContextMenu, ...portalProps } = props;
983
- const menuScope = useMenuScope(__scopeContextMenu);
984
- return (0, import_jsx_runtime2.jsx)(Portal2, { ...menuScope, ...portalProps });
985
- };
986
- ContextMenuPortal.displayName = PORTAL_NAME2;
987
- var CONTENT_NAME2 = "ContextMenuContent";
988
- var ContextMenuContent = React2.forwardRef(
989
- (props, forwardedRef) => {
990
- const { __scopeContextMenu, ...contentProps } = props;
991
- const context = useContextMenuContext(CONTENT_NAME2, __scopeContextMenu);
992
- const menuScope = useMenuScope(__scopeContextMenu);
993
- const hasInteractedOutsideRef = React2.useRef(false);
994
- return (0, import_jsx_runtime2.jsx)(
995
- Content2,
996
- {
997
- ...menuScope,
998
- ...contentProps,
999
- ref: forwardedRef,
1000
- side: "right",
1001
- sideOffset: 2,
1002
- align: "start",
1003
- onCloseAutoFocus: (event) => {
1004
- var _a;
1005
- (_a = props.onCloseAutoFocus) == null ? void 0 : _a.call(props, event);
1006
- if (!event.defaultPrevented && hasInteractedOutsideRef.current) {
1007
- event.preventDefault();
1008
- }
1009
- hasInteractedOutsideRef.current = false;
1010
- },
1011
- onInteractOutside: (event) => {
1012
- var _a;
1013
- (_a = props.onInteractOutside) == null ? void 0 : _a.call(props, event);
1014
- if (!event.defaultPrevented && !context.modal) hasInteractedOutsideRef.current = true;
1015
- },
1016
- style: {
1017
- ...props.style,
1018
- // re-namespace exposed content custom properties
1019
- ...{
1020
- "--radix-context-menu-content-transform-origin": "var(--radix-popper-transform-origin)",
1021
- "--radix-context-menu-content-available-width": "var(--radix-popper-available-width)",
1022
- "--radix-context-menu-content-available-height": "var(--radix-popper-available-height)",
1023
- "--radix-context-menu-trigger-width": "var(--radix-popper-anchor-width)",
1024
- "--radix-context-menu-trigger-height": "var(--radix-popper-anchor-height)"
1025
- }
1026
- }
1027
- }
1028
- );
1029
- }
1030
- );
1031
- ContextMenuContent.displayName = CONTENT_NAME2;
1032
- var GROUP_NAME2 = "ContextMenuGroup";
1033
- var ContextMenuGroup = React2.forwardRef(
1034
- (props, forwardedRef) => {
1035
- const { __scopeContextMenu, ...groupProps } = props;
1036
- const menuScope = useMenuScope(__scopeContextMenu);
1037
- return (0, import_jsx_runtime2.jsx)(Group, { ...menuScope, ...groupProps, ref: forwardedRef });
1038
- }
1039
- );
1040
- ContextMenuGroup.displayName = GROUP_NAME2;
1041
- var LABEL_NAME2 = "ContextMenuLabel";
1042
- var ContextMenuLabel = React2.forwardRef(
1043
- (props, forwardedRef) => {
1044
- const { __scopeContextMenu, ...labelProps } = props;
1045
- const menuScope = useMenuScope(__scopeContextMenu);
1046
- return (0, import_jsx_runtime2.jsx)(Label, { ...menuScope, ...labelProps, ref: forwardedRef });
1047
- }
1048
- );
1049
- ContextMenuLabel.displayName = LABEL_NAME2;
1050
- var ITEM_NAME2 = "ContextMenuItem";
1051
- var ContextMenuItem = React2.forwardRef(
1052
- (props, forwardedRef) => {
1053
- const { __scopeContextMenu, ...itemProps } = props;
1054
- const menuScope = useMenuScope(__scopeContextMenu);
1055
- return (0, import_jsx_runtime2.jsx)(Item2, { ...menuScope, ...itemProps, ref: forwardedRef });
1056
- }
1057
- );
1058
- ContextMenuItem.displayName = ITEM_NAME2;
1059
- var CHECKBOX_ITEM_NAME2 = "ContextMenuCheckboxItem";
1060
- var ContextMenuCheckboxItem = React2.forwardRef((props, forwardedRef) => {
1061
- const { __scopeContextMenu, ...checkboxItemProps } = props;
1062
- const menuScope = useMenuScope(__scopeContextMenu);
1063
- return (0, import_jsx_runtime2.jsx)(CheckboxItem, { ...menuScope, ...checkboxItemProps, ref: forwardedRef });
1064
- });
1065
- ContextMenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME2;
1066
- var RADIO_GROUP_NAME2 = "ContextMenuRadioGroup";
1067
- var ContextMenuRadioGroup = React2.forwardRef((props, forwardedRef) => {
1068
- const { __scopeContextMenu, ...radioGroupProps } = props;
1069
- const menuScope = useMenuScope(__scopeContextMenu);
1070
- return (0, import_jsx_runtime2.jsx)(RadioGroup, { ...menuScope, ...radioGroupProps, ref: forwardedRef });
1071
- });
1072
- ContextMenuRadioGroup.displayName = RADIO_GROUP_NAME2;
1073
- var RADIO_ITEM_NAME2 = "ContextMenuRadioItem";
1074
- var ContextMenuRadioItem = React2.forwardRef((props, forwardedRef) => {
1075
- const { __scopeContextMenu, ...radioItemProps } = props;
1076
- const menuScope = useMenuScope(__scopeContextMenu);
1077
- return (0, import_jsx_runtime2.jsx)(RadioItem, { ...menuScope, ...radioItemProps, ref: forwardedRef });
1078
- });
1079
- ContextMenuRadioItem.displayName = RADIO_ITEM_NAME2;
1080
- var INDICATOR_NAME = "ContextMenuItemIndicator";
1081
- var ContextMenuItemIndicator = React2.forwardRef((props, forwardedRef) => {
1082
- const { __scopeContextMenu, ...itemIndicatorProps } = props;
1083
- const menuScope = useMenuScope(__scopeContextMenu);
1084
- return (0, import_jsx_runtime2.jsx)(ItemIndicator, { ...menuScope, ...itemIndicatorProps, ref: forwardedRef });
1085
- });
1086
- ContextMenuItemIndicator.displayName = INDICATOR_NAME;
1087
- var SEPARATOR_NAME2 = "ContextMenuSeparator";
1088
- var ContextMenuSeparator = React2.forwardRef((props, forwardedRef) => {
1089
- const { __scopeContextMenu, ...separatorProps } = props;
1090
- const menuScope = useMenuScope(__scopeContextMenu);
1091
- return (0, import_jsx_runtime2.jsx)(Separator, { ...menuScope, ...separatorProps, ref: forwardedRef });
1092
- });
1093
- ContextMenuSeparator.displayName = SEPARATOR_NAME2;
1094
- var ARROW_NAME2 = "ContextMenuArrow";
1095
- var ContextMenuArrow = React2.forwardRef(
1096
- (props, forwardedRef) => {
1097
- const { __scopeContextMenu, ...arrowProps } = props;
1098
- const menuScope = useMenuScope(__scopeContextMenu);
1099
- return (0, import_jsx_runtime2.jsx)(Arrow2, { ...menuScope, ...arrowProps, ref: forwardedRef });
1100
- }
1101
- );
1102
- ContextMenuArrow.displayName = ARROW_NAME2;
1103
- var SUB_NAME2 = "ContextMenuSub";
1104
- var ContextMenuSub = (props) => {
1105
- const { __scopeContextMenu, children, onOpenChange, open: openProp, defaultOpen } = props;
1106
- const menuScope = useMenuScope(__scopeContextMenu);
1107
- const [open, setOpen] = useControllableState({
1108
- prop: openProp,
1109
- defaultProp: defaultOpen ?? false,
1110
- onChange: onOpenChange,
1111
- caller: SUB_NAME2
1112
- });
1113
- return (0, import_jsx_runtime2.jsx)(Sub, { ...menuScope, open, onOpenChange: setOpen, children });
1114
- };
1115
- ContextMenuSub.displayName = SUB_NAME2;
1116
- var SUB_TRIGGER_NAME2 = "ContextMenuSubTrigger";
1117
- var ContextMenuSubTrigger = React2.forwardRef((props, forwardedRef) => {
1118
- const { __scopeContextMenu, ...triggerItemProps } = props;
1119
- const menuScope = useMenuScope(__scopeContextMenu);
1120
- return (0, import_jsx_runtime2.jsx)(SubTrigger, { ...menuScope, ...triggerItemProps, ref: forwardedRef });
1121
- });
1122
- ContextMenuSubTrigger.displayName = SUB_TRIGGER_NAME2;
1123
- var SUB_CONTENT_NAME2 = "ContextMenuSubContent";
1124
- var ContextMenuSubContent = React2.forwardRef((props, forwardedRef) => {
1125
- const { __scopeContextMenu, ...subContentProps } = props;
1126
- const menuScope = useMenuScope(__scopeContextMenu);
1127
- return (0, import_jsx_runtime2.jsx)(
1128
- SubContent,
1129
- {
1130
- ...menuScope,
1131
- ...subContentProps,
1132
- ref: forwardedRef,
1133
- style: {
1134
- ...props.style,
1135
- // re-namespace exposed content custom properties
1136
- ...{
1137
- "--radix-context-menu-content-transform-origin": "var(--radix-popper-transform-origin)",
1138
- "--radix-context-menu-content-available-width": "var(--radix-popper-available-width)",
1139
- "--radix-context-menu-content-available-height": "var(--radix-popper-available-height)",
1140
- "--radix-context-menu-trigger-width": "var(--radix-popper-anchor-width)",
1141
- "--radix-context-menu-trigger-height": "var(--radix-popper-anchor-height)"
1142
- }
1143
- }
1144
- }
1145
- );
1146
- });
1147
- ContextMenuSubContent.displayName = SUB_CONTENT_NAME2;
1148
- function whenTouchOrPen(handler) {
1149
- return (event) => event.pointerType !== "mouse" ? handler(event) : void 0;
1150
- }
1151
- var Root22 = ContextMenu;
1152
- var Trigger = ContextMenuTrigger;
1153
- var Portal22 = ContextMenuPortal;
1154
- var Content22 = ContextMenuContent;
1155
- var Group2 = ContextMenuGroup;
1156
- var Label2 = ContextMenuLabel;
1157
- var Item22 = ContextMenuItem;
1158
- var CheckboxItem2 = ContextMenuCheckboxItem;
1159
- var RadioGroup2 = ContextMenuRadioGroup;
1160
- var RadioItem2 = ContextMenuRadioItem;
1161
- var ItemIndicator2 = ContextMenuItemIndicator;
1162
- var Separator2 = ContextMenuSeparator;
1163
- var Arrow22 = ContextMenuArrow;
1164
- var Sub2 = ContextMenuSub;
1165
- var SubTrigger2 = ContextMenuSubTrigger;
1166
- var SubContent2 = ContextMenuSubContent;
1167
- export {
1168
- Arrow22 as Arrow,
1169
- CheckboxItem2 as CheckboxItem,
1170
- Content22 as Content,
1171
- ContextMenu,
1172
- ContextMenuArrow,
1173
- ContextMenuCheckboxItem,
1174
- ContextMenuContent,
1175
- ContextMenuGroup,
1176
- ContextMenuItem,
1177
- ContextMenuItemIndicator,
1178
- ContextMenuLabel,
1179
- ContextMenuPortal,
1180
- ContextMenuRadioGroup,
1181
- ContextMenuRadioItem,
1182
- ContextMenuSeparator,
1183
- ContextMenuSub,
1184
- ContextMenuSubContent,
1185
- ContextMenuSubTrigger,
1186
- ContextMenuTrigger,
1187
- Group2 as Group,
1188
- Item22 as Item,
1189
- ItemIndicator2 as ItemIndicator,
1190
- Label2 as Label,
1191
- Portal22 as Portal,
1192
- RadioGroup2 as RadioGroup,
1193
- RadioItem2 as RadioItem,
1194
- Root22 as Root,
1195
- Separator2 as Separator,
1196
- Sub2 as Sub,
1197
- SubContent2 as SubContent,
1198
- SubTrigger2 as SubTrigger,
1199
- Trigger,
1200
- createContextMenuScope
1201
- };
1202
- //# sourceMappingURL=@radix-ui_react-context-menu.js.map