V0 Structured Data Installation Prompt

v0 Structured Data Installation Prompt

Structured Data is one of the best ways for AI crawlers and Google to find and rank your content, but most websites underutilize this. So I created a v0 prompt to install a structured data utility that includes examples for many common kinds of structured data that Google will recognize.

You can paste this prompt directly into the v0 message composer to have v0 fully install a Structured Data utility with Google-supported best practices implementation:

I need you to create a complete Structured Data system for my Next.js project. Please add ALL of the following files exactly as they are provided below, with all the component parts, and lib file. This is a comprehensive Structured Data system that includes various types of Google-supported structured data snippets.

Please create the following files with their exact content:

[V0_FILE]typescriptreact:file="lib/structured-data.tsx"
import type { 
  Organization, 
  WebSite, 
  BreadcrumbList, 
  Person,
  Product,
  Article,
  LocalBusiness,
  Event,
  Recipe,
  Course,
  JobPosting,
  WithContext 
} from "schema-dts"

// Base component for any structured data

interface BaseStructuredDataProps {
  data: WithContext<any>
  sanitize?: boolean
}

export function StructuredData({ data, sanitize = true }: BaseStructuredDataProps) {
  const jsonString = JSON.stringify(data)
  const sanitizedJson = sanitize ? jsonString.replace(/</g, "\\u003c") : jsonString
  
  return (
    <script
      type="application/ld+json"
      dangerouslySetInnerHTML={{ __html: sanitizedJson }}
    />
  )
}

// Organization Schema
interface OrganizationProps {
  name: string
  url: string
  logo?: string
  description?: string
  address?: {
    streetAddress?: string
    addressLocality?: string
    addressRegion?: string
    postalCode?: string
    addressCountry?: string
  }
  contactPoint?: {
    telephone?: string
    email?: string
    contactType?: string
  }
  sameAs?: string[]
  foundingDate?: string
}

export function OrganizationSchema(props: OrganizationProps) {
  const data: WithContext<Organization> = {
    "@context": "https://schema.org",
    "@type": "Organization",
    name: props.name,
    url: props.url,
    ...(props.logo && { logo: props.logo }),
    ...(props.description && { description: props.description }),
    ...(props.address && {
      address: {
        "@type": "PostalAddress",
        ...props.address
      }
    }),
    ...(props.contactPoint && {
      contactPoint: {
        "@type": "ContactPoint",
        ...props.contactPoint
      }
    }),
    ...(props.sameAs && { sameAs: props.sameAs }),
    ...(props.foundingDate && { foundingDate: props.foundingDate })
  }

  return <StructuredData data={data} />
}

// Website Schema
interface WebsiteProps {
  name: string
  url: string
  description?: string
  searchUrl?: string
  searchQueryParam?: string
  author?: {
    name: string
    url?: string
  }
  publisher?: {
    name: string
    logo?: string
  }
}

export function WebsiteSchema(props: WebsiteProps) {
  const data: WithContext<WebSite> = {
    "@context": "https://schema.org",
    "@type": "WebSite",
    name: props.name,
    url: props.url,
    ...(props.description && { description: props.description }),
    ...(props.searchUrl && {
      potentialAction: {
        "@type": "SearchAction",
        target: `${props.searchUrl}?${props.searchQueryParam || 'q'}={search_term_string}`,
        "query-input": `required name=search_term_string`
      }
    }),
    ...(props.author && {
      author: {
        "@type": "Person",
        name: props.author.name,
        ...(props.author.url && { url: props.author.url })
      }
    }),
    ...(props.publisher && {
      publisher: {
        "@type": "Organization",
        name: props.publisher.name,
        ...(props.publisher.logo && { logo: props.publisher.logo })
      }
    })
  }

  return <StructuredData data={data} />
}

// Breadcrumb Schema
interface BreadcrumbItem {
  name: string
  url: string
}

interface BreadcrumbProps {
  items: BreadcrumbItem[]
}

export function BreadcrumbSchema({ items }: BreadcrumbProps) {
  const data: WithContext<BreadcrumbList> = {
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    itemListElement: items.map((item, index) => ({
      "@type": "ListItem",
      position: index + 1,
      name: item.name,
      item: item.url
    }))
  }

  return <StructuredData data={data} />
}

// Person Schema
interface PersonProps {
  name: string
  url?: string
  image?: string
  jobTitle?: string
  worksFor?: {
    name: string
    url?: string
  }
  description?: string
  email?: string
  telephone?: string
  address?: {
    streetAddress?: string
    addressLocality?: string
    addressRegion?: string
    postalCode?: string
    addressCountry?: string
  }
  sameAs?: string[]
}

export function PersonSchema(props: PersonProps) {
  const data: WithContext<Person> = {
    "@context": "https://schema.org",
    "@type": "Person",
    name: props.name,
    ...(props.url && { url: props.url }),
    ...(props.image && { image: props.image }),
    ...(props.jobTitle && { jobTitle: props.jobTitle }),
    ...(props.worksFor && {
      worksFor: {
        "@type": "Organization",
        name: props.worksFor.name,
        ...(props.worksFor.url && { url: props.worksFor.url })
      }
    }),
    ...(props.description && { description: props.description }),
    ...(props.email && { email: props.email }),
    ...(props.telephone && { telephone: props.telephone }),
    ...(props.address && {
      address: {
        "@type": "PostalAddress",
        ...props.address
      }
    }),
    ...(props.sameAs && { sameAs: props.sameAs })
  }

  return <StructuredData data={data} />
}

// Product Schema
interface ProductProps {
  name: string
  description: string
  image?: string[]
  brand?: string
  sku?: string
  mpn?: string
  offers?: {
    price: string
    priceCurrency: string
    availability?: string
    url?: string
    seller?: string
  }
  aggregateRating?: {
    ratingValue: number
    reviewCount: number
    bestRating?: number
    worstRating?: number
  }
  review?: Array<{
    author: string
    datePublished: string
    reviewBody: string
    reviewRating: {
      ratingValue: number
      bestRating?: number
    }
  }>
}

export function ProductSchema(props: ProductProps) {
  const data: WithContext<Product> = {
    "@context": "https://schema.org",
    "@type": "Product",
    name: props.name,
    description: props.description,
    ...(props.image && { image: props.image }),
    ...(props.brand && { brand: { "@type": "Brand", name: props.brand } }),
    ...(props.sku && { sku: props.sku }),
    ...(props.mpn && { mpn: props.mpn }),
    ...(props.offers && {
      offers: {
        "@type": "Offer",
        price: props.offers.price,
        priceCurrency: props.offers.priceCurrency,
        ...(props.offers.availability && { availability: `https://schema.org/${props.offers.availability}` }),
        ...(props.offers.url && { url: props.offers.url }),
        ...(props.offers.seller && {
          seller: {
            "@type": "Organization",
            name: props.offers.seller
          }
        })
      }
    }),
    ...(props.aggregateRating && {
      aggregateRating: {
        "@type": "AggregateRating",
        ratingValue: props.aggregateRating.ratingValue,
        reviewCount: props.aggregateRating.reviewCount,
        bestRating: props.aggregateRating.bestRating || 5,
        worstRating: props.aggregateRating.worstRating || 1
      }
    }),
    ...(props.review && {
      review: props.review.map(review => ({
        "@type": "Review",
        author: {
          "@type": "Person",
          name: review.author
        },
        datePublished: review.datePublished,
        reviewBody: review.reviewBody,
        reviewRating: {
          "@type": "Rating",
          ratingValue: review.reviewRating.ratingValue,
          bestRating: review.reviewRating.bestRating || 5
        }
      }))
    })
  }

  return <StructuredData data={data} />
}

// Article Schema
interface ArticleProps {
  headline: string
  description: string
  image?: string[]
  author: {
    name: string
    url?: string
  }
  publisher: {
    name: string
    logo?: string
  }
  datePublished: string
  dateModified?: string
  url: string
  articleBody?: string
  wordCount?: number
  keywords?: string[]
}

export function ArticleSchema(props: ArticleProps) {
  const data: WithContext<Article> = {
    "@context": "https://schema.org",
    "@type": "Article",
    headline: props.headline,
    description: props.description,
    ...(props.image && { image: props.image }),
    author: {
      "@type": "Person",
      name: props.author.name,
      ...(props.author.url && { url: props.author.url })
    },
    publisher: {
      "@type": "Organization",
      name: props.publisher.name,
      ...(props.publisher.logo && {
        logo: {
          "@type": "ImageObject",
          url: props.publisher.logo
        }
      })
    },
    datePublished: props.datePublished,
    ...(props.dateModified && { dateModified: props.dateModified }),
    url: props.url,
    ...(props.articleBody && { articleBody: props.articleBody }),
    ...(props.wordCount && { wordCount: props.wordCount }),
    ...(props.keywords && { keywords: props.keywords })
  }

  return <StructuredData data={data} />
}

// Local Business Schema
interface LocalBusinessProps {
  name: string
  description?: string
  url?: string
  telephone?: string
  email?: string
  address: {
    streetAddress: string
    addressLocality: string
    addressRegion: string
    postalCode: string
    addressCountry: string
  }
  geo?: {
    latitude: number
    longitude: number
  }
  openingHours?: string[]
  priceRange?: string
  image?: string[]
  aggregateRating?: {
    ratingValue: number
    reviewCount: number
  }
}

export function LocalBusinessSchema(props: LocalBusinessProps) {
  const data: WithContext<LocalBusiness> = {
    "@context": "https://schema.org",
    "@type": "LocalBusiness",
    name: props.name,
    ...(props.description && { description: props.description }),
    ...(props.url && { url: props.url }),
    ...(props.telephone && { telephone: props.telephone }),
    ...(props.email && { email: props.email }),
    address: {
      "@type": "PostalAddress",
      ...props.address
    },
    ...(props.geo && {
      geo: {
        "@type": "GeoCoordinates",
        latitude: props.geo.latitude,
        longitude: props.geo.longitude
      }
    }),
    ...(props.openingHours && { openingHours: props.openingHours }),
    ...(props.priceRange && { priceRange: props.priceRange }),
    ...(props.image && { image: props.image }),
    ...(props.aggregateRating && {
      aggregateRating: {
        "@type": "AggregateRating",
        ratingValue: props.aggregateRating.ratingValue,
        reviewCount: props.aggregateRating.reviewCount
      }
    })
  }

  return <StructuredData data={data} />
}

// Event Schema
interface EventProps {
  name: string
  description: string
  startDate: string
  endDate?: string
  location: {
    name: string
    address: {
      streetAddress: string
      addressLocality: string
      addressRegion: string
      postalCode: string
      addressCountry: string
    }
  }
  organizer?: {
    name: string
    url?: string
  }
  offers?: {
    price: string
    priceCurrency: string
    availability?: string
    url?: string
  }
  image?: string[]
  url?: string
}

export function EventSchema(props: EventProps) {
  const data: WithContext<Event> = {
    "@context": "https://schema.org",
    "@type": "Event",
    name: props.name,
    description: props.description,
    startDate: props.startDate,
    ...(props.endDate && { endDate: props.endDate }),
    location: {
      "@type": "Place",
      name: props.location.name,
      address: {
        "@type": "PostalAddress",
        ...props.location.address
      }
    },
    ...(props.organizer && {
      organizer: {
        "@type": "Organization",
        name: props.organizer.name,
        ...(props.organizer.url && { url: props.organizer.url })
      }
    }),
    ...(props.offers && {
      offers: {
        "@type": "Offer",
        price: props.offers.price,
        priceCurrency: props.offers.priceCurrency,
        ...(props.offers.availability && { availability: `https://schema.org/${props.offers.availability}` }),
        ...(props.offers.url && { url: props.offers.url })
      }
    }),
    ...(props.image && { image: props.image }),
    ...(props.url && { url: props.url })
  }

  return <StructuredData data={data} />
}
[V0_FILE]typescriptreact:file="components/structured-data-examples.tsx"
import {
  OrganizationSchema,
  WebsiteSchema,
  BreadcrumbSchema,
  PersonSchema,
  ProductSchema,
  ArticleSchema,
  LocalBusinessSchema,
  EventSchema
} from "@/lib/structured-data"

// Example usage components
export function ExampleOrganization() {
  return (
    <OrganizationSchema
      name="Acme Corporation"
      url="https://acme.com"
      logo="https://acme.com/logo.png"
      description="Leading provider of innovative solutions"
      address={{
        streetAddress: "123 Business St",
        addressLocality: "San Francisco",
        addressRegion: "CA",
        postalCode: "94105",
        addressCountry: "US"
      }}
      contactPoint={{
        telephone: "+1-555-123-4567",
        email: "contact@acme.com",
        contactType: "customer service"
      }}
      sameAs={[
        "https://twitter.com/acme",
        "https://linkedin.com/company/acme"
      ]}
    />
  )
}

export function ExampleWebsite() {
  return (
    <WebsiteSchema
      name="Acme Blog"
      url="https://acme.com"
      description="Latest insights and updates from Acme"
      searchUrl="https://acme.com/search"
      searchQueryParam="q"
      author={{
        name: "Acme Team",
        url: "https://acme.com/about"
      }}
      publisher={{
        name: "Acme Corporation",
        logo: "https://acme.com/logo.png"
      }}
    />
  )
}

export function ExampleBreadcrumb() {
  return (
    <BreadcrumbSchema
      items={[
        { name: "Home", url: "https://acme.com" },
        { name: "Products", url: "https://acme.com/products" },
        { name: "Software", url: "https://acme.com/products/software" }
      ]}
    />
  )
}

export function ExamplePerson() {
  return (
    <PersonSchema
      name="John Doe"
      url="https://johndoe.com"
      image="https://johndoe.com/photo.jpg"
      jobTitle="Software Engineer"
      worksFor={{
        name: "Acme Corporation",
        url: "https://acme.com"
      }}
      description="Experienced software engineer specializing in web development"
      email="john@johndoe.com"
      sameAs={[
        "https://twitter.com/johndoe",
        "https://linkedin.com/in/johndoe"
      ]}
    />
  )
}

export function ExampleProduct() {
  return (
    <ProductSchema
      name="Acme Widget Pro"
      description="Professional-grade widget for all your needs"
      image={["https://acme.com/widget-1.jpg", "https://acme.com/widget-2.jpg"]}
      brand="Acme"
      sku="AWP-001"
      offers={{
        price: "99.99",
        priceCurrency: "USD",
        availability: "InStock",
        url: "https://acme.com/products/widget-pro"
      }}
      aggregateRating={{
        ratingValue: 4.5,
        reviewCount: 127
      }}
    />
  )
}

export function ExampleArticle() {
  return (
    <ArticleSchema
      headline="How to Build Better Software"
      description="A comprehensive guide to software development best practices"
      image={["https://acme.com/article-image.jpg"]}
      author={{
        name: "Jane Smith",
        url: "https://acme.com/authors/jane-smith"
      }}
      publisher={{
        name: "Acme Blog",
        logo: "https://acme.com/logo.png"
      }}
      datePublished="2024-01-15"
      dateModified="2024-01-20"
      url="https://acme.com/blog/build-better-software"
      keywords={["software", "development", "best practices"]}
    />
  )
}

export function ExampleLocalBusiness() {
  return (
    <LocalBusinessSchema
      name="Acme Coffee Shop"
      description="Artisanal coffee and pastries in downtown"
      url="https://acmecoffee.com"
      telephone="+1-555-COFFEE"
      address={{
        streetAddress: "456 Main St",
        addressLocality: "San Francisco",
        addressRegion: "CA",
        postalCode: "94102",
        addressCountry: "US"
      }}
      geo={{
        latitude: 37.7749,
        longitude: -122.4194
      }}
      openingHours={[
        "Mo-Fr 07:00-19:00",
        "Sa 08:00-20:00",
        "Su 08:00-18:00"
      ]}
      priceRange="$$"
      aggregateRating={{
        ratingValue: 4.8,
        reviewCount: 203
      }}
    />
  )
}

export function ExampleEvent() {
  return (
    <EventSchema
      name="Acme Tech Conference 2024"
      description="Annual technology conference featuring the latest innovations"
      startDate="2024-06-15T09:00:00"
      endDate="2024-06-16T17:00:00"
      location={{
        name: "Convention Center",
        address: {
          streetAddress: "789 Convention Blvd",
          addressLocality: "San Francisco",
          addressRegion: "CA",
          postalCode: "94103",
          addressCountry: "US"
        }
      }}
      organizer={{
        name: "Acme Corporation",
        url: "https://acme.com"
      }}
      offers={{
        price: "299.00",
        priceCurrency: "USD",
        availability: "InStock",
        url: "https://acme.com/conference/tickets"
      }}
      image={["https://acme.com/conference-banner.jpg"]}
      url="https://acme.com/conference"
    />
  )
}
[V0_FILE]typescriptreact:file="app/page.tsx" isDeleted="true"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { Badge } from "@/components/ui/badge"
import { 
  ExampleOrganization,
  ExampleWebsite,
  ExampleBreadcrumb,
  ExamplePerson,
  ExampleProduct,
  ExampleArticle,
  ExampleLocalBusiness,
  ExampleEvent
} from "@/components/structured-data-examples"

export default function StructuredDataLibrary() {
  const schemas = [
    {
      name: "Organization",
      description: "For companies, organizations, and institutions",
      component: <ExampleOrganization />,
      useCase: "Company pages, about pages, contact pages"
    },
    {
      name: "Website",
      description: "For websites and web applications",
      component: <ExampleWebsite />,
      useCase: "Homepage, main site pages"
    },
    {
      name: "Breadcrumb",
      description: "For navigation breadcrumbs",
      component: <ExampleBreadcrumb />,
      useCase: "Product pages, category pages, deep navigation"
    },
    {
      name: "Person",
      description: "For individual people and profiles",
      component: <ExamplePerson />,
      useCase: "Author pages, team member profiles, personal websites"
    },
    {
      name: "Product",
      description: "For products and services",
      component: <ExampleProduct />,
      useCase: "E-commerce product pages, service listings"
    },
    {
      name: "Article",
      description: "For blog posts, news articles, and content",
      component: <ExampleArticle />,
      useCase: "Blog posts, news articles, documentation"
    },
    {
      name: "Local Business",
      description: "For local businesses and physical locations",
      component: <ExampleLocalBusiness />,
      useCase: "Restaurant pages, store locations, service providers"
    },
    {
      name: "Event",
      description: "For events, conferences, and gatherings",
      component: <ExampleEvent />,
      useCase: "Event pages, conference listings, meetups"
    }
  ]

  return (
    <div className="min-h-screen bg-gradient-to-br from-slate-50 to-slate-100 p-8">
      <div className="max-w-7xl mx-auto">
        <div className="text-center mb-12">
          <h1 className="text-4xl font-bold text-slate-900 mb-4">
            Generic Structured Data Library
          </h1>
          <p className="text-xl text-slate-600 max-w-3xl mx-auto">
            A comprehensive collection of reusable structured data components for better SEO and search engine understanding. 
            Each component follows Schema.org standards and includes XSS protection.
          </p>
        </div>

        <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mb-12">
          {schemas.map((schema) => (
            <Card key={schema.name} className="hover:shadow-lg transition-shadow">
              <CardHeader>
                <div className="flex items-center justify-between">
                  <CardTitle className="text-lg">{schema.name} Schema</CardTitle>
                  <Badge variant="secondary">Schema.org</Badge>
                </div>
                <CardDescription>{schema.description}</CardDescription>
              </CardHeader>
              <CardContent>
                <div className="space-y-3">
                  <div>
                    <h4 className="font-medium text-sm text-slate-700 mb-1">Use Cases:</h4>
                    <p className="text-sm text-slate-600">{schema.useCase}</p>
                  </div>
                  <div className="hidden">
                    {schema.component}
                  </div>
                </div>
              </CardContent>
            </Card>
          ))}
        </div>

        <Card className="mb-8">
          <CardHeader>
            <CardTitle>Key Features</CardTitle>
            <CardDescription>What makes this library special</CardDescription>
          </CardHeader>
          <CardContent>
            <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
              <div className="space-y-2">
                <h4 className="font-medium text-slate-900">🔒 XSS Protection</h4>
                <p className="text-sm text-slate-600">
                  Automatic sanitization of dangerous characters to prevent XSS attacks
                </p>
              </div>
              <div className="space-y-2">
                <h4 className="font-medium text-slate-900">📝 TypeScript Support</h4>
                <p className="text-sm text-slate-600">
                  Full TypeScript support with schema-dts for type safety
                </p>
              </div>
              <div className="space-y-2">
                <h4 className="font-medium text-slate-900">🎯 Schema.org Compliant</h4>
                <p className="text-sm text-slate-600">
                  All components follow official Schema.org specifications
                </p>
              </div>
              <div className="space-y-2">
                <h4 className="font-medium text-slate-900">🔧 Highly Configurable</h4>
                <p className="text-sm text-slate-600">
                  Flexible props system with optional fields for customization
                </p>
              </div>
              <div className="space-y-2">
                <h4 className="font-medium text-slate-900">⚡ Performance Optimized</h4>
                <p className="text-sm text-slate-600">
                  Lightweight components with minimal runtime overhead
                </p>
              </div>
              <div className="space-y-2">
                <h4 className="font-medium text-slate-900">🎨 Framework Agnostic</h4>
                <p className="text-sm text-slate-600">
                  Works with Next.js, React, and other modern frameworks
                </p>
              </div>
            </div>
          </CardContent>
        </Card>

        <Card>
          <CardHeader>
            <CardTitle>Installation & Usage</CardTitle>
            <CardDescription>How to use these components in your project</CardDescription>
          </CardHeader>
          <CardContent>
            <div className="space-y-4">
              <div>
                <h4 className="font-medium mb-2">1. Install Dependencies</h4>
                <code className="block bg-slate-100 p-3 rounded text-sm">
                  npm install schema-dts
                </code>
              </div>
              <div>
                <h4 className="font-medium mb-2">2. Copy the Library</h4>
                <p className="text-sm text-slate-600 mb-2">
                  Copy the <code>lib/structured-data.tsx</code> file to your project
                </p>
              </div>
              <div>
                <h4 className="font-medium mb-2">3. Use in Your Components</h4>
                <code className="block bg-slate-100 p-3 rounded text-sm whitespace-pre">
{`import { OrganizationSchema } from "@/lib/structured-data"

export default function AboutPage() {
  return (
    <div>
      <OrganizationSchema
        name="Your Company"
        url="https://yoursite.com"
        description="Your company description"
      />
      {/* Your page content */}
    </div>
  )
}`}
                </code>
              </div>
            </div>
          </CardContent>
        </Card>
      </div>
    </div>
  )
}
[V0_FILE]typescriptreact:file="README.md" type="code" isDeleted="true"
# Generic Structured Data Library

A comprehensive, type-safe library for adding structured data to your web applications. Built with TypeScript and following Schema.org standards.

## Features

- 🔒 **XSS Protection**: Automatic sanitization of dangerous characters
- 📝 **TypeScript Support**: Full type safety with schema-dts
- 🎯 **Schema.org Compliant**: Follows official specifications
- 🔧 **Highly Configurable**: Flexible props with optional fields
- ⚡ **Performance Optimized**: Lightweight with minimal overhead
- 🎨 **Framework Agnostic**: Works with Next.js, React, and more

## Installation

```bash
npm install schema-dts
```

## Available Schemas

### OrganizationSchema
For companies, organizations, and institutions.

```tsx
<OrganizationSchema
  name="Acme Corporation"
  url="https://acme.com"
  logo="https://acme.com/logo.png"
  description="Leading provider of innovative solutions"
  address={{
    streetAddress: "123 Business St",
    addressLocality: "San Francisco",
    addressRegion: "CA",
    postalCode: "94105",
    addressCountry: "US"
  }}
  contactPoint={{
    telephone: "+1-555-123-4567",
    email: "contact@acme.com",
    contactType: "customer service"
  }}
  sameAs={[
    "https://twitter.com/acme",
    "https://linkedin.com/company/acme"
  ]}
/>
```

### WebsiteSchema
For websites and web applications.

```tsx
<WebsiteSchema
  name="Acme Blog"
  url="https://acme.com"
  description="Latest insights and updates"
  searchUrl="https://acme.com/search"
  searchQueryParam="q"
  author={{
    name: "Acme Team",
    url: "https://acme.com/about"
  }}
/>
```

### ProductSchema
For e-commerce products and services.

```tsx
<ProductSchema
  name="Acme Widget Pro"
  description="Professional-grade widget"
  brand="Acme"
  sku="AWP-001"
  offers={{
    price: "99.99",
    priceCurrency: "USD",
    availability: "InStock"
  }}
  aggregateRating={{
    ratingValue: 4.5,
    reviewCount: 127
  }}
/>
```

### ArticleSchema
For blog posts, news articles, and content.

```tsx
<ArticleSchema
  headline="How to Build Better Software"
  description="A comprehensive guide"
  author={{
    name: "Jane Smith",
    url: "https://acme.com/authors/jane-smith"
  }}
  publisher={{
    name: "Acme Blog",
    logo: "https://acme.com/logo.png"
  }}
  datePublished="2024-01-15"
  url="https://acme.com/blog/build-better-software"
/>
```

### PersonSchema
For individual people and profiles.

```tsx
<PersonSchema
  name="John Doe"
  jobTitle="Software Engineer"
  worksFor={{
    name: "Acme Corporation",
    url: "https://acme.com"
  }}
  email="john@johndoe.com"
  sameAs={[
    "https://twitter.com/johndoe",
    "https://linkedin.com/in/johndoe"
  ]}
/>
```

### LocalBusinessSchema
For local businesses and physical locations.

```tsx
<LocalBusinessSchema
  name="Acme Coffee Shop"
  description="Artisanal coffee and pastries"
  telephone="+1-555-COFFEE"
  address={{
    streetAddress: "456 Main St",
    addressLocality: "San Francisco",
    addressRegion: "CA",
    postalCode: "94102",
    addressCountry: "US"
  }}
  openingHours={[
    "Mo-Fr 07:00-19:00",
    "Sa 08:00-20:00"
  ]}
/>
```

### EventSchema
For events, conferences, and gatherings.

```tsx
<EventSchema
  name="Acme Tech Conference 2024"
  description="Annual technology conference"
  startDate="2024-06-15T09:00:00"
  endDate="2024-06-16T17:00:00"
  location={{
    name: "Convention Center",
    address: {
      streetAddress: "789 Convention Blvd",
      addressLocality: "San Francisco",
      addressRegion: "CA",
      postalCode: "94103",
      addressCountry: "US"
    }
  }}
  offers={{
    price: "299.00",
    priceCurrency: "USD",
    availability: "InStock"
  }}
/>
```

### BreadcrumbSchema
For navigation breadcrumbs.

```tsx
<BreadcrumbSchema
  items={[
    { name: "Home", url: "https://acme.com" },
    { name: "Products", url: "https://acme.com/products" },
    { name: "Software", url: "https://acme.com/products/software" }
  ]}
/>
```

## Security

All components include XSS protection by default. The library automatically sanitizes dangerous characters like `<` to prevent injection attacks. You can disable this by setting `sanitize={false}` on the base `StructuredData` component, but this is not recommended.

## Validation

You can validate your structured data using:
- [Google's Rich Results Test](https://search.google.com/test/rich-results)
- [Schema Markup Validator](https://validator.schema.org/)

## Contributing

Feel free to extend this library with additional schema types or improvements.