X Enterprises
nuxt-x-schema

Schema Components

All 16 Schema.org JSON-LD components with props reference.

Schema Components

All components inject a <script type="application/ld+json"> tag and accept structured data as props. No visible output — SEO only.


XSchemaArticle

<XSchemaArticle
  headline="My Blog Post"
  date-published="2024-01-15"
  author="Jane Doe"
/>

Props

PropTypeRequiredDefaultDescription
headlineStringYesArticle headline
descriptionStringNonullShort article description
imageString | ArrayNonullImage URL(s)
datePublishedStringYesISO 8601 publish date
dateModifiedStringNonullISO 8601 modified date
authorString | Object | ArrayYesAuthor name, Person object, or array
publisherObjectNonullPublisher Organization object
articleTypeStringNo"BlogPosting"Schema type: Article, BlogPosting, NewsArticle, TechArticle
urlStringNonullCanonical URL
wordCountNumberNonullApproximate word count

XSchemaBreadcrumb

<XSchemaBreadcrumb
  :items="[
    { label: 'Home', to: '/' },
    { label: 'Blog', to: '/blog' },
    { label: 'My Post' }
  ]"
/>

Props

PropTypeRequiredDescription
itemsBreadcrumbItem[]YesArray of breadcrumb items. Each item: { label, name, to, item }. The last item (current page) should omit to/item

XSchemaEvent

<XSchemaEvent
  name="Vue Conference 2024"
  description="Annual Vue.js community conference"
  start-date="2024-06-01T09:00:00"
  end-date="2024-06-02T18:00:00"
  event-attendance-mode="OfflineEventAttendanceMode"
/>

Props

PropTypeRequiredDefaultDescription
nameStringYesEvent name
descriptionStringYesEvent description
startDateStringYesISO 8601 start datetime
endDateStringYesISO 8601 end datetime
eventAttendanceModeStringNo"OnlineEventAttendanceMode"OnlineEventAttendanceMode, OfflineEventAttendanceMode, MixedEventAttendanceMode
eventStatusStringNo"EventScheduled"EventScheduled, EventCancelled, EventPostponed, etc.
locationRecord<string, any>NoLocation object (Place or VirtualLocation)
urlStringNoEvent URL
imageString | String[]NoEvent image URL(s)
organizerOrganizationNoOrganizer Organization object
offersOfferNoTicket/registration Offer object

XSchemaFAQ

<XSchemaFAQ
  :items="[
    { label: 'What is Vue?', content: 'A progressive JavaScript framework.' },
    { label: 'Is it free?', content: 'Yes, MIT licensed.' }
  ]"
/>

Props

PropTypeRequiredDescription
itemsFAQ[]YesArray of FAQ items. Each item accepts: label/question/name for the question; content/answer/text for the answer
pageTitleStringNoOptional page name added to the schema
pageDescriptionStringNoOptional page description
datePublishedStringNoISO 8601 publish date
dateModifiedStringNoISO 8601 modified date
authorString | PersonNoPage author

XSchemaHowTo

<XSchemaHowTo
  name="How to make coffee"
  :steps="[
    { name: 'Boil water', text: 'Heat water to 95°C' },
    { name: 'Add grounds', text: 'Add 2 tbsp of coffee grounds' }
  ]"
  total-time="PT5M"
/>

Props

PropTypeRequiredDescription
nameStringYesHow-to title
descriptionStringNoHow-to description
imageString | String[]NoIllustration image URL(s)
totalTimeStringNoISO 8601 duration (e.g. PT30M)
estimatedCostMonetaryAmountNoEstimated cost object { currency, value }
supplyString[]NoList of required supplies
toolString[]NoList of required tools
stepsHowToStep[]YesArray of steps. Each step: { name, text, image?, url? }

XSchemaLocalBusiness

<XSchemaLocalBusiness
  name="Acme Coffee"
  business-type="CafeOrCoffeeShop"
  url="https://acmecoffee.com"
  :address="{
    streetAddress: '123 Main St',
    addressLocality: 'Seattle',
    addressRegion: 'WA',
    postalCode: '98101',
    addressCountry: 'US'
  }"
  telephone="+12065551234"
/>

Props

PropTypeRequiredDescription
nameStringYesBusiness name
businessTypeStringYesSchema.org business type (e.g. Restaurant, MedicalClinic)
urlStringYesBusiness website URL
addressPostalAddressYesAddress object: { streetAddress, addressLocality, addressRegion, postalCode, addressCountry }
telephoneStringNoPhone number
emailStringNoContact email
imageStringNoBusiness image URL
descriptionStringNoBusiness description
openingHoursSpecificationRecord<string,any>[]NoArray of opening hours objects
aggregateRatingAggregateRatingNoRating object { ratingValue, reviewCount }
priceRangeStringNoPrice range indicator (e.g. $$)
sameAsString[]NoSocial profile and directory URLs

XSchemaOffer

<XSchemaOffer
  name="Premium Plan"
  :price="49.99"
  price-currency="USD"
  availability="InStock"
  url="https://example.com/premium"
/>

Props

PropTypeRequiredDefaultDescription
nameStringYesOffer name
descriptionStringNoOffer description
priceString | NumberYesPrice value
priceCurrencyStringNo"USD"ISO 4217 currency code
availabilityStringNo"InStock"InStock, OutOfStock, PreOrder, etc.
urlStringNoOffer URL
sellerOrganizationNoSeller Organization object
validFromStringNoISO 8601 offer start date
validThroughStringNoISO 8601 offer end date
priceValidUntilStringNoISO 8601 price expiry date
itemConditionStringNo"NewCondition"NewCondition, UsedCondition, RefurbishedCondition

XSchemaOrganization

<XSchemaOrganization
  name="Acme Corp"
  url="https://acme.com"
  logo="https://acme.com/logo.png"
  :same-as="['https://twitter.com/acme', 'https://linkedin.com/company/acme']"
/>

Props

PropTypeRequiredDefaultDescription
nameStringYesOrganization name
urlStringYesOrganization URL
logoStringYesLogo image URL
legalNameStringNoOfficial legal name
descriptionStringNoOrganization description
emailStringNoContact email
telephoneStringNoContact phone
addressPostalAddressNoPostal address object
sameAsString[]No[]Social and directory profile URLs
foundingDateStringNoISO 8601 founding date
founderString | PersonNoFounder name or Person object

XSchemaPerson

<XSchemaPerson
  name="Jane Doe"
  job-title="Senior Engineer"
  url="https://janedoe.dev"
  :same-as="['https://github.com/janedoe']"
/>

Props

PropTypeRequiredDefaultDescription
nameStringYesPerson's full name
jobTitleStringNoJob title
descriptionStringNoShort bio
imageStringNoProfile image URL
urlStringNoPersonal website URL
emailStringNoEmail address
telephoneStringNoPhone number
sameAsString[]No[]Social and profile URLs
worksForOrganizationNoEmployer Organization object
knowsAboutString[]No[]Topics the person knows about
alumniOfString | OrganizationNoEducational institution

XSchemaProduct

<XSchemaProduct
  name="Wireless Headphones"
  description="Premium noise-cancelling headphones"
  :offers="{ price: '199.99', priceCurrency: 'USD' }"
  sku="WH-1234"
/>

Props

PropTypeRequiredDescription
nameStringYesProduct name
descriptionStringYesProduct description
imageString | String[]NoProduct image URL(s)
brandString | OrganizationNoBrand name or Organization object
offersOfferYesOffer object with price and availability
aggregateRatingAggregateRatingNoRating object { ratingValue, reviewCount }
reviewReview[]NoArray of Review objects
skuStringNoStock-keeping unit identifier
manufacturerString | OrganizationNoManufacturer name or Organization
categoryStringNoProduct category

XSchemaQAPage

<XSchemaQAPage
  :items="[
    {
      label: 'What is the capital of France?',
      content: 'Paris',
      answerAuthor: 'Expert User',
      upvoteCount: 42
    }
  ]"
/>

Props

PropTypeRequiredDescription
itemsQAItem[]YesArray of Q&A items. Each item: label/question/name for question; content/answer/text for accepted answer; optional answerAuthor, answerDate, suggestedAnswers, upvoteCount, answerCount, dateCreated
pageTitleStringNoPage name
pageDescriptionStringNoPage description
datePublishedStringNoISO 8601 publish date
dateModifiedStringNoISO 8601 modified date
authorString | PersonNoPage author

XSchemaReview

<XSchemaReview
  :item-reviewed="{ '@type': 'Product', name: 'Headphones' }"
  :review-rating="{ ratingValue: 5, bestRating: 5 }"
  author="Jane Doe"
  review-body="Excellent sound quality!"
/>

Props

PropTypeRequiredDefaultDescription
itemReviewedRecord<string, any>YesThe item being reviewed (include @type and name)
reviewRatingRatingYesRating object { ratingValue, bestRating? }
authorString | PersonYesReviewer name or Person object
reviewBodyStringNoFull review text
datePublishedStringNoISO 8601 review date
isAggregatebooleanNofalseWhen true, outputs AggregateRating schema instead of individual Review
ratingCountNumberNoTotal rating count (aggregate mode)
reviewCountNumberNoTotal review count (aggregate mode)

XSchemaService

<XSchemaService
  name="Web Development"
  description="Custom web application development services"
  service-type="WebDevelopment"
  area-served="Seattle, WA"
/>

Props

PropTypeRequiredDescription
nameStringYesService name
descriptionStringYesService description
serviceTypeStringYesService type identifier
providerOrganizationNoProvider Organization object (defaults to app config organization)
areaServedString | String[]NoGeographic area(s) served
offersOfferNoPricing Offer object
imageString | String[]NoService image URL(s)
urlStringNoService page URL
categoryStringNoService category

XSchemaSoftwareApplication

<XSchemaSoftwareApplication
  name="MyApp"
  description="A productivity application"
  url="https://myapp.com"
  application-category="BusinessApplication"
  operating-system="Web"
/>

Props

PropTypeRequiredDescription
nameStringYesApplication name
descriptionStringYesApplication description
urlStringYesApplication URL
applicationCategoryStringYesSchema.org application category (e.g. GameApplication, BusinessApplication)
operatingSystemString | String[]NoSupported OS(es)
offersOfferNoPricing Offer object
aggregateRatingAggregateRatingNoRating object
authorString | PersonNoDeveloper name or Person object
screenshotString | String[]NoScreenshot URL(s)
releaseNotesStringNoRelease notes URL or text

XSchemaVideoObject

<XSchemaVideoObject
  name="Introduction to Vue 3"
  description="A beginner-friendly overview of Vue 3"
  thumbnail-url="https://example.com/thumb.jpg"
  upload-date="2024-01-10"
  content-url="https://example.com/video.mp4"
  duration="PT12M30S"
/>

Props

PropTypeRequiredDescription
nameStringYesVideo title
descriptionStringYesVideo description
thumbnailUrlString | String[]YesThumbnail image URL(s)
uploadDateStringYesISO 8601 upload date
durationStringNoISO 8601 duration (e.g. PT1H30M)
contentUrlStringNoDirect URL to the video file
embedUrlStringNoEmbed URL (e.g. YouTube embed)
interactionCountNumberNoNumber of views/interactions
authorString | PersonNoCreator name or Person object

XSchemaWebSite

<XSchemaWebSite
  name="My Website"
  url="https://example.com"
  :enable-search-box="true"
  search-url="https://example.com/search?q={search_term_string}"
/>

Props

PropTypeRequiredDefaultDescription
nameStringYesWebsite name
urlStringYesWebsite URL
descriptionStringNoWebsite description
publisherOrganizationNoPublisher Organization object
enableSearchBoxbooleanNofalseAdd Sitelinks Search Box potentialAction
searchUrlStringNoSearch URL template; required when enableSearchBox is true
queryInputStringNo"required name=search_term_string"query-input value for the SearchAction

AI Context

package: "@xenterprises/nuxt-x-schema"
all-components:
  - XSchemaArticle
  - XSchemaBreadcrumb
  - XSchemaEvent
  - XSchemaFAQ
  - XSchemaHowTo
  - XSchemaLocalBusiness
  - XSchemaOffer
  - XSchemaOrganization
  - XSchemaPerson
  - XSchemaProduct
  - XSchemaQAPage
  - XSchemaReview
  - XSchemaService
  - XSchemaSoftwareApplication
  - XSchemaVideoObject
  - XSchemaWebSite
output: JSON-LD script tag in <head>
use-when: Adding structured data for rich Google results
place: In page-level components (pages/ or layouts/), NOT in shared headers
pattern: One component per page type — Article on blog posts, Product on product pages, etc.
notes:
  - All components are wrapped in <ClientOnly>
  - No visible rendered output; purely SEO metadata
  - XSchemaReview can output either Review or AggregateRating schema via isAggregate prop
  - XSchemaBreadcrumb auto-converts relative URLs to absolute using a base domain
  - XSchemaService defaults provider to app config organization when omitted
Copyright © 2026