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

What's new

What changed in each release, and whether you need to do anything about it.

Releases are announced by the design lead. There is no fixed cadence, a release happens when there is something worth shipping.

Versions are pinned in your package.json, deliberately. Nothing changes under you. To take a new release, change the version in all four tarball URLs and run npm install.

The system is 0.x. Minor bumps may contain breaking changes; where they do, this file says so and tells you what to change.

MarkerMeans
Action neededYou have to change something to take this release
OptionalWorth doing, but the previous release keeps working
No actionTake it and carry on

Unreleased

No action to take this, but read the Border/Strong note if you use that token directly.

Search shipped. The system's only search field, Basic, With Button, With Icon Button and Typeahead, with the full WAI-ARIA combobox keyboard model. @dhcw/sr-reactSearch. The Input set's Type=Search variants were removed in Figma on 2026-06-04; use Search with its label / hint / required props rather than wrapping an Input around it. Autocomplete now composes the Search field and the Select listbox.

Tabs gained Level=Secondary, the sub-tab pill, for the second level of a two-level tab structure. A tab with sub-views is a second tablist inside the first tab's panel, never a chevron on a tab.

Tabs overflow now wraps instead of scrolling. A scrolling strip gave no indication that tabs were off-screen. Two defects were fixed at the same time: every tab was roughly twice as wide as its label, and 52px tall rather than the specified 40px. If you were compensating for either, stop.

data-label is gone from Tabs markup. It fed a width-reservation trick that did not work and has been removed. Nothing reads it now.

The Switch's off state is visible now. Its track was Border/Default, so the white thumb was 1.37:1 against it, and the thumb's position is what tells you the switch is off. The track is now Border/Strong. Hover moved to the label (previewing the checked colour would make an off switch look on), and the checked thumb moved to Text/On Fill so it stays white in dark mode.

Border/Strong moved from Grey/600 #4C6272 to Grey/500 #768692. Still clears the 3:1 that SC 1.4.11 requires for a control boundary (3.75:1 on white, 3.44:1 on the page), but reads as an affordance rather than shouting. It affects checkbox and radio rest borders, the switch hover track, the date-picker today ring and Tag/black. Optional: if you hardcoded #4C6272 for a control boundary anywhere, move to the token.


v0.3.0, 2026-09-07

Action needed if you use icons by name. This release renames, retires and adds icons, and corrects the icon token layer. It is the first stable release on npm, latest moves off the release candidate.

`` npm install @dhcw/sr-tokens@0.3.0 @dhcw/sr-icons@0.3.0 @dhcw/sr-web@0.3.0 @dhcw/sr-react@0.3.0 ``

Icons renamed, update these names

WasNow
action/edit2action/edit-note
nav/menu2nav/menu-kebab
nav/morenav/more-horizontal
clinical/lab-resultclinical/test
clinical/crossclinical/treatment
schedule/bookmarkaction/bookmark
schedule/urgentschedule/appointment (the old schedule/appointment is now schedule/calendar)

Icons retired, pick a replacement

GoneUse instead
clinical/diagnosisclinical/result
clinical/consentaction/edit-note
status/alertstatus/warning
action/pauseaction/hold

Each was a second name for a drawing another icon already owned. One glyph now carries one meaning, and the build fails if that stops being true.

Icons whose drawing changed

clinical/referral, clinical/discharge and location/room were reassigned to different glyphs so no drawing means two things. action/scan is unchanged, it was briefly wrong in the repository and has been restored to the framed scanner it has always been.

23 icons added

Including a new device/ domain for mobile hardware (camera, camera-swap, video, torch-on, torch-off), and action/send, action/watchlist, action/bookmark-off, action/expand, action/collapse, action/unlock, clinical/result, clinical/request, clinical/assessment, clinical/attendance, nav/log-out, nav/account, nav/support, nav/feedback, people/demographics, people/patient-search, schedule/calendar, schedule/events.

Icon tokens now reach your platform

Optional, but this is the fix worth knowing about. The semantic icon tokens , sizes, stroke and eight colour roles, were defined but emitted to no platform at all. They now land in CSS, SCSS, XAML and JSON:

``css var(--sr-icon-size-md) var(--sr-icon-stroke) var(--sr-icon-color-subtle) ` `xml {StaticResource SrIconSizeMd} {StaticResource SrIconStroke} {StaticResource SrIconColorSubtle} ``

Stroke is 1, at every size. If you read --icon-stroke-default (2) or IconStrokeDefault (2), stop: those were wrong and are gone. No icon has ever been drawn at 2px. SrIconStroke is now an x:Double, so MAUI can bind it to a Path's StrokeThickness.


v0.2.1-rc.0, 2026-09-03

No action. This is a release candidate, not a release. It exists to prove the npm publishing route end to end before a real version goes out.

It is published under the next tag, which means a version range will not pick it up and nobody receives it without asking for it by name. If you are on v0.2.0, stay there, this changes nothing for you.

Trying it, if you have been asked to

`` npm install @dhcw/sr-tokens@next @dhcw/sr-icons@next @dhcw/sr-web@next @dhcw/sr-react@next ``

No URLs, no credentials. That is the point of the exercise: confirming that a plain npm install works before v0.2.1 goes to latest.

Tell us if the install fails, if anything renders differently from v0.2.0, or if your build resolves a path it did not before.

What changed since v0.2.0

Two accessibility fixes, both of which change what you see:

Plus lighter status surfaces (the 50 step rather than 100), which raises the contrast of text on status banners and tags.

Nothing renames. No markup, class name, token name or component prop moves.


v0.2.0, 2026-08-13

Action needed to upgrade, but only to change the version in four URLs. See "Upgrading" below for a one-liner that does it.

Once installed, no code changes are required: no markup, class name, token name or component prop moves in this release. Icons render lighter and there are new brand marks and icons available. Nothing you already wrote stops working.

Upgrading

From a product repository, run this and commit the result:

`` node -e "const v='0.2.0',f='package.json',s=require('fs');s.writeFileSync(f,s.readFileSync(f,'utf8').replace(/\/download\/v[0-9.]+\/dhcw-sr-([a-z]+)-[0-9.]+\.tgz/g,'/download/v'+v+'/dhcw-sr-$1-'+v+'.tgz'))" && npm install ``

It rewrites both halves of all four URLs. That is the part worth knowing: the version appears twice per dependency, once as the release tag and once in the tarball filename, so a hand-edit is eight values, and changing only the tag produces a URL that 404s. This release's notes carry the same command.

On release frequency. Batching changes into fewer, larger releases is a reasonable response to this friction, but it trades one cost for a worse one: larger releases are harder to review, harder to roll back, and leave products on stale versions for longer. The friction itself is fixable, see "Why the URLs at all" below.

Changed

, and nothing recorded the divergence. 2px read heavier than the text beside it, most visibly on the design-system website.

No action needed: no markup, class name, token or prop changes. Icons simply render lighter.

One thing to know: at 16px a 1px stroke resolves to about two-thirds of a device pixel and goes visibly light. Prefer 20px or 24px for any icon that carries meaning on its own; 16px is fine beside a text label. Do not reintroduce a per-size stroke, size the control up instead.

Added

.NET; this is the route for a MAUI app. Merge SrStyles last, it references keys from the other two. Copying the XAML by hand still works; the merge syntax differs between the two routes.

Known gap


Why the URLs at all

npm cannot install a single workspace out of a git repository, so tarballs attached to a release are the standard answer while these packages are not on a registry. The cost is the URL editing above.

A registry removes it entirely, npm update and nothing to edit, ever. examined GitHub Packages for this and rejected it for npm: it requires the package scope to equal the owning account (@dhcw versus DHCW-Digital-Health-and-Care-Wales), and it requires an access token for every install, which would replace a credential-free install with one that needs a PAT in every developer's .npmrc and every Azure DevOps pipeline.

npmjs.org is the route that would work: public scoped packages, anonymous install, @dhcw preserved. The open question is whether the @dhcw scope is available there. That is worth answering if release friction is shaping how often the design system ships.


v0.1.1, 2026-08-12

Optional. v0.1.0 keeps working. Two of these are worth taking when you have a moment.

Added

Changed

```diff

Every React component already imports its own stylesheet, so the complete file was shipping all 21 component stylesheets plus a duplicate of each one you used. On a screen using seven components that is 238KB before, 131KB after, identical styling, 45% less of it.

Nothing renders differently. If you do not make this change, everything keeps working exactly as it does now.

Plain HTML keeps single-record.css. With no bundler there is nothing to assemble the per-component files, and one <link> working is the whole point of that file.

Fixed


v0.1.0, 2026-08-11

The first installable release. Action needed if you followed an earlier guide, see below.

Added

``json "dependencies": { "@dhcw/sr-tokens": "../releases/download/v0.1.0/dhcw-sr-tokens-0.1.0.tgz", "@dhcw/sr-icons": "../releases/download/v0.1.0/dhcw-sr-icons-0.1.0.tgz", "@dhcw/sr-web": "../releases/download/v0.1.0/dhcw-sr-web-0.1.0.tgz", "@dhcw/sr-react": "../releases/download/v0.1.0/dhcw-sr-react-0.1.0.tgz" } ``

All four are required, the React package depends on the other three.

Fixed

`` npm install github:DHCW-../single-record-design-system#main "@dhcw/sr-react": "github:DHCW-../single-record-design-system#main" ``

They appear to install and then throw ERR_MODULE_NOT_FOUND on import. npm cannot install a single workspace out of a git repository.

If your package.json still has a github: dependency, or your Vite config has resolve.alias entries pointing inside node_modules/@dhcw, replace them with the tarball URLs above and delete the aliases.

Known gaps

The website records the full picture of what is documented, built and published.