Files
wdi-dashboard/node_modules/@chakra-ui/menu/dist/menu-item.js
2024-08-16 15:06:52 +05:30

477 lines
16 KiB
JavaScript

'use client'
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/menu-item.tsx
var menu_item_exports = {};
__export(menu_item_exports, {
MenuItem: () => MenuItem
});
module.exports = __toCommonJS(menu_item_exports);
var import_system5 = require("@chakra-ui/system");
var import_shared_utils4 = require("@chakra-ui/shared-utils");
// src/menu-command.tsx
var import_system2 = require("@chakra-ui/system");
// src/menu.tsx
var import_react_context2 = require("@chakra-ui/react-context");
var import_system = require("@chakra-ui/system");
var import_shared_utils2 = require("@chakra-ui/shared-utils");
var import_react2 = require("react");
// src/use-menu.ts
var import_clickable = require("@chakra-ui/clickable");
var import_descendant = require("@chakra-ui/descendant");
var import_react_use_focus_effect = require("@chakra-ui/react-use-focus-effect");
var import_popper = require("@chakra-ui/popper");
var import_react_use_disclosure = require("@chakra-ui/react-use-disclosure");
var import_react_use_outside_click = require("@chakra-ui/react-use-outside-click");
var import_react_use_animation_state = require("@chakra-ui/react-use-animation-state");
var import_react_context = require("@chakra-ui/react-context");
var import_react_children_utils = require("@chakra-ui/react-children-utils");
var import_react_use_controllable_state = require("@chakra-ui/react-use-controllable-state");
var import_react_use_update_effect = require("@chakra-ui/react-use-update-effect");
var import_react_use_merge_refs = require("@chakra-ui/react-use-merge-refs");
var import_shared_utils = require("@chakra-ui/shared-utils");
var import_lazy_utils = require("@chakra-ui/lazy-utils");
var import_react = require("react");
var [
MenuDescendantsProvider,
useMenuDescendantsContext,
useMenuDescendants,
useMenuDescendant
] = (0, import_descendant.createDescendantContext)();
var [MenuProvider, useMenuContext] = (0, import_react_context.createContext)({
strict: false,
name: "MenuContext"
});
function useIds(idProp, ...prefixes) {
const reactId = (0, import_react.useId)();
const id = idProp || reactId;
return (0, import_react.useMemo)(() => {
return prefixes.map((prefix) => `${prefix}-${id}`);
}, [id, prefixes]);
}
function getOwnerDocument(node) {
var _a;
return (_a = node == null ? void 0 : node.ownerDocument) != null ? _a : document;
}
function isActiveElement(element) {
const doc = getOwnerDocument(element);
return doc.activeElement === element;
}
function useMenu(props = {}) {
const {
id,
closeOnSelect = true,
closeOnBlur = true,
initialFocusRef,
autoSelect = true,
isLazy,
isOpen: isOpenProp,
defaultIsOpen,
onClose: onCloseProp,
onOpen: onOpenProp,
placement = "bottom-start",
lazyBehavior = "unmount",
direction,
computePositionOnMount = false,
...popperProps
} = props;
const menuRef = (0, import_react.useRef)(null);
const buttonRef = (0, import_react.useRef)(null);
const descendants = useMenuDescendants();
const focusMenu = (0, import_react.useCallback)(() => {
requestAnimationFrame(() => {
var _a;
(_a = menuRef.current) == null ? void 0 : _a.focus({ preventScroll: false });
});
}, []);
const focusFirstItem = (0, import_react.useCallback)(() => {
const id2 = setTimeout(() => {
var _a;
if (initialFocusRef) {
(_a = initialFocusRef.current) == null ? void 0 : _a.focus();
} else {
const first = descendants.firstEnabled();
if (first)
setFocusedIndex(first.index);
}
});
timeoutIds.current.add(id2);
}, [descendants, initialFocusRef]);
const focusLastItem = (0, import_react.useCallback)(() => {
const id2 = setTimeout(() => {
const last = descendants.lastEnabled();
if (last)
setFocusedIndex(last.index);
});
timeoutIds.current.add(id2);
}, [descendants]);
const onOpenInternal = (0, import_react.useCallback)(() => {
onOpenProp == null ? void 0 : onOpenProp();
if (autoSelect) {
focusFirstItem();
} else {
focusMenu();
}
}, [autoSelect, focusFirstItem, focusMenu, onOpenProp]);
const { isOpen, onOpen, onClose, onToggle } = (0, import_react_use_disclosure.useDisclosure)({
isOpen: isOpenProp,
defaultIsOpen,
onClose: onCloseProp,
onOpen: onOpenInternal
});
(0, import_react_use_outside_click.useOutsideClick)({
enabled: isOpen && closeOnBlur,
ref: menuRef,
handler: (event) => {
var _a;
if (!((_a = buttonRef.current) == null ? void 0 : _a.contains(event.target))) {
onClose();
}
}
});
const popper = (0, import_popper.usePopper)({
...popperProps,
enabled: isOpen || computePositionOnMount,
placement,
direction
});
const [focusedIndex, setFocusedIndex] = (0, import_react.useState)(-1);
(0, import_react_use_update_effect.useUpdateEffect)(() => {
if (!isOpen) {
setFocusedIndex(-1);
}
}, [isOpen]);
(0, import_react_use_focus_effect.useFocusOnHide)(menuRef, {
focusRef: buttonRef,
visible: isOpen,
shouldFocus: true
});
const animationState = (0, import_react_use_animation_state.useAnimationState)({ isOpen, ref: menuRef });
const [buttonId, menuId] = useIds(id, `menu-button`, `menu-list`);
const openAndFocusMenu = (0, import_react.useCallback)(() => {
onOpen();
focusMenu();
}, [onOpen, focusMenu]);
const timeoutIds = (0, import_react.useRef)(/* @__PURE__ */ new Set([]));
(0, import_react.useEffect)(() => {
const ids = timeoutIds.current;
return () => {
ids.forEach((id2) => clearTimeout(id2));
ids.clear();
};
}, []);
const openAndFocusFirstItem = (0, import_react.useCallback)(() => {
onOpen();
focusFirstItem();
}, [focusFirstItem, onOpen]);
const openAndFocusLastItem = (0, import_react.useCallback)(() => {
onOpen();
focusLastItem();
}, [onOpen, focusLastItem]);
const refocus = (0, import_react.useCallback)(() => {
var _a, _b;
const doc = getOwnerDocument(menuRef.current);
const hasFocusWithin = (_a = menuRef.current) == null ? void 0 : _a.contains(doc.activeElement);
const shouldRefocus = isOpen && !hasFocusWithin;
if (!shouldRefocus)
return;
const node = (_b = descendants.item(focusedIndex)) == null ? void 0 : _b.node;
node == null ? void 0 : node.focus({ preventScroll: true });
}, [isOpen, focusedIndex, descendants]);
const rafId = (0, import_react.useRef)(null);
return {
openAndFocusMenu,
openAndFocusFirstItem,
openAndFocusLastItem,
onTransitionEnd: refocus,
unstable__animationState: animationState,
descendants,
popper,
buttonId,
menuId,
forceUpdate: popper.forceUpdate,
orientation: "vertical",
isOpen,
onToggle,
onOpen,
onClose,
menuRef,
buttonRef,
focusedIndex,
closeOnSelect,
closeOnBlur,
autoSelect,
setFocusedIndex,
isLazy,
lazyBehavior,
initialFocusRef,
rafId
};
}
function isTargetMenuItem(target) {
var _a;
return isHTMLElement(target) && !!((_a = target == null ? void 0 : target.getAttribute("role")) == null ? void 0 : _a.startsWith("menuitem"));
}
function useMenuItem(props = {}, externalRef = null) {
const {
onMouseEnter: onMouseEnterProp,
onMouseMove: onMouseMoveProp,
onMouseLeave: onMouseLeaveProp,
onClick: onClickProp,
onFocus: onFocusProp,
isDisabled,
isFocusable,
closeOnSelect,
type: typeProp,
...htmlProps
} = props;
const menu = useMenuContext();
const {
setFocusedIndex,
focusedIndex,
closeOnSelect: menuCloseOnSelect,
onClose,
menuRef,
isOpen,
menuId,
rafId
} = menu;
const ref = (0, import_react.useRef)(null);
const id = `${menuId}-menuitem-${(0, import_react.useId)()}`;
const { index, register } = useMenuDescendant({
disabled: isDisabled && !isFocusable
});
const onMouseEnter = (0, import_react.useCallback)(
(event) => {
onMouseEnterProp == null ? void 0 : onMouseEnterProp(event);
if (isDisabled)
return;
setFocusedIndex(index);
},
[setFocusedIndex, index, isDisabled, onMouseEnterProp]
);
const onMouseMove = (0, import_react.useCallback)(
(event) => {
onMouseMoveProp == null ? void 0 : onMouseMoveProp(event);
if (ref.current && !isActiveElement(ref.current)) {
onMouseEnter(event);
}
},
[onMouseEnter, onMouseMoveProp]
);
const onMouseLeave = (0, import_react.useCallback)(
(event) => {
onMouseLeaveProp == null ? void 0 : onMouseLeaveProp(event);
if (isDisabled)
return;
setFocusedIndex(-1);
},
[setFocusedIndex, isDisabled, onMouseLeaveProp]
);
const onClick = (0, import_react.useCallback)(
(event) => {
onClickProp == null ? void 0 : onClickProp(event);
if (!isTargetMenuItem(event.currentTarget))
return;
if (closeOnSelect != null ? closeOnSelect : menuCloseOnSelect) {
onClose();
}
},
[onClose, onClickProp, menuCloseOnSelect, closeOnSelect]
);
const onFocus = (0, import_react.useCallback)(
(event) => {
onFocusProp == null ? void 0 : onFocusProp(event);
setFocusedIndex(index);
},
[setFocusedIndex, onFocusProp, index]
);
const isFocused = index === focusedIndex;
const trulyDisabled = isDisabled && !isFocusable;
(0, import_react_use_update_effect.useUpdateEffect)(() => {
if (!isOpen)
return;
if (isFocused && !trulyDisabled && ref.current) {
if (rafId.current) {
cancelAnimationFrame(rafId.current);
}
rafId.current = requestAnimationFrame(() => {
var _a;
(_a = ref.current) == null ? void 0 : _a.focus({ preventScroll: true });
rafId.current = null;
});
} else if (menuRef.current && !isActiveElement(menuRef.current)) {
menuRef.current.focus({ preventScroll: true });
}
return () => {
if (rafId.current) {
cancelAnimationFrame(rafId.current);
}
};
}, [isFocused, trulyDisabled, menuRef, isOpen]);
const clickableProps = (0, import_clickable.useClickable)({
onClick,
onFocus,
onMouseEnter,
onMouseMove,
onMouseLeave,
ref: (0, import_react_use_merge_refs.mergeRefs)(register, ref, externalRef),
isDisabled,
isFocusable
});
return {
...htmlProps,
...clickableProps,
type: typeProp != null ? typeProp : clickableProps.type,
id,
role: "menuitem",
tabIndex: isFocused ? 0 : -1
};
}
function isHTMLElement(el) {
var _a;
if (!isElement(el))
return false;
const win = (_a = el.ownerDocument.defaultView) != null ? _a : window;
return el instanceof win.HTMLElement;
}
function isElement(el) {
return el != null && typeof el == "object" && "nodeType" in el && el.nodeType === Node.ELEMENT_NODE;
}
// src/menu.tsx
var import_jsx_runtime = require("react/jsx-runtime");
var [MenuStylesProvider, useMenuStyles] = (0, import_react_context2.createContext)({
name: `MenuStylesContext`,
errorMessage: `useMenuStyles returned is 'undefined'. Seems you forgot to wrap the components in "<Menu />" `
});
var Menu = (props) => {
const { children } = props;
const styles = (0, import_system.useMultiStyleConfig)("Menu", props);
const ownProps = (0, import_system.omitThemingProps)(props);
const { direction } = (0, import_system.useTheme)();
const { descendants, ...ctx } = useMenu({ ...ownProps, direction });
const context = (0, import_react2.useMemo)(() => ctx, [ctx]);
const { isOpen, onClose, forceUpdate } = context;
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MenuDescendantsProvider, { value: descendants, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MenuProvider, { value: context, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MenuStylesProvider, { value: styles, children: (0, import_shared_utils2.runIfFn)(children, { isOpen, onClose, forceUpdate }) }) }) });
};
Menu.displayName = "Menu";
// src/menu-command.tsx
var import_jsx_runtime2 = require("react/jsx-runtime");
var MenuCommand = (0, import_system2.forwardRef)(
(props, ref) => {
const styles = useMenuStyles();
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
import_system2.chakra.span,
{
ref,
...props,
__css: styles.command,
className: "chakra-menu__command"
}
);
}
);
MenuCommand.displayName = "MenuCommand";
// src/menu-icon.tsx
var import_system3 = require("@chakra-ui/system");
var import_shared_utils3 = require("@chakra-ui/shared-utils");
var import_react3 = require("react");
var import_jsx_runtime3 = require("react/jsx-runtime");
var MenuIcon = (props) => {
const { className, children, ...rest } = props;
const styles = useMenuStyles();
const child = import_react3.Children.only(children);
const clone = (0, import_react3.isValidElement)(child) ? (0, import_react3.cloneElement)(child, {
focusable: "false",
"aria-hidden": true,
className: (0, import_shared_utils3.cx)("chakra-menu__icon", child.props.className)
}) : null;
const _className = (0, import_shared_utils3.cx)("chakra-menu__icon-wrapper", className);
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_system3.chakra.span, { className: _className, ...rest, __css: styles.icon, children: clone });
};
MenuIcon.displayName = "MenuIcon";
// src/styled-menu-item.tsx
var import_system4 = require("@chakra-ui/system");
var import_react4 = require("react");
var import_jsx_runtime4 = require("react/jsx-runtime");
var StyledMenuItem = (0, import_system4.forwardRef)(
(props, ref) => {
const { type, ...rest } = props;
const styles = useMenuStyles();
const btnType = rest.as || type ? type != null ? type : void 0 : "button";
const buttonStyles = (0, import_react4.useMemo)(
() => ({
textDecoration: "none",
color: "inherit",
userSelect: "none",
display: "flex",
width: "100%",
alignItems: "center",
textAlign: "start",
flex: "0 0 auto",
outline: 0,
...styles.item
}),
[styles.item]
);
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_system4.chakra.button, { ref, type: btnType, ...rest, __css: buttonStyles });
}
);
// src/menu-item.tsx
var import_jsx_runtime5 = require("react/jsx-runtime");
var MenuItem = (0, import_system5.forwardRef)((props, ref) => {
const {
icon,
iconSpacing = "0.75rem",
command,
commandSpacing = "0.75rem",
children,
...rest
} = props;
const menuitemProps = useMenuItem(rest, ref);
const shouldWrap = icon || command;
const _children = shouldWrap ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { pointerEvents: "none", flex: 1 }, children }) : children;
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
StyledMenuItem,
{
...menuitemProps,
className: (0, import_shared_utils4.cx)("chakra-menu__menuitem", menuitemProps.className),
children: [
icon && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MenuIcon, { fontSize: "0.8em", marginEnd: iconSpacing, children: icon }),
_children,
command && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MenuCommand, { marginStart: commandSpacing, children: command })
]
}
);
});
MenuItem.displayName = "MenuItem";
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
MenuItem
});
//# sourceMappingURL=menu-item.js.map