Guide

Component Kit

Four ready-to-use Vue components — ReviewStars, ReviewCard, ReviewList, ReviewSummary.

nuxt-reviews ships four zero-dependency Vue components that are auto-registered globally. No imports needed — use them directly in any template.

ReviewStars

Renders a star rating with full, half, and empty stars.

<ReviewStars :rating="4.5" size="md" />

Props

PropTypeDefaultDescription
ratingnumberRating value (e.g. 4.5)
maxnumber5Maximum stars
size'sm' | 'md' | 'lg''md'Star size

Size Reference

SizePixels
sm14×14
md20×20
lg28×28

ReviewCard

Displays a single review with author, rating, date, text, and optional business response.

<ReviewCard
  :review="review"
  :show-provider="true"
  :show-response="true"
  :truncate="200"
/>

Props

PropTypeDefaultDescription
reviewNormalizedReviewReview object
showProviderbooleanfalseShow provider name (e.g. "via google")
showResponsebooleantrueShow business response if present
truncatenumber0Truncate review text after N characters (0 = no truncation)

ReviewList

Renders a responsive grid of ReviewCard components. Supports custom slots.

<ReviewList
  :reviews="reviews"
  :loading="pending"
  :columns="2"
  show-provider
  :truncate="180"
/>

Props

PropTypeDefaultDescription
reviewsNormalizedReview[]Array of reviews
loadingbooleanfalseShow loading state
emptyTextstring'No reviews yet.'Message when reviews is empty
showProviderbooleanfalseShow provider badge on each card
showResponsebooleantrueShow business responses
truncatenumber0Truncate review text
columns1 | 2 | 31Grid columns (responsive — collapses on mobile)

Slots

SlotPropsDescription
#loadingCustom loading state
#emptyCustom empty state
#review{ review }Custom card per review
<ReviewList :reviews="reviews" :loading="pending">
  <template #loading>
    <div>Loading your reviews…</div>
  </template>

  <template #review="{ review }">
    <!-- Completely custom card -->
    <MyCustomCard :review="review" />
  </template>
</ReviewList>

ReviewSummary

Displays the aggregate score with a large average number, star rating, and star distribution bar chart.

<ReviewSummary
  :aggregate="aggregate"
  title="Guest Reviews"
  :show-distribution="true"
/>

Props

PropTypeDefaultDescription
aggregateAggregateRatingAggregate data from useReviews()
titlestringOptional heading above the score
showDistributionbooleantrueShow star distribution bars

Full Example

<script setup lang="ts">
const { reviews, aggregate, pending } = useReviews()

useReviewSchema(reviews, aggregate, {
  name: 'Grand Hotel Istanbul',
  type: 'Hotel',
  url: 'https://example.com',
})
</script>

<template>
  <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
    <!-- Sidebar: summary + stars demo -->
    <div class="space-y-4">
      <ReviewSummary :aggregate="aggregate" title="Guest Reviews" />

      <div>
        <p class="text-sm font-medium mb-2">Star sizes:</p>
        <ReviewStars :rating="aggregate?.average ?? 0" size="sm" />
        <ReviewStars :rating="aggregate?.average ?? 0" size="md" />
        <ReviewStars :rating="aggregate?.average ?? 0" size="lg" />
      </div>
    </div>

    <!-- Main: review list -->
    <div class="md:col-span-2">
      <ReviewList
        :reviews="reviews"
        :loading="pending"
        :columns="1"
        show-provider
        :truncate="300"
      />
    </div>
  </div>
</template>

Styling

Components ship with minimal scoped CSS using plain color values — no utility class dependency. Override styles by targeting the BEM class names in your own CSS:

/* Example overrides */
.review-card { border-radius: 1rem; }
.review-stars { color: #10b981; }   /* change star color */
.review-summary__fill { background: #6366f1; }  /* change bar color */