import { forwardRef, InputHTMLAttributes } from 'react'; import styled, { css } from 'styled-components'; import { spacing } from '../../spacing'; import { DESCRIPTION_PREFIX, useFieldContext } from '../form/Form.component'; import { Icon, IconName } from '../icon/Icon.component'; import { CoreUITheme } from '../../style/theme'; export const convertSizeToRem = (size?: '1' | '2/3' | '1/2' | '1/3') => { if (size === '2/3') return '14rem'; else if (size === '1/3') return '6rem'; else if (size === '1/2') return '10rem'; else return '20.5rem'; }; const StyledInput = styled.input<{ hasIcon: boolean }>` max-width: ${(props) => props.hasIcon ? `calc(100% - 1rem - ${spacing.f8})` : '100%'}; font-family: 'Lato'; ${(props) => props.disabled && ` cursor: not-allowed; `} background: ${(props) => props.theme.backgroundLevel1}; font-size: 1rem; color: ${(props) => props.theme.textPrimary}; border: 0; flex: 1; border-radius: ${spacing.r4}; line-height: ${spacing.r20}; &:placeholder-shown { font-style: italic; } &::placeholder { color: ${(props) => props.theme.textSecondary}; opacity: 0.5; } &:focus { border: 0; outline: none; } &:-webkit-autofill, &:-webkit-autofill:hover, &:-webkit-autofill:focus, &:-webkit-autofill:active { -webkit-text-fill-color: ${(props) => props.theme.textPrimary}; -webkit-background-clip: text; caret-color: ${(props) => props.theme.textPrimary}; } `; const InputContainer = styled.div<{ hasError: boolean; disabled: boolean; isContextAvailable: boolean; }>` height: 100%; display: flex; align-items: center; gap: ${spacing.f8}; padding: 0 ${spacing.r8} 0 ${spacing.r8}; background: ${(props) => props.theme.backgroundLevel1}; border-radius: ${spacing.r4}; ${(props) => props.disabled ? css` opacity: 0.5; cursor: not-allowed; ` : ''} `; const InputBorder = styled.div<{ disabled: boolean; hasError: boolean; width: string; }>` box-sizing: border-box; width: ${(props) => props.width}; height: ${spacing.r32}; border: ${spacing.r1} solid ${(props) => props.hasError ? props.theme.statusCritical : props.theme.border}; border-radius: ${spacing.r4}; &:hover { ${(props) => !props.disabled && `border: ${spacing.r1} solid ${props.theme.infoPrimary};`} } &:focus-within { border: ${spacing.r1} solid ${(props) => props.theme.infoPrimary}; } `; const SelfCenterredIcon = styled(Icon) <{ color: keyof CoreUITheme }>` align-self: center; color: ${(props) => props.theme[props.color]}; `; export type InputSize = '1' | '2/3' | '1/2' | '1/3'; export type InputProps = { error?: string; id: string; leftIcon?: IconName; leftIconColor?: keyof CoreUITheme; rightIcon?: IconName; rightIconColor?: keyof CoreUITheme; size?: InputSize; noPlaceholderPrefix?: boolean; } & Omit, 'size'>; export const Input = forwardRef( ( { error, disabled, id, leftIcon, leftIconColor = 'textSecondary', rightIcon, rightIconColor = 'textSecondary', placeholder, size, noPlaceholderPrefix, ...inputProps }, ref, ) => { const { isContextAvailable, disabled: disabledFromFieldContext, error: errorFromFieldContext, } = useFieldContext(); placeholder = placeholder ? noPlaceholderPrefix ? placeholder : `Example: ${placeholder}` : undefined; return ( {leftIcon && ( )} {rightIcon && ( )} ); }, );