A form field that opens a dropdown of options when tapped — label, value, and chevron.
Contexts are illustrative. Final screens will reference actual GCash patterns.
isFilled now uses true/false (C2 fixed). Peso sign still uses shape_full BOOLEAN_OPERATION instead of a clean vector (C6).| State | iOS | Android | Figma Property | Notes |
|---|---|---|---|---|
| Default | Yes | Yes | State=Default | Gray #D7E0EF border, white bg. Peso sign #183462. |
| 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. Peso sign #7E96BE. |
-
isFilledrenamed fromYes/Nototrue/falsefor direct SwiftBool/ KotlinBooleanmapping C2 Fixed - Peso Sign
shape_fullBOOLEAN_OPERATION flattened to a single vector path across all 8 variants C6 Fixed - Field Trailing Flag replaced from raster IMAGE fill to vector SVG across all 8 variants C6 Fixed
- Flatten the Peso Sign
shape_fullBOOLEAN_OPERATION. Boolean-operation paths render inconsistently across SVG export and native platforms. Replace with a single flattened vector path. Asset - Use a vector flag asset. The Philippine flag is currently a raster IMAGE fill. Swap to a vector from the DS icon library so it stays crisp across DPIs and platforms. Asset
- Generalize to multi-currency. Expose currency symbol and flag as configurable slots so the field can support other currencies (USD, EUR, SGD) without creating a new component per currency. Property
- Add a
helperTextslot. Error state has no accompanying text guidance today — add a slot for validation messages consistent with the other form fields. Slot
All states share the same container structure. Border color is the primary state indicator. Peso sign and text colors shift in disabled state.
| Role | Token | DEFAULT | ACTIVE | ERROR | DISABLED |
|---|---|---|---|---|---|
| Border | field/border | #D7E0EF | #005CE5 | #D61B2C | hidden |
| Background | field/bg | #FFFFFF | #FFFFFF | #FFFFFF | #EEF2F9 |
| Label text | field/text/label | #0A2757 | #0A2757 | #0A2757 | #0A2757 |
| Value (filled) | field/text/filled | #0A2757 | #0A2757 | #0A2757 | #90A8D0 |
| Value (empty) | field/text/placeholder | #90A8D0 | #90A8D0 | #90A8D0 | #C2CFE5 |
| Peso sign | field/icon/peso | #183462 | #183462 | #183462 | #7E96BE |
| Role | Token | Value |
|---|---|---|
| Label | Font | Proxima Soft Semibold |
| Size | 16px | |
| Value | Font | Proxima Soft |
| Size | 14px |
iOS — Swift Package Manager
.package(url: "https://github.com/AY-Org/eb-ds-ios", from: "1.0.0")
Android — Gradle (Kotlin DSL)
implementation("com.eastblue.ds:form-elements:1.0.0")
Import
import EastBlueDS import com.eastblue.ds.form.*
Package not yet published. These are the planned distribution paths.
| Figma Property | SwiftUI | Compose |
|---|---|---|
| isFilled (true/false) | selection: Binding<String?> | selectedValue: String? |
| State = Default | — | — |
| State = Active | .focused() | interactionSource |
| State = Error | .ebError(true) | isError = true |
| State = Disabled | .disabled(true) | enabled = false |
EBSelectField("Amount", selection: $amount)
EBSelectField( label = "Amount", selectedValue = amount, onValueChange = { amount = it } )
EBSelectField("Amount", selection: $amount) .ebError(true)
EBSelectField( label = "Amount", selectedValue = amount, onValueChange = { amount = it }, isError = true )
EBSelectField("Amount", selection: $amount) .disabled(true)
EBSelectField( label = "Amount", selectedValue = amount, onValueChange = { amount = it }, enabled = false )
| Requirement | iOS | Android |
|---|---|---|
| Minimum touch target | 44 x 44 pt | 48 x 48 dp |
| Accessibility label | .accessibilityLabel("Select amount") | contentDescription |
| Role hint | .accessibilityHint("Double tap to select") | semantics { role = Role.DropdownList } |
| Error announcement | VoiceOver reads error via .accessibilityValue | TalkBack reads error via semantics { error() } |
Do
Use Select Field for currency amount selection where the peso sign and flag indicator provide essential context for the user.
Don't
Use Select Field for free-text entry — use Input Field instead. Select Field is for predefined selection only.
Do
Show error state with a helper text message below the field explaining the validation issue (e.g. "Minimum amount is 1.00").
Don't
Hide the peso sign or flag — these are essential visual cues that distinguish this field from a generic dropdown.
| ID | Criterion | Status | Notes |
|---|---|---|---|
| C1 | Layer Structure & Naming | Ready | Semantic layer names: container, peso-sign, text-container, flag-container, Chevron Down. |
| C2 | Variant & Property Naming | Ready | isFilled=true/false — correct boolean convention for native mapping. |
| C3 | Token Coverage | Needs Refinement | Colors appear correct but token binding not fully verified. |
| C4 | Native Mappability | Ready | Maps to custom EBSelectField (SwiftUI) / EBSelectField (Compose). |
| C5 | Interaction State Coverage | Ready | All 4 states defined: Default, Active, Error, Disabled. |
| C6 | Asset & Icon Quality | Requires Rework | Peso sign uses shape_full BOOLEAN_OPERATION (not a vector). Flag uses raster IMAGE fill. |
4 State values × 2 isFilled values (true/false).
| State | isFilled | Node ID |
|---|---|---|
| Default | true | 17758:3787 |
| Default | false | 17758:3797 |
| Active | true | 17758:3807 |
| Active | false | 17758:3817 |
| Error | true | 17758:3827 |
| Error | false | 17758:3837 |
| Disabled | true | 17758:3847 |
| Disabled | false | 17758:3857 |
Bool / Kotlin Boolean mapping for Code Connect.
FixedisFilled=Yes/No instead of true/false. Incompatible with Swift Bool and Kotlin Boolean for Code Connect mapping.
Fixed in 1.1.0shape_full is a BOOLEAN_OPERATION, not a clean vector path. May render inconsistently on native platforms.
Openflag-container uses a raster IMAGE fill instead of a vector. May degrade on high-density displays.
Open