text: import * as React from 'react';
  import { refType, deepmerge } from '@mui/utils';
  import PropTypes from 'prop-types';
  import { unstable_composeClasses as composeClasses } from '@mui/core';
  import InputBase from '../InputBase';
  import styled, { rootShouldForwardProp } from '../styles/styled';
  import useThemeProps from '../styles/useThemeProps';
  import filledInputClasses, { getFilledInputUtilityClass } from './filledInputClasses';
  import {
    rootOverridesResolver as inputBaseRootOverridesResolver,
    inputOverridesResolver as inputBaseInputOverridesResolver,
    InputBaseRoot,
    InputBaseComponent as InputBaseInput,
  } from '../InputBase/InputBase';
  
  const useUtilityClasses = (ownerState) => {
    const { classes, disableUnderline } = ownerState;
  
    const slots = {
      root: ['root', !disableUnderline && 'underline'],
      input: ['input'],
    };
  
    const composedClasses = composeClasses(slots, getFilledInputUtilityClass, classes);
  
    return {
      ...classes, // forward classes to the InputBase
      ...composedClasses,
    };
  };
  
  const FilledInputRoot = styled(InputBaseRoot, {
    shouldForwardProp: (prop) => rootShouldForwardProp(prop) || prop === 'classes',
    name: 'MuiFilledInput',
    slot: 'Root',
    overridesResolver: (props, styles) => {
      const { ownerState } = props;
      return [
        ...inputBaseRootOverridesResolver(props, styles),
        !ownerState.disableUnderline && styles.underline,
      ];
    },
  })(({ theme, ownerState }) => {
    const light = theme.palette.mode === 'light';
    const bottomLineColor = light ? 'rgba(0, 0, 0, 0.42)' : 'rgba(255, 255, 255, 0.7)';
    const backgroundColor = light ? 'rgba(0, 0, 0, 0.06)' : 'rgba(255, 255, 255, 0.09)';
    return {
      position: 'relative',
      backgroundColor,
      borderTopLeftRadius: theme.shape.borderRadius,
      borderTopRightRadius: theme.shape.borderRadius,
      transition: theme.transitions.create('background-color', {
        duration: theme.transitions.duration.shorter,
        easing: theme.transitions.easing.easeOut,
      }),
      '&:hover': {
        backgroundColor: light ? 'rgba(0, 0, 0, 0.09)' : 'rgba(255, 255, 255, 0.13)',
        // Reset on touch devices, it doesn't add specificity
        '@media (hover: none)': {
          backgroundColor,
        },
      },
      [`&.${filledInputClasses.focused}`]: {
        backgroundColor,
      },
      [`&.${filledInputClasses.disabled}`]: {
        backgroundColor: light ? 'rgba(0, 0, 0, 0.12)' : 'rgba(255, 255, 255, 0.12)',
      },
      ...(!ownerState.disableUnderline && {
        '&:after': {
          borderBottom: `2px solid ${theme.palette[ownerState.color].main}`,
          left: 0,
          bottom: 0,
          // Doing the other way around crash on IE11 "''" https://github.com/cssinjs/jss/issues/242
          content: '""',
          position: 'absolute',
          right: 0,
          transform: 'scaleX(0)',
          transition: theme.transitions.create('transform', {
            duration: theme.transitions.duration.shorter,
            easing: theme.transitions.easing.easeOut,
          }),
          pointerEvents: 'none', // Transparent to the hover style.
        },
        [`&.${filledInputClasses.focused}:after`]: {
          transform: 'scaleX(1)',
        },
        [`&.${filledInputClasses.error}:after`]: {
          borderBottomColor: theme.palette.error.main,
          transform: 'scaleX(1)', // error is always underlined in red
        },
        '&:before': {
          borderBottom: `1px solid ${bottomLineColor}`,
          left: 0,
          bottom: 0,
          // Doing the other way around crash on IE11 "''" https://github.com/cssinjs/jss/issues/242
          content: '"\\00a0"',
          position: 'absolute',
          right: 0,
          transition: theme.transitions.create('border-bottom-color', {
            duration: theme.transitions.duration.shorter,
          }),
          pointerEvents: 'none', // Transparent to the hover style.
        },
        [`&:hover:not(.${filledInputClasses.disabled}):before`]: {
          borderBottom: `1px solid ${theme.palette.text.primary}`,
        },
        [`&.${filledInputClasses.disabled}:before`]: {
          borderBottomStyle: 'dotted',
        },
      }),
      ...(ownerState.startAdornment && {
        paddingLeft: 12,
      }),
      ...(ownerState.endAdornment && {
        paddingRight: 12,
      }),
      ...(ownerState.multiline && {
        padding: '25px 12px 8px',
        ...(ownerState.size === 'small' && {
          paddingTop: 21,
          paddingBottom: 4,
        }),
        ...(ownerState.hiddenLabel && {
          paddingTop: 16,
          paddingBottom: 17,
        }),
      }),
    };
  });
  
  const FilledInputInput = styled(InputBaseInput, {
    name: 'MuiFilledInput',
    slot: 'Input',
    overridesResolver: inputBaseInputOverridesResolver,
  })(({ theme, ownerState }) => ({
    paddingTop: 25,
    paddingRight: 12,
    paddingBottom: 8,
    paddingLeft: 12,
    '&:-webkit-autofill': {
      WebkitBoxShadow: theme.palette.mode === 'light' ? null : '0 0 0 100px #266798 inset',
      WebkitTextFillColor: theme.palette.mode === 'light' ? null : '#fff',
      caretColor: theme.palette.mode === 'light' ? null : '#fff',
      borderTopLeftRadius: 'inherit',
      borderTopRightRadius: 'inherit',
    },
    ...(ownerState.size === 'small' && {
      paddingTop: 21,
      paddingBottom: 4,
    }),
    ...(ownerState.hiddenLabel && {
      paddingTop: 16,
      paddingBottom: 17,
    }),
    ...(ownerState.multiline && {
      paddingTop: 0,
      paddingBottom: 0,
      paddingLeft: 0,
      paddingRight: 0,
    }),
    ...(ownerState.startAdornment && {
      paddingLeft: 0,
    }),
    ...(ownerState.endAdornment && {
      paddingRight: 0,
    }),
    ...(ownerState.hiddenLabel &&
      ownerState.size === 'small' && {
        paddingTop: 8,
        paddingBottom: 9,
      }),
  }));
  
  const FilledInput = React.forwardRef(function FilledInput(inProps, ref) {
    const props = useThemeProps({ props: inProps, name: 'MuiFilledInput' });
  
    const {
      disableUnderline,
      components = {},
      componentsProps: componentsPropsProp,
      fullWidth = false,
      hiddenLabel, // declare here to prevent spreading to DOM
      inputComponent = 'input',
      multiline = false,
      type = 'text',
      ...other
    } = props;
  
    const ownerState = {
      ...props,
      fullWidth,
      inputComponent,
      multiline,
      type,
    };
  
    const classes = useUtilityClasses(props);
    const filledInputComponentsProps = { root: { ownerState }, input: { ownerState } };
  
    const componentsProps = componentsPropsProp
      ? deepmerge(componentsPropsProp, filledInputComponentsProps)
      : filledInputComponentsProps;
  
    return (
      <InputBase
        components={{ Root: FilledInputRoot, Input: FilledInputInput, ...components }}
        componentsProps={componentsProps}
        fullWidth={fullWidth}
        inputComponent={inputComponent}
        multiline={multiline}
        ref={ref}
        type={type}
        {...other}
        classes={classes}
      />
    );
  });
  
  FilledInput.propTypes /* remove-proptypes */ = {
    // ----------------------------- Warning --------------------------------
    // | These PropTypes are generated from the TypeScript type definitions |
    // |     To update them edit the d.ts file and run "yarn proptypes"     |
    // ----------------------------------------------------------------------
    /**
     * This prop helps users to fill forms faster, especially on mobile devices.
     * The name can be confusing, as it's more like an autofill.
     * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).
     */
    autoComplete: PropTypes.string,
    /**
     * If `true`, the `input` element is focused during the first mount.
     */
    autoFocus: PropTypes.bool,
    /**
     * Override or extend the styles applied to the component.
     */
    classes: PropTypes.object,
    /**
     * The color of the component. It supports those theme colors that make sense for this component.
     * The prop defaults to the value (`'primary'`) inherited from the parent FormControl component.
     */
    color: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([
      PropTypes.oneOf(['primary', 'secondary']),
      PropTypes.string,
    ]),
    /**
     * The components used for each slot inside the InputBase.
     * Either a string to use a HTML element or a component.
     * @default {}
     */
    components: PropTypes.shape({
      Input: PropTypes.elementType,
      Root: PropTypes.elementType,
    }),
    /**
     * The props used for each slot inside the Input.
     * @default {}
     */
    componentsProps: PropTypes.object,
    /**
     * The default value. Use when the component is not controlled.
     */
    defaultValue: PropTypes.any,
    /**
     * If `true`, the component is disabled.
     * The prop defaults to the value (`false`) inherited from the parent FormControl component.
     */
    disabled: PropTypes.bool,
    /**
     * If `true`, the input will not have an underline.
     */
    disableUnderline: PropTypes.bool,
    /**
     * End `InputAdornment` for this component.
     */
    endAdornment: PropTypes.node,
    /**
     * If `true`, the `input` will indicate an error.
     * The prop defaults to the value (`false`) inherited from the parent FormControl component.
     */
    error: PropTypes.bool,
    /**
     * If `true`, the `input` will take up the full width of its container.
     * @default false
     */
    fullWidth: PropTypes.bool,
    /**
     * If `true`, the label is hidden.
     * This is used to increase density for a `FilledInput`.
     * Be sure to add `aria-label` to the `input` element.
     * @default false
     */
    hiddenLabel: PropTypes.bool,
    /**
     * The id of the `input` element.
     */
    id: PropTypes.string,
    /**
     * The component used for the `input` element.
     * Either a string to use a HTML element or a component.
     * @default 'input'
     */
    inputComponent: PropTypes.elementType,
    /**
     * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.
     * @default {}
     */
    inputProps: PropTypes.object,
    /**
     * Pass a ref to the `input` element.
     */
    inputRef: refType,
    /**
     * If `dense`, will adjust vertical spacing. This is normally obtained via context from
     * FormControl.
     * The prop defaults to the value (`'none'`) inherited from the parent FormControl component.
     */
    margin: PropTypes.oneOf(['dense', 'none']),
    /**
     * Maximum number of rows to display when multiline option is set to true.
     */
    maxRows: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
    /**
     * Minimum number of rows to display when multiline option is set to true.
     */
    minRows: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
    /**
     * If `true`, a `textarea` element is rendered.
     * @default false
     */
    multiline: PropTypes.bool,
    /**
     * Name attribute of the `input` element.
     */
    name: PropTypes.string,
    /**
     * Callback fired when the value is changed.
     *
     * @param {React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>} event The event source of the callback.
     * You can pull out the new value by accessing `event.target.value` (string).
     */
    onChange: PropTypes.func,
    /**
     * The short hint displayed in the `input` before the user enters a value.
     */
    placeholder: PropTypes.string,
    /**
     * It prevents the user from changing the value of the field
     * (not from interacting with the field).
     */
    readOnly: PropTypes.bool,
    /**
     * If `true`, the `input` element is required.
     * The prop defaults to the value (`false`) inherited from the parent FormControl component.
     */
    required: PropTypes.bool,
    /**
     * Number of rows to display when multiline option is set to true.
     */
    rows: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
    /**
     * Start `InputAdornment` for this component.
     */
    startAdornment: PropTypes.node,
    /**
     * The system prop that allows defining system overrides as well as additional CSS styles.
     */
    sx: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
    /**
     * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).
     * @default 'text'
     */
    type: PropTypes.string,
    /**
     * The value of the `input` element, required for a controlled component.
     */
    value: PropTypes.any,
  };
  
  FilledInput.muiName = 'Input';
  
  export default FilledInput;
  