@yamada-ui/menu 1.0.24-dev-20240418191913 → 1.1.0-dev-20240420143734

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 (51) hide show
  1. package/dist/{chunk-3I42NCZV.mjs → chunk-ATDFQB5W.mjs} +2 -2
  2. package/dist/{chunk-J4OG7DMN.mjs → chunk-B6YWHVG4.mjs} +2 -2
  3. package/dist/{chunk-D6AU4S44.mjs → chunk-JHE6GKYD.mjs} +2 -2
  4. package/dist/chunk-KRNJ4HQH.mjs +63720 -0
  5. package/dist/chunk-KRNJ4HQH.mjs.map +1 -0
  6. package/dist/chunk-RX3BDZRV.mjs +521 -0
  7. package/dist/chunk-RX3BDZRV.mjs.map +1 -0
  8. package/dist/{chunk-6OASXRNF.mjs → chunk-ZADUBQ5D.mjs} +3 -3
  9. package/dist/index.d.mts +3 -3
  10. package/dist/index.d.ts +3 -3
  11. package/dist/index.js +63402 -357
  12. package/dist/index.js.map +1 -1
  13. package/dist/index.mjs +14 -10
  14. package/dist/menu-button.d.mts +9 -1
  15. package/dist/menu-button.d.ts +9 -1
  16. package/dist/menu-button.js +63519 -47
  17. package/dist/menu-button.js.map +1 -1
  18. package/dist/menu-button.mjs +10 -4
  19. package/dist/menu-divider.js +4 -0
  20. package/dist/menu-divider.js.map +1 -1
  21. package/dist/menu-divider.mjs +2 -2
  22. package/dist/menu-group.js +4 -0
  23. package/dist/menu-group.js.map +1 -1
  24. package/dist/menu-group.mjs +2 -2
  25. package/dist/menu-item.d.mts +15 -2
  26. package/dist/menu-item.d.ts +15 -2
  27. package/dist/menu-item.js +132 -22
  28. package/dist/menu-item.js.map +1 -1
  29. package/dist/menu-item.mjs +11 -4
  30. package/dist/menu-list.js +4 -0
  31. package/dist/menu-list.js.map +1 -1
  32. package/dist/menu-list.mjs +2 -2
  33. package/dist/menu-option-group.js +196 -92
  34. package/dist/menu-option-group.js.map +1 -1
  35. package/dist/menu-option-group.mjs +3 -4
  36. package/dist/menu.d.mts +19 -9
  37. package/dist/menu.d.ts +19 -9
  38. package/dist/menu.js +391 -50
  39. package/dist/menu.js.map +1 -1
  40. package/dist/menu.mjs +7 -3
  41. package/package.json +3 -3
  42. package/dist/chunk-SP4GE4RO.mjs +0 -190
  43. package/dist/chunk-SP4GE4RO.mjs.map +0 -1
  44. package/dist/chunk-SUYEIZLL.mjs +0 -61
  45. package/dist/chunk-SUYEIZLL.mjs.map +0 -1
  46. package/dist/chunk-TWAYMPIS.mjs +0 -123
  47. package/dist/chunk-TWAYMPIS.mjs.map +0 -1
  48. /package/dist/{chunk-3I42NCZV.mjs.map → chunk-ATDFQB5W.mjs.map} +0 -0
  49. /package/dist/{chunk-J4OG7DMN.mjs.map → chunk-B6YWHVG4.mjs.map} +0 -0
  50. /package/dist/{chunk-D6AU4S44.mjs.map → chunk-JHE6GKYD.mjs.map} +0 -0
  51. /package/dist/{chunk-6OASXRNF.mjs.map → chunk-ZADUBQ5D.mjs.map} +0 -0
@@ -0,0 +1,521 @@
1
+ "use client"
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
9
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
10
+ }) : x)(function(x) {
11
+ if (typeof require !== "undefined")
12
+ return require.apply(this, arguments);
13
+ throw Error('Dynamic require of "' + x + '" is not supported');
14
+ });
15
+ var __commonJS = (cb, mod) => function __require2() {
16
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
17
+ };
18
+ var __export = (target, all) => {
19
+ for (var name in all)
20
+ __defProp(target, name, { get: all[name], enumerable: true });
21
+ };
22
+ var __copyProps = (to, from, except, desc) => {
23
+ if (from && typeof from === "object" || typeof from === "function") {
24
+ for (let key of __getOwnPropNames(from))
25
+ if (!__hasOwnProp.call(to, key) && key !== except)
26
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
27
+ }
28
+ return to;
29
+ };
30
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
31
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
32
+ // If the importer is in node compatibility mode or this is not an ESM
33
+ // file that has been converted to a CommonJS file using a Babel-
34
+ // compatible transform (i.e. "__esModule" has not been set), then set
35
+ // "default" to the CommonJS "module.exports" for node compatibility.
36
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
37
+ mod
38
+ ));
39
+
40
+ // src/menu-item.tsx
41
+ import { ui, forwardRef } from "@yamada-ui/core";
42
+ import { useClickable } from "@yamada-ui/use-clickable";
43
+ import {
44
+ ariaAttr,
45
+ createContext as createContext2,
46
+ cx,
47
+ funcAll as funcAll2,
48
+ handlerAll,
49
+ isActiveElement,
50
+ isHTMLElement,
51
+ mergeRefs,
52
+ useUpdateEffect as useUpdateEffect2
53
+ } from "@yamada-ui/utils";
54
+ import { useCallback as useCallback2, useRef as useRef2, useState as useState2 } from "react";
55
+
56
+ // src/menu.tsx
57
+ import { useMultiComponentStyle, omitThemeProps } from "@yamada-ui/core";
58
+ import { Popover } from "@yamada-ui/popover";
59
+ import { createDescendant } from "@yamada-ui/use-descendant";
60
+ import { useDisclosure } from "@yamada-ui/use-disclosure";
61
+ import {
62
+ createContext,
63
+ funcAll,
64
+ useUnmountEffect,
65
+ useUpdateEffect
66
+ } from "@yamada-ui/utils";
67
+ import { useCallback, useEffect, useId, useRef, useState } from "react";
68
+ import { jsx } from "react/jsx-runtime";
69
+ var {
70
+ DescendantsContextProvider,
71
+ useDescendantsContext: useMenuDescendantsContext,
72
+ useDescendants,
73
+ useDescendant: useMenuDescendant
74
+ } = createDescendant();
75
+ var [MenuProvider, useMenu] = createContext({
76
+ name: "MenuContext",
77
+ errorMessage: `useMenu returned is 'undefined'. Seems you forgot to wrap the components in "<Menu />"`
78
+ });
79
+ var [UpstreamMenuProvider, useUpstreamMenu] = createContext({
80
+ strict: false,
81
+ name: "UpstreamMenuContext"
82
+ });
83
+ var Menu = (props) => {
84
+ var _a, _b;
85
+ const [styles, mergedProps] = useMultiComponentStyle("Menu", props);
86
+ let {
87
+ initialFocusRef,
88
+ closeOnSelect = true,
89
+ closeOnBlur,
90
+ placement,
91
+ duration = 0.2,
92
+ offset,
93
+ onOpen: onOpenProp,
94
+ onClose: onCloseProp,
95
+ ...rest
96
+ } = omitThemeProps(mergedProps);
97
+ const { relatedRef, onUpstreamClose, onDownstreamCloseMapRef } = (_a = useUpstreamMenu()) != null ? _a : {};
98
+ const { setDownstreamOpen, hasDownstreamRef } = (_b = useUpstreamMenuItem()) != null ? _b : {};
99
+ const isNested = !!relatedRef;
100
+ if (isNested) {
101
+ placement != null ? placement : placement = "right-start";
102
+ offset != null ? offset : offset = [-8, 8];
103
+ closeOnBlur != null ? closeOnBlur : closeOnBlur = false;
104
+ } else {
105
+ placement != null ? placement : placement = "bottom-start";
106
+ }
107
+ const descendants = useDescendants();
108
+ const [focusedIndex, setFocusedIndex] = useState(-1);
109
+ const menuRef = useRef(null);
110
+ const timeoutIds = useRef(/* @__PURE__ */ new Set([]));
111
+ const requestAnimationFrameId = useRef(null);
112
+ const onCloseMapRef = useRef(/* @__PURE__ */ new Map());
113
+ const onFocusMenu = useCallback(() => {
114
+ requestAnimationFrame(
115
+ () => {
116
+ var _a2;
117
+ return (_a2 = menuRef.current) == null ? void 0 : _a2.focus({ preventScroll: false });
118
+ }
119
+ );
120
+ }, []);
121
+ const onFocusFirstItem = useCallback(() => {
122
+ const id2 = setTimeout(() => {
123
+ if (initialFocusRef)
124
+ return;
125
+ const first = descendants.enabledFirstValue();
126
+ if (first)
127
+ setFocusedIndex(first.index);
128
+ });
129
+ timeoutIds.current.add(id2);
130
+ }, [descendants, initialFocusRef]);
131
+ const onFocusLastItem = useCallback(() => {
132
+ const id2 = setTimeout(() => {
133
+ if (initialFocusRef)
134
+ return;
135
+ const last = descendants.enabledLastValue();
136
+ if (last)
137
+ setFocusedIndex(last.index);
138
+ });
139
+ timeoutIds.current.add(id2);
140
+ }, [descendants, initialFocusRef]);
141
+ const onOpenInternal = useCallback(() => {
142
+ onOpenProp == null ? void 0 : onOpenProp();
143
+ if (!isNested)
144
+ onFocusMenu();
145
+ }, [onOpenProp, isNested, onFocusMenu]);
146
+ const onCloseInternal = useCallback(() => {
147
+ onCloseProp == null ? void 0 : onCloseProp();
148
+ for (const onClose2 of onCloseMapRef.current.values()) {
149
+ onClose2();
150
+ }
151
+ }, [onCloseProp]);
152
+ const id = useId();
153
+ const { isOpen, onOpen, onClose } = useDisclosure({
154
+ ...props,
155
+ onOpen: onOpenInternal,
156
+ onClose: onCloseInternal
157
+ });
158
+ useEffect(() => {
159
+ const onCloseMap = onDownstreamCloseMapRef == null ? void 0 : onDownstreamCloseMapRef.current;
160
+ onCloseMap == null ? void 0 : onCloseMap.set(id, onClose);
161
+ return () => {
162
+ onCloseMap == null ? void 0 : onCloseMap.delete(id);
163
+ };
164
+ }, [id, onClose, onDownstreamCloseMapRef]);
165
+ useEffect(() => {
166
+ if (setDownstreamOpen)
167
+ setDownstreamOpen(isOpen);
168
+ }, [setDownstreamOpen, isOpen]);
169
+ useEffect(() => {
170
+ if (hasDownstreamRef)
171
+ hasDownstreamRef.current = true;
172
+ return () => {
173
+ if (hasDownstreamRef)
174
+ hasDownstreamRef.current = false;
175
+ };
176
+ });
177
+ useUpdateEffect(() => {
178
+ if (!isOpen)
179
+ setFocusedIndex(-1);
180
+ }, [isOpen]);
181
+ useUnmountEffect(() => {
182
+ timeoutIds.current.forEach((id2) => clearTimeout(id2));
183
+ timeoutIds.current.clear();
184
+ });
185
+ return /* @__PURE__ */ jsx(DescendantsContextProvider, { value: descendants, children: /* @__PURE__ */ jsx(
186
+ UpstreamMenuProvider,
187
+ {
188
+ value: {
189
+ relatedRef: menuRef,
190
+ onDownstreamCloseMapRef: onCloseMapRef,
191
+ onUpstreamClose: funcAll(onUpstreamClose, onClose)
192
+ },
193
+ children: /* @__PURE__ */ jsx(
194
+ MenuProvider,
195
+ {
196
+ value: {
197
+ isOpen,
198
+ onOpen,
199
+ onClose,
200
+ onUpstreamClose,
201
+ onFocusFirstItem,
202
+ onFocusLastItem,
203
+ closeOnSelect,
204
+ focusedIndex,
205
+ setFocusedIndex,
206
+ menuRef,
207
+ requestAnimationFrameId,
208
+ isNested,
209
+ styles
210
+ },
211
+ children: /* @__PURE__ */ jsx(
212
+ Popover,
213
+ {
214
+ ...{
215
+ trigger: isNested ? "hover" : "click",
216
+ ...rest,
217
+ isOpen,
218
+ onOpen,
219
+ onClose,
220
+ placement,
221
+ offset,
222
+ duration,
223
+ initialFocusRef,
224
+ relatedRef,
225
+ closeOnButton: false,
226
+ closeOnBlur
227
+ }
228
+ }
229
+ )
230
+ }
231
+ )
232
+ }
233
+ ) });
234
+ };
235
+
236
+ // src/menu-item.tsx
237
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
238
+ var [UpstreamMenuItemProvider, useUpstreamMenuItem] = createContext2({
239
+ strict: false,
240
+ name: "UpstreamMenuItemContext"
241
+ });
242
+ var isTargetMenuItem = (target) => {
243
+ var _a;
244
+ return isHTMLElement(target) && !!((_a = target == null ? void 0 : target.getAttribute("role")) == null ? void 0 : _a.startsWith("menu-item"));
245
+ };
246
+ var MenuItem = forwardRef(
247
+ ({
248
+ as,
249
+ className,
250
+ type,
251
+ isDisabled,
252
+ isFocusable,
253
+ closeOnSelect: customCloseOnSelect,
254
+ icon,
255
+ command,
256
+ children,
257
+ onClick: onClickProp,
258
+ onFocus: onFocusProp,
259
+ onMouseEnter: onMouseEnterProp,
260
+ onMouseMove: onMouseMoveProp,
261
+ onMouseLeave: onMouseLeaveProp,
262
+ onKeyDown: onKeyDownProp,
263
+ ...props
264
+ }, ref) => {
265
+ var _a;
266
+ const {
267
+ focusedIndex,
268
+ setFocusedIndex,
269
+ isOpen,
270
+ onClose,
271
+ onUpstreamClose,
272
+ closeOnSelect: generalCloseOnSelect,
273
+ menuRef,
274
+ requestAnimationFrameId,
275
+ isNested,
276
+ styles
277
+ } = useMenu();
278
+ const { onUpstreamRestoreFocus } = (_a = useUpstreamMenuItem()) != null ? _a : {};
279
+ const trulyDisabled = isDisabled && !isFocusable;
280
+ const buttonRef = useRef2(null);
281
+ const hasDownstreamRef = useRef2(false);
282
+ const onKeyDownRef = useRef2(
283
+ () => void 0
284
+ );
285
+ const { index, register } = useMenuDescendant({ disabled: trulyDisabled });
286
+ const [isDownstreamOpen, setDownstreamOpen] = useState2(false);
287
+ const isFocused = index === focusedIndex;
288
+ const onMouseEnter = useCallback2(
289
+ (event) => {
290
+ onMouseEnterProp == null ? void 0 : onMouseEnterProp(event);
291
+ if (isDisabled)
292
+ return;
293
+ setFocusedIndex(index);
294
+ },
295
+ [setFocusedIndex, index, isDisabled, onMouseEnterProp]
296
+ );
297
+ const onMouseMove = useCallback2(
298
+ (event) => {
299
+ onMouseMoveProp == null ? void 0 : onMouseMoveProp(event);
300
+ if (buttonRef.current && !isActiveElement(buttonRef.current))
301
+ onMouseEnter(event);
302
+ },
303
+ [onMouseEnter, onMouseMoveProp]
304
+ );
305
+ const onMouseLeave = useCallback2(
306
+ (event) => {
307
+ onMouseLeaveProp == null ? void 0 : onMouseLeaveProp(event);
308
+ if (isDisabled)
309
+ return;
310
+ setFocusedIndex(-1);
311
+ },
312
+ [setFocusedIndex, isDisabled, onMouseLeaveProp]
313
+ );
314
+ const onClick = useCallback2(
315
+ (ev) => {
316
+ onClickProp == null ? void 0 : onClickProp(ev);
317
+ if (!isTargetMenuItem(ev.currentTarget))
318
+ return;
319
+ const hasDownstream = hasDownstreamRef.current;
320
+ if (customCloseOnSelect != null ? customCloseOnSelect : !hasDownstream && generalCloseOnSelect) {
321
+ onClose();
322
+ onUpstreamClose == null ? void 0 : onUpstreamClose();
323
+ }
324
+ },
325
+ [
326
+ onClickProp,
327
+ customCloseOnSelect,
328
+ generalCloseOnSelect,
329
+ onClose,
330
+ onUpstreamClose
331
+ ]
332
+ );
333
+ const onFocus = useCallback2(
334
+ (ev) => {
335
+ onFocusProp == null ? void 0 : onFocusProp(ev);
336
+ setFocusedIndex(index);
337
+ },
338
+ [onFocusProp, setFocusedIndex, index]
339
+ );
340
+ const onRestoreFocus = useCallback2(() => {
341
+ var _a2;
342
+ (_a2 = buttonRef.current) == null ? void 0 : _a2.focus();
343
+ setFocusedIndex(index);
344
+ }, [setFocusedIndex, index]);
345
+ const onKeyDown = useCallback2(
346
+ (ev) => {
347
+ onKeyDownProp == null ? void 0 : onKeyDownProp(ev);
348
+ const actions = {
349
+ ArrowLeft: isNested ? funcAll2(onUpstreamRestoreFocus, onClose) : void 0
350
+ };
351
+ const action = actions[ev.key];
352
+ if (!action)
353
+ return;
354
+ ev.preventDefault();
355
+ ev.stopPropagation();
356
+ action();
357
+ },
358
+ [onKeyDownProp, onUpstreamRestoreFocus, onClose, isNested]
359
+ );
360
+ const rest = useClickable({
361
+ focusOnClick: false,
362
+ ...props,
363
+ onClick,
364
+ onFocus,
365
+ onMouseEnter,
366
+ onMouseMove,
367
+ onMouseLeave,
368
+ onKeyDown: handlerAll(onKeyDown, onKeyDownRef.current),
369
+ ref: mergeRefs(register, buttonRef, ref),
370
+ isDisabled,
371
+ isFocusable
372
+ });
373
+ useUpdateEffect2(() => {
374
+ if (!isOpen)
375
+ return;
376
+ const id = requestAnimationFrameId.current;
377
+ if (isFocused && !trulyDisabled && buttonRef.current) {
378
+ if (id)
379
+ cancelAnimationFrame(id);
380
+ requestAnimationFrameId.current = requestAnimationFrame(() => {
381
+ var _a2;
382
+ (_a2 = buttonRef.current) == null ? void 0 : _a2.focus({ preventScroll: true });
383
+ requestAnimationFrameId.current = null;
384
+ });
385
+ } else if (menuRef.current && !isActiveElement(menuRef.current)) {
386
+ menuRef.current.focus({ preventScroll: true });
387
+ }
388
+ return () => {
389
+ if (id)
390
+ cancelAnimationFrame(id);
391
+ };
392
+ }, [isFocused, trulyDisabled, menuRef, isOpen]);
393
+ type = as || type ? type != null ? type : void 0 : "button";
394
+ children = icon || command ? /* @__PURE__ */ jsx2(ui.span, { style: { flex: 1 }, children }) : children;
395
+ const css = {
396
+ textDecoration: "none",
397
+ color: "inherit",
398
+ userSelect: "none",
399
+ display: "flex",
400
+ width: "100%",
401
+ alignItems: "center",
402
+ textAlign: "start",
403
+ flex: "0 0 auto",
404
+ outline: 0,
405
+ gap: "0.75rem",
406
+ ...styles.item
407
+ };
408
+ return /* @__PURE__ */ jsx2(
409
+ UpstreamMenuItemProvider,
410
+ {
411
+ value: {
412
+ onKeyDownRef,
413
+ onUpstreamRestoreFocus: onRestoreFocus,
414
+ setDownstreamOpen,
415
+ hasDownstreamRef
416
+ },
417
+ children: /* @__PURE__ */ jsxs(
418
+ ui.li,
419
+ {
420
+ ...rest,
421
+ ...isDownstreamOpen ? { "data-active": "" } : {},
422
+ as,
423
+ type,
424
+ role: "menu-item",
425
+ tabIndex: isFocused ? 0 : -1,
426
+ className: cx("ui-menu__item", className),
427
+ __css: css,
428
+ children: [
429
+ icon ? /* @__PURE__ */ jsx2(MenuIcon, { children: icon }) : null,
430
+ children,
431
+ command ? /* @__PURE__ */ jsx2(MenuCommand, { children: command }) : null
432
+ ]
433
+ }
434
+ )
435
+ }
436
+ );
437
+ }
438
+ );
439
+ var MenuOptionItem = forwardRef(
440
+ ({ className, icon, isChecked, closeOnSelect = false, children, ...rest }, ref) => {
441
+ return /* @__PURE__ */ jsxs(
442
+ MenuItem,
443
+ {
444
+ ref,
445
+ className: cx("ui-menu__item--option", className),
446
+ "aria-checked": ariaAttr(isChecked),
447
+ closeOnSelect,
448
+ ...rest,
449
+ children: [
450
+ icon !== null ? /* @__PURE__ */ jsx2(MenuIcon, { opacity: isChecked ? 1 : 0, children: icon || /* @__PURE__ */ jsx2(CheckIcon, {}) }) : null,
451
+ children
452
+ ]
453
+ }
454
+ );
455
+ }
456
+ );
457
+ var MenuIcon = forwardRef(
458
+ ({ className, ...rest }, ref) => {
459
+ const { styles } = useMenu();
460
+ const css = {
461
+ flexShrink: 0,
462
+ display: "inline-flex",
463
+ justifyContent: "center",
464
+ alignItems: "center",
465
+ fontSize: "0.85em",
466
+ ...styles.icon
467
+ };
468
+ return /* @__PURE__ */ jsx2(
469
+ ui.span,
470
+ {
471
+ ref,
472
+ className: cx("ui-menu__item__icon", className),
473
+ __css: css,
474
+ ...rest
475
+ }
476
+ );
477
+ }
478
+ );
479
+ var MenuCommand = forwardRef(
480
+ ({ className, ...rest }, ref) => {
481
+ const { styles } = useMenu();
482
+ const css = { ...styles.command };
483
+ return /* @__PURE__ */ jsx2(
484
+ ui.span,
485
+ {
486
+ ref,
487
+ className: cx("ui-menu__item__command", className),
488
+ __css: css,
489
+ ...rest
490
+ }
491
+ );
492
+ }
493
+ );
494
+ var CheckIcon = () => /* @__PURE__ */ jsx2("svg", { viewBox: "0 0 14 14", width: "1em", height: "1em", children: /* @__PURE__ */ jsx2(
495
+ "polygon",
496
+ {
497
+ fill: "currentColor",
498
+ points: "5.5 11.9993304 14 3.49933039 12.5 2 5.5 8.99933039 1.5 4.9968652 0 6.49933039"
499
+ }
500
+ ) });
501
+
502
+ export {
503
+ __require,
504
+ __commonJS,
505
+ __export,
506
+ __reExport,
507
+ __toESM,
508
+ UpstreamMenuItemProvider,
509
+ useUpstreamMenuItem,
510
+ MenuItem,
511
+ MenuOptionItem,
512
+ MenuIcon,
513
+ MenuCommand,
514
+ useMenuDescendantsContext,
515
+ useMenuDescendant,
516
+ useMenu,
517
+ UpstreamMenuProvider,
518
+ useUpstreamMenu,
519
+ Menu
520
+ };
521
+ //# sourceMappingURL=chunk-RX3BDZRV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/menu-item.tsx","../src/menu.tsx"],"sourcesContent":["import type { HTMLUIProps, CSSUIObject } from \"@yamada-ui/core\"\nimport { ui, forwardRef } from \"@yamada-ui/core\"\nimport { useClickable } from \"@yamada-ui/use-clickable\"\nimport {\n ariaAttr,\n createContext,\n cx,\n funcAll,\n handlerAll,\n isActiveElement,\n isHTMLElement,\n mergeRefs,\n useUpdateEffect,\n} from \"@yamada-ui/utils\"\nimport type {\n Dispatch,\n FC,\n FocusEvent,\n KeyboardEvent,\n KeyboardEventHandler,\n MouseEvent,\n MutableRefObject,\n ReactElement,\n RefObject,\n SetStateAction,\n} from \"react\"\nimport { useCallback, useRef, useState } from \"react\"\nimport { useMenu, useMenuDescendant } from \"./menu\"\n\ntype UpstreamMenuItemContext = {\n onUpstreamRestoreFocus: () => void\n onKeyDownRef: RefObject<KeyboardEventHandler<HTMLButtonElement>>\n setDownstreamOpen: Dispatch<SetStateAction<boolean>>\n hasDownstreamRef: MutableRefObject<boolean>\n}\n\nexport const [UpstreamMenuItemProvider, useUpstreamMenuItem] =\n createContext<UpstreamMenuItemContext>({\n strict: false,\n name: \"UpstreamMenuItemContext\",\n })\n\nconst isTargetMenuItem = (target: EventTarget | null) => {\n return (\n isHTMLElement(target) &&\n !!target?.getAttribute(\"role\")?.startsWith(\"menu-item\")\n )\n}\n\ntype MenuItemOptions = {\n /**\n * If `true`, the menu item will be disabled.\n *\n * @default false\n */\n isDisabled?: boolean\n /**\n * If `true`, the menu item will be focusable.\n *\n * @default false\n */\n isFocusable?: boolean\n /**\n * If `true`, the list element will be closed when selected.\n *\n * @default false\n */\n closeOnSelect?: boolean\n /**\n * The menu item icon to use.\n */\n icon?: ReactElement\n /**\n * Right-aligned label text content, useful for displaying hotkeys.\n */\n command?: string\n}\n\nexport type MenuItemProps = HTMLUIProps<\"button\"> & MenuItemOptions\n\nexport const MenuItem = forwardRef<MenuItemProps, \"button\">(\n (\n {\n as,\n className,\n type,\n isDisabled,\n isFocusable,\n closeOnSelect: customCloseOnSelect,\n icon,\n command,\n children,\n onClick: onClickProp,\n onFocus: onFocusProp,\n onMouseEnter: onMouseEnterProp,\n onMouseMove: onMouseMoveProp,\n onMouseLeave: onMouseLeaveProp,\n onKeyDown: onKeyDownProp,\n ...props\n },\n ref,\n ) => {\n const {\n focusedIndex,\n setFocusedIndex,\n isOpen,\n onClose,\n onUpstreamClose,\n closeOnSelect: generalCloseOnSelect,\n menuRef,\n requestAnimationFrameId,\n isNested,\n styles,\n } = useMenu()\n const { onUpstreamRestoreFocus } = useUpstreamMenuItem() ?? {}\n\n const trulyDisabled = isDisabled && !isFocusable\n\n const buttonRef = useRef<HTMLButtonElement>(null)\n const hasDownstreamRef = useRef<boolean>(false)\n const onKeyDownRef = useRef<KeyboardEventHandler<HTMLButtonElement>>(\n () => void 0,\n )\n const { index, register } = useMenuDescendant({ disabled: trulyDisabled })\n const [isDownstreamOpen, setDownstreamOpen] = useState<boolean>(false)\n\n const isFocused = index === focusedIndex\n\n const onMouseEnter = useCallback(\n (event: any) => {\n onMouseEnterProp?.(event)\n\n if (isDisabled) return\n\n setFocusedIndex(index)\n },\n [setFocusedIndex, index, isDisabled, onMouseEnterProp],\n )\n\n const onMouseMove = useCallback(\n (event: any) => {\n onMouseMoveProp?.(event)\n\n if (buttonRef.current && !isActiveElement(buttonRef.current))\n onMouseEnter(event)\n },\n [onMouseEnter, onMouseMoveProp],\n )\n\n const onMouseLeave = useCallback(\n (event: any) => {\n onMouseLeaveProp?.(event)\n\n if (isDisabled) return\n\n setFocusedIndex(-1)\n },\n [setFocusedIndex, isDisabled, onMouseLeaveProp],\n )\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLButtonElement>) => {\n onClickProp?.(ev)\n\n if (!isTargetMenuItem(ev.currentTarget)) return\n\n const hasDownstream = hasDownstreamRef.current\n\n if (customCloseOnSelect ?? (!hasDownstream && generalCloseOnSelect)) {\n onClose()\n onUpstreamClose?.()\n }\n },\n [\n onClickProp,\n customCloseOnSelect,\n generalCloseOnSelect,\n onClose,\n onUpstreamClose,\n ],\n )\n\n const onFocus = useCallback(\n (ev: FocusEvent<HTMLButtonElement>) => {\n onFocusProp?.(ev)\n\n setFocusedIndex(index)\n },\n [onFocusProp, setFocusedIndex, index],\n )\n\n const onRestoreFocus = useCallback(() => {\n buttonRef.current?.focus()\n\n setFocusedIndex(index)\n }, [setFocusedIndex, index])\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLButtonElement>) => {\n onKeyDownProp?.(ev)\n\n const actions: Record<string, Function | undefined> = {\n ArrowLeft: isNested\n ? funcAll(onUpstreamRestoreFocus, onClose)\n : undefined,\n }\n\n const action = actions[ev.key]\n\n if (!action) return\n\n ev.preventDefault()\n ev.stopPropagation()\n\n action()\n },\n [onKeyDownProp, onUpstreamRestoreFocus, onClose, isNested],\n )\n\n const rest = useClickable<HTMLButtonElement>({\n focusOnClick: false,\n ...props,\n onClick,\n onFocus,\n onMouseEnter,\n onMouseMove,\n onMouseLeave,\n onKeyDown: handlerAll(onKeyDown, onKeyDownRef.current),\n ref: mergeRefs(register, buttonRef, ref),\n isDisabled,\n isFocusable,\n })\n\n useUpdateEffect(() => {\n if (!isOpen) return\n\n const id = requestAnimationFrameId.current\n\n if (isFocused && !trulyDisabled && buttonRef.current) {\n if (id) cancelAnimationFrame(id)\n\n requestAnimationFrameId.current = requestAnimationFrame(() => {\n buttonRef.current?.focus({ preventScroll: true })\n\n requestAnimationFrameId.current = null\n })\n } else if (menuRef.current && !isActiveElement(menuRef.current)) {\n menuRef.current.focus({ preventScroll: true })\n }\n\n return () => {\n if (id) cancelAnimationFrame(id)\n }\n }, [isFocused, trulyDisabled, menuRef, isOpen])\n\n type = as || type ? type ?? undefined : \"button\"\n\n children =\n icon || command ? (\n <ui.span style={{ flex: 1 }}>{children}</ui.span>\n ) : (\n children\n )\n\n const css: CSSUIObject = {\n textDecoration: \"none\",\n color: \"inherit\",\n userSelect: \"none\",\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n textAlign: \"start\",\n flex: \"0 0 auto\",\n outline: 0,\n gap: \"0.75rem\",\n ...styles.item,\n }\n\n return (\n <UpstreamMenuItemProvider\n value={{\n onKeyDownRef,\n onUpstreamRestoreFocus: onRestoreFocus,\n setDownstreamOpen,\n hasDownstreamRef,\n }}\n >\n <ui.li\n {...rest}\n {...(isDownstreamOpen ? { \"data-active\": \"\" } : {})}\n as={as}\n type={type}\n role=\"menu-item\"\n tabIndex={isFocused ? 0 : -1}\n className={cx(\"ui-menu__item\", className)}\n __css={css}\n >\n {icon ? <MenuIcon>{icon}</MenuIcon> : null}\n {children}\n {command ? <MenuCommand>{command}</MenuCommand> : null}\n </ui.li>\n </UpstreamMenuItemProvider>\n )\n },\n)\n\ntype MenuOptionItemOptions = {\n /**\n * The menu option item icon to use.\n */\n icon?: ReactElement | null\n /**\n * The value of the menu option item.\n */\n value?: string\n /**\n * If `true`, the checkbox or radio will be checked.\n *\n * @default false\n */\n isChecked?: boolean\n /**\n * The type of the menu option item.\n */\n type?: \"radio\" | \"checkbox\"\n}\n\nexport type MenuOptionItemProps = Omit<MenuItemProps, \"icon\" | \"command\"> &\n MenuOptionItemOptions\n\nexport const MenuOptionItem = forwardRef<MenuOptionItemProps, \"button\">(\n (\n { className, icon, isChecked, closeOnSelect = false, children, ...rest },\n ref,\n ) => {\n return (\n <MenuItem\n ref={ref}\n className={cx(\"ui-menu__item--option\", className)}\n aria-checked={ariaAttr(isChecked)}\n closeOnSelect={closeOnSelect}\n {...rest}\n >\n {icon !== null ? (\n <MenuIcon opacity={isChecked ? 1 : 0}>\n {icon || <CheckIcon />}\n </MenuIcon>\n ) : null}\n {children}\n </MenuItem>\n )\n },\n)\n\nexport type MenuIconProps = HTMLUIProps<\"span\">\n\nexport const MenuIcon = forwardRef<MenuIconProps, \"span\">(\n ({ className, ...rest }, ref) => {\n const { styles } = useMenu()\n\n const css: CSSUIObject = {\n flexShrink: 0,\n display: \"inline-flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n fontSize: \"0.85em\",\n ...styles.icon,\n }\n\n return (\n <ui.span\n ref={ref}\n className={cx(\"ui-menu__item__icon\", className)}\n __css={css}\n {...rest}\n />\n )\n },\n)\n\nexport type MenuCommandProps = HTMLUIProps<\"span\">\n\nexport const MenuCommand = forwardRef<MenuCommandProps, \"span\">(\n ({ className, ...rest }, ref) => {\n const { styles } = useMenu()\n\n const css: CSSUIObject = { ...styles.command }\n\n return (\n <ui.span\n ref={ref}\n className={cx(\"ui-menu__item__command\", className)}\n __css={css}\n {...rest}\n />\n )\n },\n)\n\nconst CheckIcon: FC = () => (\n <svg viewBox=\"0 0 14 14\" width=\"1em\" height=\"1em\">\n <polygon\n fill=\"currentColor\"\n points=\"5.5 11.9993304 14 3.49933039 12.5 2 5.5 8.99933039 1.5 4.9968652 0 6.49933039\"\n />\n </svg>\n)\n","import type { CSSUIObject, ThemeProps } from \"@yamada-ui/core\"\nimport { useMultiComponentStyle, omitThemeProps } from \"@yamada-ui/core\"\nimport type { PopoverProps } from \"@yamada-ui/popover\"\nimport { Popover } from \"@yamada-ui/popover\"\nimport { createDescendant } from \"@yamada-ui/use-descendant\"\nimport { useDisclosure } from \"@yamada-ui/use-disclosure\"\nimport {\n createContext,\n funcAll,\n useUnmountEffect,\n useUpdateEffect,\n} from \"@yamada-ui/utils\"\nimport type {\n Dispatch,\n FC,\n MutableRefObject,\n RefObject,\n SetStateAction,\n} from \"react\"\nimport { useCallback, useEffect, useId, useRef, useState } from \"react\"\nimport { useUpstreamMenuItem } from \"./menu-item\"\n\nconst {\n DescendantsContextProvider,\n useDescendantsContext: useMenuDescendantsContext,\n useDescendants,\n useDescendant: useMenuDescendant,\n} = createDescendant<HTMLElement>()\n\nexport { useMenuDescendantsContext, useMenuDescendant }\n\ntype MenuContext = MenuOptions & {\n isOpen: boolean\n onOpen: () => void\n onClose: () => void\n onUpstreamClose?: () => void\n onFocusFirstItem: () => void\n onFocusLastItem: () => void\n focusedIndex: number\n setFocusedIndex: Dispatch<SetStateAction<number>>\n menuRef: RefObject<HTMLDivElement>\n requestAnimationFrameId: MutableRefObject<number | null>\n isNested: boolean\n styles: Record<string, CSSUIObject>\n}\n\nconst [MenuProvider, useMenu] = createContext<MenuContext>({\n name: \"MenuContext\",\n errorMessage: `useMenu returned is 'undefined'. Seems you forgot to wrap the components in \"<Menu />\"`,\n})\n\ntype UpstreamMenuContext = {\n relatedRef: RefObject<HTMLElement>\n onDownstreamCloseMapRef: MutableRefObject<Map<string, () => void>>\n onUpstreamClose: () => void\n}\n\nexport const [UpstreamMenuProvider, useUpstreamMenu] =\n createContext<UpstreamMenuContext>({\n strict: false,\n name: \"UpstreamMenuContext\",\n })\n\nexport { useMenu }\n\ntype MenuOptions = {\n /**\n * If `true`, the list element will be closed when value is selected.\n *\n * @default true\n */\n closeOnSelect?: boolean\n}\n\nexport type MenuProps = ThemeProps<\"Menu\"> &\n Omit<PopoverProps, \"closeOnButton\" | \"relatedRef\"> &\n MenuOptions\n\n/**\n * `Menu` is a component that displays a common dropdown menu.\n *\n * @see Docs https://yamada-ui.com/components/overlay/menu\n */\nexport const Menu: FC<MenuProps> = (props) => {\n const [styles, mergedProps] = useMultiComponentStyle(\"Menu\", props)\n let {\n initialFocusRef,\n closeOnSelect = true,\n closeOnBlur,\n placement,\n duration = 0.2,\n offset,\n onOpen: onOpenProp,\n onClose: onCloseProp,\n ...rest\n } = omitThemeProps(mergedProps)\n const { relatedRef, onUpstreamClose, onDownstreamCloseMapRef } =\n useUpstreamMenu() ?? {}\n const { setDownstreamOpen, hasDownstreamRef } = useUpstreamMenuItem() ?? {}\n const isNested = !!relatedRef\n\n if (isNested) {\n placement ??= \"right-start\"\n offset ??= [-8, 8]\n closeOnBlur ??= false\n } else {\n placement ??= \"bottom-start\"\n }\n\n const descendants = useDescendants()\n\n const [focusedIndex, setFocusedIndex] = useState<number>(-1)\n\n const menuRef = useRef<HTMLDivElement>(null)\n const timeoutIds = useRef<Set<any>>(new Set([]))\n const requestAnimationFrameId = useRef<number | null>(null)\n const onCloseMapRef = useRef<Map<string, () => void>>(new Map())\n\n const onFocusMenu = useCallback(() => {\n requestAnimationFrame(() =>\n menuRef.current?.focus({ preventScroll: false }),\n )\n }, [])\n\n const onFocusFirstItem = useCallback(() => {\n const id = setTimeout(() => {\n if (initialFocusRef) return\n\n const first = descendants.enabledFirstValue()\n\n if (first) setFocusedIndex(first.index)\n })\n\n timeoutIds.current.add(id)\n }, [descendants, initialFocusRef])\n\n const onFocusLastItem = useCallback(() => {\n const id = setTimeout(() => {\n if (initialFocusRef) return\n\n const last = descendants.enabledLastValue()\n\n if (last) setFocusedIndex(last.index)\n })\n\n timeoutIds.current.add(id)\n }, [descendants, initialFocusRef])\n\n const onOpenInternal = useCallback(() => {\n onOpenProp?.()\n\n if (!isNested) onFocusMenu()\n }, [onOpenProp, isNested, onFocusMenu])\n\n const onCloseInternal = useCallback(() => {\n onCloseProp?.()\n\n for (const onClose of onCloseMapRef.current.values()) {\n onClose()\n }\n }, [onCloseProp])\n\n const id = useId()\n const { isOpen, onOpen, onClose } = useDisclosure({\n ...props,\n onOpen: onOpenInternal,\n onClose: onCloseInternal,\n })\n\n useEffect(() => {\n const onCloseMap = onDownstreamCloseMapRef?.current\n\n onCloseMap?.set(id, onClose)\n\n return () => {\n onCloseMap?.delete(id)\n }\n }, [id, onClose, onDownstreamCloseMapRef])\n\n useEffect(() => {\n if (setDownstreamOpen) setDownstreamOpen(isOpen)\n }, [setDownstreamOpen, isOpen])\n\n useEffect(() => {\n if (hasDownstreamRef) hasDownstreamRef.current = true\n\n return () => {\n if (hasDownstreamRef) hasDownstreamRef.current = false\n }\n })\n\n useUpdateEffect(() => {\n if (!isOpen) setFocusedIndex(-1)\n }, [isOpen])\n\n useUnmountEffect(() => {\n timeoutIds.current.forEach((id) => clearTimeout(id))\n timeoutIds.current.clear()\n })\n\n return (\n <DescendantsContextProvider value={descendants}>\n <UpstreamMenuProvider\n value={{\n relatedRef: menuRef,\n onDownstreamCloseMapRef: onCloseMapRef,\n onUpstreamClose: funcAll(onUpstreamClose, onClose),\n }}\n >\n <MenuProvider\n value={{\n isOpen,\n onOpen,\n onClose,\n onUpstreamClose,\n onFocusFirstItem,\n onFocusLastItem,\n closeOnSelect,\n focusedIndex,\n setFocusedIndex,\n menuRef,\n requestAnimationFrameId,\n isNested,\n styles,\n }}\n >\n <Popover\n {...{\n trigger: isNested ? \"hover\" : \"click\",\n ...rest,\n isOpen,\n onOpen,\n onClose,\n placement,\n offset,\n duration,\n initialFocusRef,\n relatedRef,\n closeOnButton: false,\n closeOnBlur,\n }}\n />\n </MenuProvider>\n </UpstreamMenuProvider>\n </DescendantsContextProvider>\n )\n}\n"],"mappings":"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","names":["createContext","funcAll","useUpdateEffect","useCallback","useRef","useState","_a","id","onClose","jsx","createContext","useRef","useState","useCallback","_a","funcAll","useUpdateEffect"]}
@@ -1,10 +1,10 @@
1
1
  "use client"
2
2
  import {
3
3
  MenuGroup
4
- } from "./chunk-3I42NCZV.mjs";
4
+ } from "./chunk-ATDFQB5W.mjs";
5
5
  import {
6
6
  MenuOptionItem
7
- } from "./chunk-SP4GE4RO.mjs";
7
+ } from "./chunk-RX3BDZRV.mjs";
8
8
 
9
9
  // src/menu-option-group.tsx
10
10
  import { useControllableState } from "@yamada-ui/use-controllable-state";
@@ -64,4 +64,4 @@ MenuOptionGroup.displayName = "MenuOptionGroup";
64
64
  export {
65
65
  MenuOptionGroup
66
66
  };
67
- //# sourceMappingURL=chunk-6OASXRNF.mjs.map
67
+ //# sourceMappingURL=chunk-ZADUBQ5D.mjs.map
package/dist/index.d.mts CHANGED
@@ -1,11 +1,11 @@
1
1
  export { Menu, MenuProps } from './menu.mjs';
2
- export { MenuButton, MenuButtonProps } from './menu-button.mjs';
2
+ export { MenuButton, MenuButtonProps, MenuItemButton, MenuItemButtonProps } from './menu-button.mjs';
3
3
  export { MenuList, MenuListProps } from './menu-list.mjs';
4
- export { MenuItem, MenuItemProps, MenuOptionItem, MenuOptionItemProps } from './menu-item.mjs';
4
+ export { MenuCommand, MenuCommandProps, MenuIcon, MenuIconProps, MenuItem, MenuItemProps, MenuOptionItem, MenuOptionItemProps } from './menu-item.mjs';
5
5
  export { MenuGroup, MenuGroupProps } from './menu-group.mjs';
6
6
  export { MenuOptionGroup, MenuOptionGroupProps } from './menu-option-group.mjs';
7
7
  export { MenuDivider, MenuDividerProps } from './menu-divider.mjs';
8
+ import 'react';
8
9
  import '@yamada-ui/core';
9
10
  import '@yamada-ui/popover';
10
- import 'react';
11
11
  import '@yamada-ui/motion';
package/dist/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  export { Menu, MenuProps } from './menu.js';
2
- export { MenuButton, MenuButtonProps } from './menu-button.js';
2
+ export { MenuButton, MenuButtonProps, MenuItemButton, MenuItemButtonProps } from './menu-button.js';
3
3
  export { MenuList, MenuListProps } from './menu-list.js';
4
- export { MenuItem, MenuItemProps, MenuOptionItem, MenuOptionItemProps } from './menu-item.js';
4
+ export { MenuCommand, MenuCommandProps, MenuIcon, MenuIconProps, MenuItem, MenuItemProps, MenuOptionItem, MenuOptionItemProps } from './menu-item.js';
5
5
  export { MenuGroup, MenuGroupProps } from './menu-group.js';
6
6
  export { MenuOptionGroup, MenuOptionGroupProps } from './menu-option-group.js';
7
7
  export { MenuDivider, MenuDividerProps } from './menu-divider.js';
8
+ import 'react';
8
9
  import '@yamada-ui/core';
9
10
  import '@yamada-ui/popover';
10
- import 'react';
11
11
  import '@yamada-ui/motion';