Field
Label/description/error composition for text-entry controls; wires accessible label and required relationships to text inputs only.
Identity
Section titled “Identity”- Category: Forms & selection
- Status: stable public Registry/export-map component family
- Targets: iOS · Android · Web, subject to the compatibility contract
- Prerequisites:
@beemvp/beeui-uiinstalled (or this component’s source copied via the Registry CLI below) and, on Web, the BeeUI Tailwind/Uniwind theme CSS loaded — see Start for full platform setup. - Source:
packages/ui/src/components/field.tsx
Import
Section titled “Import”import { Field } from '@beemvp/beeui-ui';There is no documented deep/private source import. For source ownership from a BeeUI checkout:
pnpm beeui add fieldRegistry (used throughout this page) is BeeUI’s source-ownership manifest — registry/registry.json — that the pnpm beeui/@beemvp/beeui-cli CLI reads to copy a component’s real source into your app and rewrite its internal imports; it is not an npm package index. This component’s own Registry entry: registry/registry.json.
Composition and public API
Section titled “Composition and public API”- Primary export:
Field- Also routed here, outside the Registry family:
field
- Package export subpath:
@beemvp/beeui-ui/field
- Also routed here, outside the Registry family:
Exported types: FieldProps
The generated API inventory is mechanically joined to packages/ui/src/index.ts, Registry metadata, and the component reference contract. Each type’s field table below is parsed directly from that source, not a second hand-maintained copy; for the fuller behavior narrative see the canonical component behavior catalog.
State and behavior contract
Section titled “State and behavior contract”Stateless label/description/error composition; it wires accessible label/required/error relationships only to a wrapped text-entry control (Input/Textarea) — never to checkbox/radio/switch, which label themselves explicitly. required never injects an English word into the wrapped control’s accessible name by default; it reaches assistive tech only through the control’s own aria-required/accessibility-required state. Pass requiredLabel to append localized copy (e.g. "Bắt buộc") to the accessible name instead — there is no built-in English or other-language default.
FieldProps
Section titled “FieldProps”| Prop | Type | Default | Description |
|---|---|---|---|
children (required) |
React.ReactNode |
— | Content rendered inside this element. The family’s composition section states which children it expects. |
className |
string |
— | Extra utility classes, merged after the component’s own via cn(...), so they win on conflict. An escape hatch for source-owned and application work, not a cross-engine portability guarantee. |
description |
string |
— | Secondary supporting text rendered beneath the primary label or title. |
disabled |
boolean |
false |
ORed into the field’s own disabled by any BeeUI form control (Input, Select, DatePicker, etc.) rendered as children. Defaults to false. |
error |
string |
— | Shown instead of description, styled destructively, when invalid is true. |
invalid |
boolean |
false |
ORed into the field’s own invalid by any BeeUI form control rendered as children, and switches the helper text below it from description to error. Defaults to false. |
label (required) |
string |
— | The visible text naming this element, and the accessible name unless one is set explicitly. |
labelNativeID |
string |
— | nativeID for the rendered Label, used to build accessibilityLabelledBy links. Defaults to a generated, stable-per-mount ID. |
required |
boolean |
false |
Renders the label with a required indicator and exposes it via requiredAccessibilityLabel. Defaults to false. |
requiredAccessibilityLabel |
string |
'required' |
Accessible label appended to the field’s name when required is true (e.g. announced as “Email, required”). No default — omit to expose required only through aria-required/accessibilityRequired on field-consuming controls, without injecting English copy. |
requiredLabel |
string |
— | Localized copy appended to the field’s accessible name when required is true (e.g. "Email, Bắt buộc"). No default — omit it to expose required only through aria-required/accessibilityRequired on field-context-aware controls (Checkbox, Radio, Switch), without injecting any English copy. |
Also carries every prop of Omit<ViewProps, 'children'> — that upstream contract is not reproduced here.
The executable fixtures below are the source-grounded usage examples; consumers should not infer state ownership from DOM structure or another UI library.
Provider and dependencies
Section titled “Provider and dependencies”- No additional provider is required by this family.
BeeUIProviderremains the recommended application root. - Peer/native dependencies visible to this Registry item:
react,react-native - Registry dependency closure:
core-cn,field-context,label,text,theme - Safe-area ownership remains explicit: shell surfaces touching system edges opt into
SafeArea; components do not silently invent app-shell insets. - Web consumers load the BeeUI semantic theme CSS as documented in Web onboarding.
Platform behavior
Section titled “Platform behavior”This family ships no platform-specific file, and its own source takes no Platform branch.
The same public family is exposed across the supported target matrix; meaningful platform differences remain governed by the compatibility contract.
Evidence classes are not equal and this page does not blur them: Web behavior is exercised in a real browser, while iOS and Android carry package/export and native-compile evidence, which is not device-runtime proof. The compatibility contract records which class each claim rests on.
Accessibility
Section titled “Accessibility”- Roles this family assigns:
alert— set infield.tsxby the components themselves, not by the caller. - Accessibility states and properties it sets:
accessibilityLiveRegion— read fromfield.tsx.
Keyboard/focus behavior, announcements, Dynamic Type/Web zoom, RTL and reduced-motion expectations are not derived here — see Accessibility overview, Keyboard & focus, RTL/localization and Large text & zoom. BeeUI does not claim universal accessibility certification from automated tests.
Styling and theming
Section titled “Styling and theming”- Style axes: none of its own — its appearance comes from tokens and your own classes; it also carries
Omit<ViewProps, 'children'>. - Class-name surfaces:
className.
Colors, spacing and typography come from semantic tokens rather than from values written here — see Theming and Density. A className is an escape hatch for source-owned and application work, not a cross-engine portability guarantee.
Executable examples
Section titled “Executable examples”- Primary executable fixture:
apps/showcase/__tests__/accessibility-readonly.test.tsx - Additional fixture:
apps/showcase/__tests__/checkbox-radio-field-form-group-context.test.tsx - Additional fixture:
apps/showcase/__tests__/component-contracts.test.tsx - Additional fixture:
apps/showcase/__tests__/field-label-accessible-name-dedup.test.tsx
Addressable examples
Section titled “Addressable examples”Each link below opens the Showcase at that exact example, not at the top of the gallery:
basic— smallest meaningful complete usagestates— the states exampleaccessibility— the accessibility examplecomposition— the composition example
The Showcase links demonstrate Web behavior; use the native-preview guide for real simulator/emulator/device paths.
Live Web preview
Section titled “Live Web preview”This frame loads the real BeeUI Web Showcase on demand; it is not a second docs-only implementation. It proves browser behavior only. Use native preview for iOS/Android simulator, emulator or device paths.
Composition anatomy
Section titled “Composition anatomy”- Family root / primary export:
Field- Exported type surface:
FieldProps
- Exported type surface:
The tree above is ordinary document structure so it remains readable with keyboard and assistive technology; it is derived from the real public export family rather than a canvas-only diagram.
Verified example source
Section titled “Verified example source”These are the parts of the typechecked runtime Showcase fixture behind this live preview — apps/showcase/component-gallery/component-gallery.tsx, 1103 lines — where Field is actually used: 34 lines in 4 places. Each block is copied verbatim from the line range named above it, so it is the same executable source, not a retelling of it. The rest of that file exercises other families and is not reproduced here.
Imports the examples below need (a filtered subset of the fixture’s own top-level imports):
import { Field, Input, OTPInput, PasswordInput, Popover, SearchInput, Sheet, Textarea } from '@beemvp/beeui-ui';import * as React from 'react'; <Field label="Note"> <Input accessibilityLabel="Popover note" testID="popover-demo-input" /> </Field>Fixture state this block reads (same file, lines 461, 464):
const [notifications, setNotifications] = React.useState(true); const [otp, setOtp] = React.useState(''); <Field description="Used only for account notifications." label="Email" required testID="component-gallery-field"> <Input autoCapitalize="none" placeholder="you@example.com" /> </Field> <Field label="Search"> <SearchInput onSearch={() => undefined} placeholder="Search projects" /> </Field> <Field label="Password"> <PasswordInput placeholder="Enter password" /> </Field> <Field description="Six numeric digits." label="Verification code" testID="field-otp-composition"> <OTPInput accessibilityLabel="Verification code" onValueChange={setOtp} value={otp} /> </Field> <Field error="Enter a valid project name." invalid label="Project name" testID="field-invalid-state"> <Input placeholder="Invalid value" /> </Field> <Field disabled label="Managed field" testID="field-disabled-state"> <Input placeholder="Disabled by field context" /> </Field> <Field description="Optional long-form content." label="Notes"> <Textarea placeholder="Long-form notes" /> </Field> <Field label="Project name"> <Input defaultValue="BeeUI" /> </Field> <Field label="Search"> <Input accessibilityLabel="Sheet search" testID="sheet-demo-input" /> </Field>Open the fixture itself for the full surrounding component. For a smaller app-specific example, start from the imports and fixture-state blocks above and keep only the state your screen owns.
Limitations
Section titled “Limitations”Checkbox/radio/switch labelling stays explicit at the control/group level. The older requiredAccessibilityLabel prop still works if set explicitly, but is deprecated in favor of requiredLabel.