Design System

Links & text actions

The lightest rung of the action hierarchy: navigation links plus the small text actions that live inside lists, tables and repeatable form groups.

What is this?

TextLink for navigation and inline actions, AddItemAction / RemoveItemAction / ViewMoreAction for row-level text actions, LoadMore for incremental paging, and ChecklistProgress for count-based completion.

When to use it

  • A control is secondary enough that a button would over-weight the layout
  • A repeatable group needs an add or remove affordance under it
  • A long collection is paged incrementally rather than by page number

How to use it

  • Navigation renders an anchor (TextLink); actions render a button (AddItemAction and friends)
  • Keep the label in props — no component hardcodes its own copy
  • Pair LoadMore or Pagination with a collection, never both

What to avoid

  • A text link performing a destructive commitment without confirmation
  • Colour-only affordance: every link keeps an underline on hover and a focus ring
  • One-off inline anchors styled by hand instead of TextLink

Text link

Row-level text actions

Text actions

Button-backed text actions for repeatable content: add a row, remove a row, or expand a truncated list.

import { AddItemAction, RemoveItemAction, ViewMoreAction } from "@/design-system";

When to use

  • Adding or removing entries in a repeatable form group or list
  • Revealing the remainder of a deliberately truncated collection

When not to use

  • Navigation — use TextLink
  • The primary submit of a form — use Button

Add and remove

View more

Accessibility

  • Renders a button element, so the action is keyboard-activated with Space and Enter
  • ds-target keeps the pointer target at the 24px minimum without enlarging the visual
  • ViewMoreAction exposes aria-expanded so the disclosure state is announced

Incremental paging

LoadMore

Centred load-more affordance for feeds and long tables, with a loading state, an optional progress line and an exhausted message.

import { LoadMore } from "@/design-system";

When to use

  • An append-style collection where page numbers carry no meaning
  • Activity feeds, notification lists and change logs

When not to use

  • Data people navigate by position — use Pagination
  • Alongside Pagination on the same collection

States

Showing 20 of 248

All records loaded

Accessibility

  • The region is aria-live=polite, so appended results are announced
  • The control is the standard Button, inheriting its focus and loading semantics
  • The exhausted message replaces the control rather than leaving a dead button

Checklist progress

ChecklistProgress

Count-based progress for checklists and task groups. Wraps Progress so the bar, colour and motion come from one implementation.

import { ChecklistProgress } from "@/design-system";

When to use

  • A checklist or task group with a known number of steps
  • A card footer summarising completion at a glance

When not to use

  • Indeterminate work — use Progress without a value, or Spinner
  • A single metric with no completion semantics — use Metric

Count and percentage

Checklist3/10
Onboarding60%
Complete10/10

Accessibility

  • The count is rendered as text, so completion never relies on the bar alone
  • aria-valuetext announces “3 of 10” rather than a bare percentage
  • Inherits the Progress role and accessible label

Do

  • Use TextLink for navigation and AddItemAction for actions — the element matters
  • Keep labels in props so the same component serves every screen
  • Show a count next to any progress bar

Don't

  • Style a bare anchor by hand
  • Use a destructive text action without a confirmation dialog
  • Mix LoadMore and Pagination on one collection