A Laioutr app is a standard Nuxt module, packaged as an npm package. If you have built a Nuxt module before, you already know 80% of what you need. The Laioutr-specific parts are a registration call (registerLaioutrApp), a config key convention, and a set of APIs for connecting data sources and UI components to the platform.
The Custom App Development section explains how to build, configure, and maintain Laioutr apps. These are Nuxt modules that integrate external systems (commerce, CMS, analytics, hosting, etc.) with the Laioutr platform.
If you want to:
...this is the place to start.
Laioutr apps are the primary extension mechanism for the platform. Here is what you can build with one:
Laioutr uses a definition-first approach for sections and blocks. You start by declaring what your component is and what it needs, and the platform takes care of the rest.
Every section and block exports a definition object created with defineSection() or defineBlock(). This definition declares the component's name, label, and schema (the fields that appear in the Studio sidebar when an editor selects your component).
import { defineSection, definitionToProps } from '#imports';
export const definition = defineSection({
component: 'SectionHeroBanner',
studio: {
label: 'Hero Banner',
},
slots: [
{ name: 'default', studio: { label: 'Content' } },
],
schema: [
{
label: 'Content',
fields: [
{ type: 'text', name: 'heading', label: 'Heading' },
{ type: 'media', name: 'backgroundImage', label: 'Background Image' },
{ type: 'text', name: 'ctaLabel', label: 'Button Label' },
{ type: 'link', name: 'ctaLink', label: 'Button Link' },
],
},
],
});
Instead of writing Vue props by hand, you use definitionToProps() to infer props directly from the definition. This eliminates duplication and guarantees that your component's props always match what Studio sends.
Both the definition and the component logic live in the same .vue file. The definition is exported from a regular <script lang="ts"> block, and definitionToProps() is used in <script setup>:
<script setup lang="ts">
const props = defineProps(definitionToProps(definition));
</script>
The definition is the single source of truth. Studio reads it to build the sidebar editor, Frontend Core reads it to wire up data, and your component reads it to define its props. See Section Definitions and Block Definitions for the full guide.
Understanding how pages are composed helps you decide whether to build a section or a block.
Page → Variant → Header / Body / Footer → Sections → Slots → Blocks
| Concept | Role | Example |
|---|---|---|
| Section | A top-level page component that fills a row of the page layout. | Hero banner, product grid, testimonial carousel, newsletter signup |
| Block | A smaller component that lives inside a section's slot. | A single slide in a carousel, a product card in a grid, a FAQ item |
| Slot | A named insertion point inside a section where blocks are placed. | A carousel section might have a slides slot that accepts slide blocks |
Sections are what editors add directly to a page region (header, body, footer) in Studio. Blocks are what editors place inside sections, into the slots that the section defines. This two-level composition keeps sections flexible without making them monolithic.
laioutrrc.json, runtime config, and per-app options work, and how configuration is passed into your Nuxt module.Together, these guides help you move from a blank repository to a production-ready Laioutr app that fits cleanly into the overall frontend and CI/CD flows.