Design System
Components

LogoRow

A row of circular brand logos in three sizes, plain or on glass tiles, with an optional “+N” overflow circle.

Figma description · 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.

+4
Props
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 more for the rest.
  • Use glass when 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

sizeLogoGapGlass tileGlass gap
sm24 (icon/xl)4404
md32 (icon/2xl)4488
lg40 (icon/3xl)8568

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

PropTypeDefaultDescription
glass?booleanfalseFigma 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'inverseThe more-items surface; every Figma logo-row uses inverse.
size?'lg' | 'md' | 'sm'mdFigma 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/lg with a backdrop blur from effects/glass/md/frost (20px) and spacing/sm padding. Each logo carries a 0.5px (border/xs) inside ring in border/surface-based/glass/default/sm.
  • In RTL the row mirrors and the counter reads “4+”, as more-items-rtl does.

On this page