rating component
Drop-in semantic component. See examples, sizes, variants, and source.
Star, heart, emoji, and number ratings. Pick a type with
rating star / heart /
emoji / number, set the current value
with data-value, and mark filled icons with
selected (or half for half-precision
stars). Layer modifiers for size, color, and layout
(vertical, compact,
readonly, disabled,
clearable). Interactive value updates and form integration are
handled by rating.js.
Rating System
Basic Star Rating
<div class="space-y-3">
<div class="rating star" data-value="0">
<span class="star"></span>
<span class="star"></span>
<span class="star"></span>
<span class="star"></span>
<span class="star"></span>
</div>
<div class="rating star" data-value="3">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
<span class="star"></span>
</div>
<div class="rating star" data-value="4.5" data-precision="0.5">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star half"></span>
</div>
<div class="rating star" data-value="5">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
</div>
</div>
Rating Sizes
<div class="space-y-3">
<div class="rating star xs" data-value="4">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
</div>
<div class="rating star sm" data-value="4">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
</div>
<div class="rating star" data-value="4">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
</div>
<div class="rating star xl" data-value="4">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
</div>
<div class="rating star lg" data-value="4">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
</div>
</div>
Heart Rating
<div class="space-y-3">
<div class="rating heart" data-value="0">
<span class="icon"></span>
<span class="icon"></span>
<span class="icon"></span>
<span class="icon"></span>
<span class="icon"></span>
</div>
<div class="rating heart" data-value="3">
<span class="icon selected"></span>
<span class="icon selected"></span>
<span class="icon selected"></span>
<span class="icon"></span>
<span class="icon"></span>
</div>
<div class="rating heart" data-value="4.5" data-precision="0.5">
<span class="icon selected"></span>
<span class="icon selected"></span>
<span class="icon selected"></span>
<span class="icon selected"></span>
<span class="icon half"></span>
</div>
<div class="rating heart" data-value="5">
<span class="icon selected"></span>
<span class="icon selected"></span>
<span class="icon selected"></span>
<span class="icon selected"></span>
<span class="icon selected"></span>
</div>
</div>
Emoji Rating
<div class="space-y-3">
<div class="rating emoji" data-value="0" data-max="5">
<span class="icon" data-value="1"></span>
<span class="icon" data-value="2"></span>
<span class="icon" data-value="3"></span>
<span class="icon" data-value="4"></span>
<span class="icon" data-value="5"></span>
</div>
<div class="rating emoji" data-value="1" data-max="5">
<span class="icon selected" data-value="1"></span>
<span class="icon" data-value="2"></span>
<span class="icon" data-value="3"></span>
<span class="icon" data-value="4"></span>
<span class="icon" data-value="5"></span>
</div>
<div class="rating emoji" data-value="3" data-max="5">
<span class="icon" data-value="1"></span>
<span class="icon" data-value="2"></span>
<span class="icon selected" data-value="3"></span>
<span class="icon" data-value="4"></span>
<span class="icon" data-value="5"></span>
</div>
<div class="rating emoji" data-value="5" data-max="5">
<span class="icon" data-value="1"></span>
<span class="icon" data-value="2"></span>
<span class="icon" data-value="3"></span>
<span class="icon" data-value="4"></span>
<span class="icon selected" data-value="5"></span>
</div>
</div>
Number Rating
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
<div class="space-y-3">
<div class="rating number" data-value="0" data-max="10">
<span class="icon">1</span>
<span class="icon">2</span>
<span class="icon">3</span>
<span class="icon">4</span>
<span class="icon">5</span>
<span class="icon">6</span>
<span class="icon">7</span>
<span class="icon">8</span>
<span class="icon">9</span>
<span class="icon">10</span>
</div>
<div class="rating number" data-value="7" data-max="10">
<span class="icon selected">1</span>
<span class="icon selected">2</span>
<span class="icon selected">3</span>
<span class="icon selected">4</span>
<span class="icon selected">5</span>
<span class="icon selected">6</span>
<span class="icon selected">7</span>
<span class="icon">8</span>
<span class="icon">9</span>
<span class="icon">10</span>
</div>
<div class="rating number sm" data-value="3" data-max="5">
<span class="icon selected">1</span>
<span class="icon selected">2</span>
<span class="icon selected">3</span>
<span class="icon">4</span>
<span class="icon">5</span>
</div>
</div>
Color Variants
<div class="space-y-3">
<div class="rating star" data-value="4">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
</div>
<div class="rating star primary" data-value="4">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
</div>
<div class="rating star positive" data-value="4">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
</div>
<div class="rating star negative" data-value="4">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
</div>
<div class="rating star warning" data-value="4">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
</div>
</div>
With Labels and Counts
4.5 / 5
(128)
3.8 / 5
(42)
<div class="space-y-3">
<div class="rating star with-label" data-value="4.5" data-precision="0.5" data-label="true">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star half"></span>
<span class="label">4.5 / 5</span>
</div>
<div class="rating star" data-value="4.2" data-count="128">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
<span class="count">(128)</span>
</div>
<div class="rating star with-label" data-value="3.8" data-label="true" data-count="42">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
<span class="label">3.8 / 5</span>
<span class="count">(42)</span>
</div>
</div>
Interactive States
<div class="space-y-3">
<div>
<label class="subhead font-medium text-gray-600 mb-1 block">Interactive (default)</label>
<div class="rating star" data-value="3">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
<span class="star"></span>
</div>
</div>
<div>
<label class="subhead font-medium text-gray-600 mb-1 block">Readonly</label>
<div class="rating star readonly" data-value="4">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
</div>
</div>
<div>
<label class="subhead font-medium text-gray-600 mb-1 block">Disabled</label>
<div class="rating star disabled" data-value="2">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
<span class="star"></span>
<span class="star"></span>
</div>
</div>
<div>
<label class="subhead font-medium text-gray-600 mb-1 block">Clearable</label>
<div class="rating star clearable" data-value="3">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
<span class="star"></span>
<span class="clear"></span>
</div>
</div>
</div>
Half Star Precision
<div class="space-y-3">
<div class="rating star" data-value="0.5" data-precision="0.5">
<span class="star half"></span>
<span class="star"></span>
<span class="star"></span>
<span class="star"></span>
<span class="star"></span>
</div>
<div class="rating star" data-value="1.5" data-precision="0.5">
<span class="star selected"></span>
<span class="star half"></span>
<span class="star"></span>
<span class="star"></span>
<span class="star"></span>
</div>
<div class="rating star" data-value="2.5" data-precision="0.5">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star half"></span>
<span class="star"></span>
<span class="star"></span>
</div>
<div class="rating star" data-value="3.5" data-precision="0.5">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star half"></span>
<span class="star"></span>
</div>
<div class="rating star" data-value="4.5" data-precision="0.5">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star half"></span>
</div>
</div>
Vertical Layout
4 / 5
Product Quality
5 / 5
Customer Love
Satisfaction
<div class="flex gap-8">
<div class="rating star vertical" data-value="4" data-label="true">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
<span class="label">4 / 5</span>
<span class="subhead text-gray-600 mt-2">Product Quality</span>
</div>
<div class="rating heart vertical" data-value="5" data-label="true">
<span class="icon selected"></span>
<span class="icon selected"></span>
<span class="icon selected"></span>
<span class="icon selected"></span>
<span class="icon selected"></span>
<span class="label">5 / 5</span>
<span class="subhead text-gray-600 mt-2">Customer Love</span>
</div>
<div class="rating emoji vertical" data-value="4" data-max="5">
<span class="icon" data-value="1"></span>
<span class="icon" data-value="2"></span>
<span class="icon" data-value="3"></span>
<span class="icon selected" data-value="4"></span>
<span class="icon" data-value="5"></span>
<span class="subhead text-gray-600 mt-2">Satisfaction</span>
</div>
</div>
Compact Mode
<div class="space-y-3">
<div class="rating star compact" data-value="4">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star"></span>
</div>
<div class="rating star compact sm" data-value="3.5" data-precision="0.5">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star half"></span>
<span class="star"></span>
</div>
<div class="rating heart compact" data-value="5">
<span class="icon selected"></span>
<span class="icon selected"></span>
<span class="icon selected"></span>
<span class="icon selected"></span>
<span class="icon selected"></span>
</div>
</div>
Rating Bar Distribution
<div class="rating-bar-area">
<div class="rating-bar" data-percent="85">
<span class="label">5 stars</span>
<div class="bar"><div class="fill" style="width: 85%"></div></div>
<span class="count">85%</span>
</div>
<div class="rating-bar" data-percent="10">
<span class="label">4 stars</span>
<div class="bar"><div class="fill" style="width: 10%"></div></div>
<span class="count">10%</span>
</div>
<div class="rating-bar" data-percent="3">
<span class="label">3 stars</span>
<div class="bar"><div class="fill" style="width: 3%"></div></div>
<span class="count">3%</span>
</div>
<div class="rating-bar" data-percent="1">
<span class="label">2 stars</span>
<div class="bar"><div class="fill" style="width: 1%"></div></div>
<span class="count">1%</span>
</div>
<div class="rating-bar" data-percent="1">
<span class="label">1 star</span>
<div class="bar"><div class="fill" style="width: 1%"></div></div>
<span class="count">1%</span>
</div>
</div>
Rating Summary
<div class="rating-summary">
<div class="average">4.5</div>
<div class="stars">
<div class="rating star readonly" data-value="4.5" data-precision="0.5">
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star selected"></span>
<span class="star half"></span>
</div>
<div class="total">Based on 2,451 reviews</div>
</div>
<div class="rating-bar-area flex-1">
<div class="rating-bar positive" data-percent="85">
<span class="label">5★</span>
<div class="bar"><div class="fill" style="width: 85%"></div></div>
<span class="count">2,084</span>
</div>
<div class="rating-bar positive" data-percent="10">
<span class="label">4★</span>
<div class="bar"><div class="fill" style="width: 10%"></div></div>
<span class="count">245</span>
</div>
<div class="rating-bar" data-percent="3">
<span class="label">3★</span>
<div class="bar"><div class="fill" style="width: 3%"></div></div>
<span class="count">73</span>
</div>
<div class="rating-bar" data-percent="1">
<span class="label">2★</span>
<div class="bar"><div class="fill" style="width: 1%"></div></div>
<span class="count">25</span>
</div>
<div class="rating-bar" data-percent="1">
<span class="label">1★</span>
<div class="bar"><div class="fill" style="width: 1%"></div></div>
<span class="count">24</span>
</div>
</div>
</div>
Form Integration
<form class="stack">
<div>
<label class="block subhead font-medium text-gray-700 mb-1">Product Rating</label>
<div class="rating star" data-value="0" data-name="product_rating"></div>
</div>
<div>
<label class="block subhead font-medium text-gray-700 mb-1">Service Quality</label>
<div class="rating star" data-value="0" data-name="service_rating" data-precision="0.5"></div>
</div>
<div>
<label class="block subhead font-medium text-gray-700 mb-1">Overall Experience</label>
<div class="rating emoji" data-value="0" data-name="experience_rating" data-max="5"></div>
</div>
<button type="submit" class="button primary">Submit Review</button>
</form>
Animated Ratings
<div class="space-y-3">
<div class="rating star animated" data-value="0" id="animated-demo"></div>
<button class="button sm" onclick="Rating.setValue('#animated-demo', Math.random() * 5)">
Random Rating
</button>
</div>
JavaScript API
Set to 1
Set to 3
Set to 5
Clear
Disable
Enable
Get Value
<div class="stack">
<div class="rating star" data-value="3" id="api-demo"></div>
<div class="flex gap-2 flex-wrap">
<button class="button sm" onclick="Rating.setValue('#api-demo', 1)">Set to 1</button>
<button class="button sm" onclick="Rating.setValue('#api-demo', 3)">Set to 3</button>
<button class="button sm" onclick="Rating.setValue('#api-demo', 5)">Set to 5</button>
<button class="button sm" onclick="Rating.clear('#api-demo')">Clear</button>
<button class="button sm" onclick="Rating.disable('#api-demo')">Disable</button>
<button class="button sm" onclick="Rating.enable('#api-demo')">Enable</button>
<button class="button sm" onclick="alert('Current value: ' + Rating.getValue('#api-demo'))">
Get Value
</button>
</div>
</div>
Class API Reference
Type
Class / Attribute
Usage
Notes
Type
rating
Required base class on the wrapper
Defaults to star rendering
rating star
Star icons (☆ / ★)
Children: .star
rating heart
Heart icons (♡ / ♥)
Children: .icon
rating emoji
Emotion emoji 1-5
Children: .icon[data-value]
rating number
Numeric chips (1-N)
Children: .icon
Sizes
xs
14px icons — tiny
Modifier on rating
sm
16px icons — small
Modifier on rating
(default)
20px icons — medium
No size class needed
xl
24px icons — large
Modifier on rating
lg
32px icons — big
Modifier on rating
Colors
(default)
Yellow stars / red hearts
Type-default color
primary
Blue selected color
Modifier on rating
positive
Green selected color
Modifier on rating
negative
Red selected color
Modifier on rating
warning
Orange selected color
Modifier on rating
States / Item
selected
Filled icon
Modifier on each .star / .icon
half
Half-filled icon (works with data-precision="0.5")
Modifier on the boundary icon
readonly
Display only — no hover/click
Modifier on rating
disabled
Greyed out + non-interactive
Modifier on rating
clearable
Adds a × control to reset the value
Append a .clear child
animated
Animated fills on value change
Modifier on rating
Layout
vertical
Stack icons + label vertically
Modifier on rating
compact
Overlap icons (zero gap)
Modifier on rating
with-label
Reserves space for inline value label
Append a .label child
Data Attributes
data-value
Current value
0 to data-max
data-max
Maximum value
Default 5
data-precision
Step size — 0.5 or 1
Half-stars require 0.5
data-count
Review count rendered as (N)
Append a .count child
data-label
Show value label inline
"true" to enable
data-name
Form field name for hidden input
Used by rating.js
Bar / Summary
rating-bar-area
Container for distribution bars
Stack of .rating-bar rows
rating-bar
Single label / fill / count row
Children: .label, .bar > .fill, .count
rating-bar.primary|positive|negative|warning
Color modifier for the fill
Modifier on rating-bar
rating-summary
Average + stars + distribution composite block
Hosts .average, .stars, .rating-bar-area
rating-summary .average
Big numeric average
Inside .rating-summary
rating-summary .total
Reviews-count caption beneath the stars
Inside .rating-summary .stars