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. |
- 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
| Role | Element | Token | Value |
|---|---|---|---|
| Opaque | Container | — | #FFFFFF |
| Opaque | Border | — | #E5EBF4 |
| Opaque | Pointer | — | #FFFFFF |
| Opaque | Header | — | #0A2757 |
| Opaque | Description | — | #6780A9 |
| Opaque | Close | — | #0A2757 |
| Opaque | Asset placeholder | — | #D7E0EF |
| Opaque | Action button | — | #005CE5 |
| Opaque | Action label | — | #FFFFFF |
| Translucent | Container | — | #0A2757 |
| Translucent | Border | — | #0A2757 |
| Translucent | Pointer | — | #0A2757 |
| Translucent | Header | — | #FFFFFF |
| Translucent | Description | — | #F6F9FD @ 80% |
| Translucent | Close | — | #FFFFFF |
| Translucent | Asset placeholder | — | #D7E0EF |
| Translucent | Action button | — | #005CE5 |
| Translucent | Action label | — | #FFFFFF |
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:tooltip:1.0.0")
Import
import EastBlueDS import com.eastblue.ds.tooltip.*
Native components are not yet implemented — all snippets show the planned API.
Text, Placement and Appearance are the set’s three variant properties. ⤷ AssetSlot, ⤷ CloseSlot and ⤷ ActionSlot are Figma Slots; #header and #description are text layers read from 6295:79678 — their exposure as text properties is not readable with the plugin.
| Figma Property | SwiftUI | Compose |
|---|---|---|
| Text — Header, Description, Both | header: and description: — pass one or both | header = and description = — pass one or both |
| Placement — Top, Bottom, Left, Right | placement: .top / .bottom / .left / .right | placement = EBTooltipPlacement.Top / Bottom / Left / Right |
| Appearance — Opaque, Translucent | appearance: .opaque / .translucent | appearance = EBTooltipAppearance.Opaque / Translucent |
| ⤷ AssetSlot (slot) | .ebLeadingAsset(Image) | leadingAsset = { Icon(…) } |
| ⤷ CloseSlot (slot) | .onDismiss { } | onDismiss = { } |
| ⤷ ActionSlot (slot) | .ebAction("Next") { } | action = EBButton("Next", size = EBButtonSize.XSmall) { } |
| #header (text) | header: String? | header = "…" |
| #description (text) | description: String? | description = "…" |
EBTooltip(
header: "Header",
description: "Description goes here",
placement: .top,
appearance: .opaque
)
.ebLeadingAsset(Image("illustration"))
.ebAction("Next") { }
.onDismiss { } EBTooltip(
header = "Header",
description = "Description goes here",
placement = EBTooltipPlacement.Top,
appearance = EBTooltipAppearance.Opaque,
leadingAsset = { Icon(…) },
action = EBButton("Next", size = EBButtonSize.XSmall) { },
onDismiss = { }
) EBTooltip(
header: "Header",
description: "Description goes here",
placement: .top,
appearance: .translucent
)
.ebLeadingAsset(Image("illustration"))
.ebAction("Next") { }
.onDismiss { } EBTooltip(
header = "Header",
description = "Description goes here",
placement = EBTooltipPlacement.Top,
appearance = EBTooltipAppearance.Translucent,
leadingAsset = { Icon(…) },
action = EBButton("Next", size = EBButtonSize.XSmall) { },
onDismiss = { }
) | Requirement | iOS | Android |
|---|---|---|
| Announced as one unit | .accessibilityElement(children: .combine) on the container — header then description. | Modifier.semantics(mergeDescendants = true) on the container. |
| Dismiss is reachable | Close is a Button with accessibilityLabel("Dismiss"); the 16 pt glyph gets a 44 pt hit area; .accessibilityAction(.escape) also dismisses. | IconButton with contentDescription = "Dismiss" and a 48 dp touch target; back press dismisses. |
| Focus order | Header, description, then Next, then Dismiss — a walkthrough moves focus to the next tooltip after Next. | Same order; request focus on the new tooltip after Next. |
| Contrast | Opaque: #0A2757 on white (13.9:1); Translucent: white on #0A2757 (13.9:1), description at 80% still 9.4:1. | Same values — the surfaces are fixed, not themed. |
Do
Point Placement at the anchor and keep the 336 px container inside the safe area.
Don't
Don’t let the pointer sit over the anchor’s edge — move the tooltip, not the pointer.
Do
Use Translucent over imagery and dimmed walkthrough backdrops.
Don't
Don’t use Translucent on a plain white screen; Opaque is the default there.
Do
Use Text Both for walkthrough steps, Header alone for a one-line hint.
Don't
Don’t exceed one line in the header; the description is the place for detail.
Do
Fill ⤷ ActionSlot with the Next step of a walkthrough.
Don't
Don’t put a destructive action in the slot.
| ID | Criterion | Status | Notes |
|---|---|---|---|
| C1 | Layer Structure & Naming | Needs Refinement | Container › Details › ⤷ AssetSlot / Text Container / ⤷ CloseSlot, ⤷ ActionSlot, pointer-adjustment — read on 6295:79678. The slots keep the ⤷ glyph and the text layers the # sigil that the rest of the system has dropped. |
| C2 | Variant & Property Naming | Ready | Text, Placement, Appearance with Title Case values. |
| C3 | Token Coverage | Ready | #header → Primary/Headlines/Block, #description → Secondary/Bold/Caption. Colour variable bindings are not readable with the plugin — confirm in Dev Mode. |
| C4 | Native Mappability | Ready | Three enums, three slots, two strings — maps 1:1 onto EBTooltip. |
| C5 | Interaction State Coverage | Not Applicable | Interaction lives on the Button - XSmall and the Close icon and is assessed there. |
| C6 | Asset & Icon Quality | Needs Refinement | The pointer is a vector and the asset a swappable instance; the Close icon carries a shape_full BOOLEAN_OPERATION — flatten it in the icon library. |
3 Text × 4 Placement × 2 Appearance = 24 variants, a complete matrix
| Appearance | Text × Placement | Count |
|---|---|---|
| Opaque | Header, Description, Both × Top, Bottom, Left, Right | 12 |
| Translucent | Header, Description, Both × Top, Bottom, Left, Right | 12 |
View full Text × Placement × Appearance breakdown (24 rows)
| Text | Placement | Appearance | Node | Dimensions |
|---|---|---|---|---|
| Header | Top | Opaque | 6295:79648 | 336 × 134 |
| Header | Top | Translucent | 6295:79694 | 336 × 134 |
| Description | Top | Opaque | 6295:79663 | 336 × 134 |
| Description | Top | Translucent | 6295:79709 | 336 × 134 |
| Both | Top | Opaque | 6295:79678 | 336 × 134 |
| Both | Top | Translucent | 6295:79724 | 336 × 134 |
| Header | Bottom | Opaque | 6295:79740 | 336 × 134 |
| Header | Bottom | Translucent | 6295:79786 | 336 × 134 |
| Description | Bottom | Opaque | 6295:79755 | 336 × 134 |
| Description | Bottom | Translucent | 6295:79801 | 336 × 134 |
| Both | Bottom | Opaque | 6295:79770 | 336 × 134 |
| Both | Bottom | Translucent | 6295:79816 | 336 × 134 |
| Header | Left | Opaque | 6295:79832 | 348 × 122 |
| Header | Left | Translucent | 6295:79878 | 348 × 122 |
| Description | Left | Opaque | 6295:79847 | 348 × 122 |
| Description | Left | Translucent | 6295:79893 | 348 × 122 |
| Both | Left | Opaque | 6295:79862 | 348 × 122 |
| Both | Left | Translucent | 6295:79908 | 348 × 122 |
| Header | Right | Opaque | 6295:79924 | 348 × 122 |
| Header | Right | Translucent | 6295:79970 | 348 × 122 |
| Description | Right | Opaque | 6295:79939 | 348 × 122 |
| Description | Right | Translucent | 6295:79985 | 348 × 122 |
| Both | Right | Opaque | 6295:79954 | 348 × 122 |
| Both | Right | Translucent | 6295:80000 | 348 × 122 |
Appearance — Opaque, Translucent — with Text and Placement as panel controls and the three slots drawn filled as Figma ships them; the asset placeholder is now the solid #D7E0EF instance and the Close the library glyph. Padding, gap, alignment and colour tokens are not readable with the plugin and stay —.⤷ AssetSlot, ⤷ CloseSlot, ⤷ ActionSlot, #header and #description on 6295:79678 predate the family convention (-Slot suffix, no sigil). Filed from the scorecard for the Component Review.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