Join the conversation
Use join the conversation when you need social or RSS links with icons in a vertical list.
Live demo
Join the conversation is a short list of places to follow or read more (social networks, RSS, and similar), each with an icon and label. Visitors use it to leave the current page for an external channel when that is the goal.
Behaviour
- On publish, nothing renders if there are no valid links. In edit mode with no links, a placeholder appears.
- Each row can open in a new tab when authors set that option.
- Hide underline swaps the trailing rule for a lighter break.
Anatomy

- Section heading (optional).
- Vertical list of links, each with icon and label.
- Separator line or spacer after the block (unless hidden).
Content guidelines
- Title field supports HTML where the template allows; keep headings short and on-brand.
- Link types must match the authoring widget so the correct sprite and accessible name apply.
Best practices
Do
- Use at the end of an article, event, or program page when follow / subscribe links should follow one pattern.
Don't
- Don't use this for a single arbitrary link without the social icon pattern; use Link or Link list instead.
When to use
- At the end of an article, event, or program page where follow / subscribe links should appear in a consistent pattern.
- Where design calls for icon + text links rather than a generic link list.
When not to use
- For a single arbitrary link without the social icon pattern; use Link or Link list instead.
- When icons must match a network not in the authoring widget (would require extending the widget and model).
Related
Styles live in join-the-conversation.less under #boot, clientlib apps.concordia.join-the-conversation (loaded from the HTL via clientlib.all). The section header uses the brand condensed face and burgundy; links are black with blue underlined hover on the item content.
Anatomy (visual)
- Heading: 22px / 1.5, weight 800, burgundy (
h2). - List: No bullets;
lihas bottom margin. - Item: Inline flex; icon (
.ci) with right margin; label line-height 22px. - Link hover: No underline on the
aitself; underline applied to the innerdivwith blue text.
Design tokens
| Token / variable | Category | Where used |
|---|---|---|
--cds-font-family-brand-condensed |
typography | Default h2. |
@color-burgundy |
colour | Default h2 text. |
@color-black |
colour | Link text. |
@color-blue |
colour | Hover state on item text. |
Event context: h2 becomes 26px / 42px, black (.event .c-join-the-conversation).
Variants (style)
- Dialog classes:
divCssClassandulCssClassallow layout hooks (Bootstrap grid classes, etc.) without editing LESS. - Post compliant:
.post.compliant .c-join-the-conversation ul liforceslist-style-type: nonewith!important.
Behaviours
- Hover: Underline + blue on the flex item container inside the link (not the raw anchor underline).
Layout and spacing
- Icon alignment uses a small negative
vertical-alignon.ci. hr/brspacing follows the Hide underline dialog option.
- Each item is a real link (
<a href>), which supports keyboard activation, visible focus (browser / global link styles), and opening in a new window when configured. - The SVG uses
role="img"and anaria-labelderived from the network type (Facebook, X, YouTube, etc.). Visible title text sits beside the icon; keep Title in the dialog meaningful so sighted users and speech users get consistent wording. - New tab:
rel="noopener noreferrer"is set whentarget="_blank"is used.
Semantics
- The block heading is an
h2; ensure page heading order remains valid (no skipped levels above it). titleon the anchor duplicates link text in HTL; avoid misleadingtitlecontent if you change the HTL pattern later.
Keyboard
- Tab to each social link; Enter to activate.
Screen reader
- Icon is exposed with
aria-label(network name); adjacent text is the Title field. Avoid redundant or conflicting strings (for example icon “Facebook” and title “Follow us” is usually fine; icon “Facebook” and title “Twitter” would be wrong).
Focus and visibility
- Confirm link focus visibility against design system focus-custom usage on other links; this LESS does not add a custom
:focus-visiblerule.
Testing
| Test | Status |
|---|---|
| Keyboard navigation through all links | Recommended |
New tab + rel attributes | Recommended |
| Edit mode placeholder | Recommended |
Event template styling (heading + hidden hr) | Recommended |
WCAG / guidelines
- Understanding 2.4.4 Link purpose (in context)
- Understanding 2.4.9 Link purpose (link only) (if icons were ever shown without visible text)
CRXDE Lite query
Use this query in CRXDE Lite to find instances of this component.
/jcr:root/content//*[@sling:resourceType = 'concordia/components/join-the-conversation/join-the-conversation.html']
Technical behaviour
Authors add the component to a parsys, set an optional header, and add one or more links via a multifield. Each link defines:
- Type (drives icon and default accessible name for the icon),
- Title (visible label next to the icon),
- Link (path field),
- Open in new tab (optional).
The Sling model JoinTheConversationModel reads composite child nodes under links/ first; if none, it falls back to legacy JSON stored in a links string/array property.
On publish, nothing renders if there are no valid links (linkPath and linkClass must both be non-blank in the model). In edit mode with no links, a placeholder and i18n title appear.
Authoring fields
| Dialog field | Property | Purpose |
|---|---|---|
| Header | ./header |
h2 content (HTL context='html'). |
| Links | ./links |
Multifield; each entry uses custom widget linkitemcss (Type, Title, Link, Open in new tab). Stored as composite nodes or legacy JSON (see below). |
| Additional CSS class for the wrapping div | ./divCssClass |
Extra class on the div wrapping the ul. |
| Additional CSS class for the ul elements | ./ulCssClass |
Extra class on the ul. |
| Hide underline | ./hideUnderline |
When true, omits hr and outputs br instead. |
Link types available in the authoring widget (and recognised for icons in the model) include: Facebook, X (stored as twitter), LinkedIn, Instagram, YouTube, Flickr, Pinterest, Weibo, RSS.
Variants (usage in codebase)
| Context | Notes |
|---|---|
| Event template | templates/shared/news-events/event/.content.xml includes a join-the-conversation resource. LESS under .event .c-join-the-conversation adjusts heading size and colour and hides the hr. |
| Degree program detail | templates/concordia/academics/degree-program-detail/.content.xml includes the component in the template structure. |
| General pages | Authors can drop the component into any allowed parsys. |
Component metadata
- Resource type:
concordia/components/join-the-conversation - View:
join-the-conversation.html(HTL) - Model:
org.concordia.wcms.core.models.JoinTheConversationModel - Authoring widget:
linkitemcssregistered inclientlibs/widgets/js/linkItemCSS.js
Implementation
| File | Purpose |
|---|---|
apps/concordia/components/join-the-conversation/join-the-conversation.html |
Markup, clientlib include, list loop, edit placeholder. |
apps/concordia/components/join-the-conversation/dialog.xml |
Tabs: Social media links, Style. |
apps/concordia/components/join-the-conversation/_cq_htmlTag/.content.xml |
Adds c-join-the-conversation on the root element. |
concordia-core/.../JoinTheConversationModel.java |
Builds link list from links children or legacy JSON; maps linkClass to iconId and ariaLabel. |
clientlibs/widgets/js/linkItemCSS.js |
Multifield row: type select, title, path, new-tab checkbox; serialises JSON for legacy storage path. |
clientlibs/join-the-conversation/less/join-the-conversation.less |
Component presentation and .event override. |
Anatomy (markup)
- Outer resource tag:
class="c-join-the-conversation"(from_cq_htmlTag). - Inner:
<div class="c-join-the-conversation bloc">>h2.section-header><div class="{divCssClass}">><ul class="{ulCssClass} m-0 p-0">> items. - Each link:
<a href="…" target="_blank" rel="noopener noreferrer">when new tab is set;titlefrom link text. - SVG:
<svg class="ci {iconId}" role="img" aria-label="…"><use href="…svg-sprites.svg#{iconId}"/></svg>
Authoring (dialog)
Multifield entries must include Type and Title and Link (widget enforces non-blank). Open in new tab maps to linkTarget in stored JSON or equivalent on child nodes.
Dependencies
- Sprite:
/etc/designs/concordia/clientlibs/img/svg-sprites.svgmust contain theci-*symbol referenced byiconId. - Widgets clientlib: The Touch/Classic UI must load
linkitemcsswhere the dialog is used (project-wide widgets setup). - Component loads
apps.concordia.join-the-conversationonly when the component is present (not necessarily embedded in concordia-master; verify page policy if styles are missing).
Model behaviour note
If legacy or migrated content used an unknown linkClass, the Java model defaults the icon to ci-facebook and the aria label to Facebook. New authoring is constrained by the linkitemcss select, so mismatches are mainly a migration / old data concern.