Rating
Accessible, unstyled native-radio rating control with controlled and uncontrolled state.
|
|
| Package |
@vizejs/ui/rating |
| Maturity |
stable |
| Own the source |
vize lib pull rating |
| Requires |
controllable-state, id |
| Aliases |
rating, star rating, score picker |
| Covers |
HTML radio, WAI-ARIA Radio Group, React Aria RadioGroup, Radix ToggleGroup rating examples |
Usage
import { Rating } from "@vizejs/ui/rating";
Or copy the source into your project with vize lib pull rating (see Source Distribution).
API
Rating
Source: src/families/form/rating/rating.vue
Props
| Prop |
Type |
Default |
Description |
id |
string | null |
undefined |
Consumer-owned group id; nullish values use a deterministic fallback. |
name |
string |
undefined |
Native radio field name submitted with the selected rating. |
modelValue |
RatingValue |
undefined |
Controlled rating value; undefined selects uncontrolled behavior and null clears. |
defaultValue |
RatingValue |
null |
Initial uncontrolled rating and native form-reset target. |
min |
number |
1 |
Lowest generated rating value. |
max |
number |
undefined |
Highest generated rating value; when omitted, count derives it. |
count |
number |
5 |
Number of generated rating choices when max is omitted. |
clearable |
boolean |
false |
Allow current-item activation, Escape, Delete, or Backspace to clear. |
disabled |
boolean |
false |
Disable native focus, activation, and form submission. |
readOnly |
boolean |
false |
Keep focus and current submission while preventing user changes. |
required |
boolean |
false |
Mark the generated native radio set as required. |
dir |
RatingDirection |
"ltr" |
Text direction for horizontal arrow keys and data attributes. |
itemLabel |
string |
"Rating" |
Prefix for each generated radio accessible name. |
ariaLabel |
string |
undefined |
Accessible name when no visible label or aria-labelledby supplies one. |
ariaLabelledby |
string |
undefined |
Space-separated ids that label the rating group. |
ariaDescribedby |
string |
undefined |
Space-separated ids that describe the rating group. |
ariaErrormessage |
string |
undefined |
Id of the validation error message used while invalid. |
ariaInvalid |
RatingAriaInvalid |
false |
Invalid state announced to assistive technology. |
Events
| Event |
Payload |
Description |
update:modelValue |
[value: RatingValue] |
Fired when the rating requests a new controlled value. |
change |
[value: RatingValue, previous: RatingValue, nativeEvent: Event] |
Fired after user activation requests a distinct rating value. |
clear |
[previous: number, nativeEvent: Event] |
Fired after user activation clears a previously selected rating. |
Slots
| Slot |
Slot props |
Description |
default |
RatingSlotState |
Renders optional summary or output with the normalized Rating state. |
item |
RatingItemSlotState |
Renders each generated rating indicator with item and group state. |
Behavior
Normative state x input -> outcome table for rating.vue
(@vizejs/ui/rating). Every row is proven by the named mounted-DOM or SSR test;
a row without a passing test is a contract violation.
| # |
State |
Input |
Outcome |
Proven by |
| R1 |
named, selected |
render |
native radio-group semantics, deterministic ids, named radio inputs, ARIA field state, data attributes, parts, and CSS custom properties reflect the normalized rating |
renders native radio rating semantics with form and extension hooks |
| R2 |
uncontrolled |
pointer selection / clear |
selecting a radio updates checked state, native form data, item slot state, and emits update:modelValue before change; selecting the current item clears only when clearable |
uncontrolled rating selects and clears through pointer activation |
| R3 |
controlled |
pointer selection |
emits the requested value and change; rendered checked state reverts to modelValue until the parent accepts it |
controlled value wins until the parent accepts the request |
| R4 |
uncontrolled, seeded |
form reset |
defaultValue seeds the initial radio and form reset restores it without request-global state |
defaultValue seeds state and native form reset restores it |
| R5 |
focusable |
keyboard / exposed |
Space/Enter select, Home/End jump, arrows wrap, horizontal arrows honor dir, clear keys clear when allowed, and focus() targets the checked or first enabled radio |
keyboard support honors native radio expectations and RTL direction |
| R6 |
disabled/read-only |
render / activation |
disabled ratings use native disabled radios and submit no value; read-only ratings remain focusable/submittable and suppress user changes |
disabled and read-only ratings keep availability and form semantics |
| R7 |
normalized |
invalid bounds/value |
finite integer min/max/count/value repair prevents unsafe NaN or Infinity attributes in DOM and SSR output |
normalizes finite integer bounds, value, direction, and state |
| R8 |
imperative |
expose |
instance methods focus, set, clear, reset, and expose normalized root/item state |
exposes focus, setValue, clear, reset, and normalized state |
| R9 |
SSR/hydration |
isolated requests |
server markup is byte-identical across requests and hydration preserves generated ids without diagnostics |
renders byte-identical rating markup across isolated SSR requests |
Public Props
| Prop |
Type |
Default |
Contract |
id |
string | null |
undefined |
Consumer id for the radiogroup; nullish values use a deterministic fallback. |
name |
string |
undefined |
Native radio name submitted with the selected value. |
modelValue |
number | null |
undefined |
Controlled value; undefined selects uncontrolled mode and null clears. |
defaultValue |
number | null |
null |
Initial uncontrolled value and reset target. |
min |
number |
1 |
Lowest generated integer value. |
max |
number |
undefined |
Highest generated integer value; when omitted, count derives it. |
count |
number |
5 |
Number of generated choices when max is omitted. |
clearable |
boolean |
false |
Enables clearing through current-item activation, Escape, Delete, or Backspace. |
disabled |
boolean |
false |
Disables every radio, focus, activation, and native submission. |
readOnly |
boolean |
false |
Keeps focus and current submission while blocking user changes. |
required |
boolean |
false |
Applies native required validation to the generated radio set and aria-required to the group. |
dir |
"ltr" | "rtl" |
"ltr" |
Exposes direction and flips horizontal arrow meaning in RTL. |
itemLabel |
string |
"Rating" |
Prefix for generated item accessible names such as Rating 3 of 5. |
ariaLabel |
string |
undefined |
Accessible group name when no external label exists. |
ariaLabelledby |
string |
undefined |
Space-separated ids that label the group. |
ariaDescribedby |
string |
undefined |
Space-separated ids that describe the group. |
ariaErrormessage |
string |
undefined |
Error-message id used only while invalid. |
ariaInvalid |
boolean | "grammar" | "spelling" |
false |
Invalid state forwarded to ARIA and data hooks. |
Emits, Slots, Expose
| Surface |
Contract |
update:modelValue(value) |
Fired for distinct controlled/uncontrolled value requests. |
change(value, previous, nativeEvent) |
Fired after user activation requests a distinct rating. |
clear(previous, nativeEvent) |
Fired after user activation clears a non-empty value. |
| default slot |
Receives RatingSlotState for optional output beside the generated radios. |
item slot |
Receives RatingItemSlotState for each generated indicator. |
| expose |
root, elements, normalized state, focus(), setValue(), clear(), and reset(). |
Extension Hooks
| Hook |
Values |
| parts |
root, item, control, indicator |
| root data |
data-vize-ui="rating", data-state, data-value, data-min, data-max, data-count, data-percent, data-dir, data-disabled, data-readonly, data-required, data-invalid, data-clearable |
| item/control/indicator data |
data-vize-ui, data-state, data-value, data-index, data-active, data-checked, data-disabled, data-readonly, data-required, data-invalid, data-dir |
| CSS custom properties |
--vize-rating-value, --vize-rating-min, --vize-rating-max, --vize-rating-count, --vize-rating-percent |
The subpath remains tree-shakable and retains no packaged CSS; those package
contracts are pinned by distribution.test.ts, check:size, and
check:tree-shaking.