Skip to main content

Rating

A visual input component that allows users to select a rating value using icons (typically stars). It supports controlled and uncontrolled modes, fractional selection, keyboard interaction, and custom icon rendering.


Usage

Basic usage

import { Rating } from '@nofinite/nui';
export function Example() {
return <Rating defaultValue={3} />;
}

Controlled usage

const [value, setValue] = useState(4);

<Rating value={value} onChange={setValue} />;

Half rating

<Rating defaultValue={3.5} allowHalf />

Read-only display

<Rating value={4.2} readOnly />

Custom icons

<Rating icon={<HeartOutline />} iconFilled={<HeartFilled />} />

Props

PropTypeDefaultDescription
valuenumber Controlled rating value
defaultValuenumber 0Initial uncontrolled value
maxnumber 5Maximum rating items
onChange(value: number) => voidCalled when value changes
iconReactNode star outlineEmpty icon
iconFilledReactNode filled starFilled icon
size'sm' | 'md' | 'lg' mdComponent size
readOnlyboolean falsePrevent interaction but show value
disabledboolean falseDisable interaction and reduce opacity
allowHalfboolean falseEnable half-step selection
classNamestring Additional class names

Extends HTMLDivElement attributes (excluding onChange).


Variants

Sizes

<Rating size="sm" />
<Rating size="md" />
<Rating size="lg" />

Available variants

  • sm
  • md
  • lg

Guidelines

  • Use sm inside dense layouts (tables, cards)
  • Use md as default
  • Use lg for emphasis or hero sections

States

  • Default
  • Hover preview (temporary fill during pointer move)
  • Focus visible (keyboard focus ring)
  • Read-only
  • Disabled
  • Fractional display
  • Controlled vs uncontrolled value

Keyboard Interaction

KeyBehavior
ArrowRight / ArrowUpIncrease rating (step = 1 or 0.5)
ArrowLeft / ArrowDownDecrease rating
HomeSet to minimum (0)
EndSet to maximum

Component uses role="slider" semantics.


Accessibility

  • Uses slider pattern with:

    • aria-valuemin
    • aria-valuemax
    • aria-valuenow
    • aria-disabled
    • aria-readonly
  • Keyboard operable

  • Focus visible outline

  • Tab navigation disabled when readOnly or disabled


Design Tokens

TokenUsage
--nui-space-1Gap between icons
--nui-font-sansTypography
--nui-color-primaryFocus ring
--nui-border-defaultEmpty icon color
--nui-color-warningFilled icon color
--nui-radius-smFocus outline radius

Best Practices

Do

  • Use half rating when precision matters (reviews)
  • Use readOnly for aggregated scores
  • Keep max ≤ 10 to avoid cognitive overload
  • Use custom icons for domain-specific ratings

Don’t

  • Use rating as the only feedback control for critical flows
  • Combine disabled and readOnly simultaneously unless intentional
  • Allow fractional ratings without clear visual affordance
  • Overuse large size in dense UI contexts