⚠️Draft Content
Storyblok
Search Storyblok's Documentation
  1. @storyblok/svelte

@storyblok/svelte

@storyblok/svelte is Storyblok's official development kit for Svelte applications.

Practical resources

Requirements

  • Svelte 5 or later
  • Node.js LTS (version 22.x recommended)
  • Modern web browser (e.g., Chrome, Firefox, Safari, Edge – latest versions)

Installation

Add the package to a project by running this command in the terminal:

npm install @storyblok/svelte@latest

Usage

Configuration

Import and initialize the SDK using the access token from a Storyblok space.

src/layouts/+layout.js
import { apiPlugin, storyblokInit } from '@storyblok/svelte';
import Page from './Page.svelte';
import Feature from './Feature.svelte';

storyblokInit({
	accessToken: 'YOUR_ACCESS_TOKEN',
	region: 'eu',
	use: [apiPlugin],
	components: {
		page: Page,
		feature: Feature,
	},
});

Learn how to retrieve an access token in the access tokens concept.

The region parameter must be specified unless the space was created in the EU. Learn more in the @storyblok/js package reference.

Components

Create a Svelte component for each block defined in Storyblok and registered in the configuration (include the page block). Each component will receive a blok prop, containing the content of the block.

src/lib/Feature.svelte
<script>
	import { storyblokEditable } from '@storyblok/svelte';

	export let blok;
</script>

<div use:storyblokEditable={blok}>
	<h2>{blok.name}</h2>
</div>

Fetching and rendering

In a +page.js file, use the client to fetch a story and render the content using StoryblokComponent.

src/routes/+page.js
/** @type {import('./$types').PageLoad} */
export async function load({ parent }) {
	const { storyblokAPI } = await parent();

	const response = await storyblokAPI.get('cdn/stories/home');

	return {
		story: response.data.story,
	};
}

Then render the content in +page.svelte with StoryblokComponent:

src/routes/+page.svelte
<script>
	import { StoryblokComponent } from '@storyblok/svelte';

	export let data;
</script>

<StoryblokComponent blok={data.story.content} />

API

storyblokInit

import { storyblokInit } from '@storyblok/svelte';

storyblokInit(OPTIONS)

storyblokInit() creates an instance of the Storyblok API client and loads the Storyblok Bridge.

All options listed in the @storyblok/js package reference are available. The following additional options are available:

Key

Description

Type

components

An object that maps Svelte components to Storyblok blocks. Each component receives a blok prop containing the content of the block.

object

apiPlugin

apiPlugin configures the implementation of the Storyblok API. It is imported from @storyblok/js.

import { storyblokInit, apiPlugin } from '@storyblok/svelte';

storyblokInit({
	use: [apiPlugin],
});

For more information, see the @storyblok/js package reference.

useStoryblokApi

useStoryblokApi() returns the client instantiated in the application.

useStoryblok(URL, API_OPTIONS, BRIDGE_OPTIONS);

For the API_OPTIONS, see the storyblok-js-client package reference.

getStoryblokApi

getStoryblokApi() is an alias of useStoryblokApi().

useStoryblokBridge

useStoryblokBridge() activates the Storyblok Bridge.

import { onMount } from 'svelte'
import { useStoryblokBridge } from '@storyblok/svelte';


onMount(() => {
	useStoryblokBridge(STORY_ID, CALLBACK, BRIDGE_OPTIONS)
}

For the BRIDGE_OPTIONS, see the StoryblokBridge reference.

StoryblokComponent

<StoryblokComponent blok={blok} />

StoryblokComponent is a Svelte component that dynamically renders blocks from Storyblok.

StoryblokComponent accepts a blok prop, which should be a block from the Storyblok API. Any other props passed to StoryblokComponent will be passed directly to the block component.

storyblokEditable

storyblokEditable() accepts a block from the Storyblok API and returns an object containing the HTML attributes to make elements editable in the Storyblok Visual Editor. See the @storyblok/js package reference for further details.

As a Svelte action, storyblokEditable() should be called with Svelte's use: directive, provided with a blok property:

<script>
	import { storyblokEditable } from '@storyblok/svelte';

	export let blok;
</script>

<div use:storyblokEditable={blok}>
	{blok.title}
</div>

renderRichText

This function converts a Storyblok rich text field into HTML.

<script>
  import { renderRichText } from '@storyblok/svelte';

  let renderedRichText = $derived(renderRichText(blok.richtext_field));

  export let blok;
</script>

<div>{@html renderedRichText}</div>

See the @storyblok/richtext package reference for further details.

Further resources

Repository Playground Opens in new tab

See the repository playground for additional examples.