Understanding Your CAAT DB Plus Pension
Learn how your defined benefit pension works and what it means for your retirement security.
Component Contract
Filterable grid of blog and article teasers for pension education content across the CAAT Pension Plan member experience.
Rendered
Learn how your defined benefit pension works and what it means for your retirement security.
A practical guide to planning for retirement, from estimating your income to choosing the right time to retire.
Our investment portfolio delivered solid returns, keeping the plan fully funded and benefits secure.
Hear from a long-time CAAT member about the tools and support that helped them plan for a secure retirement.
Understand how bridge benefits supplement your income if you retire before government pensions begin.
We welcome several new employers to the CAAT family, expanding secure pension coverage to more Canadians.
Rendered
A clear explanation of how defined benefit pensions differ from other retirement savings plans and why they offer greater security.
Thinking about early retirement? Learn how it affects your pension income and what options are available to you.
One member shares how their perspective on pension plans completely changed after joining CAAT.
Rendered
Understand how pension income splitting works and how it can benefit you and your partner at tax time.
A look back at five decades of providing secure, sustainable pension benefits to Canadian workers.
A retired educator shares how their CAAT pension gave them the financial confidence to enjoy life after work.
Rendered
A line-by-line guide to reading your annual pension statement so you know exactly where you stand.
Non-profit organisations across Canada can now offer their employees the security of a CAAT pension.
A lifelong CAAT member reflects on three decades of pension contributions and what retirement looks like today.
Learn how CAAT survivor benefits provide financial protection for your spouse and dependants.
Key information about employer contribution rates for the coming plan year and what it means for your organisation.
A recently retired member explains why their CAAT pension is the benefit they value most from their career.
Rendered
| Component | Blog Listing |
| Resource type | caat/components/blog-listing |
| Purpose | Displays a filterable grid of blog and article teaser cards, linking to full articles on pension education, retirement planning, employer news, and member stories. |
| Variants | Card Grid · List View · Featured + Grid · Filtered Grid |
| Status | Enhance |
| Replaces | Multi Tile Listing (#43) |
| Token | Role | Value (light) |
|---|---|---|
--caat-blue-900 | Card title colour, active filter bg | #003750 |
--caat-blue-700 | Title hover colour | #0b5a80 |
--caat-blue-100 | Category badge background | #e7f4fb |
--caat-green | Optional success accent | #55a546 |
--caat-grey-200 | Filter button border, card separator | #dfe6ef |
--caat-focus | Focus ring on interactive elements | #4D90FE |
--caat-ink | Excerpt text colour | #102637 |
--caat-radius | Card border-radius | .75rem |
--caat-font-primary | Font family | Libre Franklin |
| Field | Type | Required | Notes |
|---|---|---|---|
| Variant | Select | Yes | card-grid | list-view | featured-grid | filtered-grid |
| Heading | Text | No | Optional section heading above the listing. |
| Content source | Pathfield | Yes | Root page path for blog content (e.g. /content/caat/en/blog). |
| Max items | Number | No | Limit number of displayed cards. Default 6. |
| Category tags | Tag picker | No | Filter source content by tag taxonomy. |
| Show filters | Toggle | No | Renders category filter bar above grid. |
| Featured article | Pathfield | No | Featured variant only — specific article path for the hero card. |
| Card: Image | Image (DAM) | Yes | Pulled from article page thumbnail or DAM reference. |
| Card: Title | Text | Yes | Pulled from article jcr:title. |
| Card: Excerpt | Textarea | No | Pulled from article jcr:description. Truncated at 160 chars. |
| Card: Category | Text | No | Derived from article tags. |
| Card: Date | Date | Yes | Article publish date. |
| Card: Read time | Text | No | Estimated reading time in minutes. |
| Rule | Error message |
|---|---|
| Content source path is required. | "Provide a root content path for the blog listing." |
| Content source must resolve to at least 1 child page. | "No articles found at the specified path." |
| Each card must have a title. | "One or more articles are missing a title." |
| Each card must have an image or fallback. | "Provide an image for each article or configure a default thumbnail." |
| Featured variant requires a featured article path. | "Select a featured article for this variant." |
| Max items must be between 1 and 24. | "Enter a value between 1 and 24." |
alt="".<section class="caat-blog-listing" aria-label="Blog articles">
<div class="caat-blog-listing__grid">
<article class="caat-blog-listing__card">
<a href="/blog/article-slug">
<img class="caat-blog-listing__image"
src="/content/dam/caat/blog/thumb.jpg"
alt="" loading="lazy">
<div class="caat-blog-listing__body">
<span class="caat-blog-listing__category">Pension Basics</span>
<h3 class="caat-blog-listing__title">Article Title</h3>
<p class="caat-blog-listing__excerpt">Brief description…</p>
<div class="caat-blog-listing__meta">
<span>Jan 15, 2026</span>
<span>5 min read</span>
</div>
</div>
</a>
</article>
<!-- …more cards -->
</div>
</section>
<div class="caat-blog-listing__filters" role="toolbar"
aria-label="Filter articles by category">
<button class="caat-blog-listing__filter-btn active"
aria-pressed="true" data-filter="all">All</button>
<button class="caat-blog-listing__filter-btn"
aria-pressed="false" data-filter="pension-basics">Pension Basics</button>
<!-- …more filters -->
</div>
| Selector | Purpose |
|---|---|
.caat-blog-listing | Root component container. |
.caat-blog-listing__grid | CSS Grid container — 3-col desktop, 2-col tablet, 1-col mobile. |
.caat-blog-listing__grid--list | Modifier: single-column list view with horizontal cards. |
.caat-blog-listing__card | Individual card — white bg, subtle shadow, hover lift. |
.caat-blog-listing__image | Card image — object-fit:cover, aspect-ratio:16/9. |
.caat-blog-listing__body | Card content wrapper with padding. |
.caat-blog-listing__category | Category pill badge — blue-100 bg, blue-900 text. |
.caat-blog-listing__title | Card heading — blue-900, font-weight 700. |
.caat-blog-listing__excerpt | Teaser text — ink colour, 0.9375 rem. |
.caat-blog-listing__meta | Date and read-time row — muted small text. |
.caat-blog-listing__filters | Filter toolbar container — flex, gap. |
.caat-blog-listing__filter-btn | Filter pill button — active state uses blue-900 bg. |
.caat-blog-listing__featured | Featured card wrapper — full-width horizontal layout. |
| Requirement | Implementation |
|---|---|
| Landmark | Wrap listing in <section> with aria-label. |
| Card links | Each card is a single <a> wrapping all content; aria-label provides full article title. |
| Images | Decorative images use alt="". Meaningful images get descriptive alt text. |
| Filters | role="toolbar" on filter container; aria-pressed on each filter button. |
| Focus | Visible :focus-visible ring (--caat-focus) on cards and filter buttons. |
| Colour contrast | Category badge text (blue-900 on blue-100) meets 4.5:1. Meta text meets 4.5:1 against white. |
| Motion | Hover lift transition respects prefers-reduced-motion: reduce. |
| Keyboard | All cards and filter buttons reachable via Tab. Filter state toggled via Enter / Space. |
<article> elements so crawlers understand the listing structure.<h3> or <h4>) to contribute to page outline.loading="lazy"; above-the-fold featured images should use loading="eager".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/blog-listingBlogListingModel — exposes variant, heading, contentPath, maxItems, categoryTags[], showFilters, featuredArticlePath, articles[].blog-listing.html — uses data-sly-test to switch between grid, list, featured, and filtered variants. Cards iterated with data-sly-list.caat.components.blog-listing — CSS + JS. JS handles filter toggle, card analytics events.contentPath, sorted by publish date descending, filtered by category tags.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": ["card-grid", "list-view", "featured-grid", "filtered-grid"]
},
"heading": {
"sling:resourceType": "granite/ui/components/coral/foundation/form/textfield",
"label": "Heading",
"name": "./heading"
},
"contentSource": {
"sling:resourceType": "granite/ui/components/coral/foundation/form/pathfield",
"label": "Content source",
"name": "./contentSource",
"required": true,
"rootPath": "/content/caat"
},
"maxItems": {
"sling:resourceType": "granite/ui/components/coral/foundation/form/numberfield",
"label": "Max items",
"name": "./maxItems",
"min": 1,
"max": 24,
"value": 6
},
"categoryTags": {
"sling:resourceType": "cq/gui/components/coral/common/form/tagfield",
"label": "Category tags",
"name": "./categoryTags",
"multiple": true
},
"showFilters": {
"sling:resourceType": "granite/ui/components/coral/foundation/form/checkbox",
"label": "Show category filters",
"name": "./showFilters"
},
"featuredArticle": {
"sling:resourceType": "granite/ui/components/coral/foundation/form/pathfield",
"label": "Featured article",
"name": "./featuredArticle",
"rootPath": "/content/caat"
}
}
}
}
object-fit:cover.aria-pressed toggles correctly on filter buttons.aria-label on each card link.blog-listing-viewed, blog-card-click, blog-filter-change) fire correctly.| Area | Done means |
|---|---|
| Design | Figma component matches this contract. All four variants documented with responsive breakpoints. Category badge, filter bar, and featured card states included. |
| Development | AEM proxy component created. HTL template emits semantic HTML per Section 6. CSS uses design tokens exclusively. Filter JS handles aria-pressed toggle and card visibility. Sling Model queries and sorts content. 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 content source configuration. Documentation published. Analytics dashboards confirmed receiving events. |