UNPKG

@kiwicom/orbit-components

Version:

Orbit-components is a React component library which provides developers with the easiest possible way of building Kiwi.com's products.

272 lines 23.8 kB
import * as React from "react"; import type { Props } from "./types"; export declare const FakeInput: ({ error, disabled }: Pick<Props, "error" | "disabled">) => React.JSX.Element; /** * @orbit-doc-start * README * ---------- * # InputField * * To implement the InputField component into your project you'll need to add the import: * * ```jsx * import InputField from "@kiwicom/orbit-components/lib/InputField"; * ``` * * After adding import to your project you can use it simply like: * * ```jsx * <InputField /> * ``` * * ## Props * * The table below contains all types of props available in the InputField component. * * | Name | Type | Default | Description | * | :------------------- | :--------------------------------- | :-------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | * | autoComplete | `string` | | The autocomplete attribute of the input, see [this docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete). | * | autoFocus | `boolean` | | The autofocus attribute of the input, see [this docs](https://www.w3schools.com/tags/att_autofocus.asp). Keep in mind that autofocus works only when Input is initially rendered. | * | defaultValue | `string \| number` | | Specifies the default value of the InputField. To be used with uncontrolled usage. | * | disabled | `boolean` | | If `true`, the InputField will be disabled. | * | dataAttrs | `Object` | | Optional prop for passing `data-*` attributes to the `input` DOM element. | * | dataTest | `string` | | Optional prop for testing purposes. | * | error | `React.Node` | | The error to display beneath the InputField. [See Functional specs](#functional-specs) | * | tags | `React.Node` | | Optional prop to display rendered Tag component. [See Functional specs](#functional-specs) | * | help | `React.Node` | | The help to display beneath the InputField. | * | label | `Translation` | | The label for the InputField. [See Functional specs](#functional-specs) | * | id | `string` | | Set `id` attribute for input. | * | inlineLabel | `boolean` | | If `true`, the label renders on the left side of input. | * | inputMode | [`enum`](#enum) | | The type of data that might be entered by the user. [See more here](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inputmode). | * | minValue | `number` | | Specifies the minimum value for the InputField. | * | maxValue | `number` | | Specifies the maximum value for the InputField. | * | maxLength | `number` | | Specifies the maximum number of characters allowed. | * | minLength | `number` | | Specifies the minimum number of characters allowed. | * | width | `string` | `"100%"` | Specifies the width of the InputField. | * | required | `boolean` | | If `true`, the label is displayed as required. | * | name | `string` | | The name for the InputField. | * | onBlur | `event => void \| Promise` | | Function for handling onBlur event. | * | onChange | `event => void \| Promise` | | Function for handling onChange event. | * | onFocus | `event => void \| Promise` | | Function for handling onFocus event. | * | onKeyDown | `event => void \| Promise` | | Function for handling onKeyDown event. | * | onKeyUp | `event => void \| Promise` | | Function for handling onKeyUp event. | * | onMouseDown | `event => void \| Promise` | | Function for handling onMouseDown event. | * | onMouseUp | `event => void \| Promise` | | Function for handling onMouseUp event. | * | onSelect | `event => void \| Promise` | | Function for handling onSelect event. | * | placeholder | `string \| (() => string))` | | The placeholder of the InputField. | * | **prefix** | `React.Node` | | The prefix component for the InputField. | * | readOnly | `boolean` | `false` | If `true`, the InputField is readOnly. | * | ref | `func` | | Prop for forwarded ref of the InputField. [See Functional specs](#functional-specs) | * | spaceAfter | `enum` | | Additional `margin-bottom` after component. | * | suffix | `React.Node` | | The suffix component for the InputField. | * | tabIndex | `string \| number` | | Specifies the tab order of an element. | * | **type** | [`enum`](#enum) | `"text"` | The type of the InputField. | * | value | `string \| number` | | Specifies the value of the InputField. To be used with controlled usage. | * | list | `string` | | The id of the datalist element. | * | ariaAutocomplete | `inline \| list \| both` | | The aria-autocomplete attribute of the input, see [this docs](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-autocomplete). | * | role | `textbox \| combobox \| searchbox` | `textbox` | The role attribute of the input, see [this docs](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/textbox_role). | * | ariaActiveDescendant | `string` | | The aria-activedescendant attribute of the input, see [this docs](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-activedescendant). | * | ariaHasPopup | `boolean` | | The aria-haspopup attribute of the input, see [this docs](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-haspopup). | * | ariaExpanded | `boolean` | | The aria-expanded attribute of the input, see [this docs](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-expanded). | * | ariaControls | `string` | | The aria-controls attribute of the input, see [this docs](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-controls). | * | ariaLabel | `string` | | Optional prop for `aria-label` value. See `Accessibility` tab. | * | ariaLabelledby | `string` | | Optional prop for `aria-labelledby` value. See `Accessibility` tab. | * | ariaDescribedby | `string` | | Optional prop for `aria-describedby` value. See `Accessibility` tab. | * * ### enum * * | inputMode | type | spaceAfter | * | :---------- | :------------- | :----------- | * | `"numeric"` | `"text"` | `"none"` | * | `"tel"` | `"number"` | `"smallest"` | * | `"decimal"` | `"email"` | `"small"` | * | `"email"` | `"password"` | `"normal"` | * | `"url"` | `"passportid"` | `"medium"` | * | `"search"` | | `"large"` | * | `"text"` | | `"largest"` | * | `"none"` | * * ## Functional specs * * - The `error` prop overwrites the `help` prop, due to higher priority. * * - The `help` and `error` icons overwrite the prefix when `inlineLabel` is `true`. * * ### Examples * * - Usage of `Tag` in `InputField` * * ```jsx * import Tag from "@kiwicom/orbit-components/lib/Tag"; * * <InputField * placeholder="My placeholder" * tags={ * <div> * <Tag>Brno</Tag> * <Tag>Praha</Tag> * </div> * } * />; * ``` * * * Accessibility * ------------- * ## Accessibility * * The InputField component has been designed with accessibility in mind, providing features that enhance the experience for users of assistive technologies. * * ### Accessibility props * * The following props are available to improve the accessibility of your InputField component: * * | Name | Type | Description | * | :------------------- | :------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | * | label | `Translation` | Provides a visible label that is associated with the input field. | * | role | `string` | Defines the role of the input element, which helps screen readers understand its purpose and behavior. | * | ariaLabel | `string` | Adds an `aria-label` to the input, providing a description for screen readers when no visible label is present. | * | ariaLabelledby | `string` | References the ID of an element that labels the input, establishing a relationship for screen readers. | * | ariaDescribedby | `string` | References the ID of an element that describes the input, useful for associating additional information with the field. | * | ariaAutocomplete | `inline \| list \| both \| none` | Indicates to screen readers whether and how the input provides autocomplete suggestions. | * | ariaActiveDescendant | `string` | Identifies the currently active descendant in a composite widget, such as when navigating through autocomplete suggestions. | * | ariaHasPopup | `boolean` | Indicates to screen readers that the input can trigger a popup, like a dropdown menu or dialog. | * | ariaExpanded | `boolean` | Indicates to screen readers whether the associated popup or dropdown is currently expanded. | * | ariaControls | `string` | Identifies the element controlled by the input, establishing a relationship for screen readers. | * * ### Automatic Accessibility Features * * The InputField component automatically handles several important ARIA attributes: * * - `aria-invalid`: When the `error` prop is provided, the input is automatically marked as invalid (`aria-invalid="true"`). This helps screen readers announce to users that the input contains an error. * * - `aria-describedby`: This attribute is automatically managed to associate `error` or `help` text with the input field: * - When the component is not inside an InputGroup and has `error` or `help` text, a unique ID is generated (based on the input's ID) and is combined with the `ariaDescribedby` prop to ensure all descriptions are announced by screen readers. * - When the component is inside an InputGroup, the InputGroup completely overrides any `ariaDescribedby` value that was set on the InputField. The InputGroup sets its own feedback ID as the `aria-describedby` value if there are any `error` or `help` values and the tooltip is shown. * * These automatic features ensure that the InputField remains accessible even without explicitly setting every ARIA attribute, while still allowing for customization when needed. See the [Examples section](#using-ariadescribedby-for-enhanced-accessibility) for detailed usage examples of `ariaDescribedby`. * * ### Best practices * * - When no visible `label` is provided, use `ariaLabel` to provide an accessible name for the input field to ensure the input's purpose is clear to screen reader users. Alternatively, you can use `ariaLabelledby` to reference the ID of an existing element that labels the input. * * - Always ensure that `ariaLabel` text and any text in elements referenced by `ariaLabelledby` are properly translated to match the user's language. * * - Don't rely solely on `placeholder` for providing instructions or label of the input. * * - For inputs that trigger autocomplete behavior or control other elements, use the appropriate ARIA attributes (`ariaAutocomplete`, `ariaActiveDescendant`, `ariaHasPopup`, `ariaExpanded`, `ariaControls`) to make the functionality accessible. * * - When using `prefix` or `suffix` elements, ensure they don't interfere with the accessibility of the input field and are properly labeled if they are interactive. * * ### Examples * * #### Basic InputField with label * * ```jsx * <InputField label="Email address" placeholder="your@email.com" type="email" name="email" required /> * ``` * * In this example, screen readers would announce "Email address, required, edit, email" when focusing on the input field. * * #### InputField with autocomplete * * ```jsx * <InputField * label="City" * placeholder="Start typing..." * role="combobox" * ariaHasPopup={true} * ariaExpanded={suggestionsVisible} * ariaControls="city-suggestions" * ariaAutocomplete="list" * ariaActiveDescendant={activeItemId} * /> * ``` * * In this example, the InputField is configured as a combobox with autocomplete features. Screen readers would announce information about the combobox state, including whether suggestions are available and which suggestion is currently active. * * #### Using ariaDescribedby for enhanced accessibility * * The `ariaDescribedby` prop allows you to specify an `aria-describedby` attribute for the InputField component. This attribute links the component to additional descriptive text, enhancing accessibility by providing supplementary information to screen readers. * * ```jsx * <InputField label="Password" type="password" ariaDescribedby="password-requirements" /> * <p id="password-requirements" style={{ display: "none", visibility: "hidden" }}> * Password must be at least 8 characters long and include at least one uppercase letter and one number. * </p> * ``` * * When using the `error` or `help` props, the component automatically manages the `aria-describedby` attribute: * * ```jsx * <InputField label="Username" error="This username is already taken" /> * ``` * * In this example, the error message is automatically associated with the input field via `aria-describedby`. * * If you provide both an `ariaDescribedby` prop and use `error` or `help`, the component automatically combines them, ensuring that screen readers announce all descriptive content: * * ```jsx * <InputField label="Email" error="Invalid email format" ariaDescribedby="email-hint" /> * <p id="email-hint" style={{ display: "none", visibility: "hidden" }}> * We'll never share your email with anyone else. * </p> * ``` * * In this example, both the "email-hint" text and the error message will be announced by screen readers. The text from `ariaDescribedby` will be announced first, followed by the text from `error`. * * ### InputGroup Integration * * When using InputField within an InputGroup, the `aria-describedby` association follows these rules: * * #### Group-level error/help messages * * If the InputGroup has `error`/`help` messages, all child components will have `aria-describedby` set to these values **by default:** * * ```jsx * <InputGroup label="Passenger details" error="Incomplete information"> * <InputField label="First name" /> * <InputField label="Last name" /> * </InputGroup> * ``` * * In this example, all InputField components will have the InputGroup's error message "Incomplete information" announced by screen readers. * * #### Component-level error/help messages * * If individual InputField components have their own `error`/`help` messages (and the InputGroup doesn't), only those specific components will have `aria-describedby` set: * * ```jsx * <InputGroup label="Passenger details"> * <InputField label="First name" /> * <InputField label="Last name" error="Last name is required" /> * </InputGroup> * ``` * * In this example, only the second InputField will have its error message "Last name is required" announced. * * #### Component-level ariaDescribedby value * * Avoid setting `ariaDescribedby` directly on InputField components when inside an InputGroup, as these values will be overwritten by the InputGroup's internal accessibility logic: * * ```jsx * <InputGroup label="Contact information"> * <Select options={countryOptions} label="Country" /> * <InputField * label="Phone number" * ariaDescribedby="phone-hint" // This will be overwritten * /> * <p id="phone-hint" style={{ display: "none", visibility: "hidden" }}> * Enter your phone number * </p> * </InputGroup> * ``` * * In this example, the `ariaDescribedby` value "phone-hint" will be ignored because the InputGroup manages the accessibility associations internally. Instead, rely on the InputGroup's `error`/`help` props or the component's own `error`/`help` props. * * * @orbit-doc-end */ declare const InputField: (props: Props) => React.JSX.Element; export default InputField; //# sourceMappingURL=index.d.ts.map