Form

Number Field

Numeric input with steppers and a scrubbable label. Hold to repeat.

Scrub the label sideways, or hold a stepper and let it run.

Show code
"use client";

import { Label } from "@/registry/lilt/ui/label";
import {
  NumberField,
  NumberFieldDecrement,
  NumberFieldGroup,
  NumberFieldIncrement,
  NumberFieldInput,
  NumberFieldScrubArea,
} from "@/registry/lilt/ui/number-field";

export default function NumberFieldDemo() {
  return (
    <NumberField
      className="flex flex-col items-start gap-2"
      defaultValue={3}
      id="number-field-demo"
      max={20}
      min={0}
    >
      <NumberFieldScrubArea>
        <Label className="cursor-ew-resize" htmlFor="number-field-demo">
          Seedlings
        </Label>
      </NumberFieldScrubArea>
      <NumberFieldGroup>
        <NumberFieldDecrement />
        <NumberFieldInput />
        <NumberFieldIncrement />
      </NumberFieldGroup>
      <p className="text-sm text-[var(--lilt-text-muted)]">
        Scrub the label sideways, or hold a stepper and let it run.
      </p>
    </NumberField>
  );
}

Installation

npx shadcn@latest add @lilt/number-field

Accessibility

  • Arrow keys step, Shift+Arrow steps by 10; values clamp to min/max and steppers repeat on hold.
  • The scrub label still works as a plain label for assistive tech — scrubbing is pointer-only sugar.