Pills

Use pills when you need compact tags for status, filters, topics, or metadata.

Live demo

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

Pills anatomy

  1. Group: optional wrapper when spacing or alignment needs a hook.
  2. List row: a flex row with gap; each pill should sit in its own list item for valid lists.
  3. Pill surface: rounded tag with a colour treatment that matches meaning or brand.
  4. 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-) and dependencies.less colours 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-creation with generic c-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--large uses 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 / sourceCategoryWhere used
--cds-font-weight-semi-bold, --cds-font-weight-boldtypographyList items, pill text.
--cds-font-size-050, --cds-font-size-125typographyDefault and large pills.
--cds-font-family-body, --cds-font-family-brandtypographyBody vs large pill.
--cds-letter-spacing-bodytypographyPills and list.
--cds-border-radius-fulllayoutInput pill span shape.
--cds-space-04, --cds-space-20spacingInput pill padding.
--cds-color-text-subtle, --cds-color-tint-mutedcolourc-pills__pill--muted-light.
--cds-color-tint-success, --cds-color-success-text-on-tintcolourc-pills__pill--green-light.
--cds-color-tint-warning, --cds-color-warning-text-on-tintcolourc-pills__pill--yellow-light.
--cds-color-black-10, --cds-color-black-100colourc-pills__pill--grey.
@color-burgundy, @color-white, @color-black, @color-medium-greycolourDefaults 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-greycolourNamed modifiers.
#508212colourc-pills__pill--green (hard-coded).
#E9D3D7colourc-pills__pill--burgundy-tint.
#555555colour.research-grey, .research-creation (legacy).

Variants (style)

ModifierRole
c-pills__pill--largeProminent toggle or label.
c-pills__pill--muted, --muted-lightNeutral / subtle fills.
c-pills__pill--transparentText-style; with c-pills__input removes border and can underline on hover.
c-pills__pill--activeDisables hover underline on transparent toggles.
c-pills__pill--green through --darker-greySolid or input-paired colourways (each defines &.c-pills__input border and filled states).
c-pills__pill--burgundy-tintLight burgundy background, black text.
Legacy: .pill-sunset, .pill-light-grey, .research-grey, .pill-certificate, .pill-interdisciplinary, .pill-option, .research-creationBackground only; should be retired per file TODO.

Behaviours

  • Input pills: :hover, :active, :checked on 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__container gets margin-top: 20px and left-aligned text.
  • Right cluster: .c-pills__container--right at 768px+ gets margin-left: auto, text-align: right, align-self: center.
  • Static pills are plain text in span or 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 the label (browser focuses label and activates input). If focus is lost or invisible, add explicit :focus-within styles 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-label when 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__input label spans matches design system expectations; pills.less does not define a custom focus-custom block on pill labels (unlike some form controls).

Testing

TestStatus
Keyboard: tab to each filter pill and toggleRecommended
Screen reader: state for checked filtersRecommended
Contrast on yellow / cyan / grey pillsRecommended

WCAG / guidelines

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

  1. Static pills: span with c-pills__pill and a colour modifier inside ul.c-pills__list for tags, program types, topics, and similar.
  2. Toggle / filter pills: label.c-pills__input wrapping a visually hidden checkbox or radio and a span that looks like a pill; selected state uses :checked and colour modifiers.
  3. Large segmented controls: Links or buttons with c-pills__pill c-pills__pill--large (for example view toggles).
  4. Layout helpers: .c-pills__container--right aligns a pill group to the end of a row on desktop; cards get extra top margin for .c-pills__container via nested rules.

Implementation files

FilePurpose
base/less/pills.lessAll .c-pills rules, legacy .pill- / .research-.
base/css.txtImports pills.less after shared tokens and colors.less.
individual-profile-list/less/individual-profile-list.lessc-pills__input / c-pills__filter-pill behaviour for profile filters.
student-group-list/less/student-group-list.lessAdjustments for list and input span in that component.
cce/less/offering-template.lessTemplate-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 base imports).
  • Optional SVG sprite for faculty pills (ci-circle-check / ci-circle-cross).