What's new Report an issue
GIG Cymru NHS Wales, Digital Health and Care Wales

Icons

The Single Record icon set, and the size and colour rules that keep it legible in dense clinical screens.

The set

Single Record uses Lucide, an open-source icon set published under the ISC licence. Every icon is drawn on a 24 by 24 grid with a 1px stroke, round caps and round joins, so icons sit together evenly whatever the mix on screen.

142 icons are published, grouped into 11 domains that follow how clinical and administrative staff talk about their work: navigation, actions, status, people, clinical records, scheduling, location, communication, files, data and device.

One glyph carries one meaning. A drawing is never reused for two different concepts, because the person reading the screen sees the picture, not the name behind it. The build fails if two Single Record names ever resolve to the same Lucide drawing.

Icons are referenced by their Single Record name, such as clinical/medication, not by the underlying Lucide file name. The Single Record name is stable: if an upstream drawing is renamed or replaced, the name your product uses does not change.

Using an icon

An icon is a sr-icon wrapper around an inline SVG. The wrapper carries the size and the colour role; the SVG itself is drawn with currentColor and inherits from it.

sr-icon--xs
sr-icon--sm
sr-icon--md
sr-icon--lg
<!-- Decorative: the visible text carries the meaning. -->
<span class="sr-icon sr-icon--md sr-icon--default">
  <svg aria-hidden="true" focusable="false"><!-- clinical/vitals --></svg>
</span>
<span>Observations</span>

Sizes

Four sizes are published. Stroke stays at 1px in all of them — it is not thinned at small sizes or thickened at large ones. One stroke weight across the set is what makes a row of mixed icons look like one family.

ClassSizeUse for
sr-icon--xs16pxInline within dense content, such as a table cell
sr-icon--sm20pxStandard inline icons, including icons inside buttons
sr-icon--md24pxDefault size
sr-icon--lg32pxProminent icons, empty states, feature panels

An icon that is itself a control needs a target of at least 44 by 44px. Keep the icon at its published size and add padding to the button around it, rather than scaling the drawing up.

Colour

Icons take their colour from a role, not from a value. Roles map onto the same semantic colour tokens the rest of the interface uses, so an icon shifts with the theme without being re-specified.

sr-icon--default
sr-icon--subtle
sr-icon--interactive
sr-icon--critical
sr-icon--warning
sr-icon--success
sr-icon--info
ClassColour tokenUse for
sr-icon--defaultsr.color.text.primaryDefault icon colour, matched to body text
sr-icon--subtlesr.color.text.secondarySupporting icons that must not compete with the label
sr-icon--interactivesr.color.interactive.primaryIcons inside links and interactive controls
sr-icon--criticalsr.color.status.criticalErrors, invalid fields, critical alerts
sr-icon--warningsr.color.status.warningAttention required, unverified data
sr-icon--successsr.color.status.successConfirmed and completed states
sr-icon--infosr.color.status.infoInformational and in-progress states
sr-icon--inversesr.color.text.inverseIcons on a dark or saturated fill
sr-icon--inheritInheritedIcons inside a coloured component, such as a button, that must track the component colour

Inside a component that already sets a colour, such as a button, use sr-icon--inherit so the icon tracks the component rather than fighting it.

The warning role is an exception. Every colour role above clears 3:1 against a light surface except sr-icon--warning, which is a fill colour rather than a stroke colour and reaches only 1.6:1 on white. Never let a warning icon carry the message on its own: give it a text label, and where the icon has to read on its own use sr-icon--critical or the warning surface behind a labelled banner. A darker warning value is under review.

On each platform

Sizes, stroke and the colour roles are published as design tokens from a single source, so the same size is the same number wherever you build. Reach for the token rather than typing 24px.

PlatformIconSize and colour
Web / Blazor<svg><use href="sprite.svg#icon-nav-search">, or the sr-icon wrappervar(--sr-icon-size-md), var(--sr-icon-color-subtle)
React<Icon name="nav/search" />size="md", color="subtle"
.NET MAUI<Path Data="{StaticResource SrIconNavSearch}" />{StaticResource SrIconSizeMd}, {StaticResource SrIconStroke}, {StaticResource SrIconColorSubtle}
DelphiRasterised PNG exported from the SVGExport at 16, 20, 24 and 32px

MAUI receives the icons as XAML path geometry rather than images, so an icon takes its colour from a token like everything else and stays sharp at any density. SrIconStroke is a Double, ready to bind to a Path's StrokeThickness.

Icons with text

Most icons in Single Record sit next to a label. In that pairing the text carries the meaning and the icon is decorative, so it is hidden from screen readers. When an icon stands alone, the control around it must be named instead.

<!-- Decorative. Paired with visible text, so the icon is hidden from
     assistive technology and the text is announced on its own. -->
<button class="sr-button sr-button--secondary" type="button">
  <span class="sr-icon sr-icon--sm sr-icon--inherit"><svg aria-hidden="true" focusable="false"></svg></span>
  Print summary
</button>

<!-- Meaningful. No visible text, so the control carries the name. -->
<button class="sr-button sr-button--secondary" type="button" aria-label="Print summary">
  <span class="sr-icon sr-icon--sm sr-icon--inherit"><svg aria-hidden="true" focusable="false"></svg></span>
</button>

Status icons

Clinical status must never be carried by colour or by icon shape alone. Every status icon needs a text label next to it. Staff working at speed, on varied screens, in varied light, read the label.

Allergy: penicillin

Result not yet verified

Discharge summary sent

Referral in progress

<!-- Correct: colour and icon reinforce a label that already says it. -->
<p>
  <span class="sr-icon sr-icon--sm sr-icon--critical"><svg aria-hidden="true" focusable="false"></svg></span>
  Allergy: penicillin
</p>

<!-- Wrong: a bare red icon leaves the meaning to colour and shape alone. -->
<span class="sr-icon sr-icon--sm sr-icon--critical"><svg aria-hidden="true"></svg></span>

When not to use an icon

Do not redraw or edit the SVG paths, and do not rotate an icon to mean something new. If the set does not cover what you need, request the icon rather than improvising one.

Browse the set

Select an icon to copy its name.

Accessibility requirements

RequirementWCAG SCHow Single Record meets itTest method
Decorative icons are not announced1.1.1Icons paired with visible text ship with aria-hidden="true" and focusable="false", so the label is announced once.Screen reader, NVDA and VoiceOver
Standalone icons have an accessible name4.1.2An icon-only control is named on the button or link with aria-label, describing the action rather than the drawing.Screen reader, accessibility inspector
Meaning is not carried by colour alone1.4.1Status icons are always paired with a text label. Colour and shape reinforce the label, they do not replace it.Greyscale review
Icons meet non-text contrast1.4.11Icon colour roles resolve to semantic tokens checked at 3:1 against the surface behind them. The warning role is the one exception and must always be paired with a text label.Automated contrast
Icon controls are large enough to hit2.5.8Icon-only controls use a 44 by 44px target, with the drawing kept at its published size and padding added around it.Measure, touch device
Icons scale with text1.4.4Icons are drawn at 1em and sized from the type scale, so they enlarge with the surrounding text at 200% zoom.Browser zoom to 200%