Nuxt Layers & Templates in Composable Frontends #2323
Maciek Kucmus (mkucmus)
started this conversation in
Ideas
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
📢 We're introducing an updated storefront scaffolding model based on Nuxt Layers and the official Composable Frontends templates.
This is an architectural direction update. We want feedback early.
TL;DR — We Need Your Feedback
Before diving into the details, here's what we're looking for:
If you build or maintain multiple storefronts, your feedback is especially valuable.
👉🏼 Full details below, however you are able to see the templates in action by running StackBlitz example in just one click:

The Layer Chain
Every storefront built with Frontends follows a layered architecture. The full chain looks like this:
Each layer adds structure, components, and configuration. Child layers inherit everything from their parents and can selectively override what they need.
Templates
Shopware Frontends provides official templates as starting points:
vue-starter-templatevue-starter-template-extended(Lumora)Choose your entry point based on how much structure you want to start with.
Base:
vue-starter-templateThe base template is a fully functional storefront. It provides:
@shopware/cms-base-layer@nuxtjs/i18n@nuxt/image@nuxt/a11yIt focuses on structure and integration — not visual identity.
It is designed to be extended via Nuxt Layers:
CMS Base Layer
@shopware/cms-base-layeris registered in the base template and provides:@nuxt/imageprovider with presets (productCard, productDetail, thumbnail, hero)Child layers can override specific CMS blocks by placing a same-named component in their own
app/components/directory — no need to copy the entire CMS implementation.How Component Overrides Work
Components resolve by layer precedence — child layers win over parent layers.
The base template registers its components with
priority: 2, which overrides the CMS base layer's defaults. Your child layer automatically gets the highest priority.To override a component, place a file with the same name in your project's
app/components/directory. That's it — no configuration needed.Design Tokens
The color system uses semantic tokens organized by purpose:
UnoCSS configs chain through layers using
mergeConfigs(). Each layer imports its parent's config and merges its overrides:Extended:
vue-starter-template-extendedThe extended template (Lumora) is the proof that this architecture works.
It creates a fully rebranded storefront with only these source files:
nuxt.config.tsextendstovue-starter-templateuno.config.tsapp/app.config.tsThat's it. Three files. Every page, component, composable, and integration is inherited from the base template. The entire Lumora brand identity comes from swapping the design tokens.
This is not a different architecture — it validates that the base layer supports real storefront customization without duplication.
What This Enables
For agencies and multi-storefront teams:
For individual projects:
For the ecosystem:
Beta Was this translation helpful? Give feedback.
All reactions