Number Field

PreviousNext

A numeric input element with increment/decrement buttons and a scrub area.

Docs
roiuiitem

Preview

Loading preview…
registry/brook/ui/number-field/number-field.tsx
"use client";

import { NumberField } from "@base-ui/react/number-field";
import { cn } from "@/lib/utils";
import styles from "./number-field.module.css";

function NumberFieldRoot({ className, ...props }: NumberField.Root.Props) {
  return <NumberField.Root className={cn(styles.root, className)} {...props} />;
}

function NumberFieldGroup({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
  return <div className={cn(styles.group, className)} {...props} />;
}

function NumberFieldInput({ className, ...props }: NumberField.Input.Props) {
  return <NumberField.Input className={cn(styles.input, className)} data-slot="numberfield-input" {...props} />;
}

function NumberFieldIncrement({ className, children, ...props }: NumberField.Increment.Props) {
  return (
    <NumberField.Increment className={cn(styles.increment, className)} data-slot="numberfield-increment" {...props}>
      {children || (
        <svg
          aria-label="Increment"
          className={styles.icon}
          fill="none"
          height="16"
          role="img"
          viewBox="0 0 24 24"
          width="16"
        >
          <path
            d="M12 5v14m-7-7h14"
            stroke="currentColor"
            strokeLinecap="round"
            strokeLinejoin="round"
            strokeWidth="2"
          />
        </svg>
      )}
    </NumberField.Increment>
  );
}

function NumberFieldDecrement({ className, children, ...props }: NumberField.Decrement.Props) {
  return (
    <NumberField.Decrement className={cn(styles.decrement, className)} data-slot="numberfield-decrement" {...props}>
      {children || (
        <svg
          aria-label="Decrement"
          className={styles.icon}
          fill="none"
          height="16"
          role="img"
          viewBox="0 0 24 24"
          width="16"
        >
          <path d="M5 12h14" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" />
        </svg>
      )}
    </NumberField.Decrement>
  );
}

function NumberFieldScrubArea({ className, ...props }: NumberField.ScrubArea.Props) {
  return (
    <NumberField.ScrubArea className={cn(styles.scrubArea, className)} data-slot="numberfield-scrubarea" {...props} />
  );
}

function NumberFieldScrubAreaCursor({ className, ...props }: NumberField.ScrubAreaCursor.Props) {
  return (
    <NumberField.ScrubAreaCursor
      className={cn(styles.scrubAreaCursor, className)}
      data-slot="numberfield-scrubareacursor"
      {...props}
    />
  );
}

export {
  NumberFieldRoot as NumberField,
  NumberFieldDecrement,
  NumberFieldGroup,
  NumberFieldIncrement,
  NumberFieldInput,
  NumberFieldScrubArea,
  NumberFieldScrubAreaCursor,
};

Installation

npx shadcn@latest add @roiui/number-field

Usage

import { NumberField } from "@/components/number-field"
<NumberField />