React Setpoint Control

A slider is fine for volume. It is the wrong control for a reactor temperature, where a fat-fingered drag is a safety event. This is numeric entry that clamps to limits, requires an explicit confirm, and then ramps the process value toward the target the way a real controller does.

Reactor temperature

Process value

185°C

Setpoint

185°C

20320

Changes ramp at 12 °C/s.

Feed flow rate

Locked

Process value

42.5L/min

Setpoint

42.5L/min

0.080.0

Interlock: coolant flow permissive not met.

Installation

npx shadcn@latest add "https://kelvinui.com/registry/setpoint-control.json"

Props

PropTypeDescription
label unitstringName and engineering unit
valuenumberCurrent process value
min maxnumberHard limits — entry is clamped
stepnumberNudge-button increment
rampRatenumberMax change per second; larger moves ramp over time
precisionnumberDisplayed decimal places
disabledbooleanLock the control (e.g. from an interlock)
disabledReasonstringWhy it's locked
Fired on confirmed apply

Why the extra steps are the point

Every friction in this control is deliberate, because the failure mode it guards against is a wrong value sent to real equipment:

  • Clamping happens on entry, not on submit — you cannot even type your way past a limit into a confirmable state.
  • Apply is two-stage. The first press arms a confirm; the confirm button is styled as destructive because committing a setpoint to a live process is a consequential act. A slider offers no such moment.
  • The value ramps. On confirm, the displayed process value eases toward the target over a time proportional to the distance and rampRate, mirroring how the real loop will move — an operator watching a step jump would rightly distrust the display.

Pair it with an Interlock Chain: pass disabled when a permissive isn't met, and put the failing condition in disabledReason, as the second card in the demo shows. The control should be dead until it is safe to move.

New components every week

Get the week's new Kelvin UI components and templates in one short email. No spam, unsubscribe anytime.