LogoRow
A row of circular brand logos in three sizes, plain or on glass tiles, with an optional “+N” overflow circle.
logo-rowOpen in Figma ↗A horizontal row of partner or app brand logos with an overflow counter, used to show which services are included in a deal or offer.
Use for: Inside deal cards, offer cards, or any component that needs to communicate which apps or services are bundled.
Not for: Navigation or decorative brand display unrelated to an offer or bundled service.
Choosing: Match size to the card it sits in — sm (24px) for compact cards, md (32px) for standard cards, lg (40px) for prominent or featured cards. Use style=glass over imagery or glass surfaces; use style=default on flat surfaces. Set direction=rtl for Arabic. Toggle individual logo slots (logo1–logo5) to match the number of actual partner logos. Enable xMore only when there are more logos than the visible slots can show.
Rules: Do not use xMore when all logos are visible. Do not mix logo slot sizes — all logos in a row share the same size value. The overflow pill count must reflect the actual number of hidden logos.
import SwiftUI import EandTokens // logo-row: circle-clipped logos sm 24 / md 32 / lg 40 with gaps 4 / 4 / 8, no wrap, and // an optional +N MoreItems at the logo size. glass sets each logo in a 40 / 48 / 56 tile // (padding 8) on white 20% + blur, with a 0.5pt ring on the logo. struct LogoRow: View { let logos: [Image] var size: CGFloat = EandIcon.icon2xl // md var more: Int? = nil var body: some View { HStack(spacing: EandSpacing.xs) { ForEach(Array(logos.enumerated()), id: \.offset) { _, logo in logo.resizable().scaledToFill() .frame(width: size, height: size) .clipShape(Circle()) } if let more { MoreItems(count: more, size: size, inverse: true) } } } }
When to use
- Use to show the partner brands or benefits that come with a plan, card or highlight:
up to five logos, then
morefor the rest. - Use
glasswhen the row sits on imagery or on a brand-red or midnight surface. - Don't use for the etisalat brand mark — that is Logo. Not for avatars, and not for a set of tappable services (use QuickAction or ServiceCard).
Choosing a size
size | Logo | Gap | Glass tile | Glass gap |
|---|---|---|---|---|
sm | 24 (icon/xl) | 4 | 40 | 4 |
md | 32 (icon/2xl) | 4 | 48 | 8 |
lg | 40 (icon/3xl) | 8 | 56 | 8 |
md is the default because it is the size the row rendered before V1.2; Figma's default is
sm. Pass logos as elements sized to fill their circle, or as image URLs. The brand artwork
is not part of the package.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
glass? | boolean | false | Figma style=glass: each logo sits on a glass tile. |
logos? | ReactNode[] | [] | Logo artwork: elements sized to fill their circle, or image URLs. |
more? | string | number | — | Figma +x-more: append a "+N" more-items circle. |
moreSurface? | 'default' | 'inverse' | inverse | The more-items surface; every Figma logo-row uses inverse. |
size? | 'lg' | 'md' | 'sm' | md | Figma size. Defaults to md (32px), the size this component rendered before V1.2. |
The “+N” circle at the end of the row is MoreItems; LogoRow sizes it to
match the logos. Every published logo row uses the inverse counter (white glass), which is
built for dark surfaces; moreSurface switches it.
Design
Figma source: logo-row — etisalat Consumer App DSL V1.2
- Logos are clipped to circles (
border-radius/9). The row never wraps. - Glass tiles:
surface/glass/white/lgwith a backdrop blur fromeffects/glass/md/frost(20px) andspacing/smpadding. Each logo carries a 0.5px (border/xs) inside ring inborder/surface-based/glass/default/sm. - In RTL the row mirrors and the counter reads “4+”, as
more-items-rtldoes.