Loading...
Loading...
Apply when designing or modifying a VTEX IO storefront theme app — the app that owns `store/blocks.json`, `store/routes.json`, `store/templates/`, `store/contentSchemas.json`, and the storefront page tree assembled from `store.home`, `store.product`, `store.search`, `store.custom`, and other native page templates. Covers how a theme app extends a base theme, declares routes, composes blocks across pages, and how its `store/` files relate to merchant Site Editor content. Use for theme scaffolding, custom page routes, theme-level overrides, or reviewing whether a change belongs in the theme app, in a component app, or in app settings.
npx skill4agent add vtex/skills vtex-io-storefront-theme-appvendor.store-themestorestore/blocks.jsonstore/blocks/store/routes.jsonstore.homestore.productstore.searchstore.customvtex.store-themestore/interfaces.jsonvtex-io-render-runtime-and-blocksvtex-io-storefront-reactmastervtex-io-storefront-theme-versioningvtex-io-messages-and-i18nstoremanifest.jsonmanifest.json#dependenciesvtex.store-themestore/blocks.jsonstore/blocks/store/interfaces.jsonstore/routes.jsonstore.customstore.productstore.search//{slug}/pstore/contentSchemas.jsonvtex.pages-graphqlstore/vtex.pages-graphqlflex-layout.rowflex-layout.colvtex-io-storefront-theme-versioningstore"store"manifest.json#buildersvtex.store-themestorestore/store.homestore.productstore.searchstore/blocks.jsonstore/routes.json"store"buildersvtex.store-themedependenciespeerDependencies{
"vendor": "acme",
"name": "store-theme",
"version": "1.0.0",
"title": "ACME Store Theme",
"builders": {
"store": "0.x",
"messages": "1.x"
},
"dependencies": {
"vtex.store-theme": "2.x",
"acme.product-widgets": "0.x"
}
}{
"vendor": "acme",
"name": "store-theme",
"version": "1.0.0",
"builders": {
"messages": "1.x"
},
"dependencies": {}
}store/store/blocks.jsonstore/blocks.jsoninterfaces.jsonMissing blockvtex.pages-graphqlvendor.app@MAJOR.x:block-idstore/blocks.jsonmanifest.json#dependenciesstore/interfaces.jsonacme.product-widgets@0.x0.x5.x// manifest.json
{
"dependencies": {
"vtex.store-theme": "2.x",
"acme.product-widgets": "0.x"
}
}// store/blocks.json
{
"store.product": {
"children": [
"flex-layout.row#product-main",
"acme-related-products"
]
},
"acme-related-products": {
"props": { "limit": 8 }
}
}// acme.product-widgets@0.x ships store/interfaces.json with:
{
"acme-related-products": {
"component": "RelatedProducts"
}
}// manifest.json depends on acme.product-widgets@0.x
// but store/blocks.json references a block that only exists in @5.x
{
"store.product": {
"children": ["acme-new-related-products"]
}
}Missing block acme.product-widgets@0.x:acme-new-related-productsstore/routes.jsonstore/routes.jsonpathcontextstore.productstore.custom#<id>store/blocks.jsonstore.productstore/routes.jsonpathstore/blocks.jsoncontext// store/routes.json
{
"store.custom#about": {
"path": "/institucional/sobre",
"context": "vtex.store-resources/InstitutionalPageContext"
}
}// store/blocks.json
{
"store.custom#about": {
"blocks": ["rich-text#about-body"]
}
}// store/routes.json
{
"store.custom#about": {
"path": "/p/sobre"
}
}/p/sobrecontextstore.custom#aboutstore/blocks.jsonacme.store-theme/
├── manifest.json # store builder, base theme dependency
├── messages/ # localized strings (separate skill)
└── store/
├── blocks.json # global block declarations
├── routes.json # custom routes
├── contentSchemas.json # Site Editor-editable props
└── blocks/ # per-template block trees
├── home.jsonc
├── product.jsonc
├── search.jsonc
├── category.jsonc
└── custom/
├── about.jsonc
└── stores.jsoncstore.home{
"store.home": {
"blocks": [
"flex-layout.row#home-hero",
"shelf#home-best-sellers",
"rich-text#home-newsletter"
]
},
"flex-layout.row#home-hero": {
"children": ["image#hero-banner"]
},
"image#hero-banner": {
"props": {
"src": "/arquivos/home-hero.png",
"alt": "Promotional banner"
}
}
}// store/routes.json
{
"store.custom#about": {
"path": "/institucional/sobre",
"context": "vtex.store-resources/InstitutionalPageContext"
}
}// store/blocks/custom/about.jsonc
{
"store.custom#about": {
"blocks": ["flex-layout.row#about-body"]
},
"flex-layout.row#about-body": {
"children": ["rich-text#about-copy"]
},
"rich-text#about-copy": {
"props": {
"text": "About ACME — see Site Editor for the live copy."
}
}
}// store/contentSchemas.json
{
"rich-text#about-copy": {
"type": "object",
"properties": {
"text": {
"type": "string",
"title": "Body copy",
"widget": { "ui:widget": "textarea" }
}
}
}
}textvtex.pages-graphqlvtex-io-storefront-theme-versioningupdateThemeIdsvtex.store-themestore/blocks.jsonstore/blocks.jsonpropscontentSchemas.jsonstore/routes.jsonstore.custom#<id>store/blocks.jsonupdateThemeIdsvtex.pages-graphql@2.xvtex-io-storefront-theme-versioningstore/manifest.jsonstorestore/blocks.jsoninterfaces.jsonstore/routes.jsonpathcontextstore/blocks.jsoncontentSchemas.jsonpropsvtex-io-storefront-theme-versioningmastervtex-io-render-runtime-and-blocksvtex-io-storefront-reactvtex-io-app-contractvtex.store-themecontentSchemas.json