# @sveltopia/regions - Complete Reference > Named content regions for SvelteKit - pass content from child pages to parent layouts. This document provides complete documentation for AI assistants helping developers use @sveltopia/regions. --- ## Table of Contents 1. Overview 2. Installation & Setup 3. Core Concepts 4. Three Strategies - Load Function (SSR) - Component Wrapper - Snippet 5. API Reference 6. CLI Tool 7. Validation 8. Advanced Patterns 9. Error Handling 10. Decision Guide --- ## 1. Overview SvelteKit layouts have one `{@render children()}` slot. @sveltopia/regions enables multiple named content regions, allowing pages to pass different content to different parts of a layout. **Use Cases:** - Page titles and breadcrumbs in layout headers - Sidebar content that varies by page - Action buttons in layout toolbars - Footer widgets specific to certain pages **Requirements:** - SvelteKit 2+ - Svelte 5+ (uses runes syntax) --- ## 2. Installation & Setup ### Install the Package ```bash npm install @sveltopia/regions # or pnpm add @sveltopia/regions # or yarn add @sveltopia/regions ``` ### One-Time Root Layout Setup Wrap your root layout with `LayoutRegions`: ```svelte {@render children()} ``` This enables the region system throughout your app. Only needed once in the root layout. --- ## 3. Core Concepts ### Region Flow 1. **Define** - Place `` in layouts where content should appear 2. **Populate** - Pages provide content via load functions, component wrappers, or snippets 3. **Render** - Layout regions render the content from their child pages ### The `regions` Convention When using load functions, return region data under the `regions` key: ```typescript // +page.server.ts export const load = () => { return { regions: { header: { title: 'My Page' }, sidebar: { items: ['a', 'b', 'c'] } } }; }; ``` --- ## 4. Three Strategies ### 4.1 Load Function Strategy (SSR) **Best for:** SEO content, page titles, breadcrumbs, server-rendered data. **Page (+page.server.ts or +page.ts):** ```typescript import type { PageServerLoad } from './$types'; export const load: PageServerLoad = () => { return { regions: { pageHeader: { title: 'Products', description: 'Browse our catalog' } } }; }; ``` **Layout (+layout.svelte):** ```svelte {#snippet children(data)} {@const typedData = data as unknown as PageHeaderData}

{typedData.title}

{#if typedData.description}

{typedData.description}

{/if} {/snippet}
``` **Pros:** - Server-side rendered (SEO friendly) - No layout shift - Data available before hydration **Cons:** - Cannot access client-side state - Data must be serializable --- ### 4.2 Component Wrapper Strategy **Best for:** Simple content, rapid development, clean API. **Page (+page.svelte):** ```svelte ``` **Layout (+layout.svelte):** ```svelte {#snippet children(data)}

{data.title}

{data.description}

{/snippet}
``` **Pros:** - Simple, prop-like API - Quick to implement - CLI generates boilerplate **Cons:** - Client-side only - Not ideal for SEO --- ### 4.3 Snippet Strategy **Best for:** Interactive UI, forms, buttons with handlers, reactive content. **Page (+page.svelte):** ```svelte {#snippet actionsSnippet()} {/snippet} ``` **Layout (+layout.svelte):** ```svelte ``` **Pros:** - Full access to page state and handlers - Reactive updates - Maximum flexibility **Cons:** - Client-side only - More complex setup --- ## 5. API Reference ### LayoutRegions Root provider component. Wrap your root layout. ```svelte {@render children()} ``` **Props:** - `children` - Required snippet --- ### LayoutRegion Consumer component. Place in layouts where region content should render. ```svelte {#snippet children(data)} {/snippet} {#snippet fallback()} {/snippet} ``` **Props:** - `name` (string, required) - Region identifier - `schema` (RegionSchema, optional) - Validation schema - `children` (Snippet, optional) - Receives validated data - `fallback` (Snippet, optional) - Renders when no region data **Behavior:** - Data objects: Validates with schema, passes to children - Snippets: Renders directly, bypasses schema - No data + no fallback: Renders nothing --- ### useLayoutRegions Function to set region data from +page.svelte files. ```typescript import { useLayoutRegions } from '@sveltopia/regions'; // With data objects useLayoutRegions({ header: { title: 'Page Title' }, sidebar: { items: ['a', 'b'] } }); // With snippets useLayoutRegions({ actions: mySnippet }); ``` **Parameters:** - `regions` - Record **Notes:** - Call during component initialization - Can set multiple regions at once --- ### RegionSchema TypeScript interface for validation schemas. ```typescript interface RegionSchema { parse: (data: unknown) => T; } ``` Works with Valibot, Zod, or custom validators: ```typescript // Valibot import * as v from 'valibot'; const schema = v.object({ title: v.string(), count: v.number() }); export const mySchema = { parse: (data: unknown) => v.parse(schema, data) }; // Zod import { z } from 'zod'; export const mySchema = z.object({ title: z.string(), count: z.number() }); // TypeScript only (no runtime validation) export const mySchema = { parse: (data: unknown) => data as MyType }; ``` --- ## 6. CLI Tool Generate complete region boilerplate: ```bash npx @sveltopia/regions add ``` ### Interactive Prompts 1. **Strategy** - Load function, Component wrapper, or Snippet 2. **Fields** - Comma-separated field names (e.g., "title, description") 3. **Field types** - string, number, or boolean for each 4. **Required/Optional** - For each field 5. **Validator** - Valibot (recommended), Zod, or TypeScript only 6. **Load location** - +page.server.ts or +page.ts 7. **Example path** - Where to generate example files ### Generated Files For a region named "page-header" with Valibot: ``` src/lib/regions/page-header/ ├── pageHeaderSchema.ts # Schema with types └── PageHeaderRegion.svelte # Consumer component src/routes/example/ └── +page.server.ts # Example load function ``` --- ## 7. Validation ### Valibot (Recommended) Smallest bundle (~1kb), modern API. ```typescript import * as v from 'valibot'; import { valibot } from '@sveltopia/regions'; const _schema = v.object({ title: v.string(), description: v.optional(v.string()) }); export type PageHeaderData = v.InferOutput; export const pageHeaderSchema = valibot(_schema, v.parse); ``` ### Zod Popular, feature-rich (~14kb). ```typescript import { z } from 'zod'; import { zod } from '@sveltopia/regions'; const _schema = z.object({ title: z.string(), description: z.string().optional() }); export type PageHeaderData = z.infer; export const pageHeaderSchema = zod(_schema); ``` ### TypeScript Only Zero runtime cost, compile-time safety only. ```typescript export type PageHeaderData = { title: string; description?: string; }; export const pageHeaderSchema = { parse: (data: unknown) => data as PageHeaderData }; ``` --- ## 8. Advanced Patterns ### Layout-Level Regions Use +layout.server.ts for regions shared across child pages: ```typescript // src/routes/dashboard/+layout.server.ts export const load = () => { return { regions: { breadcrumbs: [ { label: 'Home', href: '/' }, { label: 'Dashboard', href: '/dashboard' } ] } }; }; ``` ### Region Inheritance Child pages can override parent layout regions: ```typescript // src/routes/dashboard/settings/+page.server.ts export const load = () => { return { regions: { // Override breadcrumbs from parent layout breadcrumbs: [ { label: 'Home', href: '/' }, { label: 'Dashboard', href: '/dashboard' }, { label: 'Settings', href: '/dashboard/settings' } ] } }; }; ``` ### Mixing Strategies Use different strategies for different regions: ```svelte {#snippet toolbarSnippet()} {/snippet} ``` ### Fallback Content Provide default content when a region isn't populated: ```svelte {#snippet children(data)} {/snippet} {#snippet fallback()} {/snippet} ``` --- ## 9. Error Handling ### Validation Errors When validation fails, LayoutRegion logs an error and renders nothing: ``` [Regions] Validation error for region "header": Expected string for title, received number ``` ### Missing Regions If no data is provided and no fallback exists, LayoutRegion renders nothing. This is expected for optional regions. ### TypeScript Errors TypeScript catches type mismatches at compile time. Runtime validation (Valibot/Zod) provides additional safety. --- ## 10. Decision Guide ### When to Use Load Functions - Page titles, meta tags - Breadcrumb navigation - Any SEO-critical content - Server-fetched data ### When to Use Component Wrappers - Simple, static content - Quick prototyping - Client-only pages - When SEO isn't critical ### When to Use Snippets - Interactive UI (forms, counters) - Content with event handlers - Real-time updating content - Access to page state ### Decision Flowchart ``` START: Does content need to be in initial HTML (SEO)? ├── YES → Use Load Function └── NO → Does it need page state/handlers? ├── YES → Use Snippet └── NO → Use Component Wrapper ``` --- ## Links - Website: https://regions.sveltopia.dev - Documentation: https://regions.sveltopia.dev/docs - Examples: https://regions.sveltopia.dev/examples - GitHub: https://github.com/sveltopia/regions - npm: https://www.npmjs.com/package/@sveltopia/regions --- Generated for @sveltopia/regions v0.1.0