Component Contract
Rich text and heading components with style options for the CAAT Pension Plan member experience.
Font: Libre Franklin · Sizes in px (font-size / line-height · weight)
Building retirement security
Clear, plain-language content that supports confidence. Body copy uses normal letter spacing and generous line height.
Lead text introduces pages and sections with a concise summary.
Metadata, helper text, legal references, and image captions.
Rendered
Rendered
Everything you need to know about your defined benefit pension and how it supports your retirement goals.
Interactive tools to help you estimate your pension income and plan for the future.
Rendered
CAAT provides one of Canada's most secure defined benefit pension plans, giving members peace of mind for retirement.
Your DBplus pension grows with every contribution you and your employer make. Benefits are based on your total contributions and guaranteed interest credits.
Contribution rates are subject to change based on plan valuations conducted every three years.
Last updated: January 2026. Refer to the plan text for official terms and conditions.
Rendered
Your CAAT pension is a lifetime benefit that provides predictable income in retirement. Unlike savings-based plans, your DBplus pension is not affected by market volatility.
Here are some key steps to consider as you approach retirement:
For more information, visit the Member Resource Centre or speak with a CAAT representative.
HTML
<!-- Heading hierarchy -->
<h1 class="caat-title">Your Pension, Your Future</h1>
<h2 class="caat-title">Understanding DBplus</h2>
<!-- Display heading -->
<h1 class="caat-title caat-title--display">Hero Headline</h1>
<!-- Eyebrow + title + subtitle -->
<span class="caat-eyebrow">DBplus Plan</span>
<h2 class="caat-title">Understanding Your Benefits</h2>
<p class="caat-title__subtitle">Supporting description text.</p>
<!-- Text variants -->
<p class="caat-text caat-text--lead">Lead paragraph.</p>
<p class="caat-text">Body text.</p>
<p class="caat-text caat-text--small">Small text.</p>
<p class="caat-text caat-text--muted">Muted text.</p>
<!-- Rich text block -->
<div class="caat-rich-text">
<h2>Section Heading</h2>
<p>Paragraph with <strong>bold</strong> and <em>italic</em>.</p>
<ul>
<li>List item</li>
</ul>
<p><a href="#">Link text</a></p>
</div>
| Component | Text / Title |
| AEM Resource Type | caat/components/text-title |
| Purpose | Provides styled headings (h1–h6), display titles, eyebrow/subtitle patterns, body text variants, and rich text blocks for CAAT content pages. |
| Variants | Heading hierarchy · Display heading · Eyebrow + Subtitle · Text (lead, small, muted) · Rich text block |
| Contains | Heading element, optional eyebrow, optional subtitle, paragraph text, rich text (headings, paragraphs, lists, links, bold/italic) |
| Used in | All content pages, hero sections, article layouts, landing pages, form intros |
| Figma | CAAT DS / Components / Text-Title |
| Status | Enhance |
| Token | Role | Value (light) |
|---|---|---|
--caat-blue-900 | Heading colour | #003750 |
--caat-color-eyebrow → --caat-blue-700 | Eyebrow colour (canonical token) | #0b5a80 |
--caat-blue-100 | Section border accent | #e7f4fb |
--caat-color-eyebrow-on-dark → --caat-blue-300 | Eyebrow colour on dark / imagery | #9dd2ed |
--caat-grey-200 | Divider / subtle backgrounds | #dfe6ef |
--caat-focus | Focus ring on links | #4D90FE |
--caat-ink | Body text colour | #102637 |
--caat-radius | Border-radius for focus outlines | .75rem |
--caat-font-primary | Font family | Libre Franklin |
| Field | Type | Required | Notes |
|---|---|---|---|
| Variant | Select | Yes | title | text | rich-text |
| Heading level | Select | Yes (title) | h1 – h6. Drives semantic element. |
| Heading style | Select | No | default | display | section |
| Eyebrow text | Text | No | Small uppercase label above heading. Max 40 chars. |
| Title text | Text | Yes (title) | The heading content. |
| Subtitle text | Textarea | No | Supporting description below the heading. |
| Text style | Select | No (text) | body | lead | small | muted |
| Body text | Textarea | Yes (text) | Plain text paragraph. |
| Rich text content | RTE | Yes (rich-text) | Full AEM Rich Text Editor with headings, lists, links, bold/italic. |
| Rule | Error message |
|---|---|
| Title text is required for title variant. | "Enter a heading text." |
| Heading level is required for title variant. | "Select a heading level (h1–h6)." |
| Body text is required for text variant. | "Enter body text content." |
| Rich text content is required for rich-text variant. | "Add content in the rich text editor." |
| Eyebrow text max 40 characters. | "Eyebrow text must be 40 characters or fewer." |
| Only one h1 per page (advisory). | "This page already contains an h1. Consider using h2 or lower." |
<!-- Basic title -->
<h2 class="caat-title">Understanding DBplus</h2>
<!-- Display title -->
<h1 class="caat-title caat-title--display">Your Pension, Your Future</h1>
<!-- With eyebrow and subtitle -->
<div class="caat-title-block">
<span class="caat-eyebrow">DBplus Plan</span>
<h2 class="caat-title">Understanding Your Benefits</h2>
<p class="caat-title__subtitle">Everything you need to know about your pension.</p>
</div>
<p class="caat-text caat-text--lead">Lead paragraph text.</p>
<p class="caat-text">Standard body text.</p>
<p class="caat-text caat-text--small">Small supporting text.</p>
<p class="caat-text caat-text--muted">Muted disclaimer text.</p>
<div class="caat-rich-text">
<h2>Section Heading</h2>
<p>Paragraph with <strong>bold</strong> and <em>italic</em> text.</p>
<ul>
<li>List item one</li>
<li>List item two</li>
</ul>
<p><a href="/resources">Member Resource Centre</a></p>
</div>
| Selector | Purpose |
|---|---|
.caat-title | Base heading. Blue-900, weight 800, tight letter-spacing. |
.caat-title--display | Extra-large display heading. 3.5 rem, weight 900, tighter spacing. |
.caat-title--section | Section heading with bottom border accent. |
.caat-eyebrow | Small uppercase label above the heading (.75rem / 700 / .08em). Canonical class (caat-base.css), driven by the --caat-text-eyebrow-* tokens. Use .caat-eyebrow--on-dark over dark backgrounds. |
.caat-title__subtitle | Supporting text below heading. Larger size, muted opacity. |
.caat-text | Base body text. Ink colour, line-height 1.6. |
.caat-text--lead | Lead paragraph. 1.25 rem font-size. |
.caat-text--small | Small text. 0.875 rem font-size. |
.caat-text--muted | Muted text. Reduced opacity. |
.caat-rich-text | Rich text container. Styles nested h2–h4, p, ul/ol, a, strong, em. |
| Requirement | Implementation |
|---|---|
| Heading hierarchy | Authors must select the correct semantic heading level (h1–h6) regardless of visual size. |
| Colour contrast | All text meets WCAG 2.1 AA minimum contrast (4.5:1 for body, 3:1 for large text). |
| Link purpose | Links in rich text must have descriptive text. Avoid generic "click here". |
| Focus indicators | Links show visible :focus-visible ring using --caat-focus token. |
| Eyebrow semantics | Eyebrow is a <span> (not a heading) — decorative label only. |
| Rich text structure | Lists use proper <ul>/<ol>. Bold uses <strong>, italic uses <em>. |
| Zoom | All text reflows correctly at 200% zoom and respects user font-size preferences. |
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.
caat/components/text-titleTextTitleModel — exposes variant, headingLevel, headingStyle, eyebrow, title, subtitle, textStyle, bodyText, richText.text-title.html — uses data-sly-test to switch between title, text, and rich-text variants. Heading level rendered dynamically via data-sly-element.caat.components.text-title — CSS only; no JS required.Simplified model — shows field intent and Granite UI resource types, not the literal cq:dialog node tree (e.g. select options are authored as child items nodes).
{
"jcr:primaryType": "nt:unstructured",
"sling:resourceType": "cq/gui/components/authoring/dialog",
"tabs": {
"properties": {
"variant": {
"sling:resourceType": "granite/ui/components/coral/foundation/form/select",
"label": "Variant",
"name": "./variant",
"required": true,
"options": ["title", "text", "rich-text"]
},
"headingLevel": {
"sling:resourceType": "granite/ui/components/coral/foundation/form/select",
"label": "Heading level",
"name": "./headingLevel",
"required": true,
"options": ["h1", "h2", "h3", "h4", "h5", "h6"]
},
"headingStyle": {
"sling:resourceType": "granite/ui/components/coral/foundation/form/select",
"label": "Heading style",
"name": "./headingStyle",
"options": ["default", "display", "section"]
},
"eyebrow": {
"sling:resourceType": "granite/ui/components/coral/foundation/form/textfield",
"label": "Eyebrow text",
"name": "./eyebrow",
"maxlength": 40
},
"title": {
"sling:resourceType": "granite/ui/components/coral/foundation/form/textfield",
"label": "Title text",
"name": "./title",
"required": true
},
"subtitle": {
"sling:resourceType": "granite/ui/components/coral/foundation/form/textarea",
"label": "Subtitle text",
"name": "./subtitle"
},
"textStyle": {
"sling:resourceType": "granite/ui/components/coral/foundation/form/select",
"label": "Text style",
"name": "./textStyle",
"options": ["body", "lead", "small", "muted"]
},
"bodyText": {
"sling:resourceType": "granite/ui/components/coral/foundation/form/textarea",
"label": "Body text",
"name": "./bodyText"
},
"richText": {
"sling:resourceType": "granite/ui/components/coral/foundation/form/rte",
"label": "Rich text content",
"name": "./richText",
"useFixedInlineToolbar": true
}
}
}
}
text-viewed, link-click) fire correctly.| Area | Done means |
|---|---|
| Design | Figma component matches this contract. All heading levels, display variant, eyebrow/subtitle pattern, text styles, and rich text block documented with token usage. |
| Development | AEM proxy component created. HTL template emits semantic HTML per Section 6. CSS uses design tokens exclusively. Dynamic heading level via data-sly-element. Rich text editor configured. 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 heading level selection, variant usage, and rich text best practices. Documentation published. |