Rating
Overviewimport { Rating, RatingAlignment, RatingBar, RatingBarArea, RatingBarLabels, RatingBarType } from '@nili/ui';This is the library’s own overview page, rendered live. Switch the language or the theme in the header and it follows.
Interactive
A set of radios under the glyphs, so arrow keys work and the value submits with the form. name ties it to a native submission.
import { Rating } from "@nili/ui"
export function Example() {
const [score, setScore] = useState(4)
return (
<Rating
value={score}
onValueChange={setScore}
name="score"
labels={{
root: "Rate this article",
item: (score) => `${score} stars`,
}}
/>
)
}Read-only
Display only — an average, a review score. Renders a single image role instead of a set of radios, and accepts fractional values, so 4.5 draws half a star.
import { Rating } from "@nili/ui"
export function Example() {
return (
<>
<Rating readOnly value={4.5} showValue />
<Rating
readOnly
value={4.5}
valueLabel={t('reviews')}
labels={{ summary: (value, max) => `${value} out of ${max}` }}
/>
</>
)
}Glyph and empty state
type picks star or heart and drives the colour. empty chooses between the outline and a filled grey glyph — the second reads better on a busy surface.
import { Rating } from "@nili/ui"
export function Example() {
return (
<>
<Rating type="star" defaultValue={3} />
<Rating type="heart" defaultValue={3} />
<Rating type="star" empty="filled" defaultValue={3} />
<Rating max={10} defaultValue={7} />
</>
)
}Rating & Review
alignment is Figma’s Rating & Review block: ratings is the bare row, vertical puts the description under it, horizontal beside it.
import { Rating, LinkButton } from "@nili/ui"
export function Example() {
return (
<>
<Rating
readOnly
value={4.5}
alignment="vertical"
showValue
description="Based on 128 reviews from verified buyers."
linkButton={<LinkButton href="#" size="sm">Read reviews</LinkButton>}
/>
<Rating
readOnly
value={4.5}
alignment="horizontal"
description="128 reviews"
/>
</>
)
}Rating Bar
A five-point satisfaction scale — the survey control, not the star row. Four types, and the digits follow the locale.
import { RatingBar } from "@nili/ui"
export function Example() {
return (
<>
<RatingBar type="emoji" labels={{ root: "How was it?" }} />
<RatingBar type="number" labels={{ root: "How was it?" }} />
<RatingBar type="star" labels={{ root: "How was it?" }} />
<RatingBar type="heart" labels={{ root: "How was it?" }} />
</>
)
}Rating Bar with a comment
The whole survey block: the scale plus a free-text field. commentLabel is required when the comment is shown — a bare textarea has nothing to name it.
import { RatingBarArea } from "@nili/ui"
export function Example() {
return (
<RatingBarArea
type="emoji"
labels={{ root: "How was your experience?" }}
commentLabel="Tell us more"
commentPlaceholder="Tell us why!"
/>
)
}Rating
extends Omit< ComponentPropsWithoutRef<'div'>, 'onChange' | 'defaultValue' | 'color' >
Other props
| Prop | Type | Default | Notes |
|---|---|---|---|
| children | ReactNode | — | |
| aria-label | string | — | |
| value | number | — | Current score. Controlled. |
| defaultValue | number | 0 | |
| onValueChange | (value: number) => void | — | |
| max | number | 5 | Number of items. |
| type | star | heart | star | Figma's Type. Drives the glyph and its colour. |
| empty | filled | line | line | Which empty glyph to draw. Figma's `Empty Line` / `Empty Filled`. |
| readOnly | boolean | false | Display only — an average, a review score. Renders a single `role="img"` instead of a set of radios, and accepts fractional values. |
| disabled | boolean | false | |
| icon | ReactNode | — | Replaces the glyph the `type` would pick. |
| emptyIcon | ReactNode | — | Empty-state glyph, when it is not simply the outline of `icon`. |
| showValue | boolean | false | Shows the numeric score beside the items. |
| valueLabel | ReactNode | — | Replaces the readout — `'4.5 (128 reviews)'`, a count, anything. |
| name | string | — | `name` for the underlying radios, when the form is submitted natively. |
| locale | string | — | BCP-47 tag driving the digits (`'fa'` → Persian). Defaults to the ambient locale from `NiliProvider`. |
| labels | RatingLabels | — | |
| alignment | horizontal | vertical | ratings | ratings | Figma's `Rating & Review` → Alignment. `ratings` is the bare row; `vertical` and `horizontal` place `description` below it or beside it. |
| description | ReactNode | — | Supporting copy. Figma's "Description". |
| linkButton | ReactNode | — | Action under the score. Figma's "Link Button". |
RatingBar
Other props
| Prop | Type | Default | Notes |
|---|---|---|---|
| type | number | emoji | star | heart | star | Figma `🧩 Type`. |
| count | number | 5 | How many options. Figma draws five; the count is yours. |
| value | number | null | — | |
| defaultValue | number | null | — | |
| onValueChange | (value: number) => void | — | |
| disabled | boolean | false | |
| emojis | readonly ReactNode[] | — | Overrides the emoji set. Must be at least `count` long. |
| locale | string | — | Digits follow the locale, so `4` renders in Persian digits under `fa`. |
| labels | RatingBarLabels | — | |
| name | string | — | |
| id | string | — | |
| className | string | — |
RatingBarArea
extends RatingBarProps
Other props
| Prop | Type | Default | Notes |
|---|---|---|---|
| commentPlaceholder | string | — | The comment field's placeholder — Figma's "Tell us why!". |
| commentLabel | string | — | Accessible name for the comment field. Required if the comment is shown. |
| comment | string | — | |
| defaultComment | string | ||
| onCommentChange | (comment: string) => void | — | |
| showComment | boolean | true | Hides the comment box, leaving a bordered scale. |
| rows | number | 4 | |
| footer | ReactNode | — | |
| rootClassName | string | — | |
| type | number | emoji | star | heart | — | Figma `🧩 Type`. |
| count | number | — | How many options. Figma draws five; the count is yours. |
| value | number | null | — | |
| defaultValue | number | null | — | |
| onValueChange | (value: number) => void | — | |
| disabled | boolean | — | |
| emojis | readonly ReactNode[] | — | Overrides the emoji set. Must be at least `count` long. |
| locale | string | — | Digits follow the locale, so `4` renders in Persian digits under `fa`. |
| labels | RatingBarLabels | — | |
| name | string | — | |
| id | string | — | |
| className | string | — |
RatingFill
internalVariant axes — from the component’s cva definition
| Prop | Type | Default | Notes |
|---|---|---|---|
| type | star | heart | star |
RatingGlyph
internalRatingInput
internalRatingItem
internalVariant axes — from the component’s cva definition
| Prop | Type | Default | Notes |
|---|---|---|---|
| interactive | 'true' | 'false' | false | |
| disabled | 'true' | 'false' | false | |
| empty | line | filled | line |
RatingReview
internalVariant axes — from the component’s cva definition
| Prop | Type | Default | Notes |
|---|---|---|---|
| alignment | ratings | vertical | horizontal | ratings |