Component Contract

Progress

Visual task and process completion indicators for the CAAT Pension Plan member experience. Used to communicate step-by-step progress and percentage-based completion states.

Live Demo

Basic Progress Bar

Rendered

With Label

Rendered

Profile completion — 65%
65%
Documents uploaded — 40%
40%

Sizes

Rendered

Small
Default
Large
50%

Colour Variants

Rendered

Default (blue-900)
Success (green)
Warning (amber)
Danger (red)
Striped & animated

Stepped Progress

Rendered

  1. Personal Info
  2. Plan Details
  3. Confirmation

Code sample

HTML

<!-- Basic progress -->
<div class="caat-progress" role="progressbar"
     aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"
     aria-label="50% complete">
  <div class="caat-progress__bar" style="width:50%"></div>
</div>

<!-- With label -->
<span class="caat-progress__label">Profile — 65%</span>
<div class="caat-progress caat-progress--lg" role="progressbar"
     aria-valuenow="65" aria-valuemin="0" aria-valuemax="100">
  <div class="caat-progress__bar" style="width:65%">65%</div>
</div>

<!-- Stepped progress -->
<ol class="caat-progress-stepped" aria-label="Application progress">
  <li class="caat-progress-stepped__step caat-progress-stepped__step--completed">
    <span class="caat-progress-stepped__indicator"><i class="bi bi-check"></i></span>
    <span class="caat-progress-stepped__label">Personal Info</span>
  </li>
  <li class="caat-progress-stepped__step caat-progress-stepped__step--active" aria-current="step">
    <span class="caat-progress-stepped__indicator">2</span>
    <span class="caat-progress-stepped__label">Plan Details</span>
  </li>
  <li class="caat-progress-stepped__step">
    <span class="caat-progress-stepped__indicator">3</span>
    <span class="caat-progress-stepped__label">Confirmation</span>
  </li>
</ol>

1. Summary

ComponentProgress
AEM Resource Typecaat/components/progress
PurposeDisplays visual completion status for tasks, multi-step processes, and file uploads in the CAAT member portal.
VariantsBasic bar · Labelled bar · Colour variants (success, warning, danger) · Stepped progress · Striped / animated
SizesSmall (0.5 rem) · Default (0.75 rem) · Large (1 rem)
ContainsTrack, fill bar, optional label, optional step indicators
Used inMember onboarding, document upload, pension calculator, application forms
FigmaCAAT DS / Components / Progress
Status Rebuild

2. Design Tokens

TokenRoleValue (light)
--caat-blue-900Default bar fill#003750
--caat-blue-700Hover / focus accent#0b5a80
--caat-blue-100Light background tint#e7f4fb
--caat-greenSuccess bar#55a546
--caat-green-700Success bar (dark)#367f32
--caat-grey-200Track background#dfe6ef
--caat-focusFocus ring on stepped indicator#4D90FE
--caat-inkLabel text colour#102637
--caat-radiusBorder-radius for track and bar.75rem
--caat-font-primaryFont familyLibre Franklin

3. Authoring Fields

FieldTypeRequiredNotes
VariantSelectYesbar | stepped
Value (%)NumberYes (bar)0 – 100. Drives width and aria-valuenow.
Accessible labelTextYesPopulates aria-label, e.g. "Profile completion 65%".
Show percentage labelToggleNoRenders visible percentage text inside or above the bar.
Label textTextNoDescriptive label rendered above the bar.
ColourSelectNodefault | success | warning | danger
SizeSelectNosm | default | lg
StripedToggleNoAdds striped background pattern.
AnimatedToggleNoAdds animation to striped bar.
Steps (stepped)MultifieldYes (stepped)Each step: label (text), status (completed | active | upcoming).

4. Validation

No author-managed content beyond an accessible label, so there are no authoring validation rules. Accessibility requirements are covered in Section 8 (Accessibility).

5. Content Guidance

  • Use concise, descriptive labels: "Profile completion — 65%" rather than "65%" alone.
  • For stepped progress, limit steps to 3 – 5 to avoid visual clutter on mobile.
  • Step labels should be short (1 – 3 words): "Personal Info", "Plan Details", "Confirmation".
  • Always provide an accessible label that makes sense without visual context.
  • Use colour variants semantically: green for success/complete, amber for in-progress warnings, red for errors.
  • Striped/animated bars are best for indeterminate or in-progress states — avoid on static values.

6. Semantic HTML

Bar variant

<!-- Optional visible label -->
<span class="caat-progress__label" id="prog-label-1">Profile — 65%</span>

<div class="caat-progress caat-progress--lg"
     role="progressbar"
     aria-valuenow="65"
     aria-valuemin="0"
     aria-valuemax="100"
     aria-labelledby="prog-label-1">
  <div class="caat-progress__bar" style="width:65%">65%</div>
</div>

Stepped variant

<ol class="caat-progress-stepped" aria-label="Application progress">
  <li class="caat-progress-stepped__step caat-progress-stepped__step--completed">
    <span class="caat-progress-stepped__indicator" aria-hidden="true">
      <i class="bi bi-check"></i>
    </span>
    <span class="caat-progress-stepped__label">Personal Info</span>
  </li>
  <li class="caat-progress-stepped__step caat-progress-stepped__step--active"
      aria-current="step">
    <span class="caat-progress-stepped__indicator" aria-hidden="true">2</span>
    <span class="caat-progress-stepped__label">Plan Details</span>
  </li>
  <li class="caat-progress-stepped__step">
    <span class="caat-progress-stepped__indicator" aria-hidden="true">3</span>
    <span class="caat-progress-stepped__label">Confirmation</span>
  </li>
</ol>

7. CSS Contract

SelectorPurpose
.caat-progressTrack container. Sets height, background, border-radius.
.caat-progress--smSmall height (0.5 rem).
.caat-progress--lgLarge height (1 rem).
.caat-progress__barFill bar. Width set via inline style. Smooth transition.
.caat-progress__bar--successGreen fill.
.caat-progress__bar--warningAmber fill.
.caat-progress__bar--dangerRed fill.
.caat-progress__bar--stripedDiagonal stripe background-image.
.caat-progress__bar--animatedInfinite stripe animation.
.caat-progress__labelVisible label above or beside the bar.
.caat-progress-steppedStepped container (ordered list). Flexbox with connector line.
.caat-progress-stepped__stepIndividual step item.
.caat-progress-stepped__step--completedCompleted step (blue-900 circle, check icon).
.caat-progress-stepped__step--activeCurrent step (outlined circle, focus ring).
.caat-progress-stepped__indicatorCircle with step number or check icon.
.caat-progress-stepped__labelStep label text below the circle.

8. Accessibility

RequirementImplementation
Rolerole="progressbar" on .caat-progress.
Valuearia-valuenow, aria-valuemin="0", aria-valuemax="100".
Labelaria-label or aria-labelledby describing the purpose and current value.
Stepped — currentaria-current="step" on the active step <li>.
Stepped — listUse <ol> so screen readers announce step count and position.
Colour contrastBar fills meet 3:1 against track background per WCAG 1.4.11 (non-text contrast).
MotionStriped animation respects prefers-reduced-motion: reduce (pause animation).
FocusStepped indicators receive visible :focus-visible ring when interactive.

9. SEO

Transient / structural UI with no indexable content of its own — no SEO markup required. Ensure any content this component wraps or reveals stays server-rendered and crawlable.

10. Analytics

Analytics are captured through the shared data-analytics-component attribute on the component root (emitted automatically) and reported to the central data layer. Event names and payloads follow the organisation's standard analytics schema — defined centrally with the analytics team, not invented per component — so no bespoke tracking is specified here.

11. AEM Notes

  • Resource type: caat/components/progress
  • Sling Model: ProgressModel — exposes value, label, colour, size, variant, steps[].
  • HTL template: progress.html — uses data-sly-test to switch between bar and stepped variants.
  • Client library: caat.components.progress — CSS only; no JS required for bar variant. Stepped variant JS optional for dynamic step advancement.
  • Policy: Authors can restrict available colour variants and size options per template policy.
  • Allowed parents: Layout Container, Form Container, Card Body.

12. Dialog Model

Not authored directly. The progress is a sub-element emitted and configured by its host component (or generated from page structure), so it has no standalone cq:dialog — any options are exposed through the host component's dialog.

13. QA Acceptance Checklist

  • Bar renders at 0%, 25%, 50%, 75%, and 100% with correct width.
  • All three sizes (sm, default, lg) render at correct heights.
  • Colour variants (default, success, warning, danger) display correct fill colours.
  • Striped bar shows diagonal pattern; animated stripe moves continuously.
  • Animation pauses when prefers-reduced-motion: reduce is active.
  • role="progressbar" and aria-valuenow are announced correctly by NVDA and VoiceOver.
  • Stepped variant renders completed, active, and upcoming states correctly.
  • aria-current="step" is present on the active step.
  • Connector line between steps is visually continuous and sits behind indicators.
  • Stepped indicator focus ring is visible on keyboard navigation.
  • Bar does not render if value is missing (validation enforced in dialog).
  • Analytics events (progress-viewed, progress-complete, progress-step-change) fire correctly.
  • Cross-browser tested: Chrome, Firefox, Safari, Edge.

14. Definition of Done

AreaDone means
Design Figma component matches this contract. Bar and stepped variants documented with all size and colour options. Striped/animated patterns included.
Development AEM proxy component created. HTL template emits semantic HTML per Section 6. CSS uses design tokens exclusively. role="progressbar" and ARIA attributes wired. Unit tests pass.
QA All items in the QA Acceptance Checklist (Section 13) pass. Manual accessibility audit completed. Cross-browser tested (Chrome, Firefox, Safari, Edge).
Launch Component deployed to AEM production. Content authors trained on variant selection and accessible label requirements. Documentation published. Analytics dashboards confirmed receiving events.