Pills
Use pills when you need compact tags for status, filters, topics, or metadata.
Live demo
- Major
- Honours
- Co-op
People use pills to scan categories quickly or to narrow a list with filter-style controls. Static pills summarize information (topics, program type, labels). Interactive pills behave like rounded checkboxes or radios: they show what is selected and what is not. Reserve pills for secondary wayfinding and classification, not the main call to action on the page unless the design deliberately uses a large pill-style toggle.
Behaviour
Static pills are read-only tags: they communicate what something is, not a separate navigation action by themselves.
Filter pills update a listing or view when chosen; selection state should be visible without relying on colour alone.
Large pill treatments can act as view switches (for example changing how a list is shown) when implemented as links or toggles in the template.
Pills usually sit in a row that wraps on narrow screens so the layout stays usable on mobile.
Anatomy

- Group: optional wrapper when spacing or alignment needs a hook.
- List row: a flex row with gap; each pill should sit in its own list item for valid lists.
- Pill surface: rounded tag with a colour treatment that matches meaning or brand.
- Label: short text; interactive pills pair a hidden input with a visible label span.
(Placeholder asset: add static pills, input pills, and large toggle examples.)
Content guidelines
- Keep labels to one or two words where possible; pills assume compact text.
- Do not rely on colour alone for meaning; pair tint with clear wording or icons when the pattern already does so (for example availability-style status).
- Prefer named colour roles from the design system over ad hoc hex values so contrast stays predictable.
When to use
- Short labels that group or classify content at a glance.
- Filter chips where checkbox or radio behaviour matches the design (delivery mode, audience, and similar).
- Status or metadata that should stay lighter than the page title (for example a beta label).
When not to use
- Primary calls to action; use Button instead.
- Long sentences; pills are sized for compact text and typically avoid wrapping awkwardly.
- Removable tag chips with a close control unless the template implements that interaction and accessibility end to end.
Best practices
Do
- Group related pills in a list so structure is clear for everyone.
- Test filter pills with keyboard and screen reader when they drive real filtering behaviour.
Don't
- Use pills as a shortcut for poor information architecture; fix navigation and filters at the source when lists grow unmanageable.
- Introduce one-off colour classes outside the shared pill system without a plan to align them later.
Related
| Resource | |
|---|---|
| Button | Primary and secondary actions; use when the control is the main task. |
| Card deck | When pills sit on cards, follow card colour and layout guidance. |
| Status bar | Inline status strip; different layout role from pill tags. |
All rules live under #boot .c-pills in etc/designs/concordia/clientlibs/base/less/pills.less, imported from base/css.txt (with design tokens). The default pill is burgundy fill with white type; modifiers swap background and border behaviour. Accordion context: from 768px up, .c-accordion .c-pills__list uses justify-content: end.
Design system notes
- Align with tokens: prefer CDS custom properties already used in the file (
--cds-font-size-050,--cds-space-,--cds-border-radius-full,--cds-color-tint-) anddependencies.lesscolours for solid pills. - Legacy cleanup: the LESS file includes a TODO to replace
.pill-sunset,.pill-light-grey,.research-grey,.pill-certificate,.pill-interdisciplinary,.pill-option,.research-creationwith genericc-pills__pill--*usage; track templates that emit lowercase label classes (for example some CCE views). - Contrast: yellow and cyan pills use black text on saturated backgrounds; verify contrast when changing hex or tokens.
Anatomy (visual)
- List: Flex row, wrap,
gap: 0.5rem, no bullets; top margin on small screens, reset at 768px. - Default pill:
border-radius: 20px, padding.25rem .75rem, bold, CDS body font, burgundy background. - Large:
c-pills__pill--largeuses brand font, larger type (--cds-font-size-125), semi-bold,border-radius: 40px, more padding; mobile padding tweak. - Input pill span: Full pill radius (
--cds-border-radius-full), 2px solid border, horizontal padding from--cds-space-20, white background until hover, active, or checked (then filled per colour modifier).
Design tokens
| Token / source | Category | Where used |
|---|---|---|
--cds-font-weight-semi-bold, --cds-font-weight-bold | typography | List items, pill text. |
--cds-font-size-050, --cds-font-size-125 | typography | Default and large pills. |
--cds-font-family-body, --cds-font-family-brand | typography | Body vs large pill. |
--cds-letter-spacing-body | typography | Pills and list. |
--cds-border-radius-full | layout | Input pill span shape. |
--cds-space-04, --cds-space-20 | spacing | Input pill padding. |
--cds-color-text-subtle, --cds-color-tint-muted | colour | c-pills__pill--muted-light. |
--cds-color-tint-success, --cds-color-success-text-on-tint | colour | c-pills__pill--green-light. |
--cds-color-tint-warning, --cds-color-warning-text-on-tint | colour | c-pills__pill--yellow-light. |
--cds-color-black-10, --cds-color-black-100 | colour | c-pills__pill--grey. |
@color-burgundy, @color-white, @color-black, @color-medium-grey | colour | Defaults and muted solid. |
@color-blue, @color-dark-blue, @color-orange, @color-magenta, @color-turquoise, @color-mauve, @color-yellow, @color-cyan, @color-dark-grey, @color-darker-grey | colour | Named modifiers. |
#508212 | colour | c-pills__pill--green (hard-coded). |
#E9D3D7 | colour | c-pills__pill--burgundy-tint. |
#555555 | colour | .research-grey, .research-creation (legacy). |
Variants (style)
| Modifier | Role |
|---|---|
c-pills__pill--large | Prominent toggle or label. |
c-pills__pill--muted, --muted-light | Neutral / subtle fills. |
c-pills__pill--transparent | Text-style; with c-pills__input removes border and can underline on hover. |
c-pills__pill--active | Disables hover underline on transparent toggles. |
c-pills__pill--green through --darker-grey | Solid or input-paired colourways (each defines &.c-pills__input border and filled states). |
c-pills__pill--burgundy-tint | Light burgundy background, black text. |
Legacy: .pill-sunset, .pill-light-grey, .research-grey, .pill-certificate, .pill-interdisciplinary, .pill-option, .research-creation | Background only; should be retired per file TODO. |
Behaviours
- Input pills:
:hover,:active,:checkedon the control fill the span and flip text to white (except yellow, cyan, grey, burgundy-tint variants where spec keeps dark text). - Transparent + input: Hover on span can add underline for link-like filters.
Layout and spacing
- Card:
.c-card .c-pills__containergetsmargin-top: 20pxand left-aligned text. - Right cluster:
.c-pills__container--rightat 768px+ getsmargin-left: auto,text-align: right,align-self: center.
- Static pills are plain text in
spanor list items; ensure surrounding heading or list context makes the meaning clear. - Input pills hide the native input with
position: absolute; left: -9999px. That pattern removes the control from the visual flow but it should remain focusable; test keyboard order and focus visibility on thelabel(browser focuses label and activates input). If focus is lost or invisible, add explicit:focus-withinstyles on the label or use a visually hidden class that keeps focus visible. - Faculty pills pair text with decorative SVG (
role="presentation",aria-hidden="true"); status should still be clear from visible text.
Semantics
- Use
aria-labelwhen the visible text is ambiguous (example: CDS Beta pill). - For filter groups, a visible group label or
fieldset/legend(where used) helps screen reader users.
Keyboard
- Labels for checkbox or radio pills should toggle when Space is used on the focused control.
- Large view toggles implemented as links behave like normal links (Enter).
Screen reader
- Announced text is the pill label; colour alone must not be the only cue (faculty pattern uses icon, tint variants, and wording).
Focus and visibility
- Confirm focus ring on
c-pills__inputlabel spans matches design system expectations;pills.lessdoes not define a customfocus-customblock on pill labels (unlike some form controls).
Testing
| Test | Status |
|---|---|
| Keyboard: tab to each filter pill and toggle | Recommended |
| Screen reader: state for checked filters | Recommended |
| Contrast on yellow / cyan / grey pills | Recommended |
WCAG / guidelines
- Understanding non-text contrast (1.4.11) for pill boundaries and fills.
- Understanding use of color (1.4.1).
Technical behaviour
Pills are CSS-first: there is no single Pills dialog for authors. Templates, HTL, and JSP build lists and labels and apply c-pills classes. Behaviour (static tag versus filter input) is defined per feature (student lists, offerings, profiles, and so on).
Styles ship with apps.concordia.base (see Implementation files).
Variants in markup
- Static pills:
spanwithc-pills__pilland a colour modifier insideul.c-pills__listfor tags, program types, topics, and similar. - Toggle / filter pills:
label.c-pills__inputwrapping a visually hidden checkbox or radio and aspanthat looks like a pill; selected state uses:checkedand colour modifiers. - Large segmented controls: Links or buttons with
c-pills__pill c-pills__pill--large(for example view toggles). - Layout helpers:
.c-pills__container--rightaligns a pill group to the end of a row on desktop; cards get extra top margin for.c-pills__containervia nested rules.
Implementation files
| File | Purpose |
|---|---|
base/less/pills.less | All .c-pills rules, legacy .pill- / .research-. |
base/css.txt | Imports pills.less after shared tokens and colors.less. |
individual-profile-list/less/individual-profile-list.less | c-pills__input / c-pills__filter-pill behaviour for profile filters. |
student-group-list/less/student-group-list.less | Adjustments for list and input span in that component. |
cce/less/offering-template.less | Template-specific c-pills__list / c-pills__pill layout. |
Clientlib: apps.concordia.base (see base/css.txt); embedded in concordia-master-clientlibs.
Overrides: individual-profile-list.less, student-group-list.less, cce/less/offering-template.less extend or tweak pills in context.
Anatomy (markup)
Static tag (preferred):
<div class="c-pills">
<ul class="c-pills__list">
<li><span class="c-pills__pill c-pills__pill--grey">Topic</span></li>
</ul>
</div>
Checkbox / radio pill (pattern):
<ul class="c-pills__list">
<li>
<label class="c-pills__input c-pills__pill--blue">
<input type="checkbox" name="x" value="y">
<span>Label</span>
</label>
</li>
</ul>
(Individual profile list uses c-pills__filter-pill inside the label instead of a bare span.)
Authoring
There is no global Pills component dialog. Labels come from i18n in JSP, models or HTL, or fixed copy in templates (for example CDS beta, association legend). Card components may expose fields that map to pill HTML from models.
Instances in the codebase
| Context | Location | Pattern |
|---|---|---|
| Student group list | student-group-list.html, filters/associations.html |
c-pills__pill--large on <a> for view toggle; c-pills__list + colour modifiers for affiliate; association filter legend with fixed colour per group. |
| Individual profile list | individual-profile-list.html |
c-pills__input + c-pills__filter-pill for All / Students / Alumni filters; pillHtml from model for profile cards. |
| Degree program detail | degree-program-detail/content.jsp |
Maps program types to c-pills__pill--* classes; builds c-pills__list HTML in c-pills__container--right. |
| Faculty profile | faculty-profile-default.jsp |
c-pills__pill--muted-light, --green-light, --yellow-light with SVG icons for availability-style status. |
| Shared profile page | page/shared/profile/content.jsp |
Experience learning tags as c-pills__pill--dark-grey / --darker-grey. |
| CCE program / course | cce/program/content.jsp, cce/course/content.jsp |
c-pills__list + c-pills__pill with legacy class from pillLabel.toLowerCase() (see Style: legacy classes). |
| CCE offering list | filters/delivery-mode.html, cce-offering-list.html |
c-pills__input with c-pills__pill--orange / --dark-blue / --turquoise; output in c-pills__container--right. |
| Thunderstone faceted | listitem_jmec.jsp, listitem_graduate-awards.jsp |
Topics or degrees as c-pills__pill--grey (markup uses li with pill class in places). |
| CDS body | page/concordia/cds/body.jsp |
Beta label: c-pills__pill--darker-grey with aria-label. |
Dependencies
dependencies.less(colour variables).- CDS design token LESS (via
baseimports). - Optional SVG sprite for faculty pills (
ci-circle-check/ci-circle-cross).