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
Sizes
Rendered
Colour Variants
Rendered
Stepped Progress
Rendered
- Personal Info
- Plan Details
- 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
| Component | Progress |
| AEM Resource Type | caat/components/progress |
| Purpose | Displays visual completion status for tasks, multi-step processes, and file uploads in the CAAT member portal. |
| Variants | Basic bar · Labelled bar · Colour variants (success, warning, danger) · Stepped progress · Striped / animated |
| Sizes | Small (0.5 rem) · Default (0.75 rem) · Large (1 rem) |
| Contains | Track, fill bar, optional label, optional step indicators |
| Used in | Member onboarding, document upload, pension calculator, application forms |
| Figma | CAAT DS / Components / Progress |
| Status | Rebuild |
2. Design Tokens
| Token | Role | Value (light) |
|---|---|---|
--caat-blue-900 | Default bar fill | #003750 |
--caat-blue-700 | Hover / focus accent | #0b5a80 |
--caat-blue-100 | Light background tint | #e7f4fb |
--caat-green | Success bar | #55a546 |
--caat-green-700 | Success bar (dark) | #367f32 |
--caat-grey-200 | Track background | #dfe6ef |
--caat-focus | Focus ring on stepped indicator | #4D90FE |
--caat-ink | Label text colour | #102637 |
--caat-radius | Border-radius for track and bar | .75rem |
--caat-font-primary | Font family | Libre Franklin |
3. Authoring Fields
| Field | Type | Required | Notes |
|---|---|---|---|
| Variant | Select | Yes | bar | stepped |
| Value (%) | Number | Yes (bar) | 0 – 100. Drives width and aria-valuenow. |
| Accessible label | Text | Yes | Populates aria-label, e.g. "Profile completion 65%". |
| Show percentage label | Toggle | No | Renders visible percentage text inside or above the bar. |
| Label text | Text | No | Descriptive label rendered above the bar. |
| Colour | Select | No | default | success | warning | danger |
| Size | Select | No | sm | default | lg |
| Striped | Toggle | No | Adds striped background pattern. |
| Animated | Toggle | No | Adds animation to striped bar. |
| Steps (stepped) | Multifield | Yes (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
| Selector | Purpose |
|---|---|
.caat-progress | Track container. Sets height, background, border-radius. |
.caat-progress--sm | Small height (0.5 rem). |
.caat-progress--lg | Large height (1 rem). |
.caat-progress__bar | Fill bar. Width set via inline style. Smooth transition. |
.caat-progress__bar--success | Green fill. |
.caat-progress__bar--warning | Amber fill. |
.caat-progress__bar--danger | Red fill. |
.caat-progress__bar--striped | Diagonal stripe background-image. |
.caat-progress__bar--animated | Infinite stripe animation. |
.caat-progress__label | Visible label above or beside the bar. |
.caat-progress-stepped | Stepped container (ordered list). Flexbox with connector line. |
.caat-progress-stepped__step | Individual step item. |
.caat-progress-stepped__step--completed | Completed step (blue-900 circle, check icon). |
.caat-progress-stepped__step--active | Current step (outlined circle, focus ring). |
.caat-progress-stepped__indicator | Circle with step number or check icon. |
.caat-progress-stepped__label | Step label text below the circle. |
8. Accessibility
| Requirement | Implementation |
|---|---|
| Role | role="progressbar" on .caat-progress. |
| Value | aria-valuenow, aria-valuemin="0", aria-valuemax="100". |
| Label | aria-label or aria-labelledby describing the purpose and current value. |
| Stepped — current | aria-current="step" on the active step <li>. |
| Stepped — list | Use <ol> so screen readers announce step count and position. |
| Colour contrast | Bar fills meet 3:1 against track background per WCAG 1.4.11 (non-text contrast). |
| Motion | Striped animation respects prefers-reduced-motion: reduce (pause animation). |
| Focus | Stepped 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— exposesvalue,label,colour,size,variant,steps[]. - HTL template:
progress.html— usesdata-sly-testto 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: reduceis active. -
role="progressbar"andaria-valuenoware 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
| Area | Done 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. |