Gecko UIGecko UI

RHFCounterInput

Numeric counter input component integrated with React Hook Form

You are reading the v1 docs. v2 renamed several props and replaced GeckoUIPortal with GeckoUIProvider. Read this page in v2.

Live examples are only rendered in the v2 docs.

RHFCounterInput

A numeric counter input component for React Hook Form with increment/decrement buttons. Supports min/max boundaries, custom step values, and validation.

Installation

import { RHFCounterInput } from '@geckoui/geckoui';

Basic Usage

import { useForm, FormProvider } from 'react-hook-form';
import { RHFCounterInput } from '@geckoui/geckoui';

function Example() {
  const methods = useForm({
    defaultValues: {
      quantity: 1
    }
  });

  return (
    <FormProvider {...methods}>
      <RHFCounterInput name="quantity" min={0} max={10} />
    </FormProvider>
  );
}

Props API

Extends all props from CounterInput component plus:

PropTypeDefaultDescription
namestring-Field name (required)
controlControlAuto-injectedOptional: Pass explicitly for nested forms
rulesRegisterOptions-Inline validation rules
minnumber-InfinityMinimum allowed value
maxnumberInfinityMaximum allowed value
stepnumber1Increment/decrement step
size'sm' | 'md' | 'lg''md'Size variant
onChange(value: number) => void-Change callback
...restCounterInputProps-All CounterInput component props

Examples

With Validation

import { z } from 'zod';
import { zodResolver } from '@hookform/resolvers/zod';

const schema = z.object({
  quantity: z.number().min(1, "Quantity must be at least 1").max(10, "Maximum 10 items")
});

const methods = useForm({
  resolver: zodResolver(schema),
  defaultValues: { quantity: 0 }
});

<RHFInputGroup label="Quantity" required>
  <RHFCounterInput name="quantity" min={0} max={10} />
</RHFInputGroup>

Sizes

<RHFCounterInput name="small" size="sm" />
<RHFCounterInput name="medium" size="md" />
<RHFCounterInput name="large" size="lg" />

Complete Form Example

const schema = z.object({
  adults: z.number().min(1, "At least 1 adult required"),
  children: z.number().min(0),
  rooms: z.number().min(1, "At least 1 room required")
});

const methods = useForm({
  resolver: zodResolver(schema),
  defaultValues: {
    adults: 1,
    children: 0,
    rooms: 1
  }
});

<form onSubmit={methods.handleSubmit(onSubmit)}>
  <RHFInputGroup label="Adults" required>
    <RHFCounterInput name="adults" min={1} max={10} />
  </RHFInputGroup>

  <RHFInputGroup label="Children">
    <RHFCounterInput name="children" min={0} max={10} />
  </RHFInputGroup>

  <RHFInputGroup label="Rooms" required>
    <RHFCounterInput name="rooms" min={1} max={5} />
  </RHFInputGroup>

  <Button type="submit">Book Now</Button>
</form>
  • CounterInput - Base counter input component
  • RHFNumberInput - Number input with text field
  • RHFInputGroup - Form group wrapper with label and error