"use strict";
'use client';

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _formatMuiErrorMessage = _interopRequireDefault(require("@mui/utils/formatMuiErrorMessage"));
var React = _interopRequireWildcard(require("react"));
var _reactIs = require("react-is");
var _propTypes = _interopRequireDefault(require("prop-types"));
var _clsx = _interopRequireDefault(require("clsx"));
var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
var _useId = _interopRequireDefault(require("@mui/utils/useId"));
var _refType = _interopRequireDefault(require("@mui/utils/refType"));
var _useTimeout = _interopRequireDefault(require("@mui/utils/useTimeout"));
var _ownerDocument = _interopRequireDefault(require("../utils/ownerDocument"));
var _Menu = _interopRequireDefault(require("../Menu/Menu"));
var _NativeSelectInput = require("../NativeSelect/NativeSelectInput");
var _utils = require("../InputBase/utils");
var _zeroStyled = require("../zero-styled");
var _slotShouldForwardProp = _interopRequireDefault(require("../styles/slotShouldForwardProp"));
var _useEnhancedEffect = _interopRequireDefault(require("../utils/useEnhancedEffect"));
var _useEventCallback = _interopRequireDefault(require("../utils/useEventCallback"));
var _useForkRef = _interopRequireDefault(require("../utils/useForkRef"));
var _useControlled = _interopRequireDefault(require("../utils/useControlled"));
var _selectClasses = _interopRequireWildcard(require("./selectClasses"));
var _utils2 = require("./utils");
var _SelectFocusSourceContext = require("./utils/SelectFocusSourceContext");
var _jsxRuntime = require("react/jsx-runtime");
var _span;
const OPENING_MOUSE_UP_BOUNDARY_OFFSET = 2;
// The initial mouseup may land on an item when the menu opens over the trigger.
const SELECTED_MOUSE_UP_DELAY = 400;
const UNSELECTED_MOUSE_UP_DELAY = 200;

/**
 * Returns true when a native mouse event should be treated as happening inside
 * the element, even if a portal or backdrop retargeted the event away from it.
 *
 * Select uses this for the opening mouseup: when the menu opens over the
 * trigger, the release can target the backdrop or portaled menu even though the
 * pointer is still inside the trigger or menu bounds.
 */
function isMouseEventInsideElement(event, element) {
  if (!element) {
    return false;
  }
  const eventPath = event.composedPath();
  if (eventPath.includes(element)) {
    return true;
  }
  if (event.target?.nodeType && element.contains(event.target)) {
    return true;
  }
  const rect = element.getBoundingClientRect();
  if (rect.width === 0 && rect.height === 0) {
    // Hidden or transition-mounted elements do not have useful bounds to hit-test.
    return false;
  }
  return event.clientX >= rect.left - OPENING_MOUSE_UP_BOUNDARY_OFFSET && event.clientX <= rect.right + OPENING_MOUSE_UP_BOUNDARY_OFFSET && event.clientY >= rect.top - OPENING_MOUSE_UP_BOUNDARY_OFFSET && event.clientY <= rect.bottom + OPENING_MOUSE_UP_BOUNDARY_OFFSET;
}
const SelectSelect = (0, _zeroStyled.styled)(_NativeSelectInput.StyledSelectSelect, {
  name: 'MuiSelect',
  slot: 'Select',
  overridesResolver: (props, styles) => {
    const {
      ownerState
    } = props;
    return [
    // Win specificity over the input base
    {
      [`&.${_selectClasses.default.select}`]: styles.select
    }, {
      [`&.${_selectClasses.default.select}`]: styles[ownerState.variant]
    }, {
      [`&.${_selectClasses.default.error}`]: styles.error
    }, {
      [`&.${_selectClasses.default.multiple}`]: styles.multiple
    }];
  }
})({
  // Win specificity over the input base
  [`&.${_selectClasses.default.select}`]: {
    height: 'auto',
    // Resets for multiple select with chips
    minHeight: '1.4375em',
    // Required for select\text-field height consistency
    textOverflow: 'ellipsis',
    whiteSpace: 'nowrap',
    overflow: 'hidden'
  }
});
const SelectIcon = (0, _zeroStyled.styled)(_NativeSelectInput.StyledSelectIcon, {
  name: 'MuiSelect',
  slot: 'Icon',
  overridesResolver: (props, styles) => {
    const {
      ownerState
    } = props;
    return [styles.icon, ownerState.open && styles.iconOpen];
  }
})({});
const SelectNativeInput = (0, _zeroStyled.styled)('input', {
  shouldForwardProp: prop => (0, _slotShouldForwardProp.default)(prop) && prop !== 'classes',
  name: 'MuiSelect',
  slot: 'NativeInput'
})({
  bottom: 0,
  left: 0,
  position: 'absolute',
  opacity: 0,
  pointerEvents: 'none',
  width: '100%',
  boxSizing: 'border-box'
});
const useUtilityClasses = ownerState => {
  const {
    classes,
    variant,
    disabled,
    multiple,
    open,
    error
  } = ownerState;
  const slots = {
    select: ['select', variant, disabled && 'disabled', multiple && 'multiple', error && 'error'],
    icon: ['icon', open && 'iconOpen', disabled && 'disabled'],
    nativeInput: ['nativeInput']
  };
  return (0, _composeClasses.default)(slots, _selectClasses.getSelectUtilityClasses, classes);
};

/**
 * @ignore - internal component.
 */
const SelectInput = /*#__PURE__*/React.forwardRef(function SelectInput(props, ref) {
  const {
    'aria-describedby': ariaDescribedby,
    'aria-label': ariaLabel,
    autoFocus,
    autoWidth,
    children,
    className,
    defaultOpen,
    defaultValue,
    disabled,
    displayEmpty,
    error = false,
    IconComponent,
    inputRef: inputRefProp,
    labelId,
    MenuProps = {},
    multiple,
    name,
    onBlur,
    onChange,
    onClose,
    onFocus,
    // eslint-disable-next-line react/prop-types
    onKeyDown,
    // eslint-disable-next-line react/prop-types
    onMouseDown,
    onOpen,
    open: openProp,
    readOnly,
    renderValue,
    required,
    SelectDisplayProps = {},
    tabIndex: tabIndexProp,
    // catching `type` from Input which makes no sense for SelectInput
    type,
    value: valueProp,
    variant = 'standard',
    ...other
  } = props;
  const [value, setValueState] = (0, _useControlled.default)({
    controlled: valueProp,
    default: defaultValue,
    name: 'Select'
  });
  const [openState, setOpenState] = (0, _useControlled.default)({
    controlled: openProp,
    default: defaultOpen,
    name: 'Select'
  });
  const inputRef = React.useRef(null);
  const displayRef = React.useRef(null);
  const paperRef = React.useRef(null);
  const openRef = React.useRef(false);
  const hasSelectedItemInListRef = React.useRef(false);
  const openingMouseUpListenerCleanupRef = React.useRef(null);
  const didPointerDownOnItemRef = React.useRef(false);
  const selectionRef = React.useRef({
    allowSelectedMouseUp: false,
    allowUnselectedMouseUp: false
  });
  const selectedMouseUpTimer = (0, _useTimeout.default)();
  const unselectedMouseUpTimer = (0, _useTimeout.default)();
  const [displayNode, setDisplayNode] = React.useState(null);
  const {
    current: isOpenControlled
  } = React.useRef(openProp != null);
  const [menuMinWidthState, setMenuMinWidthState] = React.useState();
  const [openInteractionType, setOpenInteractionType] = React.useState(null);
  const handleRef = (0, _useForkRef.default)(ref, inputRefProp);
  const handleDisplayRef = React.useCallback(node => {
    displayRef.current = node;
    if (node) {
      setDisplayNode(node);
    }
  }, []);
  const anchorElement = displayNode?.parentNode;
  React.useImperativeHandle(handleRef, () => ({
    focus: () => {
      displayRef.current.focus();
    },
    node: inputRef.current,
    value
  }), [value]);
  const open = displayNode !== null && openState;
  (0, _useEnhancedEffect.default)(() => {
    openRef.current = open;
  }, [open]);
  const clearSelectionTimers = React.useCallback(() => {
    selectedMouseUpTimer.clear();
    unselectedMouseUpTimer.clear();
  }, [selectedMouseUpTimer, unselectedMouseUpTimer]);
  const resetMouseUpSelection = React.useCallback(() => {
    clearSelectionTimers();
    didPointerDownOnItemRef.current = false;
    selectionRef.current = {
      allowSelectedMouseUp: false,
      allowUnselectedMouseUp: false
    };
  }, [clearSelectionTimers]);
  const clearOpeningMouseUpListener = React.useCallback(() => {
    if (openingMouseUpListenerCleanupRef.current) {
      openingMouseUpListenerCleanupRef.current();
      openingMouseUpListenerCleanupRef.current = null;
    }
  }, []);
  React.useEffect(() => {
    if (!open) {
      resetMouseUpSelection();
      clearOpeningMouseUpListener();
    }
  }, [open, resetMouseUpSelection, clearOpeningMouseUpListener]);

  // Keep unmount cleanup separate from the `open` effect. Effect cleanups also run
  // before the next effect, which would clear the opening mouseup listener while opening.
  React.useEffect(() => {
    return () => {
      resetMouseUpSelection();
      clearOpeningMouseUpListener();
    };
  }, [resetMouseUpSelection, clearOpeningMouseUpListener]);
  React.useEffect(() => {
    if (!open || !anchorElement || autoWidth) {
      return undefined;
    }
    if (typeof ResizeObserver === 'undefined') {
      return undefined;
    }
    const observer = new ResizeObserver(() => {
      setMenuMinWidthState(anchorElement.clientWidth);
    });
    observer.observe(anchorElement);
    return () => {
      observer.disconnect();
    };
  }, [open, anchorElement, autoWidth]);

  // Resize menu on `defaultOpen` automatic toggle.
  React.useEffect(() => {
    if (defaultOpen && openState && displayNode && !isOpenControlled) {
      setMenuMinWidthState(autoWidth ? null : anchorElement.clientWidth);
      displayRef.current.focus();
    }
    // TODO: uncomment once we enable eslint-plugin-react-compiler // eslint-disable-next-line react-compiler/react-compiler
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [displayNode, autoWidth]);
  // `isOpenControlled` is ignored because the component should never switch between controlled and uncontrolled modes.
  // `defaultOpen` and `openState` are ignored to avoid unnecessary callbacks.
  React.useEffect(() => {
    if (autoFocus) {
      displayRef.current.focus();
    }
  }, [autoFocus]);
  React.useEffect(() => {
    if (!labelId) {
      return undefined;
    }
    const label = (0, _ownerDocument.default)(displayRef.current).getElementById(labelId);
    if (label) {
      const handler = () => {
        if (getSelection().isCollapsed) {
          displayRef.current.focus();
        }
      };
      label.addEventListener('click', handler);
      return () => {
        label.removeEventListener('click', handler);
      };
    }
    return undefined;
  }, [labelId]);
  const update = (0, _useEventCallback.default)((openParam, event) => {
    if (!openParam) {
      resetMouseUpSelection();
      clearOpeningMouseUpListener();
    }
    if (openParam) {
      setOpenInteractionType((0, _utils2.getOpenInteractionType)(event));
      if (onOpen) {
        onOpen(event);
      }
    } else {
      setOpenInteractionType(null);
      if (onClose) {
        onClose(event);
      }
    }
    if (!isOpenControlled) {
      openRef.current = openParam;
      setMenuMinWidthState(autoWidth ? null : anchorElement.clientWidth);
      setOpenState(openParam);
    }
  });
  const scheduleMouseUpSelection = () => {
    resetMouseUpSelection();

    // When there is no selected item in the list, a mousedown
    // on the trigger followed by a quick mouseup over the first option can accidentally select
    // within 200ms. Delay unselected mouseup to match the safer 400ms window.
    if (!hasSelectedItemInListRef.current) {
      selectedMouseUpTimer.start(SELECTED_MOUSE_UP_DELAY, () => {
        selectionRef.current.allowSelectedMouseUp = true;
        selectionRef.current.allowUnselectedMouseUp = true;
      });
    } else {
      // mousedown -> move to unselected item -> mouseup should not select within 200ms.
      unselectedMouseUpTimer.start(UNSELECTED_MOUSE_UP_DELAY, () => {
        selectionRef.current.allowUnselectedMouseUp = true;

        // mousedown -> mouseup on selected item should not select within 400ms.
        selectedMouseUpTimer.start(UNSELECTED_MOUSE_UP_DELAY, () => {
          selectionRef.current.allowSelectedMouseUp = true;
        });
      });
    }
  };
  const handleMouseDown = event => {
    onMouseDown?.(event);
    // Ignore everything but left-click
    if (event.button !== 0) {
      return;
    }
    // Hijack the default focus behavior.
    event.preventDefault();
    displayRef.current.focus();
    const doc = (0, _ownerDocument.default)(event.currentTarget);
    scheduleMouseUpSelection();
    clearOpeningMouseUpListener();
    const handleMouseUp = mouseEvent => {
      openingMouseUpListenerCleanupRef.current = null;
      if (!displayRef.current) {
        return;
      }
      if (isMouseEventInsideElement(mouseEvent, displayRef.current) || isMouseEventInsideElement(mouseEvent, paperRef.current)) {
        return;
      }
      if (!openRef.current && isOpenControlled) {
        return;
      }
      update(false, mouseEvent);
    };
    doc.addEventListener('mouseup', handleMouseUp, {
      capture: true,
      once: true
    });
    openingMouseUpListenerCleanupRef.current = () => {
      doc.removeEventListener('mouseup', handleMouseUp, true);
    };
    update(true, event);
  };
  const handleClose = event => {
    update(false, event);
  };
  const childrenArray = React.Children.toArray(children);

  // Support autofill.
  const handleChange = event => {
    const child = childrenArray.find(childItem => childItem.props.value === event.target.value);
    if (child === undefined) {
      return;
    }
    setValueState(child.props.value);
    if (onChange) {
      onChange(event, child);
    }
  };
  const handleItemClick = child => event => {
    didPointerDownOnItemRef.current = false;
    let newValue;

    // We use the tabindex attribute to signal the available options.
    if (!event.currentTarget.hasAttribute('tabindex')) {
      return;
    }
    if (multiple) {
      newValue = Array.isArray(value) ? value.slice() : [];
      const itemIndex = value.indexOf(child.props.value);
      if (itemIndex === -1) {
        newValue.push(child.props.value);
      } else {
        newValue.splice(itemIndex, 1);
      }
    } else {
      newValue = child.props.value;
    }
    if (child.props.onClick) {
      child.props.onClick(event);
    }
    if (value !== newValue) {
      setValueState(newValue);
      if (onChange) {
        // Redefine target to allow name and value to be read.
        // This allows seamless integration with the most popular form libraries.
        // https://github.com/mui/material-ui/issues/13485#issuecomment-676048492
        // Clone the event to not override `target` of the original event.
        const nativeEvent = event.nativeEvent || event;
        const clonedEvent = new nativeEvent.constructor(nativeEvent.type, nativeEvent);
        Object.defineProperty(clonedEvent, 'target', {
          writable: true,
          value: {
            value: newValue,
            name
          }
        });
        onChange(clonedEvent, child);
      }
    }
    if (!multiple) {
      update(false, event);
    }
  };
  const handleItemMouseUp = (child, selected) => event => {
    child.props.onMouseUp?.(event);
    if (didPointerDownOnItemRef.current) {
      didPointerDownOnItemRef.current = false;
      return;
    }
    const disallowSelectedMouseUp = !selectionRef.current.allowSelectedMouseUp && selected;
    const disallowUnselectedMouseUp = !selectionRef.current.allowUnselectedMouseUp && !selected;
    if (disallowSelectedMouseUp || disallowUnselectedMouseUp) {
      return;
    }
    event.currentTarget.click();
  };
  const handleKeyDown = event => {
    if (!readOnly) {
      const validKeys = [' ', 'ArrowUp', 'ArrowDown',
      // The native select doesn't respond to enter on macOS, but it's recommended by
      // https://www.w3.org/WAI/ARIA/apg/patterns/combobox/examples/combobox-select-only/
      'Enter'];
      if (validKeys.includes(event.key)) {
        event.preventDefault();
        update(true, event);
      }
      onKeyDown?.(event);
    }
  };
  const handleBlur = event => {
    // if open event.stopImmediatePropagation
    if (!open && onBlur) {
      // Preact support, target is read only property on a native event.
      Object.defineProperty(event, 'target', {
        writable: true,
        value: {
          value,
          name
        }
      });
      onBlur(event);
    }
  };
  delete other['aria-invalid'];
  let display;
  let displaySingle;
  const displayMultiple = [];
  let computeDisplay = false;
  let foundMatch = false;

  // No need to display any value if the field is empty.
  if ((0, _utils.isFilled)({
    value
  }) || displayEmpty) {
    if (renderValue) {
      display = renderValue(value);
    } else {
      computeDisplay = true;
    }
  }
  const items = childrenArray.map(child => {
    if (! /*#__PURE__*/React.isValidElement(child)) {
      return null;
    }
    if (process.env.NODE_ENV !== 'production') {
      if ((0, _reactIs.isFragment)(child)) {
        console.error(["MUI: The Select component doesn't accept a Fragment as a child.", 'Consider providing an array instead.'].join('\n'));
      }
    }
    let selected;
    if (multiple) {
      if (!Array.isArray(value)) {
        throw new Error(process.env.NODE_ENV !== "production" ? 'MUI: The `value` prop must be an array ' + 'when using the `Select` component with `multiple`.' : (0, _formatMuiErrorMessage.default)(2));
      }
      selected = value.some(v => (0, _utils2.areEqualValues)(v, child.props.value));
      if (selected && computeDisplay) {
        displayMultiple.push(child.props.children);
      }
    } else {
      selected = (0, _utils2.areEqualValues)(value, child.props.value);
      if (selected && computeDisplay) {
        displaySingle = child.props.children;
      }
    }
    if (selected) {
      foundMatch = true;
    }
    return /*#__PURE__*/React.cloneElement(child, {
      'aria-selected': selected ? 'true' : 'false',
      onMouseDown: event => {
        didPointerDownOnItemRef.current = true;
        child.props.onMouseDown?.(event);
      },
      onPointerDown: event => {
        didPointerDownOnItemRef.current = true;
        child.props.onPointerDown?.(event);
      },
      onClick: handleItemClick(child),
      onMouseUp: handleItemMouseUp(child, selected),
      onKeyUp: event => {
        if (event.key === ' ') {
          // otherwise our MenuItems dispatches a click event
          // it's not behavior of the native <option> and causes
          // the select to close immediately since we open on space keydown
          event.preventDefault();
        }
        if (child.props.onKeyUp) {
          child.props.onKeyUp(event);
        }
      },
      role: 'option',
      selected,
      value: undefined,
      // The value is most likely not a valid HTML attribute.
      'data-value': child.props.value // Instead, we provide it as a data attribute.
    });
  });

  // Keep the opening mouseup guard current without mutating refs during render.
  (0, _useEnhancedEffect.default)(() => {
    hasSelectedItemInListRef.current = foundMatch;
  }, [foundMatch]);
  if (process.env.NODE_ENV !== 'production') {
    // TODO: uncomment once we enable eslint-plugin-react-compiler // eslint-disable-next-line react-compiler/react-compiler
    // eslint-disable-next-line react-hooks/rules-of-hooks
    React.useEffect(() => {
      if (!foundMatch && !multiple && value !== '') {
        const values = childrenArray.map(child => child.props.value);
        console.warn([`MUI: You have provided an out-of-range value \`${value}\` for the select ${name ? `(name="${name}") ` : ''}component.`, "Consider providing a value that matches one of the available options or ''.", `The available values are ${values.filter(x => x != null).map(x => `\`${x}\``).join(', ') || '""'}.`].join('\n'));
      }
    }, [foundMatch, childrenArray, multiple, name, value]);
  }
  if (computeDisplay) {
    if (multiple) {
      if (displayMultiple.length === 0) {
        display = null;
      } else {
        display = displayMultiple.reduce((output, child, index) => {
          output.push(child);
          if (index < displayMultiple.length - 1) {
            output.push(', ');
          }
          return output;
        }, []);
      }
    } else {
      display = displaySingle;
    }
  }

  // Avoid performing a layout computation in the render method.
  let menuMinWidth = menuMinWidthState;
  if (!autoWidth && isOpenControlled && displayNode) {
    menuMinWidth = anchorElement.clientWidth;
  }
  let tabIndex;
  if (typeof tabIndexProp !== 'undefined') {
    tabIndex = tabIndexProp;
  } else {
    tabIndex = disabled ? null : 0;
  }
  const buttonId = SelectDisplayProps.id || (name ? `mui-component-select-${name}` : undefined);
  const ownerState = {
    ...props,
    variant,
    value,
    open,
    error
  };
  const classes = useUtilityClasses(ownerState);
  const menuPaperSlotProps = typeof MenuProps.slotProps?.paper === 'function' ? MenuProps.slotProps.paper(ownerState) : MenuProps.slotProps?.paper;
  const handlePaperRef = (0, _useForkRef.default)(menuPaperSlotProps?.ref, paperRef);
  const menuListSlotProps = typeof MenuProps.slotProps?.list === 'function' ? MenuProps.slotProps.list(ownerState) : MenuProps.slotProps?.list;
  const listboxId = (0, _useId.default)();
  const nativeInputId = (0, _useId.default)();
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(React.Fragment, {
    children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(SelectSelect, {
      as: "div",
      ref: handleDisplayRef,
      tabIndex: tabIndex,
      role: "combobox",
      "aria-controls": open ? listboxId : undefined,
      "aria-disabled": disabled ? 'true' : undefined,
      "aria-expanded": open ? 'true' : 'false',
      "aria-haspopup": "listbox",
      "aria-label": ariaLabel,
      "aria-labelledby": labelId,
      "aria-describedby": ariaDescribedby,
      "aria-required": required ? 'true' : undefined,
      "aria-invalid": error ? 'true' : undefined,
      onKeyDown: handleKeyDown,
      onMouseDown: disabled || readOnly ? null : handleMouseDown,
      onBlur: handleBlur,
      onFocus: onFocus,
      ...SelectDisplayProps,
      ownerState: ownerState,
      className: (0, _clsx.default)(SelectDisplayProps.className, classes.select, className)
      // The id is required for proper a11y
      ,
      id: buttonId,
      children: (0, _utils2.isEmpty)(display) ? // notranslate needed while Google Translate will not fix zero-width space issue
      _span || (_span = /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
        className: "notranslate",
        "aria-hidden": true,
        children: "\u200B"
      })) : display
    }), /*#__PURE__*/(0, _jsxRuntime.jsx)(SelectNativeInput, {
      "aria-invalid": error,
      value: Array.isArray(value) ? value.join(',') : value,
      name: name,
      ref: inputRef,
      "aria-hidden": true,
      onChange: handleChange,
      tabIndex: -1,
      disabled: disabled,
      className: classes.nativeInput,
      autoFocus: autoFocus,
      required: required,
      ...other,
      id: other.id ?? nativeInputId,
      ownerState: ownerState
    }), /*#__PURE__*/(0, _jsxRuntime.jsx)(SelectIcon, {
      as: IconComponent,
      className: classes.icon,
      ownerState: ownerState
    }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_SelectFocusSourceContext.SelectFocusSourceProvider, {
      value: openInteractionType,
      children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Menu.default, {
        id: `menu-${name || ''}`,
        anchorEl: anchorElement,
        open: open,
        onClose: handleClose,
        anchorOrigin: {
          vertical: 'bottom',
          horizontal: 'center'
        },
        transformOrigin: {
          vertical: 'top',
          horizontal: 'center'
        },
        ...MenuProps,
        slotProps: {
          ...MenuProps.slotProps,
          list: {
            'aria-labelledby': labelId,
            role: 'listbox',
            'aria-multiselectable': multiple ? 'true' : undefined,
            disableListWrap: true,
            id: listboxId,
            ...menuListSlotProps
          },
          paper: {
            ...menuPaperSlotProps,
            ref: handlePaperRef,
            style: {
              minWidth: menuMinWidth,
              ...menuPaperSlotProps?.style
            }
          }
        },
        children: items
      })
    })]
  });
});
process.env.NODE_ENV !== "production" ? SelectInput.propTypes = {
  /**
   * @ignore
   */
  'aria-describedby': _propTypes.default.string,
  /**
   * @ignore
   */
  'aria-label': _propTypes.default.string,
  /**
   * @ignore
   */
  autoFocus: _propTypes.default.bool,
  /**
   * If `true`, the width of the popover will automatically be set according to the items inside the
   * menu, otherwise it will be at least the width of the select input.
   */
  autoWidth: _propTypes.default.bool,
  /**
   * The option elements to populate the select with.
   * Can be some `<MenuItem>` elements.
   */
  children: _propTypes.default.node,
  /**
   * Override or extend the styles applied to the component.
   */
  classes: _propTypes.default.object,
  /**
   * The CSS class name of the select element.
   */
  className: _propTypes.default.string,
  /**
   * If `true`, the component is toggled on mount. Use when the component open state is not controlled.
   * You can only use it when the `native` prop is `false` (default).
   */
  defaultOpen: _propTypes.default.bool,
  /**
   * The default value. Use when the component is not controlled.
   */
  defaultValue: _propTypes.default.any,
  /**
   * If `true`, the select is disabled.
   */
  disabled: _propTypes.default.bool,
  /**
   * If `true`, the selected item is displayed even if its value is empty.
   */
  displayEmpty: _propTypes.default.bool,
  /**
   * If `true`, the `select input` will indicate an error.
   */
  error: _propTypes.default.bool,
  /**
   * The icon that displays the arrow.
   */
  IconComponent: _propTypes.default.elementType.isRequired,
  /**
   * Imperative handle implementing `{ value: T, node: HTMLElement, focus(): void }`
   * Equivalent to `ref`
   */
  inputRef: _refType.default,
  /**
   * The ID of an element that acts as an additional label. The Select will
   * be labelled by the additional label and the selected value.
   */
  labelId: _propTypes.default.string,
  /**
   * Props applied to the [`Menu`](/material-ui/api/menu/) element.
   */
  MenuProps: _propTypes.default.object,
  /**
   * If `true`, `value` must be an array and the menu will support multiple selections.
   */
  multiple: _propTypes.default.bool,
  /**
   * Name attribute of the `select` or hidden `input` element.
   */
  name: _propTypes.default.string,
  /**
   * @ignore
   */
  onBlur: _propTypes.default.func,
  /**
   * Callback fired when a menu item is selected.
   *
   * @param {object} event The event source of the callback.
   * You can pull out the new value by accessing `event.target.value` (any).
   * @param {object} [child] The react element that was selected.
   */
  onChange: _propTypes.default.func,
  /**
   * Callback fired when the component requests to be closed.
   * Use in controlled mode (see open).
   *
   * @param {object} event The event source of the callback.
   */
  onClose: _propTypes.default.func,
  /**
   * @ignore
   */
  onFocus: _propTypes.default.func,
  /**
   * Callback fired when the component requests to be opened.
   * Use in controlled mode (see open).
   *
   * @param {object} event The event source of the callback.
   */
  onOpen: _propTypes.default.func,
  /**
   * If `true`, the component is shown.
   */
  open: _propTypes.default.bool,
  /**
   * @ignore
   */
  readOnly: _propTypes.default.bool,
  /**
   * Render the selected value.
   *
   * @param {any} value The `value` provided to the component.
   * @returns {ReactNode}
   */
  renderValue: _propTypes.default.func,
  /**
   * If `true`, the component is required.
   */
  required: _propTypes.default.bool,
  /**
   * Props applied to the clickable div element.
   */
  SelectDisplayProps: _propTypes.default.object,
  /**
   * @ignore
   */
  tabIndex: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
  /**
   * @ignore
   */
  type: _propTypes.default.any,
  /**
   * The input value.
   */
  value: _propTypes.default.any,
  /**
   * The variant to use.
   */
  variant: _propTypes.default.oneOf(['standard', 'outlined', 'filled'])
} : void 0;
var _default = exports.default = SelectInput;