UNPKG

@primer/components

Version:
79 lines (78 loc) 3.43 kB
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } import classnames from 'classnames'; import React from 'react'; import styled, { css } from 'styled-components'; import { maxWidth, minWidth, variant, width } from 'styled-system'; import { get } from './constants'; import sx from './sx'; import UnstyledTextInput from './_UnstyledTextInput'; const sizeVariants = variant({ variants: { small: { minHeight: '28px', px: 2, py: '3px', fontSize: 0, lineHeight: '20px' }, large: { px: 2, py: '10px', fontSize: 3 } } }); const Wrapper = styled.span.withConfig({ displayName: "TextInput__Wrapper", componentId: "sc-1apmpmt-0" })(["display:inline-flex;align-items:stretch;min-height:34px;font-size:", ";line-height:20px;color:", ";vertical-align:middle;background-repeat:no-repeat;background-position:right 8px center;border:1px solid ", ";border-radius:", ";outline:none;box-shadow:", ";", " .TextInput-icon{align-self:center;color:", ";margin:0 ", ";flex-shrink:0;}&:focus-within{border-color:", ";box-shadow:", ";}", " ", " ", " @media (min-width:", "){font-size:", ";}", " ", " ", " ", " ", ";"], get('fontSizes.1'), get('colors.fg.default'), get('colors.border.default'), get('radii.2'), get('shadows.primer.shadow.inset'), props => { if (props.hasIcon) { return css(["padding:0;"]); } else { return css(["padding:6px 12px;"]); } }, get('colors.fg.muted'), get('space.2'), get('colors.accent.emphasis'), get('shadows.primer.shadow.focus'), props => props.contrast && css(["background-color:", ";"], get('colors.canvas.inset')), props => props.disabled && css(["color:", ";background-color:", ";border-color:", ";"], get('colors.fg.muted'), get('colors.input.disabledBg'), get('colors.border.default')), props => props.block && css(["display:block;width:100%;"]), get('breakpoints.1'), get('fontSizes.1'), width, minWidth, maxWidth, sizeVariants, sx); // using forwardRef is important so that other components (ex. SelectMenu) can autofocus the input const TextInput = /*#__PURE__*/React.forwardRef(({ inputComponent: InputComponent, icon: IconComponent, block, className, contrast, disabled, sx: sxProp, theme, width: widthProp, minWidth: minWidthProp, maxWidth: maxWidthProp, variant: variantProp, wrapperRef, ...inputProps }, ref) => { // this class is necessary to style FilterSearch, plz no touchy! const wrapperClasses = classnames(className, 'TextInput-wrapper'); return /*#__PURE__*/React.createElement(Wrapper, { block: block, className: wrapperClasses, contrast: contrast, disabled: disabled, hasIcon: !!IconComponent, sx: sxProp, theme: theme, width: widthProp, minWidth: minWidthProp, maxWidth: maxWidthProp, variant: variantProp, ref: wrapperRef }, IconComponent && /*#__PURE__*/React.createElement(IconComponent, { className: "TextInput-icon" }), /*#__PURE__*/React.createElement(UnstyledTextInput, _extends({ ref: ref, disabled: disabled }, inputProps))); }); TextInput.defaultProps = { type: 'text' }; TextInput.displayName = 'TextInput'; export default TextInput;