Component Contract

Rich text and heading components with style options for the CAAT Pension Plan member experience.

Live Demo

Heading Hierarchy & Type Scale

Font: Libre Franklin · Sizes in px (font-size / line-height · weight)

Display

Building retirement security

48/56 · 900
H1

Your Pension, Your Future

40/48 · 800
H2

Understanding DBplus

32/40 · 800
H3

Retirement Planning

28/36 · 700
H4

Contribution Details

24/32 · 700
H5
Contact Your Employer
20/28 · 700
H6
Important Dates
16/24 · 700
Body

Clear, plain-language content that supports confidence. Body copy uses normal letter spacing and generous line height.

16/26 · 400
Lead

Lead text introduces pages and sections with a concise summary.

20/32 · 400
Small

Metadata, helper text, legal references, and image captions.

14/21 · 400

Display Headings

Rendered

Your Pension, Your Future

Plan for the Retirement You Deserve

Title with Eyebrow & Subtitle

Rendered

DBplus Plan

Understanding Your Benefits

Everything you need to know about your defined benefit pension and how it supports your retirement goals.

Member Resources

Tools & Calculators

Interactive tools to help you estimate your pension income and plan for the future.

Text Styles

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.

Rich Text Block

Rendered

Planning for Your Retirement

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:

  • Review your Annual Pension Statement for the most up-to-date estimate
  • Use the online Pension Estimator to model different retirement dates
  • Consider how your pension integrates with CPP and OAS benefits
  • Contact CAAT if you have questions about survivor or bridging benefits

For more information, visit the Member Resource Centre or speak with a CAAT representative.

Code sample

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>

1. Summary

ComponentText / Title
AEM Resource Typecaat/components/text-title
PurposeProvides styled headings (h1–h6), display titles, eyebrow/subtitle patterns, body text variants, and rich text blocks for CAAT content pages.
VariantsHeading hierarchy · Display heading · Eyebrow + Subtitle · Text (lead, small, muted) · Rich text block
ContainsHeading element, optional eyebrow, optional subtitle, paragraph text, rich text (headings, paragraphs, lists, links, bold/italic)
Used inAll content pages, hero sections, article layouts, landing pages, form intros
FigmaCAAT DS / Components / Text-Title
Status Enhance

2. Design Tokens

TokenRoleValue (light)
--caat-blue-900Heading colour#003750
--caat-color-eyebrow--caat-blue-700Eyebrow colour (canonical token)#0b5a80
--caat-blue-100Section border accent#e7f4fb
--caat-color-eyebrow-on-dark--caat-blue-300Eyebrow colour on dark / imagery#9dd2ed
--caat-grey-200Divider / subtle backgrounds#dfe6ef
--caat-focusFocus ring on links#4D90FE
--caat-inkBody text colour#102637
--caat-radiusBorder-radius for focus outlines.75rem
--caat-font-primaryFont familyLibre Franklin

3. Authoring Fields

FieldTypeRequiredNotes
VariantSelectYestitle | text | rich-text
Heading levelSelectYes (title)h1 – h6. Drives semantic element.
Heading styleSelectNodefault | display | section
Eyebrow textTextNoSmall uppercase label above heading. Max 40 chars.
Title textTextYes (title)The heading content.
Subtitle textTextareaNoSupporting description below the heading.
Text styleSelectNo (text)body | lead | small | muted
Body textTextareaYes (text)Plain text paragraph.
Rich text contentRTEYes (rich-text)Full AEM Rich Text Editor with headings, lists, links, bold/italic.

4. Validation

RuleError 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."

5. Content Guidance

  • Use heading levels in logical order (h1 → h2 → h3). Never skip levels for visual styling — use heading style options instead.
  • Display headings are reserved for hero sections and primary landing page titles. Use sparingly.
  • Eyebrows provide context (e.g. "DBplus Plan", "Member Resources") — keep them short and uppercase.
  • Lead text works well as the first paragraph of a section introduction. Limit to 1–2 sentences.
  • Rich text blocks should not exceed ~500 words. For longer content, break into multiple components with headings.
  • Use bold for emphasis and key terms. Avoid underlining text that isn't a link.
  • Links in rich text should have descriptive text — avoid "click here" or "read more".

6. Semantic HTML

Title variant

<!-- 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>

Text variant

<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>

Rich text variant

<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>

7. CSS Contract

SelectorPurpose
.caat-titleBase heading. Blue-900, weight 800, tight letter-spacing.
.caat-title--displayExtra-large display heading. 3.5 rem, weight 900, tighter spacing.
.caat-title--sectionSection heading with bottom border accent.
.caat-eyebrowSmall 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__subtitleSupporting text below heading. Larger size, muted opacity.
.caat-textBase body text. Ink colour, line-height 1.6.
.caat-text--leadLead paragraph. 1.25 rem font-size.
.caat-text--smallSmall text. 0.875 rem font-size.
.caat-text--mutedMuted text. Reduced opacity.
.caat-rich-textRich text container. Styles nested h2–h4, p, ul/ol, a, strong, em.

8. Accessibility

RequirementImplementation
Heading hierarchyAuthors must select the correct semantic heading level (h1–h6) regardless of visual size.
Colour contrastAll text meets WCAG 2.1 AA minimum contrast (4.5:1 for body, 3:1 for large text).
Link purposeLinks in rich text must have descriptive text. Avoid generic "click here".
Focus indicatorsLinks show visible :focus-visible ring using --caat-focus token.
Eyebrow semanticsEyebrow is a <span> (not a heading) — decorative label only.
Rich text structureLists use proper <ul>/<ol>. Bold uses <strong>, italic uses <em>.
ZoomAll text reflows correctly at 200% zoom and respects user font-size preferences.

9. SEO

  • Headings create the document outline. Use a single h1 per page that describes the page topic.
  • Include target keywords naturally in headings and body text — avoid keyword stuffing.
  • Rich text links with descriptive anchor text improve internal linking signals.
  • Proper heading hierarchy helps search engines understand content structure.
  • Lead paragraphs often appear in featured snippets — write them as concise summaries.

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/text-title
  • Sling Model: TextTitleModel — exposes variant, headingLevel, headingStyle, eyebrow, title, subtitle, textStyle, bodyText, richText.
  • HTL template: text-title.html — uses data-sly-test to switch between title, text, and rich-text variants. Heading level rendered dynamically via data-sly-element.
  • Client library: caat.components.text-title — CSS only; no JS required.
  • Policy: Authors can restrict available heading levels and styles per template policy. Rich text editor toolbar configurable.
  • Allowed parents: Layout Container, Card Body, Article Layout, Hero Content.

12. Dialog Model

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
      }
    }
  }
}

13. QA Acceptance Checklist

  • All heading levels (h1–h6) render with correct size, weight, and colour.
  • Display variant renders at 3.5 rem with weight 900 and tight letter-spacing.
  • Eyebrow renders as small uppercase text above the heading.
  • Subtitle renders below heading with muted opacity.
  • Lead, body, small, and muted text styles render at correct sizes.
  • Rich text block correctly styles nested headings, paragraphs, lists, links, and inline formatting.
  • All text meets WCAG AA colour contrast requirements.
  • Links in rich text show visible focus ring on keyboard navigation.
  • Content reflows correctly at 200% browser zoom.
  • Heading level in DOM matches the authored selection (not just visual size).
  • Responsive: display headings scale down on mobile viewports.
  • Analytics events (text-viewed, link-click) fire correctly.
  • Cross-browser tested: Chrome, Firefox, Safari, Edge.

14. Definition of Done

AreaDone 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.