KQ-1339 · RATINGS/SUMMARY

Ratings Summary

A product's ratings where the distribution is the filter: the average rolls up on snap, the stars fill from the left on glide and the five bars grow on a cascade, and pressing a bar filters the reviews below, which reflow rather than reload — leavers fade on the exit ease, the rest travel to their new places on glide and newcomers arrive from 8px inside a height that glides with them. One star at a time slides a wash between bars on snap, several toggle with checks; helpful votes roll their count and pop the thumb, and photos from reviews open in a viewer over the component's own frame, growing out of their thumbnail on glide and swiped 1:1 with a projected release. Bars are toggle buttons with roving arrows, the viewer a dialog that keeps Tab inside and gives focus back to its thumbnail.

KQ-1339 · RATINGS/SUMMARY

Ratings & reviews

Waylight Ridge Trail Runner

4.5 · 1,284

Summary

4.5

Rated 4.5 out of 5 from 1,284 ratings.

90% rate it 4 or 5 stars

Photos from reviews · 9

All reviews · 14

  1. Rated 5 out of 5.

    Grippy on wet rock

    Ana R.Verified buyer2 days agoUK 7 · Slate

    Took them up the ridge after two days of rain and never slipped once. The lugs shed mud on the descent instead of packing up, and the toe bumper saved me on a root I didn't see.

  2. Rated 4 out of 5.

    Light, but runs small

    Theo M.Verified buyer10 days agoUK 10 · Moss

    Order half a size up. Once I did, they were the lightest trail shoe I've owned, and the heel lock is better than my last pair.

  3. Rated 2 out of 5.

    Sole wore fast on road

    Jonas W.Verified buyerAug 30UK 9 · Slate

    Great on dirt, but I do a mile of tarmac to reach the trail and the forefoot lugs were half gone in two months. Fine if you never touch pavement; I do, so I'm going back to my old pair for daily runs and keeping these for weekends. Customer service were quick and helpful about it, to be fair.

  4. Rated 5 out of 5.

    Ran a 50k in them

    Ellie G.Verified buyerAug 3UK 6 · Slate

    Mixed terrain, nine hours, and my feet were the least of my problems. Will be buying the next version.

  5. Rated 5 out of 5.

    Third pair, no regrets

    Priya K.Verified buyerSep 3UK 5 · Slate

    Same fit every time, which is the whole point. About 600 km per pair before the lugs go flat.

4.5 average · 1,284 ratings · all reviews · sorted by most helpful

Install

One command — the source lands in your repo. Or copy it from the Code tab.

$ pnpm dlx shadcn@latest add @kinetiq/ratings-summary

Props

bars
"rows" | "columns"
default "rows"
How the distribution is drawn: horizontal bars with star and count, or a five-column histogram rising from a baseline.
filter
"single" | "multi"
default "single"
One star at a time, with a cobalt wash that slides between bars (pressing the chosen bar again clears it), or several stars toggled together, each with a check.
photos
"strip" | "grid" | "off"
default "strip"
Photos from reviews as one scrolling strip of thumbnails, a mosaic with a +N tile (its own column from 68rem), or left out along with the thumbnails on each review.
reviews
Review[]
default defaultReviews
The page of reviews: author, rating, title, body, date (ms), verified, helpful count, variant and photos (alt, tint, scene).
distribution
number[]
default defaultRatingDistribution
Ratings per star for the whole product, 1★ first. Counted from reviews when you pass your own reviews without it.
productName
string
default "Ridge Trail Runner"
The product, shown under the heading.
stars / defaultStars
number[]
default []
The star filter: the ratings shown, empty for all. Controlled or uncontrolled.
onStarsChange
(stars: number[]) => void
default —
Fires from the bar, key or Clear that changed the filter.
sort / defaultSort
"helpful" | "newest" | "highest" | "lowest"
default "helpful"
The list's order. Controlled or uncontrolled; a change reorders the list with a layout glide.
onSortChange
(sort: RatingsSort) => void
default —
Fires when the visitor picks an order.
voted / defaultVoted
string[]
default []
The reviews this visitor marked helpful. Controlled or uncontrolled.
onVotedChange
(voted: string[]) => void
default —
Fires with every helpful mark after a vote.
onVote
(id: string, voted: boolean) => void
default —
A review was marked helpful or unmarked.
pageSize
number
default 5
Reviews shown before Show more; each press adds this many, cascading in.
onPhotoOpen
(photoId: string, reviewId: string) => void
default —
A photo was opened in the viewer.
now
number | Date
default defaultRatingsNow
The moment relative dates count from, never the wall clock.
formatDate
(ms: number, now: number) => string
default "3 days ago", then "Sep 12"
Review dates to text.
title
string
default "Ratings & reviews"
The heading, and the region's name unless label is given.
status
"ready" | "loading" | "error"
default "ready"
Whether the reviews have arrived: loading shows skeletons, error a message with Try again.
onRetry
() => void
default —
Try again was pressed after the reviews failed to load.
label
string
default —
The region's accessible name, when the visible title is not enough.
sound
boolean
default false
Ticks pitched by star for bars, and for photos in the viewer; a pop for a helpful vote.
disabled
boolean
default false
Read only: the reviews still read, nothing can be filtered, voted or opened.
className
string
default —
Classes for the root. It is at most 560px tall and scrolls inside itself.