|
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