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
- Code Connect mappings not registered. Structural work is complete — registration can proceed against the 8-variant
State × isFilledschema. C7 · Code Connect Linkability
- 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
Idle state with gray border. Peso sign in dark navy, flag visible, chevron down affordance.
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 |
Focused state with blue border indicating active selection.
| Role | Token |
|---|---|
| Height | 46px |
| Corner radius | 6px |
| Peso sign size | 15 × 15 |
| Flag size | 25 × 16 |
| Flag corner radius | 2px |
| Chevron size | 32 × 32 |
Validation error state with red border.
| Role | Token | Value |
|---|---|---|
| Label | Font | Proxima Soft Semibold |
| Size | 16px | |
| Value | Font | Proxima Soft |
| Size | 14px |
Non-interactive state with gray background, hidden border, and muted peso sign.
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 (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. |
| C7 | Code Connect Linkability | Needs Refinement | No CLI mappings registered yet. |
| Aspect | Status | Notes |
|---|---|---|
| Property naming | Ready | isFilled=true/false — boolean convention now correct for Code Connect mapping |
| Asset quality | Requires Rework | Peso sign BOOLEAN_OPERATION and raster flag need replacement |
| State coverage | Ready | All 4 states defined |
| Native component file | Needs Refinement | EBSelectField.swift / EBSelectField.kt not yet created |
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