Result states per component
Final, preliminary, corrected, amended, critical, absent, uninterpreted.
FHIR R4 · source-first · MIT core
Pass a FHIR Observation[] and get reference ranges, interpretation flags, and the uninterpreted case handled correctly. The source is copied into your repo — yours to read, audit, and change.
pnpm dlx shadcn@latest add @oxygenui/vitals-panel| Test | Result | Reference | Interpretation |
|---|---|---|---|
Heart rate | 72 beats/min | 60 – 100 beats/min | Normal |
Hemoglobin | 10.2 g/dL | 12 – 15.5 g/dL | Low |
Ferritin | 43 ng/mL | Not interpreted |
Everything present and interpreted. The easy case — and the only one most libraries ship.
Why this exists
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.
Final, preliminary, corrected, amended, critical, absent, uninterpreted.
Patient-facing, standard admin, and clinical-dense — switchable at any container.
The components are source. Nothing sits between you and the render.
The difference
Not a feature list — the actual output. The left panel is written the way the hand-rolled example in our docs is written, and every defect it produces follows directly from that code.
1 critical result in this panel.
| Test | Result | Reference | Interpretation |
|---|---|---|---|
Potassium | 6.8 mmol/L | 3.5 – 5.1 mmol/L | Critical high |
Blood pressure | 2 parts | High | |
| Systolic | 168 mmHg | 90 – 130 mmHg | High |
| Diastolic | 82 mmHg | 60 – 85 mmHg | Normal |
Ferritin | 43 ng/mL | Not interpreted | |
White blood cell count | White blood cell count, Not known— Specimen hemolyzed — recollect | Not interpreted | |
TSH Preliminary | 5.9 mIU/L | 0.4 – 4 mIU/L | High |
Blood pressure resolves to its components and escalates to the worst of them. The absent result states why. Ferritin reads Not interpreted, never Normal. The critical potassium carries a badge, a rule, and a live-region announcement — and preliminary stays labelled preliminary.
Catalog
No adapter layer, no bespoke prop shape to learn. If your server speaks FHIR, the component is already typed for it.
dataAbsentReason
Renders absence as a statement. Withheld, not asked, declined, and errored are different facts and never share a dash.
AuditEvent
Two-step confirmation that names the consequence and the patient, then emits an audit event.
DetectedIssue
Severity tiers as an interruption budget. Only critical may take focus.
AllergyIntolerance
Criticality and verification status, with no-known-allergies as its own state.
PractitionerRole
Navigation composed from permissions, patient context as a landmark, and guarded context changes.
Appointment
Booked, pending, cancelled, no-show. Time zone is a required prop, not a guess.
CareTeam
Everyone involved, and who is actually reachable now.
Loading shaped like layout, never like a value — plus progressive sections that keep partial failure visible.
dateTime · instant
A clinical instant with a required time zone, honouring FHIR partial-date precision.
Quantity
One measured quantity, unit, and comparator as a single atomic element that cannot drift apart.
Consent
Resuscitation status and directives. Unknown is loud, never a silent default to full code.
CodeableConcept
A coded concept with its coding one interaction away, and honest about what is missing.
Condition
Problem list that separates active from resolved and never promotes a provisional diagnosis.
Coverage
Effective state derived from status and period together — an active record past its end date reads as lapsed.
Sets the spacing and target-size contract for a subtree. Density changes spacing, never which facts appear.
Dosage
Dose entry with ISMP formatting rules, plausibility separated from hard limits, and visible arithmetic.
Five reasons a section shows nothing. An unavailable section is never rendered as an empty one.
OperationOutcome
Contains a failure to one section and never renders a partial record as a complete one.
Patient
Compact, privacy-aware representation of a person, built around confirming rather than labelling.
MedicationRequest
Dose, route, schedule, and status. Held, stopped, and expired are distinct — not one greyed-out style.
Patient
Persistent identity header for a clinical screen, driven by a FHIR Patient resource.
Composition
One-screen pre-encounter summary where every section carries its own recency and failure.
Flag
What staff must do before entering the room, ordered by required action.
Provenance
Who recorded this, when, from where, and whether it has been amended.
Observation.referenceRange
Positions a result against its own range, and refuses to draw when no bound was stated.
Consent · meta.security
Redacted by default. Discloses only with a stated reason, on a timer, and can conceal that content exists.
The shared severity chip. Critical reads identically on a lab result, a medication, and an allergy.
Stops clinical documentation being lost to a navigation, a patient switch, or a closed tab.
Observation[]
Results table with reference ranges and interpretation. Uninterpreted results stay uninterpreted.
Quality
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.
pnpm dlx shadcn@latest add @oxygenui/vitals-panel@oxygenui is a shadcn registry namespace — add "@oxygenui": "https://oxygenui.design/r/{name}.json" to your components.json once, or pass the full URL instead.