* docs: add 12 copy-edited blog posts for SEO and AI discoverability
De-templated repetitive boilerplate across all posts, rewrote tutorial
openings with pain-point hooks, and made "Why HeroUI" closing sections
contextually unique per article. Removed 4 duplicate/unpolished posts
(two dashboard duplicates, e-commerce, landing page, SaaS app tutorials)
to keep the initial launch set focused and high-quality.
Made-with: Cursor
* feat(docs): add SEO, blog, JSON-LD, and AI discoverability improvements
Adds blog pages, JSON-LD structured data, enhanced metadata, sitemap
normalization, component/example counts, why-heroui page, AI prompts,
and SEO-optimized README.
Made-with: Cursor
* feat(docs): blog content rebalancing, SEO improvements, and blog UI polish
- Rebalance all 7 comparison/listicle blog posts: remove self-undermining
trade-offs, star count comparisons, and competitor endorsements; replace
with HeroUI-forward conclusions and brief "when X might work" sections
- Optimize blog post descriptions using Ahrefs keyword data
- Add BreadcrumbList JSON-LD to blog post pages
- Add OG images to Chakra and Mantine comparison posts
- Extract PostCard into shared component with image support and onError fallback
- Redesign blog post header: Linear-inspired layout with title, hero image,
author name + date below image, avatar on hover
- Add DocsImage support to blog posts with light/dark mode switching
- Add darkImage frontmatter field to blog data layer
- Fix mobile overflow on blog post pages
- Add hero images to "Why Choose HeroUI" and "12 Best" posts
- Enhance "Why Choose HeroUI" post: add YC backing, community metrics,
"Ready in Two Steps" section, AGENTS.md docs, theme builder link
- Remove "Updated April 2026" from all posts
- Sort related posts by newest first
- Truncate card titles to 2 lines
- Fix Draft badge visibility on light backgrounds
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(docs): wrap BlogContent in Suspense boundary for useSearchParams
Next.js requires useSearchParams (used by nuqs) to be wrapped in a
Suspense boundary during static generation.
Co-authored-by: Cursor <cursoragent@cursor.com>
* docs(blog): publish 12 best react UI component libraries post
Remove draft state so the post is publicly visible.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Cursor <cursoragent@cursor.com>