1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-01 21:57:06 +01:00
metamask-extension/ui/components/component-library/text-field-base
George Marshall 055a7c52c0
Adding TextFieldBase component (#16043)
* Adding TextInputBase component

* Removing keyup and keydown props, tests and docs

* removing showClear from stories

* removing unneeded css

* simplifying uncontrolled vs controlled to work

* Fortifying maxLength test

* Lint fix for test

* Doc, style and prop updates

* Updating constant names with 'base'

* Adding a background color

* Adding a background color to input
2022-10-06 12:41:22 -07:00
..
index.js Adding TextFieldBase component (#16043) 2022-10-06 12:41:22 -07:00
README.mdx Adding TextFieldBase component (#16043) 2022-10-06 12:41:22 -07:00
text-field-base.constants.js Adding TextFieldBase component (#16043) 2022-10-06 12:41:22 -07:00
text-field-base.js Adding TextFieldBase component (#16043) 2022-10-06 12:41:22 -07:00
text-field-base.scss Adding TextFieldBase component (#16043) 2022-10-06 12:41:22 -07:00
text-field-base.stories.js Adding TextFieldBase component (#16043) 2022-10-06 12:41:22 -07:00
text-field-base.test.js Adding TextFieldBase component (#16043) 2022-10-06 12:41:22 -07:00

import { Story, Canvas, ArgsTable } from '@storybook/addon-docs';

import { TextFieldBase } from './text-field-base';

### This is a base component. It should not be used in your feature code directly but as a "base" for other UI components

# TextFieldBase

The `TextFieldBase` is the base component for all text fields. It should not be used directly. It functions as both a uncontrolled and controlled input.

<Canvas>
  <Story id="ui-components-component-library-text-field-base-text-field-base-stories-js--default-story" />
</Canvas>

## Props

The `TextFieldBase` accepts all props below as well as all [Box](/docs/ui-components-ui-box-box-stories-js--default-story#props) component props

<ArgsTable of={TextFieldBase} />

### Size

Use the `size` prop to set the height of the `TextFieldBase`.

Possible sizes include:

- `sm` 32px
- `md` 40px
- `lg` 48px

Defaults to `md`

<Canvas>
  <Story id="ui-components-component-library-text-field-base-text-field-base-stories-js--size" />
</Canvas>

```jsx
import { TextFieldBase } from '../../ui/component-library/text-field-base';
import { SIZES } from '../../../helpers/constants/design-system';

<TextFieldBase size={SIZES.SM} />
<TextFieldBase size={SIZES.MD} />
<TextFieldBase size={SIZES.LG} />
```

### Type

Use the `type` prop to change the type of input.

Possible types include:

- `text`
- `number`
- `password`

Defaults to `text`.

<Canvas>
  <Story id="ui-components-component-library-text-field-base-text-field-base-stories-js--type" />
</Canvas>

```jsx
import { TextFieldBase } from '../../ui/component-library/text-field-base';

<TextFieldBase type="text" /> // (Default)
<TextFieldBase type="number" />
<TextFieldBase type="password" />
```

### Truncate

Use the `truncate` prop to truncate the text of the the `TextFieldBase`

<Canvas>
  <Story id="ui-components-component-library-text-field-base-text-field-base-stories-js--truncate" />
</Canvas>

```jsx
import { TextFieldBase } from '../../ui/component-library/text-field-base';

<TextFieldBase truncate />;
```

### Left Accessory Right Accessory

Use the `leftAccessory` and `rightAccessory` props to add components such as icons or buttons to either side of the `TextFieldBase`.

<Canvas>
  <Story id="ui-components-component-library-text-field-base-text-field-base-stories-js--left-accessory-right-accessory" />
</Canvas>

```jsx
import { COLORS, SIZES } from '../../../helpers/constants/design-system';
import { Icon, ICON_NAMES } from '../../ui/component-library/icons';

import { TextFieldBase } from '../../ui/component-library/text-field-base';

<TextFieldBase
  placeholder="Search"
  leftAccessory={
    <Icon
      color={COLORS.ICON_ALTERNATIVE}
      name={ICON_NAMES.SEARCH_FILLED}
    />
  }
/>

<TextFieldBase
  placeholder="MetaMask"
  rightAccessory={
    // TODO: replace with ButtonIcon
    <button>
      <Icon name={ICON_NAMES.CLOSE_OUTLINE} size={SIZES.SM} />
    </button>
  }
/>

<TextFieldBase
  truncate
  leftAccessory={<AvatarToken tokenName="ast" size={SIZES.SM} />}
  rightAccessory={
    // TODO: replace with ButtonIcon
    <button>
      <Icon name={ICON_NAMES.CLOSE_OUTLINE} size={SIZES.SM} />
    </button>
  }
/>

<TextFieldBase
  placeholder="Enter amount"
  type="number"
  leftAccessory={
    <AvatarToken
      tokenName="ast"
      tokenImageUrl="./AST.png"
      size={SIZES.SM}
    />
  }
  rightAccessory={
    // TODO: replace with ButtonLink
    <button>Max</button>
  }
/>
```

### Input Ref

Use the `inputRef` prop to access the ref of the `<input />` html element of `TextFieldBase`. This is useful for focusing the input from a button or other component.

<Canvas>
  <Story id="ui-components-component-library-text-field-base-text-field-base-stories-js--input-ref" />
</Canvas>

```jsx
import { TextFieldBase } from '../../ui/component-library/text-field-base';

const inputRef = useRef(null);
const [value, setValue] = useState('');
const handleOnClick = () => {
  inputRef.current.focus();
};
const handleOnChange = (e) => {
  setValue(e.target.value);
};

<TextFieldBase
  inputRef={inputRef}
  value={value}
  onChange={handleOnChange}
/>
// TODO: replace with Button component
<Box
  as="button"
  backgroundColor={COLORS.BACKGROUND_ALTERNATIVE}
  color={COLORS.TEXT_DEFAULT}
  borderColor={COLORS.BORDER_DEFAULT}
  borderRadius={SIZES.XL}
  marginLeft={1}
  paddingLeft={2}
  paddingRight={2}
  onClick={handleOnClick}
>
  Edit
</Box>
```

### Auto Complete

Use the `autoComplete` prop to set the autocomplete html attribute. It allows the browser to predict the value based on earlier typed values.

<Canvas>
  <Story id="ui-components-component-library-text-field-base-text-field-base-stories-js--auto-complete" />
</Canvas>

```jsx
import { TextFieldBase } from '../../ui/component-library/text-field-base';

<TextFieldBase type="password" autoComplete />;
```

### Auto Focus

Use the `autoFocus` prop to focus the `TextFieldBase` during the first mount

<Canvas>
  <Story id="ui-components-component-library-text-field-base-text-field-base-stories-js--auto-focus" />
</Canvas>

```jsx
import { TextFieldBase } from '../../ui/component-library/text-field-base';

<TextFieldBase autoFocus />;
```

### Default Value

Use the `defaultValue` prop to set the default value of the `TextFieldBase`

<Canvas>
  <Story id="ui-components-component-library-text-field-base-text-field-base-stories-js--default-value" />
</Canvas>

```jsx
import { TextFieldBase } from '../../ui/component-library/text-field-base';

<TextFieldBase defaultValue="default value" />;
```

### Disabled

Use the `disabled` prop to set the disabled state of the `TextFieldBase`

<Canvas>
  <Story id="ui-components-component-library-text-field-base-text-field-base-stories-js--disabled" />
</Canvas>

```jsx
import { TextFieldBase } from '../../ui/component-library/text-field-base';

<TextFieldBase disabled />;
```

### Error

Use the `error` prop to set the error state of the `TextFieldBase`

<Canvas>
  <Story id="ui-components-component-library-text-field-base-text-field-base-stories-js--error-story" />
</Canvas>

```jsx
import { TextFieldBase } from '../../ui/component-library/text-field-base';

<TextFieldBase error />;
```

### Max Length

Use the `maxLength` prop to set the maximum allowed input characters for the `TextFieldBase`

<Canvas>
  <Story id="ui-components-component-library-text-field-base-text-field-base-stories-js--max-length" />
</Canvas>

```jsx
import { TextFieldBase } from '../../ui/component-library/text-field-base';

<TextFieldBase maxLength={10} />;
```

### Read Only

Use the `readOnly` prop to set the `TextFieldBase` to read only

<Canvas>
  <Story id="ui-components-component-library-text-field-base-text-field-base-stories-js--read-only" />
</Canvas>

```jsx
import { TextFieldBase } from '../../ui/component-library/text-field-base';

<TextFieldBase readOnly />;
```

### Required

Use the `required` prop to set the `TextFieldBase` to required. Currently there is no visual difference to the `TextFieldBase` when required.

<Canvas>
  <Story id="ui-components-component-library-text-field-base-text-field-base-stories-js--required" />
</Canvas>

```jsx
import { TextFieldBase } from '../../ui/component-library/text-field-base';

// Currently no visual difference
<TextFieldBase required />;
```