import React, { useId } from 'react' import classnames from 'classnames' import { FieldGroup } from '~components/FieldGroup' import { FieldMessage } from '~components/FieldMessage' import { Icon } from '~components/Icon' import { Input, type InputProps } from '~components/Input' import { Label } from '~components/Label' import styles from './TextField.module.css' type OmittedInputProps = 'startIconAdornment' | 'endIconAdornment' | 'ariaDescribedBy' | 'ariaLabel' export type TextFieldProps = { /** * A short example of input text. For context or additional information use the `description` prop */ labelText: React.ReactNode inline?: boolean icon?: JSX.Element /** * A descriptive message for `error` or `caution` states */ validationMessage?: string | React.ReactNode /** * A description that provides context for the text field */ description?: string | React.ReactNode } & Omit /** * {@link https://cultureamp.atlassian.net/wiki/spaces/DesignSystem/pages/3081928705/Text+Field Guidance} | * {@link https://cultureamp.design/?path=/docs/components-text-field--docs Storybook} */ export const TextField = ({ id: propsId, labelText, inline = false, icon, validationMessage, description, status, reversed = false, disabled, ...restProps }: TextFieldProps): JSX.Element => { const fallbackId = useId() const id = propsId ?? fallbackId const validationMessageAria = validationMessage ? `${id}-field-validation-message` : '' const descriptionAria = description ? `${id}-field-description` : '' const ariaDescribedBy = [validationMessageAria, descriptionAria].reduce( (prev, curr) => (curr ? [curr, prev].join(' ') : prev), '', ) return ( ) } TextField.displayName = 'TextField'