A pointered callout for walkthroughs and contextual hints. Carries a header, a description, and three slots — ⤷ AssetSlot, ⤷ CloseSlot, ⤷ ActionSlot.
Onboarding - Tooltip, Tooltip Blurred and Transparent and Tooltip V2 — into one 24-variant set. Every issue raised against those three is resolved: the pointer is a vector, the close is a DS icon instance, the four pointer booleans became a single Placement enum, and content sits in three named Figma slots. Interaction states are carried by the Button and close icon and are assessed on those components. Code Connect mappings are left open for engineering to register.Contexts are illustrative. Tooltip sits above a dimmed cut-out during walkthroughs, and inline against a target element for contextual hints. The GBonds walkthrough screens in the Figma section show both.
Details takes the taller of the 46px asset slot and the text stack, so emptying a slot shrinks the card.Text axis reads Header / Description / Both and the layers are #header / #description. All three slots use the ⤷ …Slot convention shared with the Table family.Button - XSmall, both inside named slots a consumer can swap or empty.| State | iOS | Android | Figma Property | Notes |
|---|---|---|---|---|
| Default | Yes | Yes | Text × Placement × Appearance | Tooltip is a presentation surface with no interaction states of its own. Tap and pressed behaviour belong to the Button - XSmall in ⤷ ActionSlot and the close icon in ⤷ CloseSlot. |
- Code Connect mappings not registered. Left open for engineering. The property surface is stable and linkable — three enums and three named slots, with layer names that match the property values. C7 · Code Connect Linkability
- Three sibling Tooltips folded into one component.
Onboarding - Tooltip,Tooltip Blurred and TransparentandTooltip V2are gone. The section now holds a singleTooltipset, and the visual treatment that shipped as its own component is nowAppearance=Translucent. C2 · Variant & Property Naming - Pointer direction is a single enum. The four independent booleans on
Tooltip V2, and the conflicting pointer schema onOnboarding - Tooltip, are replaced byPlacement = Top | Bottom | Left | Right. Geometry follows: 24 × 12 on the vertical placements, 12 × 24 on the horizontal ones. C2 · Variant & Property Naming - Pointer is a vector, not a raster. All three predecessors shipped the triangle as a raster asset. It is now a real vector — a filled path plus a rounded stroke — that recolours per appearance and rotates per placement. C6 · Asset & Icon Quality
- Close is a DS icon instance. Previously an image asset on two of the three siblings. It is now an icon instance sitting in
⤷ CloseSlot. C6 · Asset & Icon Quality - Content sits in named slots. The missing body and CTA support is resolved by three Figma slots —
⤷ AssetSlot(46 × 46),⤷ CloseSlot(16 × 16) and⤷ ActionSlotholding a realButton - XSmall. The leading gray placeholder circle is now the slot default rather than baked artwork. C1 · Layer Structure & Naming - One vocabulary across property, layer and content. The
Textaxis, the layer names and the slot names were reconciled in the same pass —Header/Description/Both,#header/#description, and the⤷ …Slotconvention shared with Table. C1 · Layer Structure & Naming
- Document the dismiss contract and walkthrough lifecycle. Tooltip renders a close affordance but owns no dismiss behaviour. Write down who dismisses it, whether dismissal advances a walkthrough step, and what happens to the backdrop cut-out — otherwise each consumer invents it. No Figma change required. Docs
- Fold Tooltip into the library-wide slot naming rule. Tooltip now follows the Table family convention (
⤷ AssetSlot,⤷ CloseSlot,⤷ ActionSlot), making it two families to one against the carousel components’ unsuffixed form. Table already carries an open recommendation to write a single rule into the guidelines — this component should be named in it. Docs
The default surface: white container, weak border, dark header and secondary description. Used over ordinary screen content.
Tooltip owns the container, pointer and text colours. The CTA button and close glyph are DS components documented on their own pages.
| Role | Token | Opaque | Translucent |
|---|---|---|---|
| Container bg | bg/color-bg-main · bg/color-bg-inverse | #FFFFFF | #0A2757 |
| Container border | border/color-border-weak · bg/color-bg-inverse | #E5EBF4 | #0A2757 |
| Header | text/color-text-primary · text/color-text-inverse | #0A2757 | #FFFFFF |
| Description | text/color-text-secondary · text/color-text-inverse-weak | #6780A9 | #F6F9FD @ 80% |
| Close glyph | text/color-text-primary · text/color-text-inverse | #0A2757 | #FFFFFF |
| Pointer fill | matches container bg | #FFFFFF | #0A2757 |
| Pointer stroke | matches container border | #E5EBF4 | #0A2757 |
Inverse surface for placement over imagery and dimmed walkthrough backdrops. Naming only — no blur or alpha is attached to the fill.
Measured from the component set. Height is a hug, not a fixed value.
| Role | Token | Value |
|---|---|---|
| Container width | — | 336 (348 including a left/right pointer) |
| Padding | space/space-16 | 16 |
| Details → Action gap | space/space-16 | 16 |
| Asset → text gap | space/space-12 | 12 |
| Text → close gap | space/space-16 | 16 |
| Corner radius | radius/radius-2 | 6 |
| ⤷ AssetSlot | — | 46 × 46 |
| ⤷ CloseSlot | — | 16 × 16 |
| ⤷ ActionSlot | — | 304 × 28 |
| Pointer | — | 24 × 12 top/bottom · 12 × 24 left/right |
Swift Package Manager
https://github.com/gcash/east-blue-ios
Gradle
implementation("com.gcash.eastblue:components:1.0.0") Import — SwiftUI
import EastBlue
Import — Compose
import com.gcash.eastblue.components.EBTooltip
Native components are not yet implemented — all snippets show the planned API.
Three enums and three slots. Placement drives the pointer edge only; anchoring and collision handling are the caller’s responsibility.
| Figma Property | SwiftUI | Compose |
|---|---|---|
| Text = Header | Description | Both | header: String? / description: String? | header: String? / description: String? |
| Placement = Top | Bottom | Left | Right | placement: .top / .bottom / .leading / .trailing | placement: EBTooltipPlacement |
| Appearance = Opaque | Translucent | appearance: .opaque / .translucent | appearance: EBTooltipAppearance |
| ⤷ AssetSlot | .ebLeadingAsset { … } | leadingAsset: @Composable (() -> Unit)? |
| ⤷ CloseSlot | onDismiss: (() -> Void)? | onDismiss: (() -> Unit)? |
| ⤷ ActionSlot | .ebAction { … } | action: @Composable (() -> Unit)? |
EBTooltip(
header: "Header",
description: "Description goes here",
placement: .top,
appearance: .opaque,
onDismiss: { step.skip() }
)
.ebLeadingAsset { Image("illustration") }
.ebAction { EBButton("Next").controlSize(.mini) } EBTooltip(
header = "Header",
description = "Description goes here",
placement = EBTooltipPlacement.Top,
appearance = EBTooltipAppearance.Opaque,
leadingAsset = { Image(painterResource(R.drawable.illustration), null) },
action = { EBButton("Next", size = EBButtonSize.XSmall) },
onDismiss = { step.skip() },
) EBTooltip(
description: "Description goes here",
placement: .bottom,
appearance: .translucent
) EBTooltip(
description = "Description goes here",
placement = EBTooltipPlacement.Bottom,
appearance = EBTooltipAppearance.Translucent,
) | Requirement | iOS | Android |
|---|---|---|
| Announced as a single unit | Group header + description with .accessibilityElement(children: .combine) | Wrap content in Modifier.semantics(mergeDescendants = true) |
| Dismiss is reachable | The close control needs a 44 × 44 hit target — the 16 × 16 glyph is the visual only | Expand the touch target to 48 × 48 with Modifier.minimumInteractiveComponentSize() |
| Focus order during walkthroughs | Move focus to the tooltip on present with .accessibilitySortPriority | Request focus on the tooltip container when the step begins |
| Contrast | Translucent pairs #FFFFFF on #0A2757 — passes AA at both text sizes | Same — verify against the underlying backdrop when placed over imagery |
Do
Use Placement to point at the anchor element, and keep the tooltip within the safe area.
Don't
Do not rely on Placement for positioning — it sets the pointer edge only, not the tooltip’s location.
Do
Empty ⤷ AssetSlot and ⤷ ActionSlot for short inline hints — the container hugs down to the text.
Don't
Do not stack more than a header and one short description; Tooltip is not a modal.
Do
Use Translucent over imagery and dimmed walkthrough backdrops.
Don't
Do not expect Translucent to blur what is behind it — the name describes the palette, not an effect.
| ID | Criterion | Status | Notes |
|---|---|---|---|
| C1 | Layer Structure & Naming | Ready | Semantic names throughout — Container, Details, Text Container, #header, #description, and three ⤷ …Slot slots. |
| C2 | Variant & Property Naming | Ready | Three clean enums with consistent casing. Placement replaced four booleans; Appearance values both name visual treatments. |
| C3 | Token Coverage | Not Applicable | Tooltip owns the container, pointer and text colours listed under Styles. The CTA button and close icon carry their own tokens and are audited on their own pages. |
| C4 | Native Mappability | Ready | Maps to a popover or overlay with three enums and three composable slots. The container hugs its content, matching native layout behaviour. |
| C5 | Interaction State Coverage | Not Applicable | A presentation surface with no states of its own. Pressed and disabled belong to the Button and close icon. |
| C6 | Asset & Icon Quality | Ready | The pointer is a vector that recolours and rotates; the close is an icon instance. Both raster assets flagged on the predecessors are gone. |
| C7 | Code Connect Linkability | Not Mapped | No CLI mappings registered yet — left open for engineering. |
3 Text × 4 Placement × 2 Appearance = 24 variants, a complete matrix with no gaps. Top and Bottom measure 336 × 134; Left and Right measure 348 × 122, the extra 12 being the pointer.
| Placement | Text | Appearance | Container | Count |
|---|---|---|---|---|
| Top | Header · Description · Both | Opaque · Translucent | 336 × 134 | 6 |
| Bottom | Header · Description · Both | Opaque · Translucent | 336 × 134 | 6 |
| Left | Header · Description · Both | Opaque · Translucent | 348 × 122 | 6 |
| Right | Header · Description · Both | Opaque · Translucent | 348 × 122 | 6 |
View full Text × Placement × Appearance breakdown (24 rows)
| Text | Placement | Appearance | Node |
|---|---|---|---|
| Header | Top | Opaque | 6295:79648 |
| Description | Top | Opaque | 6295:79663 |
| Both | Top | Opaque | 6295:79678 |
| Header | Top | Translucent | 6295:79694 |
| Description | Top | Translucent | 6295:79709 |
| Both | Top | Translucent | 6295:79724 |
| Header | Bottom | Opaque | 6295:79740 |
| Description | Bottom | Opaque | 6295:79755 |
| Both | Bottom | Opaque | 6295:79770 |
| Header | Bottom | Translucent | 6295:79786 |
| Description | Bottom | Translucent | 6295:79801 |
| Both | Bottom | Translucent | 6295:79816 |
| Header | Left | Opaque | 6295:79832 |
| Description | Left | Opaque | 6295:79847 |
| Both | Left | Opaque | 6295:79862 |
| Header | Left | Translucent | 6295:79878 |
| Description | Left | Translucent | 6295:79893 |
| Both | Left | Translucent | 6295:79908 |
| Header | Right | Opaque | 6295:79924 |
| Description | Right | Opaque | 6295:79939 |
| Both | Right | Opaque | 6295:79954 |
| Header | Right | Translucent | 6295:79970 |
| Description | Right | Translucent | 6295:79985 |
| Both | Right | Translucent | 6295:80000 |
Onboarding - Tooltip, Tooltip Blurred and Transparent and Tooltip V2 are superseded by this 24-variant set. Their pages are retained as remove stubs pointing here.
DocumentedPlacement = Top | Bottom | Left | Right.
Resolved⤷ AssetSlot, ⤷ CloseSlot and ⤷ ActionSlot, the last holding a real Button - XSmall.
ResolvedText values recased to Header / Description / Both, the wrapper frame unified to Text Container, layers renamed to #header / #description, Appearance changed from Onboarding to Opaque, and the slots adopted the ⤷ …Slot convention.
Resolved