A standard form text-input field — label, body, and four interaction states (default, active, error, disabled).
Contexts are illustrative. Final screens will reference actual GCash patterns.
isFilled now uses true/false. C1 resolved — text layer renamed from #text-label to #label, consistent with sibling fields.| State | iOS | Android | Figma Property | Notes |
|---|---|---|---|---|
| Default | Yes | Yes | State=Default | Gray #D7E0EF border, white bg. |
| Active (Focused) | Yes | Yes | State=Active | Blue #005CE5 border. |
| Error | Yes | Yes | State=Error | Red #D61B2C border. |
| Disabled | Yes | Yes | State=Disabled | #EEF2F9 bg, border hidden. |
-
isFilledproperty renamed fromYes/Nototrue/false— now maps directly to SwiftBool/ KotlinBooleanC2 Fixed - Text layer renamed from
#text-labelto#label— now consistent with sibling fields C1 Fixed
- Code Connect mappings not registered. Structural work is complete — registration can proceed against the 8-variant
State × isFilledschema. C7 · Code Connect Linkability
- Standardize text layer naming across Form Elements. Input Field now uses
#label; verify the remaining fields (Labeled, Select, Recipient, View Only) follow the same convention so Code Connect label-slot mapping is uniform. Rename - Add a
helperTextslot below the field. Validation messages and hint copy are currently handled outside the component — a first-class slot keeps form anatomy self-contained and matches nativeTextFieldhint affordances. Slot - Add
leadingIcon/trailingIconslots. Labeled Field already has these — extend to Input Field for search, clear, and validation-indicator use cases. Lets the DS cover the full form-element palette without per-screen customization. Slot
Idle state with gray border. Text color depends on whether the field has a value.
All states share the same container structure. Border color is the primary state indicator.
| Role | Token | DEFAULT | ACTIVE | ERROR | DISABLED |
|---|---|---|---|---|---|
| Border | field/border | #D7E0EF | #005CE5 | #D61B2C | hidden |
| Background | field/bg | #FFFFFF | #FFFFFF | #FFFFFF | #EEF2F9 |
| Text (filled) | field/text/filled | #0A2757 | #0A2757 | #0A2757 | #90A8D0 |
| Text (empty) | field/text/placeholder | #90A8D0 | #90A8D0 | #90A8D0 | #C2CFE5 |
Focused state with blue border indicating active input.
Validation error state with red border.
Non-interactive state with gray background and hidden border.
iOS — Swift Package Manager
// In Xcode: File → Add Package Dependencies "https://github.com/AY-Org/eb-ds-ios"
Android — Gradle (Kotlin DSL)
dependencies { implementation("com.eastblue.ds:form-elements:1.0.0") }
Import
import EastBlueDS // SwiftUI import com.eastblue.ds.form.* // Compose
Package not yet published. These are the planned distribution paths.
| Figma Property | SwiftUI | Compose |
|---|---|---|
| isFilled (Yes/No) | text: Binding<String> | value: String |
| State = Default | — | — |
| State = Active | .focused() | interactionSource |
| State = Error | .ebError(true) | isError = true |
| State = Disabled | .disabled(true) | enabled = false |
EBInputField("Placeholder", text: $value)
EBInputField( value = text, onValueChange = { text = it }, placeholder = "Placeholder" )
EBInputField("Placeholder", text: $value) .ebError(true)
EBInputField( value = text, onValueChange = { text = it }, placeholder = "Placeholder", isError = true )
EBInputField("Placeholder", text: $value) .disabled(true)
EBInputField( value = text, onValueChange = { text = it }, placeholder = "Placeholder", enabled = false )
| Requirement | iOS | Android |
|---|---|---|
| Minimum touch target | 44 x 44 pt | 48 x 48 dp |
| Accessibility label | .accessibilityLabel("Input") | contentDescription |
| Error announcement | VoiceOver reads error via .accessibilityValue | TalkBack reads error via semantics { error() } |
Do
Pair with a visible label above or inside the field. Use placeholder text to hint at expected input format.
Don't
Use placeholder text as the only label — it disappears on focus and fails accessibility.
Do
Show error state with a helper text message below the field explaining what needs to be corrected.
Don't
Use Input Field for selection — use Select Field instead. Input Field is for free-text entry only.
| ID | Criterion | Status | Notes |
|---|---|---|---|
| C1 | Layer Structure & Naming | Ready | Layer renamed to #label, now consistent with sibling fields. |
| C2 | Variant & Property Naming | Ready | isFilled now uses true/false. Boolean naming resolved. |
| C3 | Token Coverage | Needs Refinement | Colors appear correct but token binding not verified. |
| C4 | Native Mappability | Ready | Maps to TextField (SwiftUI) / OutlinedTextField (Compose). |
| C5 | Interaction State Coverage | Ready | All 4 states defined: Default, Active, Error, Disabled. |
| C6 | Asset & Icon Quality | Ready | No icons in base Input Field — text only. |
| C7 | Code Connect Linkability | Needs Refinement | No CLI mappings registered yet. |
| Aspect | Status | Notes |
|---|---|---|
| Property naming | Ready | isFilled uses true/false — maps directly to native booleans |
| State coverage | Ready | All 4 states defined |
| Native component file | Needs Refinement | EBInputField.swift / EBInputField.kt not yet created |
4 State values × 2 isFilled values.
| State | isFilled | Node ID |
|---|---|---|
| Default | true | 17758:3688 |
| Default | false | 17758:3691 |
| Active | true | 17758:3694 |
| Active | false | 17758:3697 |
| Error | true | 17758:3700 |
| Error | false | 17758:3703 |
| Disabled | true | 17758:3706 |
| Disabled | false | 17758:3709 |
isFilled=Yes/No updated to isFilled=true/false in Figma. Now maps directly to Swift Bool and Kotlin Boolean for Code Connect.
Fixed#text-label renamed to #label in Figma. Now consistent with sibling fields (Labeled Field, Select Field, Recipient Field).
FixedisFilled=Yes/No instead of true/false. Incompatible with Swift Bool and Kotlin Boolean for Code Connect mapping.
Open