# Rating Group URL: https://ark-ui.com/docs/components/rating-group Source: https://raw.githubusercontent.com/chakra-ui/ark/refs/heads/main/website/src/content/pages/components/rating-group.mdx Allows users to rate items using a set of icons. --- ## Anatomy To set up the rating correctly, you'll need to understand its anatomy and how we name its parts. > Each part includes a `data-part` attribute to help identify them in the DOM. ## Examples Learn how to use the `RatingGroup` component in your project. Let's take a look at the most basic example: **Example: basic** #### React ```tsx import { RatingGroup } from '@ark-ui/react/rating-group' import { StarIcon } from 'lucide-react' export const Basic = () => ( Label {({ items }) => items.map((item) => ( {({ highlighted }) => (highlighted ? : )} )) } ) ``` #### Solid ```tsx import { RatingGroup } from '@ark-ui/solid/rating-group' import { StarIcon } from 'lucide-solid' import { Index, Show } from 'solid-js' export const Basic = () => ( Label {(context) => ( {(index) => ( {(context) => ( }> )} )} )} ) ``` #### Vue ```vue ``` #### Svelte ```svelte Label {#snippet render(ratingGroup)} {#each ratingGroup().items as item} {#snippet render(itemState)} {#if itemState().highlighted} {:else} {/if} {/snippet} {/each} {/snippet} ``` ### Using half ratings Allow `0.5` value steps by setting the `allowHalf` prop to `true`. Ensure to render the correct icon if the `isHalf` value is set in the Rating components render callback. **Example: half-ratings** #### React ```tsx import { RatingGroup } from '@ark-ui/react/rating-group' import { StarHalfIcon, StarIcon } from 'lucide-react' export const HalfRatings = () => ( Label {({ items }) => items.map((item) => ( {({ half, highlighted }) => { if (half) return if (highlighted) return return }} )) } ) ``` #### Solid ```tsx import { RatingGroup } from '@ark-ui/solid/rating-group' import { StarHalfIcon, StarIcon } from 'lucide-solid' import { Index } from 'solid-js' export const HalfRatings = () => ( Label {(context) => ( {(index) => ( {(context) => context().half ? ( ) : context().highlighted ? ( ) : ( ) } )} )} ) ``` #### Vue ```vue ``` #### Svelte ```svelte Label {#snippet render(ratingGroup)} {#each ratingGroup().items as item (item)} {#snippet render(itemState)} {#if itemState().half} {:else if itemState().highlighted} {:else} {/if} {/snippet} {/each} {/snippet} ``` ### Using a default value **Example: initial-value** #### React ```tsx import { RatingGroup } from '@ark-ui/react/rating-group' import { StarIcon } from 'lucide-react' export const InitialValue = () => ( Label {({ items }) => items.map((item) => ( {({ highlighted }) => (highlighted ? : )} )) } ) ``` #### Solid ```tsx import { RatingGroup } from '@ark-ui/solid/rating-group' import { StarIcon } from 'lucide-solid' import { Index, Show } from 'solid-js' export const InitialValue = () => ( Label {(context) => ( {(index) => ( {(context) => ( }> )} )} )} ) ``` #### Vue ```vue ``` #### Svelte ```svelte Label {#snippet render(ratingGroup)} {#each ratingGroup().items as item (item)} {#snippet render(itemState)} {#if itemState().highlighted} {:else} {/if} {/snippet} {/each} {/snippet} ``` ### Controlled When using the `RatingGroup` component, you can use the `value` and `onValueChange` props to control the state. **Example: controlled** #### React ```tsx import { RatingGroup } from '@ark-ui/react/rating-group' import { StarIcon } from 'lucide-react' import { useState } from 'react' export const Controlled = () => { const [value, setValue] = useState(0) return ( setValue(details.value)} allowHalf> Label {({ items }) => items.map((item) => ( {({ highlighted }) => (highlighted ? : )} )) } ) } ``` #### Solid ```tsx import { RatingGroup } from '@ark-ui/solid/rating-group' import { StarIcon } from 'lucide-solid' import { Index, Show, createSignal } from 'solid-js' export const Controlled = () => { const [value, setValue] = createSignal(0) return ( setValue(details.value)}> Label {(context) => ( {(index) => ( {(context) => ( }> )} )} )} ) } ``` #### Vue ```vue ``` #### Svelte ```svelte Label {#snippet render(ratingGroup)} {#each ratingGroup().items as item} {#snippet render(itemState)} {#if itemState().highlighted} {:else} {/if} {/snippet} {/each} {/snippet} ``` ### Disabling the rating group To make the rating group disabled, set the `disabled` prop to `true`. **Example: disabled** #### React ```tsx import { RatingGroup } from '@ark-ui/react/rating-group' import { StarIcon } from 'lucide-react' export const Disabled = () => ( Label {({ items }) => items.map((item) => ( {({ highlighted }) => (highlighted ? : )} )) } ) ``` #### Solid ```tsx import { RatingGroup } from '@ark-ui/solid/rating-group' import { StarIcon } from 'lucide-solid' import { Index, Show } from 'solid-js' export const Disabled = () => ( Label {(context) => ( {(index) => ( {(context) => ( }> )} )} )} ) ``` #### Vue ```vue ``` #### Svelte ```svelte Label {#snippet render(ratingGroup)} {#each ratingGroup().items as item} {#snippet render(itemState)} {#if itemState().highlighted} {:else} {/if} {/snippet} {/each} {/snippet} ``` ### Readonly rating group To make the rating group readonly, set the `readOnly` prop to `true`. **Example: read-only** #### React ```tsx import { RatingGroup } from '@ark-ui/react/rating-group' import { StarIcon } from 'lucide-react' export const ReadOnly = () => ( Label {({ items }) => items.map((item) => ( {({ highlighted }) => (highlighted ? : )} )) } ) ``` #### Solid ```tsx import { RatingGroup } from '@ark-ui/solid/rating-group' import { StarIcon } from 'lucide-solid' import { Index, Show } from 'solid-js' export const ReadOnly = () => ( Label {(context) => ( {(index) => ( {(context) => ( }> )} )} )} ) ``` #### Vue ```vue ``` #### Svelte ```svelte Label {#snippet render(ratingGroup)} {#each ratingGroup().items as item} {#snippet render(itemState)} {#if itemState().highlighted} {:else} {/if} {/snippet} {/each} {/snippet} ``` ### Usage within forms To use the rating group within forms, pass the prop `name`. It will render a hidden input and ensure the value changes get propagated to the form correctly. **Example: form-usage** #### React ```tsx import { RatingGroup } from '@ark-ui/react/rating-group' import { StarIcon } from 'lucide-react' export const FormUsage = () => ( Label {({ items }) => items.map((item) => ( {({ highlighted }) => (highlighted ? : )} )) } ) ``` #### Solid ```tsx import { RatingGroup } from '@ark-ui/solid/rating-group' import { StarIcon } from 'lucide-solid' import { Index, Show } from 'solid-js' export const FormUsage = () => ( Label {(context) => ( {(index) => ( {(context) => ( }> )} )} )} ) ``` #### Vue ```vue ``` #### Svelte ```svelte Label {#snippet render(ratingGroup)} {#each ratingGroup().items as item (item)} {#snippet render(itemState)} {#if itemState().highlighted} {:else} {/if} {/snippet} {/each} {/snippet} ``` ### Using the Field Component The `Field` component helps manage form-related state and accessibility attributes of a rating group. It includes handling ARIA labels, helper text, and error text to ensure proper accessibility. **Example: with-field** #### React ```tsx import { Field } from '@ark-ui/react/field' import { RatingGroup } from '@ark-ui/react/rating-group' import { StarIcon } from 'lucide-react' export const WithField = (props: Field.RootProps) => { return ( Label {({ items }) => items.map((item) => ( {({ highlighted }) => (highlighted ? : )} )) } Additional Info Error Info ) } ``` #### Solid ```tsx import { Field } from '@ark-ui/solid/field' import { RatingGroup } from '@ark-ui/solid/rating-group' import { StarIcon } from 'lucide-solid' import { Index, Show } from 'solid-js' export const WithField = (props: Field.RootProps) => { return ( Label {(context) => ( {(index) => ( {(context) => ( }> )} )} )} Additional Info Error Info ) } ``` #### Vue ```vue ``` #### Svelte ```svelte Label {#snippet render(ratingGroup)} {#each ratingGroup().items as item} {#snippet render(itemState)} {#if itemState().highlighted} {:else} {/if} {/snippet} {/each} {/snippet} Additional Info Error Info ``` ### Using the Root Provider The `RootProvider` component provides a context for the rating-group. It accepts the value of the `useRating-group` hook. You can leverage it to access the component state and methods from outside the rating-group. **Example: root-provider** #### React ```tsx import { RatingGroup, useRatingGroup } from '@ark-ui/react/rating-group' import { StarIcon } from 'lucide-react' export const RootProvider = () => { const ratingGroup = useRatingGroup({ count: 5, defaultValue: 3 }) return ( <> Label {({ items }) => items.map((item) => ( {({ highlighted }) => (highlighted ? : )} )) } ) } ``` #### Solid ```tsx import { RatingGroup, useRatingGroup } from '@ark-ui/solid/rating-group' import { StarIcon } from 'lucide-solid' import { Index, Show } from 'solid-js' export const RootProvider = () => { const ratingGroup = useRatingGroup({ count: 5, value: 3 }) return ( <> Label {(context) => ( {(index) => ( {(context) => ( }> )} )} )} ) } ``` #### Vue ```vue ``` #### Svelte ```svelte Label {#snippet render(ratingGroup)} {#each ratingGroup().items as item} {#snippet render(itemState)} {#if itemState().highlighted} {:else} {/if} {/snippet} {/each} {/snippet} ``` > If you're using the `RootProvider` component, you don't need to use the `Root` component. ## API Reference ### Props **Component API Reference** #### React **Root Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `allowHalf` | `boolean` | No | Whether to allow half stars. | | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `autoFocus` | `boolean` | No | Whether to autofocus the rating. | | `count` | `number` | No | The total number of ratings. | | `defaultValue` | `number` | No | The initial value of the rating when rendered. Use when you don't need to control the value of the rating. | | `disabled` | `boolean` | No | Whether the rating is disabled. | | `form` | `string` | No | The associate form of the underlying input element. | | `id` | `string` | No | The unique identifier of the machine. | | `ids` | `Partial<{ root: string label: string hiddenInput: string control: string item: (id: string) => string }>` | No | The ids of the elements in the rating. Useful for composition. | | `name` | `string` | No | The name attribute of the rating element (used in forms). | | `onHoverChange` | `(details: HoverChangeDetails) => void` | No | Function to be called when the rating value is hovered. | | `onValueChange` | `(details: ValueChangeDetails) => void` | No | Function to be called when the rating value changes. | | `readOnly` | `boolean` | No | Whether the rating is readonly. | | `required` | `boolean` | No | Whether the rating is required. | | `translations` | `IntlTranslations` | No | Specifies the localized strings that identifies the accessibility elements and their states | | `value` | `number` | No | The controlled value of the rating | **Control Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Control Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | rating-group | | `[data-part]` | control | | `[data-readonly]` | Present when read-only | | `[data-disabled]` | Present when disabled | **HiddenInput Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Item Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `index` | `number` | Yes | | | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Item Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | rating-group | | `[data-part]` | item | | `[data-disabled]` | Present when disabled | | `[data-readonly]` | Present when read-only | | `[data-checked]` | Present when checked | | `[data-highlighted]` | Present when highlighted | | `[data-half]` | | **Label Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Label Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | rating-group | | `[data-part]` | label | | `[data-disabled]` | Present when disabled | | `[data-required]` | Present when required | **RootProvider Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `value` | `UseRatingGroupReturn` | Yes | | | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | #### Solid **Root Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `allowHalf` | `boolean` | No | Whether to allow half stars. | | `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `autoFocus` | `boolean` | No | Whether to autofocus the rating. | | `count` | `number` | No | The total number of ratings. | | `defaultValue` | `number` | No | The initial value of the rating when rendered. Use when you don't need to control the value of the rating. | | `disabled` | `boolean` | No | Whether the rating is disabled. | | `form` | `string` | No | The associate form of the underlying input element. | | `ids` | `Partial<{ root: string label: string hiddenInput: string control: string item: (id: string) => string }>` | No | The ids of the elements in the rating. Useful for composition. | | `name` | `string` | No | The name attribute of the rating element (used in forms). | | `onHoverChange` | `(details: HoverChangeDetails) => void` | No | Function to be called when the rating value is hovered. | | `onValueChange` | `(details: ValueChangeDetails) => void` | No | Function to be called when the rating value changes. | | `readOnly` | `boolean` | No | Whether the rating is readonly. | | `required` | `boolean` | No | Whether the rating is required. | | `translations` | `IntlTranslations` | No | Specifies the localized strings that identifies the accessibility elements and their states | | `value` | `number` | No | The controlled value of the rating | **Control Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Control Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | rating-group | | `[data-part]` | control | | `[data-readonly]` | Present when read-only | | `[data-disabled]` | Present when disabled | **HiddenInput Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'input'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Item Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `index` | `number` | Yes | | | `asChild` | `(props: ParentProps<'span'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Item Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | rating-group | | `[data-part]` | item | | `[data-disabled]` | Present when disabled | | `[data-readonly]` | Present when read-only | | `[data-checked]` | Present when checked | | `[data-highlighted]` | Present when highlighted | | `[data-half]` | | **Label Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'label'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Label Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | rating-group | | `[data-part]` | label | | `[data-disabled]` | Present when disabled | | `[data-required]` | Present when required | **RootProvider Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `value` | `UseRatingGroupReturn` | Yes | | | `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | #### Vue **Root Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `allowHalf` | `boolean` | No | Whether to allow half stars. | | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `autoFocus` | `boolean` | No | Whether to autofocus the rating. | | `count` | `number` | No | The total number of ratings. | | `defaultValue` | `number` | No | The initial value of the rating when rendered. Use when you don't need to control the value of the rating. | | `disabled` | `boolean` | No | Whether the rating is disabled. | | `form` | `string` | No | The associate form of the underlying input element. | | `id` | `string` | No | The unique identifier of the machine. | | `ids` | `Partial<{ root: string label: string hiddenInput: string control: string item(id: string): string }>` | No | The ids of the elements in the rating. Useful for composition. | | `modelValue` | `number` | No | The v-model value of the rating group | | `name` | `string` | No | The name attribute of the rating element (used in forms). | | `readOnly` | `boolean` | No | Whether the rating is readonly. | | `required` | `boolean` | No | Whether the rating is required. | | `translations` | `IntlTranslations` | No | Specifies the localized strings that identifies the accessibility elements and their states | **Control Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Control Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | rating-group | | `[data-part]` | control | | `[data-readonly]` | Present when read-only | | `[data-disabled]` | Present when disabled | **HiddenInput Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Item Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `index` | `number` | Yes | | | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Item Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | rating-group | | `[data-part]` | item | | `[data-disabled]` | Present when disabled | | `[data-readonly]` | Present when read-only | | `[data-checked]` | Present when checked | | `[data-highlighted]` | Present when highlighted | | `[data-half]` | | **Label Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Label Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | rating-group | | `[data-part]` | label | | `[data-disabled]` | Present when disabled | | `[data-required]` | Present when required | **RootProvider Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `value` | `RatingGroupApi` | Yes | | | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | #### Svelte **Root Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `allowHalf` | `boolean` | No | Whether to allow half stars. | | `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `autoFocus` | `boolean` | No | Whether to autofocus the rating. | | `count` | `number` | No | The total number of ratings. | | `defaultValue` | `number` | No | The initial value of the rating when rendered. Use when you don't need to control the value of the rating. | | `disabled` | `boolean` | No | Whether the rating is disabled. | | `form` | `string` | No | The associate form of the underlying input element. | | `id` | `string` | No | The unique identifier of the machine. | | `ids` | `Partial<{ root: string label: string hiddenInput: string control: string item: (id: string) => string }>` | No | The ids of the elements in the rating. Useful for composition. | | `name` | `string` | No | The name attribute of the rating element (used in forms). | | `onHoverChange` | `(details: HoverChangeDetails) => void` | No | Function to be called when the rating value is hovered. | | `onValueChange` | `(details: ValueChangeDetails) => void` | No | Function to be called when the rating value changes. | | `readOnly` | `boolean` | No | Whether the rating is readonly. | | `ref` | `Element` | No | | | `required` | `boolean` | No | Whether the rating is required. | | `translations` | `IntlTranslations` | No | Specifies the localized strings that identifies the accessibility elements and their states | | `value` | `number` | No | The controlled value of the rating | **Context Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `render` | `Snippet<[UseRatingGroupContext]>` | Yes | | **Control Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **Control Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | rating-group | | `[data-part]` | control | | `[data-readonly]` | Present when read-only | | `[data-disabled]` | Present when disabled | **HiddenInput Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'input'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **ItemContext Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `render` | `Snippet<[UseRatingGroupItemContext]>` | Yes | | **Item Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `index` | `number` | Yes | | | `asChild` | `Snippet<[PropsFn<'span'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **Item Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | rating-group | | `[data-part]` | item | | `[data-disabled]` | Present when disabled | | `[data-readonly]` | Present when read-only | | `[data-checked]` | Present when checked | | `[data-highlighted]` | Present when highlighted | | `[data-half]` | | **Label Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'label'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **Label Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | rating-group | | `[data-part]` | label | | `[data-disabled]` | Present when disabled | | `[data-required]` | Present when required | **RootProvider Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `value` | `UseRatingGroupReturn` | Yes | | | `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | ### Context These are the properties available when using `UratingUgroup.Context`, `useUratingUgroupContext` hook or `useUratingUgroup` hook. **API:** | Property | Type | Description | |----------|------|-------------| | `setValue` | `(value: number) => void` | Sets the value of the rating group | | `clearValue` | `VoidFunction` | Clears the value of the rating group | | `hovering` | `boolean` | Whether the rating group is being hovered | | `value` | `number` | The current value of the rating group | | `hoveredValue` | `number` | The value of the currently hovered rating | | `count` | `number` | The total number of ratings | | `items` | `number[]` | The array of rating values. Returns an array of numbers from 1 to the max value. | | `getItemState` | `(props: ItemProps) => ItemState` | Returns the state of a rating item | ## Accessibility ### Keyboard Support