A page-bottom region containing partner logos, regulatory disclaimers, and helper links.
4227:11068 in the 2026 Working File as Alignment × LogoType × Label × Description, authored as a curated seven-variant set. The per-partner axes are collapsed into one enum, property and layer naming follow the guidelines throughout, and every dimension is a whole pixel. Five questions the original assessment left open are settled by decision: the raster partner marks, the baked disclaimer, Alignment staying a property, Footer remaining a component, and the variant selection being curated rather than partial. All four DS Health traits pass; the only item still open is Code Connect, blocked until the native library exists.The Footer sits at the bottom of lending/savings/investment flows — carrying regulatory disclosures, partner attribution, and a link to more information on the Help Center.
LogoType enum, Label reads True/False, and every layer carries a semantic name.Logos - Footer instances so a logo change updates from one source, and the component drops into any page bottom without configuration.| State | iOS | Android | Figma Property | Notes |
|---|---|---|---|---|
| Default | Yes | Yes | 7 variants | The only modeled state — footer is informational. |
| Link pressed | N/A | N/A | Not modeled | "GLoan/GCredit/GSave on Help Center" should be a Text Button / Link instance with its own pressed state. |
| Link disabled | N/A | N/A | Not modeled | Informational link — rarely disabled in practice. |
- Property names cleaned up. v2.0: Rebuilt on node
4227:11068in the 2026 Working File. The spaced, jargon-laden property names are gone — the schema is nowAlignment×LogoType×Label×Description, all PascalCase per §1. (C2 · Rename) C2 · Variant & Property Naming - Three partner axes collapsed into one enum. v2.0:
LogoType = Group | Single | Nonereplaces the separate per-partner axes, which is what drove most of the original cartesian blow-up. (C2 · Property) C2 · Variant & Property Naming -
hasDescriptionrenamed toDescription. v2.1: The property carries three values —Default,None,Link— so ahas*prefix was wrong on two counts: §2 reserves it for true/false booleans, andLinkdescribes a content type rather than presence. Now a plain enum. (C2 · Rename) C2 · Variant & Property Naming - Layer naming cleaned up. v2.1:
container→FooterContentand#text→Disclaimer, so the layer names say what they hold. (C1) C1 · Layer Structure & Naming - Raster partner logos accepted. v2.1: Closed by owner decision — the partner marks stay as supplied raster assets inside
Logos - Footerinstances. Partner branding arrives as fixed artwork the DS does not control and may not redraw, so vectorising would mean recreating third-party marks. The instancing is the part that matters: a logo change updates from one source rather than per variant. (C6) C6 · Asset & Icon Quality - Baked disclaimer copy accepted. v2.1: Closed by owner decision — the regulatory disclaimer stays as text in the component rather than becoming a slot. It is legal copy with fixed wording, so making it freely editable per instance would invite exactly the drift the fixed wording exists to prevent. (C1) C1 · Layer Structure & Naming
-
Alignmentretained as a property. v2.1: Closed by owner decision — alignment stays on the component rather than moving to the consumer. The original assessment argued it is a layout concern; in practice the two alignments pair with different logo and label arrangements, so treating it as a component property keeps those pairings authored rather than left to each screen. (C4) C4 · Native Mappability - Footer confirmed as a component. v2.1: Closed by owner decision — Footer stays a DS component rather than becoming a screen-level composition. The regulatory disclaimer and partner marks are fixed content that must appear identically wherever they appear, which is precisely what a component guarantees and a composition does not. (Family) C4 · Native Mappability
-
Labelvalues normalised. v2.2: TheNovalue is renamedFalse, soLabelnow readsTrue/Falseconsistently across all seven variants. It maps cleanly to a SwiftBoolor KotlinBoolean. The property keeps the bare nameLabelrather than taking ahasprefix — worth revisiting only if the family standardises on verb-prefixed booleans. (C2 · Rename) C2 · Variant & Property Naming - Variant heights rounded. v2.3: All seven variants now measure whole pixels — 150, 182, 120, 116, 95, 108 and 80 — replacing the unrounded auto-layout results. The last outlier,
Alignment=Left, LogoType=Single, Label=False, Description=Link, went 115.751 → 116. Every dimension maps cleanly to a native layout value. (C4) C4 · Native Mappability - Variant selection confirmed curated. v2.3: Closed by owner decision — the seven authored variants are the curated set, not a partial fill of a 36-cell matrix. Each corresponds to a screen that exists: left-aligned footers carry no label,
LogoType=NoneandDescription=Defaulteach serve a single context. Unauthored combinations are deliberately unsupported rather than pending, so a consumer finding no variant for a pairing has the answer. (C2) C2 · Variant & Property Naming
EBFooter(
alignment: .left,
logoType: .group,
showLabel: false,
description: .default
) | Role | Element | Token | Value |
|---|---|---|---|
| All variants | Surface | — | #FFFFFF |
| All variants | Disclaimer | — | #6780A9 |
| All variants | Disclaimer link | — | #005CE5 |
| All variants | Preamble | — | #6780A9 |
| All variants | Logos | — | Raster — no colour to bind |
EBFooter(
alignment: .center,
logoType: .group,
showLabel: true,
description: .none
) 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:header:1.0.0")
Import
import EastBlueDS import com.eastblue.ds.header.*
Alignment, LogoType, Label and Description are the set’s four variant properties; seven of the 36 combinations are built (v2.x: curated). Disclaimer and Preamble are text layers; the partner logos are raster image fills inside Logos - Footer Group instances.
| Figma Property | SwiftUI | Compose |
|---|---|---|
| Alignment — Left, Center | alignment: .left / .center | alignment = EBFooterAlignment.Left / Center |
| LogoType — None, Single, Group | logoType: .none / .single / .group | logoType = EBFooterLogoType.None / Single / Group |
| Label — True, False | showLabel: Bool | showLabel = true |
| Description — None, Default, Link | description: .none / .default / .link | description = EBFooterDescription.None / Default / Link |
| Disclaimer (text) | disclaimer: AttributedString | disclaimer = buildAnnotatedString { … } |
| Preamble (text) | preamble: String | preamble = "…" |
| Logos - Footer Group (nested instance, raster) | logos: [Image] | logos = listOf(painterResource(…)) |
EBFooter(
alignment: .left,
logoType: .group,
showLabel: false,
description: .default
) EBFooter(
alignment = EBFooterAlignment.Left,
logoType = EBFooterLogoType.Group,
showLabel = false,
description = EBFooterDescription.Default
) EBFooter(
alignment: .center,
logoType: .group,
showLabel: true,
description: .none
) EBFooter(
alignment = EBFooterAlignment.Center,
logoType = EBFooterLogoType.Group,
showLabel = true,
description = EBFooterDescription.None
) | Requirement | iOS | Android |
|---|---|---|
| Disclaimer readable | Plain static text; the link run is its own accessible element with the link trait. | ClickableText with the link annotation; the rest is static. |
| Logos labelled | .accessibilityLabel("GCash") etc. on each raster image, or hidden when purely decorative. | contentDescription per logo, or null when decorative. |
| Contrast | #6780A9 on white is 4.6:1 at 12 pt; the 10 pt preamble is decorative-weight. | Same values — the surface is fixed white. |
| Dynamic type | The disclaimer wraps; the footer grows in height. | Text in sp; the footer grows. |
Do
Use Left with a Default description for regulatory disclaimers under a form.
Don't
Don’t centre a three-line disclaimer — Center is for a logo row.
Do
Use Group when two brands share the screen; Single for one partner.
Don't
Don’t add a third logo — the group instance holds two.
Do
Use Description Link for the one help-centre pointer.
Don't
Don’t put two links in one footer.
| ID | Criterion | Status | Notes |
|---|---|---|---|
| C1 | Layer Structure & Naming | Ready | FooterContent › Disclaimer / Preamble / Logos - Footer Group — read on 4227:11075, 4227:11093, 4227:11085. |
| C2 | Variant & Property Naming | Ready | Alignment, LogoType, Label, Description — Title Case values; the set is curated to seven variants by decision. |
| C3 | Token Coverage | Ready | Disclaimer → Secondary/Bold/Caption, Preamble → Secondary/Bold/Small Caption; the disclaimer body and its link run carry variable bindings on every variant read. |
| C4 | Native Mappability | Ready | Three enums, one boolean, one attributed string — maps onto EBFooter. |
| C5 | Interaction State Coverage | Not Applicable | The link takes its states from the platform text link; nothing else is interactive. |
| C6 | Asset & Icon Quality | Needs Refinement | Partner logos are raster image fills (accepted v2.x) — they cannot recolour or scale; the docs draw measured placeholders. |
2 Alignment × 3 LogoType × 2 Label × 3 Description, curated to the seven layouts in use = 7 variants
| Alignment | LogoType | Label | Description | Node | Dimensions |
|---|---|---|---|---|---|
| Left | Group | False | Default | 4227:11075 | 360 × 150 |
| Left | Single | False | None | 4227:11069 | 360 × 182 |
| Left | Group | False | Link | 4227:11085 | 360 × 120 |
| Left | Single | False | Link | 4227:11089 | 360 × 116 |
| Center | Group | True | None | 4227:11093 | 360 × 95 |
| Center | None | False | Link | 4227:11079 | 360 × 108 |
| Center | Group | False | None | 4227:11082 | 360 × 80 |
Alignment — Left, Center — with LogoType, Label and Description as panel controls that snap to a built variant; offsets re-verified and the disclaimer now renders its #005CE5 link run. Padding, gap, alignment and colour tokens are not readable with the plugin and stay —.#6780A9 with a #005CE5 link run (fills read per segment on 4227:11087, 4227:11081, 4227:11074).hasDescription renamed to Description; Layer naming cleaned up; Raster partner logos accepted; Baked disclaimer copy accepted; Alignment retained as a property; Footer confirmed as a component; Label values normalised; Variant heights rounded; Variant selection confirmed curated.partnerLogos enum, expose partner-logo Slot, remove alignment axis (consumer owns layout). Opendisclaimer: String (or Inline Text instance). Help link becomes a Text Button instance with its own state coverage. Open