Skip to content
OX / 01Build on meaning

FHIR R4 · source-first · MIT core

The design system for healthcare.

30 accessible components typed to FHIR R4 — where a missing value, an unrecorded one, and one nobody has read yet are three different things on screen.

Source is copied into your repo. Yours to read, audit and change.

npx @zoblocks/cli add pulse-loader
Browse components
Source copiedWCAG 2.2 AANo runtime deps
Held to
WCAG 2.2 AAReduced motionForced coloursLight + darkToken-themedSSR-safe0 dependencies
Live · the real components

Paced to resting physiology rather than to a spinner: 60 beats a minute, a seven percent beat, nothing above 1.7 Hz. Each one is installed on its own, respects prefers-reduced-motion with a designed still state, and announces the wait in words.

Why this exists

The states your demo skips are the states your users hit.

A generic card renders a value. It has no opinion about a result that came back preliminary, a range that doesn’t exist, a record flagged restricted, or a potassium of 6.8. Those aren’t edge cases. They are Tuesday.

01 / RESULT PROTOCOL
7
STATES

Result states per component

Final, preliminary, corrected, amended, critical, absent, uninterpreted.

02 / LAYOUT SYSTEM
3
MODES

Density modes

Patient-facing, standard admin, and clinical-dense — switchable at any container.

03 / SOURCE RUNTIME
0
ADDED

Runtime dependencies added

The components are source. Nothing sits between you and the render.

New · Data Grid

A worklist is a claim about a population.

Scroll it, sort it, select rows. This is the shipped component, not a picture of one.

Caseload worklist

Adult outpatient · Team 4 · updated 11:47

Program IOP, PHPRisk screen on file

3 results arrived at 11:47 — nothing moved.

Clients on this team's caseload with a raised PHQ-9 or a recent risk screen
Adeyemi, R.4471902IOPIdeation with plan0.82Today 14:00A. Vance
Raman, A.3320145PHPIdeation, no plan0.68Today 15:30A. Vance
Okafor, B.8812004IOPIdeation, no plan0.61Mon 8:30A. Vance
Silva, M.4420931PHPIdeation, no plan0.57Tue 9:00T. Boateng
Mensah, A.7731905PHPIdeation, no plan0.52Mon 13:00T. Boateng
Kowalski, P.5140276IOPIdeation, no plan0.51Fri 12:30A. Vance
Haddad, N.6690321IOPNone reported0.41Fri 18:20K. Marsh
Nguyen, T.1176284IOPIdeation, no plan0.40Thu 16:30A. Vance
Farah, Y.6620158PHPPassive ideation0.40Fri 8:00T. Boateng
Vasquez, I.2214870PHPIdeation, no plan0.39Today 17:10S. Okafor
Weber, J.5567842PHPPassive ideation0.32Thu 12:00T. Boateng
Ortiz, E.2214009IOPPassive ideation0.31Wed 11:30A. Vance
Costa, D.1148936IOPPassive ideation0.25Tue 15:30A. Vance
Bello, F.9963410PHPPassive ideation0.21Wed 16:00T. Boateng
Yusuf, Z.3327469IOPNone reported0.12Mon 10:30A. Vance

15 of 130 clients loaded.

Click a cell and use the arrow keys. Every name and number is invented.

All 14 states

The library

6 components, at the size you would actually use them.

Every one below is the real component, running. Operate it — right-click a patient, type into the date field, throw the switch. Nothing here is a screenshot.

A. Vance, MD — attending

Signed 12 Aug 2026, 16:20 +05:30, on a note whose text hash is stored beside it.

Provenance/9f2c · agent · Practitioner/7

01/Signature

Provenance

It records what was on screen at the moment of signing, so a countersignature can be defended a year later.

  • 22 props
  • Draw, type or certify
  • Bound to what was shown
View Signature

Right-click a row yourself. The header is what the pointer lands on.

Aluel OkonkwoMRN 44-2871 · 34y10:30
Chidi NwosuMRN 44-9013 · 41y11:00
Ama BoatengMRN 44-7755 · 29y11:30

03/Context menu

Patient

It names the record before it offers to change it, so the first thing under the pointer is never a verb.

  • 16 props
  • 4 consequence tiers
  • Withheld is counted, not hidden
View Context menu

Follow-up, 12 Aug 2026. Reviewed by A. Vance, MD.

Chief complaint: six weeks of progressive fatigue and dyspnea.

Signed 12 Aug, 16:20 +05:30.

04/Tabs

Eleven skins over one accessibility tree, so choosing a look is never a choice about whether a keyboard works.

  • 30 props
  • Four semantic modes
  • APG roving tabindex
View Tabs
Contact precautionsGown and gloves on entry.In effectFalls riskAdds the bed sensor to the round list.Not assessed

05/Switch

Flag

Three values, not two: on, off, and nobody has said. The commit is visible, reversible, and survives a conflict.

  • 44 props
  • Third value: unknown
  • Optimistic with rollback
View Switch

Paused.

Mo
Tu
We
Th
Fr
Sa
Su
Mo
Tu
We
Th
Fr
Sa
Su

06/Date & time

Period

One contract behind every temporal control — a range is two clicks with a live preview between them, and nothing reaches your state until Done.

  • 16 variants
  • 8 keystrokes, no calendar
  • Two months, one tab stop
View Date & time

Quality

Claims we are willing to be held to.

Accessibility, stated as a target
WCAG 2.2 AA is the bar, and it is enforced in CI — every page is audited with axe-core in both light and dark on each commit. That check found and fixed four real violations, three of them in the clinical status tokens themselves. Automated testing catches roughly a third of WCAG issues, so keyboard and screen-reader passes remain manual.
Status is never colour alone
Every severity carries an icon, a text label, and a second structural cue. View any component in forced-colors mode: nothing that mattered disappears.
Synthetic data, always
Every fixture, demo, and screenshot uses invented values on reserved example.org systems. No PHI enters this repository, its issues, or its analytics.
What this is not
ZoBlocks is not a compliance boundary. It does not make an application HIPAA, GDPR, or DPDP compliant, and it is not a medical device. It is well-built UI; the clinical and regulatory obligations remain yours.
Zowork

Healthcare engineering services

10+
years in healthcare
50+
EHR integrations
0
clients lost

ZoBlocks is made by Zowork

Healthcare expertise, on your team.

  • AI-native product engineeringWeb, mobile, backend and cloud, end to end
  • Enterprise integrationFHIR, HL7, Epic and Cerner. Legacy modernised in steps
  • Embedded engineering podsSenior engineers who scale with the roadmap
  • AI governance and adoptionHIPAA- and SOC 2-aware AI, with eval pipelines

Clients and work

  • Netsmart

    since 2017

    0incidents, 14-week cutover

    9 yrs

Install one component. See if it holds up.

The core is MIT. Nothing is gated behind an account, and the source lands in your repository where you can read every line before you trust it.

npx @zoblocks/cli add pulse-loader

Run zoblocks init once to say where your @/ alias points. The public catalogue needs no configuration and no account — paid components add a registry namespace and a token.