Home

Awesome

<br> <div align="center"> <img src="assets/demo.gif" alt="numeric-stepper Demo"> </div> <br> <h1 align="center">numeric-stepper</h1> <h3 align="center">A numeric stepper component for <a href="https://reactjs.org">React</a>. Inspired by Ehsan Rahimi's <a href="https://dribbble.com/shots/16434514-Tally-Counter-Micro-Interaction">Tally Counter Micro-Interaction</a> Dribbble shot.</h3> <br> <p align="center"> <a href="https://github.com/anatoliygatt/numeric-stepper/actions?query=workflow%3ACI"> <img src="https://img.shields.io/github/actions/workflow/status/anatoliygatt/numeric-stepper/ci.yml?branch=master&style=for-the-badge&logo=github&label=CI&labelColor=000000" alt="GitHub CI Workflow Status"> </a> <a href="https://www.npmjs.com/package/@anatoliygatt/numeric-stepper"> <img src="https://img.shields.io/npm/v/@anatoliygatt/numeric-stepper.svg?style=for-the-badge&logo=npm&labelColor=000000" alt="NPM Version"> </a> <a href="https://github.com/anatoliygatt/numeric-stepper/blob/master/LICENSE"> <img src="https://img.shields.io/github/license/anatoliygatt/numeric-stepper.svg?style=for-the-badge&logo=opensourceinitiative&logoColor=ffffff&labelColor=000000" alt="License"> </a> </p> <br>

📖 Table of Contents

🚀 Getting Started

🐇 Jump Start

npm install @anatoliygatt/numeric-stepper @emotion/react @emotion/styled framer-motion
import { useState } from 'react';
import { NumericStepper } from '@anatoliygatt/numeric-stepper';

function Example() {
  const INITIAL_VALUE = 20;
  const [value, setValue] = useState(INITIAL_VALUE);
  return (
    <NumericStepper
      minimumValue={10}
      maximumValue={100}
      stepValue={10}
      initialValue={INITIAL_VALUE}
      size="lg"
      inactiveTrackColor="#fed7aa"
      activeTrackColor="#fddec0"
      activeButtonColor="#ffedd5"
      inactiveIconColor="#fb923c"
      hoverIconColor="#ea580c"
      activeIconColor="#9a3412"
      disabledIconColor="#fdba74"
      thumbColor="#f97316"
      thumbShadowAnimationOnTrackHoverEnabled={false}
      focusRingColor="#fff7ed"
      onChange={(value) => {
        setValue(value);
      }}
    />
  );
}

💻 Live Demo

Open in CodeSandbox

⚙️ Configuration

NumericStepper supports the following props:

PropTypeDefault valueDescription
minimumValuenumber0The minimum value.
maximumValuenumberNumber.MAX_SAFE_INTEGERThe maximum value.
stepValuenumber1The step increment value.
initialValuenumberminimumValueThe initial value.
onChangeFunctionundefinedThe callback invoked when the value changes.
sizestringsmThe size of the numeric stepper. There are 3 available sizes:<ul><li>sm — 185x74px</li><li>md — 277.5x111px</li><li>lg — 370x148px</li></ul>
inactiveTrackColorstring#2b2b2bThe color of the track while the thumb is not being horizontally dragged.
activeTrackColorstring#1f1f1fThe color of the track while the thumb is being horizontally dragged and is at the maximum trackable distance from the track's center.
hoverButtonColorstringtransparentThe color of the decrement/increment button in a hover state.
activeButtonColorstring#ecececThe color of the decrement/increment button in an active state.
inactiveIconColorstring#858585The color of the decrement/increment button icon in an inactive state.
hoverIconColorstring#ffffffThe color of the decrement/increment button icon in a hover state.
activeIconColorstring#000000The color of the decrement/increment button icon in an active state.
disabledIconColorstring#383838The color of the decrement/increment button icon in a disabled state.
thumbColorstring#444444The color of the thumb.
thumbLabelColorstring#ffffffThe color of the thumb's label.
thumbShadowAnimation<br>OnTrackHoverEnabledbooleantrueIf true, the thumb's shadow will animate when hovering over the track.
focusRingColorstring#ecececThe color of the focus ring of the interactive elements.

In order to customise the thumb's font settings, we can use CSS, like so:

[data-testid='numeric-stepper-thumb'] {
  font-family: 'Times New Roman', Times, serif;
  font-style: italic;
  font-weight: 800;
}

♿️ Accessibility

In order to comply with the web accessibility standards, we must make use of the decrementButtonAriaLabel and incrementButtonAriaLabel props, like so:

function AccessibleExample() {
  return (
    <NumericStepper
      decrementButtonAriaLabel="Decrement"
      incrementButtonAriaLabel="Increment"
    />
  );
}

Also, we can use a thumbAriaLabel prop to provide a description for the value rendered inside a thumb, like so:

function EnhancedThumbAccessibilityExample() {
  const [value, setValue] = useState(0);
  return (
    <NumericStepper
      thumbAriaLabel={`${value} items`}
      onChange={(value) => {
        setValue(value);
      }}
    />
  );
}

👨🏼‍⚖️ License

MIT