A toggle paired with a label and optional helper text in a single row.
label, optional description, optional helper/error text, required marker, placement = leading | trailing, and inherit Toggle's state + size from the inner Toggle instance. Once built, drop-in for settings rows, form opt-ins, and list items.Labeled toggle is the primary form of Toggle shown in product. Settings rows, feature opt-ins, biometric/notification preferences — nearly all consumer-facing toggles are labeled.
| State | iOS | Android | Figma Property | Notes |
|---|---|---|---|---|
| Default | Yes | Yes | Frame only | Today: one static instance. Proposed: Toggle + label rendered in row. |
| Pressed | N/A | N/A | Not built | Tapping label should also toggle — entire row is the tap target. |
| Disabled | N/A | N/A | Not built | Label dims to secondary when toggle is disabled. |
| Error | N/A | N/A | Not built | Required toggle + form submit shows error text below label. |
- Not a real component. Layout frame with a Toggle + text, no properties or variants. Promote to a proper component. C1 · Layer Structure & Naming
- No slots. Cannot set label, add description, mark required, or show helper/error. C2 · Variant & Property Naming
- No placement option. iOS Form convention is trailing toggle; Material 3 allows either. Need
placement = leading | trailing. C4 · Native Mappability - No state coverage. Pressed row, disabled label, error visual all missing. C5 · Interaction State Coverage
- No Code Connect mapping. Blocked until component exists. C7 · Code Connect Linkability
- Build as a real component with property set:
label,description?,helper?,error?,required: boolean,placement = leading | trailing. InheritisSelected,State,Sizefrom the inner Toggle via instance-swap. Composition - Match Radio Button With Label's shape for consistency — same label/description layout, same required marker, same error styling. Selection controls should read alike. Family
- Whole-row tap target. Tapping the label or the description should toggle the switch — the entire row is the hit region. Matches iOS Form and Material 3 list-item behavior. State
- Consider a List Row wrapper that adds full-width chrome (dividers, padding) for use inside Settings screens. Today this shape would be built ad-hoc per screen; a dedicated variant makes Settings screens trivially composable. Family
- See: Toggle for the base control, Radio Button With Label for the target shape. Family
A 180×24 layout frame: Toggle instance on the left of its auto-layout, "Label" text on the right. No property set, no variants — functionally identical to placing a Toggle + Text next to each other on a canvas.
Toggle in the on position with a leading label.
| Role | Token | Default |
|---|---|---|
| Track | toggle/color/default/active/bg-track | #005CE5 |
| Indicator | toggle/color/default/active/bg-indicator | #FFFFFF |
| Label | text/color-text-weak | #445C85 |
Default arrangement: label stack on the left, toggle on the right. Matches iOS Form and Material 3 list-item patterns.
Toggle in the off position with a leading label.
| Role | Token | Default |
|---|---|---|
| Track | toggle/color/default/inactive/bg-track | #C2CFE5 |
| Indicator | toggle/color/default/inactive/bg-indicator | #FFFFFF |
| Label | text/color-text-weak | #445C85 |
Inverse arrangement: toggle on the left, label stack on the right. Useful in inline form layouts where labels are right-heavy.
Toggle with a navy label for use on dark surfaces or accent contexts.
| Role | Token | Default |
|---|---|---|
| Label | main/toggle-with-label/label | #0A2757 |
| Track | toggle/color/default/active/bg-track | #005CE5 |
| Indicator | toggle/color/default/active/bg-indicator | #FFFFFF |
| Figma Property | SwiftUI | Compose |
|---|---|---|
label: String | label: String | label: String |
description?: String | description: String? | description: String? |
isSelected: true | false | @Binding var isOn: Bool | checked: Boolean |
placement: leading | trailing | placement: EBTogglePlacement | placement: EBTogglePlacement |
required: boolean | required: Bool | required: Boolean |
helper?: String | helper: String? | helper: String? |
error?: String | error: String? | error: String? |
State (inherited) | .disabled(true) / .ebState(.error) | enabled / error |
| Requirement | iOS | Android |
|---|---|---|
| Label ↔ Toggle link | VoiceOver announces label + state in one utterance ("Push notifications, on"). | TalkBack announces label + state in one utterance. Use Modifier.toggleable on the row. |
| Whole row tappable | Row wrapped in Button or .onTapGesture that toggles. | Row uses Modifier.toggleable, merging semantics. |
| Description announced | Combine label + description with .accessibilityElement(children: .combine). | Merge descendants, description as stateDescription or second line. |
| Required marker | Announce "required" after the label. | Append "required" to contentDescription. |
| Error | Error text linked via .accessibilityHint; announce on state change. | Error text in error semantics; TalkBack reads on focus. |
| ID | Criterion | Status | Notes |
|---|---|---|---|
| C1 | Layer Structure & Naming | Requires Rework | Not a component — just a layout frame. Promote to real component. |
| C2 | Variant & Property Naming | Requires Rework | No properties. Add label, description, placement, required, helper, error. |
| C3 | Token Coverage | Ready | Label typography and color bound via Toggle + Text styles. |
| C4 | Native Mappability | Requires Rework | Cannot map a frame. Once built, maps to Toggle inside LabeledContent on iOS, Row with Modifier.toggleable on Compose. |
| C5 | Interaction State Coverage | Requires Rework | Need Default, Pressed (row), Disabled, Error. |
| C6 | Asset & Icon Quality | Not Applicable | No assets. |
| C7 | Code Connect Linkability | Not Mapped | Blocked until component exists. |
Today: 1 layout frame. Proposed: placement (leading/trailing) × description (yes/no) × required (yes/no) × state (5) = 40 variants. May simplify by treating required and description as runtime props rather than Figma variants.
| # | Node | Dimensions | Contents |
|---|---|---|---|
| 1 | 18482:36538 | 180 × 24 | Toggle instance + "Label" text · auto-layout row |
isSelected, State, Size from the inner Toggle instance. Open