|
1 | 1 | import React from 'react';
|
2 | 2 | import propTypes from 'prop-types';
|
3 | 3 |
|
4 |
| -import styled from 'styled-components'; |
| 4 | +import styled, { css } from 'styled-components'; |
5 | 5 | import { createDisabledTextStyles, createFlatBoxStyles } from '../common';
|
6 | 6 | import { blockSizes, fontFamily } from '../common/system';
|
7 | 7 | import Cutout from '../Cutout/Cutout';
|
8 | 8 |
|
9 |
| -const StyledWrapper = styled(Cutout)` |
10 |
| - height: ${blockSizes.md}; |
| 9 | +const sharedWrapperStyles = css` |
| 10 | + display: flex; |
| 11 | + align-items: center; |
| 12 | + width: ${({ fullWidth }) => (fullWidth ? '100%' : 'auto')}; |
| 13 | + min-height: ${blockSizes.md}; |
| 14 | +`; |
| 15 | + |
| 16 | +const Wrapper = styled(Cutout)` |
| 17 | + ${sharedWrapperStyles} |
11 | 18 | background: ${({ theme, isDisabled }) =>
|
12 | 19 | isDisabled ? theme.material : theme.canvas};
|
13 | 20 | `;
|
14 |
| -const StyledFlatWrapper = styled.div` |
15 |
| - position: relative; |
16 |
| - height: ${blockSizes.md}; |
| 21 | + |
| 22 | +const FlatWrapper = styled.div` |
17 | 23 | ${createFlatBoxStyles()}
|
| 24 | + ${sharedWrapperStyles} |
| 25 | + position: relative; |
18 | 26 | `;
|
19 |
| -export const StyledTextInput = styled.input` |
| 27 | + |
| 28 | +const sharedInputStyles = css` |
| 29 | + display: block; |
20 | 30 | box-sizing: border-box;
|
21 | 31 | width: 100%;
|
22 | 32 | height: 100%;
|
23 |
| - padding: 0 8px; |
24 | 33 | outline: none;
|
25 | 34 | border: none;
|
26 | 35 | background: none;
|
27 | 36 | font-size: 1rem;
|
| 37 | + min-height: 27px; |
28 | 38 | font-family: ${fontFamily};
|
29 | 39 | color: ${({ theme }) => theme.inputText};
|
30 | 40 | ${({ disabled, variant }) =>
|
31 | 41 | variant !== 'flat' && disabled && createDisabledTextStyles()}
|
32 | 42 | `;
|
| 43 | + |
| 44 | +export const StyledTextInput = styled.input` |
| 45 | + ${sharedInputStyles} |
| 46 | + padding: 0 8px; |
| 47 | +`; |
| 48 | + |
| 49 | +const StyledTextArea = styled.textarea` |
| 50 | + ${sharedInputStyles} |
| 51 | + padding: 8px; |
| 52 | + resize: none; |
| 53 | +`; |
| 54 | + |
33 | 55 | const TextField = React.forwardRef(function TextField(props, ref) {
|
34 | 56 | const {
|
35 |
| - onChange, |
| 57 | + className, |
36 | 58 | disabled,
|
37 |
| - variant, |
38 |
| - type, |
39 |
| - style, |
| 59 | + fullWidth, |
| 60 | + multiline, |
| 61 | + onChange, |
40 | 62 | shadow,
|
41 |
| - className, |
42 |
| - width, |
| 63 | + style, |
| 64 | + type, |
| 65 | + variant, |
43 | 66 | ...otherProps
|
44 | 67 | } = props;
|
45 |
| - const Wrapper = variant === 'flat' ? StyledFlatWrapper : StyledWrapper; |
| 68 | + const WrapperComponent = variant === 'flat' ? FlatWrapper : Wrapper; |
| 69 | + const Input = multiline ? StyledTextArea : StyledTextInput; |
46 | 70 | return (
|
47 |
| - <Wrapper |
48 |
| - width={width} |
49 |
| - shadow={shadow} |
50 |
| - isDisabled={disabled} |
51 |
| - style={{ ...style, width: width || 'auto' }} |
| 71 | + <WrapperComponent |
52 | 72 | className={className}
|
| 73 | + fullWidth={fullWidth} |
| 74 | + isDisabled={disabled} |
| 75 | + shadow={shadow} |
| 76 | + style={style} |
53 | 77 | >
|
54 |
| - <StyledTextInput |
| 78 | + <Input |
| 79 | + disabled={disabled} |
55 | 80 | onChange={disabled ? undefined : onChange}
|
56 | 81 | readOnly={disabled}
|
57 |
| - disabled={disabled} |
58 |
| - variant={variant} |
59 |
| - type={type} |
60 | 82 | ref={ref}
|
| 83 | + type={type} |
| 84 | + variant={variant} |
61 | 85 | {...otherProps}
|
62 | 86 | />
|
63 |
| - </Wrapper> |
| 87 | + </WrapperComponent> |
64 | 88 | );
|
65 | 89 | });
|
66 | 90 | TextField.defaultProps = {
|
| 91 | + className: '', |
67 | 92 | disabled: false,
|
68 |
| - type: 'text', |
| 93 | + fullWidth: null, |
| 94 | + multiline: false, |
| 95 | + onChange: () => {}, |
69 | 96 | shadow: true,
|
70 |
| - variant: 'default', |
71 | 97 | style: {},
|
72 |
| - width: null, |
73 |
| - onChange: () => {}, |
74 |
| - className: '' |
| 98 | + type: 'text', |
| 99 | + variant: 'default' |
75 | 100 | };
|
76 | 101 |
|
77 | 102 | TextField.propTypes = {
|
78 |
| - width: propTypes.oneOfType([propTypes.string, propTypes.number]), |
79 |
| - onChange: propTypes.func, |
| 103 | + className: propTypes.string, |
80 | 104 | disabled: propTypes.bool,
|
81 |
| - variant: propTypes.oneOf(['default', 'flat']), |
| 105 | + fullWidth: propTypes.bool, |
| 106 | + multiline: propTypes.bool, |
| 107 | + onChange: propTypes.func, |
82 | 108 | shadow: propTypes.bool,
|
| 109 | + style: propTypes.shape([propTypes.string, propTypes.number]), |
83 | 110 | type: propTypes.string,
|
84 |
| - className: propTypes.string, |
85 |
| - style: propTypes.shape([propTypes.string, propTypes.number]) |
| 111 | + variant: propTypes.oneOf(['default', 'flat']) |
86 | 112 | };
|
87 | 113 | export default TextField;
|
0 commit comments