{"success":true,"data":{"block":{"id":"testimonials-grid-add-review","name":"Testimonials Grid with Add Review Card","title":"Testimonials Grid Add Review","category":"Testimonials","categorySlug":"testimonials","description":"A testimonial grid featuring customer reviews alongside an 'Add Review' card with dashed border and plus icon. Each review card displays star ratings, quote, and author info. The add review card encourages user engagement. Perfect for product pages and community-driven platforms.","thumbnail":{"desktop":"https://cdn.ing/assets/i/r/293667/f0pikmeb9eezcv6xm28kj6xyx1qu/cleanshot-2026-03-10-at-10-45-31-2x.png","mobile":"https://cdn.ing/assets/i/r/293666/l0asv65qty0ljm8fzuejrz9h9q07/cleanshot-2026-03-10-at-10-45-47-2x.png"},"componentPath":"blocks/testimonials/testimonials-grid-add-review.tsx","code":"import { TestimonialsGridAddReview } from \"@opensite/ui/blocks/testimonials/testimonials-grid-add-review\";\nimport { imagePlaceholders } from \"@/lib/media\";\n\nexport default function Demo() {\n  return (\n    <TestimonialsGridAddReview\n      heading=\"Customer Reviews\"\n      description=\"Join thousands of satisfied customers sharing their experiences\"\n      addReviewText=\"Write a Review\"\n      addReviewSubtext=\"Share your experience with us\"\n      reviews={[\n        {\n          rating: 5,\n          quote:\n            \"Exceptional quality and service. The product arrived exactly as described and exceeded my expectations. Would definitely recommend to anyone looking for reliability.\",\n          author: \"Michael Torres\",\n          avatarSrc: imagePlaceholders[31],\n        },\n        {\n          rating: 5,\n          quote:\n            \"Best purchase I've made this year. The attention to detail and customer support are unmatched. Worth every penny.\",\n          author: \"Sarah Mitchell\",\n          avatarSrc: imagePlaceholders[47],\n        },\n        {\n          rating: 4,\n          quote:\n            \"Great product overall. Installation was straightforward and it works as advertised. Only minor issue was shipping took longer than expected.\",\n          author: \"James Wilson\",\n          avatarSrc: imagePlaceholders[63],\n        },\n        {\n          rating: 5,\n          quote:\n            \"I've tried several similar products, and this one stands out for its quality and durability. Customer service was also very responsive.\",\n          author: \"Emily Chen\",\n          avatarSrc: imagePlaceholders[79],\n        },\n        {\n          rating: 5,\n          quote:\n            \"Absolutely love it! The design is sleek and modern, and it fits perfectly with my setup. Highly recommended for anyone hesitating.\",\n          author: \"Robert Anderson\",\n          avatarSrc: imagePlaceholders[95],\n        },\n      ]}\n      actions={[\n        {\n          label: \"Read All Reviews\",\n          href: \"#\",\n          variant: \"default\",\n          size: \"lg\",\n        },\n      ]}\n      onAddReview={() => console.log(\"Open review form\")}\n      background=\"dark\"\n      pattern=\"diagonalCrossFadeTop\"\n      patternOpacity={0.15}\n      spacing=\"lg\"\n    />\n  );\n}","propsSchema":{"reviews":{"type":"array","description":"Array of reviews to display","items":{"type":"object","description":"","fields":{"quote":{"type":"object","description":"Testimonial quote text","typeLabel":"ReactNode","required":true},"author":{"type":"object","description":"Author name","typeLabel":"ReactNode","required":false},"role":{"type":"object","description":"Author role/title","typeLabel":"ReactNode","required":false},"company":{"type":"object","description":"Author company","typeLabel":"ReactNode","required":false},"avatarSrc":{"type":"string","description":"Author avatar image URL","required":false},"avatar":{"type":"object","description":"Author avatar configuration (alternative to avatarSrc)","fields":{"src":{"type":"string","description":"","required":true},"alt":{"type":"string","description":"","required":false},"fallback":{"type":"string","description":"","required":false}},"typeLabel":"{ src: string; alt?: string; fallback?: string; }","required":false},"logoSrc":{"type":"string","description":"Company logo URL","required":false},"rating":{"type":"number","description":"Star rating (1-5)","required":false},"className":{"type":"string","description":"Additional CSS classes","required":false},"linkConfig":{"type":"object","description":"Review linking config","fields":{"label":{"type":"object","description":"","typeLabel":"React.ReactNode","required":true},"href":{"type":"string","description":"","required":true},"className":{"type":"string","description":"","required":false}},"typeLabel":"{ label: React.ReactNode; href: string; className?: string; }","required":false}},"typeLabel":"TestimonialItem"},"typeLabel":"TestimonialItem[]","required":false},"reviewsSlot":{"type":"object","description":"Custom slot for rendering reviews (overrides reviews array)","typeLabel":"React.ReactNode","required":false},"heading":{"type":"object","description":"Main heading content","typeLabel":"React.ReactNode","required":false},"description":{"type":"object","description":"Description text below heading","typeLabel":"React.ReactNode","required":false},"addReviewText":{"type":"object","description":"Text for the add review button","typeLabel":"React.ReactNode","required":false},"addReviewSubtext":{"type":"object","description":"Subtitle for the add review card","typeLabel":"React.ReactNode","required":false},"onAddReview":{"type":"object","description":"Callback when add review is clicked","typeLabel":"() => void","required":false},"className":{"type":"string","description":"Additional CSS classes for the section wrapper","required":false},"headerClassName":{"type":"string","description":"Additional CSS classes for the header container","required":false},"headingClassName":{"type":"string","description":"Additional CSS classes for the heading","required":false},"descriptionClassName":{"type":"string","description":"Additional CSS classes for the description","required":false},"gridClassName":{"type":"string","description":"Additional CSS classes for the grid container","required":false},"cardClassName":{"type":"string","description":"Additional CSS classes for each card","required":false},"addReviewCardClassName":{"type":"string","description":"Additional CSS classes for the add review card","required":false},"authorClassName":{"type":"string","description":"Additional CSS classes for the author section","required":false},"background":{"type":"string","description":"Background style for the section","typeLabel":"SectionBackground","required":false},"spacing":{"type":"object","description":"Vertical spacing for the section","fields":{},"typeLabel":"SectionSpacing","required":false},"pattern":{"type":"object","description":"Optional background pattern name or URL","fields":{},"typeLabel":"PatternName","required":false},"patternOpacity":{"type":"number","description":"Pattern overlay opacity (0-1)","required":false},"containerClassName":{"type":"string","description":"Additional CSS classes for the container","required":false},"actions":{"type":"array","description":"Array of action configurations for CTA buttons","items":{"type":"object","description":"","fields":{"variant":{"type":"string","description":"","typeLabel":"\"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\"","required":false},"size":{"type":"string","description":"","typeLabel":"\"default\" | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\" | \"icon-lg\"","required":false},"label":{"type":"object","description":"Button/link label text or ReactNode","typeLabel":"ReactNode","required":false},"icon":{"type":"object","description":"Icon to display (typically before label)","typeLabel":"ReactNode","required":false},"iconAfter":{"type":"object","description":"Icon to display after the label","typeLabel":"ReactNode","required":false},"href":{"type":"string","description":"URL for link behavior","required":false},"onClick":{"type":"object","description":"Click handler for button behavior","typeLabel":"MouseEventHandler","required":false},"className":{"type":"string","description":"Additional CSS classes for the action","required":false},"children":{"type":"object","description":"Custom children (overrides label + icon rendering)","typeLabel":"ReactNode","required":false},"aria-label":{"type":"string","description":"ARIA label for accessibility","required":false},"asButton":{"type":"boolean","description":"Render as a button element instead of an anchor/link","required":false}},"typeLabel":"ActionConfig"},"typeLabel":"ActionConfig[]","required":false},"actionsSlot":{"type":"object","description":"Custom slot for rendering actions (overrides actions array)","typeLabel":"React.ReactNode","required":false},"actionsClassName":{"type":"string","description":"Additional CSS classes for the actions container","required":false},"quoteClassName":{"type":"string","description":"Additional CSS classes for the quote text","required":false},"sectionId":{"type":"string","description":"Optional Section ID","required":false}},"defaultProps":{},"dependencies":["@opensite/ui"],"tags":["testimonials","grid","add-review","interactive","ratings","stars","user-generated","engagement"],"performance":{},"importantUsageNotes":"DO NOT generate or guess testimonials, reviews, ratings, customer names, company logos, or any review content — only use real, verified testimonials and customer data from the system. If the site has no real testimonials in the system, DO NOT use this block. Supply testimonials in the 'reviews' array using multiples of 3 (3, 6, or 9) to keep the 3-column grid balanced; the demo uses 5 with an 'add review' card occupying the sixth slot. Each review requires a 'rating' (real star rating, 1-5), a 'quote', and an 'author' — do not invent ratings or reviewer names. Do not set 'avatarSrc' unless a real avatar URL is available. If you supply multiple 'actions', ensure to use a variant of 'default' for the first action, and 'outline' for the second action to ensure proper visual distinction between the two CTAs. Follow the example props closely for this block."}},"timestamp":"2026-05-13T10:42:52.250Z"}