text: import isMobile from './utils/isMobile';
  
  export function noop() {}
  
  export function getKeyFromChildrenIndex(child, menuEventKey, index) {
    const prefix = menuEventKey || '';
    return child.key === undefined ? `${prefix}item_${index}` : child.key;
  }
  
  export function getMenuIdFromSubMenuEventKey(eventKey) {
    return `${eventKey}-menu-`;
  }
  
  export function loopMenuItem(children, cb) {
    let index = -1;
    children.forEach(c => {
      index++;
      if (c && c.type && c.type.isMenuItemGroup) {
        c.$slots.default.forEach(c2 => {
          index++;
          c.componentOptions && cb(c2, index);
        });
      } else {
        c.componentOptions && cb(c, index);
      }
    });
  }
  
  export function loopMenuItemRecursively(children, keys, ret) {
    if (!children || ret.find) {
      return;
    }
    children.forEach(c => {
      if (ret.find) {
        return;
      }
      if (c.data && c.data.slot && c.data.slot !== 'default') {
        return;
      }
      if (c && c.componentOptions) {
        const options = c.componentOptions.Ctor.options;
        if (!options || !(options.isSubMenu || options.isMenuItem || options.isMenuItemGroup)) {
          return;
        }
        if (keys.indexOf(c.key) !== -1) {
          ret.find = true;
        } else if (c.componentOptions.children) {
          loopMenuItemRecursively(c.componentOptions.children, keys, ret);
        }
      }
    });
  }
  
  export const menuAllProps = {
    props: [
      'defaultSelectedKeys',
      'selectedKeys',
      'defaultOpenKeys',
      'openKeys',
      'mode',
      'getPopupContainer',
      'openTransitionName',
      'openAnimation',
      'subMenuOpenDelay',
      'subMenuCloseDelay',
      'forceSubMenuRender',
      'triggerSubMenuAction',
      'level',
      'selectable',
      'multiple',
      'visible',
      'focusable',
      'defaultActiveFirst',
      'prefixCls',
      'inlineIndent',
      'parentMenu',
      'title',
      'rootPrefixCls',
      'eventKey',
      'active',
      'popupAlign',
      'popupOffset',
      'isOpen',
      'renderMenuItem',
      'manualRef',
      'subMenuKey',
      'disabled',
      'index',
      'isSelected',
      'store',
      'activeKey',
      'builtinPlacements',
      'overflowedIndicator',
  
      // the following keys found need to be removed from test regression
      'attribute',
      'value',
      'popupClassName',
      'inlineCollapsed',
      'menu',
      'theme',
      'itemIcon',
      'expandIcon',
    ],
    on: [
      'select',
      'deselect',
      'destroy',
      'openChange',
      'itemHover',
      'titleMouseenter',
      'titleMouseleave',
      'titleClick',
    ],
  };
  
  // ref: https://github.com/ant-design/ant-design/issues/14007
  // ref: https://bugs.chromium.org/p/chromium/issues/detail?id=360889
  // getBoundingClientRect return the full precision value, which is
  // not the same behavior as on chrome. Set the precision to 6 to
  // unify their behavior
  export const getWidth = elem => {
    let width =
      elem && typeof elem.getBoundingClientRect === 'function' && elem.getBoundingClientRect().width;
    if (width) {
      width = +width.toFixed(6);
    }
    return width || 0;
  };
  
  export const setStyle = (elem, styleProperty, value) => {
    if (elem && typeof elem.style === 'object') {
      elem.style[styleProperty] = value;
    }
  };
  
  export const isMobileDevice = () => {
    return isMobile.any;
  };
  