Count Indicator
A count indicator shows the user’s current position within a sequence as plain text — “1 of 6” — paired with previous and next icon buttons.
Ready to use
The Count Indicator (also known as pagination read-out) shows the user’s current position within a sequence as plain text — “1 of 6” — paired with prev/next icon buttons. It’s commonly used in image carousels, galleries, step-by-step flows, or small collections where space is limited and full pagination controls are unnecessary.
Anatomy
Section titled “Anatomy”- Previous icon button
- Label
- Next icon button
When to use it
Section titled “When to use it”Use the Count Indicator when:
- Navigation is simple and sequential — image sliders, onboarding screens, galleries.
- The current position needs to be clear and the boundaries communicated by disabled icon buttons.
Avoid the Count Indicator when:
- The collection is large or complex and needs full pagination.
- Subtle colour shifts are the only cue at the boundaries — disable the prev/next buttons so the chevron shape carries the signal.
Properties
Section titled “Properties”Variant
Two variants tuned to the surface beneath: On Solid for default page surfaces (bare text label, no backdrop) and On Image for overlays (label picks up a backdrop and border so the text stays legible against busy backgrounds). Both share the same height and inline padding; only fill and border change.
Scheme
Neutral or Contrast. The foreground tokens flip via the CDS scheme — on a light surface (default), the label uses the neutral foreground; on a dark surface (.is-contrast on the wrapper), it flips to contrast — and the icon buttons follow via the same cascade.
Icon buttons
Prev and next are standard medium Icon Buttons. Their height feeds into the label height so the three pieces align. At the start and end of the sequence, the relevant button is disabled to communicate the boundary.
Platform considerations
Section titled “Platform considerations”Desktop
The wrapper sits inline at its natural width. Use the On Image variant only when the indicator overlays imagery; on plain surfaces the bare label reads more cleanly.
Tablet
Same layout as desktop. Keep the icon button size consistent with surrounding controls so the indicator doesn’t feel out of place.
Mobile
Stack the indicator with its content above or below imagery. The medium icon button stays well above the 44 px touch minimum at this size.
Best practices
Section titled “Best practices”Make sure both the count and the disabled state of the chevrons carry meaning.
Do
Pair the indicator with simple, sequential content, disable the prev/next icon buttons at the ends so the chevron shape carries the boundary cue, and reach for the Contrast scheme when the wrapper sits on dark imagery so foreground colours flip cleanly.
Don't
Don’t use the Count Indicator for large or complex collections (full pagination or a different pattern fits better), and don’t rely on colour change alone to signal the boundary — disable the buttons so the cue is unmistakable.
Content guidelines
Section titled “Content guidelines”The label is a position read-out, not a sentence — keep it to the bare “current of total” format (“1 of 6”). Localise the connecting word (“of” / ”/” / “sur”) through the same string used elsewhere in the product so the announcement stays consistent for screen-reader users.
Styles
Section titled “Styles”<div class="tng-count-indicator"> <span class="tng-count-indicator-label">1 of 6</span> <button class="tng-icon-button is-md" aria-label="Previous"> <i class="tng-icon icon-chevron-left" aria-hidden="true"></i> </button> <button class="tng-icon-button is-md" aria-label="Next"> <i class="tng-icon icon-chevron-right" aria-hidden="true"></i> </button></div>The wrapper holds a label pill (.tng-count-indicator-label) and any combination of .tng-icon-button siblings. The label may sit at the start, in the middle, or at the end of the run; the wrapper applies the right inter-element spacing based on position. The label height matches the icon-button size that’s beside it.
Variants
Section titled “Variants”On Image
Section titled “On Image”Add .on-image to the wrapper so the label picks up a backdrop and border. Pair with .is-contrast on dark imagery so the foreground (and icon buttons) flip to contrast tokens.
<div class="tng-count-indicator on-image on-contrast"> <span class="tng-count-indicator-label">1 of 6</span> <button class="tng-icon-button is-md" aria-label="Previous"> <i class="tng-icon icon-chevron-left" aria-hidden="true"></i> </button> <button class="tng-icon-button is-md" aria-label="Next"> <i class="tng-icon icon-chevron-right" aria-hidden="true"></i> </button></div>The label height tracks the sibling icon-button size — drop .is-md, .is-sm, or .is-xs on the buttons and the label follows. Default is .is-sm (32px) when the icon-button class carries no size modifier.
<div class="tng-count-indicator"> <span class="tng-count-indicator-label">1 of 6</span> <button class="tng-icon-button is-sm" aria-label="Previous"> <i class="tng-icon icon-chevron-left" aria-hidden="true"></i> </button> <button class="tng-icon-button is-sm" aria-label="Next"> <i class="tng-icon icon-chevron-right" aria-hidden="true"></i> </button></div>Arrangements
Section titled “Arrangements”The label is optional, and may sit at the start, in the middle, or at the end of the wrapper. Spacing adapts to the position automatically.
<div class="tng-count-indicator"> <button class="tng-icon-button is-md" aria-label="Previous"> <i class="tng-icon icon-chevron-left" aria-hidden="true"></i> </button> <button class="tng-icon-button is-md" aria-label="Next"> <i class="tng-icon icon-chevron-right" aria-hidden="true"></i> </button></div><div class="tng-count-indicator"> <button class="tng-icon-button is-md" aria-label="Previous"> <i class="tng-icon icon-chevron-left" aria-hidden="true"></i> </button> <span class="tng-count-indicator-label">1 of 6</span> <button class="tng-icon-button is-md" aria-label="Next"> <i class="tng-icon icon-chevron-right" aria-hidden="true"></i> </button></div><div class="tng-count-indicator"> <button class="tng-icon-button is-md" aria-label="Previous"> <i class="tng-icon icon-chevron-left" aria-hidden="true"></i> </button> <button class="tng-icon-button is-md" aria-label="Next"> <i class="tng-icon icon-chevron-right" aria-hidden="true"></i> </button> <span class="tng-count-indicator-label">1 of 6</span></div>For designers
Section titled “For designers”The label and any disabled / hover / focus states on the icon buttons must maintain accessible contrast on both light and dark surfaces. Focus styles must meet WCAG AA across the on-image and on-solid variants. Disabled buttons must use more than colour alone to convey state — the chevron icon already provides shape; pair with helper text where ambiguity remains. Colour tokens within the component should be semantic so the component adapts correctly to brand modes and surfaces.
For developers
Section titled “For developers”The following are general recommendations; the exact approach depends on the use-case.
Wrapper
Section titled “Wrapper”.tng-count-indicator is a presentational wrapper — it’s not itself a landmark. The landmark belongs on the surrounding region (carousel, gallery, paginated list) that the wrapper sits inside. When the surrounding context isn’t already labelled, you can promote the wrapper to a landmark in two ways:
<nav class="tng-count-indicator" aria-label="Search results pages">…</nav><div class="tng-count-indicator" role="group" aria-label="Gallery navigation"> …</div>Add aria-live="polite" to the label so screen readers announce changes as the user navigates.
<span class="tng-count-indicator-label" aria-live="polite">1 of 42</span>Navigation buttons
Section titled “Navigation buttons”Use aria-label on the buttons themselves (e.g. "Previous item", "Next item"). At the ends of the sequence, disable the corresponding button (disabled attribute) rather than hiding it — screen reader users discover the boundary that way, and the focus order stays stable.
<button class="tng-icon-button is-md" aria-label="Previous item" disabled> <i class="tng-icon icon-chevron-left" aria-hidden="true"></i></button><button class="tng-icon-button is-md" aria-label="Next item"> <i class="tng-icon icon-chevron-right" aria-hidden="true"></i></button>